diff --git a/DEPS b/DEPS index c0b0adc0..19a10d1f 100644 --- a/DEPS +++ b/DEPS
@@ -314,7 +314,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': 'a80c164ffb8a26aa29020be39993581a6761ab6c', + 'skia_revision': '9f8242377455ccfa4ffba67f0b3bd59bc2bf038b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -322,7 +322,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': '1cab871c220744402b887e73ff86aaf8f7f97fa0', + 'angle_revision': '16651b659829a3263d8065cda1b6f8d47ebb5518', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -365,7 +365,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': 'e0e5b838e508aa4043c0e27d8403ab7be2a46153', + 'freetype_revision': '7b308a29dd105074eea9c8d5953a182d325f74f1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -405,7 +405,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': '71eed7b30070691bf97612d9cb99ed7967806952', + 'devtools_frontend_revision': '714044231292652a5c7ef0d7baecbd996ee739b1', # 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. @@ -845,12 +845,12 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'e775e4966d9fa7e59540a94a7d87e2905a54b787', + 'f41631da115900d689ade4e0722174e5e5644d7e', 'condition': 'checkout_android and checkout_src_internal', }, 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + '0e7a3e5c351b8bf18e104a1f246e6c0f76474779', + 'url': Var('chromium_git') + '/website.git' + '@' + '98972e05cf600ceefe641ac5d83b661e2792fcb4', }, 'src/ios/third_party/earl_grey2/src': { @@ -1051,7 +1051,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'i-hZT57mneCH8VFpEhCsyc9oIZo2nzGsBUvctDvsXyMC', + 'version': 'NqoWf_zEO8cxtJyBPzX99qRqTwfPLXNHo3Wl6bYXu6IC', }, ], 'condition': 'checkout_android', @@ -1172,7 +1172,7 @@ Var('chromium_git') + '/angle/angle.git' + '@' + Var('angle_revision'), 'src/third_party/anonymous_tokens/src': - Var('chromium_git') + '/external/github.com/google/anonymous-tokens.git' + '@' + '8c8d20953d502db31fec2353b199e6c22ef0236e', + Var('chromium_git') + '/external/github.com/google/anonymous-tokens.git' + '@' + '79562f0175dba82f671046b5bdea0853323445b7', 'src/third_party/content_analysis_sdk/src': Var('chromium_git') + '/external/github.com/chromium/content_analysis_sdk.git' + '@' + '9a408736204513e0e95dd2ab3c08de0d95963efc', @@ -1301,7 +1301,7 @@ Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '0f634419f74c7b73d8fef44d1a234dcd8072403c', + 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '727896d2e633e60a13f17643095dc8aa58ee9b97', 'condition': 'checkout_src_internal', }, @@ -1790,7 +1790,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'e879b2e2ee67ba3ce9bbb01bb7d776c8dff28897', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '5773ad947c4f24adfea80579dcbac145cd03c831', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1935,7 +1935,7 @@ 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@4d31920a095aeda9fa83819cd17fdebc4d89220c', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@2acabb46a641318d321dc36a3998e6a97f0ae056', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'e87036508bb156f9986ea959323de1869e328f58', @@ -1975,7 +1975,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'f2b59e03621238d0d0fd6305be2c406ce3e45ac2', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'a61b334a12c7556c64887e1c553fd822d060881d', + Var('webrtc_git') + '/src.git' + '@' + '7d3eb10c7e705667b3c26a70e70d06ce152b6b62', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -2098,7 +2098,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'GjoP6BjK77E8Knwrylogi1eAlNj7mZwo3pPM54XqKF4C', + 'version': 'mWIrgHjjRR43j32ZeRpMJ65Ee-ZIVreCbVQBh16XrAcC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -4066,7 +4066,7 @@ 'src/chrome/app/theme/google_chrome': { 'url': Var('chrome_git') + '/chrome/theme/google_chrome.git' + '@' + - 'fd5f28534a5255022dd9cee6915e76755f87cc2f', + '69e8a82c73c3a200d51bb612a30b32c04a8f07de', 'condition': 'checkout_src_internal', }, @@ -4269,7 +4269,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - 'e875678118f79bdac3c7bd75be7fb79360d77757', + 'd25fde46a7b3f1ac5863c2fd69c3e0898a87b8a3', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java index 8805e1b6..cc4f74e5 100644 --- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java +++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java
@@ -93,7 +93,7 @@ Features.IMAGE_DRAG_DROP, Features.USER_AGENT_METADATA, Features.MULTI_PROFILE, - Features.ATTRIBUTION_BEHAVIOR + Features.DEV_SUFFIX, + Features.ATTRIBUTION_BEHAVIOR, // Add new features above. New features must include `+ Features.DEV_SUFFIX` // when they're initially added (this can be removed in a future CL). The final // feature should have a trailing comma for cleaner diffs.
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 7595c84..b29bfb6f 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -705,7 +705,7 @@ // the files and open in web apps, but not to open/read/write CSE files locally. BASE_FEATURE(kDriveFsShowCSEFiles, "DriveFsShowCSEFiles", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); // Enables support for the dropdown panel. BASE_FEATURE(kDropdownPanel, @@ -884,6 +884,14 @@ "kEphemeralNetworkPolicies", base::FEATURE_DISABLED_BY_DEFAULT); +// Controls whether the DeviceEphemeralNetworkPoliciesEnabled policy is +// respected. +// This is on-by-default, only intended to be used as a kill switch in case we +// find some issue with the policy processing. +BASE_FEATURE(kEphemeralNetworkPoliciesEnabledPolicy, + "EphemeralNetworkPoliciesEnabledPolicy", + base::FEATURE_DISABLED_BY_DEFAULT); + // Enables Device End Of Lifetime warning notifications. BASE_FEATURE(kEolWarningNotifications, "EolWarningNotifications", @@ -2023,12 +2031,6 @@ "PasswordlessGaiaForConsumers", base::FEATURE_DISABLED_BY_DEFAULT); -// This feature allows the user to select between setup the local password and -// Gaia password after the passwordless sign-in in OOBE. -BASE_FEATURE(kPasswordSelectionInOobe, - "PasswordSelectionInOobe", - base::FEATURE_DISABLED_BY_DEFAULT); - // Enables a notification warning users that their Thunderbolt device is not // supported on their CrOS device. // TODO(crbug/1254930): Revisit this flag when there is a way to query billboard @@ -3693,6 +3695,10 @@ return base::FeatureList::IsEnabled(kEphemeralNetworkPolicies); } +bool CanEphemeralNetworkPoliciesBeEnabledByPolicy() { + return base::FeatureList::IsEnabled(kEphemeralNetworkPoliciesEnabledPolicy); +} + bool IsNearbyKeepAliveFixEnabled() { return base::FeatureList::IsEnabled(kNearbyKeepAliveFix); } @@ -3854,11 +3860,6 @@ return base::FeatureList::IsEnabled(kPasswordlessGaiaForConsumers); } -bool IsPasswordSelectionEnabledInOobe() { - return base::FeatureList::IsEnabled(kPasswordSelectionInOobe) && - AreLocalPasswordsEnabledForConsumers(); -} - bool IsPcieBillboardNotificationEnabled() { return base::FeatureList::IsEnabled(kPcieBillboardNotification); }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index a20d74c..2b06924 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -306,6 +306,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kEphemeralNetworkPolicies); COMPONENT_EXPORT(ASH_CONSTANTS) +BASE_DECLARE_FEATURE(kEphemeralNetworkPoliciesEnabledPolicy); +COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::FeatureParam<double> kFastPairLowPowerActiveSeconds; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::FeatureParam<double> kFastPairLowPowerInactiveSeconds; @@ -598,8 +600,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kPasswordlessGaiaForConsumers); COMPONENT_EXPORT(ASH_CONSTANTS) -BASE_DECLARE_FEATURE(kPasswordSelectionInOobe); -COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kPcieBillboardNotification); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kPerDeskShelf); COMPONENT_EXPORT(ASH_CONSTANTS) @@ -970,6 +970,8 @@ bool IsEcheShorterScanningDutyCycleEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool AreEphemeralNetworkPoliciesEnabled(); +COMPONENT_EXPORT(ASH_CONSTANTS) +bool CanEphemeralNetworkPoliciesBeEnabledByPolicy(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsFullscreenAfterUnlockAllowed(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsFullscreenAlertBubbleEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsBlockFwupdClientEnabled(); @@ -1080,7 +1082,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOverviewDeskNavigationEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsParentAccessJellyEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPasswordlessGaiaEnabledForConsumers(); -COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPasswordSelectionEnabledInOobe(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPasspointARCSupportEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPasspointSettingsEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPcieBillboardNotificationEnabled();
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index c406ee1..ff5dc9ff 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -65,6 +65,7 @@ <translation id="1225748608451425081">आपका Chromebook, एक जानी-पहचानी समस्या की वजह से लॉक है. आप इतने समय बाद साइन इन कर पाएंगे: <ph name="TIME_LEFT" />.</translation> <translation id="1226877728704622336">यह डेस्क इस्तेमाल में नहीं है</translation> <translation id="1229194443904279055">टेक्स्ट चुनना बंद करें</translation> +<translation id="1233979878541157665">फ़ाइल के नाम के बजाय, "सूर्यास्त" या "पेड़" खोजकर देखें. खोज बार में जाकर, इमेज सर्च की सुविधा को बंद किया जा सकता है.</translation> <translation id="1235458158152011030">ज्ञात नेटवर्क</translation> <translation id="1239161794459865856"><ph name="FEATURE_NAME" /> कनेक्ट हो गया है.</translation> <translation id="1240638468526743569">कोई ऐप्लिकेशन</translation> @@ -206,6 +207,7 @@ <translation id="1775598828170459419"><ph name="NUM_TOTAL_ITEMS" /> में से <ph name="NUM_SHOWN_ITEMS" /> दिखाए जा रहे हैं</translation> <translation id="178347895271755507">अपने फ़ोन में मौजूद हाल ही की फ़ोटो, कॉन्टेंट, और सूचनाओं को देखने की सुविधा सेट अप करें</translation> <translation id="1787955149152357925">बंद करें</translation> +<translation id="1796561540704213354">वेबसाइटों की कैटगरी में वे पेज दिखाए जाते हैं जिन्हें आपने देखा या खोला होता है</translation> <translation id="1797271123677381264">क्या आपको पासवर्ड याद नहीं है</translation> <translation id="181103072419391116">सिग्नल की क्षमता <ph name="SIGNAL_STRENGTH" />, आपका एडमिन प्रबंधित करता है</translation> <translation id="1815245884418711390">हॉटस्पॉट का बटन टॉगल करें. हॉटस्पॉट बंद है.</translation> @@ -225,6 +227,7 @@ <translation id="1831565490995294689"><ph name="APP_TO_OPEN" /> खोलने के लिए चुनें.</translation> <translation id="1838895407229022812">नाइट लाइट बंद है.</translation> <translation id="1854180393107901205">कास्ट करना रोकें</translation> +<translation id="1862077610023398675">कंट्रोल छिपाएं</translation> <translation id="1862380676329487333">अपडेट करके साइन आउट करें</translation> <translation id="1864454756846565995">USB-C डिवाइस (पिछला पोर्ट)</translation> <translation id="1869497990620230175">क्विक फ़ाइलें</translation> @@ -248,6 +251,7 @@ <translation id="1962969542251276847">लॉक स्क्रीन</translation> <translation id="1967970931040389207">हॉटस्पॉट चालू करें</translation> <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation> +<translation id="1971815855639997522">डेस्क और विंडो हटा दी गई हैं. इस कार्रवाई को पहले जैसा करने के लिए, Control + Z दबाएं.</translation> <translation id="1972950159383891558">नमस्ते, <ph name="USERNAME" /></translation> <translation id="1978498689038657292">टेक्स्ट इनपुट</translation> <translation id="1980808257969311265"><ph name="EVENT_SUMMARY" /> में शामिल हों</translation> @@ -583,6 +587,7 @@ <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="343571671045587506">रिमाइंडर बदलें</translation> <translation id="3435967511775410570">फ़िंगरप्रिंट पहचाना गया</translation> +<translation id="3437677362970530951">Play Store और अन्य गेमिंग प्लैटफ़ॉर्म पर मौजूद गेम</translation> <translation id="3439896670700055005">कैश मेमोरी में सेव किए गए कॉन्टेंट का इस्तेमाल किए बिना, मौजूदा पेज फिर से लोड करें</translation> <translation id="3441920967307853524"><ph name="RECEIVED_BYTES" />/<ph name="TOTAL_BYTES" /></translation> <translation id="3445288400492335833"><ph name="MINUTES" /> मिनट</translation> @@ -789,6 +794,7 @@ <translation id="4215497585250573029">वीपीएन की सेटिंग</translation> <translation id="4217571870635786043">लिखवाना</translation> <translation id="4221957499226645091"><ph name="APP_NAME" />, इंस्टॉल किया गया ऐप्लिकेशन, कुछ देर के लिए रोका गया</translation> +<translation id="4228078597006700451">कंट्रोल सेट अप नहीं किए गए हैं</translation> <translation id="4231053948789591973">फ़िलहाल, कास्ट करने की प्रोसेस रोकी गई है. आपके पास स्क्रीन को कास्ट करने की प्रोसेस को कभी भी रोकने या फिर से शुरू करने की सुविधा होती है.</translation> <translation id="423685346499232137">फ़िलहाल, कॉन्टेंट को कॉपी या चिपकाया नहीं किया जा सकता</translation> <translation id="4239069858505860023">GPRS</translation> @@ -933,6 +939,7 @@ <translation id="4814539958450445987">लॉगिन स्क्रीन</translation> <translation id="481455355267255546">आने वाले दिनों में होने वाले इवेंट</translation> <translation id="4826588772550366629">कैमरा और माइक्रोफ़ोन</translation> +<translation id="482908187605862807">Play Store पर उपलब्ध ऐप्लिकेशन</translation> <translation id="4831034276697007977">क्या आप वाकई अपने-आप क्लिक होने की सुविधा बंद करना चाहते हैं?</translation> <translation id="4849058404725798627">कीबोर्ड फ़ोकस वाला ऑब्जेक्ट हाइलाइट करें</translation> <translation id="485592688953820832">कोई कार्रवाई नहीं (रोकें)</translation> @@ -984,6 +991,7 @@ <translation id="5004607513195820459">नेटवर्क को एडमिन मैनेज करता है</translation> <translation id="5009463889040999939">प्रोफ़ाइल का नाम बदला जा रहा है. इसमें कुछ मिनट लग सकते हैं.</translation> <translation id="5016558321564993266">मार्कर को टॉगल करें. <ph name="STATE_TEXT" /></translation> +<translation id="5020360656995955353">कैटगरी खोजें</translation> <translation id="5029356738310729434">डिवाइस का माइक्रोफ़ोन चालू है</translation> <translation id="5030659775136592441">बुकमार्क मैनेजर दिखाएं</translation> <translation id="5030687792513154421">समय पूरा हो गया</translation> @@ -1038,6 +1046,7 @@ <translation id="5234764350956374838">खारिज करें</translation> <translation id="523505283826916779">सुलभता सेटिंग</translation> <translation id="5238719049014159442">लॉन्चर को खोलें या बंद करें</translation> +<translation id="5240725217819182328">इंस्टॉल किए गए ऐप्लिकेशन में मौजूद खास पेजों या कार्रवाइयों का क्विक ऐक्सेस</translation> <translation id="5245201184978705914">ट्रांसक्रिप्ट को जनरेट नहीं किया जा सका</translation> <translation id="5253783950165989294"><ph name="DEVICE_NAME" /> नाम वाले ब्लूटूथ डिवाइस से कनेक्ट किया गया है. इसकी बैटरी <ph name="BATTERY_PERCENTAGE" />% है</translation> <translation id="5258528442992323769">कोई डेस्क सेव नहीं किया गया है</translation> @@ -1255,6 +1264,7 @@ <translation id="6095008505822982596">बोलने की दर</translation> <translation id="6095425951508823973"><ph name="PROVIDER" /> के साथ कनेक्ट करें</translation> <translation id="6099678161144790572">इसमें, पिछले महीने बदलाव किया गया था</translation> +<translation id="6099793635444444289">माइक्रोफ़ोन के म्यूट होने की वजह से, लिखवाने की सुविधा शुरू नहीं की जा सकी</translation> <translation id="6103838137565245112">सिस्टम</translation> <translation id="6114505516289286752"><ph name="LANGUAGE" /> स्पीच फ़ाइलें डाउनलोड हो गई हैं</translation> <translation id="6119360623251949462"><ph name="CHARGING_STATE" />. <ph name="BATTERY_SAVER_STATE" /></translation> @@ -1272,6 +1282,7 @@ <translation id="6165508094623778733">ज़्यादा जानें</translation> <translation id="6166852626429024716">अपने डिवाइस, ऐप्लिकेशन, सेटिंग के साथ-साथ वेब पर भी खोजें...</translation> <translation id="6168318496333165060">Diagnostics ऐप्लिकेशन खोलने के लिए</translation> +<translation id="6168622430237609329">आपके इंस्टॉल किए गए ऐप्लिकेशन</translation> <translation id="6173151025443907148">Lacros के चालू होने पर, दूसरे उपयोगकर्ता के लिए साइन इन करने की सुविधा काम नहीं करती. इसके बजाय, कृपया Lacros में कोई दूसरी ब्राउज़र प्रोफ़ाइल इस्तेमाल करें या Lacros को बंद करके, फिर से कोशिश करें.</translation> <translation id="6179832488876878285">आप अपनी ज़रूरी फ़ाइलों को यहां पिन कर सकते हैं. शुरू करने के लिए, फ़ाइल ऐप्लिकेशन खोलें.</translation> <translation id="6182592640011875895">डेस्क खोलें</translation> @@ -1325,6 +1336,7 @@ <translation id="6442259747294754014">डिवाइस का माइक्रोफ़ोन बंद है</translation> <translation id="6445835306623867477"><ph name="RECEIVER_NAME" /> पर <ph name="ROUTE_TITLE" /></translation> <translation id="6445915701151710649">सीपीयू</translation> +<translation id="6446225358675593408">कॉन्टेंट के हिसाब से अपनी इमेज ढूंढना</translation> <translation id="6447111710783417522"><ph name="DATE" />, <ph name="NUMBER" /> इवेंट</translation> <translation id="6449483711453944360">फ़िलहाल, Linux ऐप्लिकेशन और गुप्त विंडो के लिए यह सुविधा उपलब्ध नहीं है</translation> <translation id="6450245544201845082">फ़िलहाल, राइट क्लिक शॉर्टकट बंद है</translation> @@ -1354,6 +1366,7 @@ <translation id="6537924328260219877">सिग्नल की क्षमता <ph name="SIGNAL_STRENGTH" />, फ़ोन की बैटरी <ph name="BATTERY_STATUS" /></translation> <translation id="6539852571005954999">डाउनलोड हो रही फ़ाइल <ph name="FILENAME" /> को स्कैन किया जा रहा है</translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" /> पर कास्ट किया जा रहा है</translation> +<translation id="6546062506073634094">कॉन्टेंट और इमेज की झलक के हिसाब से इमेज खोजने की सुविधा</translation> <translation id="6555373427270923730">पता बार में कोई वेब पता लिखें और <ph name="MODIFIER" /><ph name="KEY" /> दबाएं</translation> <translation id="655633303491376835"><ph name="APP_NAME" /> अभी इंस्टॉल किया गया है</translation> @@ -1421,6 +1434,7 @@ <translation id="6802196538183166658">समय चुनकर, क्विक सेटिंग खोलने के लिए</translation> <translation id="6802687695197837794">इससे <ph name="APP1_NAME" /> और <ph name="APP2_NAME" /> के साथ-साथ बाकी सभी ऐप्लिकेशन और वेबसाइटों को कैमरा और माइक्रोफ़ोन को इस्तेमाल करने का ऐक्सेस मिलता है</translation> <translation id="6803622936009808957">प्रदर्शनों को मिरर नहीं किया जा सका क्योंकि कोई समर्थित रिज़ॉल्यूशन नहीं मिला. इसके बजाय विस्तारित डेस्कटॉप में चला गया है.</translation> +<translation id="6809556495807506746">कंट्रोल उपलब्ध नहीं हैं</translation> <translation id="6812232930908427253">डेस्क सेव नहीं किया जा सका. बहुत ज़्यादा विंडो या टैब.</translation> <translation id="6818242057446442178">एक शब्द पीछे जाएं</translation> <translation id="6819327813400217281">कैमरा इनपुट की झलक, अब नीचे बाएं कोने में दिखेगी</translation> @@ -1430,12 +1444,14 @@ <translation id="6836499262298959512">यह फ़ाइल सुरक्षित नहीं है</translation> <translation id="6852052252232534364">चालू करने के लिए क्लिक करें</translation> <translation id="6855029042976311970">इसमें, अभी-अभी बदलाव किया गया</translation> +<translation id="6856708615407876657">खोज के नतीजों की कैटगरी टॉगल करें</translation> <translation id="6857725247182211756"><ph name="SECONDS" /> सेकंड</translation> <translation id="685782768769951078">{NUM_DIGITS,plural, =1{1 अंक डालना बाकी है}one{# अंक डालना बाकी है}other{# अंक डालने बाकी हैं}}</translation> <translation id="6867938213751067702">डाउनलोड रोका गया <ph name="FILENAME" /></translation> <translation id="6874854809828346832">हॉटस्पॉट की जानकारी दिखाएं. हॉटस्पॉट चालू है.</translation> <translation id="6878400149835617132">शॉर्टकट बंद किया गया</translation> <translation id="6878701771800702153">{NUM_APPS,plural, =1{1 ऐप्लिकेशन}one{# ऐप्लिकेशन}other{# ऐप्लिकेशन}}</translation> +<translation id="6883768636838842873">अहम शॉर्टकट, डिवाइस इस्तेमाल करने से जुड़ी सलाह वगैरह</translation> <translation id="6884665277231944629">आज की तारीख पर वापस जाएं</translation> <translation id="6886172995547742638">हो सकता है कि <ph name="DEVICE_TYPE" /> का प्रदर्शन कम हो. प्रमाणित <ph name="PREFERRED_MINIMUM_POWER" />W या हाइअर USB-C पावर अडैप्टर का इस्तेमाल करें.</translation> <translation id="688631446150864480">विंडो स्विच करने के लिए, डाउन ऐरो बटन को दबाएं</translation> @@ -1445,6 +1461,7 @@ <translation id="6919251195245069855">आपका स्मार्ट कार्ड पहचाना नहीं जा सका. फिर से कोशिश करें.</translation> <translation id="6920245099716267363">हॉटस्पॉट का बटन टॉगल करें. हॉटस्पॉट चालू है, एक डिवाइस कनेक्ट है.</translation> <translation id="692135145298539227">मिटाएं</translation> +<translation id="6929081673585394903">कंट्रोल दिखाएं</translation> <translation id="6931576957638141829">यहां सेव करें</translation> <translation id="6942518653766415536">रिकॉर्डिंग के फ़ॉर्मैट का मेन्यू</translation> <translation id="6945221475159498467">चुनें</translation> @@ -1642,6 +1659,7 @@ <translation id="7773536009433685931">इसके बजाय, वाई-फ़ाई चालू करें</translation> <translation id="7780094051999721182">शॉर्टकट</translation> <translation id="7780159184141939021">स्क्रीन घुमाएं</translation> +<translation id="7792590255364786396">किसको दिखे</translation> <translation id="7796735576426975947">नई सूचना छिपाई गई</translation> <translation id="7798302898096527229">रद्द करने के लिए Search या Shift दबाएं.</translation> <translation id="780301667611848630">नहीं, रहने दें</translation> @@ -1835,6 +1853,7 @@ <translation id="8619138598101195078">आवाज़ कम करें</translation> <translation id="8627191004499078455"><ph name="DEVICE_NAME" /> से कनेक्ट है</translation> <translation id="8631727435199967028">सुलभता सेटिंग</translation> +<translation id="8634326941504371857">इस डिवाइस पर और Google Drive में मौजूद आपकी फ़ाइलें</translation> <translation id="8637598503828012618"><ph name="CONNECTION_STATUS" />, सिग्नल की क्षमता <ph name="SIGNAL_STRENGTH" />, आपका एडमिन प्रबंधित करता है</translation> <translation id="8638637208069328956">माइक्रोफ़ोन चालू/बंद करें</translation> <translation id="8639760480004882931"><ph name="PERCENTAGE" /> बाकी</translation>
diff --git a/ash/system/network/sms_observer.cc b/ash/system/network/sms_observer.cc index f86bc66..59091dea 100644 --- a/ash/system/network/sms_observer.cc +++ b/ash/system/network/sms_observer.cc
@@ -14,6 +14,7 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" +#include "chromeos/ash/components/network/metrics/cellular_network_metrics_logger.h" #include "chromeos/ash/components/network/network_event_log.h" #include "chromeos/ash/components/network/network_handler.h" #include "chromeos/ash/components/network/network_sms_handler.h" @@ -81,7 +82,8 @@ } } -void SmsObserver::MessageReceived(const TextMessageData& message_data) { +void SmsObserver::MessageReceived(const std::string& guid, + const TextMessageData& message_data) { CHECK(features::IsSuppressTextMessagesEnabled()); if (!message_data.text.has_value() || message_data.text->empty()) { @@ -97,6 +99,12 @@ // messages feature flag is removed. ShowNotification(/*message=*/nullptr, *message_data.text, *message_data.number, message_id_); + + if (NetworkHandler::IsInitialized()) { + NetworkHandler::Get() + ->text_message_provider() + ->LogTextMessageNotificationMetrics(guid); + } } void SmsObserver::MessageReceived(const base::Value::Dict& message) {
diff --git a/ash/system/network/sms_observer.h b/ash/system/network/sms_observer.h index dd40960d..b08ce4d 100644 --- a/ash/system/network/sms_observer.h +++ b/ash/system/network/sms_observer.h
@@ -30,7 +30,8 @@ void MessageReceived(const base::Value::Dict& message) override; // TextMessageProvider::Observer: - void MessageReceived(const TextMessageData& message) override; + void MessageReceived(const std::string& guid, + const TextMessageData& message) override; private: // Used to create notification identifier.
diff --git a/ash/system/network/sms_observer_unittest.cc b/ash/system/network/sms_observer_unittest.cc index e0acc65..16e9fec 100644 --- a/ash/system/network/sms_observer_unittest.cc +++ b/ash/system/network/sms_observer_unittest.cc
@@ -10,8 +10,15 @@ #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" +#include "chromeos/ash/components/network/fake_network_metadata_store.h" +#include "chromeos/ash/components/network/metrics/cellular_network_metrics_logger.h" +#include "chromeos/ash/components/network/network_handler.h" +#include "chromeos/ash/components/network/network_handler_test_helper.h" #include "chromeos/ash/components/network/network_sms_handler.h" +#include "chromeos/ash/components/network/text_message_suppression_state.h" +#include "components/onc/onc_constants.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/l10n/l10n_util.h" @@ -25,6 +32,8 @@ namespace { +constexpr char kTestGuid[] = "TestGuid"; + base::Value::Dict CreateMessage(const char* kDefaultMessage, const char* kDefaultNumber, const char* kDefaultTimestamp) { @@ -69,6 +78,9 @@ AshTestBase::SetUp(); if (GetParam().use_suppress_text_message_flag) { features_.InitAndEnableFeature(ash::features::kSuppressTextMessages); + test_helper_ = std::make_unique<NetworkHandlerTestHelper>(); + NetworkHandler::Get()->text_message_provider()->SetNetworkMetadataStore( + &network_metadata_store_); } else { features_.InitAndDisableFeature(ash::features::kSuppressTextMessages); } @@ -82,15 +94,25 @@ TextMessageData message_data(GetStringOptional(kDefaultNumber), GetStringOptional(kDefaultMessage), GetStringOptional(kDefaultTimestamp)); - GetSmsObserver()->MessageReceived(message_data); + GetSmsObserver()->MessageReceived(kTestGuid, message_data); } else { GetSmsObserver()->MessageReceived( CreateMessage(kDefaultMessage, kDefaultNumber, kDefaultTimestamp)); } } + NetworkMetadataStore* network_metadata_store() { + return &network_metadata_store_; + } + + ManagedNetworkConfigurationHandler* managed_network_configuration_handler() { + return NetworkHandler::Get()->managed_network_configuration_handler(); + } + private: base::test::ScopedFeatureList features_; + std::unique_ptr<NetworkHandlerTestHelper> test_helper_; + FakeNetworkMetadataStore network_metadata_store_; }; INSTANTIATE_TEST_SUITE_P( @@ -165,4 +187,134 @@ } } +class SmsObserverSuppressTextMessagesEnabled : public SmsObserverTest { + public: + void SetUp() override { + SmsObserverTest::SetUp(); + histogram_tester_ = std::make_unique<base::HistogramTester>(); + } + void ChangeUserSuppressionState(UserTextMessageSuppressionState state) { + network_metadata_store()->SetUserTextMessageSuppressionState(kTestGuid, + state); + } + + void ChangePolicySuppressionState(PolicyTextMessageSuppressionState state) { + std::string state_onc; + switch (state) { + case PolicyTextMessageSuppressionState::kUnset: + state_onc = ::onc::cellular::kTextMessagesUnset; + break; + case PolicyTextMessageSuppressionState::kAllow: + state_onc = ::onc::cellular::kTextMessagesAllow; + break; + case PolicyTextMessageSuppressionState::kSuppress: + state_onc = ::onc::cellular::kTextMessagesSuppress; + break; + } + + base::Value::Dict global_config; + global_config.Set(::onc::global_network_config::kAllowTextMessages, + state_onc); + managed_network_configuration_handler()->SetPolicy( + ::onc::ONC_SOURCE_DEVICE_POLICY, /*userhash=*/std::string(), + base::Value::List(), global_config); + base::RunLoop().RunUntilIdle(); + } + + void AssertHistogramCounts(size_t user_suppressed_count, + size_t policy_suppressed_count, + size_t not_suppressed_count) { + histogram_tester_->ExpectBucketCount( + CellularNetworkMetricsLogger:: + kAllowTextMessagesNotificationSuppressionState, + CellularNetworkMetricsLogger::NotificationSuppressionState:: + kUserSuppressed, + /*expected_count=*/user_suppressed_count); + + histogram_tester_->ExpectBucketCount( + CellularNetworkMetricsLogger:: + kAllowTextMessagesNotificationSuppressionState, + CellularNetworkMetricsLogger::NotificationSuppressionState:: + kPolicySuppressed, + /*expected_count=*/policy_suppressed_count); + + histogram_tester_->ExpectBucketCount( + CellularNetworkMetricsLogger:: + kAllowTextMessagesNotificationSuppressionState, + CellularNetworkMetricsLogger::NotificationSuppressionState:: + kNotSuppressed, + /*expected_count=*/not_suppressed_count); + + size_t total_count = + user_suppressed_count + policy_suppressed_count + not_suppressed_count; + histogram_tester_->ExpectTotalCount( + CellularNetworkMetricsLogger:: + kAllowTextMessagesNotificationSuppressionState, + /*expected_count=*/total_count); + } + + private: + std::unique_ptr<base::HistogramTester> histogram_tester_; +}; + +INSTANTIATE_TEST_SUITE_P( + SmsObserverTests, + SmsObserverSuppressTextMessagesEnabled, + testing::ValuesIn<SmsObserverTestCase>({ + {"SuppressTextMessageFlagEnabled", true}, + }), + [](const testing::TestParamInfo< + SmsObserverSuppressTextMessagesEnabled::ParamType>& info) { + return info.param.test_name; + }); + +TEST_P(SmsObserverSuppressTextMessagesEnabled, SuccessGuardRailMetricsTest) { + base::HistogramTester histogram_tester; + + AssertHistogramCounts(/*user_suppressed_count=*/0u, + /*policy_suppressed_count=*/0u, + /*not_suppressed_count=*/0u); + ChangeUserSuppressionState(UserTextMessageSuppressionState::kAllow); + ChangePolicySuppressionState(PolicyTextMessageSuppressionState::kUnset); + SimulateMessageReceived(); + AssertHistogramCounts(/*user_suppressed_count=*/0u, + /*policy_suppressed_count=*/0u, + /*not_suppressed_count=*/1u); + + ChangeUserSuppressionState(UserTextMessageSuppressionState::kSuppress); + ChangePolicySuppressionState(PolicyTextMessageSuppressionState::kUnset); + SimulateMessageReceived(); + AssertHistogramCounts(/*user_suppressed_count=*/1u, + /*policy_suppressed_count=*/0u, + /*not_suppressed_count=*/1u); + + ChangeUserSuppressionState(UserTextMessageSuppressionState::kAllow); + ChangePolicySuppressionState(PolicyTextMessageSuppressionState::kAllow); + SimulateMessageReceived(); + AssertHistogramCounts(/*user_suppressed_count=*/1u, + /*policy_suppressed_count=*/0u, + /*not_suppressed_count=*/2u); + + ChangeUserSuppressionState(UserTextMessageSuppressionState::kSuppress); + ChangePolicySuppressionState(PolicyTextMessageSuppressionState::kAllow); + SimulateMessageReceived(); + AssertHistogramCounts(/*user_suppressed_count=*/1u, + /*policy_suppressed_count=*/0u, + /*not_suppressed_count=*/3u); + + ChangeUserSuppressionState(UserTextMessageSuppressionState::kSuppress); + ChangePolicySuppressionState(PolicyTextMessageSuppressionState::kSuppress); + SimulateMessageReceived(); + AssertHistogramCounts(/*user_suppressed_count=*/1u, + /*policy_suppressed_count=*/1u, + /*not_suppressed_count=*/3u); + + ChangeUserSuppressionState(UserTextMessageSuppressionState::kAllow); + ChangePolicySuppressionState(PolicyTextMessageSuppressionState::kSuppress); + SimulateMessageReceived(); + AssertHistogramCounts(/*user_suppressed_count=*/1u, + /*policy_suppressed_count=*/2u, + /*not_suppressed_count=*/3u); +} + } // namespace ash
diff --git a/ash/webui/common/resources/cellular_setup/profile_discovery_list_item.html b/ash/webui/common/resources/cellular_setup/profile_discovery_list_item.html index 401853e..1c3ac7e 100644 --- a/ash/webui/common/resources/cellular_setup/profile_discovery_list_item.html +++ b/ash/webui/common/resources/cellular_setup/profile_discovery_list_item.html
@@ -1,4 +1,30 @@ <style include="iron-flex iron-positioning"> + #container { + background-color: transparent; + border-radius: 12px; + border-width: 1px; + border: var(--cr-separator-line); + box-sizing: border-box; + color: var(--cr-secondary-text-color); + font: var(--cros-body-2-font); + height: 64px; + margin-bottom: 6px; + margin-top: 6px; + padding-inline-start: 12px; + } + + :host([selected]) #container { + color: var(--cros-sys-on_primary_container); + background-color: var(--cros-sys-primary_container); + border-style: none; + font: var(--cros-button-2-font); + } + + :host(:not([selected]):focus) #container { + border-width: 3px; + padding-inline-start: 10px; + } + #details { align-items: center; display: flex; @@ -6,16 +32,15 @@ min-height: var(--cr-section-two-line-min-height); } - #profileImage { - margin-inline-end: 16px; + #profileTitleLabel { + margin-inline-start: 8px; } - #profileTitleLabel { - color: var(--cros-text-color-primary); + #profileImage { + margin-inline-end: 8px; } .icon { - margin-inline-end: 8px; padding-inline-end: var(--cr-section-padding); } @@ -28,30 +53,28 @@ vertical-align: middle; width: 16px; } - </style> - <div class="two-line no-padding" selectable> - <div class="flex layout horizontal center link-wrapper"> - <div id="details"> - <iron-media-query query="(prefers-color-scheme: dark)" - query-matches="{{isDarkModeActive_}}"> - </iron-media-query> - <!-- The item's aria properties are set in profile_discovery_list_page. --> - <div class="flex settings-box-text"> - <div id="profileTitleLabel"> - [[getProfileName_(profileProperties)]] - </div> - </div> - </div> - <div class="icon" - hidden$="[[!selected]]"> - <iron-icon id="checkmark" - icon="cellular-setup:checked" - tabindex="-1" - hidden$="[[showLoadingIndicator]]"> - </iron-icon> - <paper-spinner-lite active - hidden$="[[!showLoadingIndicator]]"> - </paper-spinner-lite> +</style> +<div id="container" class="flex layout horizontal center" selectable> + <div id="details"> + <iron-media-query query="(prefers-color-scheme: dark)" + query-matches="{{isDarkModeActive_}}"> + </iron-media-query> + <!-- The item's aria properties are set in profile_discovery_list_page. --> + <div class="flex settings-box-text"> + <div id="profileTitleLabel"> + [[getProfileName_(profileProperties)]] </div> </div> </div> + <div class="icon" + hidden$="[[!selected]]"> + <iron-icon id="checkmark" + icon="cellular-setup:checked" + tabindex="-1" + hidden$="[[showLoadingIndicator]]"> + </iron-icon> + <paper-spinner-lite active + hidden$="[[!showLoadingIndicator]]"> + </paper-spinner-lite> + </div> +</div>
diff --git a/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.html b/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.html index f9cd668..310467c 100644 --- a/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.html +++ b/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.html
@@ -4,10 +4,6 @@ margin-top: -20px; } - profile-discovery-list-item { - height: 64px; - } - #container { height: 230px; margin-top: 20px; @@ -15,8 +11,9 @@ overflow-y: auto; } - iron-list > *:not(:first-of-type) { - border-top: var(--cr-separator-line); + /* Override the styling used for the focused item */ + [scrollable] iron-list > :not(.no-outline):focus { + background-color: transparent !important; } </style> <base-page>
diff --git a/ash/webui/common/resources/network/network_ip_config.js b/ash/webui/common/resources/network/network_ip_config.js index 3c10c335..cf41e94 100644 --- a/ash/webui/common/resources/network/network_ip_config.js +++ b/ash/webui/common/resources/network/network_ip_config.js
@@ -197,22 +197,21 @@ this.automatic_ = ipConfigType !== 'Static'; if (properties.ipConfigs || properties.staticIpConfig) { - if (this.automatic_ || !oldValue) { - // Update the 'ipConfig' property. - const ipv4 = this.getIPConfigUIProperties_( - OncMojo.getIPConfigForType(properties, IPConfigType.kIPv4)); - let ipv6 = this.getIPConfigUIProperties_( - OncMojo.getIPConfigForType(properties, IPConfigType.kIPv6)); + // Update the 'ipConfig' property. + const ipv4 = this.getIPConfigUIProperties_( + OncMojo.getIPConfigForType(properties, IPConfigType.kIPv4)); + let ipv6 = this.getIPConfigUIProperties_( + OncMojo.getIPConfigForType(properties, IPConfigType.kIPv6)); - // If connected and the IP address is automatic and set, show message if - // the ipv6 address is not set. - if (OncMojo.connectionStateIsConnected(properties.connectionState) && - this.automatic_ && ipv4 && ipv4.ipAddress) { - ipv6 = ipv6 || {type: IPConfigType.kIPv6}; - ipv6.ipAddress = ipv6.ipAddress || this.i18n('ipAddressNotAvailable'); - } - this.ipConfig_ = {ipv4: ipv4, ipv6: ipv6}; + // If connected and the IP address is automatic and set, show message if + // the ipv6 address is not set. + if (OncMojo.connectionStateIsConnected(properties.connectionState) && + this.automatic_ && ipv4 && ipv4.ipAddress) { + ipv6 = ipv6 || {type: IPConfigType.kIPv6}; + ipv6.ipAddress = ipv6.ipAddress || this.i18n('ipAddressNotAvailable'); } + + this.ipConfig_ = {ipv4: ipv4, ipv6: ipv6}; } else { this.ipConfig_ = undefined; }
diff --git a/ash/wm/wm_pixel_diff_test.cc b/ash/wm/wm_pixel_diff_test.cc index c605fb8..8f07eb4c 100644 --- a/ash/wm/wm_pixel_diff_test.cc +++ b/ash/wm/wm_pixel_diff_test.cc
@@ -81,7 +81,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "overview_and_desks_bar_basic", - /*revision_number=*/9, desk_widget, overview_widget1, overview_widget2, + /*revision_number=*/10, desk_widget, overview_widget1, overview_widget2, overview_widget3)); } @@ -118,7 +118,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "overview_tablet_snap", - /*revision_number=*/1, snapped_window_widget, overview_widget2, + /*revision_number=*/2, snapped_window_widget, overview_widget2, overview_widget3)); }
diff --git a/base/allocator/partition_allocator/pointers/raw_ptr.h b/base/allocator/partition_allocator/pointers/raw_ptr.h index ff073ec2..4bc8926d 100644 --- a/base/allocator/partition_allocator/pointers/raw_ptr.h +++ b/base/allocator/partition_allocator/pointers/raw_ptr.h
@@ -636,10 +636,14 @@ typename U = T, RawPtrTraits CopyTraits = Traits, typename Unused = std::enable_if_t< - !raw_ptr_traits::IsPtrArithmeticAllowed(CopyTraits) && !std::is_void<typename std::remove_cv<U>::type>::value && partition_alloc::internal::is_offset_type<Z>>> - U& operator[](Z delta_elems) const = delete; + U& operator[](Z delta_elems) const { + static_assert( + raw_ptr_traits::IsPtrArithmeticAllowed(Traits), + "cannot index raw_ptr unless AllowPtrArithmetic trait is present."); + return wrapped_ptr_[delta_elems]; + } // Do not disable operator+() and operator-(). // They provide OOB checks, which prevent from assigning an arbitrary value to
diff --git a/base/allocator/partition_allocator/pointers/raw_ptr_asan_unowned_impl.h b/base/allocator/partition_allocator/pointers/raw_ptr_asan_unowned_impl.h index 18bb944..cd7519c 100644 --- a/base/allocator/partition_allocator/pointers/raw_ptr_asan_unowned_impl.h +++ b/base/allocator/partition_allocator/pointers/raw_ptr_asan_unowned_impl.h
@@ -144,8 +144,6 @@ // This is for accounting only, used by unit tests. PA_ALWAYS_INLINE static constexpr void IncrementSwapCountForTest() {} PA_ALWAYS_INLINE static constexpr void IncrementLessCountForTest() {} - PA_ALWAYS_INLINE static constexpr void - IncrementPointerToMemberOperatorCountForTest() {} }; } // namespace base::internal
diff --git a/base/allocator/partition_allocator/pointers/raw_ptr_backup_ref_impl.h b/base/allocator/partition_allocator/pointers/raw_ptr_backup_ref_impl.h index 67c43f5c..344ea72 100644 --- a/base/allocator/partition_allocator/pointers/raw_ptr_backup_ref_impl.h +++ b/base/allocator/partition_allocator/pointers/raw_ptr_backup_ref_impl.h
@@ -476,8 +476,6 @@ // This is for accounting only, used by unit tests. PA_ALWAYS_INLINE static constexpr void IncrementSwapCountForTest() {} PA_ALWAYS_INLINE static constexpr void IncrementLessCountForTest() {} - PA_ALWAYS_INLINE static constexpr void - IncrementPointerToMemberOperatorCountForTest() {} private: // We've evaluated several strategies (inline nothing, various parts, or
diff --git a/base/allocator/partition_allocator/pointers/raw_ptr_counting_impl_wrapper_for_test.h b/base/allocator/partition_allocator/pointers/raw_ptr_counting_impl_wrapper_for_test.h index 93b0d7d..c1f4966 100644 --- a/base/allocator/partition_allocator/pointers/raw_ptr_counting_impl_wrapper_for_test.h +++ b/base/allocator/partition_allocator/pointers/raw_ptr_counting_impl_wrapper_for_test.h
@@ -70,11 +70,6 @@ ++wrapped_ptr_less_cnt; } - PA_ALWAYS_INLINE static constexpr void - IncrementPointerToMemberOperatorCountForTest() { - ++pointer_to_member_operator_cnt; - } - template <typename T> PA_ALWAYS_INLINE static constexpr T* WrapRawPtrForDuplication(T* ptr) { ++wrap_raw_ptr_for_dup_cnt;
diff --git a/base/allocator/partition_allocator/pointers/raw_ptr_hookable_impl.h b/base/allocator/partition_allocator/pointers/raw_ptr_hookable_impl.h index 5ba8c1f5..9180c81 100644 --- a/base/allocator/partition_allocator/pointers/raw_ptr_hookable_impl.h +++ b/base/allocator/partition_allocator/pointers/raw_ptr_hookable_impl.h
@@ -207,8 +207,6 @@ // This is for accounting only, used by unit tests. PA_ALWAYS_INLINE static constexpr void IncrementSwapCountForTest() {} PA_ALWAYS_INLINE static constexpr void IncrementLessCountForTest() {} - PA_ALWAYS_INLINE static constexpr void - IncrementPointerToMemberOperatorCountForTest() {} }; } // namespace base::internal
diff --git a/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h b/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h index 5722667..d76600ae 100644 --- a/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h +++ b/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h
@@ -111,8 +111,6 @@ // This is for accounting only, used by unit tests. PA_ALWAYS_INLINE constexpr static void IncrementSwapCountForTest() {} PA_ALWAYS_INLINE constexpr static void IncrementLessCountForTest() {} - PA_ALWAYS_INLINE constexpr static void - IncrementPointerToMemberOperatorCountForTest() {} }; } // namespace base::internal
diff --git a/base/allocator/partition_allocator/pointers/raw_ptr_unittest.nc b/base/allocator/partition_allocator/pointers/raw_ptr_unittest.nc index 8ab2d90..dab8d3b 100644 --- a/base/allocator/partition_allocator/pointers/raw_ptr_unittest.nc +++ b/base/allocator/partition_allocator/pointers/raw_ptr_unittest.nc
@@ -300,7 +300,7 @@ raw_ptr<int> ptr2 = ptr - 1; } -#elif defined(DISABLED_NCTEST_BAN_PTR_INDEX) // [r"overload resolution selected deleted operator"] +#elif defined(DISABLED_NCTEST_BAN_PTR_INDEX) // [r"static assertion failed due to requirement '.*IsPtrArithmeticAllowed.*'"] int WontCompile() { raw_ptr<int> ptr = new int(3);
diff --git a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRule.java b/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRule.java index ceaa80e..eace5f2a 100644 --- a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRule.java +++ b/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRule.java
@@ -24,8 +24,11 @@ import org.chromium.base.task.PostTask; import org.chromium.base.test.BaseRobolectricTestRunner.HelperTestRunner; import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.build.NativeLibraries; import java.lang.reflect.Method; +import java.util.Locale; +import java.util.TimeZone; /** * The default Rule used by BaseRobolectricTestRunner. Include this directly when using @@ -33,6 +36,9 @@ * Use @Rule(order=-2) to ensure it runs before other rules. */ public class BaseRobolectricTestRule implements TestRule { + private static final Locale ORIG_LOCALE = Locale.getDefault(); + private static final TimeZone ORIG_TIMEZONE = TimeZone.getDefault(); + // Removes the API Level suffix. E.g. "testSomething[28]" -> "testSomething". private static String stripBrackets(String methodName) { int idx = methodName.indexOf('['); @@ -65,8 +71,13 @@ static void setUp(Method method) { UmaRecorderHolder.setUpNativeUmaRecorder(false); - LibraryLoader.getInstance().setLibraryProcessType(LibraryProcessType.PROCESS_BROWSER); ContextUtils.initApplicationContextForTests(ApplicationProvider.getApplicationContext()); + LibraryLoader.getInstance().setLibraryProcessType(LibraryProcessType.PROCESS_BROWSER); + // Whether or not native is loaded is a global one-way switch, so do it automatically so + // that it is always in the same state. + if (NativeLibraries.LIBRARIES.length > 0) { + LibraryLoader.getInstance().ensureMainDexInitialized(); + } ApplicationStatus.initialize(ApplicationProvider.getApplicationContext()); UmaRecorderHolder.resetForTesting(); CommandLineFlags.setUpClass(method.getDeclaringClass()); @@ -90,6 +101,8 @@ ContextUtils.clearApplicationContextForTests(); PathUtils.resetForTesting(); ThreadUtils.clearUiThreadForTesting(); + Locale.setDefault(ORIG_LOCALE); + TimeZone.setDefault(ORIG_TIMEZONE); // Run assertions only when the test has not already failed so as to not mask // failures. https://crbug.com/1466313 if (testFailed) {
diff --git a/build/toolchain/android/BUILD.gn b/build/toolchain/android/BUILD.gn index cf347f4..a79765cb 100644 --- a/build/toolchain/android/BUILD.gn +++ b/build/toolchain/android/BUILD.gn
@@ -135,4 +135,8 @@ current_cpu = host_cpu is_robolectric = true } + + # TODO(crbug.com/1487407): Figure out why robolectric tests fail with component builds. + toolchain_args.is_component_build = false + shlib_extension = ".so" }
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni index 20c10669..005c21b 100644 --- a/build/toolchain/gcc_toolchain.gni +++ b/build/toolchain/gcc_toolchain.gni
@@ -289,6 +289,7 @@ cc = compiler_prefix + invoker.cc cxx = compiler_prefix + invoker.cxx + # "asm" doesn't support any of toolchain_cc_wrapper, toolchain_uses_goma and # toolchain_uses_remoteexec. The coverage flags are also nonsensical on # assembler runs. @@ -891,16 +892,7 @@ ar = "${prefix}/llvm-ar" nm = "${prefix}/llvm-nm" - forward_variables_from(invoker, - [ - "strip", - "default_shlib_subdir", - "dwp", - "enable_linker_map", - "loadable_module_extension", - "propagates_configs", - "use_unstripped_as_runtime_outputs", - ]) + forward_variables_from(invoker, "*", [ "toolchain_args" ]) toolchain_args = { if (defined(invoker.toolchain_args)) {
diff --git a/cc/paint/image_transfer_cache_entry_unittest.cc b/cc/paint/image_transfer_cache_entry_unittest.cc index f17b540..405e3044 100644 --- a/cc/paint/image_transfer_cache_entry_unittest.cc +++ b/cc/paint/image_transfer_cache_entry_unittest.cc
@@ -32,6 +32,7 @@ #include "third_party/skia/include/gpu/GrTypes.h" #include "third_party/skia/include/gpu/ganesh/SkImageGanesh.h" #include "third_party/skia/include/gpu/ganesh/gl/GrGLBackendSurface.h" +#include "third_party/skia/include/gpu/ganesh/gl/GrGLDirectContext.h" #include "third_party/skia/include/gpu/gl/GrGLInterface.h" #include "third_party/skia/include/gpu/gl/GrGLTypes.h" #include "ui/gfx/geometry/size.h" @@ -103,7 +104,7 @@ ASSERT_TRUE(gl_context_->MakeCurrent(surface_.get())); sk_sp<GrGLInterface> gl_interface(gl::init::CreateGrGLInterface( *gl_context_->GetVersionInfo(), false /* use_version_es2 */)); - gr_context_ = GrDirectContext::MakeGL(std::move(gl_interface)); + gr_context_ = GrDirectContexts::MakeGL(std::move(gl_interface)); ASSERT_TRUE(gr_context_); }
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc index 14dd250..070d9c1 100644 --- a/cc/trees/draw_property_utils.cc +++ b/cc/trees/draw_property_utils.cc
@@ -829,9 +829,14 @@ if (!property_trees->GetToTarget(node->transform_id, target_id, &to_target)) return kEmptyMaskFilterInfoPair; - auto result = - std::make_pair(node->mask_filter_info, node->is_fast_rounded_corner); - result.first.ApplyTransform(to_target); + auto mfi = node->mask_filter_info; + mfi.ApplyTransform(to_target); + + auto rrect_f = gfx::RRectF::ToEnclosingRRectF(mfi.rounded_corner_bounds()); + auto result = std::make_pair( + gfx::MaskFilterInfo(rrect_f, + mfi.gradient_mask().value_or(gfx::LinearGradient())), + node->is_fast_rounded_corner); if (result.first.IsEmpty()) { return kEmptyMaskFilterInfoPair; }
diff --git a/cc/trees/property_tree_builder_unittest.cc b/cc/trees/property_tree_builder_unittest.cc index 5807638..c810b14 100644 --- a/cc/trees/property_tree_builder_unittest.cc +++ b/cc/trees/property_tree_builder_unittest.cc
@@ -1233,7 +1233,7 @@ // The net offset from the origin of the render target is [41, 51]. However, // this also has transform scale that must be applied separately (1.6 * // transform_scale = 3.2) thus giving [67.2, 91.2]. The corner radius is also - // scaled by a factor of 3.2. + // scaled by a factor of 3.2. These values are ceiled - see crbug.com/1443413. const gfx::RRectF actual_rrect_4 = rounded_corner_layer_4_impl->draw_properties() .mask_filter_info.rounded_corner_bounds(); @@ -1242,10 +1242,8 @@ bounds_in_target_space = kRoundedCornerLayer4Bound; bounds_in_target_space.Scale(kDeviceScale * kRoundedCorner3Scale); bounds_in_target_space += layer3_bounds_in_target_space.OffsetFromOrigin(); - // Due to rounding error, compare rects by strings, which rounds by first - // decimal. - EXPECT_EQ(actual_rrect_4.rect().ToString(), - bounds_in_target_space.ToString()); + EXPECT_EQ(actual_rrect_4.rect(), + gfx::RectF(gfx::ToEnclosingRect(bounds_in_target_space))); EXPECT_FLOAT_EQ(actual_rrect_4.GetSimpleRadius(), kRoundedCorner4Radius * kDeviceScale * kRoundedCorner3Scale); } @@ -1582,7 +1580,8 @@ .mask_filter_info.rounded_corner_bounds(); bounds_in_target_space = kRoundedCornerLayer4Bound; bounds_in_target_space.Scale(kDeviceScale); - EXPECT_EQ(actual_rrect_4.rect(), bounds_in_target_space); + EXPECT_EQ(actual_rrect_4.rect(), + gfx::RectF(gfx::ToEnclosingRect(bounds_in_target_space))); EXPECT_FLOAT_EQ(actual_rrect_4.GetSimpleRadius(), kRoundedCorner4Radius * kDeviceScale); } @@ -2047,7 +2046,8 @@ .mask_filter_info.rounded_corner_bounds(); bounds_in_target_space = kRoundedCornerLayer6Bound; bounds_in_target_space.Scale(kDeviceScale); - EXPECT_EQ(actual_self_rrect_6.rect(), bounds_in_target_space); + EXPECT_EQ(actual_self_rrect_6.rect(), + gfx::RectF(gfx::ToEnclosingRect(bounds_in_target_space))); EXPECT_FLOAT_EQ(actual_self_rrect_6.GetSimpleRadius(), kRoundedCorner6Radius * kDeviceScale); } @@ -2300,14 +2300,16 @@ // The render target for this layer is |root|. // The offset from the origin of the render target is [60, 8] and the device // scale factor is 1.6 thus giving the target space origin of [96, 12.8]. The - // corner radius is also scaled by a factor of 1.6. + // corner radius is also scaled by a factor of 1.6. These values are ceiled - + // see crbug.com/1443413. const gfx::RRectF actual_self_rrect_3 = rounded_corner_layer_impl_3->draw_properties() .mask_filter_info.rounded_corner_bounds(); bounds_in_target_space = kRoundedCornerLayer3Bound; bounds_in_target_space += kRoundedCornerLayer2Bound.OffsetFromOrigin(); bounds_in_target_space.Scale(kDeviceScale); - EXPECT_EQ(actual_self_rrect_3.rect(), bounds_in_target_space); + EXPECT_EQ(actual_self_rrect_3.rect(), + gfx::RectF(gfx::ToEnclosingRect(bounds_in_target_space))); EXPECT_FLOAT_EQ(actual_self_rrect_3.GetSimpleRadius(), kRoundedCorner3Radius * kDeviceScale);
diff --git a/chrome/VERSION b/chrome/VERSION index 097a261f2..ff213a1 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=119 MINOR=0 -BUILD=6038 +BUILD=6039 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 3db397b3..3cbaea2 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -1693,6 +1693,7 @@ "//components/background_task_scheduler:background_task_scheduler_task_ids_java", "//components/bookmarks/common/android:bookmarks_java", "//components/browser_ui/accessibility/android:lib_java", + "//components/browser_ui/accessibility/android:page_zoom_utils_java", "//components/browser_ui/bottomsheet/android:factory_java", "//components/browser_ui/bottomsheet/android:java", "//components/browser_ui/bottomsheet/android:manager_java",
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java index de3e81e..68634d9b 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -1065,11 +1065,12 @@ // The following |fake*| values mean the values of the fake search box; |real*| values // mean the values of the real search box. - int fakeHeight = mIsSurfacePolishEnabled - ? getPixelSize(R.dimen.ntp_search_box_height_polish) - : getPixelSize(R.dimen.ntp_search_box_height); int realHeight = getPixelSize(R.dimen.toolbar_height_no_shadow) - realVerticalMargin * 2; - int fakeAndRealHeightDiff = fakeHeight - realHeight; + int fakeHeightForAnimation = getPixelSize(R.dimen.ntp_search_box_height); + int fakeHeightBeforeAnimation = mIsSurfacePolishEnabled + ? getPixelSize(R.dimen.ntp_search_box_height_polish) + : fakeHeightForAnimation; + int heightReducedBeforeRealAnimation = fakeHeightBeforeAnimation - fakeHeightForAnimation; int fakeEndPadding = mIsSurfacePolishEnabled ? getPixelSize(R.dimen.fake_search_box_end_padding) @@ -1094,6 +1095,8 @@ : getPixelSize(R.dimen.tasks_surface_location_bar_url_button_start_margin); // realLensButtonStartMargin is 0; + TasksView tasksView = mTasksSurface != null ? (TasksView) mTasksSurface.getView() : mView; + mOffsetChangedListenerToGenerateScrollEvents = (appBarLayout, verticalOffset) -> { for (ScrollListener scrollListener : mScrollListeners) { scrollListener.onHeaderOffsetChanged(verticalOffset); @@ -1103,7 +1106,35 @@ mStartSurfaceMediator.getTopToolbarPlaceholderHeight() + (mStartSurfaceMediator.isLogoVisible() ? logoInSurfaceHeight : 0) - realVerticalMargin; + int startPointToReduceHeight = + fakeSearchBoxToRealSearchBoxTop - heightReducedBeforeRealAnimation; + int scrolledHeight = -verticalOffset; + + int fakeHeight; + if (mIsSurfacePolishEnabled) { + if (scrolledHeight < fakeSearchBoxToRealSearchBoxTop + && scrolledHeight >= startPointToReduceHeight) { + // Reduce both the search box and its container's height before the animation. + fakeHeight = fakeHeightBeforeAnimation; + int reducedHeight = MathUtils.clamp(scrolledHeight - startPointToReduceHeight, + 0, heightReducedBeforeRealAnimation); + int newHeight = fakeHeight - reducedHeight; + tasksView.updateFakeSearchBoxLayoutAndContainer(newHeight); + return; + } else if (scrolledHeight >= fakeSearchBoxToRealSearchBoxTop) { + // Have reduced both the search box and its container's height and is in + // animation. + fakeHeight = fakeHeightForAnimation; + } else { + // Haven't started to reduce both the search box and its container's height. + fakeHeight = fakeHeightBeforeAnimation; + } + } else { + fakeHeight = fakeHeightBeforeAnimation; + } + + int fakeAndRealHeightDiff = fakeHeight - realHeight; // When the fake search box top is scrolled to the search box top, start to reduce // fake search box's height until it's the same as the real search box. int reducedHeight = MathUtils.clamp( @@ -1113,15 +1144,13 @@ // This function should be called together with // StartSurfaceToolbarMediator#updateTranslationY, which scroll up the start surface // toolbar together with the header. - TasksView tasksView = - mTasksSurface != null ? (TasksView) mTasksSurface.getView() : mView; tasksView.updateFakeSearchBox(fakeHeight - reducedHeight, reducedHeight, (int) (fakeEndPadding * (1 - expansionFraction)), SearchEngineLogoUtils.getInstance().shouldShowSearchEngineLogo(false) ? realTranslationX * expansionFraction : 0, (int) (fakeButtonSize + (realButtonSize - fakeButtonSize) * expansionFraction), - (int) (fakeLensButtonStartMargin * (1 - expansionFraction))); + (int) (fakeLensButtonStartMargin * (1 - expansionFraction)), fakeHeight); }; }
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java index db3e9e96..c3a5680 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java
@@ -319,8 +319,8 @@ @Override public void updateFakeSearchBox(int height, int topMargin, int endPadding, float translationX, int buttonSize, int lensButtonLeftMargin) { - mView.updateFakeSearchBox( - height, topMargin, endPadding, translationX, buttonSize, lensButtonLeftMargin); + mView.updateFakeSearchBox(height, topMargin, endPadding, translationX, buttonSize, + lensButtonLeftMargin, height + topMargin); } @Override
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksView.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksView.java index e2e3d6d3..ba339d9 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksView.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksView.java
@@ -92,7 +92,6 @@ (FrameLayout) findViewById(R.id.tab_switcher_module_container); mMvTilesContainerLayout = findViewById(R.id.mv_tiles_container); mSearchBoxCoordinator = new SearchBoxCoordinator(getContext(), this); - updateSearchBoxHeight(); mHeaderView = (AppBarLayout) findViewById(R.id.task_surface_header); @@ -103,16 +102,6 @@ setTabCarouselTitleStyle(); } - /** - * Updates the height of the fake search box for surface polish. - */ - public void updateSearchBoxHeight() { - if (mIsSurfacePolishEnabled) { - mSearchBoxCoordinator.getView().getLayoutParams().height = - getResources().getDimensionPixelSize(R.dimen.ntp_search_box_height_polish); - } - } - @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -439,9 +428,10 @@ * @param translationX Current translationX of text view in fake search box layout. * @param buttonSize Current height and width of the buttons in fake search box layout. * @param lensButtonLeftMargin Current left margin of the lens button in fake search box layout. + * @param fakeSearchBoxContainerHeight Current height of the fake search box container. */ public void updateFakeSearchBox(int height, int topMargin, int endPadding, float translationX, - int buttonSize, int lensButtonLeftMargin) { + int buttonSize, int lensButtonLeftMargin, int fakeSearchBoxContainerHeight) { if (mSearchBoxCoordinator.getView().getVisibility() != View.VISIBLE) return; mSearchBoxCoordinator.setHeight(height); mSearchBoxCoordinator.setTopMargin(topMargin); @@ -450,6 +440,31 @@ mSearchBoxCoordinator.setButtonsHeight(buttonSize); mSearchBoxCoordinator.setButtonsWidth(buttonSize); mSearchBoxCoordinator.setLensButtonLeftMargin(lensButtonLeftMargin); + updateFakeSearchBoxContainer(fakeSearchBoxContainerHeight); + } + + /** + * Update both the fake search box layout and its container. + * @param height Current height of both the fake search box layout and its container. + */ + public void updateFakeSearchBoxLayoutAndContainer(int height) { + mSearchBoxCoordinator.setHeight(height); + updateFakeSearchBoxContainer(height); + } + + /** + * Update the fake search box container. + * @param height Current height of the fake search box container. + */ + public void updateFakeSearchBoxContainer(int height) { + View fakeSearchBoxContainer = findViewById(R.id.fake_search_box); + ViewGroup.LayoutParams lpForContainer = fakeSearchBoxContainer.getLayoutParams(); + + if (lpForContainer.height == height) { + return; + } + + lpForContainer.height = height; } private void forceHeaderScrollable() {
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java index 163bd7df..21eeec8 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java
@@ -338,6 +338,42 @@ assertNotNull("TabSwitcher view should be inflated", tabSwitcherViewHolder); } + // Regression test for crbug.com/1487114. + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.START_SURFACE_REFACTOR, + ChromeFeatureList.DEFER_TAB_SWITCHER_LAYOUT_CREATION}) + public void + testGridTabSwitcher_DeferredTabSwitcherLayoutCreation_RefactorEnabled() + throws ExecutionException { + prepareTabs(2, 0); + // Verifies that the dialog visibility supplier doesn't crash when closing a Tab without the + // grid tab switcher is inflated. + TestThreadUtils.runOnUiThreadBlocking(() -> { + sActivityTestRule.getActivity().getCurrentTabModel().closeTab( + sActivityTestRule.getActivity().getActivityTab()); + }); + + Layout layout = + sActivityTestRule.getActivity().getLayoutManager().getTabSwitcherLayoutForTesting(); + assertNull("StartSurface layout should not be initialized", layout); + ViewStub tabSwitcherStub = (ViewStub) sActivityTestRule.getActivity().findViewById( + R.id.tab_switcher_view_holder_stub); + assertTrue("TabSwitcher view stub should not be inflated", + tabSwitcherStub.getParent() != null); + + // Click tab switcher button + TabUiTestHelper.enterTabSwitcher(sActivityTestRule.getActivity()); + + layout = + sActivityTestRule.getActivity().getLayoutManager().getTabSwitcherLayoutForTesting(); + assertTrue("OverviewLayout should be TabSwitcherAndStartSurfaceLayout layout", + layout instanceof TabSwitcherLayout); + ViewGroup tabSwitcherViewHolder = + sActivityTestRule.getActivity().findViewById(R.id.tab_switcher_view_holder); + assertNotNull("TabSwitcher view should be inflated", tabSwitcherViewHolder); + } + @Test @MediumTest public void testEmptyStateView() throws Exception {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index a9fb9d7..01c85c2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -706,7 +706,9 @@ // If the refactor is enabled, we create grid tab switcher directly instead of via start // surface. if (isStartSurfaceRefactorEnabled()) { - if (!ChromeFeatureList.sDeferTabSwitcherLayoutCreation.isEnabled()) { + // Until Start Surface Refactor is launched, Tablets create the GridTabSwitcher through + // this method. + if (!ChromeFeatureList.sDeferTabSwitcherLayoutCreation.isEnabled() || isTablet()) { createGridTabSwitcher(compositorViewHolder, tabSwitcherContainer); } if (ReturnToChromeUtil.isStartSurfaceEnabled(this)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java index 5f2e4ff..2349354 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
@@ -420,13 +420,6 @@ } /** - * @return Whether the native library initialization is delayed at this point. - */ - protected boolean isStartupDelayed() { - return mStartupDelayed; - } - - /** * @return Whether the browser startup should be delayed. Note that changing this return value * will have direct impact on startup performance. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninBridge.java index f34ab3e..f042a2b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninBridge.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.signin; -import android.accounts.Account; import android.content.Context; import androidx.annotation.VisibleForTesting; @@ -32,6 +31,7 @@ import org.chromium.components.signin.AccountManagerFacadeProvider; import org.chromium.components.signin.AccountUtils; import org.chromium.components.signin.GAIAServiceType; +import org.chromium.components.signin.base.CoreAccountInfo; import org.chromium.components.signin.metrics.AccountConsistencyPromoAction; import org.chromium.components.signin.metrics.SigninAccessPoint; import org.chromium.ui.base.WindowAndroid; @@ -87,9 +87,10 @@ SigninAccessPoint.WEB_SIGNIN); return; } - final List<Account> accounts = AccountUtils.getAccountsIfFulfilledOrEmpty( - AccountManagerFacadeProvider.getInstance().getAccounts()); - if (accounts.isEmpty()) { + final List<CoreAccountInfo> coreAccountInfos = + AccountUtils.getCoreAccountInfosIfFulfilledOrEmpty( + AccountManagerFacadeProvider.getInstance().getCoreAccountInfos()); + if (coreAccountInfos.isEmpty()) { SigninMetricsUtils.logAccountConsistencyPromoAction( AccountConsistencyPromoAction.SUPPRESSED_NO_ACCOUNTS, SigninAccessPoint.WEB_SIGNIN);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java index 4696eee..633f345 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java
@@ -75,7 +75,7 @@ private @GAIAServiceType int mGaiaServiceType = GAIAServiceType.GAIA_SERVICE_TYPE_NONE; - private String mSignedInAccountName; + private CoreAccountInfo mSignedInCoreAccountInfo; private ProfileDataCache mProfileDataCache; private @Nullable SyncService.SyncSetupInProgressHandle mSyncSetupInProgressHandle; @@ -139,25 +139,31 @@ if (getPreferenceScreen() != null) getPreferenceScreen().removeAll(); - mSignedInAccountName = + String signedInAccountEmail = CoreAccountInfo.getEmailFrom(IdentityServicesProvider.get() .getIdentityManager(getProfile()) .getPrimaryAccountInfo(ConsentLevel.SIGNIN)); - if (mSignedInAccountName == null) { + List<CoreAccountInfo> coreAccountInfos = AccountUtils.getCoreAccountInfosIfFulfilledOrEmpty( + AccountManagerFacadeProvider.getInstance().getCoreAccountInfos()); + if (signedInAccountEmail == null || coreAccountInfos.isEmpty()) { // The AccountManagementFragment can only be shown when the user is signed in. If the // user is signed out, exit the fragment. getActivity().finish(); return; } + mSignedInCoreAccountInfo = + AccountUtils.findCoreAccountInfoByEmail(coreAccountInfos, signedInAccountEmail); + assert mSignedInCoreAccountInfo != null; DisplayableProfileData profileData = - mProfileDataCache.getProfileDataOrDefault(mSignedInAccountName); + mProfileDataCache.getProfileDataOrDefault(mSignedInCoreAccountInfo.getEmail()); getActivity().setTitle(SyncSettingsUtils.getDisplayableFullNameOrEmailWithPreference( profileData, getContext(), SyncSettingsUtils.TitlePreference.FULL_NAME)); addPreferencesFromResource(R.xml.account_management_preferences); configureSignOutSwitch(); configureChildAccountPreferences(); - AccountManagerFacadeProvider.getInstance().getAccounts().then(this::updateAccountsList); + AccountManagerFacadeProvider.getInstance().getCoreAccountInfos().then( + this::updateAccountsList); } /** @@ -188,7 +194,7 @@ ? R.string.sign_out_and_turn_off_sync : R.string.sign_out); signOutPreference.setOnPreferenceClickListener(preference -> { - if (!isVisible() || !isResumed() || mSignedInAccountName == null) { + if (!isVisible() || !isResumed() || mSignedInCoreAccountInfo == null) { return false; } @@ -237,12 +243,12 @@ } } - private void updateAccountsList(List<Account> accounts) { + private void updateAccountsList(List<CoreAccountInfo> coreAccountInfos) { // This method is called asynchronously on accounts fetched from AccountManagerFacade. // Make sure the fragment is alive before updating preferences. if (!isResumed()) return; - setAccountBadges(accounts); + setAccountBadges(coreAccountInfos); PreferenceCategory accountsCategory = findPreference(PREF_ACCOUNTS_CATEGORY); if (accountsCategory == null) { @@ -252,33 +258,34 @@ } accountsCategory.removeAll(); - accountsCategory.addPreference( - createAccountPreference(AccountUtils.createAccountFromName(mSignedInAccountName))); + accountsCategory.addPreference(createAccountPreference(mSignedInCoreAccountInfo)); accountsCategory.addPreference( createDividerPreference(R.layout.account_divider_preference)); accountsCategory.addPreference(createManageYourGoogleAccountPreference()); accountsCategory.addPreference(createDividerPreference(R.layout.divider_preference)); - for (Account account : accounts) { - if (!mSignedInAccountName.equals(account.name)) { - accountsCategory.addPreference(createAccountPreference(account)); + for (CoreAccountInfo coreAccountInfo : coreAccountInfos) { + if (!mSignedInCoreAccountInfo.equals(coreAccountInfo)) { + accountsCategory.addPreference(createAccountPreference(coreAccountInfo)); } } accountsCategory.addPreference(createAddAccountPreference()); } - private Preference createAccountPreference(Account account) { + private Preference createAccountPreference(CoreAccountInfo coreAccountInfo) { Preference accountPreference = new Preference(getStyledContext()); accountPreference.setLayoutResource(R.layout.account_management_account_row); DisplayableProfileData profileData = - mProfileDataCache.getProfileDataOrDefault(account.name); + mProfileDataCache.getProfileDataOrDefault(coreAccountInfo.getEmail()); accountPreference.setTitle(SyncSettingsUtils.getDisplayableFullNameOrEmailWithPreference( profileData, getContext(), SyncSettingsUtils.TitlePreference.EMAIL)); accountPreference.setIcon(profileData.getImage()); - accountPreference.setOnPreferenceClickListener(SyncSettingsUtils.toOnClickListener( - this, () -> SigninUtils.openSettingsForAccount(getActivity(), account))); + accountPreference.setOnPreferenceClickListener(SyncSettingsUtils.toOnClickListener(this, + () + -> SigninUtils.openSettingsForAccount( + getActivity(), coreAccountInfo.getEmail()))); return accountPreference; } @@ -348,13 +355,14 @@ return getPreferenceManager().getContext(); } - private void setAccountBadges(List<Account> accounts) { - for (Account account : accounts) { + private void setAccountBadges(List<CoreAccountInfo> coreAccountInfos) { + for (CoreAccountInfo coreAccountInfo : coreAccountInfos) { + Account account = CoreAccountInfo.getAndroidAccountFrom(coreAccountInfo); AccountManagerFacadeProvider.getInstance().checkChildAccountStatus( account, (isChild, childAccount) -> { if (isChild) { mProfileDataCache.setBadge( - childAccount, R.drawable.ic_account_child_20dp); + childAccount.name, R.drawable.ic_account_child_20dp); } }); } @@ -363,7 +371,8 @@ // ProfileDataCache.Observer implementation: @Override public void onProfileDataUpdated(String accountEmail) { - AccountManagerFacadeProvider.getInstance().getAccounts().then(this::updateAccountsList); + AccountManagerFacadeProvider.getInstance().getCoreAccountInfos().then( + this::updateAccountsList); } // SignOutDialogListener implementation:
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/settings/AccessibilitySettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/settings/AccessibilitySettingsTest.java index 10583a14..ab853e0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/settings/AccessibilitySettingsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/settings/AccessibilitySettingsTest.java
@@ -6,6 +6,7 @@ import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; @@ -14,37 +15,48 @@ import android.content.Intent; import android.content.IntentFilter; import android.provider.Settings; +import android.view.View; import androidx.preference.Preference; +import androidx.test.espresso.action.ViewActions; import androidx.test.espresso.contrib.RecyclerViewActions; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.task.PostTask; import org.chromium.base.task.TaskTraits; import org.chromium.base.test.util.CriteriaHelper; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.R; +import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.DisableFeatures; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.browser_ui.accessibility.AccessibilitySettings; import org.chromium.components.browser_ui.accessibility.FontSizePrefs; +import org.chromium.components.browser_ui.accessibility.PageZoomPreference; +import org.chromium.components.browser_ui.accessibility.PageZoomUtils; import org.chromium.components.browser_ui.accessibility.TextScalePreference; import org.chromium.components.browser_ui.settings.ChromeSwitchPreference; import org.chromium.content_public.browser.ContentFeatureList; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.UiUtils; import org.chromium.ui.accessibility.AccessibilityState; +import org.chromium.ui.test.util.ViewUtils; +import org.chromium.ui.widget.ChromeImageButton; import java.text.NumberFormat; @@ -57,15 +69,29 @@ @RunWith(ChromeJUnit4ClassRunner.class) public class AccessibilitySettingsTest { private static final String PREF_IMAGE_DESCRIPTIONS = "image_descriptions"; + private AccessibilitySettings mAccessibilitySettings; + private PageZoomPreference mPageZoomPref; @Rule public SettingsActivityTestRule<AccessibilitySettings> mSettingsActivityTestRule = new SettingsActivityTestRule<>(AccessibilitySettings.class); + @Rule + public TestRule mProcessor = new Features.InstrumentationProcessor(); + + @Before + public void setUp() { + // Enable screen reader to display all settings options. + TestThreadUtils.runOnUiThreadBlocking( + () -> AccessibilityState.setIsScreenReaderEnabledForTesting(true)); + + mSettingsActivityTestRule.startSettingsActivity(); + mAccessibilitySettings = mSettingsActivityTestRule.getFragment(); + } @After public void tearDown() { TestThreadUtils.runOnUiThreadBlocking( - () -> { AccessibilityState.setIsScreenReaderEnabledForTesting(false); }); + () -> AccessibilityState.setIsScreenReaderEnabledForTesting(false)); } /** @@ -75,16 +101,13 @@ @Test @SmallTest @Feature({"Accessibility"}) - @DisableFeatures(ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM) + @DisableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) public void testAccessibilitySettings() throws Exception { - mSettingsActivityTestRule.startSettingsActivity(); - AccessibilitySettings accessibilitySettings = mSettingsActivityTestRule.getFragment(); - TextScalePreference textScalePref = - (TextScalePreference) accessibilitySettings.findPreference( + (TextScalePreference) mAccessibilitySettings.findPreference( AccessibilitySettings.PREF_TEXT_SCALE); ChromeSwitchPreference forceEnableZoomPref = - (ChromeSwitchPreference) accessibilitySettings.findPreference( + (ChromeSwitchPreference) mAccessibilitySettings.findPreference( AccessibilitySettings.PREF_FORCE_ENABLE_ZOOM); NumberFormat percentFormat = NumberFormat.getPercentInstance(); // Arbitrary value 0.4f to be larger and smaller than threshold. @@ -93,7 +116,7 @@ float fontBiggerThanThreshold = FontSizePrefs.FORCE_ENABLE_ZOOM_THRESHOLD_MULTIPLIER + 0.4f; // Set the textScaleFactor above the threshold. - userSetTextScale(accessibilitySettings, textScalePref, fontBiggerThanThreshold); + userSetTextScale(mAccessibilitySettings, textScalePref, fontBiggerThanThreshold); UiUtils.settleDownUI(InstrumentationRegistry.getInstrumentation()); // Since above the threshold, this will check the force enable zoom button. Assert.assertEquals( @@ -102,7 +125,7 @@ assertFontSizePrefs(true, fontBiggerThanThreshold); // Set the textScaleFactor below the threshold. - userSetTextScale(accessibilitySettings, textScalePref, fontSmallerThanThreshold); + userSetTextScale(mAccessibilitySettings, textScalePref, fontSmallerThanThreshold); UiUtils.settleDownUI(InstrumentationRegistry.getInstrumentation()); // Since below the threshold and userSetForceEnableZoom is false, this will uncheck // the force enable zoom button. @@ -111,13 +134,13 @@ Assert.assertFalse(forceEnableZoomPref.isChecked()); assertFontSizePrefs(false, fontSmallerThanThreshold); - userSetTextScale(accessibilitySettings, textScalePref, fontBiggerThanThreshold); + userSetTextScale(mAccessibilitySettings, textScalePref, fontBiggerThanThreshold); // Sets onUserSetForceEnableZoom to be true. - userSetForceEnableZoom(accessibilitySettings, forceEnableZoomPref, true); + userSetForceEnableZoom(mAccessibilitySettings, forceEnableZoomPref, true); UiUtils.settleDownUI(InstrumentationRegistry.getInstrumentation()); // Since userSetForceEnableZoom is true, when the text scale is moved below the threshold // ForceEnableZoom should remain checked. - userSetTextScale(accessibilitySettings, textScalePref, fontSmallerThanThreshold); + userSetTextScale(mAccessibilitySettings, textScalePref, fontSmallerThanThreshold); Assert.assertTrue(forceEnableZoomPref.isChecked()); assertFontSizePrefs(true, fontSmallerThanThreshold); } @@ -125,24 +148,21 @@ @Test @SmallTest @Feature({"Accessibility"}) - @DisableFeatures(ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM) + @DisableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) public void testChangedFontPrefSavedOnStop() { - mSettingsActivityTestRule.startSettingsActivity(); - AccessibilitySettings accessibilitySettings = mSettingsActivityTestRule.getFragment(); - TextScalePreference textScalePref = - accessibilitySettings.findPreference(AccessibilitySettings.PREF_TEXT_SCALE); + mAccessibilitySettings.findPreference(AccessibilitySettings.PREF_TEXT_SCALE); // Change text scale a couple of times. - userSetTextScale(accessibilitySettings, textScalePref, 0.5f); - userSetTextScale(accessibilitySettings, textScalePref, 1.75f); + userSetTextScale(mAccessibilitySettings, textScalePref, 0.5f); + userSetTextScale(mAccessibilitySettings, textScalePref, 1.75f); Assert.assertEquals("Histogram should not be recorded yet.", 0, RecordHistogram.getHistogramTotalCountForTesting( FontSizePrefs.FONT_SIZE_CHANGE_HISTOGRAM)); // Simulate activity stopping. - TestThreadUtils.runOnUiThreadBlocking(() -> accessibilitySettings.onStop()); + TestThreadUtils.runOnUiThreadBlocking(() -> mAccessibilitySettings.onStop()); Assert.assertEquals("Histogram should have been recorded once.", 1, RecordHistogram.getHistogramTotalCountForTesting( @@ -155,13 +175,10 @@ @Test @SmallTest @Feature({"Accessibility"}) - @DisableFeatures(ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM) + @DisableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) public void testUnchangedFontPrefNotSavedOnStop() { - mSettingsActivityTestRule.startSettingsActivity(); - AccessibilitySettings accessibilitySettings = mSettingsActivityTestRule.getFragment(); - // Simulate activity stopping. - TestThreadUtils.runOnUiThreadBlocking(() -> accessibilitySettings.onStop()); + TestThreadUtils.runOnUiThreadBlocking(() -> mAccessibilitySettings.onStop()); Assert.assertEquals("Histogram should not have been recorded.", 0, RecordHistogram.getHistogramTotalCountForTesting( FontSizePrefs.FONT_SIZE_CHANGE_HISTOGRAM)); @@ -171,11 +188,8 @@ @SmallTest @Feature({"Accessibility"}) public void testCaptionPreferences() { - mSettingsActivityTestRule.startSettingsActivity(); - AccessibilitySettings accessibilitySettings = mSettingsActivityTestRule.getFragment(); - Preference captionsPref = - accessibilitySettings.findPreference(AccessibilitySettings.PREF_CAPTIONS); + mAccessibilitySettings.findPreference(AccessibilitySettings.PREF_CAPTIONS); Assert.assertNotNull(captionsPref); Assert.assertNotNull(captionsPref.getOnPreferenceClickListener()); @@ -196,44 +210,10 @@ @Test @SmallTest @Feature({"Accessibility"}) - @DisabledTest(message = "https://crbug.com/1480116") - public void testZoomInfoPreference() { - mSettingsActivityTestRule.startSettingsActivity(); - AccessibilitySettings accessibilitySettings = mSettingsActivityTestRule.getFragment(); - - Preference zoomInfoPref = - accessibilitySettings.findPreference(AccessibilitySettings.PREF_ZOOM_INFO); - Assert.assertNotNull(zoomInfoPref); - Assert.assertNotNull(zoomInfoPref.getOnPreferenceClickListener()); - - Instrumentation.ActivityMonitor monitor = - InstrumentationRegistry.getInstrumentation().addMonitor( - new IntentFilter(), null, false); - - // First scroll to the Zoom preference, then click. - onView(withId(R.id.recycler_view)) - .perform(RecyclerViewActions.scrollTo( - hasDescendant(withText(R.string.zoom_info_preference_title)))); - onView(withText(R.string.zoom_info_preference_title)).perform(click()); - monitor.waitForActivityWithTimeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL); - Assert.assertEquals("Monitor for has not been called", 1, monitor.getHits()); - InstrumentationRegistry.getInstrumentation().removeMonitor(monitor); - } - - @Test - @SmallTest - @Feature({"Accessibility"}) + @DisableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) public void testImageDescriptionsPreferences_Enabled() { - // Enable screen reader to display settings option. - TestThreadUtils.runOnUiThreadBlocking( - () -> { AccessibilityState.setIsScreenReaderEnabledForTesting(true); }); - - mSettingsActivityTestRule.startSettingsActivity(); - - AccessibilitySettings accessibilitySettings = mSettingsActivityTestRule.getFragment(); - Preference imageDescriptionsPref = - accessibilitySettings.findPreference(PREF_IMAGE_DESCRIPTIONS); + mAccessibilitySettings.findPreference(PREF_IMAGE_DESCRIPTIONS); Assert.assertNotNull(imageDescriptionsPref); Assert.assertTrue( @@ -256,6 +236,240 @@ InstrumentationRegistry.getInstrumentation().removeMonitor(monitor); } + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) + public void testPageZoomPreference_savedZoomLevelsPreference() { + Preference zoomInfoPref = + mAccessibilitySettings.findPreference(AccessibilitySettings.PREF_ZOOM_INFO); + Assert.assertNotNull(zoomInfoPref); + Assert.assertNotNull(zoomInfoPref.getOnPreferenceClickListener()); + + Instrumentation.ActivityMonitor monitor = + InstrumentationRegistry.getInstrumentation().addMonitor( + new IntentFilter(), null, false); + + // First scroll to the "Saved zoom levels" preference, then click. + onView(withId(R.id.recycler_view)) + .perform(RecyclerViewActions.scrollTo( + hasDescendant(withText(R.string.zoom_info_preference_title)))); + onView(withText(R.string.zoom_info_preference_title)).perform(click()); + + // The activity is blocked, so just wait for the ActivityMonitor to capture an Intent. + CriteriaHelper.pollInstrumentationThread(() + -> monitor.getHits() >= 1, + "Clicking 'Saved zoom levels' should open Site Settings page."); + + InstrumentationRegistry.getInstrumentation().removeMonitor(monitor); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @DisableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) + public void testPageZoomPreference_hiddenWhenDisabled() { + mPageZoomPref = (PageZoomPreference) mAccessibilitySettings.findPreference( + AccessibilitySettings.PREF_PAGE_ZOOM_DEFAULT_ZOOM); + Assert.assertNotNull(mPageZoomPref); + Assert.assertFalse("Page Zoom default zoom option should not be visible when disabled", + mPageZoomPref.isVisible()); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM}) + public void testPageZoomPreference_visibleWhenEnabled() { + getPageZoomPref(); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures(ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM) + @DisableFeatures(ContentFeatureList.SMART_ZOOM) + public void testPageZoomPreference_smartZoom_hiddenWhenDisabled() { + getPageZoomPref(); + ViewUtils.waitForViewCheckingState( + withId(R.id.text_size_contrast_title), ViewUtils.VIEW_GONE); + ViewUtils.waitForViewCheckingState( + withId(R.id.text_size_contrast_summary), ViewUtils.VIEW_GONE); + ViewUtils.waitForViewCheckingState( + withId(R.id.text_size_contrast_current_value_text), ViewUtils.VIEW_GONE); + ViewUtils.waitForViewCheckingState( + withId(R.id.text_size_contrast_decrease_zoom_button), ViewUtils.VIEW_GONE); + ViewUtils.waitForViewCheckingState( + withId(R.id.text_size_contrast_slider), ViewUtils.VIEW_GONE); + ViewUtils.waitForViewCheckingState( + withId(R.id.text_size_contrast_increase_zoom_button), ViewUtils.VIEW_GONE); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) + public void testPageZoomPreference_smartZoom_visibleWhenEnabled() { + getPageZoomPref(); + ViewUtils.waitForViewCheckingState( + withId(R.id.text_size_contrast_title), ViewUtils.VIEW_VISIBLE); + ViewUtils.waitForViewCheckingState( + withId(R.id.text_size_contrast_summary), ViewUtils.VIEW_VISIBLE); + ViewUtils.waitForViewCheckingState( + withId(R.id.text_size_contrast_current_value_text), ViewUtils.VIEW_VISIBLE); + ViewUtils.waitForViewCheckingState( + withId(R.id.text_size_contrast_decrease_zoom_button), ViewUtils.VIEW_VISIBLE); + ViewUtils.waitForViewCheckingState( + withId(R.id.text_size_contrast_slider), ViewUtils.VIEW_VISIBLE); + ViewUtils.waitForViewCheckingState( + withId(R.id.text_size_contrast_increase_zoom_button), ViewUtils.VIEW_VISIBLE); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures(ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM) + @DisableFeatures(ContentFeatureList.SMART_ZOOM) + public void testPageZoomPreference_decreaseButtonUpdatesValue() { + getPageZoomPref(); + + int startingVal = mPageZoomPref.getZoomSliderForTesting().getProgress(); + onView(withId(R.id.page_zoom_decrease_zoom_button)).perform(click()); + Assert.assertTrue(startingVal > mPageZoomPref.getZoomSliderForTesting().getProgress()); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures(ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM) + @DisableFeatures(ContentFeatureList.SMART_ZOOM) + public void testPageZoomPreference_decreaseButtonProperlyDisabled() { + getPageZoomPref(); + TestThreadUtils.runOnUiThreadBlocking(() -> { mPageZoomPref.setZoomValueForTesting(0); }); + onView(withId(R.id.page_zoom_decrease_zoom_button)).check(matches(sDisabled)); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures(ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM) + @DisableFeatures(ContentFeatureList.SMART_ZOOM) + public void testPageZoomPreference_increaseButtonUpdatesValue() { + getPageZoomPref(); + + int startingVal = mPageZoomPref.getZoomSliderForTesting().getProgress(); + onView(withId(R.id.page_zoom_increase_zoom_button)).perform(click()); + Assert.assertTrue(startingVal < mPageZoomPref.getZoomSliderForTesting().getProgress()); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures(ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM) + @DisableFeatures(ContentFeatureList.SMART_ZOOM) + public void testPageZoomPreference_increaseButtonProperlyDisabled() { + getPageZoomPref(); + TestThreadUtils.runOnUiThreadBlocking(() -> { + mPageZoomPref.setZoomValueForTesting(PageZoomUtils.PAGE_ZOOM_MAXIMUM_SEEKBAR_VALUE); + }); + onView(withId(R.id.page_zoom_increase_zoom_button)).check(matches(sDisabled)); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) + public void testPageZoomPreference_zoomSliderUpdatesValue() { + getPageZoomPref(); + int startingVal = mPageZoomPref.getZoomSliderForTesting().getProgress(); + onView(withId(R.id.page_zoom_slider)).perform(ViewActions.swipeRight()); + Assert.assertNotEquals(startingVal, mPageZoomPref.getZoomSliderForTesting().getProgress()); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) + public void testPageZoomPreference_smartZoom_decreaseButtonUpdatesValue() { + getPageZoomPref(); + + TestThreadUtils.runOnUiThreadBlocking( + () -> { mPageZoomPref.setTextContrastValueForTesting(20); }); + int startingVal = mPageZoomPref.getTextSizeContrastSliderForTesting().getProgress(); + onView(withId(R.id.text_size_contrast_decrease_zoom_button)).perform(click()); + Assert.assertTrue( + startingVal > mPageZoomPref.getTextSizeContrastSliderForTesting().getProgress()); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) + public void testPageZoomPreference_smartZoom_decreaseButtonProperlyDisabled() { + getPageZoomPref(); + TestThreadUtils.runOnUiThreadBlocking( + () -> { mPageZoomPref.setTextContrastValueForTesting(0); }); + onView(withId(R.id.text_size_contrast_decrease_zoom_button)).check(matches(sDisabled)); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) + public void testPageZoomPreference_smartZoom_increaseButtonUpdatesValue() { + getPageZoomPref(); + + int startingVal = mPageZoomPref.getTextSizeContrastSliderForTesting().getProgress(); + onView(withId(R.id.text_size_contrast_increase_zoom_button)).perform(click()); + Assert.assertTrue( + startingVal < mPageZoomPref.getTextSizeContrastSliderForTesting().getProgress()); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) + public void testPageZoomPreference_smartZoom_increaseButtonProperlyDisabled() { + getPageZoomPref(); + TestThreadUtils.runOnUiThreadBlocking(() -> { + mPageZoomPref.setTextContrastValueForTesting( + PageZoomUtils.TEXT_SIZE_CONTRAST_MAX_LEVEL); + }); + onView(withId(R.id.text_size_contrast_increase_zoom_button)).check(matches(sDisabled)); + } + + @Test + @SmallTest + @Feature({"Accessibility"}) + @EnableFeatures({ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM, ContentFeatureList.SMART_ZOOM}) + public void testPageZoomPreference_smartZoom_zoomSliderUpdatesValue() { + getPageZoomPref(); + int startingVal = mPageZoomPref.getTextSizeContrastSliderForTesting().getProgress(); + onView(withId(R.id.text_size_contrast_slider)).perform(ViewActions.swipeRight()); + Assert.assertNotEquals( + startingVal, mPageZoomPref.getTextSizeContrastSliderForTesting().getProgress()); + } + + private static final BaseMatcher<View> sDisabled = new BaseMatcher<View>() { + @Override + public boolean matches(Object o) { + return !((ChromeImageButton) o).isEnabled(); + } + + @Override + public void describeTo(Description description) { + description.appendText("View was enabled, but should have been disabled."); + } + }; + + private void getPageZoomPref() { + mPageZoomPref = (PageZoomPreference) mAccessibilitySettings.findPreference( + AccessibilitySettings.PREF_PAGE_ZOOM_DEFAULT_ZOOM); + Assert.assertNotNull(mPageZoomPref); + Assert.assertTrue( + "Page Zoom pref should be visible when enabled.", mPageZoomPref.isVisible()); + } + private void assertFontSizePrefs( final boolean expectedForceEnableZoom, final float expectedFontScale) { TestThreadUtils.runOnUiThreadBlocking(() -> {
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp index d2d9742..bf1ed35 100644 --- a/chrome/app/os_settings_strings.grdp +++ b/chrome/app/os_settings_strings.grdp
@@ -6104,6 +6104,15 @@ <message name="IDS_OS_SETTINGS_HW_DATA_USAGE_TOGGLE_DESC" desc="The description of the checkbox to enable/disable device hardware data collection and usage in ChromeOS Flex."> Let Google use your hardware data to help improve <ph name="DEVICE_OS">$1<ex>ChromeOS Flex</ex></ph>. If you decline, this data is still sent to Google to determine proper updates, but is not stored or used otherwise. </message> + <message name="IDS_OS_SETTINGS_PRIVACY_HUB_WEBSITES_SECTION_TITLE" translateable="false" desc="The title of the Websites section of the privacy hub sensor subpages."> + Websites + </message> + <message name="IDS_OS_SETTINGS_PRIVACY_HUB_MANAGE_MIC_PERMISSIONS_IN_CHROME_TEXT" translateable="false" desc="The label of the Chrome row in the Websites section of the microphone subpage. This row is displayed when microphone is allowed."> + Manage site microphone permissions in Chrome + </message> + <message name="IDS_OS_SETTINGS_PRIVACY_HUB_NO_WEBSITE_CAN_USE_MIC_TEXT" translateable="false" desc="The text displayed in the Websites section of the microphone subpage when microphone is not allowed."> + No website is allowed to use your microphone + </message> <!-- On Startup (OS settings) -->
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb index b37928b..6ba3d3a9 100644 --- a/chrome/app/resources/chromium_strings_hi.xtb +++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -21,6 +21,7 @@ <translation id="1478370723027452770">Chrome for Testing से जुड़ी सहायता पाएं</translation> <translation id="1524282610922162960">क्रोमियम का टैब शेयर करें</translation> <translation id="1553461853655228091">क्रोमियम को आपके आस-पास की जगह का 3D मैप बनाने के लिए, कैमरा ऐक्सेस करने की अनुमति चाहिए</translation> +<translation id="1574377791422810894">Chromium के सुरक्षा टूल</translation> <translation id="1607715478322902680">{COUNT,plural, =0{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए क्रोमियम को फिर से लॉन्च करें}=1{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए क्रोमियम को फिर से लॉन्च करें. आपकी गुप्त विंडो फिर से नहीं खुलेगी.}one{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए क्रोमियम को फिर से लॉन्च करें. आपकी # गुप्त विंडो फिर से नहीं खुलेंगी.}other{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए क्रोमियम को फिर से लॉन्च करें. आपकी # गुप्त विंडो फिर से नहीं खुलेंगी.}}</translation> <translation id="1625909126243026060">Chromium के निजता और सुरक्षा से जुड़े मुख्य कंट्रोल देखें</translation> <translation id="1632539827495546968">अगर आपको इस खाते का इस्तेमाल सिर्फ़ एक बार करना है, तो Chromium ब्राउज़र में <ph name="GUEST_LINK_BEGIN" />मेहमान मोड<ph name="GUEST_LINK_END" /> का इस्तेमाल किया जा सकता है. अगर आपको किसी अन्य व्यक्ति के लिए कोई खाता जोड़ना है, तो अपने <ph name="DEVICE_TYPE" /> में <ph name="LINK_BEGIN" />एक नया व्यक्ति जोड़ें<ph name="LINK_END" />. @@ -55,6 +56,7 @@ <translation id="2185166961232948079">क्रोमियम - नेटवर्क में साइन इन करें - <ph name="PAGE_TITLE" /></translation> <translation id="2241627712206172106">अगर आप किसी कंप्यूटर को शेयर करते हैं, तो दोस्त और परिवार अलग-अलग ब्राउज़ कर सकते हैं और क्रोमियम को जैसा चाहें सेट कर सकते हैं.</translation> <translation id="2313870531055795960">Chromium में पहले से सेव असुरक्षित साइटों की सूची का इस्तेमाल करके, यूआरएल की जांच करता है. अगर कोई साइट आपका पासवर्ड चुराने की कोशिश करती है या नुकसान पहुंचाने वाली कोई फ़ाइल डाउनलोड होने पर Chromium, सुरक्षित ब्राउज़िंग की सेवा को उनका यूआरएल भेजता है. यूआरएल के साथ-साथ पेज का कुछ कॉन्टेंट भी भेजा जाता है.</translation> +<translation id="2329088755516916767">इस सेटिंग के चालू होने पर Chromium, पेजों को पहले से लोड कर देता है. इससे, पेजों को ज़्यादा तेज़ी से खोजा और ब्राउज़ किया जा सकता है.</translation> <translation id="2343156876103232566">यहां से अपने Android फ़ोन पर नंबर भेजने के लिए, दोनों डिवाइस पर क्रोमियम में साइन इन करें.</translation> <translation id="2347108572062610441">इस एक्सटेंशन ने यह बदल दिया है कि जब आप क्रोमियम प्रारंभ करते हैं तब कौन सा पृष्ठ दिखाया जाए.</translation> <translation id="2359808026110333948">जारी रखें</translation> @@ -62,6 +64,7 @@ <translation id="2396765026452590966">एक्सटेंशन "<ph name="EXTENSION_NAME" />" ने यह बदल दिया है कि जब आप क्रोमियम प्रारंभ करते हैं तब कौन सा पृष्ठ दिखाया जाए.</translation> <translation id="2398377054246527950">{NUM_DEVICES,plural, =0{एक या उससे ज़्यादा Chromium एक्सटेंशन, 1 एचआईडी डिवाइस को ऐक्सेस कर रहे थे}=1{एक या उससे ज़्यादा Chromium एक्सटेंशन, 1 एचआईडी डिवाइस को ऐक्सेस कर रहे हैं}one{एक या उससे ज़्यादा Chromium एक्सटेंशन, # एचआईडी डिवाइस को ऐक्सेस कर रहे हैं}other{एक या उससे ज़्यादा Chromium एक्सटेंशन, # एचआईडी डिवाइसों को ऐक्सेस कर रहे हैं}}</translation> <translation id="2401032172288869980">Chromium को इस साइट के लिए, माइक्रोफ़ोन और कैमरा ऐक्सेस करने की अनुमति चाहिए</translation> +<translation id="2440750600860946460"><ph name="BEGIN_LINK" />Chromium के टूल<ph name="END_LINK" /> की मदद से, सुरक्षित तरीके से ब्राउज़िंग की जा सकती है. साथ ही, अपना डेटा भी कंट्रोल किया जा सकता है</translation> <translation id="2451727308784734061">Password Manager को फटाफट ऐक्सेस करने के लिए, शॉर्टकट का इस्तेमाल करें. आपके पास, अपने शॉर्टकट को कंप्यूटर की होम स्क्रीन पर या ऐप्लिकेशन लॉन्चर पर ले जाने का विकल्प है.</translation> <translation id="2478295928299953161">Chromium जल्द ही बंद हो जाएगा</translation> <translation id="2483889755041906834">क्रोमियम में</translation> @@ -129,6 +132,7 @@ <translation id="3713809861844741608">नए क्रोमियम &टैब में लिंक खोलें</translation> <translation id="378917192836375108">'क्रोमियम' आपको वेब पर फ़ोन नंबर क्लिक करने और उसके ज़रिए Skype से कॉल करने की सुविधा देता है!</translation> <translation id="3790262771324122253">जानें कि Chromium कुछ फ़ाइलों को डाउनलोड होने से क्यों रोकता है</translation> +<translation id="379589255253486813">कोई कार्रवाई ज़रूरी होने पर Chromium आपको इसकी सूचना देगा</translation> <translation id="3802055581630249637">Chromium उन पेजों को पहले से लोड कर देता है जिन पर आपके जाने की संभावना हो. ऐसा इसलिए है, ताकि जब आप उन पर जाएं, तो वे ज़्यादा तेज़ी से लोड हों</translation> <translation id="3830894615770080216">ChromiumOS सिस्टम</translation> <translation id="3848258323044014972"><ph name="PAGE_TITLE" /> - क्रोमियम</translation> @@ -142,6 +146,7 @@ <translation id="391789666908693569">आपके खाते को <ph name="MANAGER_NAME" /> मैनेज करता है. आपका एडमिन, इस Chromium ब्राउज़र पर प्रोफ़ाइल और उसके डेटा, जैसे कि बुकमार्क, इतिहास, और पासवर्ड को देख सकता है और उसमें बदलाव कर सकता है.</translation> <translation id="3945058413678539331">क्रोमियम, पासवर्ड कॉपी करने की कोशिश कर रहा है. इसकी अनुमति देने के लिए Windows का पासवर्ड डालें.</translation> <translation id="3962623956404948996">Chromium इस फ़ाइल को स्कैन करने का सुझाव देता है, क्योंकि यह खतरनाक हो सकती है</translation> +<translation id="3962647064319009959">जानें कि Chromium आपको इंटरनेट पर कैसे सुरक्षित रखता है</translation> <translation id="3975724895399328945">&Google Chrome for Testing के बारे में जानकारी</translation> <translation id="3997429360543082038">ChromiumOS के बारे में जानकारी</translation> <translation id="4019629340646866719"><ph name="BEGIN_LINK_LINUX_OSS" />Linux डेवलपमेंट एनवायरमेंट<ph name="END_LINK_LINUX_OSS" /> की तरह, ChromiumOS को भी अतिरिक्त <ph name="BEGIN_LINK_CROS_OSS" />ओपन सोर्स सॉफ़्टवेयर<ph name="END_LINK_CROS_OSS" /> की मदद से बनाया गया है.</translation> @@ -149,6 +154,7 @@ <translation id="4050175100176540509">महत्वपूर्ण सुरक्षा सुधार और नई सुविधाएं नवीनतम वर्शन में उपलब्ध हैं.</translation> <translation id="4055805654398742145">Password Manager</translation> <translation id="4095980151185649725">{COUNT,plural, =1{Chromium का 1 मिनट तक इस्तेमाल न करने पर, आपका संगठन इसे अपने-आप बंद कर देता है. ब्राउज़िंग डेटा मिटा दिया जाता है. इसमें, ब्राउज़िंग का इतिहास, ऑटोमैटिक भरी जाने वाली जानकारी, और डाउनलोड की गई फ़ाइलें शामिल हो सकती हैं.}one{Chromium का # मिनट तक इस्तेमाल न करने पर, आपका संगठन इसे अपने-आप बंद कर देता है. ब्राउज़िंग डेटा मिटा दिया जाता है. इसमें, ब्राउज़िंग का इतिहास, ऑटोमैटिक भरी जाने वाली जानकारी, और डाउनलोड की गई फ़ाइलें शामिल हो सकती हैं.}other{Chromium का # मिनट तक इस्तेमाल न करने पर, आपका संगठन इसे अपने-आप बंद कर देता है. ब्राउज़िंग डेटा मिटा दिया जाता है. इसमें, ब्राउज़िंग का इतिहास, ऑटोमैटिक भरी जाने वाली जानकारी, और डाउनलोड की गई फ़ाइलें शामिल हो सकती हैं.}}</translation> +<translation id="4118474109249235144">Chromium का गुप्त मोड</translation> <translation id="4148957013307229264">इंस्टॉल हो रहा है...</translation> <translation id="419998258129752635"><ph name="PAGE_TITLE" /> - नेटवर्क में साइन इन करें - क्रोमियम</translation> <translation id="421369550622382712">क्रोमियम के लिए शानदार ऐप्स, गेम, एक्सटेंशन और थीम खोजें.</translation> @@ -195,6 +201,7 @@ <translation id="5252179775517634216"><ph name="EXISTING_USER" /> इस Chromium प्रोफ़ाइल में पहले से साइन इन हैं. इससे <ph name="USER_EMAIL_ADDRESS" /> के लिए एक नई Chromium प्रोफ़ाइल बन जाएगी</translation> <translation id="5277894862589591112">अपने बदलाव लागू करने के लिए, क्रोमियम को फिर से लॉन्च करें</translation> <translation id="5296845517486664001">ट्रायल के दौरान, अगर Chromium ने आपको किसी मौजूदा ट्रायल में अपने-आप शामिल कर लिया है, तो आपके ब्राउज़िंग इतिहास से इस बात पर असर पड़ता है कि आपको कौनसे विज्ञापन दिखेंगे. साथ ही, यहां दिए गए आपकी पसंद के विषयों के अनुमान पर भी इसका असर पड़ता है. आपकी निजता को सुरक्षित रखने के लिए, Chromium हर महीने आपकी पसंद के विषयों को मिटा देता है.</translation> +<translation id="5352264705793813212">Chromium का सुझाव है कि आपको बेहतर सुरक्षा पाने के लिए कुछ कार्रवाई करनी चाहिए</translation> <translation id="5358375970380395591">आप प्रबंधित खाते से साइन इन कर रहे हैं और उसके एडमिन को अपनी क्रोमियम प्रोफ़ाइल पर नियंत्रण दे रहे हैं. आपका क्रोमियम डेटा, जैसे आपके ऐप्लिकेशन, बुकमार्क, इतिहास, पासवर्ड, और दूसरे सेटिंग स्थायी रूप से <ph name="USER_NAME" /> से जुड़ जाएंगे. आप Google खाता डैशबोर्ड के ज़रिए इस डेटा को मिटा सकेंगे, लेकिन आप किसी अन्य खाते से इस डेटा को जोड़ नहीं सकेंगे. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">क्रोमियम अपडेट हो रहा है (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="538767207339317086">क्रोमियम में साइन-इन करने दें</translation> @@ -364,6 +371,7 @@ <translation id="8213374284266571500">Chromium ने इस फ़ाइल को ब्लॉक कर दिया है, क्योंकि इस तरह की फ़ाइल खतरनाक हो सकती है</translation> <translation id="8248265253516264921">अगर किसी इमेज के बारे में मददगार जानकारी मौजूद नहीं है, तो 'क्रोमियम' उसके बारे में जानकारी देने की कोशिश करेगा. जानकारी तैयार करने के लिए, इमेज Google को भेजी जाती हैं. आप किसी भी समय सेटिंग में जाकर इसे बंद कर सकते हैं.</translation> <translation id="8266560134891435528">क्रोमियम आपके पासवर्ड की जांच नहीं कर सकता, क्योंकि आपने साइन इन नहीं किया है</translation> +<translation id="8286943863733751221">असुरक्षित साइटों और डाउनलोड की गई फ़ाइलों के बारे में, <ph name="BEGIN_LINK" />Chromium आपको चेतावनी देता है<ph name="END_LINK" /></translation> <translation id="8290862415967981663">यह फ़ाइल खतरनाक हो सकती है, इसलिए क्रोमियम ने इसे ब्लॉक कर दिया है.</translation> <translation id="8318772038038596122"><ph name="TIMEOUT_DURATION" /> तक Chromium का इस्तेमाल न करने पर, आपका संगठन इसे बंद कर देता है.</translation> <translation id="8325404639443959713">Chromium के साथ और भी बहुत कुछ करें</translation> @@ -378,6 +386,7 @@ <translation id="8458614432758743027">Chromium के लिए, आपके डिवाइस में Windows 10 या उसके बाद का वर्शन होना चाहिए.</translation> <translation id="8463672209299734063">आप चाहें, तो ChromiumOS को यह अनुमति दें कि वह गड़बड़ी की जानकारी और इस्तेमाल से जुड़ा डेटा Google को अपने-आप भेज सके. आपके ऐसा करने से, ChromiumOS की सुविधाओं और परफ़ॉर्मेंस को बेहतर बनाने में मदद मिलेगी.</translation> <translation id="8493179195440786826">क्रोमियम पुराना हो गया है</translation> +<translation id="8522801943730206384">पासवर्ड सेव करने पर ही, Chromium आपके पासवर्ड की जांच कर सकता है</translation> <translation id="8550334526674375523">यह वर्क प्रोफ़ाइल आपकी निजी प्रोफ़ाइल से पूरी तरह अलग है.</translation> <translation id="8568283329061645092">आप जब अपने Google खाते से साइन इन करते हैं, तब क्रोमियम आपके पासवर्ड की जांच कर सकता है</translation> <translation id="8586442755830160949">कॉपीराइट <ph name="YEAR" /> The Chromium Authors. सर्वाधिकार सुरक्षित.</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index e3aa957..1270ae3 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Rollees na die eerste oortjie</translation> <translation id="1410806973194718079">Kan nie beleide nagaan nie</translation> <translation id="1411400282355634827">Stel alle Bluetooth-toesteltoestemmings terug?</translation> -<translation id="1411724932979011919">Jou inskrywing se formaat moet LPA:1$<smdp address>$<activation code> wees</translation> <translation id="1414315029670184034">Moenie werwe toelaat om jou kamera te gebruik nie</translation> <translation id="1414648216875402825">Jy dateer tans na 'n onstabiele weergawe van <ph name="PRODUCT_NAME" /> op wat kenmerke bevat wat tans besig is. Omvalle en onverwagte lêerfoute sal opduik. Gaan met omsigtigheid voort.</translation> <translation id="1415708812149920388">Knipbord-leestoegang is geweier</translation> @@ -1249,7 +1248,6 @@ <translation id="1972313920920745320">Werwe wat jy byvoeg, sal altyd aktief bly en geheue sal nie van hulle af beskikbaar gemaak word nie. <ph name="BEGIN_LINK" />Kom meer te wete oor hoe om spesifieke werwe aktief te hou<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Jy sal vinniger kan blaai omdat inhoud proaktief op grond van jou huidige webbladsybesoek gelaai word</translation> <translation id="197288927597451399">Behou</translation> -<translation id="1973313062201924554">Toestemmings wat jy vir <ph name="APP_NAME" /> toelaat, sal ook vir hierdie app toegelaat word.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> kan nie veilig afgelaai word nie. Druk Shift+F6 om na die aflaaibalk te gaan.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL-verspreidingspunte</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">Toestelspasie is gevaarlik min</translation> <translation id="4100853287411968461">Nuwe skermtydlimiet</translation> <translation id="4101352914005291489">Versteekte SSID</translation> -<translation id="4102469565336584882">Ongeldige kode. Jou inskrywing se formaat moet LPA:1$<smdp address>$<activation code> wees</translation> <translation id="4102906002417106771">Herbegin om Powerwash uit te voer</translation> <translation id="4104163789986725820">Voer uit …</translation> <translation id="4104944259562794668">Jy kan dit later aktiveer in Instellings > Sekuriteit en privaatheid > Sluitskerm en aanmelding</translation> @@ -7101,7 +7098,6 @@ <translation id="6757431299485455321">Help ander toestelle om hierdie warmkol te kry.</translation> <translation id="6758056191028427665">Sê vir ons hoe ons vaar.</translation> <translation id="6759193508432371551">Fabriekterugstelling</translation> -<translation id="6761431452438552910">Maak seker dat jou Bluetooth-toestel in saambindmodus en naby is. Bind net saam met toestelle wat jy vertrou.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Aan</translation> <translation id="676560328519657314">Jou betaalmetodes in Google Pay</translation> @@ -7395,7 +7391,6 @@ <translation id="6979737339423435258">Van die begin af</translation> <translation id="6980402667292348590">voeg in</translation> <translation id="6981553172137913845">Klik die kolle-ikoonkieslys om 'n Incognito-venster oop te maak as jy privaat wil blaai</translation> -<translation id="6981761993313539853">Maak seker dat jou Bluetooth-toestel in saambindmodus en naby is. Bind net saam met toestelle wat jy vertrou. <ph name="BEGIN_LINK_LEARN_MORE" />Kom meer te wete<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Toeganklikheid</translation> <translation id="6983507711977005608">Ontkoppel kitsverbindingnetwerk</translation> <translation id="6983783921975806247">Geregistreerde OID</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 1acbc8d..3b980a905 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -509,7 +509,6 @@ <translation id="1410797069449661718">ወደ የመጀመሪያው ትር ይሸብልሉ</translation> <translation id="1410806973194718079">መመሪያችን መፈተሽ አልተቻለም</translation> <translation id="1411400282355634827">ሁሉም የብሉቱዝ መሣሪያ ፈቃዶች እንደገና ይጀምሩ?</translation> -<translation id="1411724932979011919">የእርስዎ ግቤት የLPA:1$<smdp address>$<activation code> ቅርጸት ሊኖረው ይገባል።</translation> <translation id="1414315029670184034">ጣቢያዎች ካሜራዎን እንዲጠቀሙ አይፍቀዱ</translation> <translation id="1414648216875402825">በሂደት ላይ ያሉ ባህሪያትን የያዘ ያልተረጋጋ ወደሆነ የ<ph name="PRODUCT_NAME" /> ስሪት እያዘመኑ ነው። ብልሽቶች እና ያልተጠበቁ ሳንካዎች ያጋጥማሉ። እባክዎ በጥንቃቄ ይቀጥሉ።</translation> <translation id="1415708812149920388">የቅንጥብ ሰሌዳ መዳረሻ ተከልክሏል</translation> @@ -1245,7 +1244,6 @@ <translation id="1972313920920745320">የሚያክሏቸው ጣቢያዎች ሁልጊዜ ገቢር ሆነው ይቆያሉ እና ማህደረ ትውስታ ከእነሱ ላይ አይቀነስም። <ph name="BEGIN_LINK" />የተወሰኑ ገፆችን ገቢር አድርጎ ስለማቆየት የበለጠ ይወቁ<ph name="END_LINK" /></translation> <translation id="1972325230031091483">አሁን ባለው የድረ-ገፅ ጉብኝትዎ ላይ በመመስረት ይዘቱ በንቃት ስለተጫነ በፍጥነት ያስሱታል</translation> <translation id="197288927597451399">አስቀምጥ</translation> -<translation id="1973313062201924554">ለ<ph name="APP_NAME" /> የሚፈቅዷቸው ፈቃዶች እንዲሁም ለዚህ መተግበሪያ ይፈቀዳሉ።</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> ደህንነቱ በተጠበቀ ሁኔታ ሊወርድ አይችልም። የውርዶች አሞሌ አካባቢውን ለመቀየር Shift+F6 ይጫኑ።</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL የማሰራጫ ነጥቦች</translation> @@ -3935,7 +3933,6 @@ <translation id="4100733287846229632">የመሣሪያው ቦታ እጅግ በጣም ዝቅተኛ ነው</translation> <translation id="4100853287411968461">አዲስ የማያ ገፅ ጊዜ ገደብ</translation> <translation id="4101352914005291489">የተደበቀ SSID</translation> -<translation id="4102469565336584882">ልክ ያልሆነ ኮድ። የእርስዎ ግቤት የLPA:1$<smdp address>$<activation code> ቅርጸት ሊኖረው ይገባል።</translation> <translation id="4102906002417106771">powerwash ለማድረግ እንደገና ያስጀምሩ</translation> <translation id="4104163789986725820">ወደ &ውጪ ላክ...</translation> <translation id="4104944259562794668">በቅንብሮች > ደኅንነት እና ግላዊነት > ማያ ገፅ ቁልፍ እና መግቢያ ውስጥ በኋላ ሊያነቁት ይችላሉ</translation> @@ -7093,7 +7090,6 @@ <translation id="6757431299485455321">ሌሎች መሣሪያዎች ይህን መገናኛ ነጥብ እንዲያገኙ ያግዟቸው</translation> <translation id="6758056191028427665">እንዴት እኛ እያደርግን እንደሆነ እንድናውቅ ያድርጉን።</translation> <translation id="6759193508432371551">የፋብሪካ ዳግም ማስጀመር</translation> -<translation id="6761431452438552910">የብሉቱዝ መሣሪያዎ በማጣመር ሁነታ ላይ እና በአቅራቢያ መሆኑን ያረጋግጡ። ከሚያምኗቸው መሣሪያዎች ጋር ብቻ ያጣምሩ።</translation> <translation id="676158322851696513">«<ph name="EXTENSION_NAME" />»</translation> <translation id="6762833852331690540">አብራ</translation> <translation id="676560328519657314">የእርስዎ የመክፈያ ዘዴ በGoogle Pay ዉስጥ</translation> @@ -7387,7 +7383,6 @@ <translation id="6979737339423435258">የምንጊዜም</translation> <translation id="6980402667292348590">አስገባ</translation> <translation id="6981553172137913845">በግል ለማሰስ የነጥቦች አዶ ምናሌውን ጠቅ አድርገው ማንነት የማያሳውቅ መስኮትን ይክፈቱ</translation> -<translation id="6981761993313539853">የብሉቱዝ መሣሪያዎ በማጣመር ሁነታ ላይ እና በአቅራቢያ መሆኑን ያረጋግጡ። ከሚያምኗቸው መሣሪያዎች ጋር ብቻ ያጣምሩ። <ph name="BEGIN_LINK_LEARN_MORE" />የበለጠ ለመረዳት<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ተደራሽነት</translation> <translation id="6983507711977005608">ቅጽበታዊ የእንደ ሞደም መሰካትን አውታረ መረብ ግንኙነትን አቋርጥ</translation> <translation id="6983783921975806247">የተመዘገበ OID</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index b0d62454..44c32824 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -512,7 +512,6 @@ <translation id="1410797069449661718">الانتقال إلى علامة التبويب الأولى</translation> <translation id="1410806973194718079">يتعذّر التحقّق من السياسات.</translation> <translation id="1411400282355634827">هل تريد إعادة ضبط جميع أذونات الأجهزة التي تتضمّن بلوتوث؟</translation> -<translation id="1411724932979011919">يجب أن يكون الإدخال بتنسيق LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">عدم السماح للمواقع الإلكترونية باستخدام الكاميرا</translation> <translation id="1414648216875402825">إنك تُجري تحديثًا لإصدار غير ثابت من <ph name="PRODUCT_NAME" /> والذي يشتمل على ميزات قيد التقدم. لذا قد تحدث أعطال وأخطاء غير متوقعة. يُرجى المتابعة مع توخّي الحذر.</translation> <translation id="1415708812149920388">تم رفض الإذن بالاطّلاع على الحافظة</translation> @@ -1240,7 +1239,6 @@ <translation id="1972313920920745320">ستظل المواقع الإلكترونية التي تضيفها نشطة دائمًا ولن يتم إخلاء المساحة التي تشغلها في الذاكرة. <ph name="BEGIN_LINK" />مزيد من المعلومات حول إبقاء مواقع إلكترونية معيَّنة نشطة<ph name="END_LINK" /></translation> <translation id="1972325230031091483">ستتمكّن من التصفُّح بشكلٍ أسرع لأنه يتم تحميل المحتوى مسبقًا استنادًا إلى زيارتك الحالية لصفحة الويب.</translation> <translation id="197288927597451399">مواصلة</translation> -<translation id="1973313062201924554">إنّ الأذونات التي تسمح بها لـ <ph name="APP_NAME" /> سيتم منحها أيضًا لهذا التطبيق.</translation> <translation id="1973763416111613016">لا يمكن تنزيل <ph name="FILE_NAME" /> بشكل آمن. اضغط على Shift+F6 للانتقال إلى منطقة شريط عمليات التنزيل.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">نقاط توزيع CRL (قائمة إبطال الشهادات)</translation> @@ -3930,7 +3928,6 @@ <translation id="4100733287846229632">المساحة على الجهاز منخفضة للغاية</translation> <translation id="4100853287411968461">حد جديد لوقت النظر إلى الشاشة</translation> <translation id="4101352914005291489">معرّف SSID المخفي</translation> -<translation id="4102469565336584882">الرمز غير صالح. يجب أن يكون الإدخال بتنسيق LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">إعادة التشغيل لإجراء عملية powerwash</translation> <translation id="4104163789986725820">ت&صدير...</translation> <translation id="4104944259562794668">يمكنك تفعيل هذه الميزة لاحقًا من الإعدادات > الأمان والخصوصية > شاشة القفل وتسجيل الدخول.</translation> @@ -7094,7 +7091,6 @@ <translation id="6757431299485455321">مساعدة الأجهزة الأخرى في العثور على نقطة الاتصال هذه</translation> <translation id="6758056191028427665">يُرجى تقييم أدائنا.</translation> <translation id="6759193508432371551">إعادة الضبط على الإعدادات الأصلية</translation> -<translation id="6761431452438552910">يُرجى التأكّد من أنّ جهازك الذي يتضمّن بلوتوث في وضع الإقران وأنّه في مكان مجاور. ولا تقرِنه إلا بأجهزة تثق بها.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">مفعّل</translation> <translation id="676560328519657314">طُرق الدفع المُستخدَمة في Google Pay</translation> @@ -7388,7 +7384,6 @@ <translation id="6979737339423435258">جميع الأوقات</translation> <translation id="6980402667292348590">مفتاح Insert</translation> <translation id="6981553172137913845">للتصفُّح بخصوصية تامّة، انقر على القائمة المشار إليها برمز النقاط لفتح نافذة للتصفُّح المتخفي.</translation> -<translation id="6981761993313539853">يُرجى التأكّد من أنّ جهازك الذي يتضمّن بلوتوث في وضع الإقران وأنّه في مكان مجاور. ولا تقرِنه إلا بأجهزة تثق بها. <ph name="BEGIN_LINK_LEARN_MORE" />مزيد من المعلومات<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">تسهيل الاستخدام</translation> <translation id="6983507711977005608">قطع الاتصال بشبكة "التوصيل الفوري"</translation> <translation id="6983783921975806247">معرّف الكائنات (OID) المسجل</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 44eab02..dced68db 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">প্ৰথম টেবটোৰ ফালে স্ক্ৰ’ল কৰক</translation> <translation id="1410806973194718079">নীতি পৰীক্ষা কৰিব পৰা নগ’ল</translation> <translation id="1411400282355634827">ব্লুটুথ ডিভাইচৰ আটাইবোৰ অনুমতি ৰিছেট কৰিবনে?</translation> -<translation id="1411724932979011919">আপোনাৰ প্ৰৱিষ্টিটোত LPA:1$<smdp ঠিকনা>$<সক্ৰিয়কৰণৰ ক'ড> ফর্মেটটো থাকিব লাগে।</translation> <translation id="1414315029670184034">ছাইটক আপোনাৰ কেমেৰা ব্যৱহাৰ কৰাৰ অনুমতি নিদিব</translation> <translation id="1414648216875402825">আপুনি <ph name="PRODUCT_NAME" />ৰ বিকাশ সম্পূৰ্ণ নোহোৱা এটা সংস্কৰণ ব্যৱহাৰ কৰিবলৈ ওলাইছে যিটোৰ কিছুমান সুবিধাই এতিয়ালৈকে ভালকৈ কাম কৰা হোৱা নাই। ক্ৰেশ্ব হ'ব পাৰে আৰু অনাকাংক্ষিত বাগ ওলাব পাৰে। অনুগ্ৰহ কৰি সাৱধানে ব্যৱহাৰ কৰিব।</translation> <translation id="1415708812149920388">ক্লিপব'ৰ্ড পঢ়াৰ এক্সেছ অগ্রাহ্য কৰা হৈছে</translation> @@ -1247,7 +1246,6 @@ <translation id="1972313920920745320">আপুনি যোগ দিয়া ছাইটসমূহ সদায় সক্ৰিয় হৈ থাকিব আৰু সেইসমূহৰ পৰা মেম’ৰী খালী কৰা নহয়। <ph name="BEGIN_LINK" />কোনো নিৰ্দিষ্ট ছাইট সক্ৰিয় কৰি ৰখাৰ বিষয়ে অধিক জানক<ph name="END_LINK" /></translation> <translation id="1972325230031091483">আপোনাৰ বৰ্তমান চোৱা ৱেবপৃষ্ঠাখনৰ ভিত্তিত সমল আগতীয়াকৈ ল’ড কৰা হয় বাবে আপুনি দ্ৰুতভাৱে ব্ৰাউজ কৰিব পাৰিব</translation> <translation id="197288927597451399">Keep</translation> -<translation id="1973313062201924554">আপুনি <ph name="APP_NAME" />ক দিয়া অনুমতিসমূহ এই এপ্সমূহেও লাভ কৰিব।</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> সুৰক্ষিতভাৱে ডাউনল’ড কৰিব নোৱাৰি। ডাউনল’ড বাৰৰ ক্ষেত্ৰলৈ যাবলৈ শ্বিফ্ট+F6 টিপক।</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL বিতৰণৰ পইণ্ট</translation> @@ -3940,7 +3938,6 @@ <translation id="4100733287846229632">ডিভাইচত খালী ঠাই কম আছে</translation> <translation id="4100853287411968461">স্ক্ৰীনৰ নতুন সময়সীমা</translation> <translation id="4101352914005291489">লুকুৱাই ৰখা SSID</translation> -<translation id="4102469565336584882">অমান্য ক’ড। আপোনাৰ প্ৰৱিষ্টিটোত LPA:1$<smdp ঠিকনা>$<সক্ৰিয়কৰণৰ ক'ড> ফর্মেটটো থাকিব লাগে।</translation> <translation id="4102906002417106771">পাৱাৰৱাশ্ব কৰিবলৈ ৰিষ্টাৰ্ট কৰক</translation> <translation id="4104163789986725820">ৰ&প্তানি কৰক...</translation> <translation id="4104944259562794668">আপুনি পাছত ছেটিং > সুৰক্ষা আৰু গোপনীয়তা > লক স্ক্ৰীন আৰু ছাইন ইনত এইটো সক্ষম কৰিব পাৰে</translation> @@ -7099,7 +7096,6 @@ <translation id="6757431299485455321">অন্য ডিভাইচক এই হটস্পটটো বিচৰাত সহায় কৰক।</translation> <translation id="6758056191028427665">আমি কেনে প্ৰদৰ্শন কৰিছোঁ আমাক জনাওক৷</translation> <translation id="6759193508432371551">ফেক্টৰী ৰিছেট কৰক</translation> -<translation id="6761431452438552910">আপোনাৰ ব্লুটুথ ডিভাইচটো পেয়াৰ কৰা ম’ডত আৰু ওচৰত থকাটো নিশ্চিত কৰক। কেৱল আপুনি বিশ্বাস কৰা ডিভাইচৰ সৈতে পেয়াৰ কৰক।</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">অন আছে</translation> <translation id="676560328519657314">Google Payত আপোনাৰ পৰিশোধ পদ্ধতিসমূহ</translation> @@ -7393,7 +7389,6 @@ <translation id="6979737339423435258">সকলো সময়তে</translation> <translation id="6980402667292348590">ইনছাৰ্ট</translation> <translation id="6981553172137913845">ব্যক্তিগতভাৱে ব্ৰাউজ কৰিবলৈ বিন্দু চিহ্নৰ মেনুখনত ক্লিক কৰি এখন ইনক’গনিট’ ৱিণ্ড’ খোলক</translation> -<translation id="6981761993313539853">আপোনাৰ ব্লুটুথ ডিভাইচটো পেয়াৰ কৰা ম’ডত আৰু ওচৰত থকাটো নিশ্চিত কৰক। কেৱল আপুনি বিশ্বাস কৰা ডিভাইচৰ সৈতেহে পেয়াৰ কৰক। <ph name="BEGIN_LINK_LEARN_MORE" />অধিক জানক<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">সাধ্য সুবিধাসমূহ</translation> <translation id="6983507711977005608">তাৎক্ষণিক টেডাৰিং নেটৱৰ্কৰ সংযোগ বিচ্ছিন্ন কৰক</translation> <translation id="6983783921975806247">পঞ্জীভুক্ত অ’আইডি</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 810e14d..4c004f3 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">Birinci taba doğru sürüşdürün</translation> <translation id="1410806973194718079">Siyasətləri yoxlamaq olmur</translation> <translation id="1411400282355634827">Bluetooth cihazı icazələri sıfırlansın?</translation> -<translation id="1411724932979011919">Daxiletmə üçün LPA formatı:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Saytlara kameranızdan istifadə etmək icazəsi verməyin</translation> <translation id="1414648216875402825"><ph name="PRODUCT_NAME" /> məhsulunun inkişafda olan qeyri-stabil versiyasını güncəlləşdirirsiniz. Gözlənilməyən xətalar ola bilər. Diqqətli olun.</translation> <translation id="1415708812149920388">Buferdəki kontenti oxumaq üçün giriş rədd edildi</translation> @@ -1239,7 +1238,6 @@ <translation id="1972313920920745320">Əlavə etdiyiniz saytlar həmişə aktiv qalacaq və yaddaş boşaldılmayacaq. <ph name="BEGIN_LINK" />Xüsusi saytların aktiv saxlanması haqqında ətraflı<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Cari veb səhifə ziyarətinizə əsasən məzmun proaktiv şəkildə yükləndiyinə görə daha sürətli gözdən keçirəcəksiniz</translation> <translation id="197288927597451399">Saxlayın</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" /> tətbiqinin icazələri bu tətbiq üçün də keçərli olacaq.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> faylını təhlükəsiz şəkildə endirmək mümkün deyil. Endirmələr paneli sahəsinə keçmək üçün Shift+F6 üzərinə basın.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL Paylanma Nöqtələri</translation> @@ -3935,7 +3933,6 @@ <translation id="4100733287846229632">Cihaz yaddaşı çox azdır</translation> <translation id="4100853287411968461">Yeni ekran vaxtı limiti</translation> <translation id="4101352914005291489">Gizli SSID</translation> -<translation id="4102469565336584882">Yanlış kod. Daxiletmə üçün LPA formatı:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Powerwash üçün yenidən başladın</translation> <translation id="4104163789986725820">Eksport...</translation> <translation id="4104944259562794668">Sonra Ayarlar > Təhlükəsizlik və Məxfilik > Kilid ekranı və giriş bölməsində aktiv edə bilərsiniz</translation> @@ -7091,7 +7088,6 @@ <translation id="6757431299485455321">Digər cihazlara bu hotspotu tapmağa kömək edin.</translation> <translation id="6758056191028427665">Necə işlədiyimizi bizə bildirin.</translation> <translation id="6759193508432371551">Zavod Sıfırlaması</translation> -<translation id="6761431452438552910">Bluetooth cihazınızın birləşmə rejimində və yaxınlıqda olduğuna əmin olun. Yalnız etibar etdiyiniz cihazlarla birləşdirin.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Aktiv</translation> <translation id="676560328519657314">Google Pay'də ödəniş metodlarınız</translation> @@ -7385,7 +7381,6 @@ <translation id="6979737339423435258">Hər zaman</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Məxfi axtarış etmək üçün menyudakı nöqtələr işarəsinə toxunun və Anonim pəncərəni açın</translation> -<translation id="6981761993313539853">Bluetooth cihazınızın birləşmə rejimində və yaxınlıqda olduğuna əmin olun. Yalnız etibar etdiyiniz cihazlarla birləşdirin. <ph name="BEGIN_LINK_LEARN_MORE" />Ətraflı məlumat<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Giriş İmkanı</translation> <translation id="6983507711977005608">Cəld modem şəbəkəsini ayırın</translation> <translation id="6983783921975806247">Qeydiyyatdan keçmiş OID</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index baac2a9..3363da0 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">Прагартаць у бок першай укладкі</translation> <translation id="1410806973194718079">Не ўдаецца праверыць палітыкі</translation> <translation id="1411400282355634827">Скінуць усе дазволы прылады з Bluetooth?</translation> -<translation id="1411724932979011919">Запіс павінен мець фармат LPA:1$<адрас smdp>$<код актывацыі></translation> <translation id="1414315029670184034">Не дазваляць сайтам выкарыстоўваць камеру</translation> <translation id="1414648216875402825">Вы абнаўляеце <ph name="PRODUCT_NAME" /> да нестабільнай версіі з функцыямі, якія яшчэ ў распрацоўцы. Могуць адбывацца збоі і нечаканыя памылкі. Будзьце асцярожнымі.</translation> <translation id="1415708812149920388">Доступ да чытання буфера абмену забаронены</translation> @@ -1240,7 +1239,6 @@ <translation id="1972313920920745320">Дададзеныя сайты заўсёды будуць заставацца актыўнымі. Занятая імі памяць вызваляцца не будзе. <ph name="BEGIN_LINK" />Даведацца больш пра захаванне актыўнасці пэўных сайтаў<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Паскорыцца прагляд сайтаў, паколькі змесціва будзе загружацца без запыту на падставе даных з бягучай вэб-старонкі</translation> <translation id="197288927597451399">Пакінуць</translation> -<translation id="1973313062201924554">Дазволы, якія вы даяце праграме "<ph name="APP_NAME" />", таксама будуць дадзены гэтай праграме.</translation> <translation id="1973763416111613016">Бяспечна спампаваць файл "<ph name="FILE_NAME" />" нельга. Каб перамяшчацца па панэлі спамповак, націскайце Shift + F6.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Пункты распаўсюджвання CRL</translation> @@ -3927,7 +3925,6 @@ <translation id="4100733287846229632">Крытычна мала месца на прыладзе</translation> <translation id="4100853287411968461">Новы ліміт часу працы з прыладай</translation> <translation id="4101352914005291489">Схаваны ідэнтыфікатар SSID</translation> -<translation id="4102469565336584882">Няправільны код. Запіс павінен мець фармат LPA:1$<адрас smdp>$<код актывацыі></translation> <translation id="4102906002417106771">Перазапусціце, каб скінуць налады функцыяй Powerwash</translation> <translation id="4104163789986725820">Ідзе э&кспарт...</translation> <translation id="4104944259562794668">Уключыць гэту функцыю можна пазней у меню "Налады > Бяспека і прыватнасць > Экран блакіроўкі і ўваход"</translation> @@ -7089,7 +7086,6 @@ <translation id="6757431299485455321">Дапамагаць іншым прыладам знаходзіць гэты хот-спот.</translation> <translation id="6758056191028427665">Паведаміце нам, што вы думаеце пра наш прадукт.</translation> <translation id="6759193508432371551">Скід да заводскіх налад</translation> -<translation id="6761431452438552910">Упэўніцеся, што прылада з Bluetooth знаходзіцца паблізу і пераведзена ў рэжым спалучэння. Ажыццяўляйце спалучэнне толькі з надзейнымі прыладамі.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Уключана</translation> <translation id="676560328519657314">Вашы спосабы аплаты ў Google Pay</translation> @@ -7383,7 +7379,6 @@ <translation id="6979737339423435258">За ўвесь час</translation> <translation id="6980402667292348590">Insert</translation> <translation id="6981553172137913845">Для прыватнага прагляду вэб-старонак націсніце на значок меню з кропкамі і адкрыйце акно ў рэжыме інкогніта</translation> -<translation id="6981761993313539853">Упэўніцеся, што прылада з Bluetooth знаходзіцца паблізу і пераведзена ў рэжым спалучэння. Ажыццяўляйце спалучэнне толькі з надзейнымі прыладамі. <ph name="BEGIN_LINK_LEARN_MORE" />Даведацца больш<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Спец. магчымасці</translation> <translation id="6983507711977005608">Адключыцца ад сеткі, якая выкарыстоўваецца для Імгненнага рэжыму мадэма</translation> <translation id="6983783921975806247">Зарэгістраваны ідэнтыфікатар аб'екта</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 4df854c..c229de64 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Превъртане към първия раздел</translation> <translation id="1410806973194718079">Правилата не могат да се проверят</translation> <translation id="1411400282355634827">Да се нулират ли разрешенията за всички устройства с Bluetooth?</translation> -<translation id="1411724932979011919">Въведеното от вас трябва да е във формат LPA:1$<SM-DP адрес>$<код за активиране></translation> <translation id="1414315029670184034">Да не се разрешава на сайтовете да използват камерата ви</translation> <translation id="1414648216875402825">Актуализирате до нестабилна версия на <ph name="PRODUCT_NAME" />, съдържаща функции, по които се работи. Ще има сривове и неочаквани програмни дефекти. Моля, действайте внимателно.</translation> <translation id="1415708812149920388">Отказан е достъп за четене на съдържанието на буферната памет</translation> @@ -1245,7 +1244,6 @@ <translation id="1972313920920745320">Добавените от вас сайтове винаги ще остават активни и паметта, която използват, няма да се освобождава. <ph name="BEGIN_LINK" />Научете повече за поддържането на конкретни сайтове активни<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Ще сърфирате по-бързо, тъй като съдържанието се зарежда предварително въз основа на уеб страницата, на която се намирате в момента</translation> <translation id="197288927597451399">Запазване</translation> -<translation id="1973313062201924554">Разрешенията, които дадете на <ph name="APP_NAME" />, ще бъдат предоставени и на това приложение.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> не може да се изтегли по сигурен начин. Натиснете Shift + F6, за да преминете към лентата на изтеглянето.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Точки за разпространение на CRL</translation> @@ -3940,7 +3938,6 @@ <translation id="4100733287846229632">Мястото на устройството е критично малко</translation> <translation id="4100853287411968461">Ново ограничение за времето на ползване</translation> <translation id="4101352914005291489">Скрит SSID</translation> -<translation id="4102469565336584882">Невалиден код. Въведеното от вас трябва да е във формат LPA:1$<SM-DP адрес>$<код за активиране></translation> <translation id="4102906002417106771">Рестартиране за извършване на Powerwash</translation> <translation id="4104163789986725820">Екс&портиране...</translation> <translation id="4104944259562794668">Можете да активирате функцията по-късно от „Настройки > Сигурност и поверителност > Заключен екран и влизане в профила“</translation> @@ -7098,7 +7095,6 @@ <translation id="6757431299485455321">Помагане на други устройства да намират тази точка за достъп.</translation> <translation id="6758056191028427665">Уведомете ни как се справяме.</translation> <translation id="6759193508432371551">Възстановяване на фабричните настройки</translation> -<translation id="6761431452438552910">Уверете се, че устройството ви с Bluetooth е в режим за сдвояване и e наблизо. Сдвоявайте само устройства, които смятате за надеждни.</translation> <translation id="676158322851696513">„<ph name="EXTENSION_NAME" />“</translation> <translation id="6762833852331690540">Включено</translation> <translation id="676560328519657314">Начините ви на плащане в Google Pay</translation> @@ -7392,7 +7388,6 @@ <translation id="6979737339423435258">За цялото време</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">За да сърфирате частно, кликнете върху иконата с точки и отворете прозорец в режим „инкогнито“</translation> -<translation id="6981761993313539853">Уверете се, че устройството ви с Bluetooth е в режим за сдвояване и e наблизо. Сдвоявайте само устройства, които смятате за надеждни. <ph name="BEGIN_LINK_LEARN_MORE" />Научете повече<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Достъпност</translation> <translation id="6983507711977005608">Прекратяване на връзката с мрежата за незабавен тетъринг</translation> <translation id="6983783921975806247">Регистриран ИДО</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 24a61d90..61ce02c 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">প্রথম ট্যাবের দিকে স্ক্রল করুন</translation> <translation id="1410806973194718079">নীতি চেক করা যাচ্ছে না</translation> <translation id="1411400282355634827">সব ব্লুটুথ ডিভাইসের অনুমতি রিসেট করবেন?</translation> -<translation id="1411724932979011919">আপনার এন্ট্রি LPA:1$<smdp address>$<activation code> ফর্ম্যাটে হতে হবে</translation> <translation id="1414315029670184034">সাইটগুলিকে আপনার ক্যামেরা ব্যবহার করার অনুমতি দেয় না</translation> <translation id="1414648216875402825">আপনি <ph name="PRODUCT_NAME" />-এর অস্থায়ী ভার্সনে আপডেট করছেন, এটিতে থাকা বৈশিষ্টগুলি প্রগতিতে রয়েছে৷ ক্র্যাশ এবং অপ্রত্যাশিত ত্রুটিগুলি ঘটবে৷ সাবধানতার সাথে এগিয়ে যান৷</translation> <translation id="1415708812149920388">ক্লিপবোর্ড পড়ার অ্যাক্সেস প্রত্যাখ্যান করা হয়েছে</translation> @@ -1250,7 +1249,6 @@ <translation id="1972313920920745320">আপনার যোগ করা সাইট সব সময় অ্যাক্টিভ থাকবে এবং সেগুলি থেকে মেমরি খালি হয়ে যাবে না। <ph name="BEGIN_LINK" />নির্দিষ্ট সাইট অ্যাক্টিভ রাখার বিষয়ে আরও জানুন<ph name="END_LINK" /></translation> <translation id="1972325230031091483">আপনি আরও দ্রুত ব্রাউজ করবেন কারণ, আপনার বর্তমান ওয়েবপেজ দেখার উপরে ভিত্তি করে কন্টেন্ট নিজে থেকে লোড হয়</translation> <translation id="197288927597451399">Keep</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" />-এর জন্য আপনি যেসব অনুমতি দেন সেইসব অনুমতি এই অ্যাপও পেয়ে যাবে।</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> ফাইল নিরাপদে ডাউনলোড করা যাবে না। 'ডাউনলোড বার' এরিয়াতে যেতে Shift+F6 বোতাম প্রেস করুন।</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL বিতরণ পয়েন্টস</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">ডিভাইসের স্থান আশংকাজনকভাবে কম</translation> <translation id="4100853287411968461">নতুন স্ক্রিন টাইমের সীমা</translation> <translation id="4101352914005291489">লুকানো SSID</translation> -<translation id="4102469565336584882">ভুল কোড। আপনার এন্ট্রি LPA:1$<smdp address>$<activation code> ফর্ম্যাটে হতে হবে</translation> <translation id="4102906002417106771">পাওয়ারওয়াশ রিস্টার্ট করুন</translation> <translation id="4104163789986725820">র&প্তানি...</translation> <translation id="4104944259562794668">আপনি পরে 'সেটিংস > নিরাপত্তা ও গোপনীয়তা > লক স্ক্রিন' থেকে এটি চালু এবং সাইন-ইন করতে পারবেন</translation> @@ -7106,7 +7103,6 @@ <translation id="6757431299485455321">এই হটস্পট খুঁজতে অন্যান্য ডিভাইসকে সহায়তা করে।</translation> <translation id="6758056191028427665">আমাদের পরিষেবা কেমন লাগছে তা জানান।</translation> <translation id="6759193508432371551">ফ্যাক্টরি রিসেট</translation> -<translation id="6761431452438552910">আপনার ব্লুটুথ ডিভাইস কাছাকাছি এবং 'যোগ করার মোড'-এ আছে কিনা ভাল করে দেখে নিন। আপনার বিশ্বাস রয়েছে শুধু এমন ডিভাইসের সাথে পেয়ার করুন।</translation> <translation id="676158322851696513">“<ph name="EXTENSION_NAME" />”</translation> <translation id="6762833852331690540">চালু করা আছে</translation> <translation id="676560328519657314">Google Pay-তে আপনার পেমেন্টের পদ্ধতি</translation> @@ -7400,7 +7396,6 @@ <translation id="6979737339423435258">শুরু থেকে</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">গোপনে ব্রাউজ করার জন্য ছদ্মবেশী উইন্ডো খুলতে ডট আইকন মেনুতে ক্লিক করুন</translation> -<translation id="6981761993313539853">আপনার ব্লুটুথ ডিভাইস কাছাকাছি এবং 'যোগ করার মোড'-এ আছে কিনা ভাল করে দেখে নিন। আপনার বিশ্বাস রয়েছে শুধুমাত্র এমন ডিভাইসেই যোগ করুন <ph name="BEGIN_LINK_LEARN_MORE" />আরও জানুন<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ব্যবহারযোগ্যতা</translation> <translation id="6983507711977005608">ইনস্ট্যান্ট টিথারিং নেটওয়ার্ক ডিসকানেক্ট করুন</translation> <translation id="6983783921975806247">নিবন্ধীকৃত OID</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 3b7e07c..e9739d5 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -514,7 +514,6 @@ <translation id="1410797069449661718">Klizanje do prve kartice</translation> <translation id="1410806973194718079">Nije moguće provjeriti pravila</translation> <translation id="1411400282355634827">Poništiti sva odobrenja za Bluetooth uređaj?</translation> -<translation id="1411724932979011919">Vaš unos mora biti u formatu LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Nemoj dozvoliti web lokacijama korištenje kamere</translation> <translation id="1414648216875402825">Upravo ažurirate <ph name="PRODUCT_NAME" /> na nestabilnu verziju koja sadrži funkcije trenutno u upotrebi. Doći će do padova softvera i neočekivanih grešaka. Budite pažljivi.</translation> <translation id="1415708812149920388">Pristup čitanju međumemorije je odbijen</translation> @@ -1254,7 +1253,6 @@ <translation id="1972313920920745320">Web lokacije koje dodate će uvijek biti aktivne i zauzimat će memoriju. <ph name="BEGIN_LINK" />Saznajte više o zadržavanju određenih web lokacija aktivnima<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Pregledat ćete brže jer se sadržaj učitava proaktivno na osnovu vaše posjete trenutnoj web stranici</translation> <translation id="197288927597451399">Zadrži</translation> -<translation id="1973313062201924554">Odobrenja koja dodijelite za aplikaciju <ph name="APP_NAME" /> će se dodijeliti i za ovu aplikaciju.</translation> <translation id="1973763416111613016">Nije moguće sigurno preuzeti fajl <ph name="FILE_NAME" />. Pritisnite Shift + F6 da odete u područje trake preuzetih fajlova.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL distributivna mjesta</translation> @@ -3952,7 +3950,6 @@ <translation id="4100733287846229632">Količina prostora na disku je kritično mala</translation> <translation id="4100853287411968461">Novo ograničenje vremena korištenja uređaja</translation> <translation id="4101352914005291489">Skriveni SSID</translation> -<translation id="4102469565336584882">Nevažeći kôd. Vaš unos mora biti u formatu LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Ponovo pokreni da se izvrši powerwash</translation> <translation id="4104163789986725820">I&zvezi...</translation> <translation id="4104944259562794668">Možete omogućiti ovu opciju kasnije u Postavkama > Sigurnost i privatnost > Zaključavanje ekrana i prijava</translation> @@ -7115,7 +7112,6 @@ <translation id="6757431299485455321">Pomozite drugim uređajima da pronađu ovu pristupnu tačku.</translation> <translation id="6758056191028427665">Recite nam koliko ste zadovoljni nama.</translation> <translation id="6759193508432371551">Vraćanje na fabričke postavke</translation> -<translation id="6761431452438552910">Provjerite je li Bluetooth uređaj u načinu rada za uparivanje i u blizini. Uparite samo s uređajima kojima vjerujete.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Uključeno</translation> <translation id="676560328519657314">Vaši načini plaćanja na Google Payu</translation> @@ -7409,7 +7405,6 @@ <translation id="6979737339423435258">Sve vrijeme</translation> <translation id="6980402667292348590">Insert</translation> <translation id="6981553172137913845">Da privatno pregledate, kliknite na ikonu menija s tačkicama da otvorite anonimni prozor</translation> -<translation id="6981761993313539853">Provjerite je li Bluetooth uređaj u načinu rada za uparivanje i u blizini. Uparite samo s uređajima kojima vjerujete. <ph name="BEGIN_LINK_LEARN_MORE" />Saznajte više<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Pristupačnost</translation> <translation id="6983507711977005608">Prekini vezu s mrežom Trenutnog dijeljenja internetske veze</translation> <translation id="6983783921975806247">Registrirani OID</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index ca19e3d..c90236f 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Desplaça't cap a la primera pestanya</translation> <translation id="1410806973194718079">No es poden comprovar les polítiques</translation> <translation id="1411400282355634827">Vols restablir tots els permisos del dispositiu Bluetooth?</translation> -<translation id="1411724932979011919">L'entrada ha de tenir el format LPA:1$<adreça smdp>$<codi d'activació></translation> <translation id="1414315029670184034">No permetis que els llocs web utilitzin la càmera</translation> <translation id="1414648216875402825">Esteu a punt de passar a una versió inestable de <ph name="PRODUCT_NAME" /> que conté funcions en curs. Es produiran bloqueigs i errors inesperats. Continueu amb precaució.</translation> <translation id="1415708812149920388">S'ha denegat l'accés de lectura al porta-retalls</translation> @@ -1243,7 +1242,6 @@ <translation id="1972313920920745320">Els llocs web que afegeixis estaran sempre actius i no se n'alliberarà memòria. <ph name="BEGIN_LINK" />Més informació sobre com pots mantenir actius llocs web específics<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Navegaràs més de pressa perquè el contingut es carrega de forma proactiva en funció de la pàgina web que estiguis visitant</translation> <translation id="197288927597451399">Conserva</translation> -<translation id="1973313062201924554">Els permisos que concedeixis a <ph name="APP_NAME" /> també es concediran a aquesta aplicació.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> no es pot baixar de manera segura. Prem Maj+F6 per anar a l'àrea de la barra de baixades.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Punts de distribució de CRL</translation> @@ -3937,7 +3935,6 @@ <translation id="4100733287846229632">Queda molt poc espai al dispositiu</translation> <translation id="4100853287411968461">Nou límit de temps de connexió</translation> <translation id="4101352914005291489">SSID amagat</translation> -<translation id="4102469565336584882">El codi no és vàlid. L'entrada ha de tenir el format LPA:1$<adreça smdp>$<codi d'activació></translation> <translation id="4102906002417106771">Reinicia per fer un Powerwash</translation> <translation id="4104163789986725820">E&xporta...</translation> <translation id="4104944259562794668">Pots activar-la més tard a Configuració > Seguretat i privadesa > Pantalla de bloqueig i inici de sessió</translation> @@ -7094,7 +7091,6 @@ <translation id="6757431299485455321">Ajuda altres dispositius a trobar aquest punt d'accés Wi‐Fi.</translation> <translation id="6758056191028427665">Digue'ns si ho estem fent bé.</translation> <translation id="6759193508432371551">Restabliment de fàbrica</translation> -<translation id="6761431452438552910">Comprova que el dispositiu Bluetooth es trobi a prop i en mode de vinculació. Vincula'l només amb dispositius en què confiïs.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Activat</translation> <translation id="676560328519657314">Les teves formes de pagament a Google Pay</translation> @@ -7388,7 +7384,6 @@ <translation id="6979737339423435258">Sempre</translation> <translation id="6980402667292348590">Inser</translation> <translation id="6981553172137913845">Per navegar de manera privada, fes clic al menú de la icona de tres punts per obrir una finestra d'incògnit</translation> -<translation id="6981761993313539853">Comprova que el dispositiu Bluetooth es trobi a prop i en mode de vinculació. Vincula'l només amb dispositius en què confiïs. <ph name="BEGIN_LINK_LEARN_MORE" />Més informació<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Accessibilitat</translation> <translation id="6983507711977005608">Desconnecta la xarxa de compartició instantània</translation> <translation id="6983783921975806247">OID registrat</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index a4d9f50..72efd3f 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Přejít na první kartu</translation> <translation id="1410806973194718079">Zásady nelze zkontrolovat</translation> <translation id="1411400282355634827">Resetovat všechna oprávnění zařízení Bluetooth?</translation> -<translation id="1411724932979011919">Zadaná hodnota by měla mít formát LPA:1$<adresa smdp>$<aktivační kód></translation> <translation id="1414315029670184034">Nepovolovat webům používat kameru</translation> <translation id="1414648216875402825">Provádíte upgrade na nestabilní verzi systému <ph name="PRODUCT_NAME" />, která obsahuje funkce ve fázi vývoje. Bude docházet k selháním a neočekávaným chybám. Pokračujte s nejvyšší opatrností.</translation> <translation id="1415708812149920388">Byl odmítnut přístup ke čtení obsahu schránky</translation> @@ -1239,7 +1238,6 @@ <translation id="1972313920920745320">Weby, které přidáte, zůstanou vždy aktivní a neuvolní se z nich paměť. <ph name="BEGIN_LINK" />Další informace o tom, jak určité weby zachovat aktivní<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Budete web moci procházet rychleji, protože se obsah bude načítat proaktivně na základě aktuálně navštívené webové stránky</translation> <translation id="197288927597451399">Uložit</translation> -<translation id="1973313062201924554">Oprávnění, která povolíte pro aplikaci <ph name="APP_NAME" />, budou povolena i pro tuto aplikaci.</translation> <translation id="1973763416111613016">Soubor <ph name="FILE_NAME" /> nelze bezpečně stáhnout. Stisknutím kombinace kláves Shift+F6 přejdete na lištu se staženými soubory.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Distribuční body seznamu CRL</translation> @@ -3929,7 +3927,6 @@ <translation id="4100733287846229632">V zařízení je kriticky málo místa</translation> <translation id="4100853287411968461">Nový limit času stráveného na zařízení</translation> <translation id="4101352914005291489">Skryté SSID</translation> -<translation id="4102469565336584882">Neplatný kód. Zadaná hodnota by měla mít formát LPA:1$<adresa smdp>$<aktivační kód></translation> <translation id="4102906002417106771">Restartovat a provést powerwash</translation> <translation id="4104163789986725820">E&xport...</translation> <translation id="4104944259562794668">Můžete ho zapnout později v Nastavení > Zabezpečení a ochrana soukromí > Zámek obrazovky a přihlášení</translation> @@ -7086,7 +7083,6 @@ <translation id="6757431299485455321">Pomoci ostatním zařízením najít tento hotspot.</translation> <translation id="6758056191028427665">Sdělte nám, jak si vedeme.</translation> <translation id="6759193508432371551">Tovární nastavení</translation> -<translation id="6761431452438552910">Zařízení Bluetooth musí být v režimu párování a poblíž. Zařízení párujte pouze se zařízeními, kterým důvěřujete.</translation> <translation id="676158322851696513"><ph name="EXTENSION_NAME" /></translation> <translation id="6762833852331690540">Zapnuto</translation> <translation id="676560328519657314">Vaše platební metody ve službě Google Pay</translation> @@ -7380,7 +7376,6 @@ <translation id="6979737339423435258">Od počátku věků</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Pokud web chcete procházet v soukromí, klikněte na ikonu se třemi tečkami a otevřete anonymní okno</translation> -<translation id="6981761993313539853">Zařízení Bluetooth musí být v režimu párování a poblíž. Zařízení párujte pouze se zařízeními, kterým důvěřujete. <ph name="BEGIN_LINK_LEARN_MORE" />Další informace<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Usnadnění</translation> <translation id="6983507711977005608">Odpojit síť dynamického tetheringu</translation> <translation id="6983783921975806247">Registrovaný OID</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index f475982..008c9e09c 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -514,7 +514,6 @@ <translation id="1410797069449661718">Sgrolio tuag at y tab cyntaf</translation> <translation id="1410806973194718079">Methu â gwirio polisïau</translation> <translation id="1411400282355634827">Ailosod pob caniatâd dyfais Bluetooth?</translation> -<translation id="1411724932979011919">Rhaid i'ch cofnod gael y fformat LPA:1$<cyfeiriad smdp>$<cod gweithredu></translation> <translation id="1414315029670184034">Peidio â chaniatáu i wefannau ddefnyddio'ch camera</translation> <translation id="1414648216875402825">Rydych yn diweddaru i fersiwn ansefydlog o <ph name="PRODUCT_NAME" /> sy'n cynnwys nodweddion sydd ar y gweill. Bydd toriadau a bygiau annisgwyl yn digwydd. Parhewch yn ofalus.</translation> <translation id="1415708812149920388">Gwrthodwyd mynediad darllen y clipfwrdd</translation> @@ -1252,7 +1251,6 @@ <translation id="1972313920920745320">Bydd gwefannau y byddwch yn eu hychwanegu bob amser yn aros yn weithredol ac ni fydd y cof yn cael ei ryddhau oddi wrthynt. <ph name="BEGIN_LINK" />Dysgu rhagor am gadw gwefannau penodol yn weithredol<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Byddwch yn pori'n gyflymach oherwydd bod cynnwys yn cael ei lwytho'n rhagweithiol yn seiliedig ar eich ymweliad tudalen we bresennol</translation> <translation id="197288927597451399">Cadw</translation> -<translation id="1973313062201924554">Bydd caniatadau rydych yn eu caniatáu ar gyfer <ph name="APP_NAME" /> hefyd yn cael eu caniatáu ar gyfer yr ap hwn.</translation> <translation id="1973763416111613016">Ni ellir lawrlwytho <ph name="FILE_NAME" /> yn ddiogel. Pwyswch Shift+F6 i fynd drwy'r dudalen i'r bar lawrlwytho.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Pwyntiau Dosbarthu CRL</translation> @@ -3946,7 +3944,6 @@ <translation id="4100733287846229632">Mae le ar y ddyfais yn isel iawn</translation> <translation id="4100853287411968461">Terfyn amser sgrîn newydd</translation> <translation id="4101352914005291489">SSID cudd</translation> -<translation id="4102469565336584882">Cod annilys. Rhaid i'ch cofnod gael y fformat LPA:1$<cyfeiriad smdp>$<cod gweithredu></translation> <translation id="4102906002417106771">Ailgychwynnwch i ddefnyddio Powerwash</translation> <translation id="4104163789986725820">A&llforio…</translation> <translation id="4104944259562794668">Gallwch ei alluogi yn nes ymlaen yn y Gosodiadau > Diogelwch a Phreifatrwydd > Clo sgrîn a mewngofnodi</translation> @@ -7111,7 +7108,6 @@ <translation id="6757431299485455321">Helpu dyfeisiau eraill i ddod o hyd i'r poethfan hwn.</translation> <translation id="6758056191028427665">Rhannwch eich barn gyda ni.</translation> <translation id="6759193508432371551">Ailosod i'r gosodiadau ffatri</translation> -<translation id="6761431452438552910">Gwnewch yn siŵr bod eich dyfais Bluetooth yn y modd paru a gerllaw. Parwch gyda dyfeisiau rydych yn ymddiried ynddynt yn unig.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Ymlaen</translation> <translation id="676560328519657314">Eich dulliau talu yn Google Pay</translation> @@ -7405,7 +7401,6 @@ <translation id="6979737339423435258">Pob un</translation> <translation id="6980402667292348590">mewnbynnu</translation> <translation id="6981553172137913845">I bori'n breifat, cliciwch y ddewislen eicon dotiau i agor ffenestr Anhysbys</translation> -<translation id="6981761993313539853">Gwnewch yn siŵr bod eich dyfais Bluetooth yn y modd paru a gerllaw. Parwch gyda dyfeisiau rydych yn ymddiried ynddynt yn unig. <ph name="BEGIN_LINK_LEARN_MORE" />Dysgu rhagor<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Hygyrchedd</translation> <translation id="6983507711977005608">Datgysylltu rhwydwaith Rhannu Cysylltiad Sydyn</translation> <translation id="6983783921975806247">OID cofrestredig</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 7eeb864c..0edef27 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">Rul til første fane</translation> <translation id="1410806973194718079">Det var ikke muligt at tjekke politikker</translation> <translation id="1411400282355634827">Vil du nulstille alle Bluetooth-enhedstilladelser?</translation> -<translation id="1411724932979011919">Din indtastning bør have formatet LPA:1$<smdp-adresse>$<aktiveringskode></translation> <translation id="1414315029670184034">Tillad ikke, at websites anvender dit kamera</translation> <translation id="1414648216875402825">Du er ved at opdatere til en ustabil version af <ph name="PRODUCT_NAME" />, der indeholder ufærdige funktioner. Nedbrud og uventede fejl kan forekomme. Vær forsigtig, hvis du fortsætter.</translation> <translation id="1415708812149920388">Læseadgang til udklipsholderen blev afvist</translation> @@ -1250,7 +1249,6 @@ <translation id="1972313920920745320">De websites, du tilføjer, forbliver aktive, og der frigøres ikke hukommelse fra dem. <ph name="BEGIN_LINK" />Få flere oplysninger om, hvordan du holder bestemte websites aktive<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Du får hurtigere browsing, da indholdet indlæses proaktivt på baggrund af den webside, du aktuelt er på</translation> <translation id="197288927597451399">Behold</translation> -<translation id="1973313062201924554">De tilladelser, du giver <ph name="APP_NAME" />, gives også til denne app.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> kan ikke downloades sikkert. Tryk på Shift+F6 for at skifte til downloadlinjen.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL-distributionspoint</translation> @@ -3944,7 +3942,6 @@ <translation id="4100733287846229632">Der er næsten ikke mere plads på enheden</translation> <translation id="4100853287411968461">Ny grænse for skærmtid</translation> <translation id="4101352914005291489">Skjult SSID</translation> -<translation id="4102469565336584882">Ugyldig kode. Din indtastning bør have formatet LPA:1$<smdp-adresse>$<aktiveringskode></translation> <translation id="4102906002417106771">Genstart for at udføre powerwash</translation> <translation id="4104163789986725820">E&ksporter...</translation> <translation id="4104944259562794668">Du kan aktivere indstillingen senere i Indstillinger > Sikkerhed og privatliv > Låseskærm og login</translation> @@ -7103,7 +7100,6 @@ <translation id="6757431299485455321">Hjælp andre enheder med at finde dette hotspot.</translation> <translation id="6758056191028427665">Fortæl os, hvad du synes.</translation> <translation id="6759193508432371551">Gendannelse af fabriksindstillinger</translation> -<translation id="6761431452438552910">Sørg for, at din Bluetooth-enhed er i parringstilstand og befinder sig tæt på. Par kun med enheder, du har tillid til.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Til</translation> <translation id="676560328519657314">Dine betalingsmetoder i Google Pay</translation> @@ -7397,7 +7393,6 @@ <translation id="6979737339423435258">Altid</translation> <translation id="6980402667292348590">Insert</translation> <translation id="6981553172137913845">Hvis du vil bruge nettet privat, skal du klikke på prikmenuen for at åbne et inkognitovindue</translation> -<translation id="6981761993313539853">Sørg for, at din Bluetooth-enhed er i parringstilstand og befinder sig tæt på. Par kun med enheder, du har tillid til. <ph name="BEGIN_LINK_LEARN_MORE" />Få flere oplysninger<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Hjælpefunktioner</translation> <translation id="6983507711977005608">Afbryd forbindelsen til det netværk, der anvendes til Automatisk netdeling</translation> <translation id="6983783921975806247">Registreret OID</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 79acbea..8ee5ee1 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -507,7 +507,6 @@ <translation id="1410797069449661718">Zum ersten Tab scrollen</translation> <translation id="1410806973194718079">Richtlinien können nicht geprüft werden</translation> <translation id="1411400282355634827">Alle Berechtigungen für Bluetooth-Geräte zurücksetzen?</translation> -<translation id="1411724932979011919">Deine Eingabe muss dieses Format haben: LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Websites dürfen nicht meine Kamera verwenden</translation> <translation id="1414648216875402825">Du aktualisierst auf eine instabile Version von <ph name="PRODUCT_NAME" />. Diese enthält Funktionen, die sich noch in der Entwicklung befinden. Es können Abstürze und unerwartete Fehler auftreten. Es ist daher besondere Vorsicht geboten.</translation> <translation id="1415708812149920388">Lesezugriff auf Zwischenablage verweigert</translation> @@ -1230,7 +1229,6 @@ <translation id="1972313920920745320">Hinzugefügte Websites bleiben immer aktiv und im Arbeitsspeicher. <ph name="BEGIN_LINK" />Hier erfährst du mehr dazu, wie du bestimmte Websites aktiv hältst.<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Du kannst schneller surfen, da Inhalte basierend auf deinen Seitenaufrufen proaktiv geladen werden</translation> <translation id="197288927597451399">Behalten</translation> -<translation id="1973313062201924554">Für die App „<ph name="APP_NAME" />“ erteilte Berechtigungen werden auch auf diese App angewendet.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> kann nicht sicher heruntergeladen werden. Drücke Umschalttaste + F6, um zum Bereich mit der Downloadleiste zu wechseln.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL-Verteilungspunkte</translation> @@ -3914,7 +3912,6 @@ <translation id="4100733287846229632">Speicherplatz auf Gerät äußerst niedrig</translation> <translation id="4100853287411968461">Neue Zeiten für Gerätenutzung</translation> <translation id="4101352914005291489">SSID ausgeblendet</translation> -<translation id="4102469565336584882">Ungültiger Code. Deine Eingabe muss dieses Format haben: LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Für Powerwash neu starten</translation> <translation id="4104163789986725820">E&xportieren...</translation> <translation id="4104944259562794668">Du kannst es später in den Einstellungen > „Sicherheit und Datenschutz“ > „Sperrbildschirm und Anmeldung“ aktivieren</translation> @@ -7057,7 +7054,6 @@ <translation id="6757431299485455321">Hilf anderen Geräten, diesen Hotspot zu finden.</translation> <translation id="6758056191028427665">Teile uns mit, wie zufrieden du mit uns bist.</translation> <translation id="6759193508432371551">Zurücksetzen auf Werkseinstellungen</translation> -<translation id="6761431452438552910">Auf dem Bluetooth-Gerät muss der Kopplungsmodus aktiviert sein und es muss sich in der Nähe befinden. Kopple nur Geräte, denen du vertraust.</translation> <translation id="676158322851696513">„<ph name="EXTENSION_NAME" />“</translation> <translation id="6762833852331690540">An</translation> <translation id="676560328519657314">Deine Zahlungsmethoden in Google Pay</translation> @@ -7351,7 +7347,6 @@ <translation id="6979737339423435258">Gesamte Zeit</translation> <translation id="6980402667292348590">Einfügen</translation> <translation id="6981553172137913845">Wenn du privat surfen möchtest, klicke auf das Dreipunkt-Menü, um ein Inkognitofenster zu öffnen</translation> -<translation id="6981761993313539853">Auf dem Bluetooth-Gerät muss der Kopplungsmodus aktiviert sein und es muss sich in der Nähe befinden. Kopple nur Geräte, denen du vertraust. <ph name="BEGIN_LINK_LEARN_MORE" />Weitere Informationen<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Bedienungshilfen</translation> <translation id="6983507711977005608">Verbindung mit Instant Tethering-Netzwerk trennen</translation> <translation id="6983783921975806247">Registrierte OID</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index a1b20e2..1ce74248 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Κύλιση προς την πρώτη καρτέλα</translation> <translation id="1410806973194718079">Δεν είναι δυνατός ο έλεγχος πολιτικών.</translation> <translation id="1411400282355634827">Επαναφορά όλων των αδειών συσκευής Bluetooth;</translation> -<translation id="1411724932979011919">Η καταχώρισή σας θα πρέπει να έχει τη μορφή LPA:1$<smdp address>$<κωδικός ενεργοποίησης></translation> <translation id="1414315029670184034">Να μην επιτρέπεται στους ιστοτόπους να χρησιμοποιούν την κάμερά σας</translation> <translation id="1414648216875402825">Πρόκειται να ενημερώσετε σε μια ασταθή έκδοση του <ph name="PRODUCT_NAME" />, η οποία περιλαμβάνει δυνατότητες που βρίσκονται υπό ανάπτυξη. Ενδεχομένως να υπάρχουν ατέλειες και απρόσμενα σφάλματα.</translation> <translation id="1415708812149920388">Δεν επιτρέπεται η πρόσβαση ανάγνωσης στο πρόχειρο</translation> @@ -1249,7 +1248,6 @@ <translation id="1972313920920745320">Οι ιστότοποι που προσθέτετε θα παραμένουν πάντα ενεργοί και δεν θα απελευθερώνεται μνήμη από αυτούς. <ph name="BEGIN_LINK" />Μάθετε περισσότερα σχετικά με το πώς να διατηρείτε ενεργούς συγκεκριμένους ιστοτόπους<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Η περιήγησή σας θα είναι πιο γρήγορη επειδή το περιεχόμενο φορτώνεται προληπτικά με βάση την τρέχουσα επίσκεψή σας στην ιστοσελίδα.</translation> <translation id="197288927597451399">Διατήρηση</translation> -<translation id="1973313062201924554">Οι άδειες που επιτρέπετε για την εφαρμογή <ph name="APP_NAME" /> θα επιτρέπονται επίσης και για αυτή την εφαρμογή.</translation> <translation id="1973763416111613016">Δεν είναι δυνατή η λήψη του αρχείου <ph name="FILE_NAME" /> με ασφάλεια. Πατήστε Shift+F6 για να μεταβείτε στη γραμμή λήψεων.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Σημεία διανομής CRL</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">Ο ελεύθερος χώρος της συσκευής είναι οριακός</translation> <translation id="4100853287411968461">Νέο όριο χρόνου χρήσης</translation> <translation id="4101352914005291489">Κρυφό SSID</translation> -<translation id="4102469565336584882">Μη έγκυρος κωδικός. Η καταχώρισή σας θα πρέπει να έχει τη μορφή LPA:1$<smdp address>$<κωδικός ενεργοποίησης></translation> <translation id="4102906002417106771">Επανεκκίνηση για powerwash</translation> <translation id="4104163789986725820">Ε&ξαγωγή...</translation> <translation id="4104944259562794668">Μπορείτε να την ενεργοποιήσετε αργότερα στην ενότητα Ρυθμίσεις > Ασφάλεια και απόρρητο > Οθόνη κλειδώματος και σύνδεση</translation> @@ -7101,7 +7098,6 @@ <translation id="6757431299485455321">Βοηθήστε άλλες συσκευές να βρουν αυτό το σημείο πρόσβασης Wi-Fi.</translation> <translation id="6758056191028427665">Πείτε μας πώς τα πηγαίνουμε</translation> <translation id="6759193508432371551">Επαναφορά εργοστασιακών ρυθμίσεων</translation> -<translation id="6761431452438552910">Βεβαιωθείτε ότι η συσκευή Bluetooth βρίσκεται σε λειτουργία σύζευξης και σε κοντινή απόσταση. Να κάνετε σύζευξη μόνο συσκευές που θεωρείτε αξιόπιστες.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Ενεργό</translation> <translation id="676560328519657314">Οι τρόποι πληρωμής σας στο Google Pay</translation> @@ -7395,7 +7391,6 @@ <translation id="6979737339423435258">Από την αρχή</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Για να περιηγηθείτε ιδιωτικά, κάντε κλικ στο μενού με τα εικονίδια κουκίδων για να ανοίξετε ένα παράθυρο για ανώνυμη περιήγηση.</translation> -<translation id="6981761993313539853">Βεβαιωθείτε ότι η συσκευή Bluetooth βρίσκεται σε λειτουργία σύζευξης και σε κοντινή απόσταση. Να κάνετε σύζευξη μόνο συσκευές που θεωρείτε αξιόπιστες. <ph name="BEGIN_LINK_LEARN_MORE" />Μάθετε περισσότερα<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Προσβασιμότητα</translation> <translation id="6983507711977005608">Αποσύνδεση δικτύου Άμεσης σύνδεσης</translation> <translation id="6983783921975806247">Εγγεγραμμένο OID</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index a56208a..6e839b9 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Scroll towards the first tab</translation> <translation id="1410806973194718079">Unable to check policies</translation> <translation id="1411400282355634827">Reset all Bluetooth device permissions?</translation> -<translation id="1411724932979011919">Your entry should have the format LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Don't allow sites to use your camera</translation> <translation id="1414648216875402825">You are updating to an unstable version of <ph name="PRODUCT_NAME" /> which contains features that are in progress. Crashes and unexpected bugs will occur. Please proceed with caution.</translation> <translation id="1415708812149920388">Clipboard read access denied</translation> @@ -1249,7 +1248,6 @@ <translation id="1972313920920745320">Websites you add will always stay active and memory won't be freed up from them. <ph name="BEGIN_LINK" />Learn more about keeping specific sites active<ph name="END_LINK" /></translation> <translation id="1972325230031091483">You’ll browse faster because content is proactively loaded based on your current web page visit</translation> <translation id="197288927597451399">Keep</translation> -<translation id="1973313062201924554">Permissions that you allow for <ph name="APP_NAME" /> will also be allowed for this app.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> can't be downloaded securely. Press Shift + F6 to cycle to the downloads bar area.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL Distribution Points</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">Device space critically low</translation> <translation id="4100853287411968461">New screen time limit</translation> <translation id="4101352914005291489">Hidden SSID</translation> -<translation id="4102469565336584882">Invalid code. Your entry should have the format LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Restart to Powerwash</translation> <translation id="4104163789986725820">E&xport...</translation> <translation id="4104944259562794668">You can enable it later in Settings > Security and privacy > Lock screen and sign-in</translation> @@ -7100,7 +7097,6 @@ <translation id="6757431299485455321">Help other devices find this hotspot.</translation> <translation id="6758056191028427665">Let us know how we’re doing.</translation> <translation id="6759193508432371551">Factory reset</translation> -<translation id="6761431452438552910">Make sure that your Bluetooth device is in pairing mode and nearby. Only pair with devices that you trust.</translation> <translation id="676158322851696513">‘<ph name="EXTENSION_NAME" />’</translation> <translation id="6762833852331690540">On</translation> <translation id="676560328519657314">Your payment methods in Google Pay</translation> @@ -7394,7 +7390,6 @@ <translation id="6979737339423435258">All time</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">To browse privately, click the dots icon menu to open an Incognito window</translation> -<translation id="6981761993313539853">Make sure that your Bluetooth device is in pairing mode and nearby. Only pair with devices that you trust. <ph name="BEGIN_LINK_LEARN_MORE" />Learn more<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Accessibility</translation> <translation id="6983507711977005608">Disconnect Instant Tethering network</translation> <translation id="6983783921975806247">Registered OID</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index e0d4105..4b62864 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">Desplazarse hacia la primer pestaña</translation> <translation id="1410806973194718079">No se pueden revisar las políticas</translation> <translation id="1411400282355634827">¿Quieres restablecer todos los permisos de dispositivos Bluetooth?</translation> -<translation id="1411724932979011919">El formato de tu entrada debe ser LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">No permitir que los sitios usen la cámara</translation> <translation id="1414648216875402825">Estás por actualizar a una versión inestable de <ph name="PRODUCT_NAME" /> en la que se incluyen funciones que aún se están desarrollando. Se producirán bloqueos y errores inesperados. Continúa con precaución.</translation> <translation id="1415708812149920388">Se denegó el acceso de lectura al portapapeles</translation> @@ -1234,7 +1233,6 @@ <translation id="1972313920920745320">Los sitios que agregues siempre permanecerán activos y no se liberará la memoria. <ph name="BEGIN_LINK" />Más información para mantener sitios específicos activos<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Navegarás más rápido porque el contenido se cargará proactivamente en función de la página web que visites en el momento</translation> <translation id="197288927597451399">Conservar</translation> -<translation id="1973313062201924554">Los permisos que otorgues para <ph name="APP_NAME" /> también se otorgarán para esta app.</translation> <translation id="1973763416111613016">No se puede descargar el archivo <ph name="FILE_NAME" /> de forma segura. Presiona Mayúsculas+F6 para ir al área de la barra de descargas.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Puntos de distribución de la CRL</translation> @@ -3925,7 +3923,6 @@ <translation id="4100733287846229632">Hay muy poco espacio en el dispositivo</translation> <translation id="4100853287411968461">Nuevo límite en el horario de uso</translation> <translation id="4101352914005291489">SSID oculto</translation> -<translation id="4102469565336584882">El código no es válido. El formato de tu entrada debe ser LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Reiniciar con Powerwash</translation> <translation id="4104163789986725820">E&xportar...</translation> <translation id="4104944259562794668">Puedes habilitarla más tarde en Configuración > Seguridad y privacidad > Pantalla de bloqueo y acceso</translation> @@ -7081,7 +7078,6 @@ <translation id="6757431299485455321">Ayuda a que otros dispositivos encuentren este hotspot.</translation> <translation id="6758056191028427665">Danos tu opinión sobre nuestro trabajo.</translation> <translation id="6759193508432371551">Restablecer configuración de fábrica</translation> -<translation id="6761431452438552910">Asegúrate de que tu dispositivo Bluetooth esté cerca y tenga el modo de vinculación activado. Vincúlate solo con dispositivos de confianza.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Sí</translation> <translation id="676560328519657314">Tus formas de pago de Google Pay</translation> @@ -7375,7 +7371,6 @@ <translation id="6979737339423435258">Todos</translation> <translation id="6980402667292348590">Insertar</translation> <translation id="6981553172137913845">Haz clic en el menú con el ícono de puntos para abrir una ventana de incógnito y navegar de forma privada</translation> -<translation id="6981761993313539853">Asegúrate de que tu dispositivo Bluetooth esté cerca y tenga el modo de vinculación activado. Vincúlate solo con dispositivos de confianza. <ph name="BEGIN_LINK_LEARN_MORE" />Más información<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Accesibilidad</translation> <translation id="6983507711977005608">Desactivar la red de Conexión instantánea mediante dispositivo móvil</translation> <translation id="6983783921975806247">OID registrado</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 11a82600..c586d36 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">Desplazarse a la primera pestaña</translation> <translation id="1410806973194718079">No se pueden comprobar las políticas</translation> <translation id="1411400282355634827">¿Restablecer todos los permisos del dispositivo Bluetooth?</translation> -<translation id="1411724932979011919">El formato debe ser LPA:1$<dirección smdp>$<código de activación></translation> <translation id="1414315029670184034">No permitir que los sitios usen tu cámara</translation> <translation id="1414648216875402825">Vas a actualizar a una versión inestable de <ph name="PRODUCT_NAME" /> que incluye funciones que están en desarrollo. Se producirán fallos y errores inesperados. Utiliza esta versión con precaución.</translation> <translation id="1415708812149920388">Se ha denegado el acceso de lectura al portapapeles</translation> @@ -1237,7 +1236,6 @@ <translation id="1972313920920745320">Los sitios que añadas siempre permanecerán activos y no se liberará memoria de ellos. <ph name="BEGIN_LINK" />Más información sobre cómo mantener activos determinados sitios<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Navegarás más rápido porque el contenido se carga de forma proactiva en función de la página web en la que estás</translation> <translation id="197288927597451399">Descargar</translation> -<translation id="1973313062201924554">Los permisos que concedas a <ph name="APP_NAME" /> también se concederán a esta aplicación.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> no se puede descargar de forma segura. Pulsa Mayús + F6 para desplazarte al área de la barra de descargas.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Puntos de distribución de listas de revocación de certificados</translation> @@ -3928,7 +3926,6 @@ <translation id="4100733287846229632">Queda muy poco espacio en el dispositivo</translation> <translation id="4100853287411968461">Nuevo límite de tiempo de pantalla</translation> <translation id="4101352914005291489">SSID oculto</translation> -<translation id="4102469565336584882">Código no válido. El formato debe ser LPA:1$<dirección smdp>$<código de activación></translation> <translation id="4102906002417106771">Reiniciar para ejecutar Powerwash</translation> <translation id="4104163789986725820">E&xportar...</translation> <translation id="4104944259562794668">Puedes habilitarlo más adelante en Configuración > Seguridad y privacidad > Pantalla de bloqueo e inicio de sesión</translation> @@ -7084,7 +7081,6 @@ <translation id="6757431299485455321">Ayuda a otros dispositivos a encontrar este punto de acceso.</translation> <translation id="6758056191028427665">Envíanos tu opinión sobre nuestro servicio.</translation> <translation id="6759193508432371551">Restablecer estado de fábrica</translation> -<translation id="6761431452438552910">Comprueba que tu dispositivo Bluetooth esté cerca y en modo Emparejamiento. Emparéjalo solo con dispositivos de confianza.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Activado</translation> <translation id="676560328519657314">Tus métodos de pago en Google Pay</translation> @@ -7378,7 +7374,6 @@ <translation id="6979737339423435258">Desde siempre</translation> <translation id="6980402667292348590">Insert</translation> <translation id="6981553172137913845">Para navegar en privado, haz clic en el icono de puntos y abre una ventana de Incógnito</translation> -<translation id="6981761993313539853">Comprueba que tu dispositivo Bluetooth esté cerca y en modo Emparejamiento. Emparéjalo solo con dispositivos de confianza. <ph name="BEGIN_LINK_LEARN_MORE" />Más información<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Accesibilidad</translation> <translation id="6983507711977005608">Desconectar red de conexión compartida instantánea</translation> <translation id="6983783921975806247">OID registrado</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index e2b1c68..0a04b8f 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Keri esimese vahelehe poole</translation> <translation id="1410806973194718079">Reegleid ei õnnestu kontrollida</translation> <translation id="1411400282355634827">Kas lähtestada kõik Bluetooth-seadme õigused?</translation> -<translation id="1411724932979011919">Sisestus peab olema järgmises vormingus: LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Ära luba saitidel kasutada minu kaamerat</translation> <translation id="1414648216875402825">Kavatsete üle minna rakenduse <ph name="PRODUCT_NAME" /> ebastabiilsele versioonile, mis sisaldab pooleliolevaid funktsioone. Tekivad krahhid ja ootamatud vead. Olge jätkamisel ettevaatlik.</translation> <translation id="1415708812149920388">Juurdepääsu lõikelaua lugemiseks ei antud</translation> @@ -1240,7 +1239,6 @@ <translation id="1972313920920745320">Teie lisatud saidid püsivad alati aktiivsena ja nende arvelt mälu ei vabastata. <ph name="BEGIN_LINK" />Lisateave konkreetsete saitide aktiivsena hoidmise kohta<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Saate kiiremini sirvida, kuna sisu laaditakse ennetavalt teie praeguse veebilehekülastuse põhjal</translation> <translation id="197288927597451399">Jäta alles</translation> -<translation id="1973313062201924554">Rakendusele <ph name="APP_NAME" /> antavad load antakse ka sellele rakendusele.</translation> <translation id="1973763416111613016">Faili <ph name="FILE_NAME" /> ei saa turvaliselt alla laadida. Allalaadimiste riba valikute vahel vahetamiseks vajutage klahvikombinatsiooni Tõstuklahv + F6.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL-i jaotuspunktid</translation> @@ -3934,7 +3932,6 @@ <translation id="4100733287846229632">Seadmes on kriitiliselt vähe kettaruumi</translation> <translation id="4100853287411968461">Uus ekraaniaja piirang</translation> <translation id="4101352914005291489">Peidetud SSID</translation> -<translation id="4102469565336584882">Kehtetu kood. Sisestus peab olema järgmises vormingus: LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Taaskäivita Powerwashi aktiveerimiseks</translation> <translation id="4104163789986725820">&Ekspordi...</translation> <translation id="4104944259562794668">Saate selle hiljem lubada jaotises Seaded > Turvalisus ja privaatsus > Lukustuskuva ja sisselogimine</translation> @@ -7090,7 +7087,6 @@ <translation id="6757431299485455321">Aidake teistel seadmetel see kuumkoht leida.</translation> <translation id="6758056191028427665">Andke teada, kuidas meil läheb.</translation> <translation id="6759193508432371551">Tehaseseadete lähtestamine</translation> -<translation id="6761431452438552910">Veenduge, et teie Bluetooth-seade oleks sidumisrežiimis ja läheduses. Siduge ainult seadmetega, mida usaldate.</translation> <translation id="676158322851696513">„<ph name="EXTENSION_NAME" />“</translation> <translation id="6762833852331690540">Sees</translation> <translation id="676560328519657314">Teie makseviisid Google Pays</translation> @@ -7384,7 +7380,6 @@ <translation id="6979737339423435258">Algusest</translation> <translation id="6980402667292348590">sisesta</translation> <translation id="6981553172137913845">Privaatselt sirvimiseks klõpsake punktidega menüüikoonil, et avada inkognito aken</translation> -<translation id="6981761993313539853">Veenduge, et teie Bluetooth-seade oleks sidumisrežiimis ja läheduses. Siduge ainult seadmetega, mida usaldate. <ph name="BEGIN_LINK_LEARN_MORE" />Lisateave<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Juurdepääsetavus</translation> <translation id="6983507711977005608">Automaatselt jagatud võrgu ühenduse katkestamine</translation> <translation id="6983783921975806247">Registreeritud OID</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 87700a1..fdfb03bf 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">Egin gora edo behera lehenengo fitxaraino</translation> <translation id="1410806973194718079">Ezin dira egiaztatu gidalerroak</translation> <translation id="1411400282355634827">Bluetooth bidezko gailuen baimen guztiak berrezarri nahi dituzu?</translation> -<translation id="1411724932979011919">Sarrerak formatu hau eduki behar du: LPA:1$<SMDP helbidea>$<aktibazio-kodea></translation> <translation id="1414315029670184034">Ez eman kamera erabiltzeko baimena webguneei</translation> <translation id="1414648216875402825">Garatzen ari diren eginbideak dituen <ph name="PRODUCT_NAME" /> sistemaren bertsio ezegonkor batera eguneratzen ari zara. Hutsegiteak eta ustekabeko erroreak gertatuko dira. Ibil zaitez kontuz.</translation> <translation id="1415708812149920388">Arbeleko edukia irakurtzeko sarbidea ukatu da</translation> @@ -1237,7 +1236,6 @@ <translation id="1972313920920745320">Gehitzen dituzun webguneak aktibo egongo dira beti, eta ez dira erabiliko memorian tokia egiteko. <ph name="BEGIN_LINK" />Lortu webgune jakin batzuk aktibo mantentzeari buruzko informazio gehiago<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Bizkorrago arakatuko duzu, edukia proaktiboki kargatuko delako bisitatzen ari zaren web-orriaren arabera</translation> <translation id="197288927597451399">Mantendu</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" /> aplikazioari ematen dizkiozun baimenak aplikazio honi ere emango zaizkio.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> ezin da segurtasunez deskargatu. Sakatu Maius eta F6 deskargen barraren eremura iritsi arte.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL banaketa-puntuak</translation> @@ -3927,7 +3925,6 @@ <translation id="4100733287846229632">Oso toki gutxi geratzen da gailuan</translation> <translation id="4100853287411968461">Erabilera-ordutegia aldatu da</translation> <translation id="4101352914005291489">SSID ezkutua</translation> -<translation id="4102469565336584882">Kodeak ez du balio. Sarrerak formatu hau eduki behar du: LPA:1$<SMDP helbidea>$<aktibazio-kodea></translation> <translation id="4102906002417106771">Berrabiarazi fabrikako ezarpenak Powerwash bidez berrezartzeko</translation> <translation id="4104163789986725820">E&sportatu…</translation> <translation id="4104944259562794668">Geroago gai dezakezu. Horretarako, joan Ezarpenak > Segurtasuna eta pribatutasuna > Pantaila blokeatua eta saio-hasiera atalera.</translation> @@ -7077,7 +7074,6 @@ <translation id="6757431299485455321">Lagundu beste gailuei wifi-gune hau aurkitzen.</translation> <translation id="6758056191028427665">Eman iritzia.</translation> <translation id="6759193508432371551">Jatorrizko datuak berrezartzea</translation> -<translation id="6761431452438552910">Ziurtatu Bluetooth bidezko gailua gertu eta parekatzeko moduan dagoela. Parekatu gailu fidagarriekin soilik.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Aktibatuta</translation> <translation id="676560328519657314">Google Pay-ko ordainketa-metodoak</translation> @@ -7371,7 +7367,6 @@ <translation id="6979737339423435258">Guztiak</translation> <translation id="6980402667292348590">"txertatu" tekla</translation> <translation id="6981553172137913845">Sarea modu pribatuan arakatzeko, sakatu hiru puntuen ikonoa duen menua eta ireki ezkutuko moduko leiho bat</translation> -<translation id="6981761993313539853">Ziurtatu Bluetooth bidezko gailua gertu eta parekatzeko moduan dagoela. Parekatu gailu fidagarriekin soilik. <ph name="BEGIN_LINK_LEARN_MORE" />Lortu informazio gehiago<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Erabilerraztasuna</translation> <translation id="6983507711977005608">Deskonektatu konexioa bizkor partekatzeko eginbidearen sarea</translation> <translation id="6983783921975806247">Erregistratutako OIDa</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 96176b1..eea709aa 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">پیمایش بهسمت اولین برگه</translation> <translation id="1410806973194718079">امکان بررسی خطمشیها وجود ندارد</translation> <translation id="1411400282355634827">همه اجازههای دستگاه بلوتوث بازنشانی شود؟</translation> -<translation id="1411724932979011919">ورودی باید در قالب LPA:1$<نشانی smdp>$<کد فعالسازی> باشد</translation> <translation id="1414315029670184034">به سایتها اجازه داده نشود از دوربین استفاده کنند</translation> <translation id="1414648216875402825">شما نسخه ناپایداری از <ph name="PRODUCT_NAME" /> را بهروزرسانی میکنید که حاوی قابلیتهای در حال توسعه است. خرابیها و اشکالهای غیرمنتظرهای رخ خواهد داد. لطفاُ با احتیاط ادامه دهید.</translation> <translation id="1415708812149920388">دسترسی برای خواندن محتوای بریدهدان امکانپذیر نیست</translation> @@ -1246,7 +1245,6 @@ <translation id="1972313920920745320">سایتهایی که اضافه میکنید همیشه فعال میمانند و از حافظه پاک نمیشوند. <ph name="BEGIN_LINK" />درباره فعال نگه داشتن سایتهای بهخصوص بیشتر بدانید<ph name="END_LINK" /></translation> <translation id="1972325230031091483">سریعتر مرور خواهید کرد چون محتوا بهصورت پیشنگرانه براساس بازدید صفحه وب فعلیتان بار میشود</translation> <translation id="197288927597451399">ادامه دادن</translation> -<translation id="1973313062201924554">اجازههایی که به <ph name="APP_NAME" /> میدهید به این برنامه نیز داده خواهد شد.</translation> <translation id="1973763416111613016">نمیتوان <ph name="FILE_NAME" /> را بهطور ایمن بارگیری کرد. برای رفتن به «نوار بارگیری»، Shift+F6 را فشار دهید.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">نقاط توزیع CRL</translation> @@ -3940,7 +3938,6 @@ <translation id="4100733287846229632">فضای دستگاه خیلی کم است</translation> <translation id="4100853287411968461">محدودیت جدید مدت تماشای صفحه</translation> <translation id="4101352914005291489">SSID پنهان</translation> -<translation id="4102469565336584882">کد نامعتبر است. ورودی باید در قالب LPA:1$<نشانی smdp>$<کد فعالسازی> باشد</translation> <translation id="4102906002417106771">بازراهاندازی برای powerwash</translation> <translation id="4104163789986725820">&صادر کردن...</translation> <translation id="4104944259562794668">میتوانید آن را بعداً در «تنظیمات > امنیت و حریم خصوصی > صفحه قفل» فعال کنید و به سیستم وارد شوید</translation> @@ -7099,7 +7096,6 @@ <translation id="6757431299485455321">کمک میکند دستگاههای دیگر این نقطه اتصال را پیدا کنند.</translation> <translation id="6758056191028427665">عملکردمان را به ما نشان دهید.</translation> <translation id="6759193508432371551">بازنشانی به تنظیمات کارخانه</translation> -<translation id="6761431452438552910">مطمئن شوید دستگاه بلوتوث در حالت مرتبطسازی و در همین اطراف باشد. فقط با دستگاههای که به آنها اعتماد دارید مرتبط شوید.</translation> <translation id="676158322851696513">«<ph name="EXTENSION_NAME" />»</translation> <translation id="6762833852331690540">روشن</translation> <translation id="676560328519657314">روشهای پرداخت شما در Google Pay</translation> @@ -7393,7 +7389,6 @@ <translation id="6979737339423435258">از ابتدا تا الآن</translation> <translation id="6980402667292348590">درج</translation> <translation id="6981553172137913845">برای مرور خصوصی، روی منوی نماد نقطهها کلیک کنید تا «پنجره ناشناسی» باز شود</translation> -<translation id="6981761993313539853">مطمئن شوید دستگاه بلوتوث در حالت مرتبطسازی و در همین اطراف باشد. فقط با دستگاههای که به آنها اعتماد دارید مرتبط شوید. <ph name="BEGIN_LINK_LEARN_MORE" />بیشتر بدانید<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">دسترسپذیری</translation> <translation id="6983507711977005608">قطع اتصال شبکه «اشتراکگذاری اینترنت فوری»</translation> <translation id="6983783921975806247">OID ثبت شده</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index efc3994..7293e33 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Vieritä kohti ensimmäistä välilehteä</translation> <translation id="1410806973194718079">Käytäntöjen tarkistaminen ei onnistu</translation> <translation id="1411400282355634827">Nollataanko kaikki Bluetooth-laitteiden luvat?</translation> -<translation id="1411724932979011919">Muodon pitää olla tällainen: LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Älä salli sivustojen käyttää kameraasi</translation> <translation id="1414648216875402825">Olet päivittämässä tuotteen <ph name="PRODUCT_NAME" /> epävakaaseen versioon, jossa on vasta kehitysvaiheessa olevia ominaisuuksia. Ohjelman kaatumisia ja odottamattomia virheitä on odotettavissa. Jatka omalla vastuullasi.</translation> <translation id="1415708812149920388">Leikepöydän lukuoikeus evätty</translation> @@ -1248,7 +1247,6 @@ <translation id="1972313920920745320">Lisäämäsi sivustot pysyvät aina aktiivisina, eikä niistä vapauteta muistia. <ph name="BEGIN_LINK" />Lue lisää tiettyjen sivustojen pitämisestä aktiivisena<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Selaaminen sujuu nopeammin, koska sisältö ladataan proaktiivisesti tällä hetkellä auki olevan verkkosivun perusteella</translation> <translation id="197288927597451399">Säilytä</translation> -<translation id="1973313062201924554">Sovellukselle (<ph name="APP_NAME" />) myönnetyt luvat myönnetään myös tälle sovellukselle.</translation> <translation id="1973763416111613016">Tiedostoa (<ph name="FILE_NAME" />) ei voi ladata turvallisesti. Paina Shift + F6 siirtyäksesi latauspalkkialueelle.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL:n jakelupisteet</translation> @@ -3939,7 +3937,6 @@ <translation id="4100733287846229632">Laitteen tallennustila on erittäin vähissä</translation> <translation id="4100853287411968461">Uusi laitteen käyttöajan rajoitus</translation> <translation id="4101352914005291489">Piilotettu SSID</translation> -<translation id="4102469565336584882">Virheellinen koodi. Muodon pitää olla tällainen: LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Aloita Powerwash käynnistämällä uudelleen</translation> <translation id="4104163789986725820">V&ie...</translation> <translation id="4104944259562794668">Voit ottaa sen käyttöön myöhemmin valitsemalla Asetukset > Tietosuoja ja yksityisyys > Lukitusnäyttö ja sisäänkirjautuminen</translation> @@ -7096,7 +7093,6 @@ <translation id="6757431299485455321">Auta muita laitteita löytämään tämä hotspot.</translation> <translation id="6758056191028427665">Kerro mielipiteesi</translation> <translation id="6759193508432371551">Tehdasasetusten palauttaminen</translation> -<translation id="6761431452438552910">Varmista, että Bluetooth-laitteesi on parinmuodostustilassa ja lähellä. Yhdistä vain laitteita, joihin luotat.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Päällä</translation> <translation id="676560328519657314">Maksutapasi Google Payssa</translation> @@ -7390,7 +7386,6 @@ <translation id="6979737339423435258">Kaikki</translation> <translation id="6980402667292348590">lisää</translation> <translation id="6981553172137913845">Jos haluat selata verkkoa yksityisesti, avaa valikko klikkaamalla pistekuvaketta ja siirry incognito-ikkunaan.</translation> -<translation id="6981761993313539853">Varmista, että Bluetooth-laitteesi on parinmuodostustilassa ja lähellä. Yhdistä vain laitteita, joihin luotat. <ph name="BEGIN_LINK_LEARN_MORE" />Lue lisää<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Saavutettavuus</translation> <translation id="6983507711977005608">Katkaise yhteyden pikajakamisen verkkoyhteys</translation> <translation id="6983783921975806247">Rekisteröity OID</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 2df346e..696666a 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">Mag-scroll papunta sa unang tab</translation> <translation id="1410806973194718079">Hindi masuri ang mga patakaran</translation> <translation id="1411400282355634827">I-reset ang lahat ng pahintulot sa Bluetooth device?</translation> -<translation id="1411724932979011919">Dapat LPA:1$<smdp address>$<activation code> ang format ng entry mo</translation> <translation id="1414315029670184034">Huwag payagan ang mga site na gamitin ang iyong camera</translation> <translation id="1414648216875402825">Iyong ina-update ang isang hindi matatag na bersyon ng <ph name="PRODUCT_NAME" /> na naglalaman ng mga tampok na kasalukuyang isinasagawa. Magkakaroon ng mga pag-crash at hindi inaasahang mga bug. Mangyaring magpatuloy nang may pag-iingat.</translation> <translation id="1415708812149920388">Tinanggihan ang read access sa clipboard</translation> @@ -1250,7 +1249,6 @@ <translation id="1972313920920745320">Palaging mananatiling aktibo ang mga site na idinaragdag mo at hindi magbabakante ng memory mula sa mga ito. <ph name="BEGIN_LINK" />Matuto pa tungkol sa pagpapanatiling aktibo ng mga partikular na site<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Makakapag-browse ka nang mas mabilis dahil aktibong naglo-load ng content batay sa kasalukuyan mong pagbisita sa webpage</translation> <translation id="197288927597451399">Panatilihin</translation> -<translation id="1973313062201924554">Ang mga pahintulot na pinapayagan mo para sa <ph name="APP_NAME" /> ay papayagan din para sa app na ito.</translation> <translation id="1973763416111613016">Hindi secure na mada-download ang <ph name="FILE_NAME" />. Pindutin ang Shift+F6 para mag-cycle sa lugar ng bar ng mga download.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Mga Punto ng Pagbabahagi ng CRL</translation> @@ -3944,7 +3942,6 @@ <translation id="4100733287846229632">Sobrang kaunti na lang ang espasyo ng device</translation> <translation id="4100853287411968461">Bagong limitasyon sa tagal ng paggamit</translation> <translation id="4101352914005291489">Nakatagong SSID</translation> -<translation id="4102469565336584882">Invalid ang code. Dapat LPA:1$<smdp address>$<activation code> ang format ng entry mo</translation> <translation id="4102906002417106771">I-restart para mag-powerwash</translation> <translation id="4104163789986725820">I-e&xport...</translation> <translation id="4104944259562794668">Puwede mo itong i-enable sa ibang pagkakataon sa Mga Setting > Seguridad at Privacy > Lock screen at pag-sign in</translation> @@ -7103,7 +7100,6 @@ <translation id="6757431299485455321">Tulungan ang iba pang device na mahanap ang hotspot na ito.</translation> <translation id="6758056191028427665">Ipaalam sa amin kung ano ang iyong palagay sa ginagawa namin.</translation> <translation id="6759193508432371551">Factory reset</translation> -<translation id="6761431452438552910">Tiyaking nasa pairing mode at nasa malapit ang iyong Bluetooth device. Makipagpares lang sa mga device na pinagkakatiwalaan mo.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Naka-on</translation> <translation id="676560328519657314">Iyong mga paraan ng pagbabayad sa Google Pay</translation> @@ -7397,7 +7393,6 @@ <translation id="6979737339423435258">Lahat ng oras</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Para mag-browse nang pribado, i-click ang menu ng icon na mga tuldok para magbukas ng Incognito window</translation> -<translation id="6981761993313539853">Tiyaking nasa pairing mode at nasa malapit ang iyong Bluetooth device. Makipagpares lang sa mga device na pinagkakatiwalaan mo. <ph name="BEGIN_LINK_LEARN_MORE" />Matuto pa<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Accessibility</translation> <translation id="6983507711977005608">Idiskonekta ang network na ginagamit para sa Instant na Pag-tether</translation> <translation id="6983783921975806247">Nakarehistrong OID</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 4e652b62..14581b0 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">Faire défiler l'écran vers le premier onglet</translation> <translation id="1410806973194718079">Impossible de vérifier les politiques</translation> <translation id="1411400282355634827">Réinitialiser toutes les autorisations des appareils Bluetooth?</translation> -<translation id="1411724932979011919">Votre entrée doit respecter le format LPA:1$<adresse smdp>$<code d'activation></translation> <translation id="1414315029670184034">Ne pas autoriser les sites à utiliser votre caméra</translation> <translation id="1414648216875402825">Vous passez à une version instable de <ph name="PRODUCT_NAME" /> qui contient des fonctionnalités en cours de développement. Des plantages et des bogues inattendus peuvent se produire. Nous vous recommandons d'agir avec précaution.</translation> <translation id="1415708812149920388">Accès en lecture au presse-papiers refusé</translation> @@ -1236,7 +1235,6 @@ <translation id="1972313920920745320">Les sites que vous ajoutez resteront toujours actifs et leur mémoire ne sera pas libérée. <ph name="BEGIN_LINK" />En savoir plus sur la façon de maintenir certains sites actifs<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Vous naviguerez plus rapidement parce que le contenu sera chargé à l'avance en fonction de la page Web que vous êtes en train de consulter</translation> <translation id="197288927597451399">Garder</translation> -<translation id="1973313062201924554">Les autorisations que vous accordez à <ph name="APP_NAME" /> seront également accordées à cette application.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> ne peut pas être téléchargé de manière sécuritaire. Appuyez sur Maj+F6 pour accéder à la barre des téléchargements.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Points de distribution de listes de révocation des certificats</translation> @@ -3923,7 +3921,6 @@ <translation id="4100733287846229632">L'appareil ne possède presque plus d'espace de stockage</translation> <translation id="4100853287411968461">Nouvelle limite de temps d'utilisation des écrans</translation> <translation id="4101352914005291489">SSID masqué</translation> -<translation id="4102469565336584882">Code incorrect. Votre entrée doit respecter le format LPA:1$<adresse smdp>$<code d'activation></translation> <translation id="4102906002417106771">Redémarrer l'appareil pour effectuer une réinitialisation Powerwash</translation> <translation id="4104163789986725820">E&xporter...</translation> <translation id="4104944259562794668">Vous pouvez l'activer plus tard dans Paramètres > Sécurité et confidentialité > Verrouiller l'écran et se connecter</translation> @@ -7075,7 +7072,6 @@ <translation id="6757431299485455321">Aider les autres appareils à détecter ce point d’accès.</translation> <translation id="6758056191028427665">Donnez-nous votre avis sur nos services.</translation> <translation id="6759193508432371551">Rétablir les paramètres par défaut</translation> -<translation id="6761431452438552910">Assurez-vous que votre appareil Bluetooth est en mode d'association et à proximité. Associez votre appareil uniquement à des appareils de confiance.</translation> <translation id="676158322851696513">« <ph name="EXTENSION_NAME" /> »</translation> <translation id="6762833852331690540">Activé</translation> <translation id="676560328519657314">Vos modes de paiement dans Google Pay</translation> @@ -7369,7 +7365,6 @@ <translation id="6979737339423435258">Toutes les périodes</translation> <translation id="6980402667292348590">insertion</translation> <translation id="6981553172137913845">Pour naviguer de manière anonyme, cliquez sur l'icône de menu à points pour ouvrir une fenêtre de navigation privée</translation> -<translation id="6981761993313539853">Assurez-vous que votre appareil Bluetooth est en mode d'association et à proximité. Associez votre appareil uniquement à des appareils de confiance. <ph name="BEGIN_LINK_LEARN_MORE" />En savoir plus<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Accessibilité</translation> <translation id="6983507711977005608">Se déconnecter du réseau de partage de connexion instantané</translation> <translation id="6983783921975806247">OID enregistré</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 4a93c81..01b0b9c 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -509,7 +509,6 @@ <translation id="1410797069449661718">Faire défiler vers le premier onglet</translation> <translation id="1410806973194718079">Impossible de vérifier les règles</translation> <translation id="1411400282355634827">Réinitialiser toutes les autorisations d'appareil Bluetooth ?</translation> -<translation id="1411724932979011919">Votre entrée devrait correspondre au format LPA:1$<adresse smdp>$<code d'activation></translation> <translation id="1414315029670184034">Ne pas autoriser les sites à utiliser votre caméra</translation> <translation id="1414648216875402825">Vous passez à une version instable de <ph name="PRODUCT_NAME" /> qui contient des fonctionnalités en cours de développement. Des plantages et des bugs inattendus peuvent se produire. Procédez avec prudence.</translation> <translation id="1415708812149920388">Accès en lecture au presse-papiers refusé</translation> @@ -1238,7 +1237,6 @@ <translation id="1972313920920745320">Les sites que vous ajoutez restent toujours actifs et ne sont pas libérés de la mémoire. <ph name="BEGIN_LINK" />Découvrez comment maintenir des sites spécifiques actifs<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Vous naviguerez plus rapidement, car le contenu sera chargé de manière proactive en fonction de la page Web que vous êtes en train de consulter</translation> <translation id="197288927597451399">Enregistrer</translation> -<translation id="1973313062201924554">Les autorisations que vous accordez à <ph name="APP_NAME" /> le seront également pour cette appli.</translation> <translation id="1973763416111613016">Impossible de télécharger <ph name="FILE_NAME" /> de manière sécurisée. Appuyez sur Maj+F6 pour accéder à la barre de téléchargements.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Points de distribution de listes de révocation des certificats</translation> @@ -3929,7 +3927,6 @@ <translation id="4100733287846229632">Très peu d'espace disponible sur l'appareil</translation> <translation id="4100853287411968461">Nouvelle limite du temps d'utilisation</translation> <translation id="4101352914005291489">SSID masqué</translation> -<translation id="4102469565336584882">Code non valide. Votre entrée devrait correspondre au format LPA:1$<adresse smdp>$<code d'activation></translation> <translation id="4102906002417106771">Redémarrer en mode Powerwash</translation> <translation id="4104163789986725820">E&xporter...</translation> <translation id="4104944259562794668">Vous pourrez l'activer plus tard dans Paramètres > Sécurité et confidentialité > Écran de verrouillage et connexion</translation> @@ -7088,7 +7085,6 @@ <translation id="6757431299485455321">Aidez d'autres appareils à détecter ce point d'accès.</translation> <translation id="6758056191028427665">Faites-nous part de vos commentaires.</translation> <translation id="6759193508432371551">Rétablir la configuration d'usine</translation> -<translation id="6761431452438552910">Assurez-vous que votre appareil Bluetooth est en mode association et à proximité. Associez uniquement des appareils de confiance.</translation> <translation id="676158322851696513"><ph name="EXTENSION_NAME" /></translation> <translation id="6762833852331690540">Activé</translation> <translation id="676560328519657314">Vos modes de paiement dans Google Pay</translation> @@ -7382,7 +7378,6 @@ <translation id="6979737339423435258">Toutes les données</translation> <translation id="6980402667292348590">Insérer</translation> <translation id="6981553172137913845">Pour parcourir le Web en mode privé, cliquez sur le menu à trois points afin d'ouvrir une fenêtre de navigation privée</translation> -<translation id="6981761993313539853">Assurez-vous que votre appareil Bluetooth est en mode association et à proximité. Associez uniquement des appareils de confiance. <ph name="BEGIN_LINK_LEARN_MORE" />En savoir plus<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Accessibilité</translation> <translation id="6983507711977005608">Se déconnecter du réseau utilisé pour le partage de connexion instantané</translation> <translation id="6983783921975806247">OID enregistré</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 415246a..d665704 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">Desprazar cara á primeira pestana</translation> <translation id="1410806973194718079">Non se puideron comprobar as políticas</translation> <translation id="1411400282355634827">Queres restablecer os permisos de todos os dispositivos Bluetooth?</translation> -<translation id="1411724932979011919">O código debería ter o formato LPA:1$<enderezo smdp>$<código de activación></translation> <translation id="1414315029670184034">Non permitir que os sitios utilicen a túa cámara</translation> <translation id="1414648216875402825">Estás actualizando unha versión inestable de <ph name="PRODUCT_NAME" /> que contén funcións que están en desenvolvemento. Produciranse fallos e erros inesperados. Utiliza esta versión con precaución.</translation> <translation id="1415708812149920388">Rexeitouse o acceso de lectura ao portapapeis</translation> @@ -1236,7 +1235,6 @@ <translation id="1972313920920745320">Os sitios que engadas sempre estarán activos e non se liberará a memoria que ocupen. <ph name="BEGIN_LINK" />Máis información sobre como manter activos sitios específicos<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Navegarás máis rápido porque o contido se cargará de maneira proactiva en función da túa visita á páxina web na que te atopes</translation> <translation id="197288927597451399">Continuar</translation> -<translation id="1973313062201924554">Os permisos que lle concedas a <ph name="APP_NAME" /> tamén se lle darán a esta aplicación.</translation> <translation id="1973763416111613016">O ficheiro <ph name="FILE_NAME" /> non se pode descargar de forma segura. Preme Maiús + F6 para acceder á área da barra de descargas.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Puntos de distribución CRL</translation> @@ -3930,7 +3928,6 @@ <translation id="4100733287846229632">O dispositivo ten pouquísimo espazo restante</translation> <translation id="4100853287411968461">Novo límite de tempo de uso da pantalla</translation> <translation id="4101352914005291489">SSID oculto</translation> -<translation id="4102469565336584882">O código non é válido. Debería ter o formato LPA:1$<enderezo smdp>$<código de activación></translation> <translation id="4102906002417106771">Reiniciar para usar a función Powerwash</translation> <translation id="4104163789986725820">E&xportar...</translation> <translation id="4104944259562794668">Podes activala máis tarde en Configuración > Seguranza e privacidade > Pantalla de bloqueo e inicio de sesión</translation> @@ -7083,7 +7080,6 @@ <translation id="6757431299485455321">Axuda a que outros dispositivos atopen esta zona wifi.</translation> <translation id="6758056191028427665">Indícanos o teu grao de satisfacción.</translation> <translation id="6759193508432371551">Restablecemento de fábrica</translation> -<translation id="6761431452438552910">Asegúrate de que o dispositivo Bluetooth teña activado o modo de vinculación e estea preto. Vincula só os dispositivos nos que confíes.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Si</translation> <translation id="676560328519657314">Os teus métodos de pago en Google Pay</translation> @@ -7377,7 +7373,6 @@ <translation id="6979737339423435258">Desde sempre</translation> <translation id="6980402667292348590">inserir</translation> <translation id="6981553172137913845">Se queres navegar de forma privada, fai clic no menú coa icona dos puntos para abrir unha ventá do modo de incógnito</translation> -<translation id="6981761993313539853">Asegúrate de que o dispositivo Bluetooth teña activado o modo de vinculación e estea preto. Vincula só os dispositivos nos que confíes. <ph name="BEGIN_LINK_LEARN_MORE" />Máis información<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Accesibilidade</translation> <translation id="6983507711977005608">Desconectar rede de conexión compartida instantánea</translation> <translation id="6983783921975806247">OID rexistrado</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 25f307d..9445b01 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">પહેલા ટૅબ તરફ સ્ક્રોલ કરો</translation> <translation id="1410806973194718079">પૉલિસીઓ ચેક કરી શકાતી નથી</translation> <translation id="1411400282355634827">બ્લૂટૂથ ડિવાઇસની બધી પરવાનગીઓ રીસેટ કરીએ?</translation> -<translation id="1411724932979011919">તમારી એન્ટ્રી આ ફૉર્મેટમાં હોવી જોઈએ LPA:1$<smdp ઍડ્રેસ>$<સક્રિયકરણનો કોડ></translation> <translation id="1414315029670184034">સાઇટને તમારા કૅમેરાનો ઉપયોગ કરવાની મંજૂરી આપશો નહીં</translation> <translation id="1414648216875402825">તમે <ph name="PRODUCT_NAME" />ના કામચલાઉ વર્ઝનમાં અપડેટ કરી રહ્યા છો, જે હજી વિકસી રહેલી સુવિધાઓ ધરાવે છે. ક્રેશ અને અનપેક્ષિત બગ આવશે. કૃપા કરીને સાવધાનીથી આગળ વધો.</translation> <translation id="1415708812149920388">ક્લિપબોર્ડ વાંચવાનો ઍક્સેસ નકારેલ છે</translation> @@ -1240,7 +1239,6 @@ <translation id="1972313920920745320">તમે ઉમેરો છો તે બધી સાઇટ હંમેશાં સક્રિય રહેશે અને તેમની મેમરી ખાલી કરવામાં આવશે નહીં. <ph name="BEGIN_LINK" />કેટલીક ચોક્કસ સાઇટને સક્રિય રાખવા વિશે વધુ જાણો<ph name="END_LINK" /></translation> <translation id="1972325230031091483">વેબપેજની તમારી વર્તમાન મુલાકાતના આધારે કન્ટેન્ટ સક્રિય રીતે લોડ કરવામાં આવતું હોવાને કારણે તમે વધુ ઝડપથી બ્રાઉઝ કરી શકશો</translation> <translation id="197288927597451399">Keep</translation> -<translation id="1973313062201924554">તમે <ph name="APP_NAME" /> માટે જે પરવાનગીઓ મંજૂર કરો છો, તે આ ઍપ માટે પણ મંજૂર કરવામાં આવશે.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> સુરક્ષિતપણે ડાઉનલોડ કરી શકાતી નથી. ડાઉનલોડ બાર વિભાગમાં પહોંચવા માટે Shift+F6 દબાવો.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL વિતરણ પૉઇન્ટ્સ</translation> @@ -3936,7 +3934,6 @@ <translation id="4100733287846229632">ઉપકરણ સ્થાન અત્યંત ઓછું છે</translation> <translation id="4100853287411968461">સ્ક્રીન સમયની નવી મર્યાદા</translation> <translation id="4101352914005291489">છુપાયેલા SSID</translation> -<translation id="4102469565336584882">અમાન્ય કોડ. તમારી એન્ટ્રી આ ફૉર્મેટમાં હોવી જોઈએ LPA:1$<smdp ઍડ્રેસ>$<સક્રિયકરણનો કોડ></translation> <translation id="4102906002417106771">પાવરવોશ માટે ફરી શરૂ કરો</translation> <translation id="4104163789986725820">નિ&કાસ કરો...</translation> <translation id="4104944259562794668">તમે પછીથી સેટિંગ > સુરક્ષા અને પ્રાઇવસી > લૉક સ્ક્રીન પર જઈને સાઇ ઇન કરીને તેને ચાલુ કરી શકો છો</translation> @@ -7098,7 +7095,6 @@ <translation id="6757431299485455321">આ હૉટસ્પૉટ શોધવામાં અન્ય ડિવાઇસની સહાય કરો.</translation> <translation id="6758056191028427665">અમને જણાવો કે અમે કેવું કાર્ય કરી રહ્યાં છીએ.</translation> <translation id="6759193508432371551">ફેક્ટરી ફરીથી સેટ કરો</translation> -<translation id="6761431452438552910">ખાતરી કરો કે તમારું બ્લૂટૂથ ડિવાઇસ જોડાણ બનાવવાના મોડમાં અને નજીકમાં છે. તમને વિશ્વાસ હોય તેવા ડિવાઇસ સાથે જ જોડાણ કરો.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">ચાલુ</translation> <translation id="676560328519657314">Google Payમાં તમારી ચુકવણી પદ્ધતિઓ</translation> @@ -7392,7 +7388,6 @@ <translation id="6979737339423435258">હંમેશાં</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">ખાનગી રીતે બ્રાઉઝ કરવા, છૂપી વિન્ડો ખોલવા માટે ડોટ આઇકનવાળા મેનૂ પર ક્લિક કરો</translation> -<translation id="6981761993313539853">ખાતરી કરો કે તમારું બ્લૂટૂથ ડિવાઇસ જોડાણ બનાવવાના મોડમાં અને નજીકમાં છે. તમને વિશ્વાસ હોય તેવા ડિવાઇસ સાથે જ જોડાણ કરો. <ph name="BEGIN_LINK_LEARN_MORE" />વધુ જાણો<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ઍક્સેસિબિલિટી</translation> <translation id="6983507711977005608">ઝટપટ ઇન્ટરનેટ શેર કરવાની સુવિધાનું નેટવર્ક ડિસકનેક્ટ કરો</translation> <translation id="6983783921975806247">નોંધાયેલ OID</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index cb2f547d..eb699c12 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -179,6 +179,7 @@ <translation id="1137673463384776352"><ph name="APP" /> में लिंक खोलें</translation> <translation id="1138686548582345331">{MUTED_NOTIFICATIONS_COUNT,plural, =1{नई सूचना}one{# नई सूचना}other{# नई सूचनाएं}}</translation> <translation id="1139923033416533844">स्टोरेज का इस्तेमाल</translation> +<translation id="1140131440257432230">साइटें आम तौर पर, संगीत बनाने और उसमें बदलाव करने की सुविधाओं के लिए, एमआईडीआई (म्यूज़िकल इंस्ट्रुमेंट डिजिटल इंटरफ़ेस) डिवाइसों का इस्तेमाल करती हैं</translation> <translation id="1140351953533677694">अपने ब्लूटूथ और Serial डिवाइस एक्सेस करें</translation> <translation id="114036956334641753">ऑडियो और कैप्शन</translation> <translation id="1141949282671776404">टैब का इस्तेमाल न होने पर, मेमोरी सेवर ने दूसरे कामों के लिए <ph name="MEMORY_VALUE" /> मेमोरी खाली की.</translation> @@ -435,6 +436,7 @@ <translation id="1340527397989195812">फ़ाइल ऐप्लिकेशन का उपयोग करके डिवाइस से मीडिया का बैक अप लें.</translation> <translation id="1341701348342335220">बढ़िया काम!</translation> <translation id="1341871421050612057"><ph name="USERNAME" /> के साथ सिंक नहीं किया जा सकता</translation> +<translation id="1342886103232377846">यह देखने के लिए कि पासवर्ड हैक या चोरी तो नहीं हुए हैं, Google Password Manager पर जाएं</translation> <translation id="1343865611738742294">Linux के ऐप्लिकेशन को यूएसबी डिवाइस ऐक्सेस करने की अनुमति दें. यूएसबी डिवाइस को हटाने के बाद Linux उसे याद नहीं रखेगा.</translation> <translation id="1343920184519992513">जहां आपने छोड़ा था वहीं से जारी रखें और पेजों के एक खास सेट को खोलें</translation> <translation id="1344141078024003905">आपकी स्क्रीन को कास्ट किया जा रहा है. आपके पास स्क्रीन कास्ट करने की प्रोसेस को कभी भी रोकने या बंद करने की सुविधा होती है.</translation> @@ -458,6 +460,7 @@ <translation id="1363585519747660921">यूएसबी प्रिंटर को कॉन्फ़िगर करना होगा</translation> <translation id="136378536198524553">एनर्जी सेवर चालू है</translation> <translation id="1368603372088757436">आपके <ph name="DEVICE_TYPE" /> पर, Linux काम नहीं करता. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> +<translation id="1370384480654163477">उन फ़ाइलों को देखें और उनमें बदलाव करें जिनकी अनुमति आपने पिछली बार इस साइट पर जाने के दौरान दी थी:</translation> <translation id="1372841398847029212">अपने खाते से सिंक करें</translation> <translation id="1373176046406139583">'किसको दिखाई दे' सेटिंग में जाकर, आप यह तय कर सकते हैं कि डिवाइस की स्क्रीन अनलॉक होने पर, कौन आपके साथ फ़ाइलें शेयर कर सकता है. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="1374844444528092021">नेटवर्क "<ph name="NETWORK_NAME" />" के लिए ज़रूरी प्रमाणपत्र या तो इंस्टॉल नहीं है या अब मान्य नहीं है. कृपया नया प्रमाणपत्र पाएं और फिर से कनेक्ट करने की कोशिश करें.</translation> @@ -480,6 +483,7 @@ <translation id="1388728792929436380">अपडेट पूरा होने पर <ph name="DEVICE_TYPE" /> रीस्टार्ट होगा.</translation> <translation id="1390113502208199250">Chrome Education Upgrade की सुविधाओं का इस्तेमाल करने के लिए, आपको इस डिवाइस को फ़ैक्ट्री रीसेट करना होगा.</translation> <translation id="139013308650923562">साइटों को आपके डिवाइस पर इंस्टॉल किए गए फ़ॉन्ट इस्तेमाल करने की अनुमति है</translation> +<translation id="1390306150250850355"><ph name="APP_TYPE" /> आपके <ph name="DEVICE_TYPE" /> पर पहले से इंस्टॉल है</translation> <translation id="1390548061267426325">नियमित टैब के रूप में खोलें</translation> <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> को <ph name="PRINTER_NAME" /> प्रिंट करने की अनुमति नहीं है. कृपया अपने एडमिन से संपर्क करें.</translation> <translation id="1392047138650695757">उपयोगकर्ता डिक्शनरी</translation> @@ -511,7 +515,6 @@ <translation id="1410797069449661718">स्क्रोल करके पहले टैब की ओर जाएं</translation> <translation id="1410806973194718079">नीतियों की जांच नहीं कर पाए</translation> <translation id="1411400282355634827">क्या आपको ब्लूटूथ डिवाइस की सभी अनुमतियां रीसेट करनी हैं?</translation> -<translation id="1411724932979011919">डाला गया कोड LPA:1$<smdp address>$<activation code> के फ़ॉर्मैट में होना चाहिए</translation> <translation id="1414315029670184034">साइटों को आपका कैमरा इस्तेमाल करने की अनुमति न दें</translation> <translation id="1414648216875402825">आप <ph name="PRODUCT_NAME" /> के ऐसे अस्थिर वर्शन में अपडेट कर रहे हैं जिसकी सुविधाओं पर काम चल रहा है. क्रैश और अप्रत्याशित बग उत्पन्न होंगे. कृपया सावधानी से आगे बढ़ें.</translation> <translation id="1415708812149920388">क्लिपबोर्ड की सामग्री पढ़ने का एक्सेस देने से मना किया गया</translation> @@ -717,6 +720,7 @@ <translation id="1570235441606255261">Steam इंस्टॉलर</translation> <translation id="1570604804919108255">सूचनाएं अनम्यूट करें</translation> <translation id="1570990174567554976">'<ph name="BOOKMARK_TITLE" />' बुकमार्क फ़ोल्डर बनाया गया.</translation> +<translation id="1571041387761170095">कोई कमज़ोर या ऐसा पासवर्ड नहीं है जिसका इस्तेमाल एक से ज़्यादा खातों के लिए किया गया है</translation> <translation id="1571304935088121812">उपयोगकर्ता नाम की कॉपी करें</translation> <translation id="1571738973904005196">टैब देखें: <ph name="TAB_ORIGIN" /></translation> <translation id="1572139610531470719"><ph name="WINDOW_TITLE" /> (मेहमान)</translation> @@ -924,6 +928,7 @@ <translation id="1709972045049031556">फ़ाइल शेयर नहीं की जा सकती</translation> <translation id="1714644264617423774">अपने डिवाइस को आसानी से इस्तेमाल करने के लिए सुलभता सुविधाएं चालू करें. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="1716034099915639464">क्या आपको <ph name="SITE_NAME" /> और इसके इंस्टॉल किए गए ऐप्लिकेशन के लिए, साइट डेटा और अनुमतियां मिटानी हैं?</translation> +<translation id="171826447717908393">आइसोलेटेड वेब ऐप्लिकेशन (बीटा वर्शन)</translation> <translation id="1718835860248848330">पिछला घंटा</translation> <translation id="1719312230114180055">ध्यान दें: आपका फ़िंगरप्रिंट किसी मज़बूत पासवर्ड या पिन की तुलना में कम सुरक्षित हो सकता है.</translation> <translation id="1720318856472900922">TLS WWW सर्वर प्रमाणीकरण</translation> @@ -1247,10 +1252,12 @@ <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation> <translation id="1969550816138571473">तैयार किया जा रहा है</translation> <translation id="1969654639948595766">WebRTC लेख लॉग (<ph name="WEBRTC_TEXT_LOG_COUNT" />)</translation> +<translation id="1970895205072379091"><ph name="BEGIN_PARAGRAPH1" />अपने ChromeOS डिवाइसों पर, अपने-आप रिपोर्ट भेजने की सुविधा चालू करने से, हमें यह समझने में मदद मिलती है कि ChromeOS की किन गड़बड़ियों को सबसे पहले ठीक करना है और किन चीज़ों को बेहतर बनाना है. इन रिपोर्ट में बहुत सी जानकारी शामिल हो सकती है. जैसे, ChromeOS कब-कब क्रैश होता है, इसकी कौनसी सुविधाएं इस्तेमाल की जाती हैं, और आम तौर पर कितनी मेमोरी इस्तेमाल होती है. इकट्ठा किए गए कुछ डेटा से, Google के ऐप्लिकेशन और Android डेवलपर जैसे पार्टनर को मदद मिलेगी. ऐप्लिकेशन सिंक करने की सुविधा चालू होने पर, ऐप्लिकेशन की परफ़ॉर्मेंस और इस्तेमाल से जुड़ी अन्य जानकारी भी इकट्ठा की जाएगी. सिंक करने की सुविधा चालू होने पर, यह जानकारी सिंक किए गए Android ऐप्लिकेशन और वेब ऐप्लिकेशन के लिए भी इकट्ठा की जाएगी.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />ChromeOS डिवाइस की सेटिंग में जाकर, अपने-आप रिपोर्ट भेजने की इस सुविधा को किसी भी समय चालू या बंद किया जा सकता है. अगर आप एक डोमेन एडमिन हैं, तो Admin console में जाकर इस सेटिंग को बदला जा सकता है.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />अगर आपके Google खाते की वेब और ऐप्लिकेशन गतिविधि वाली सेटिंग चालू है, तो आपके Android डिवाइस का डेटा आपके Google खाते में सेव हो सकता है. account.google.com पर जाकर, अपने डेटा को देखा और मिटाया जा सकता है. साथ ही, अपने खाते की सेटिंग बदली जा सकती हैं.<ph name="END_PARAGRAPH3" /></translation> <translation id="1972313920920745320">आपने जो साइटें जोड़ी हैं वे हमेशा ऐक्टिव रहेंगी. साथ ही, उनकी मेमोरी को खाली नहीं किया जाएगा. <ph name="BEGIN_LINK" />चुनिंदा साइटों को ऐक्टिव रखने के बारे में ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="1972325230031091483">आपको ज़्यादा तेज़ी से ब्राउज़ करने का अनुभव मिलता है, क्योंकि कॉन्टेंट आपके हाल ही में देखे गए वेब पेज के हिसाब से लोड होता है</translation> <translation id="197288927597451399">रखें</translation> -<translation id="1973313062201924554">आपने <ph name="APP_NAME" /> को जो अनुमतियां दी हैं वे इस ऐप्लिकेशन के लिए भी लागू होंगी.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> को सुरक्षित तरीके से डाउनलोड नहीं किया जा सकता. डाउनलोड बार वाले हिस्से पर जाने के लिए Shift+F6 दबाएं.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL वितरण बिंदु</translation> @@ -1282,6 +1289,7 @@ <translation id="1988259784461813694">ज़रूरी शर्त</translation> <translation id="1988733631391393183">ChromeVox मेन्यू में ब्रेल निर्देश दिखाएं</translation> <translation id="1989112275319619282">ब्राउज़ करें</translation> +<translation id="1989288015781834552">अपडेट करने के लिए फिर से लॉन्च करें. आपके टैब फिर से खुल जाएंगे.</translation> <translation id="1989601282983766341">ऐप्लिकेशन की सूचनाएं मैनेज करें, परेशान न करें, और ऐप्लिकेशन बैजिंग</translation> <translation id="1989903373608997757">हमेशा इस्तेमाल करें</translation> <translation id="1990046457226896323">स्पीच फ़ाइलें डाउनलोड हो गईं</translation> @@ -1320,6 +1328,7 @@ <translation id="2019718679933488176">ऑडियो नए टैब में &खोलें</translation> <translation id="2020183425253392403">नेटवर्क पता सेटिंग दिखाएं</translation> <translation id="2020225359413970060">फ़ाइल को स्कैन करें</translation> +<translation id="2020779321517562133">कॉपी हटाएं</translation> <translation id="2023042679320690325">डेटा का गलत इस्तेमाल होने पर, <ph name="BRAND" /> आपके पासवर्ड की जांच नहीं कर सकता. 24 घंटे बाद फिर से कोशिश करें.</translation> <translation id="2023167225947895179">पिन का अनुमान लगाना आसान हो सकता है</translation> <translation id="202352106777823113">डाउनलोड बहुत ज़्यादा समय ले रहा था और उसे नेटवर्क द्वारा रोक दिया गया था.</translation> @@ -1986,6 +1995,7 @@ <translation id="2519250377986324805">इसका तरीका देखें</translation> <translation id="2519517390894391510">प्रमाणपत्र वाली प्रोफ़ाइल का नाम</translation> <translation id="2520644704042891903">उपलब्ध सॉकेट की प्रतीक्षा की जा रही है...</translation> +<translation id="2521427645491031107">ऐप्लिकेशन सिंक करने की सुविधा, डिवाइस की सेटिंग में सेट की गई है</translation> <translation id="2521854691574443804">आपके संगठन की सुरक्षा नीतियों के मुताबिक <ph name="FILE_NAME" /> की जांच की जा रही है...</translation> <translation id="2523184218357549926">आप जिन पेजों पर जाते हैं उनके यूआरएल Google को भेजती है</translation> <translation id="252418934079508528"><ph name="DEVICE_OS" /> को इंस्टॉल करें</translation> @@ -2785,6 +2795,7 @@ <translation id="3166443275568926403">परफ़ॉर्मेंस और बैटरी की स्थिति</translation> <translation id="3169930038976362151">अपनी ज़रूरतों के मुताबिक थीम चुनें. अपनी थीम, वॉलपेपर, स्क्रीन सेवर वगैरह बदलने के लिए, बस डेस्कटॉप पर बटन को दबाकर रखें.</translation> <translation id="3170072451822350649">आप प्रवेश करना छोड़ भी सकते हैं और <ph name="LINK_START" />अतिथि के रूप में ब्राउज़<ph name="LINK_END" /> कर सकते हैं.</translation> +<translation id="3177430966804511955">आइसोलेटेड वेब ऐप्लिकेशन मैनेज करें (बीटा वर्शन)</translation> <translation id="31774765611822736">बाईं ओर का नया टैब</translation> <translation id="3177909033752230686">पेज की भाषा:</translation> <translation id="3177914167275935955">आपके डिवाइस में Chrome Education Upgrade शामिल है, लेकिन आपका उपयोगकर्ता नाम किसी Google for Education खाते से जुड़ा हुआ नहीं है. कृपया किसी दूसरे डिवाइस से g.co/workspace/edusignup पर जाकर, Google for Education खाता बनाएं.</translation> @@ -2803,10 +2814,14 @@ <translation id="3188465121994729530">गतिशील औसत</translation> <translation id="3189187154924005138">बड़ा कर्सर</translation> <translation id="3190558889382726167">पासवर्ड सेव किया गया</translation> +<translation id="3191625924275846436">{NUM_SITES,plural, =1{आपने हाल ही में इस साइट का इस्तेमाल नहीं किया है, इसलिए इस साइट को दी गई अनुमतियां हटा दी गई हैं. ऐसा आपके डेटा को सुरक्षित रखने के लिए किया गया है}one{आपने हाल ही में इस साइट का इस्तेमाल नहीं किया है, इसलिए इस साइट को दी गई अनुमतियां हटा दी गई हैं. ऐसा आपके डेटा को सुरक्षित रखने के लिए किया गया है}other{आपने हाल ही में इन साइटों का इस्तेमाल नहीं किया है, इसलिए इन साइटों को दी गई अनुमतियां हटा दी गई हैं. ऐसा आपके डेटा को सुरक्षित रखने के लिए किया गया है}}</translation> <translation id="3192947282887913208">ऑडियो फ़ाइलें</translation> <translation id="3193695589337931419">सिस्टम सिग्नल यूटिलिटी</translation> <translation id="3194786596445804250">तीसरे पक्ष की कुकी को ब्लॉक करने से जुड़ी जानकारी दिखाएं</translation> <translation id="3197453258332670132">दायां क्लिक करने या दबाकर रखने पर, आपके चुने गए टेक्स्ट से जुड़ी जानकारी दिखती है</translation> +<translation id="3198487209506801480"><ph name="BEGIN_PARAGRAPH1" />ChromeOS डिवाइसों पर, अपने-आप रिपोर्ट भेजने की सुविधा चालू करने से, हमें यह समझने में मदद मिलती है कि ChromeOS की किन गड़बड़ियों को सबसे पहले ठीक करना है और किन चीज़ों को बेहतर बनाना है. इन रिपोर्ट में बहुत सी जानकारी शामिल हो सकती है. जैसे, ChromeOS कब-कब क्रैश होता है, इसकी कौनसी सुविधाएं इस्तेमाल की जाती हैं, और आम तौर पर कितनी मेमोरी इस्तेमाल होती है. इकट्ठा किए गए कुछ डेटा से, Google के ऐप्लिकेशन और Android डेवलपर जैसे पार्टनर को मदद मिलेगी. ऐप्लिकेशन सिंक करने की सुविधा चालू होने पर, ऐप्लिकेशन की परफ़ॉर्मेंस और इस्तेमाल से जुड़ी अन्य जानकारी भी इकट्ठा की जाएगी. सिंक करने की सुविधा चालू होने पर, यह जानकारी सिंक किए गए Android ऐप्लिकेशन और वेब ऐप्लिकेशन के लिए भी इकट्ठा की जाएगी.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />अपने बच्चे के ChromeOS डिवाइस की सेटिंग में जाकर, अपने-आप रिपोर्ट भेजने की इस सुविधा को किसी भी समय चालू या बंद किया जा सकता है. अगर आप एक डोमेन एडमिन हैं, तो Admin console में जाकर इस सेटिंग को बदला जा सकता है.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH4" />अगर आपके बच्चे के Google खाते में, वेब और ऐप्लिकेशन गतिविधि से जुड़ी सेटिंग चालू है, तो उसके डिवाइस का डेटा उसके Google खाते में सेव हो सकता है. इन सेटिंग के बारे में और इन्हें अपने हिसाब से सेट करने के तरीके के बारे में ज़्यादा जानने के लिए, families.google.com पर जाएं.<ph name="END_PARAGRAPH4" /></translation> <translation id="3199127022143353223">सर्वर</translation> <translation id="3199637719075529971">यह टैब किसी सीरियल पोर्ट से कनेक्ट है</translation> <translation id="3200061262156232574">आपके शॉपिंग कार्ट में</translation> @@ -3254,6 +3269,7 @@ <translation id="3569614820047645079">'मेरी ड्राइव' में मौजूद फ़ाइलें, आपके Chromebook से अपने-आप सिंक हो जाती हैं. इससे उन फ़ाइलों को, बिना इंटरनेट कनेक्शन के ऐक्सेस किया जा सकता है.</translation> <translation id="3569682580018832495"><ph name="ORIGIN" /> नीचे दी गई फ़ाइलों और फ़ोल्डर काे देख सकती है</translation> <translation id="3571734092741541777">सेट अप करें</translation> +<translation id="3574433798725498842">इन साइटों को आपके एमआईडीआई डिवाइसों का इस्तेमाल करने की अनुमति है</translation> <translation id="3575121482199441727">इस साइट के लिए सूचनाओं को अनुमति दें</translation> <translation id="3577473026931028326">कोई गड़बड़ी हुई. फिर से कोशिश करें.</translation> <translation id="3577487026101678864">फ़ाइल सिंक करने की सुविधा चालू है</translation> @@ -3307,6 +3323,7 @@ <translation id="3617891479562106823">बैकग्राउंड उपलब्ध नहीं हैं. बाद में फिर से कोशिश करें.</translation> <translation id="3618286417582819036">माफ़ करें, कोई गड़बड़ी हुई</translation> <translation id="3619115746895587757">कैपुचिनो</translation> +<translation id="3619294456800709762">साइटें, अपने-आप 'पिक्चर में पिक्चर' मोड में जा सकती हैं</translation> <translation id="3620136223548713675">भौगोलिक स्थान</translation> <translation id="3621202678540785336">इनपुट</translation> <translation id="3621807901162200696">ChromeOS की सुविधाओं और परफ़ॉर्मेंस को बेहतर बनाने में मदद करें</translation> @@ -3471,6 +3488,7 @@ <translation id="3742666961763734085">इस नाम की संगठनात्मक इकाई नहीं मिल पा रही है. कृपया फिर से कोशिश करें.</translation> <translation id="3743842571276656710"><ph name="DEVICE_NAME" /> के साथ जुड़ने के लिए पिन डालें</translation> <translation id="3744219658596020825">आपके पासवर्ड इंपोर्ट नहीं किए जा सके</translation> +<translation id="3744566206584015048">इन साइटों को आपके एमआईडीआई डिवाइसों का इस्तेमाल करने की अनुमति नहीं है</translation> <translation id="3747077776423672805">ऐप्लिकेशन हटाने के लिए, सेटिंग > 'Google Play Store' > Android से जुड़ी पसंद प्रबंधित करें > ऐप्लिकेशन या ऐप्लिकेशन मैनेजर पर जाएं. उसके बाद उस ऐप्लिकेशन पर टैप करें जिसे आप अनइंस्टॉल करना चाहते हैं (ऐप्लिकेशन ढूंढने के लिए आपको दाएं या बाएं स्वाइप करना पड़ सकता है). फिर 'अनइंस्टॉल करें' या 'बंद करें' पर टैप करें.</translation> <translation id="3748424433435232460">इस खाते का पासवर्ड, पहले से ही इस डिवाइस पर सेव है</translation> <translation id="3748706263662799310">बग की रिपोर्ट करें</translation> @@ -3506,6 +3524,7 @@ <translation id="3765696567014520261">अलग-अलग साइटों पर की गई आपकी ब्राउज़िंग गतिविधि देखने के लिए साइटें, कुकी का इस्तेमाल नहीं कर सकतीं. जैसे, दिलचस्पी के मुताबिक विज्ञापन दिखाने के लिए. शायद कुछ साइटों पर ये सुविधाएं काम न करें</translation> <translation id="3766687283066842296">फ़ोन हब के बारे में ज़्यादा जानें</translation> <translation id="3766811143887729231"><ph name="REFRESH_RATE" /> हर्ट्ज़</translation> +<translation id="3767835232661747729">फ़िलहाल, सिर्फ़ फ़ैमिली ग्रुप के सदस्यों के साथ पासवर्ड शेयर किए जा सकते हैं. अपने ग्रुप में शामिल करने के लिए, <ph name="BEGIN_LINK" />फ़ैमिली ग्रुप के सदस्यों को न्योता भेजें<ph name="END_LINK" />. इससे आपको Google के सभी प्लैटफ़ॉर्म पर ली गई सदस्यताओं और प्रॉडक्ट का ज़्यादा से ज़्यादा फ़ायदा मिलेगा.</translation> <translation id="377050016711188788">आइसक्रीम</translation> <translation id="3771290962915251154">यह सेटिंग बंद है, क्योंकि 'माता-पिता के नियंत्रण में' सुविधा चालू है</translation> <translation id="3771294271822695279">वीडियो फ़ाइलें</translation> @@ -3732,6 +3751,7 @@ <translation id="3930737994424905957">डिवाइस खोजे जा रहे हैं</translation> <translation id="3930968231047618417">बैकग्राउंड का रंग</translation> <translation id="3932356525934356570"><ph name="EXTENSION_NAME" /> को पिन करें</translation> +<translation id="3933121352599513978">अनचाहे अनुरोधों को हटाएं (सुझाया गया)</translation> <translation id="3936260554100916852"><ph name="DEVICE_NAME" /> आपके साथ वाई-फ़ाई नेटवर्क शेयर कर रहा है</translation> <translation id="3936390757709632190">ऑडियो नए टैब में &खोलें</translation> <translation id="3936925983113350642"> चुने जाने वाले पासवर्ड की आवश्यकता इस प्रमाणपत्र को बाद में फिर से स्थापित करने के लिए होगी. कृपया इसे कहीं पर सुरक्षित रखें.</translation> @@ -3916,6 +3936,7 @@ <translation id="4085298594534903246">इस पेज पर JavaScript को अवरोधित कर दिया गया था.</translation> <translation id="4085566053793776107">थीम को पसंद के मुताबिक बनाएं</translation> <translation id="4085620044235559093"><ph name="FILE_TYPE" /> फ़ाइलों को खोलने के लिए, कोई ऐप्लिकेशन चुनें</translation> +<translation id="4086041296339853919">साइटों को अपने एमआईडीआई डिवाइसों का इस्तेमाल करने की अनुमति न दें</translation> <translation id="4087089424473531098">एक्सटेंशमन बनाया गया: <ph name="EXTENSION_FILE" /></translation> @@ -3942,7 +3963,6 @@ <translation id="4100733287846229632">डिवाइस में बहुत ही कम स्थान बचा है</translation> <translation id="4100853287411968461">किसी डिवाइस के इस्तेमाल में बीते समय की नई सीमा</translation> <translation id="4101352914005291489">छिपा हुआ SSID</translation> -<translation id="4102469565336584882">कोड अमान्य है. डाला गया कोड LPA:1$<smdp address>$<activation code> के फ़ॉर्मैट में होना चाहिए</translation> <translation id="4102906002417106771">पावरवॉश के लिए रीस्टार्ट करें</translation> <translation id="4104163789986725820">नि&र्यात करें...</translation> <translation id="4104944259562794668">इसे बाद, 'सेटिंग > सुरक्षा और निजता > स्क्रीन लॉक करें और साइन इन करें' में जाकर इसे चालू करें</translation> @@ -4336,6 +4356,7 @@ <translation id="4430422687972614133">वर्चुअल कार्ड चालू करें</translation> <translation id="4432621511648257259">पासवर्ड गलत है</translation> <translation id="443454694385851356">विरासती (असुरक्षित)</translation> +<translation id="4434611816075088065">फ़िलहाल, आपको कोई और कार्रवाई करने की ज़रूरत नहीं है</translation> <translation id="443475966875174318">उन ऐप्लिकेशन को अपडेट करें या हटाएं, जो मेल नहीं खाती हैं</translation> <translation id="4438043733494739848">पारदर्शी</translation> <translation id="4441124369922430666">क्या आप चाहते हैं कि मशीन चालू होने पर यह ऐप्लिकेशन अपने आप शुरू हो जाए?</translation> @@ -4491,6 +4512,7 @@ <translation id="4565917129334815774">सिस्टम लॉग सेव करें</translation> <translation id="4566170377336116390">अगर डिवाइस का नाम दर्ज करने के बाद इसे बदलना है, तो आपको अपने डिवाइस को फ़ैक्ट्री रीसेट (पावरवॉश) करना होगा.</translation> <translation id="4566417217121906555">माइक्रोफ़ोन को म्यूट करें</translation> +<translation id="4566762846886188693">आपके डेटा की सुरक्षा के लिए, उन साइटों को दी गई अनुमतियां हटाएं जिनका आपने हाल ही में इस्तेमाल नहीं किया है. इससे सूचनाएं पाने की सुविधा बंद नहीं होती.</translation> <translation id="456717285308019641">उस पेज की भाषा जिसका अनुवाद करना है</translation> <translation id="4567512141633030272">साइन इन करने का तरीका गलत है?</translation> <translation id="4567533462991917415">सेट अप करने के बाद आप जब चाहें, ज़्यादा लोगों को जोड़ सकते हैं. हर व्यक्ति अपने खाते को मनमुताबिक बना सकता है और डेटा को निजी रख सकता है.</translation> @@ -4653,6 +4675,7 @@ <translation id="4693155481716051732">सुशी</translation> <translation id="4694024090038830733">प्रिंटर कॉन्फ़िगरेशन का काम एडमिन संभालता है.</translation> <translation id="4694604912444486114">बंदर</translation> +<translation id="4695318956047767909">गहरे रंग वाली थीम, स्क्रीन सेवर</translation> <translation id="4697071790493980729">कोई भी नतीजा नहीं मिला</translation> <translation id="4697551882387947560">ब्राउज़िंग सत्र के खत्म होने पर</translation> <translation id="469838979880025581">साइटें आपके माइक्रोफ़ोन का इस्तेमाल करने के लिए पूछ सकती हैं</translation> @@ -5072,6 +5095,7 @@ <translation id="5067399438976153555">हमेशा चालू</translation> <translation id="5067867186035333991">अगर <ph name="HOST" /> आपका कैमरा एक्सेस करना चाहे, तो इसके लिए पूछें</translation> <translation id="5068553687099139861">पासवर्ड दिखाना</translation> +<translation id="506886127401228110">आइसोलेटेड वेब ऐप्लिकेशन चालू करें</translation> <translation id="5068919226082848014">पिज़्ज़ा</translation> <translation id="506934332411950286">आपके Android फ़ोन से, वाई-फ़ाई के क्रेडेंशियल ट्रांसफ़र किए जा रहे हैं</translation> <translation id="5070710277167211639">नेविगेशन को एचटीटीपीएस पर अपग्रेड करें. ऐसा करने से, आपको उन साइटों को लोड करने से पहले चेतावनी मिलेगी जो एचटीटीपीएस पर काम नहीं करतीं</translation> @@ -5523,6 +5547,7 @@ <translation id="5441466871879044658">इस भाषा में अनुवाद करें</translation> <translation id="5442228125690314719">डिस्क इमेज बनाते समय गड़बड़ी हुई. कृपया फिर से कोशिश करें.</translation> <translation id="5442550868130618860">अपने आप होने वाले अपडेट चालू करें</translation> +<translation id="5444281205834970653">मिटाएं और जारी रखें</translation> <translation id="5445400788035474247">10x</translation> <translation id="5446983216438178612">संगठन के लिए प्रमाणपत्र दिखाएं</translation> <translation id="5447384712203291074"><ph name="ITEM_COUNT_MULTIPLE" /> आइटम</translation> @@ -5875,6 +5900,7 @@ <translation id="5740709157181662145"><ph name="DEVICE_OS" /> के हार्डवेयर के साथ-साथ हैंग और क्रैश होने जैसी गड़बड़ियों से जुड़ा डेटा</translation> <translation id="574104302965107104">डिसप्ले स्क्रीन शेयर करना</translation> <translation id="574209121243317957">पिच</translation> +<translation id="5742787970423162234">बेहतर सुविधाओं वाले पैकेज किए गए वेब ऐप्लिकेशन. <ph name="BEGIN_LINK_LEARN_MORE" />ज़्यादा जानें<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="5743501966138291117">अपने-आप अनलॉक होने की सुविधा इस्तेमाल करने के लिए, पिन 12 या उससे कम अंकों का होना चाहिए</translation> <translation id="5745316408658560138">Chrome को आपके कार्ट पर, आपके हिसाब से छूट का पता लगाने दें?</translation> <translation id="5746169159649715125">PDF के रूप में सेव करें</translation> @@ -6279,6 +6305,7 @@ <translation id="6071181508177083058">पासवर्ड की पुष्टि करें</translation> <translation id="6071576563962215370">सिस्टम, डिवाइस इंस्टॉलेशन-समय विशेषता लॉक को स्थापित नहीं कर सका.</translation> <translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> मेमोरी बचाई गई</translation> +<translation id="6071995715087444295">पासवर्ड के हैक या चोरी होने का पता लगाने के लिए, अपने Google खाते में साइन इन करें</translation> <translation id="6072442788591997866">इस डिवाइस पर <ph name="APP_NAME" /> को अनुमति नहीं है. अपने एडमिन से संपर्क करें. गड़बड़ी कोड: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">रिकॉर्डिंग बंद करें</translation> <translation id="6073903501322152803">सुलभता सुविधाएं जोड़ें</translation> @@ -6807,6 +6834,7 @@ <translation id="6513247462497316522">अगर आप किसी अन्य नेटवर्क से कनेक्ट न हों तो Google Chrome मोबाइल डेटा का उपयोग करेगा.</translation> <translation id="6514010653036109809">उपलब्ध डिवाइस:</translation> <translation id="6514565641373682518">इस पेज ने आपका माउस कर्सर अक्षम कर दिया है.</translation> +<translation id="6517227424170598783">क्या आपको "<ph name="SHORTCUT_NAME" /> - <ph name="APP_NAME" />" शॉर्टकट हटाना है?</translation> <translation id="6517420300299531857">'मेरी ड्राइव' में मौजूद फ़ाइलें, आपके Chromebook से अपने-आप सिंक हो जाती हैं. इससे उन फ़ाइलों को, बिना इंटरनेट कनेक्शन के ऐक्सेस किया जा सकता है. इससे करीब, <ph name="REQUIRED_SPACE" /> स्टोरेज का इस्तेमाल होगा. फ़िलहाल, आपके पास <ph name="FREE_SPACE_AVAILABLE" /> स्टोरेज उपलब्ध है.</translation> <translation id="6517709704288360414">हो सकता है कि आपका डिवाइस ठीक से काम न करे. इसके अलावा, आपको सुरक्षा और परफ़ॉर्मेंस से जुड़ी समस्याएं आ सकती हैं. किसी गड़बड़ी का सामना करने पर, उपयोगकर्ताओं के पास कानूनी दावा करने का अधिकार होता है. हालांकि, अपडेट की सुविधा बंद करने पर, हो सकता है कि आप ऐसा न कर पाएं.</translation> <translation id="6518014396551869914">इमेज को कॉपी करें</translation> @@ -6910,6 +6938,7 @@ <translation id="6593881952206664229">हो सकता है कि कॉपीराइट वाला मीडिया न चले</translation> <translation id="6594011207075825276">क्रम से लगाए गए डिवाइस ढूंढे जा रहे हैं...</translation> <translation id="6595187330192059106"><ph name="HOST" /> को, MIDI डिवाइस का पूरा कंट्रोल रखने से हमेशा रोकें.</translation> +<translation id="6595322909015878027">इन साइटों को अपने-आप 'पिक्चर में पिक्चर' मोड में जाने की अनुमति नहीं है</translation> <translation id="6595408197871512625">{COUNT,plural, =1{हैक किए गए या चोरी हुए पासवर्ड को बदल दिया गया है. आपका # और पासवर्ड या तो हैक हुआ है या चोरी हुआ है. Google Password Manager, इस पासवर्ड को तुरंत बदलने का सुझाव देता है.}one{हैक किए गए या चोरी हुए पासवर्ड को बदल दिया गया है. @@ -6985,6 +7014,7 @@ <translation id="6654509035557065241">नेटवर्क चुनें</translation> <translation id="6655190889273724601">डेवलपर मोड</translation> <translation id="6655458902729017087">खाते छिपाएं</translation> +<translation id="6657180931610302174">उपयोगकर्ता नाम जोड़ना है?</translation> <translation id="6657585470893396449">पासवर्ड</translation> <translation id="6659213950629089752">इस पेज को "<ph name="NAME" />" एक्सटेंशन द्वारा ज़ूम किया गया था</translation> <translation id="6659594942844771486">ब्राउज़र टैब</translation> @@ -7004,6 +7034,7 @@ <translation id="6671320560732140690">{COUNT,plural, =1{एक पता}one{# पता}other{# पते}}</translation> <translation id="6671497123040790595"><ph name="MANAGER" />, मैनेजमेंट को सेट अप कर रहा है</translation> <translation id="6672917148207387131"><ph name="DOMAIN" /> जोड़ें</translation> +<translation id="6673353404516008367">गुप्त मोड, आपका डिवाइस इस्तेमाल करने वाले <ph name="BEGIN_LINK" />अन्य लोगों से आपका ब्राउज़िंग डेटा निजी रखता है<ph name="END_LINK" /></translation> <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation> <translation id="6673797129585578649">बैटरी लाइफ़ बढ़ाने के लिए स्क्रीन की रोशनी घटाएं, बैकग्राउंड में होने वाली गतिविधि, और विज़ुअल इफ़ेक्ट कम करें. साथ ही, सूचनाएं मिलने में देरी और Chrome की एनर्जी सेवर सुविधा को चालू करें.</translation> <translation id="6674571176963658787">इसे चालू करने के लिए, अपना लंबा पासवर्ड डालें</translation> @@ -7098,7 +7129,6 @@ <translation id="6757431299485455321">इस हॉटस्पॉट को खोजने में अन्य डिवाइसों की मदद करें.</translation> <translation id="6758056191028427665">हमें बताएं कि हम कैसा प्रदर्शन कर रहे हैं.</translation> <translation id="6759193508432371551">फैक्टरी रीसेट करें</translation> -<translation id="6761431452438552910">पक्का करें कि आपका ब्लूटूथ डिवाइस, दूसरे डिवाइस से जोड़ने वाले मोड में है और आस-पास है. सिर्फ़ भरोसेमंद डिवाइसों के साथ ही जोड़ें.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">चालू है</translation> <translation id="676560328519657314">Google Pay में पैसे चुकाने के तरीके</translation> @@ -7143,6 +7173,7 @@ <translation id="6794511157503068">अगर <ph name="APP_NAME" /> के लिए आपकी पासकी, यूएसबी वाली सुरक्षा कुंजी पर है, तो उसे अभी लगाएं और छुएं</translation> <translation id="679486139907144816">पासकी से इस साइट में साइन इन करने के लिए, सेटिंग में जाकर Windows Hello को चालू करें. इसके बाद, इस साइट पर वापस आकर फिर से कोशिश करें.</translation> <translation id="6795371939514004514">अपने-आप स्कैन होने की सुविधा, आपको स्क्रीन पर दिए अलग-अलग आइटम पर अपने-आप जाने देती है. जब किसी आइटम को हाइलाइट किया गया हो, तो इसे चालू करने के लिए, “चुनें” को दबाएं.</translation> +<translation id="6795756089603286506">साइटें आपके एमआईडीआई डिवाइसों का इस्तेमाल करने की अनुमति मांग सकती हैं</translation> <translation id="6795884519221689054">पांडा</translation> <translation id="6796509790850723820">ग्राफ़ बनाएं</translation> <translation id="6797493596609571643">ओह! कुछ गड़बड़ी हो गई है.</translation> @@ -7262,6 +7293,7 @@ <translation id="6867086642466184030">अन्य ऐप्लिकेशन, <ph name="APP_NAME" /> की तरह उन लिंक को खोलने के लिए तैयार हैं. यह <ph name="APP_NAME_2" />, <ph name="APP_NAME_3" />, <ph name="APP_NAME_4" />, और <ph name="NUMBER_OF_OTHER_APPS" /> अन्य ऐप्लिकेशन को सहायता लिंक खोलने से रोकता है.</translation> <translation id="6867400383614725881">नया गुप्त टैब</translation> <translation id="686831807558000905">साइन इन न करें</translation> +<translation id="686839242150793617">इन साइटों को अपने-आप 'पिक्चर में पिक्चर' मोड में जाने की अनुमति है</translation> <translation id="6868934826811377550">जानकारी देखें</translation> <translation id="6871644448911473373">OCSP प्रतिसादी: <ph name="LOCATION" /></translation> <translation id="6872781471649843364">आपने जो पासवर्ड डाला है उसे सर्वर ने अस्वीकार कर दिया है.</translation> @@ -7320,6 +7352,7 @@ <translation id="6923132443355966645">स्क्रोल करें / क्लिक करें</translation> <translation id="6923633482430812883">शेयर माउंट करने में गड़बड़ी. कृपया जाँचें कि आप जिस फ़ाइल सर्वर से कनेक्ट कर रहे हैं वह SMBv2 या उसके बाद के वर्शन पर काम करता है.</translation> <translation id="6925127338315966709">आप इस ब्राउज़र पर, एक मैनेज की जा रही प्रोफ़ाइल जोड़ रहे हैं. इस प्रोफ़ाइल को आपका एडमिन कंट्रोल करता है और इसका डेटा ऐक्सेस कर सकता है. बुकमार्क, इतिहास, पासवर्ड, और अन्य सेटिंग आपके खाते में सिंक की जा सकती हैं. साथ ही, इन्हें आपका एडमिन मैनेज कर सकता है.</translation> +<translation id="6928650056523249512">इस्तेमाल नहीं की जाने वाली साइटों से अनुमतियां अपने-आप हटाने की सेटिंग</translation> <translation id="6929126689972602640">माता-पिता के कंट्रोल की सुविधा आपके स्कूल वाले खाते पर काम नहीं करती है. घर पर स्कूल का काम करने में मदद करने वाले Google Classroom और अन्य वेबसाइटों का ऐक्सेस पाने के लिए, स्कूल वाला खाता जोड़ना होगा. इसके लिए पहले अपने बच्चे के निजी खाते से साइन इन करें. आप बाद में, सेट अप में स्कूल वाला खाता जोड़ सकते हैं.</translation> <translation id="6929760895658557216">Okay Google</translation> <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{एक्सटेंशन अस्वीकार कर दिया गया}one{# एक्सटेंशन अस्वीकार कर दिए गए}other{# एक्सटेंशन अस्वीकार कर दिए गए}}</translation> @@ -7392,7 +7425,6 @@ <translation id="6979737339423435258">हमेशा</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">निजी रूप से ब्राउज़ करने के लिए, डॉट आइकॉन वाले मेन्यू पर क्लिक करके गुप्त विंडो खोलें</translation> -<translation id="6981761993313539853">पक्का करें कि आपका ब्लूटूथ डिवाइस, दूसरे डिवाइस से जोड़ने वाले मोड में है और आस-पास है. सिर्फ़ भरोसेमंद डिवाइसों के साथ ही जोड़ें. <ph name="BEGIN_LINK_LEARN_MORE" />ज़्यादा जानें<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">सुलभता</translation> <translation id="6983507711977005608">इंस्टैंट टेदरिंग नेटवर्क को डिसकनेक्ट करें</translation> <translation id="6983783921975806247">पंजीकृत OID</translation> @@ -7435,6 +7467,7 @@ <translation id="7006438259896942210">इस खाते (<ph name="USER_EMAIL_ADDRESS" />) को <ph name="PROFILE_NAME" /> मैनेज करता है</translation> <translation id="700651317925502808">क्या आपको सेटिंग रीसेट करनी है?</translation> <translation id="7006634003215061422">निचला हाशिया</translation> +<translation id="7007139794987684368">इस डिवाइस से बुकमार्क, इतिहास, पासवर्ड वगैरह हटाएं</translation> <translation id="7007648447224463482">सभी को नई विंडो में खोलें</translation> <translation id="7008815993384338777">अभी रोमिंग में नहीं है</translation> <translation id="7009709314043432820"><ph name="APP_NAME" /> आपका कैमरा इस्तेमाल कर रहा है</translation> @@ -7949,6 +7982,7 @@ <translation id="7453467225369441013">आपको ज़्यादातर साइटों से साइन आउट कर देता है. हालांकि, Google खाते से साइन आउट नहीं किया जाता.</translation> <translation id="7453597054492098060">{NUM_EXTENSIONS,plural, =1{यह एक्सटेंशन असुरक्षित हो सकता है. Chrome का सुझाव है कि आप इसे हटा दें.}one{यह एक्सटेंशन असुरक्षित हो सकता है. Chrome का सुझाव है कि आप इसे हटा दें.}other{ये एक्सटेंशन असुरक्षित हो सकते हैं. Chrome का सुझाव है कि आप इन्हें हटा दें.}}</translation> <translation id="7454548535253569100">पोर्टल: <ph name="SUBFRAME_SITE" /></translation> +<translation id="7454744349230173024">आपके संगठन ने पासवर्ड सेव करने की सुविधा बंद कर दी है</translation> <translation id="7455730275746867420">अतिरिक्त कंटेनर मैनेज करें</translation> <translation id="7455988709578031708">विज्ञापन के विषय, आपके ब्राउज़िंग इतिहास के आधार पर चुने गए हैं. यह सेटिंग चालू है.</translation> <translation id="7456142309650173560">डेव</translation> @@ -8263,6 +8297,7 @@ <translation id="7697109152153663933">“पासवर्ड और ऑटोमैटिक भरना” पर क्लिक करें</translation> <translation id="769824636077131955">यह दस्तावेज़ बहुत बड़ा है, इसलिए इसकी सुरक्षा जांच नहीं की जा सकती. सिर्फ़ 50 एमबी तक के दस्तावेज़ प्रिंट किए जा सकते हैं.</translation> <translation id="7698507637739331665">कुछ आइटम ब्लॉक किए गए हैं</translation> +<translation id="7700516433658473670">प्रिंटर और स्कैनर</translation> <translation id="7701040980221191251">कुछ भी नहीं</translation> <translation id="7701869757853594372">उपयोगकर्ता हैंडल</translation> <translation id="7702463352133825032"><ph name="DEVICE_NAME" /> पर कास्ट करना बंद करें</translation> @@ -8860,6 +8895,7 @@ <translation id="8161293209665121583">वेब पेजों के लिए रीडर मोड</translation> <translation id="8161604891089629425">आउटलाइन फ़ॉन्ट</translation> <translation id="8162984717805647492">{NUM_TABS,plural, =1{टैब को नई विंडो पर ले जाएं}one{टैब को नई विंडो पर ले जाएं}other{टैब को नई विंडो पर ले जाएं}}</translation> +<translation id="8163152278172770963">साइटों को अपने-आप 'पिक्चर में पिक्चर' मोड में जाने की अनुमति न दें</translation> <translation id="8163708146810922598">सबसे पुराना</translation> <translation id="8165997195302308593">Crostini में पोर्ट फ़ॉरवर्डिंग की सेटिंग</translation> <translation id="816704878106051517">{COUNT,plural, =1{एक फ़ोन नंबर}one{# फ़ोन नंबर}other{# फ़ोन नंबर}}</translation> @@ -9367,6 +9403,7 @@ <translation id="8584843865238667486">इस्तेमाल की जानकारी वाले पेज <ph name="USAGE_PAGE" /> के मुताबिक, एचआईडी डिवाइस और उनका इस्तेमाल <ph name="USAGE" /></translation> <translation id="8585480574870650651">Crostini हटाएं</translation> <translation id="8585841788766257444">नीचे दी गई साइटें, डिफ़ॉल्ट के बजाय कस्टम सेटिंग को फ़ॉलो करती हैं</translation> +<translation id="8585878117541674680">{NUM_SITES,plural, =1{इस्तेमाल न की गई 1 साइट की अनुमतियों को हटाया गया}one{इस्तेमाल न की गई {NUM_SITES} साइट की अनुमतियों को हटाया गया}other{इस्तेमाल न की गई {NUM_SITES} साइटों की अनुमतियों को हटाया गया}}</translation> <translation id="8588866096426746242">प्रोफ़ाइल आंकड़े दिखाएं</translation> <translation id="8588868914509452556"><ph name="WINDOW_TITLE" /> - VR हेडसेट को दिखा रहा है</translation> <translation id="8590375307970699841">स्वचालित अपडेट सेट अप करें</translation> @@ -9822,6 +9859,7 @@ आपने वेबसाइटों और ऐप्लिकेशन को जो अनुमतियां दी हैं वे इस खाते पर लागू हो सकती हैं. <ph name="SETTINGS_LINK_BEGIN" />सेटिंग<ph name="SETTINGS_LINK_END" /> में जाकर, अपने Google खातों को मैनेज किया जा सकता है.</translation> <translation id="8945274638472141382">आइकॉन का साइज़</translation> <translation id="8946359700442089734">डीबग करने वाली सुविधाएं इस <ph name="IDS_SHORT_PRODUCT_NAME" /> डिवाइस पर पूरी तरह सक्षम नहीं की गई थीं.</translation> +<translation id="8946954897220903437">पता बार में मौजूद सभी अनुरोधों को हटाएं</translation> <translation id="894763922177556086">अच्छा</translation> <translation id="8948939328578167195"><ph name="WEBSITE" /> आपकी सुरक्षा कुंजी के निर्माता और मॉडल को देखना चाहती है</translation> <translation id="8949304443659090542">Chrome ब्राउज़र से डेटा सिंक करने की सुविधा मैनेज करें</translation> @@ -9888,6 +9926,7 @@ <translation id="8993059306046735527">अगर आपको <ph name="DEVICE_TYPE" /> का पासवर्ड याद नहीं है, तब भी आपको अपना लोकल डेटा वापस मिल सकता है. आपको अपने Google खाते में साइन इन करना होगा या खाता वापस पाने की सुविधा का इस्तेमाल करना होगा.</translation> <translation id="8993737615451556423">इनकी मदद से आप पढ़ने की आवाज़ को तेज़ और कम कर सकते हैं. साथ ही, रोक सकते हैं</translation> <translation id="899384117894244799">पाबंदी वाले उपयोगकर्ता को हटाएं</translation> +<translation id="8993853206419610596">सभी अनुरोध दिखाएं</translation> <translation id="8993945059918628059">अपनी उंगली से फ़िंगरप्रिंट सेंसर को छुएं. आपके फ़िंगरप्रिंट का डेटा सुरक्षित तरीके से सेव किया जाता है. साथ ही, यह आपके <ph name="DEVICE_TYPE" /> में ही रहता है.</translation> <translation id="899403249577094719">Netscape प्रमाणपत्र आधार URL</translation> <translation id="899657321862108550">आपका Chrome, हर जगह</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 9ce5ac9..a5c05b4 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Pomicanje prema prvoj kartici</translation> <translation id="1410806973194718079">Pravila se ne mogu provjeriti</translation> <translation id="1411400282355634827">Želite li poništiti sva dopuštenja za Bluetooth uređaj?</translation> -<translation id="1411724932979011919">Unos treba biti u formatu LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Ne dopuštaj web-lokacijama korištenje vašeg fotoaparata</translation> <translation id="1414648216875402825">Ažurirate na nestabilnu verziju usluge <ph name="PRODUCT_NAME" /> koja sadrži značajke na kojima se još radi. Dolazit će do rušenja i neočekivanih programskih pogrešaka. Budite oprezni.</translation> <translation id="1415708812149920388">Odbijen pristup za čitanje međuspreminka</translation> @@ -1239,7 +1238,6 @@ <translation id="1972313920920745320">Web-lokacije koje dodate uvijek će ostati aktivne, a memorija za njih neće se osloboditi. <ph name="BEGIN_LINK" />Saznajte više o održavanju aktivnosti određenih web-lokacija<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Pregledavat ćete brže jer se sadržaj učitava proaktivno na temelju vašeg trenutačnog posjeta web-stranici</translation> <translation id="197288927597451399">Zadrži</translation> -<translation id="1973313062201924554">Dopuštenja koja date za aplikaciju <ph name="APP_NAME" /> vrijedit će i za ovu aplikaciju.</translation> <translation id="1973763416111613016">Datoteka <ph name="FILE_NAME" /> ne može se sigurno preuzeti. Pritisnite Shift + F6 nekoliko puta da biste se pomaknuli na područje trake preuzimanja.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL distribucijske točke</translation> @@ -3931,7 +3929,6 @@ <translation id="4100733287846229632">Količina prostora na uređaju kritično je mala</translation> <translation id="4100853287411968461">Novo ograničenje vremena upotrebe</translation> <translation id="4101352914005291489">Skriveni SSID</translation> -<translation id="4102469565336584882">Kôd nije važeći. Unos treba biti u formatu LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Pokrenite ponovo da biste izvršili powerwash</translation> <translation id="4104163789986725820">I&zvoz...</translation> <translation id="4104944259562794668">Možete ga omogućiti kasnije u odjeljku Postavke > Sigurnost i privatnost > Zaključavanje zaslona i prijava</translation> @@ -7088,7 +7085,6 @@ <translation id="6757431299485455321">Pomozite drugim uređajima da pronađu ovu žarišnu točku.</translation> <translation id="6758056191028427665">Recite nam koliko ste zadovoljni nama.</translation> <translation id="6759193508432371551">Vraćanje na tvorničke postavke</translation> -<translation id="6761431452438552910">Provjerite je li vaš Bluetooth uređaj u načinu uparivanja i u blizini. Uparujte uređaj samo s pouzdanim uređajima.</translation> <translation id="676158322851696513"><ph name="EXTENSION_NAME" /></translation> <translation id="6762833852331690540">Uključeno</translation> <translation id="676560328519657314">Vaši načini plaćanja na Google Payu</translation> @@ -7382,7 +7378,6 @@ <translation id="6979737339423435258">Cijelo vrijeme</translation> <translation id="6980402667292348590">umetni</translation> <translation id="6981553172137913845">Ako želite pregledavati privatno, kliknite ikonu izbornika s točkama kako biste otvorili anonimni prozor</translation> -<translation id="6981761993313539853">Provjerite je li vaš Bluetooth uređaj u načinu uparivanja i u blizini. Uparujte uređaj samo s pouzdanim uređajima. <ph name="BEGIN_LINK_LEARN_MORE" />Saznajte više<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Pristupačnost</translation> <translation id="6983507711977005608">Prekidanje veze s mrežom s Automatskim modemskim povezivanjem</translation> <translation id="6983783921975806247">Registrirani OID</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 313be4f..d0ccdf4 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -512,7 +512,6 @@ <translation id="1410797069449661718">Görgetés az első lap felé</translation> <translation id="1410806973194718079">Nem lehetséges a házirendek ellenőrzése</translation> <translation id="1411400282355634827">Visszaállítja az összes Bluetooth-eszközengedélyt?</translation> -<translation id="1411724932979011919">A következő formátumban kell megadni: LPA:1$<smdp-cím>$<aktivációs kód></translation> <translation id="1414315029670184034">A webhelyek nem használhatják a kamerát</translation> <translation id="1414648216875402825">A(z) <ph name="PRODUCT_NAME" /> instabil verziójára frissít, amely fejlesztés alatt álló funkciókat tartalmaz. Előfordulhatnak rendszerösszeomlások és váratlan programhibák. Kérjük, fokozott körültekintéssel lépjen tovább.</translation> <translation id="1415708812149920388">A vágólap olvasásához szükséges hozzáférés megtagadva</translation> @@ -1254,7 +1253,6 @@ <translation id="1972313920920745320">A hozzáadott webhelyek mindig aktívak maradnak, és a rendszer nem szabadítja fel az általuk használt memóriát. <ph name="BEGIN_LINK" />További információ adott webhelyek aktív állapotának fenntartásáról<ph name="END_LINK" />.</translation> <translation id="1972325230031091483">Gyorsabban böngészhet, mert a rendszer proaktív módon tölti be a tartalmat az aktuálisan felkeresett weboldal alapján.</translation> <translation id="197288927597451399">Megőrzés</translation> -<translation id="1973313062201924554">A(z) <ph name="APP_NAME" /> számára megadott engedélyek erre az alkalmazásra vonatkozóan is érvényesek lesznek.</translation> <translation id="1973763416111613016">A következő fájlt nem lehet biztonságosan letölteni: „<ph name="FILE_NAME" />”. A Shift + F6 billentyűkombináció lenyomásával a letöltéssávhoz léphet.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Tanúsítvány-visszavonási lista (CRL) terjesztési pontjai</translation> @@ -3951,7 +3949,6 @@ <translation id="4100733287846229632">Az eszköz nagyon kevés szabad tárhellyel rendelkezik</translation> <translation id="4100853287411968461">Képernyő előtt tölthető idő frissítve</translation> <translation id="4101352914005291489">Rejtett SSID</translation> -<translation id="4102469565336584882">Érvénytelen kód. A következő formátumban kell megadni: LPA:1$<smdp-cím>$<aktivációs kód></translation> <translation id="4102906002417106771">Újraindítás a powerwash megkezdéséhez</translation> <translation id="4104163789986725820">E&xportálás...</translation> <translation id="4104944259562794668">Később a Beállítások > Biztonság és adatvédelem > Lezárási képernyő és bejelentkezés pontban kapcsolhatja be.</translation> @@ -7112,7 +7109,6 @@ <translation id="6757431299485455321">Megkönnyítheti más eszközök számára ennek a hotspotnak a megtalálását.</translation> <translation id="6758056191028427665">Ossza meg velünk, mennyire van megelégedve munkánkkal.</translation> <translation id="6759193508432371551">Gyári beállítások visszaállítása</translation> -<translation id="6761431452438552910">Győződjön meg arról, hogy a Bluetooth-eszköz párosítási módban és a közelben van. Csak olyan eszközökkel párosítson, amelyeket megbízhatónak tart.</translation> <translation id="676158322851696513">„<ph name="EXTENSION_NAME" />”</translation> <translation id="6762833852331690540">Be</translation> <translation id="676560328519657314">Az Ön fizetési módjai a Google Pay szolgáltatásban</translation> @@ -7406,7 +7402,6 @@ <translation id="6979737339423435258">Mindenkori</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Privát böngészéshez kattintson a három pontból álló („Továbbiak”) ikonra, és nyisson inkognitó ablakot.</translation> -<translation id="6981761993313539853">Győződjön meg róla, hogy a Bluetooth-eszköz párosítási módban és a közelben van. Csak olyan eszközökkel párosítson, amelyeket megbízhatónak tart. <ph name="BEGIN_LINK_LEARN_MORE" />További információ<ph name="END_LINK_LEARN_MORE" />.</translation> <translation id="6981982820502123353">Kisegítő lehetőségek</translation> <translation id="6983507711977005608">Lecsatlakozás az Azonnali internetmegosztás hálózatáról</translation> <translation id="6983783921975806247">Regisztrált OID</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 2d3b719..8d224e0 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Ոլորել դեպի առաջին ներդիրը</translation> <translation id="1410806973194718079">Չհաջողվեց ստուգել կանոնները</translation> <translation id="1411400282355634827">Զրոյացնե՞լ Bluetooth սարքերի բոլոր թույլտվությունները։</translation> -<translation id="1411724932979011919">Մուտքագրումը պետք է լինի LPA ձևաչափով՝ 1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Թույլ չտալ կայքերին օգտագործել ձեր սարքի տեսախցիկը</translation> <translation id="1414648216875402825">Դուք անցնում եք <ph name="PRODUCT_NAME" />-ի անկայուն տարբերակի, որը պարունակում է տվյալ պահին մշակվող գործառույթներ: Զգույշ եղեք: Կարող են առաջնալ խափանումներ և անսպասելի վրիպակներ:</translation> <translation id="1415708812149920388">Սեղմատախտակի ընթերցումը մերժվեց</translation> @@ -1239,7 +1238,6 @@ <translation id="1972313920920745320">Կայքերը, որոնք ավելացնում եք, միշտ կլինեն ակտիվ, և հիշողությունը չի ազատվի դրանցից։ <ph name="BEGIN_LINK" />Իմանալ ավելին որոշակի կայքերն ակտիվ պահելու մասին<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Դուք ավելի արագ կդիտեք վեբ էջերը, քանի որ բովանդակությունը նախապես բեռնվում է՝ ընթացիկ բացված վեբ էջի հիման վրա։</translation> <translation id="197288927597451399">Տեղադրել</translation> -<translation id="1973313062201924554">Թույլտվությունները, որոնք տրամադրում եք «<ph name="APP_NAME" />» հավելվածին, նաև կգործեն այս հավելվածի համար։</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> ֆայլը հնարավոր չէ ներբեռնել անվտանգ եղանակով։ Սեղմեք Shift+F6՝ ներբեռնումների գոտու տարածք անցնելու համար։</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL բաշխման կետեր</translation> @@ -3928,7 +3926,6 @@ <translation id="4100733287846229632">Սարքի սկավառակում տարածքը ծայրահեղ քիչ է</translation> <translation id="4100853287411968461">Սարքի օգտագործման ժամանակի նոր սահմանափակում</translation> <translation id="4101352914005291489">Թաքցված SSID</translation> -<translation id="4102469565336584882">Կոդն անվավեր է։ Մուտքագրումը պետք է լինի LPA ձևաչափով՝ 1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Վերագործարկել՝ Powerwash-ը գործարկելու համար</translation> <translation id="4104163789986725820">Ար&տահանել…</translation> <translation id="4104944259562794668">Այս պարամետրը կարող եք նորից միացնել՝ անցնելով Կարգավորումներ > Անվտանգություն և գաղտնիություն > Կողպէկրան և մուտք</translation> @@ -7086,7 +7083,6 @@ <translation id="6757431299485455321">Օգնել մյուս սարքերին գտնել այս թեժ կետը։</translation> <translation id="6758056191028427665">Կիսվեք մեզ հետ ձեր տպավորություններով:</translation> <translation id="6759193508432371551">Գործարանային կարգավորումների վերականգնում</translation> -<translation id="6761431452438552910">Համոզվեք, որ ձեր Bluetooth սարքը մոտակայքում է և զուգակցման ռեժիմում։ Զուգակցեք միայն այն սարքերի հետ, որոնց վստահում եք։</translation> <translation id="676158322851696513">«<ph name="EXTENSION_NAME" />»</translation> <translation id="6762833852331690540">Միացված է</translation> <translation id="676560328519657314">Ձեր վճարման եղանակները Google Pay-ում</translation> @@ -7380,7 +7376,6 @@ <translation id="6979737339423435258">Ամբողջ ժամանակաշրջանի</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Կայքերը գաղտնի այցելելու համար սեղմեք երեք կետով պատկերակին՝ ինկոգնիտո պատուհան բացելու համար։</translation> -<translation id="6981761993313539853">Համոզվեք, որ ձեր Bluetooth սարքը մոտակայքում է և զուգակցման ռեժիմում։ Զուգակցեք միայն այն սարքերի հետ, որոնց վստահում եք։ <ph name="BEGIN_LINK_LEARN_MORE" />Իմանալ ավելին<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Մատչելիությունը</translation> <translation id="6983507711977005608">Անջատել կապը մուտքի ակնթարթային կետի հետ</translation> <translation id="6983783921975806247">Գրանցված OID</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index d23ea74..4fb5050 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Scroll ke tab pertama</translation> <translation id="1410806973194718079">Tidak dapat memeriksa kebijakan</translation> <translation id="1411400282355634827">Reset semua izin perangkat Bluetooth?</translation> -<translation id="1411724932979011919">Entri Anda harus memiliki format LPA:1$<alamat smdp>$<kode aktivasi></translation> <translation id="1414315029670184034">Jangan izinkan situs menggunakan kamera Anda</translation> <translation id="1414648216875402825">Anda memperbarui ke versi tidak stabil dari <ph name="PRODUCT_NAME" /> yang berisi fitur yang sedang dalam proses. Akan terjadi mogok dan bug tidak terduga. Lanjutkan dengan hati-hati.</translation> <translation id="1415708812149920388">Akses baca papan klip ditolak</translation> @@ -1249,7 +1248,6 @@ <translation id="1972313920920745320">Situs yang Anda tambahkan akan selalu aktif dan memori tidak akan dikosongkan dari situs tersebut. <ph name="BEGIN_LINK" />Pelajari lebih lanjut cara membuat situs tertentu tetap aktif<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Anda akan menjelajah lebih cepat karena konten dimuat secara proaktif berdasarkan halaman web yang sedang Anda buka</translation> <translation id="197288927597451399">Tetap Download</translation> -<translation id="1973313062201924554">Izin yang Anda izinkan untuk <ph name="APP_NAME" /> juga akan diizinkan untuk aplikasi ini.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> tidak dapat didownload dengan aman. Tekan Shift+F6 untuk masuk ke area kotak download.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Titik Distribusi CRL</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">Ruang perangkat hampir habis</translation> <translation id="4100853287411968461">Batas baru waktu pemakaian perangkat</translation> <translation id="4101352914005291489">SSID tersembunyi</translation> -<translation id="4102469565336584882">Kode tidak valid. Entri Anda harus memiliki format LPA:1$<alamat smdp>$<kode aktivasi></translation> <translation id="4102906002417106771">Mulai ulang untuk powerwash</translation> <translation id="4104163789986725820">E&kspor...</translation> <translation id="4104944259562794668">Anda dapat mengaktifkannya nanti di Setelan > Keamanan dan Privasi > Layar kunci dan login</translation> @@ -7100,7 +7097,6 @@ <translation id="6757431299485455321">Bantu perangkat lain menemukan hotspot ini.</translation> <translation id="6758056191028427665">Berikan masukan Anda tentang kinerja kami.</translation> <translation id="6759193508432371551">Kembalikan ke setelan pabrik</translation> -<translation id="6761431452438552910">Pastikan perangkat Bluetooth Anda dalam mode penyambungan dan berada di sekitar. Hanya sambungkan dengan perangkat yang Anda percayai.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Aktif</translation> <translation id="676560328519657314">Metode pembayaran Anda di Google Pay</translation> @@ -7394,7 +7390,6 @@ <translation id="6979737339423435258">Semua</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Untuk melakukan penjelajahan rahasia, klik menu ikon titik untuk membuka jendela Samaran</translation> -<translation id="6981761993313539853">Pastikan perangkat Bluetooth Anda dalam mode penyambungan dan berada di sekitar. Hanya sambungkan dengan perangkat yang Anda percayai. <ph name="BEGIN_LINK_LEARN_MORE" />Pelajari lebih lanjut<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Aksesibilitas</translation> <translation id="6983507711977005608">Putuskan koneksi jaringan Tethering Instan</translation> <translation id="6983783921975806247">OID terdaftar</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index bf9c70a2..f8cbc61 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">Fletta að fyrsta flipanum</translation> <translation id="1410806973194718079">Ekki tókst að athuga reglur</translation> <translation id="1411400282355634827">Endurstilla allar heimildir Bluetooth-tækja?</translation> -<translation id="1411724932979011919">Færslan þín ætti að vera á sniðinu LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Ekki leyfa vefsvæðum að nota myndavélina</translation> <translation id="1414648216875402825">Þú ert að uppfæra í óstöðuga útgáfu af <ph name="PRODUCT_NAME" /> sem inniheldur eiginleika sem eru í vinnslu. Hrun og óvæntar villur munu koma upp. Farðu að öllu með gát.</translation> <translation id="1415708812149920388">Lesaðgangi að klippiborði var hafnað</translation> @@ -1250,7 +1249,6 @@ <translation id="1972313920920745320">Vefsvæði sem þú bætir við verða alltaf virk og ekki verður losað um minni úr þeim. <ph name="BEGIN_LINK" />Nánar um að halda tilteknum vefsvæðum virkum<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Þú getur vafrað hraðar því að efni er hlaðið forvirkt í samræmi við vefsíðuna sem þú ert að skoða í hvert skipti</translation> <translation id="197288927597451399">Halda</translation> -<translation id="1973313062201924554">Heimildir sem þú veitir <ph name="APP_NAME" /> verða einnig notaðar fyrir þetta forrit.</translation> <translation id="1973763416111613016">Ekki er hægt að sækja <ph name="FILE_NAME" /> á öruggan hátt. Ýttu á Shift+F6 til að fara á niðurhalsstikuna.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL-dreifingarpunktar</translation> @@ -3944,7 +3942,6 @@ <translation id="4100733287846229632">Mjög lítið geymslupláss er eftir á tækinu</translation> <translation id="4100853287411968461">Ný tímamörk á skjátíma</translation> <translation id="4101352914005291489">SSID falin</translation> -<translation id="4102469565336584882">Ógildur kóði. Færslan þín ætti að vera á sniðinu LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Endurræsa til að djúphreinsa</translation> <translation id="4104163789986725820">Flytja út...</translation> <translation id="4104944259562794668">Þú getur kveikt á þessu síðar í Stillingar > Öryggi og persónuvernd > Lásskjár og innskráning</translation> @@ -7103,7 +7100,6 @@ <translation id="6757431299485455321">Hjálpaðu öðrum tækjum að finna þennan heita reit.</translation> <translation id="6758056191028427665">Láttu okkur vita hvernig við stöndum okkur.</translation> <translation id="6759193508432371551">Núllstilling</translation> -<translation id="6761431452438552910">Gakktu úr skugga um að Bluetooth-tækið þitt sé nálægt og í pörunarstillingu. Paraðu eingöngu við tæki sem þú treystir.</translation> <translation id="676158322851696513">„<ph name="EXTENSION_NAME" />“</translation> <translation id="6762833852331690540">Kveikt</translation> <translation id="676560328519657314">Þínir greiðslumátar á Google Pay</translation> @@ -7397,7 +7393,6 @@ <translation id="6979737339423435258">Frá upphafi</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Til að vafra í leyni skaltu opna huliðsglugga með því að smella á punktavalmyndina</translation> -<translation id="6981761993313539853">Gakktu úr skugga um að Bluetooth-tækið þitt sé nálægt og í pörunarstillingu. Paraðu eingöngu við tæki sem þú treystir. <ph name="BEGIN_LINK_LEARN_MORE" />Nánar<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Aðgengi</translation> <translation id="6983507711977005608">Aftengja skynditjóðrun</translation> <translation id="6983783921975806247">Skráð OID</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 2b4483a..138e1f6 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Scorri verso la prima scheda</translation> <translation id="1410806973194718079">Impossibile controllare i criteri</translation> <translation id="1411400282355634827">Vuoi reimpostare tutte le autorizzazioni del dispositivo Bluetooth?</translation> -<translation id="1411724932979011919">Il formato dell'elemento dovrebbe essere LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Non consentire ai siti di usare la fotocamera</translation> <translation id="1414648216875402825">Stai per passare a una versione non stabile di <ph name="PRODUCT_NAME" /> che contiene funzioni ancora in fase di sviluppo. Si verificheranno arresti anomali e bug imprevisti. Procedi con cautela.</translation> <translation id="1415708812149920388">Accesso alla lettura degli appunti negato</translation> @@ -1243,7 +1242,6 @@ <translation id="1972313920920745320">I siti che aggiungi saranno sempre attivi e non verrà eliminata memoria per questi siti. <ph name="BEGIN_LINK" />Scopri di più su come mantenere attivi siti specifici<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Navigherai più velocemente perché i contenuti vengono caricati in modo proattivo in base alla pagina web che stai visitando</translation> <translation id="197288927597451399">Conserva</translation> -<translation id="1973313062201924554">Le autorizzazioni consentite per <ph name="APP_NAME" /> saranno consentite anche per questa app.</translation> <translation id="1973763416111613016">Impossibile scaricare <ph name="FILE_NAME" /> in modo sicuro. Premi Maiusc + F6 per passare all'area della barra dei download.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Punti di distribuzione CRL</translation> @@ -3938,7 +3936,6 @@ <translation id="4100733287846229632">Lo spazio sul dispositivo sta per esaurirsi</translation> <translation id="4100853287411968461">Nuovo limite del tempo di utilizzo</translation> <translation id="4101352914005291489">SSID nascosto</translation> -<translation id="4102469565336584882">Codice non valido. Il formato dell'elemento dovrebbe essere LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Riavvia per eseguire il Powerwash</translation> <translation id="4104163789986725820">E&sporta...</translation> <translation id="4104944259562794668">Puoi attivare questa funzionalità in un secondo momento in Impostazioni > Sicurezza e privacy > Schermata di blocco e accesso</translation> @@ -7093,7 +7090,6 @@ <translation id="6757431299485455321">Aiuta altri dispositivi a trovare questo hotspot.</translation> <translation id="6758056191028427665">Comunicaci la tua opinione sul nostro lavoro.</translation> <translation id="6759193508432371551">Ripristino dati di fabbrica</translation> -<translation id="6761431452438552910">Assicurati che il dispositivo Bluetooth sia in modalità di accoppiamento e nelle vicinanze. Esegui l'accoppiamento solo con i dispositivi che ritieni attendibili.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">On</translation> <translation id="676560328519657314">I tuoi metodi di pagamento in Google Pay</translation> @@ -7387,7 +7383,6 @@ <translation id="6979737339423435258">Dall'inizio</translation> <translation id="6980402667292348590">inserisci</translation> <translation id="6981553172137913845">Per navigare in privato, fai clic sul menu con l'icona con tre puntini per aprire una finestra di navigazione in incognito</translation> -<translation id="6981761993313539853">Assicurati che il dispositivo Bluetooth sia in modalità di accoppiamento e nelle vicinanze. Esegui l'accoppiamento solo con i dispositivi che ritieni attendibili. <ph name="BEGIN_LINK_LEARN_MORE" />Scopri di più<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Accessibilità</translation> <translation id="6983507711977005608">Disconnetti rete con tethering istantaneo</translation> <translation id="6983783921975806247">OID registrato</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index fe55f96..9bee72a 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -512,7 +512,6 @@ <translation id="1410797069449661718">גלילה אל הכרטיסייה הראשונה</translation> <translation id="1410806973194718079">לא ניתן לבדוק את המדיניות</translation> <translation id="1411400282355634827">לאפס את כל ההרשאות של מכשיר ה-Bluetooth?</translation> -<translation id="1411724932979011919">הפורמט של הקוד צריך להיות LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">לא לאפשר לאתרים להשתמש במצלמה</translation> <translation id="1414648216875402825">עדכנת לגרסה לא יציבה של <ph name="PRODUCT_NAME" /> המכילה תכונות שנמצאות בתהליך. ייתכנו קריסות מחשב ובאגים לא צפויים. יש להמשיך בזהירות.</translation> <translation id="1415708812149920388">גישת הקריאה אל הלוח נדחתה</translation> @@ -1248,7 +1247,6 @@ <translation id="1972313920920745320">אתרים שמוסיפים לרשימה תמיד נשארים פעילים ושמורים בזיכרון. <ph name="BEGIN_LINK" />מידע נוסף על הבחירה להשאיר אתרים ספציפיים פעילים<ph name="END_LINK" /></translation> <translation id="1972325230031091483">מהירות הגלישה תגבר כי התוכן ייטען באופן יזום, על סמך הביקור הנוכחי שלך בדף האינטרנט</translation> <translation id="197288927597451399">שמירה</translation> -<translation id="1973313062201924554">ההרשאות שמוענקות לאפליקציה <ph name="APP_NAME" /> יוענקו גם לאפליקציה הזו.</translation> <translation id="1973763416111613016">לא ניתן להוריד את <ph name="FILE_NAME" /> בצורה מאובטחת. אפשר להקיש על Shift+F6 כדי לעבור לאזור סרגל ההורדות.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">נקודות הפצה של CRL</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">נפח האחסון במכשיר כמעט נגמר</translation> <translation id="4100853287411968461">מגבלה חדשה לזמן מסך</translation> <translation id="4101352914005291489">SSID מוסתר</translation> -<translation id="4102469565336584882">הקוד לא חוקי. הפורמט של הקוד צריך להיות LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">הפעלה מחדש לביצוע Powerwash</translation> <translation id="4104163789986725820">יי&צוא...</translation> <translation id="4104944259562794668">כדי להפעיל את התכונה הזו מאוחר יותר, עוברים אל 'הגדרות' > 'אבטחה ופרטיות' > 'מסך הנעילה וכניסה לחשבון'</translation> @@ -7104,7 +7101,6 @@ <translation id="6757431299485455321">עזרה למכשירים אחרים באיתור הנקודה הזו לשיתוף אינטרנט.</translation> <translation id="6758056191028427665">נשמח לקבל ממך משוב.</translation> <translation id="6759193508432371551">איפוס להגדרות היצרן</translation> -<translation id="6761431452438552910">צריך לוודא שמכשיר ה-Bluetooth נמצא במצב התאמה ובקרבת מקום. אין לבצע התאמה עם מכשירים לא מהימנים.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">מופעל</translation> <translation id="676560328519657314">אמצעי התשלום שלך ב-Google Pay</translation> @@ -7398,7 +7394,6 @@ <translation id="6979737339423435258">משחר ההיסטוריה</translation> <translation id="6980402667292348590">מקש Insert</translation> <translation id="6981553172137913845">כדי לגלוש באופן פרטי, יש ללחוץ על תפריט סמל הנקודות כדי לפתוח חלון אנונימי</translation> -<translation id="6981761993313539853">צריך לוודא שמכשיר ה-Bluetooth נמצא במצב התאמה ובקרבת מקום. אין לבצע התאמה עם מכשירים לא מהימנים. <ph name="BEGIN_LINK_LEARN_MORE" />מידע נוסף<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">נגישות</translation> <translation id="6983507711977005608">התנתקות מהרשת של שיתוף אינטרנט מיידי בין מכשירים</translation> <translation id="6983783921975806247">OID רשום</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index b4cf2b20..de2627ed 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">最初のタブまでスクロール</translation> <translation id="1410806973194718079">ポリシーを確認できません</translation> <translation id="1411400282355634827">Bluetooth デバイスの権限をすべてリセットしますか?</translation> -<translation id="1411724932979011919">エントリは「LPA:1$<smdp address>$<activation code>」という形式にする必要があります。</translation> <translation id="1414315029670184034">サイトにカメラの使用を許可しない</translation> <translation id="1414648216875402825">アップデートしようとしているバージョンの <ph name="PRODUCT_NAME" /> には開発中の機能が含まれており、不安定です。クラッシュや予期しないバグが発生します。続行する場合は十分にご注意ください。</translation> <translation id="1415708812149920388">クリップボードの読み取りアクセスが拒否されました</translation> @@ -1234,7 +1233,6 @@ <translation id="1972313920920745320">追加したサイトは常にアクティブになり、メモリの解放は行われません。<ph name="BEGIN_LINK" />特定のサイトを常にアクティブにする方法について<ph name="END_LINK" /></translation> <translation id="1972325230031091483">表示中のウェブページに基づいてコンテンツが事前に読み込まれるので、すばやくブラウジングできます</translation> <translation id="197288927597451399">保存</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" /> に許可した権限は、このアプリにも適用されます。</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> は安全にダウンロードできません。ダウンロード バーの領域に切り替えるには Shift+F6 キーを押してください。</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL 配布ポイント</translation> @@ -3921,7 +3919,6 @@ <translation id="4100733287846229632">デバイスの空き領域が非常に少なくなっています</translation> <translation id="4100853287411968461">利用時間の上限が変更されました</translation> <translation id="4101352914005291489">ステルス SSID</translation> -<translation id="4102469565336584882">コードが無効です。エントリは「LPA:1$<smdp address>$<activation code>」という形式にする必要があります。</translation> <translation id="4102906002417106771">再起動して Powerwash を実行</translation> <translation id="4104163789986725820">エクスポート(&X)</translation> <translation id="4104944259562794668">後で [設定] > [セキュリティとプライバシー] > [ロック画面とログイン] で有効にすることができます</translation> @@ -7073,7 +7070,6 @@ <translation id="6757431299485455321">このアクセス ポイントを他のデバイスで検出できるようにします。</translation> <translation id="6758056191028427665">アンケートにご協力ください。</translation> <translation id="6759193508432371551">初期状態へのリセット</translation> -<translation id="6761431452438552910">Bluetooth デバイスがペア設定モードになっていて、近くにあることを確認してください。ペア設定は信頼しているデバイスとのみ行ってください。</translation> <translation id="676158322851696513">「<ph name="EXTENSION_NAME" />」</translation> <translation id="6762833852331690540">オン</translation> <translation id="676560328519657314">Google Pay でのお支払い方法</translation> @@ -7366,7 +7362,6 @@ <translation id="6979737339423435258">全期間</translation> <translation id="6980402667292348590">Insert</translation> <translation id="6981553172137913845">シークレット モードを使うには、その他アイコンのメニューからシークレット ウィンドウを開きます</translation> -<translation id="6981761993313539853">Bluetooth デバイスがペア設定モードになっていて、近くにあることを確認してください。ペア設定は信頼しているデバイスとのみ行ってください。<ph name="BEGIN_LINK_LEARN_MORE" />詳細<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ユーザー補助機能</translation> <translation id="6983507711977005608">インスタント テザリング ネットワークとの接続を切断する</translation> <translation id="6983783921975806247">登録されている OID</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 3cffe63..bc4c81c 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">პირველი ჩანართისკენ გადაადგილება</translation> <translation id="1410806973194718079">წესების შემოწმება ვერ ხერხდება</translation> <translation id="1411400282355634827">გსურთ Bluetooth მოწყობილობების ყველა ნებართვის გადაყენება?</translation> -<translation id="1411724932979011919">თქვენი შენატანის ფორმატი უნდა იყოს LPA:1$<smdp მისამართი>$<აქტივაციის კოდი></translation> <translation id="1414315029670184034">საიტებისთვის თქვენი კამერის გამოყენების აკრძალვა</translation> <translation id="1414648216875402825">თქვენ ანახლებთ <ph name="PRODUCT_NAME" />-ის არასტაბილურ ვერსიას, რომელიც შეიცავს პროგრესში მყოფ ფუნქციებს. ავარიები და მოულოდნელი შეცდომები მოხდება. გთხოვთ იმოქმედოთ სიფრთხილით.</translation> <translation id="1415708812149920388">გაცვლის ბუფერზე წვდომა უარყოფილია</translation> @@ -1237,7 +1236,6 @@ <translation id="1972313920920745320">თქვენ მიერ დამატებული საიტები ყოველთვის მოქმედი დარჩება, ხოლო მათ საფუძველზე მეხსიერება არ გათავისუფლდება. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი კონკრეტული საიტების მოქმედად დატოვების შესახებ<ph name="END_LINK" /></translation> <translation id="1972325230031091483">ვებს უფრო სწრაფად დაათვალიერებთ, რადგან კონტენტი პროაქტიურად ჩაიტვირთება იმ ვებსაიტის გათვალისწინებით, რომელსაც კონკრეტულ მომენტში ათვალიერებთ</translation> <translation id="197288927597451399">შეინახეთ</translation> -<translation id="1973313062201924554">ნებართვები, რომლებსაც „<ph name="APP_NAME" />“-ისთვის დაუშვებთ, დაშვებული იქნება ამ აპისთვისაც.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" />-ის უსაფრთხოდ ჩამოტვირთვა ვერ მოხერხდება. ჩამოტვირთვების ზოლის არეზე გადასასვლელად დააჭირეთ კლავიშთა შემდეგ კომბინაციას: Shift+F6.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL გავრცელების წერტილები</translation> @@ -3928,7 +3926,6 @@ <translation id="4100733287846229632">მოწყობილობაზე ხელმისაწვდომი მეხსიერება კრიტიკულად არასაკმარისია</translation> <translation id="4100853287411968461">დაყენებულია ეკრანთან გატარებული დროის ახალი ლიმიტი</translation> <translation id="4101352914005291489">დამალული SSID</translation> -<translation id="4102469565336584882">კოდი არასწორია. თქვენი შენატანის ფორმატი უნდა იყოს LPA:1$<smdp მისამართი>$<აქტივაციის კოდი></translation> <translation id="4102906002417106771">გადატვირთვა Powerwash-ისთვის</translation> <translation id="4104163789986725820">ე&ქსპორტი…</translation> <translation id="4104944259562794668">მისი ჩართვა შეგიძლიათ მოგვიანებით. ამისთვის გადადით აქ: პარამეტრები > უსაფრთხოება და კონფიდენციალურობა > ჩაკეტილი ეკრანი და შესვლა</translation> @@ -7084,7 +7081,6 @@ <translation id="6757431299485455321">დაეხმარეთ სხვა მოწყობილობებს უსადენო ქსელის პოვნაში.</translation> <translation id="6758056191028427665">შეგვატყობინეთ, როგორ ვმუშაობთ.</translation> <translation id="6759193508432371551">ქარხნული პარამეტრების დაბრუნება</translation> -<translation id="6761431452438552910">დარწმუნდით, რომ თქვენი Bluetooth-მოწყობილობა დაწყვილების რეჟიმშია და ახლოს მდებარეობს. დააწყვილეთ მხოლოდ ის მოწყობილობები, რომლებსაც ენდობით.</translation> <translation id="676158322851696513">„<ph name="EXTENSION_NAME" />“</translation> <translation id="6762833852331690540">ჩართული</translation> <translation id="676560328519657314">თქვენი გადახდის მეთოდები Google Pay-ში</translation> @@ -7378,7 +7374,6 @@ <translation id="6979737339423435258">ყველა დროის</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">ვების კონფიდენციალურად დასათვალიერებლად დააწკაპუნეთ მენიუს წერტილებიანი ხატულით და გახსენით ინკოგნიტო ფანჯარა</translation> -<translation id="6981761993313539853">დარწმუნდით, რომ თქვენი Bluetooth-მოწყობილობა დაწყვილების რეჟიმია და ახლოს მდებარეობს. დააწყვილეთ მხოლოდ ის მოწყობილობები, რომლებსაც ენდობით. <ph name="BEGIN_LINK_LEARN_MORE" />შეიტყვეთ მეტი<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">სპეციალური შესაძლებლობები</translation> <translation id="6983507711977005608">მყისიერი ტეტერინგის ქსელის გათიშვა</translation> <translation id="6983783921975806247">რეგისტრირებული OID</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index a3aba2a3..28f7364 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">Бірінші қойындыға қарай айналдыру</translation> <translation id="1410806973194718079">Саясаттарды тексеру мүмкін емес.</translation> <translation id="1411400282355634827">Bluetooth құрылғыларының барлық рұқсатын қайта орнату керек пе?</translation> -<translation id="1411724932979011919">LPA форматында жазуыңыз керек: 1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Сайттардың камераңызды пайдалануына рұқсат бермеу</translation> <translation id="1414648216875402825">Сіз <ph name="PRODUCT_NAME" /> тұрақсыз нұсқасы жаңартудасыз, онда әлі орындалып жатқан мүмкіндіктер бар. Бұзылулар, күтпеген қателер орын алады. Сақтықпен жалғастыруыңызды сұраймыз.</translation> <translation id="1415708812149920388">Буферден оқу рұқсаты берілмеді</translation> @@ -1234,7 +1233,6 @@ <translation id="1972313920920745320">Сіз қосатын сайттар әрдайым белсенді болып қалады және олардың жады босатылмайды. <ph name="BEGIN_LINK" />Нақты бір сайттарды белсенді күйде қалдыру туралы толық ақпарат алыңыз<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Кіріп отырған веб-бетке сәйкес контент алдын ала жүктелетіндіктен, шолу барысы жылдамдайды.</translation> <translation id="197288927597451399">Сақтау</translation> -<translation id="1973313062201924554">Сіз <ph name="APP_NAME" /> қолданбасына берген рұқсаттар осы қолданбаға да беріледі.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> файлын қауіпсіз жүктеп алу мүмкін емес. Жүктеп алынғандар жолағына оралу үшін Shift+F6 пернелерін басыңыз.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL тарату орындары</translation> @@ -3925,7 +3923,6 @@ <translation id="4100733287846229632">Құрылғыда бос орын өте аз</translation> <translation id="4100853287411968461">Пайдалану уақытының жаңа шектеуі</translation> <translation id="4101352914005291489">Жасырын SSID</translation> -<translation id="4102469565336584882">Жарамсыз код. LPA форматында жазуыңыз керек: 1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Powerwash функциясын іске қосу үшін қайта қосу</translation> <translation id="4104163789986725820">Э&кспорттау…</translation> <translation id="4104944259562794668">Оны кейінірек "Параметрлер" > "Қауіпсіздік және құпиялық" > "Құлыптаулы экран және кіру" тармағында қосуға болады.</translation> @@ -7078,7 +7075,6 @@ <translation id="6757431299485455321">Басқа құрылғылардың осы хотспотты табуына көмектесіңіз.</translation> <translation id="6758056191028427665">Қал-жағдайыңызды айтып беріңіз.</translation> <translation id="6759193508432371551">Зауыттық параметрлерге қайта орнату</translation> -<translation id="6761431452438552910">Bluetooth құрылғыңыз жұптау режимінде және маңайда болсын. Сенімді құрылғылармен ғана жұптаңыз.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Қосулы</translation> <translation id="676560328519657314">Google Pay қызметіндегі төлеу әдістеріңіз</translation> @@ -7372,7 +7368,6 @@ <translation id="6979737339423435258">Барлық уақыт</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Интернетті құпия пайдаланғыңыз келсе, инкогнито терезесін ашуға болады. Ол үшін нүктелер белгішесінің мәзірін басыңыз</translation> -<translation id="6981761993313539853">Bluetooth құрылғыңыз жұптау режимінде және маңайда болсын. Сенімді құрылғылармен ғана жұптаңыз. <ph name="BEGIN_LINK_LEARN_MORE" />Толығырақ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Арнайы мүмкіндіктер</translation> <translation id="6983507711977005608">Жылдам тетеринг желісін ажырату</translation> <translation id="6983783921975806247">Тіркелген OID</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 4adc6376..8a72913 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -512,7 +512,6 @@ <translation id="1410797069449661718">រំកិលទៅផ្ទាំងដំបូង</translation> <translation id="1410806973194718079">មិនអាចពិនិត្យគោលការណ៍បានទេ</translation> <translation id="1411400282355634827">កំណត់ការអនុញ្ញាតឧបករណ៍ប៊្លូធូសទាំងអស់ឡើងវិញឬ?</translation> -<translation id="1411724932979011919">ការបញ្ចូលរបស់អ្នកគួរតែមានទម្រង់ LPA៖1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">មិនអនុញ្ញាតឱ្យគេហទំព័រប្រើកាមេរ៉ារបស់អ្នកទេ</translation> <translation id="1414648216875402825">អ្នកកំពុងធ្វើបច្ចុប្បន្នភាពកំណែមិនថេរនៃ <ph name="PRODUCT_NAME" /> ដែលផ្ទុកលក្ខណៈពិសេសដែលនៅក្នុងប្រតិបត្តិការនៅឡើយ។ ការគាំង និងកំហុសដែលបានមិនបានរំពឹងទុកនឹងកើតមាន។ សូមបន្តដោយប្រុងប្រយ័ត្ន។</translation> <translation id="1415708812149920388">បានបដិសេធការចូលអានអង្គចងចាំ</translation> @@ -1255,7 +1254,6 @@ <translation id="1972313920920745320">គេហទំព័រដែលអ្នកបញ្ចូលនឹងបន្តសកម្មជានិច្ច ហើយអង្គចងចាំនឹងមិនត្រូវបានសម្អាតពីគេហទំព័រទាំងនោះទេ។ <ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែមអំពីការរក្សាគេហទំព័រជាក់លាក់ឱ្យនៅសកម្ម<ph name="END_LINK" /></translation> <translation id="1972325230031091483">អ្នកនឹងរុករកកាន់តែរហ័ស ដោយសារខ្លឹមសារត្រូវបានផ្ទុកយ៉ាងសកម្មជាមុន ដោយផ្អែកលើការចូលមើលទំព័របណ្ដាញបច្ចុប្បន្នរបស់អ្នក</translation> <translation id="197288927597451399">រក្សា</translation> -<translation id="1973313062201924554">ការអនុញ្ញាតដែលអ្នកផ្ដល់សម្រាប់ <ph name="APP_NAME" /> ក៏នឹងត្រូវបានផ្ដល់សម្រាប់កម្មវិធីនេះផងដែរ។</translation> <translation id="1973763416111613016">មិនអាចទាញយក <ph name="FILE_NAME" /> ដោយសុវត្ថិភាពបានទេ។ សូមចុច Shift+F6 ដើម្បីប្ដូរទៅផ្នែករបារទាញយក។</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">ចំណុចចែកចាយ CRL</translation> @@ -3953,7 +3951,6 @@ <translation id="4100733287846229632">ទំហំផ្ទុកឧបករណ៍សល់តិចណាស់</translation> <translation id="4100853287411968461">រយៈពេលកំណត់នៅលើអេក្រង់ថ្មី</translation> <translation id="4101352914005291489">SSID ដែលបានលាក់</translation> -<translation id="4102469565336584882">លេខកូដមិនត្រឹមត្រូវ។ ការបញ្ចូលរបស់អ្នកគួរតែមានទម្រង់ LPA៖1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">ចាប់ផ្ដើមឡើងវិញដើម្បីផៅវើរវាស់</translation> <translation id="4104163789986725820">នាំចេញ...</translation> <translation id="4104944259562794668">អ្នកអាចបើកវានៅពេលក្រោយនៅក្នុងការកំណត់ > សុវត្ថិភាព និងឯកជនភាព > អេក្រង់ចាក់សោ រួចចូលគណនី</translation> @@ -7113,7 +7110,6 @@ <translation id="6757431299485455321">ជួយឱ្យឧបករណ៍ផ្សេងទៀតរកឃើញហតស្ប៉តនេះ។</translation> <translation id="6758056191028427665">អនុញ្ញាតឱ្យយើងដឹងថា ការបំពេញការងាររបស់យើងដូចម្ដេចដែរ។</translation> <translation id="6759193508432371551">កំណត់ដូចដើមឡើងវិញ</translation> -<translation id="6761431452438552910">ត្រូវប្រាកដថា ឧបករណ៍ប៊្លូធូសរបស់អ្នកស្ថិតនៅក្នុងមុខងារផ្គូផ្គង និងនៅជិត។ សូមផ្គូផ្គងតែជាមួយឧបករណ៍ដែលអ្នកទុកចិត្តប៉ុណ្ណោះ។</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">បើក</translation> <translation id="676560328519657314">វិធីបង់ប្រាក់របស់អ្នកនៅក្នុង Google Pay</translation> @@ -7407,7 +7403,6 @@ <translation id="6979737339423435258">គ្រប់ពេល</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">ដើម្បីរុករកជាលក្ខណៈឯកជន សូមចុចម៉ឺនុយរូបចំណុច ដើម្បីបើកផ្ទាំងឯកជន</translation> -<translation id="6981761993313539853">ត្រូវប្រាកដថា ឧបករណ៍ប៊្លូធូសរបស់អ្នកស្ថិតនៅក្នុងមុខងារផ្គូផ្គង និងនៅជិត។ ផ្គូផ្គងតែជាមួយឧបករណ៍ដែលអ្នកទុកចិត្តប៉ុណ្ណោះ។ <ph name="BEGIN_LINK_LEARN_MORE" />ស្វែងយល់បន្ថែម<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">លទ្ធភាពប្រើប្រាស់</translation> <translation id="6983507711977005608">ផ្ដាច់បណ្ដាញភ្ជាប់ភ្លាមៗ</translation> <translation id="6983783921975806247">OID ដែលបានចុះឈ្មោះ</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 96b451ae..c48c838 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -513,7 +513,6 @@ <translation id="1410797069449661718">ಮೊದಲ ಟ್ಯಾಬ್ ಕಡೆಗೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ</translation> <translation id="1410806973194718079">ನೀತಿಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="1411400282355634827">ಎಲ್ಲಾ ಬ್ಲೂಟೂತ್ ಸಾಧನದ ಅನುಮತಿಗಳನ್ನು ರೀಸೆಟ್ ಮಾಡಬೇಕೆ?</translation> -<translation id="1411724932979011919">ನಿಮ್ಮ ನಮೂದು LPA ಫಾರ್ಮ್ಯಾಟ್ನಲ್ಲಿರಬೇಕು:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಲು ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಬೇಡಿ</translation> <translation id="1414648216875402825">ನೀವು ಪ್ರಗತಿ ಹಂತದಲ್ಲಿರುವ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಒಳಗೊಂಡಿರುವ <ph name="PRODUCT_NAME" /> ದ ಒಂದು ಅಸ್ಥಿರ ಆವೃತ್ತಿಯನ್ನು ನವೀಕರಿಸುತ್ತಿರುವಿರಿ. ವಿಫಲತೆಗಳು ಮತ್ತು ಅನರೀಕ್ಷಿತ ದೋಷಗಳು ಸಂಭವಿಸುತ್ತವೆ. ದಯವಿಟ್ಟು ಎಚ್ಚರಿಕೆಯಿಂದ ಮುಂದುವರಿಯಿರಿ.</translation> <translation id="1415708812149920388">ಕ್ಲಿಪ್ಬೋರ್ಡ್ ಓದಲು ಪ್ರವೇಶವನ್ನು ನಿರಾಕರಿಸಲಾಗಿದೆ</translation> @@ -1248,7 +1247,6 @@ <translation id="1972313920920745320">ನೀವು ಸೇರಿಸುವ ಸೈಟ್ಗಳು ಯಾವಾಗಲೂ ಸಕ್ರಿಯವಾಗಿರುತ್ತವೆ ಮತ್ತು ಅವುಗಳಿಂದ ಮೆಮೊರಿಯನ್ನು ಮುಕ್ತಗೊಳಿಸಲಾಗುವುದಿಲ್ಲ. <ph name="BEGIN_LINK" />ನಿರ್ದಿಷ್ಟ ಸೈಟ್ಗಳನ್ನು ಸಕ್ರಿಯವಾಗಿರಿಸಿಕೊಳ್ಳುವುದರ ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation> <translation id="1972325230031091483">ನಿಮ್ಮ ಪ್ರಸ್ತುತ ವೆಬ್ಪುಟದ ಭೇಟಿಯ ಆಧಾರದ ಮೇಲೆ ವಿಷಯವನ್ನು ಪೂರ್ವಭಾವಿಯಾಗಿ ಲೋಡ್ ಮಾಡಿರುವುದರಿಂದ ನೀವು ವೇಗವಾಗಿ ಬ್ರೌಸ್ ಮಾಡುತ್ತೀರಿ</translation> <translation id="197288927597451399">ಇರಿಸಿ</translation> -<translation id="1973313062201924554">ನೀವು <ph name="APP_NAME" /> ಗೆ ಅನುಮತಿಸುವ ಅನುಮತಿಗಳನ್ನು ಈ ಆ್ಯಪ್ಗೆ ಸಹ ಅನುಮತಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> ಅನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಡೌನ್ಲೋಡ್ ಪಟ್ಟಿಯ ಪ್ರದೇಶಕ್ಕೆ ಹೋಗಲು Shift+F6 ಒತ್ತಿ.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL ವಿತರಣೆ ಹಂತಗಳು</translation> @@ -3947,7 +3945,6 @@ <translation id="4100733287846229632">ಸಾಧನ ಸ್ಥಳಾವಕಾಶ ತೀರಾ ಕಡಿಮೆ ಇದೆ</translation> <translation id="4100853287411968461">ಹೊಸ ವೀಕ್ಷಣಾ ಅವಧಿಯ ಮಿತಿ</translation> <translation id="4101352914005291489">ಮರೆಮಾಡಲಾಗಿರುವ SSID</translation> -<translation id="4102469565336584882">ಅಮಾನ್ಯ ಕೋಡ್. ನಿಮ್ಮ ನಮೂದು LPA ಫಾರ್ಮ್ಯಾಟ್ನಲ್ಲಿರಬೇಕು:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">ಪವರ್ವಾಷ್ಗೆ ಮರುಪ್ರಾರಂಭಿಸಿ</translation> <translation id="4104163789986725820">ರ&ಫ್ತು...</translation> <translation id="4104944259562794668">ನೀವು ಅದನ್ನು ನಂತರ ಸೆಟ್ಟಿಂಗ್ಗಳು > ಭದ್ರತೆ ಮತ್ತು ಗೌಪ್ಯತೆ > ಲಾಕ್ ಸ್ಕ್ರೀನ್ ಮತ್ತು ಸೈನ್-ಇನ್ನಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸಬಹುದು</translation> @@ -7109,7 +7106,6 @@ <translation id="6757431299485455321">ಈ ಹಾಟ್ಸ್ಪಾಟ್ ಹುಡುಕಲು ಇತರ ಸಾಧನಗಳಿಗೆ ಸಹಾಯ ಮಾಡಿ.</translation> <translation id="6758056191028427665">ನಮ್ಮ ಕೆಲಸದ ಕುರಿತು ನಿಮ್ಮ ಅಭಿಪ್ರಾಯವನ್ನು ತಿಳಿಸಿ.</translation> <translation id="6759193508432371551">ಫ್ಯಾಕ್ಟರಿ ರಿಸೆಟ್</translation> -<translation id="6761431452438552910">ನಿಮ್ಮ ಬ್ಲೂಟೂತ್ ಸಾಧನವು ಜೋಡಿಸುವಿಕೆ ಮೋಡ್ನಲ್ಲಿದೆ ಮತ್ತು ಸಮೀಪದಲ್ಲಿದೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ. ನೀವು ವಿಶ್ವಾಸ ಹೊಂದಿರುವ ಸಾಧನಗಳ ಜೊತೆ ಮಾತ್ರ ಜೋಡಿಸಿ.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">ಆನ್ ಆಗಿದೆ</translation> <translation id="676560328519657314">Google Pay ನಲ್ಲಿರುವ ನಿಮ್ಮ ಪಾವತಿ ವಿಧಾನಗಳು</translation> @@ -7403,7 +7399,6 @@ <translation id="6979737339423435258">ಎಲ್ಲ ಸಮಯ</translation> <translation id="6980402667292348590">ಸೇರಿಸಿ</translation> <translation id="6981553172137913845">ಖಾಸಗಿಯಾಗಿ ಬ್ರೌಸ್ ಮಾಡಲು, ಅಜ್ಞಾತ ವಿಂಡೋವನ್ನು ತೆರೆಯಲು ಚುಕ್ಕೆಗಳ ಐಕಾನ್ ಮೆನುವನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ</translation> -<translation id="6981761993313539853">ನಿಮ್ಮ ಬ್ಲೂಟೂತ್ ಸಾಧನವು ಜೋಡಿಸುವಿಕೆ ಮೋಡ್ನಲ್ಲಿದೆ ಮತ್ತು ಸಮೀಪದಲ್ಲಿದೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ. ನಿಮಗೆ ನಂಬಿಕೆ ಇರುವ ಸಾಧನಗಳಿಗೆ ಮಾತ್ರ ಜೋಡಣೆ ಮಾಡಿ. <ph name="BEGIN_LINK_LEARN_MORE" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ಪ್ರವೇಶ</translation> <translation id="6983507711977005608">ತತ್ಕ್ಷಣದ ಟೆಥರಿಂಗ್ ನೆಟ್ವರ್ಕ್ನ ಕನೆಕ್ಷನ್ ರದ್ದುಗೊಳಿಸಿ</translation> <translation id="6983783921975806247">ನೋಂದಾಯಿತ OID</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 767ed18..1e44ca09 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">첫 번째 탭으로 스크롤</translation> <translation id="1410806973194718079">정책을 확인할 수 없습니다.</translation> <translation id="1411400282355634827">모든 블루투스 기기 권한을 재설정하시겠습니까?</translation> -<translation id="1411724932979011919">LPA:1$<smdp address>$<activation code> 형식이어야 합니다.</translation> <translation id="1414315029670184034">사이트에서 카메라를 사용하도록 허용하지 않음</translation> <translation id="1414648216875402825">개발 중인 기능을 포함하는 <ph name="PRODUCT_NAME" />의 불안정한 버전으로 업데이트합니다. 기기가 비정상 종료되거나 예기치 않은 버그가 발생할 수 있습니다. 주의해서 진행하시기 바랍니다.</translation> <translation id="1415708812149920388">클립 보드 읽기 액세스 거부됨</translation> @@ -1250,7 +1249,6 @@ <translation id="1972313920920745320">추가한 사이트는 항상 활성 상태로 유지되며 이러한 사이트에서 메모리가 확보되지 않습니다. <ph name="BEGIN_LINK" />특정 사이트를 활성 상태로 유지하는 방법 자세히 알아보기<ph name="END_LINK" /></translation> <translation id="1972325230031091483">현재 웹페이지 방문을 토대로 콘텐츠가 미리 로드되므로 더 빠르게 탐색할 수 있습니다.</translation> <translation id="197288927597451399">계속</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" />에 허용한 권한이 이 앱에도 허용됩니다.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> 파일은 안전하게 다운로드할 수 없습니다. 다운로드바 영역으로 이동하려면 Shift+F6를 누르세요.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL 배포 지점</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">기기 저장 공간 매우 부족</translation> <translation id="4100853287411968461">기기 사용 시간 제한 업데이트</translation> <translation id="4101352914005291489">숨겨진 SSID</translation> -<translation id="4102469565336584882">잘못된 코드입니다. LPA:1$<smdp address>$<activation code> 형식이어야 합니다.</translation> <translation id="4102906002417106771">다시 시작하여 파워워시</translation> <translation id="4104163789986725820">내보내기(&X)...</translation> <translation id="4104944259562794668">나중에 설정 > 보안 및 개인 정보 보호 > 잠금 화면 및 로그인에서 사용 설정할 수 있습니다.</translation> @@ -7100,7 +7097,6 @@ <translation id="6757431299485455321">다른 기기가 이 핫스팟을 찾도록 돕습니다.</translation> <translation id="6758056191028427665">개선할 점이나 격려하고 싶은 점을 알려주세요.</translation> <translation id="6759193508432371551">초기화</translation> -<translation id="6761431452438552910">블루투스 기기를 페어링 모드로 설정하고 가까이 두세요. 신뢰하는 기기만 페어링하세요.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">사용</translation> <translation id="676560328519657314">Google Pay 결제 수단</translation> @@ -7394,7 +7390,6 @@ <translation id="6979737339423435258">전체 기간</translation> <translation id="6980402667292348590">삽입</translation> <translation id="6981553172137913845">비공개로 탐색하려면 점 아이콘 메뉴를 클릭하여 시크릿 창을 여세요.</translation> -<translation id="6981761993313539853">블루투스 기기를 페어링 모드로 설정하고 가까이 두세요. 신뢰하는 기기만 페어링하세요. <ph name="BEGIN_LINK_LEARN_MORE" />자세히 알아보기<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">접근성</translation> <translation id="6983507711977005608">인스턴트 테더링 네트워크 연결 해제</translation> <translation id="6983783921975806247">등록된 OID</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index b9e28211..4aae770 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Биринчи өтмөккө карай сыдыруу</translation> <translation id="1410806973194718079">Саясаттарды текшерүү мүмкүн болбой жатат</translation> <translation id="1411400282355634827">Bluetooth түзмөгүнүн бардык уруксаттары баштапкы абалга келтирилсинби?</translation> -<translation id="1411724932979011919">Коддо LPA форматы болушу керек:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Сайттар камераны колдоно албасын</translation> <translation id="1414648216875402825"><ph name="PRODUCT_NAME" /> туруксуз версиясын жаңыртып жатасыз, анда иштетилип жаткан мүмкүнчүлүктөр бар. Андыктан кыйлоолор жана күтүүсүз мүчүлүштүктөр келип чыгышы мүмкүн. Этияттык менен улантыңыз.</translation> <translation id="1415708812149920388">Алмашуу буферин окууга уруксат берилген жок</translation> @@ -1249,7 +1248,6 @@ <translation id="1972313920920745320">Сиз кошкон сайттар ар дайым активдүү бойдон калып, эстутумдан өчүрүлбөйт. <ph name="BEGIN_LINK" />Белгилүү бир сайттарды жигердүү сактоо жөнүндө кененирээк маалымат алыңыз<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Мазмун учурда ачылып турган веб-баракчанын негизинде жүктөлгөндүктөн, барактарды тезирээк карап чыгасыз</translation> <translation id="197288927597451399">Сактоо</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" /> колдонмосуна берилген уруксаттарды бул колдонмого да бересиз.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> файлын коопсуз жүктөп алууга болбойт. Жүктөлүп алынган файлдар тилкесине өтүү үчүн Shift+F6 баскычтарын басыңыз.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL жайылтуу түйүндөрү</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">Түзмөктө бош орун өтө аз</translation> <translation id="4100853287411968461">Экрандын иштөө убактысына жаңы чектөө коюлду</translation> <translation id="4101352914005291489">Жашырылган SSID</translation> -<translation id="4102469565336584882">Код туура эмес. Коддо LPA форматы болушу керек:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Жууп салуу үчүн өчүрүп күйгүзүү</translation> <translation id="4104163789986725820">Э&кспорттоо…</translation> <translation id="4104944259562794668">Аны кийинчерээк Параметрлер > Коопсуздук жана купуялык > Экранды кулпулоо жана кирүү бөлүмүнөн иштете аласыз</translation> @@ -7100,7 +7097,6 @@ <translation id="6757431299485455321">Башка түзмөктөргө бул байланыш түйүнүн табууга жардам бериңиз.</translation> <translation id="6758056191028427665">Биздин ишибиз тууралуу билдирип коюңуз.</translation> <translation id="6759193508432371551">Демейки параметрлерге кайтаруу</translation> -<translation id="6761431452438552910">Bluetooth түзмөгүңүз жупташтыруу режиминде жана жакын турганын текшериңиз. Ишенимдүү түзмөктөр менен гана жупташтырыңыз.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Күйүк</translation> <translation id="676560328519657314">Google Pay'деги төлөм ыкмаларыңыз</translation> @@ -7394,7 +7390,6 @@ <translation id="6979737339423435258">Бардыгы</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Купуя серептөө үчүн чекиттердин сүрөтчөсү тартылган менюну чыкылдатып, жашыруун терезени ачыңыз</translation> -<translation id="6981761993313539853">Bluetooth түзмөгүңүз жупташтыруу режиминде жана жакын турганын текшериңиз. Ишенимдүү түзмөктөр менен гана жупташтырыңыз. <ph name="BEGIN_LINK_LEARN_MORE" />Кеңири маалымат<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Атайын мүмкүн-төр</translation> <translation id="6983507711977005608">Ыкчам байланыш түйүнүнүн тармагын ажыратуу</translation> <translation id="6983783921975806247">Катталган OID</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index c4b271d8..65686eb 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -512,7 +512,6 @@ <translation id="1410797069449661718">ເລື່ອນໄປຫາແຖບທຳອິດ</translation> <translation id="1410806973194718079">ບໍ່ສາມາດກວດສອບນະໂຍບາຍໄດ້</translation> <translation id="1411400282355634827">ຣີເຊັດການອະນຸຍາດອຸປະກອນ Bluetooth ທັງໝົດບໍ?</translation> -<translation id="1411724932979011919">ຂໍ້ມູນຂອງທ່ານຄວນມີຮູບແບບ LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">ບໍ່ອະນຸຍາດໃຫ້ເວັບໄຊໃຊ້ກ້ອງຖ່າຍຮູບຂອງທ່ານ</translation> <translation id="1414648216875402825">ທ່ານກໍາລັງອັບເດດເປັນ <ph name="PRODUCT_NAME" /> ລຸ້ນບໍ່ໝັ້ນທ່ຽງ ເຊິ່ງມີຄຸນສົມບັດທີ່ດໍາເນີນການຢູ່. ການຂັດຂ້ອງ ແລະບັນຫາທີ່ບໍ່ຄາດຄິດໄວ້ຈະເກີດຂຶ້ນ. ກະລຸນາດໍາເນີນການຕໍ່ດ້ວຍຄວາມລະມັດລະວັງ.</translation> <translation id="1415708812149920388">ການເຂົ້າອ່ານຄລິບບອດຖືກປະຕິເສດ</translation> @@ -1252,7 +1251,6 @@ <translation id="1972313920920745320">ເວັບໄຊທີ່ທ່ານເພີ່ມຈະນຳໃຊ້ຢູ່ຕະຫຼອດ ແລະ ຈະບໍ່ມີການຮຽກເກັບໜ່ວຍຄວາມຈຳຈາກພວກມັນ. <ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມກ່ຽວກັບການຮັກສາໃຫ້ເວັບໄຊສະເພາະເຄື່ອນໄຫວ<ph name="END_LINK" /></translation> <translation id="1972325230031091483">ທ່ານຈະທ່ອງເວັບໄດ້ໄວຂຶ້ນເນື່ອງຈາກເນື້ອຫາມີການໂຫຼດໄວ້ກ່ອນໂດຍອ້າງອີງໃສ່ການເຂົ້າເບິ່ງໜ້າເວັບປັດຈຸບັນຂອງທ່ານ</translation> <translation id="197288927597451399">ຮັກສາໄວ້</translation> -<translation id="1973313062201924554">ການອະນຸຍາດທີ່ທ່ານມອບໃຫ້ <ph name="APP_NAME" /> ຈະຖືກອະນຸຍາດສຳລັບແອັບນີ້ນຳ.</translation> <translation id="1973763416111613016">ບໍ່ສາມາດດາວໂຫຼດ <ph name="FILE_NAME" /> ໄດ້ຢ່າງປອດໄພ. ກົດ Shift+F6 ເພື່ອໝຸນວົນໄປຫາບໍລິເວນແຖບການດາວໂຫຼດ.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">ຈຸດກະຈາຍ CRL</translation> @@ -3952,7 +3950,6 @@ <translation id="4100733287846229632">ພື້ນທີ່ຫວ່າງໃນອຸປະກອນເຫຼືອໜ້ອຍທີ່ສຸດ</translation> <translation id="4100853287411968461">ຈຳກັດເວລາໜ້າຈໍໃໝ່</translation> <translation id="4101352914005291489">SSID ທີ່ຖືກເຊື່ອງໄວ້</translation> -<translation id="4102469565336584882">ລະຫັດບໍ່ຖືກຕ້ອງ. ຂໍ້ມູນຂອງທ່ານຄວນມີຮູບແບບ LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">ຣີສະຕາດ Powerwash</translation> <translation id="4104163789986725820">ສົ່ງອອກ...</translation> <translation id="4104944259562794668">ທ່ານສາມາດເປີດໃຊ້ມັນພາຍຫຼັງໃນການຕັ້ງຄ່າ > ຄວາມປອດໄພ ແລະ ຄວາມເປັນສ່ວນຕົວ > ໜ້າຈໍລັອກ ແລະ ເຂົ້າສູ່ລະບົບ</translation> @@ -7110,7 +7107,6 @@ <translation id="6757431299485455321">ຊ່ວຍອຸປະກອນອື່ນຊອກຫາຮັອດສະປອດນີ້.</translation> <translation id="6758056191028427665">ໃຫ້ພວກເຮົາຮູ້ວ່າພວກເຮົາກຳລັງເຮັດໄດ້ດີສໍ່າໃດ.</translation> <translation id="6759193508432371551">ຕັ້ງຄ່າຄືນເປັນຄ່າໂຮງງານ</translation> -<translation id="6761431452438552910">ກະລຸນາກວດສອບວ່າອຸປະກອນ Bluetooth ຂອງທ່ານຢູ່ໃນໂໝດຈັບຄູ່ ແລະ ຢູ່ໃກ້ຄຽງ. ທ່ານຄວນຈັບຄູ່ກັບອຸປະກອນທີ່ທ່ານເຊື່ອຖືເທົ່ານັ້ນ.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">ເປີດ</translation> <translation id="676560328519657314">ວິທີການຈ່າຍເງິນຂອງທ່ານໃນ Google Pay</translation> @@ -7404,7 +7400,6 @@ <translation id="6979737339423435258">ທຸກເວລາ</translation> <translation id="6980402667292348590">ແຊກ</translation> <translation id="6981553172137913845">ເພື່ອທ່ອງເວັບແບບສ່ວນຕົວ, ກະລຸນາຄລິກເມນູໄອຄອນຈ້ຳເມັດເພື່ອເປີດໜ້າຈໍທີ່ບໍ່ເປີດເຜີຍຕົວຕົນ</translation> -<translation id="6981761993313539853">ກະລຸນາກວດສອບວ່າອຸປະກອນ Bluetooth ຂອງທ່ານຢູ່ໃນໂໝດການຈັບຄູ່ ແລະ ຢູ່ໃກ້ຄຽງ. ທ່ານຄວນຈັບຄູ່ກັບອຸປະກອນທີ່ທ່ານເຊື່ອຖືເທົ່ານັ້ນ. <ph name="BEGIN_LINK_LEARN_MORE" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ການເຂົ້າເຖິງໄດ້</translation> <translation id="6983507711977005608">ຕັດການເຊື່ອມຕໍ່ເຄືອຂ່າຍການປ່ອຍສັນຍານທັນທີ</translation> <translation id="6983783921975806247">ລົງທະບຽນ OID ແລ້ວ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 0046433..abe064e 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -513,7 +513,6 @@ <translation id="1410797069449661718">Slinkti į pirmą skirtuką</translation> <translation id="1410806973194718079">Nepavyko patikrinti politikos</translation> <translation id="1411400282355634827">Iš naujo nustatyti visus „Bluetooth“ įrenginio leidimus?</translation> -<translation id="1411724932979011919">Turite įvesti LPA formatu:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Neleisti svetainėms naudoti fotoaparato</translation> <translation id="1414648216875402825">Atnaujinate į nestabilią „<ph name="PRODUCT_NAME" />“ versiją, kuri apima vis dar kuriamas funkcijas. Bus strigčių ir netikėtų trikčių. Būkite atsargūs.</translation> <translation id="1415708812149920388">Iškarpinės skaitymo prieiga atmesta</translation> @@ -1252,7 +1251,6 @@ <translation id="1972313920920745320">Jūsų pridėtos svetainės visada liks aktyvios ir atminties vietos jose nebus atlaisvinta. <ph name="BEGIN_LINK" />Sužinokite daugiau, kaip išlaikyti konkrečias svetaines aktyvias<ph name="END_LINK" />.</translation> <translation id="1972325230031091483">Naršysite sparčiau, nes turinys įkeliamas iš anksto atsižvelgiant į tinklalapį, kuriame šiuo metu lankotės</translation> <translation id="197288927597451399">Palikti</translation> -<translation id="1973313062201924554">Leidimai, kuriuos suteikiate programai „<ph name="APP_NAME" />“, taip pat bus suteikti šiai programai.</translation> <translation id="1973763416111613016">Negalima saugiai atsisiųsti failo „<ph name="FILE_NAME" />“. Kad perjungtumėte į atsisiuntimų juostą, paspauskite „Shift“ + F6.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL paskirstymo vietos</translation> @@ -3946,7 +3944,6 @@ <translation id="4100733287846229632">Labai mažai vietos įrenginyje</translation> <translation id="4100853287411968461">Naujas įrenginio naudojimo laiko apribojimas</translation> <translation id="4101352914005291489">Paslėptas SSID</translation> -<translation id="4102469565336584882">Netinkamas kodas. Turite įvesti LPA formatu:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Paleisti iš naujo, kad būtų paleista „Powerwash“</translation> <translation id="4104163789986725820">Eksportuoti...</translation> <translation id="4104944259562794668">Tai galite įgalinti vėliau apsilankę skiltyje „Nustatymai“ > „Sauga ir privatumas“ > „Užrakinimo ekranas ir prisijungimas“</translation> @@ -7110,7 +7107,6 @@ <translation id="6757431299485455321">Padėkite kitiems įrenginiams rasti šį viešosios interneto prieigos tašką.</translation> <translation id="6758056191028427665">Pateikite atsiliepimų.</translation> <translation id="6759193508432371551">Gamykliniai nustatymai</translation> -<translation id="6761431452438552910">Įsitikinkite, kad „Bluetooth“ įrenginys yra netoliese ir veikia susiejimo režimu. Susiekite tik su patikimais įrenginiais.</translation> <translation id="676158322851696513">„<ph name="EXTENSION_NAME" />“</translation> <translation id="6762833852331690540">Įjungta</translation> <translation id="676560328519657314">Mokėjimo metodai sistemoje „Google Pay“</translation> @@ -7404,7 +7400,6 @@ <translation id="6979737339423435258">Visas laikotarpis</translation> <translation id="6980402667292348590">įterpti</translation> <translation id="6981553172137913845">Kad galėtumėte naršyti privačiai, spustelėdami taškų piktogramos meniu atidarykite inkognito langą</translation> -<translation id="6981761993313539853">Įsitikinkite, kad „Bluetooth“ įrenginys yra netoliese ir veikia susiejimo režimu. Susiekite tik su patikimais įrenginiais. <ph name="BEGIN_LINK_LEARN_MORE" />Sužinokite daugiau<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Pritaikymas neįgaliesiems</translation> <translation id="6983507711977005608">Atjungti momentinio įrenginio kaip modemo naudojimo tinklą</translation> <translation id="6983783921975806247">Registruotas OID</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 71d37b01..394ddf6d 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Ritināt līdz pirmajai cilnei</translation> <translation id="1410806973194718079">Nevar pārbaudīt politikas</translation> <translation id="1411400282355634827">Vai atiestatīt visas Bluetooth ierīču atļaujas?</translation> -<translation id="1411724932979011919">Ievadiet kodu šādā formātā: LPA:1$<SMDP adrese>$<aktivizācijas kods>.</translation> <translation id="1414315029670184034">Neļaut vietnēm izmantot jūsu kameru</translation> <translation id="1414648216875402825">Jūs atjaunināt uz nestabilu <ph name="PRODUCT_NAME" /> versiju, kurā ietvertas funkcijas, kas vēl tiek izstrādātas. Radīsies avārijas un neparedzētas kļūdas. Rīkojieties apdomīgi!</translation> <translation id="1415708812149920388">Liegta piekļuve starpliktuves satura lasīšanai</translation> @@ -1239,7 +1238,6 @@ <translation id="1972313920920745320">Pievienotās vietnes vienmēr būs aktīvas, un tajās netiks atbrīvota atmiņa. <ph name="BEGIN_LINK" />Uzziniet vairāk par to, kā konkrētas vietnes saglabāt aktīvas<ph name="END_LINK" />.</translation> <translation id="1972325230031091483">Pārlūkošana būs ātrāka, jo saturs tiks iepriekš ielādēts, pamatojoties uz jūsu pašlaik apmeklēto tīmekļa lapu.</translation> <translation id="197288927597451399">Paturēt</translation> -<translation id="1973313062201924554">Lietotnei <ph name="APP_NAME" /> piešķirtās atļaujas tiks izmantotas arī šajā lietotnē.</translation> <translation id="1973763416111613016">Failu “<ph name="FILE_NAME" />” nevar droši lejupielādēt. Lai pārslēgtos uz lejupielāžu joslas zonu, nospiediet taustiņu kombināciju Shift+F6.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL izplatīšanas punkti</translation> @@ -3930,7 +3928,6 @@ <translation id="4100733287846229632">Ierīces diskā gandrīz nav vietas</translation> <translation id="4100853287411968461">Jauns izmantošanas ilguma ierobežojums</translation> <translation id="4101352914005291489">Slēpts SSID</translation> -<translation id="4102469565336584882">Kods nav derīgs. Ievadiet kodu šādā formātā: LPA:1$<SMDP adrese>$<aktivizācijas kods>.</translation> <translation id="4102906002417106771">Restartēt, lai aktivizētu funkciju Powerwash</translation> <translation id="4104163789986725820">E&ksportēt...</translation> <translation id="4104944259562794668">Vēlāk varat to iespējot sadaļā Iestatījumi > Drošība un konfidencialitāte > Ekrāna bloķēšana un pierakstīšanās.</translation> @@ -7087,7 +7084,6 @@ <translation id="6757431299485455321">Varat palīdzēt citām ierīcēm atrast šo tīklāju.</translation> <translation id="6758056191028427665">Sniedziet atsauksmes par pakalpojuma darbību.</translation> <translation id="6759193508432371551">Rūpnīcas datu atiestatīšana</translation> -<translation id="6761431452438552910">Jūsu Bluetooth ierīcē ir jābūt aktivizētam režīmam savienošanai pārī, un tai ir jāatrodas tuvumā. Veiciet savienošanu pārī tikai ar uzticamām ierīcēm.</translation> <translation id="676158322851696513">“<ph name="EXTENSION_NAME" />”</translation> <translation id="6762833852331690540">Ieslēgts</translation> <translation id="676560328519657314">Jūsu maksājumu veidi pakalpojumā Google Pay</translation> @@ -7381,7 +7377,6 @@ <translation id="6979737339423435258">Visā periodā</translation> <translation id="6980402667292348590">ievietošanas taustiņš</translation> <translation id="6981553172137913845">Lai pārlūkotu tīmekli privāti, atveriet inkognito režīma logu, noklikšķinot uz punktu ikonas izvēlnes.</translation> -<translation id="6981761993313539853">Jūsu Bluetooth ierīcē ir jābūt aktivizētam režīmam savienošanai pārī, un tai ir jāatrodas tuvumā. Veiciet savienošanu pārī tikai ar uzticamām ierīcēm. <ph name="BEGIN_LINK_LEARN_MORE" />Uzziniet vairāk<ph name="END_LINK_LEARN_MORE" />.</translation> <translation id="6981982820502123353">Pieejamība</translation> <translation id="6983507711977005608">Tūlītējas piesaistes tīkla atvienošana</translation> <translation id="6983783921975806247">Reģistrētais OID</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 5cc3b5d2..ed760dd6 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">Лизгајте кон првата картичка</translation> <translation id="1410806973194718079">Не може да се проверат правилата</translation> <translation id="1411400282355634827">Дали да се ресетираат сите дозволи за уредите со Bluetooth?</translation> -<translation id="1411724932979011919">Кодот треба да биде во форматот LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Не им дозволувај на сајтовите да ја користат камерата</translation> <translation id="1414648216875402825">Ажурирате во нестабилна верзија на <ph name="PRODUCT_NAME" /> која содржи карактеристики кои се во тек. Ќе настанат падови и неочекувани грешки. Продолжете со внимание.</translation> <translation id="1415708812149920388">Одбиен е пристапот за читање на привремената меморија</translation> @@ -1250,7 +1249,6 @@ <translation id="1972313920920745320">Сајтовите што ќе ги додадете секогаш ќе бидат активни и на нив нема да се ослободува меморија. <ph name="BEGIN_LINK" />Дознајте повеќе за одржувањето на активноста на конкретни сајтови<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Ќе прелистувате побрзо бидејќи содржините се вчитуваат проактивно според вашата тековна посета на веб-страницата</translation> <translation id="197288927597451399">Чувај</translation> -<translation id="1973313062201924554">Дозволите за <ph name="APP_NAME" /> ќе важат и за оваа апликација.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> не може да се преземе безбедно. Притиснете Shift + F6 за да одите до областа на лентата за преземања.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL точки на дистрибуција</translation> @@ -3944,7 +3942,6 @@ <translation id="4100733287846229632">Просторот на уредот е критично низок</translation> <translation id="4100853287411968461">Ново ограничување за времето поминато на уредот</translation> <translation id="4101352914005291489">Скриен SSID</translation> -<translation id="4102469565336584882">Погрешен код. Кодот треба да биде во форматот LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Рестартирајте за фабричко ресетирање</translation> <translation id="4104163789986725820">Из&вези...</translation> <translation id="4104944259562794668">Може да овозможите подоцна во „Поставки > Приватност и безбедност > Заклучен екран и најавување“</translation> @@ -7103,7 +7100,6 @@ <translation id="6757431299485455321">Помогни другите уреди да ја најдат точкава на пристап.</translation> <translation id="6758056191028427665">Оценете ја нашата работа.</translation> <translation id="6759193508432371551">Ресетирање до фабрички вредности</translation> -<translation id="6761431452438552910">Проверете дали уредот со Bluetooth е во режим на спарување и во близина. Сапрувајте само доверливи уреди.</translation> <translation id="676158322851696513">„<ph name="EXTENSION_NAME" />“</translation> <translation id="6762833852331690540">Вклучено</translation> <translation id="676560328519657314">Вашите начини на плаќање во Google Pay</translation> @@ -7397,7 +7393,6 @@ <translation id="6979737339423435258">Целосната историја</translation> <translation id="6980402667292348590">копче insert</translation> <translation id="6981553172137913845">За да прелистувате приватно, кликнете на менито од иконата со точки за да отворите прозорец „Инкогнито“</translation> -<translation id="6981761993313539853">Проверете дали уредот со Bluetooth е во режим на спарување и е во близина. Сапрувајте само доверливи уреди. <ph name="BEGIN_LINK_LEARN_MORE" />Дознајте повеќе<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Пристапност</translation> <translation id="6983507711977005608">Исклучување инстант врзување на мрежа</translation> <translation id="6983783921975806247">Регистриран OID</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index ed966c7..21278ce 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -512,7 +512,6 @@ <translation id="1410797069449661718">ആദ്യത്തെ ടാബിലേക്ക് സ്ക്രോൾ ചെയ്യുക</translation> <translation id="1410806973194718079">നയങ്ങൾ പരിശോധിക്കാനാകുന്നില്ല</translation> <translation id="1411400282355634827">എല്ലാ Bluetooth ഉപകരണ അനുമതികളും റീസെറ്റ് ചെയ്യണോ?</translation> -<translation id="1411724932979011919">നിങ്ങളുടെ എൻട്രിയിൽ LPA:1$<smdp address>$<activation code> എന്ന ഫോർമാറ്റ് ഉണ്ടായിരിക്കണം</translation> <translation id="1414315029670184034">നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാൻ സൈറ്റുകളെ അനുവദിക്കരുത്</translation> <translation id="1414648216875402825">നിങ്ങൾ പുരോഗതിയിലുള്ള സവിശേഷതകൾ അടങ്ങിയ <ph name="PRODUCT_NAME" />-ന്റെ അസ്ഥിരമായ പതിപ്പിലേക്ക് അപ്ഡേറ്റ് ചെയ്യുന്നു. ക്രാഷുകളും അപ്രതീക്ഷിത ബഗ്ഗുകളും ഉണ്ടാകും. കരുതലോടെ മുന്നോട്ടുപോകുക.</translation> <translation id="1415708812149920388">ക്ലിപ്പ്ബോർഡ് വായിക്കുന്നതിനുള്ള ആക്സസ് നിരസിക്കപ്പെട്ടു</translation> @@ -1242,7 +1241,6 @@ <translation id="1972313920920745320">നിങ്ങൾ ചേർക്കുന്ന സൈറ്റുകൾ എപ്പോഴും സജീവമായി തുടരും, അവയിൽ നിന്ന് മെമ്മറിയിൽ ഇടമുണ്ടാക്കില്ല. <ph name="BEGIN_LINK" />നിർദ്ദിഷ്ട സൈറ്റുകൾ സജീവമായി നിലനിർത്തുന്നതിനെക്കുറിച്ച് കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="1972325230031091483">നിങ്ങളുടെ നിലവിലെ വെബ്പേജ് സന്ദർശനം അടിസ്ഥാനമാക്കി സമയോചിതമായി ഉള്ളടക്കം ലോഡ് ചെയ്യുന്നതിനാൽ നിങ്ങൾക്ക് കൂടുതൽ വേഗത്തിൽ ബ്രൗസ് ചെയ്യാം</translation> <translation id="197288927597451399">Keep</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" /> ആപ്പിനായി നൽകിയിരിക്കുന്ന അനുമതികൾ ഈ ആപ്പിനും നൽകും.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> സുരക്ഷിതമായി ഡൗൺലോഡ് ചെയ്യാനാകില്ല. ഡൗൺലോഡ് വിവരങ്ങളുടെ ബാർ ഏരിയയിലേക്ക് പോകാൻ Shift+F6 അമർത്തുക.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL വിതരണ പോയിന്റുകള്</translation> @@ -3936,7 +3934,6 @@ <translation id="4100733287846229632">ഉപകരണത്തിൽ ഇടം വളരെ കുറവാണ്</translation> <translation id="4100853287411968461">പുതിയ സ്ക്രീൻ സമയ പരിധി</translation> <translation id="4101352914005291489">മറച്ചിരിക്കുന്ന SSID</translation> -<translation id="4102469565336584882">കോഡ് അസാധുവാണ്. നിങ്ങളുടെ എൻട്രിയിൽ LPA:1$<smdp address>$<activation code> എന്ന ഫോർമാറ്റ് ഉണ്ടായിരിക്കണം</translation> <translation id="4102906002417106771">Powerwash ചെയ്യുന്നതിന് റീസ്റ്റാർട്ട് ചെയ്യുക</translation> <translation id="4104163789986725820">കയ&റ്റുമതി ചെയ്യുക...</translation> <translation id="4104944259562794668">ക്രമീകരണം > സുരക്ഷയും സ്വകാര്യതയും > ലോക്ക് സ്ക്രീനും സൈൻ ഇൻ ചെയ്യൽ എന്നതിൽ നിങ്ങൾക്കിത് പിന്നീട് പ്രവർത്തനക്ഷമമാക്കാം</translation> @@ -7096,7 +7093,6 @@ <translation id="6757431299485455321">ഈ ഹോട്ട്സ്പോട്ട് കണ്ടെത്താൻ മറ്റ് ഉപകരണങ്ങളെ സഹായിക്കുക.</translation> <translation id="6758056191028427665">ഞങ്ങളുടെ പ്രവർത്തനത്തെക്കുറിച്ചുള്ള അഭിപ്രായം അറിയിക്കൂ.</translation> <translation id="6759193508432371551">ഫാക്ടറി റീസെറ്റ് ചെയ്യൽ</translation> -<translation id="6761431452438552910">നിങ്ങളുടെ Bluetooth ഉപകരണം ജോടിയാക്കൽ മോഡിലാണെന്നും സമീപത്തുണ്ടെന്നും ഉറപ്പാക്കുക. നിങ്ങൾക്ക് വിശ്വാസമുള്ള ഉപകരണങ്ങളുമായി മാത്രം ജോടിയാക്കുക.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">ഓണാണ്</translation> <translation id="676560328519657314">Google Pay-യിലെ നിങ്ങളുടെ പേയ്മെന്റ് രീതികൾ</translation> @@ -7390,7 +7386,6 @@ <translation id="6979737339423435258">എല്ലാ സമയത്തും</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">സ്വകാര്യമായി ബ്രൗസ് ചെയ്യാൻ, ഡോട്ട് ഐക്കൺ ക്ലിക്ക് ചെയ്ത് അദൃശ്യ വിൻഡോ തുറക്കുക</translation> -<translation id="6981761993313539853">നിങ്ങളുടെ Bluetooth ഉപകരണം ജോടിയാക്കൽ മോഡിലാണെന്നും സമീപത്തുണ്ടെന്നും ഉറപ്പാക്കുക. നിങ്ങൾക്ക് വിശ്വാസമുള്ള ഉപകരണങ്ങളുമായി മാത്രം ജോടിയാക്കുക. <ph name="BEGIN_LINK_LEARN_MORE" />കൂടുതലറിയുക<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ഉപയോഗസഹായി</translation> <translation id="6983507711977005608">തൽക്ഷണ ടെതറിംഗ് നെറ്റ്വർക്ക് വിച്ഛേദിക്കുക</translation> <translation id="6983783921975806247">രജിസ്ട്രേഡ് OID</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 21727acb..1e2db8ba 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Эхний таб руу гүйлгэх</translation> <translation id="1410806973194718079">Бодлогуудыг шалгах боломжгүй байна</translation> <translation id="1411400282355634827">Bluetooth төхөөрөмжийн бүх зөвшөөрлийг шинэчлэх үү?</translation> -<translation id="1411724932979011919">Таны оролт LPA форматтай байх ёстой:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Сайтуудад таны камерыг ашиглахыг бүү зөвшөөр</translation> <translation id="1414648216875402825">Та <ph name="PRODUCT_NAME" />-ийн боловсруулалтын явцдаа байгаа функцууд агуулсан тогтворгүй хувилбарыг шинэчилж байна. Гэмтэл болон гэнэтийн асуудлууд үүсч болохыг анхаарна уу.</translation> <translation id="1415708812149920388">Түр санах ойн унших хандалтыг зөвшөөрөөгүй</translation> @@ -1245,7 +1244,6 @@ <translation id="1972313920920745320">Таны нэмсэн сайтууд үргэлж идэвхтэй байх бөгөөд тэдгээрээс санах ойг чөлөөлөхгүй. <ph name="BEGIN_LINK" />Тодорхой сайтуудыг идэвхтэй байлгах талаар нэмэлт мэдээлэл авах<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Контентыг таны одоогийн веб хуудасны зочилсон байдалд тулгуурлан идэвхтэй ачаалсан тул та илүү хурдан үзнэ</translation> <translation id="197288927597451399">Хадгал</translation> -<translation id="1973313062201924554">Таны <ph name="APP_NAME" />-д өгсөн зөвшөөрлийг энэ аппад мөн зөвшөөрнө.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" />-г аюулгүй татах боломжгүй. Татаж авсан файл хадгалах эсвэл нээх хэсэг рүү шилжихийн тулд Shift+F6-г дарна уу.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL Түгээх цэг</translation> @@ -3938,7 +3936,6 @@ <translation id="4100733287846229632">Төхөөрөмжийн зай маш бага</translation> <translation id="4100853287411968461">Дэлгэцийн цагийн шинэ хязгаарлалт</translation> <translation id="4101352914005291489">Нуусан SSID</translation> -<translation id="4102469565336584882">Код буруу байна. Таны оролт LPA форматтай байх ёстой:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Үйлдвэрийн тохиргоонд нь буцааж оруулахын тулд дахин эхлүүлэх</translation> <translation id="4104163789986725820">Экспортлох ...</translation> <translation id="4104944259562794668">Та үүнийг дараа нь Тохиргоо > Аюулгүй байдал болон Нууцлал > Түгжигдсэн дэлгэц, нэвтрэх хэсэгт идэвхжүүлэх боломжтой</translation> @@ -7095,7 +7092,6 @@ <translation id="6757431299485455321">Бусад төхөөрөмжүүдэд энэ сүлжээний цэгийг олоход тусална уу.</translation> <translation id="6758056191028427665">Биднийг хэр ажиллаж байгааг мэдэгдэнэ үү.</translation> <translation id="6759193508432371551">Үйлдвэрийн тохиргоонд нь буцааж оруулах</translation> -<translation id="6761431452438552910">Bluetooth төхөөрөмжөө хослуулах горимд болон ойролцоо байгаа эсэхийг шалгаарай. Зөвхөн итгэдэг төхөөрөмжүүдтэйгээ хослуулна уу.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Асаалттай</translation> <translation id="676560328519657314">Таны Google Pay дэх төлбөрийн хэрэгслүүд</translation> @@ -7389,7 +7385,6 @@ <translation id="6979737339423435258">Бүх цаг</translation> <translation id="6980402667292348590">оруулах</translation> <translation id="6981553172137913845">Нууцлалтайгаар үзэхийн тулд цэсийн цэгэн дүрс тэмдгийг товшиж, Нууцлалтай цонхыг нээнэ үү</translation> -<translation id="6981761993313539853">Bluetooth төхөөрөмжөө хослуулах горимд болон ойролцоо байгаа эсэхийг шалгаарай. Зөвхөн итгэдэг төхөөрөмжүүдтэйгээ хослуулна уу. <ph name="BEGIN_LINK_LEARN_MORE" />Нэмэлт мэдээлэл авах<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Хандалт</translation> <translation id="6983507711977005608">Шуурхай модем болгох сүлжээг салгах</translation> <translation id="6983783921975806247">OID-ыг бүртгэсэн</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 3fa0380a..12e8c209 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">पहिल्या टॅबवर स्क्रोल करा</translation> <translation id="1410806973194718079">धोरणे तपासता आली नाहीत</translation> <translation id="1411400282355634827">सर्व ब्लूटूथ डिव्हाइस परवानग्या रीसेट करायच्या का?</translation> -<translation id="1411724932979011919">तुमची एंट्री ही LPA:1$<smdp address>$<activation code> या फॉरमॅटमध्ये असणे आवश्यक आहे</translation> <translation id="1414315029670184034">साइटना तुमचा कॅमेरा वापरण्याची अनुमती देऊ नका</translation> <translation id="1414648216875402825">तुम्ही <ph name="PRODUCT_NAME" /> च्या अस्थिर आवृत्तीवर अपडेट करत आहात ज्यात प्रगतीपथावर असलेली वैशिष्ट्ये आहेत. क्रॅश आणि अनपेक्षित दोष आढळतील. कृपया सावधगिरीसह पुढे जा.</translation> <translation id="1415708812149920388">क्लिपबोर्डचा रीड अॅक्सेस नाकारला</translation> @@ -1248,7 +1247,6 @@ <translation id="1972313920920745320">तुम्ही जोडलेल्या साइट नेहमी अॅक्टिव्ह राहतील आणि त्यांच्याकडून मेमरी मोकळी केली जाणार नाही. <ph name="BEGIN_LINK" />विशिष्ट साइट अॅक्टिव्ह ठेवण्याबद्दल अधिक जाणून घ्या<ph name="END_LINK" /></translation> <translation id="1972325230031091483">तुम्हाला आणखी जलद ब्राउझ करता येईल कारण तुमच्या सध्याच्या वेबपेज भेटीच्या आधारावर आशय प्रोॲक्टिव्हपणे लोड केला जातो</translation> <translation id="197288927597451399">ठेवा</translation> -<translation id="1973313062201924554">तुम्ही <ph name="APP_NAME" /> साठी ज्या परवानग्यांना अनुमती देता, त्यांना या अॅपसाठीदेखील अनुमती दिली जाईल.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> सुरक्षितपणे डाउनलोड केली जाऊ शकत नाही. डाउनलोड बार भागाकडे जाण्यासाठी Shift+F6 प्रेस करा.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL वितरण बिंदू</translation> @@ -3940,7 +3938,6 @@ <translation id="4100733287846229632">डिव्हाइस वरील स्थान खूप कमी आहे</translation> <translation id="4100853287411968461">नवीन स्क्रीन वेळ मर्यादा</translation> <translation id="4101352914005291489">लपवलेला SSID</translation> -<translation id="4102469565336584882">कोड चुकीचा आहे. तुमची एंट्री ही LPA:1$<smdp address>$<activation code> या फॉरमॅटमध्ये असणे आवश्यक आहे</translation> <translation id="4102906002417106771">पॉवरवॉश करण्यासाठी रीस्टार्ट करा</translation> <translation id="4104163789986725820">नि&र्यात करा...</translation> <translation id="4104944259562794668">तुम्ही सेटिंग्ज > सुरक्षा आणि गोपनीयता> लॉक स्क्रीन व साइन-इन यामध्ये नंतर कधीही ते सुरू करू शकता</translation> @@ -7098,7 +7095,6 @@ <translation id="6757431299485455321">इतर डिव्हाइसना हा हॉटस्पॉट शोधण्यात मदत करा.</translation> <translation id="6758056191028427665">आम्ही आमचे काम कसे करत आहोत त्याबद्दल आम्हाला कळवा.</translation> <translation id="6759193508432371551">फॅक्टरी रीसेट</translation> -<translation id="6761431452438552910">तुमचे ब्लूटूथ डिव्हाइस हे पेअरिंग मोडमध्ये आणि जवळपास असल्याची खात्री करा. फक्त तुमचा विश्वास असलेल्या डिव्हाइससह पेअर करा.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">सुरू</translation> <translation id="676560328519657314">Google Pay मधील तुमच्या पेमेंट पद्धती</translation> @@ -7392,7 +7388,6 @@ <translation id="6979737339423435258">पूर्णवेळ</translation> <translation id="6980402667292348590">घाला</translation> <translation id="6981553172137913845">खाजगीरीत्या ब्राउझ करण्यासाठी, गुप्त विंडो उघडण्याकरिता डॉट आयकन मेनूवर क्लिक करा</translation> -<translation id="6981761993313539853">तुमचे ब्लूटूथ डिव्हाइस हे पेअरिंग मोडमध्ये आणि जवळपास असल्याची खात्री करा. फक्त तुमचा विश्वास असलेल्या डिव्हाइससोबत पेअर करा. <ph name="BEGIN_LINK_LEARN_MORE" />अधिक जाणून घ्या<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ॲक्सेसिबिलिटी</translation> <translation id="6983507711977005608">इंस्टंट टेदरिंग नेटवर्क डिस्कनेक्ट करा</translation> <translation id="6983783921975806247">नोंदणीकृत OID</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 0b7326d..b4d0a8e 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Tatal ke arah tab pertama</translation> <translation id="1410806973194718079">Tidak dapat menyemak dasar</translation> <translation id="1411400282355634827">Tetapkan semula semua kebenaran peranti Bluetooth?</translation> -<translation id="1411724932979011919">Masukan anda sepatutnya mempunyai format LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Jangan benarkan laman menggunakan kamera anda</translation> <translation id="1414648216875402825">Anda sedang mengemas kini kepada versi <ph name="PRODUCT_NAME" /> tidak stabil yang mengandungi ciri yang masih diproses. Keranapan dan pepijat yang tidak dijangka akan berlaku. Sila teruskan dengan berhati-hati.</translation> <translation id="1415708812149920388">Akses baca papan keratan ditolak</translation> @@ -1249,7 +1248,6 @@ <translation id="1972313920920745320">Laman yang anda tambahkan akan sentiasa aktif dan memori tidak akan dikosongkan daripada laman tersebut. <ph name="BEGIN_LINK" />Ketahui lebih lanjut tentang memastikan laman tertentu aktif<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Anda akan menyemak imbas dengan lebih pantas kerana kandungan dimuatkan secara proaktif berdasarkan lawatan halaman web semasa anda</translation> <translation id="197288927597451399">Simpan</translation> -<translation id="1973313062201924554">Kebenaran yang anda benarkan <ph name="APP_NAME" /> juga akan dibenarkan untuk apl ini.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> tidak dapat dimuat turun dengan selamat. Tekan Shift+F6 untuk mencapai kawasan bar muat turun.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Titik Pengedaran CRL</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">Ruang peranti terlalu rendah</translation> <translation id="4100853287411968461">Had masa skrin baharu</translation> <translation id="4101352914005291489">SSID tersembunyi</translation> -<translation id="4102469565336584882">Kod tidak sah. Masukan anda sepatutnya mempunyai format LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Mulakan semula untuk menjalankan powerwash</translation> <translation id="4104163789986725820">E&ksport...</translation> <translation id="4104944259562794668">Anda boleh mendayakan sambungan itu kemudian dalam Tetapan > Sekuriti dan Privasi > Skrin kunci dan log masuk</translation> @@ -7100,7 +7097,6 @@ <translation id="6757431299485455321">Membantu peranti lain menemukan tempat liputan ini.</translation> <translation id="6758056191028427665">Beritahu kami tentang prestasi kami.</translation> <translation id="6759193508432371551">Tetapan semula kilang</translation> -<translation id="6761431452438552910">Pastikan peranti Bluetooth anda dalam mod penggandingan dan berdekatan. Hanya gandingkan dengan peranti yang anda percayai.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Hidupkan</translation> <translation id="676560328519657314">Kaedah pembayaran anda pada Google Pay</translation> @@ -7394,7 +7390,6 @@ <translation id="6979737339423435258">Sepanjang masa</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Untuk menyemak imbas secara tertutup, klik menu ikon titik untuk membuka tetingkap Inkognito</translation> -<translation id="6981761993313539853">Pastikan peranti Bluetooth anda dalam mod penggandingan dan berdekatan. Hanya gandingkan dengan peranti yang anda percayai. <ph name="BEGIN_LINK_LEARN_MORE" />Ketahui lebih lanjut<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Kebolehcapaian</translation> <translation id="6983507711977005608">Putuskan sambungan rangkaian Penambatan Segera</translation> <translation id="6983783921975806247">OID berdaftar</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index b823c89e3..62b8e7c0 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -512,7 +512,6 @@ <translation id="1410797069449661718">ပထမဆုံး တဘ်အထိ လှိမ့်ခြင်း</translation> <translation id="1410806973194718079">မူဝါဒများကို စစ်ဆေး၍မရပါ</translation> <translation id="1411400282355634827">ဘလူးတုသ်သုံးစက် ခွင့်ပြုချက်အားလုံးကို ပြင်ဆင်သတ်မှတ်မလား။</translation> -<translation id="1411724932979011919">သင့်ထည့်သွင်းမှုသည် LPA:1$<smdp လိပ်စာ>$<စသုံးရန်ကုဒ်> ပုံစံအတိုင်း ဖြစ်သင့်သည်</translation> <translation id="1414315029670184034">သင့်ကင်မရာသုံးရန် ဝဘ်ဆိုက်များကို ခွင့်မပြုပါနှင့်</translation> <translation id="1414648216875402825">သင်သည် မတည်ငြိမ်သည့် <ph name="PRODUCT_NAME" /> ဗားရှင်းသို့အဆင့်မြှင့်နေသည် ၎င်းတွင် တိုးတက်ဆဲ အင်္ဂါရပ်များပါဝင်သည်။ ပျက်စီးခြင်းများနှင့် မမျှော်လင့်သည့် မှားယွင်းမှုများ ဖြစ်နိုင်ပါသည်။ ကျေးဇူးပြု၍ သတိဖြင့် ရှေ့ဆက်ပါ။</translation> <translation id="1415708812149920388">ကလစ်ဘုတ် ကြည့်ရှုခွင့်ကို ငြင်းပယ်ထားခြင်း</translation> @@ -1253,7 +1252,6 @@ <translation id="1972313920920745320">သင်ထည့်သည့် ဝဘ်ဆိုက်များသည် အမြဲပွင့်နေမည်ဖြစ်ပြီး ၎င်းတို့၏ မှတ်ဉာဏ်ကို ရှင်းမည်မဟုတ်ပါ။ <ph name="BEGIN_LINK" />သတ်မှတ်ထားသောဝဘ်ဆိုင်များ ဆက်ဖွင့်ထားခြင်းနှင့် ပတ်သက်ပြီး ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation> <translation id="1972325230031091483">လက်ရှိဝဘ်စာမျက်နှာ ဝင်ကြည့်ခြင်းအပေါ် အခြေခံပြီး အကြောင်းအရာကို ကြိုတင်ဖန်တီးထားသောကြောင့် ကြည့်ရှုရာတွင် ပိုမြန်ပါမည်</translation> <translation id="197288927597451399">သိမ်းမည်</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" /> အတွက် သင်၏ခွင့်ပြုချက်များကို ဤအက်ပ်အတွက်လည်း ခွင့်ပြုပါမည်။</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> ကို လုံခြုံစွာ ဒေါင်းလုဒ်လုပ်၍မရပါ။ ဒေါင်းလုဒ်များ ဘားဧရိယာသို့ သွားရန် Shift+F6 နှိပ်ပါ။</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL ဖြန့်ချိရေး အမှတ်များ</translation> @@ -3950,7 +3948,6 @@ <translation id="4100733287846229632">စက်ပစ္စည်း၏နေရာ အလွန်နည်းနေပါပြီ</translation> <translation id="4100853287411968461">အသုံးပြုချိန် ကန့်သတ်ချက်အသစ်</translation> <translation id="4101352914005291489">ဖျောက်ထားသော SSID</translation> -<translation id="4102469565336584882">ကုဒ် မမှန်ကန်ပါ။ သင့်ထည့်သွင်းမှုသည် LPA:1$<smdp လိပ်စာ>$<စသုံးရန်ကုဒ်> ပုံစံအတိုင်း ဖြစ်သင့်သည်</translation> <translation id="4102906002417106771">Powerwash ပြုလုပ်ရန်အတွက် ပြန်စရန်</translation> <translation id="4104163789986725820">တင်&ပို့ရန်...</translation> <translation id="4104944259562794668">ဆက်တင်များ > လုံခြုံရေးနှင့် ကိုယ်ရေးဒေတာ > လော့ခ်မျက်နှာပြင်နှင့် လက်မှတ်ထိုးဝင်ခြင်းတို့၌ နောင်တွင်ဖွင့်နိုင်သည်</translation> @@ -7107,7 +7104,6 @@ <translation id="6757431299485455321">အခြားစက်များ ဤဟော့စပေါ့ကို ရှာတွေ့ရန် ကူညီပေးသည်။</translation> <translation id="6758056191028427665">ကျွန်ုပ်တို့၏ ဝန်ဆောင်မှုများအတွက် စိတ်ကျေနပ်မှုမည်မျှရှိကြောင်း ပြောပြပေးပါ။</translation> <translation id="6759193508432371551">စက်ရုံဆက်တင် ပြန်လည်သပ်မှတ်</translation> -<translation id="6761431452438552910">သင့်ဘလူးတုသ်သုံးစက်သည် တွဲချိတ်ခြင်းမုဒ်တွင် ရှိပြီး အနီးအနားတွင် ရှိနေကြောင်း သေချာပါစေ။ သင်ယုံကြည်ရသော စက်များနှင့်သာ တွဲချိတ်ပါ။</translation> <translation id="676158322851696513">“<ph name="EXTENSION_NAME" />”</translation> <translation id="6762833852331690540">ဖွင့်</translation> <translation id="676560328519657314">Google Pay ရှိ သင်၏ငွေပေးချေနည်းလမ်းများ</translation> @@ -7401,7 +7397,6 @@ <translation id="6979737339423435258">အားလုံး</translation> <translation id="6980402667292348590">Insert</translation> <translation id="6981553172137913845">သီးသန့်ကြည့်ရှုရန် အစက်သင်္ကေတ မီနူးကိုနှိပ်ပြီး ရုပ်ဖျက် ဝင်းဒိုးတစ်ခု ဖွင့်ပါ</translation> -<translation id="6981761993313539853">သင့်ဘလူးတုသ်သုံးစက်သည် တွဲချိတ်ခြင်းမုဒ်တွင် ရှိပြီး အနီးအနားတွင် ရှိနေကြောင်း သေချာပါစေ။ သင်ယုံကြည်ရသော စက်များနှင့်သာ တွဲချိတ်ပါ။ <ph name="BEGIN_LINK_LEARN_MORE" />ပိုမိုလေ့လာရန်<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ရယူအသုံးချနိုင်မှု</translation> <translation id="6983507711977005608">'အလိုအလျောက် ချိတ်ဆက်မျှဝေခြင်း' ကွန်ရက် ချိတ်ဆက်မှုဖြုတ်ရန်</translation> <translation id="6983783921975806247">မှတ်ပုံတင်ထားသည့် OID</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index cca9463..6e25c2a 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">स्क्रोल गरेर पहिलो ट्याबमा लगियोस्</translation> <translation id="1410806973194718079">नीतिहरू जाँच गर्न सकिएन</translation> <translation id="1411400282355634827">ब्लुटुथ डिभाइसलाई दिइएका सबै अनुमति रिसेट गर्ने हो?</translation> -<translation id="1411724932979011919">तपाईंले हालेको कोड LPA फर्म्याटमा हुनु पर्छ:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">साइटहरूलाई मेरो क्यामेरा प्रयोग गर्ने अनुमति नदिइयोस्</translation> <translation id="1414648216875402825">तपाईं <ph name="PRODUCT_NAME" /> को अस्थिर संस्करणमा अपडेट गर्दै हुनुहुन्छ जुनमा सुविधाहरू हुन्छ जो प्रगतिमा छ। क्रयासहरू र नसोचिएका बगहरू आउनेछ। कृपया सतर्कता सहित जारी राख्नुहोस्।</translation> <translation id="1415708812149920388">क्लिपबोर्ड पढ्ने पहुँच अस्वीकार गरियो</translation> @@ -1240,7 +1239,6 @@ <translation id="1972313920920745320">तपाईंले हाल्नुभएका साइटहरू सधैँ सक्रिय रहने छन् र ती साइटहरूबाट मेमोरी खाली गरिने छैन। <ph name="BEGIN_LINK" />निश्चित साइटहरूलाई सक्रिय राख्ने तरिकाका बारेमा थप जान्नुहोस्<ph name="END_LINK" /></translation> <translation id="1972325230031091483">तपाईंले हालै खोलेको वेबपेजका आधारमा अग्रिम रूपमा सामग्री लोड गरिने भएकाले तपाईं अझ छिटो ब्राउज गर्न सक्नु हुने छ</translation> <translation id="197288927597451399">राख्नुहोस्</translation> -<translation id="1973313062201924554">तपाईंले <ph name="APP_NAME" /> लाई दिने अनुमति यो एपलाई पनि दिइने छ।</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> सुरक्षित रूपमा डाउनलोड गर्न सकिँदैन। डाउनलोड बारमा जान Shift+F6 थिच्नुहोस्।</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL वितरण बिन्दुहरू</translation> @@ -3935,7 +3933,6 @@ <translation id="4100733287846229632">यन्त्रमा खाली ठाउँ अत्यन्त कम छ</translation> <translation id="4100853287411968461">यन्त्रमा हेरेर बिताउने समयको नयाँ सीमा</translation> <translation id="4101352914005291489">लुकाइएको SSID</translation> -<translation id="4102469565336584882">अवैध कोड। तपाईंले हालेको कोड LPA फर्म्याटमा हुनु पर्छ:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">पावरवासको लागि रिस्टार्ट गर्नुहोस्</translation> <translation id="4104163789986725820">नि&र्यात...</translation> <translation id="4104944259562794668">तपाईं पछि "सेटिङ > सुरक्षा तथा गोपनीयता > लक स्क्रिन तथा साइन इन" मा गएर यसलाई अन गर्न सक्नुहुन्छ</translation> @@ -7092,7 +7089,6 @@ <translation id="6757431299485455321">अन्य डिभाइसलाई यो हटस्पट भेट्टाउन मद्दत गर्नुहोस्।</translation> <translation id="6758056191028427665">हामी कस्तो काम गर्दैछौं भन्नेबारे प्रतिक्रिया दिनुहोस्।</translation> <translation id="6759193508432371551">कारखाना रिसेट</translation> -<translation id="6761431452438552910">ब्लुटुथ डिभाइसमा कनेक्ट गर्ने मोड अन गरिएको छ र सो डिभाइस तपाईंको वरपर छ भन्ने कुरा सुनिश्चित गर्नुहोस्। आफूले विश्वास गर्ने डिभाइसहरूमा मात्र कनेक्ट गर्नुहोस्।</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">सक्रिय छ</translation> <translation id="676560328519657314">Google Pay मा रहेका तपाईंका भुक्तानी विधिहरू</translation> @@ -7386,7 +7382,6 @@ <translation id="6979737339423435258">सुरूबाट नै</translation> <translation id="6980402667292348590">इन्सर्ट की</translation> <translation id="6981553172137913845">गोप्य रूपमा ब्राउज गर्नका निम्ति इन्कोग्निटो विन्डो खोल्न डटहरूको आइकन मेनुमा क्लिक गर्नुहोस्</translation> -<translation id="6981761993313539853">ब्लुटुथ डिभाइसमा कनेक्ट गर्ने मोड अन गरिएको छ र सो डिभाइस तपाईंको वरपर छ भन्ने कुरा सुनिश्चित गर्नुहोस्। तपाईंलाई विश्वास लाग्ने डिभाइसहरूमा मात्र कनेक्ट गर्नुहोस्। <ph name="BEGIN_LINK_LEARN_MORE" />थप जान्नुहोस्<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">पहुँच</translation> <translation id="6983507711977005608">तात्कालिक टेदरिङ डिस्कनेक्ट गर्नुहोस्</translation> <translation id="6983783921975806247">दर्ता गरिएको OID</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index accf3c7..94fb9c9 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">Scrollen richting het eerste tabblad</translation> <translation id="1410806973194718079">Kan de beleidsregels niet checken</translation> <translation id="1411400282355634827">Rechten voor alle bluetooth-apparaten resetten?</translation> -<translation id="1411724932979011919">Je invoer moet deze indeling hebben: LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Niet toestaan dat sites je camera gebruiken</translation> <translation id="1414648216875402825">Je voert een upgrade uit naar een instabiele versie van <ph name="PRODUCT_NAME" />, die opties bevat die nog in ontwikkeling zijn. Crashes en onverwachte fouten zullen optreden. Ga voorzichtig te werk.</translation> <translation id="1415708812149920388">Leestoegang voor klembord geweigerd</translation> @@ -1237,7 +1236,6 @@ <translation id="1972313920920745320">Sites die je toevoegt, blijven altijd actief en er wordt geen geheugen vrijgemaakt op basis van deze sites. <ph name="BEGIN_LINK" />Meer informatie over hoe je specifieke sites actief houdt<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Je browst sneller, omdat content proactief wordt geladen op basis van je huidige webpagina</translation> <translation id="197288927597451399">Behouden</translation> -<translation id="1973313062201924554">Rechten die je toestaat voor <ph name="APP_NAME" />, zijn ook toegestaan voor deze app.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> kan niet beveiligd worden gedownload. Druk op Shift+F6 om naar het gedeelte met de downloadbalk te gaan.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL-distributiepunten</translation> @@ -3928,7 +3926,6 @@ <translation id="4100733287846229632">Er is zeer weinig ruimte beschikbaar op het apparaat</translation> <translation id="4100853287411968461">Nieuwe schermtijdlimiet</translation> <translation id="4101352914005291489">SSID verborgen</translation> -<translation id="4102469565336584882">Ongeldige code. Je invoer moet deze indeling hebben: LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Opnieuw opstarten om Powerwash uit te voeren</translation> <translation id="4104163789986725820">E&xporteren...</translation> <translation id="4104944259562794668">Je kunt dit later aanzetten via Instellingen > Beveiliging en privacy > Vergrendelscherm en inloggen</translation> @@ -7078,7 +7075,6 @@ <translation id="6757431299485455321">Help andere apparaten deze hotspot te vinden.</translation> <translation id="6758056191028427665">Laat ons weten of we goed bezig zijn.</translation> <translation id="6759193508432371551">Terugzetten op fabrieksinstellingen</translation> -<translation id="6761431452438552910">Zorg dat je bluetooth-apparaat in de koppelingsstand staat en in de buurt is. Koppel alleen met apparaten die je vertrouwt.</translation> <translation id="676158322851696513"><ph name="EXTENSION_NAME" /></translation> <translation id="6762833852331690540">Aan</translation> <translation id="676560328519657314">Je betaalmethoden in Google Pay</translation> @@ -7371,7 +7367,6 @@ <translation id="6979737339423435258">Alles</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Als je privé wilt browsen, klik je op het menu-icoon met de stippen om een incognitovenster te openen</translation> -<translation id="6981761993313539853">Zorg dat je bluetooth-apparaat in de koppelingsstand staat en in de buurt is. Koppel alleen met apparaten die je vertrouwt. <ph name="BEGIN_LINK_LEARN_MORE" />Meer informatie<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Toegankelijkheid</translation> <translation id="6983507711977005608">Verbinding verbreken met netwerk voor instant tethering</translation> <translation id="6983783921975806247">Geregistreerde OID</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 35cfabc..a6e9fc8 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Bla mot den første fanen</translation> <translation id="1410806973194718079">Kan ikke kontrollere regler</translation> <translation id="1411400282355634827">Vil du tilbakestille alle Bluetooth-enhetstillatelser?</translation> -<translation id="1411724932979011919">Oppføringen skal være på formatet LPA:1$<smdp-adresse>$<aktiveringskode></translation> <translation id="1414315029670184034">Ikke la nettsteder bruke kameraet</translation> <translation id="1414648216875402825">Du er i ferd med å oppdatere en ustabil versjon av <ph name="PRODUCT_NAME" />, som inneholder funksjoner som er under utvikling. Kræsjing og uventede feil kan oppstå. Fortsett med forsiktighet.</translation> <translation id="1415708812149920388">Lesetilgang til utklippstavlen er avvist</translation> @@ -1243,7 +1242,6 @@ <translation id="1972313920920745320">Nettsteder du legger til, holdes alltid aktive, og minnet de bruker, blir ikke frigjort. <ph name="BEGIN_LINK" />Finn ut mer om hvordan du holder bestemte nettsteder aktive<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Du kan surfe raskere, siden innholdet lastes inn proaktivt basert på nettsiden du er på for øyeblikket</translation> <translation id="197288927597451399">Behold</translation> -<translation id="1973313062201924554">Tillatelser du gir <ph name="APP_NAME" />, blir også gitt til denne appen.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> kan ikke lastes ned sikkert. Trykk på Shift+F6 for å gå til nedlastingsraden.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Distribusjonspunkter for sertifikatopphevelseslister</translation> @@ -3936,7 +3934,6 @@ <translation id="4100733287846229632">Det er kritisk lite plass på enheten</translation> <translation id="4100853287411968461">Ny grense for skjermtid</translation> <translation id="4101352914005291489">Skjult SSID</translation> -<translation id="4102469565336584882">Ugyldig kode. Oppføringen skal være på formatet LPA:1$<smdp-adresse>$<aktiveringskode></translation> <translation id="4102906002417106771">Start på nytt for å utføre en powerwash</translation> <translation id="4104163789986725820">E&ksportér</translation> <translation id="4104944259562794668">Du kan aktivere den senere i Innstillinger > Sikkerhet og personvern > Låseskjerm og pålogging</translation> @@ -7091,7 +7088,6 @@ <translation id="6757431299485455321">Hjelp andre enheter med å finne denne wifi-sonen.</translation> <translation id="6758056191028427665">Gi oss tilbakemelding.</translation> <translation id="6759193508432371551">Tilbakestilling til fabrikkstandard</translation> -<translation id="6761431452438552910">Sørg for at Bluetooth-enheten din er i tilkoblingsmodus og i nærheten. Koble bare til enheter du stoler på.</translation> <translation id="676158322851696513">«<ph name="EXTENSION_NAME" />»</translation> <translation id="6762833852331690540">På</translation> <translation id="676560328519657314">Betalingsmåtene dine i Google Pay</translation> @@ -7385,7 +7381,6 @@ <translation id="6979737339423435258">Alle datoer</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">For å surfe privat på nettet, klikk på menyikonet med prikkene for å åpne et inkognitovindu</translation> -<translation id="6981761993313539853">Sørg for at Bluetooth-enheten din er i tilkoblingsmodus og i nærheten. Koble bare til enheter du stoler på. <ph name="BEGIN_LINK_LEARN_MORE" />Finn ut mer<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Tilgjengelighet</translation> <translation id="6983507711977005608">Koble fra nettverk med umiddelbar internettdeling</translation> <translation id="6983783921975806247">Registrert OID</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index a38e1b1..8192a1e 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -509,7 +509,6 @@ <translation id="1410797069449661718">ପ୍ରଥମ ଟାବ ଆଡ଼କୁ ସ୍କ୍ରୋଲ କରନ୍ତୁ</translation> <translation id="1410806973194718079">ନୀତିଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରିବାକୁ ଅସମର୍ଥ</translation> <translation id="1411400282355634827">ସମସ୍ତ ବ୍ଲୁଟୁଥ ଡିଭାଇସ ଅନୁମତିକୁ ରିସେଟ କରିବେ?</translation> -<translation id="1411724932979011919">ଆପଣଙ୍କ ଏଣ୍ଟ୍ରି LPA:1$<smdp address>$<activation code> ଫର୍ମାଟରେ ହେବା ଉଚିତ</translation> <translation id="1414315029670184034">ଆପଣଙ୍କ କ୍ୟାମେରା ବ୍ୟବହାର କରିବା ପାଇଁ ସାଇଟଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ</translation> <translation id="1414648216875402825">ଆପଣ <ph name="PRODUCT_NAME" />ର ଏକ ଅସ୍ଥାୟୀ ସଂସ୍କରଣ ଅପ୍ଡେଟ୍ କରୁଛନ୍ତି ଯେଉଁଥିରେ ଏପରି ବୈଶିଷ୍ଟ୍ୟ ରହିଛି ଯାହା ପ୍ରଗତିିିିରେ ଅଛି। କ୍ରାସ୍ ଓ ଅପ୍ରତ୍ୟାଶିତ ବଗ୍ ଉତ୍ପନ୍ନ ହେବ। ଦୟାକରି ସତର୍କତାର ସହିତ ଆଗକୁ ବଢ଼ନ୍ତୁ।</translation> <translation id="1415708812149920388">କ୍ଲିପ୍ବୋର୍ଡ ପଢ଼ିବାର ଆକ୍ସେସ୍ ଅଗ୍ରାହ୍ୟ କରାଯାଇଛି</translation> @@ -1234,7 +1233,6 @@ <translation id="1972313920920745320">ଆପଣ ଯୋଗ କରୁଥିବା ସାଇଟଗୁଡ଼ିକ ସର୍ବଦା ସକ୍ରିୟ ରହିବ ଏବଂ ସେଗୁଡ଼ିକରୁ ମେମୋରୀ ଖାଲି କରାଯିବ ନାହିଁ। <ph name="BEGIN_LINK" />ନିର୍ଦ୍ଦିଷ୍ଟ ସାଇଟଗୁଡ଼ିକୁ ସକ୍ରିୟ ରଖିବା ବିଷୟରେ ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation> <translation id="1972325230031091483">ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ୱେବପୃଷ୍ଠା ଭିଜିଟ ଆଧାରରେ ବିଷୟବସ୍ତୁ ଅଧିକ ସକ୍ରିୟ ଭାବେ ଲୋଡ କରାଯାଉଥିବା ଯୋଗୁଁ ଆପଣ ଶୀଘ୍ର ବ୍ରାଉଜ କରିବେ</translation> <translation id="197288927597451399">Keep</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" /> ପାଇଁ ଆପଣ ଦେଇଥିବା ଅନୁମତିଗୁଡ଼ିକ ଏହି ଆପ ପାଇଁ ମଧ୍ୟ ଲାଗୁ ହେବ।</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> ସୁରକ୍ଷିତ ରୂପେ ଡାଉନଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ। ଡାଉନଲୋଡ୍ ବାର୍ କ୍ଷେତ୍ରକୁ ଯିବାକୁ Shift+F6 ଦବାନ୍ତୁ।</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL ବିତରଣ ପଏଣ୍ଟ</translation> @@ -3925,7 +3923,6 @@ <translation id="4100733287846229632">ଡିଭାଇସ୍ ଜାଗା ଅତ୍ୟନ୍ତ କମ୍ ଅଛି</translation> <translation id="4100853287411968461">ସ୍କ୍ରିନ୍ର ନୂଆ ସମୟ ସୀମା</translation> <translation id="4101352914005291489">ଲୁକ୍କାୟିତ SSID</translation> -<translation id="4102469565336584882">ଅବୈଧ କୋଡ। ଆପଣଙ୍କ ଏଣ୍ଟ୍ରି LPA:1$<smdp address>$<activation code> ଫର୍ମାଟରେ ହେବା ଉଚିତ</translation> <translation id="4102906002417106771">ପାୱାରୱାସ୍ କରିବାକୁ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ</translation> <translation id="4104163789986725820">ଏକ୍ସପୋର୍ଟ...</translation> <translation id="4104944259562794668">ଆପଣ ଏହାକୁ ପରେ ସେଟିଂସ > ସୁରକ୍ଷା ଏବଂ ଗୋପନୀୟତା > ଲକ ସ୍କ୍ରିନକୁ ଯାଇ ସାଇନ-ଇନ କରି ସକ୍ଷମ କରିପାରିବେ</translation> @@ -7081,7 +7078,6 @@ <translation id="6757431299485455321">ଏହି ହଟସ୍ପଟକୁ ଖୋଜିବାରେ ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକୁ ସାହାଯ୍ୟ କରନ୍ତୁ।</translation> <translation id="6758056191028427665">ଆମେ କେଉଁଭଳି କାମ କରୁଛୁ, ତାହା ଆମକୁ ଜଣାନ୍ତୁ।</translation> <translation id="6759193508432371551">ଫ୍ୟାକ୍ଟୋରୀ ରିସେଟ୍</translation> -<translation id="6761431452438552910">ଆପଣଙ୍କ ବ୍ଲୁଟୁଥ ଡିଭାଇସ ପେୟାରିଂ ମୋଡରେ ଏବଂ ଆଖପାଖରେ ଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ। କେବଳ ଆପଣ ବିଶ୍ୱାସ କରୁଥିବା ଡିଭାଇସଗୁଡ଼ିକ ସହ ପେୟାର କରନ୍ତୁ।</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">ଚାଲୁ ଅଛି</translation> <translation id="676560328519657314">Google Payରେ ଆପଣଙ୍କ ପେମେଣ୍ଟ ପଦ୍ଧତିଗୁଡ଼ିକ</translation> @@ -7375,7 +7371,6 @@ <translation id="6979737339423435258">ସବୁ ସମୟରେ</translation> <translation id="6980402667292348590">ଇନସାର୍ଟ କରନ୍ତୁ</translation> <translation id="6981553172137913845">ବ୍ୟକ୍ତିଗତ ଭାବେ ବ୍ରାଉଜ୍ କରିବା ପାଇଁ ଏକ ଇନକଗ୍ନିଟୋ ୱିଣ୍ଡୋ ଖୋଲିବାକୁ ଡଟ୍ ଆଇକନ୍ ମେନୁରେ କ୍ଲିକ୍ କରନ୍ତୁ</translation> -<translation id="6981761993313539853">ଆପଣଙ୍କ ବ୍ଲୁଟୁଥ ଡିଭାଇସ ପେୟାରିଂ ମୋଡରେ ଏବଂ ଆଖପାଖରେ ଅଛି ବୋଲି ସୁନିଶ୍ଚିତ କରନ୍ତୁ। କେବଳ ଆପଣ ବିଶ୍ୱାସ କରୁଥିବା ଡିଭାଇସଗୁଡ଼ିକ ସହ ପେୟାର କରନ୍ତୁ। <ph name="BEGIN_LINK_LEARN_MORE" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ଆକ୍ସେସିବିଲିଟୀ</translation> <translation id="6983507711977005608">ଇନଷ୍ଟାଣ୍ଟ ଟିଥରିଂ ନେଟୱାର୍କ ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ</translation> <translation id="6983783921975806247">ପଞ୍ଜୀକୃତ OID</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 186dd77..96ef0a4 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">ਪਹਿਲੀ ਟੈਬ ਵੱਲ ਸਕ੍ਰੋਲ ਕਰੋ</translation> <translation id="1410806973194718079">ਨੀਤੀਆਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ</translation> <translation id="1411400282355634827">ਕੀ ਸਾਰੀਆਂ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨਾ ਹੈ?</translation> -<translation id="1411724932979011919">ਤੁਹਾਡਾ ਇੰਦਰਾਜ ਇਸ LPA ਫਾਰਮੈਟ ਅਨੁਸਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">ਸਾਈਟਾਂ ਨੂੰ ਆਪਣਾ ਕੈਮਰਾ ਵਰਤਣ ਦੀ ਇਜਾਜ਼ਤ ਨਾ ਦਿਓ</translation> <translation id="1414648216875402825">ਤੁਸੀਂ <ph name="PRODUCT_NAME" /> ਦਾ ਇੱਕ ਅਸਥਿਰ ਰੂਪ ਅੱਪਡੇਟ ਕਰ ਰਹੇ ਹੋ ਜਿਸ ਵਿੱਚ ਉਹ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸ਼ਾਮਲ ਹਨ ਜੋ ਚਾਲੂ ਹਨ। ਕ੍ਰੈਸ਼ਿਜ ਅਤੇ ਅਚਨਚੇਤ ਬਗਸ ਹੋਣਗੇ। ਕਿਰਪਾ ਕਰਰਕੇ ਸਾਵਧਾਨੀ ਨਾਲ ਅੱਗੇ ਵਧੋ।</translation> <translation id="1415708812149920388">ਕਲਿੱਪਬੋਰਡ ਪੜ੍ਹਨ ਦੀ ਪਹੁੰਚ ਅਸਵੀਕਾਰ ਕੀਤੀ ਗਈ</translation> @@ -1250,7 +1249,6 @@ <translation id="1972313920920745320">ਤੁਹਾਡੇ ਵੱਲੋਂ ਸ਼ਾਮਲ ਕੀਤੀਆਂ ਜਾਣ ਵਾਲੀਆਂ ਸਾਈਟਾਂ ਹਮੇਸ਼ਾਂ ਕਿਰਿਆਸ਼ੀਲ ਰਹਿਣਗੀਆਂ ਅਤੇ ਉਨ੍ਹਾਂ ਤੋਂ ਮੈਮੋਰੀ ਨੂੰ ਖਾਲੀ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ। <ph name="BEGIN_LINK" />ਖਾਸ ਸਾਈਟਾਂ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਰੱਖਣ ਬਾਰੇ ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> <translation id="1972325230031091483">ਤੁਸੀਂ ਤੇਜ਼ੀ ਨਾਲ ਬ੍ਰਾਊਜ਼ ਕਰੋਗੇ ਕਿਉਂਕਿ ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੇ ਗਏ ਮੌਜੂਦਾ ਵੈੱਬ-ਪੰਨੇ ਦੇ ਆਧਾਰ 'ਤੇ ਸਮੱਗਰੀ ਚੁਸਤੀ ਨਾਲ ਲੋਡ ਕੀਤੀ ਜਾਂਦੀ ਹੈ</translation> <translation id="197288927597451399">Keep</translation> -<translation id="1973313062201924554">ਤੁਹਾਡੇ ਵੱਲੋਂ <ph name="APP_NAME" /> ਲਈ ਆਗਿਆ ਦਿੱਤੀਆਂ ਇਜਾਜ਼ਤਾਂ ਦੀ ਇਸ ਐਪ ਲਈ ਵੀ ਆਗਿਆ ਦਿੱਤੀ ਜਾਵੇਗੀ।</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> ਨੂੰ ਸੁਰੱਖਿਅਤ ਢੰਗ ਨਾਲ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਡਾਊਨਲੋਡ ਬਾਰ ਖੇਤਰ ਵਿੱਚ ਜਾਣ ਲਈ Shift+F6 ਦਬਾਓ।</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL Distribution Points</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">ਡੀਵਾਈਸ ਵਿੱਚ ਜਗ੍ਹਾ ਬਹੁਤ ਘੱਟ ਹੈ</translation> <translation id="4100853287411968461">ਸਕ੍ਰੀਨ ਸਮੇਂ ਦੀ ਨਵੀਂ ਸੀਮਾ</translation> <translation id="4101352914005291489">ਲੁਕਿਆ ਹੋਇਆ SSID</translation> -<translation id="4102469565336584882">ਅਵੈਧ ਕੋਡ। ਤੁਹਾਡਾ ਇੰਦਰਾਜ ਇਸ LPA ਫਾਰਮੈਟ ਅਨੁਸਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">ਪਾਵਰਵਾਸ਼ ਲਈ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ</translation> <translation id="4104163789986725820">ਨਿ&ਰਯਾਤ ਕਰੋ..</translation> <translation id="4104944259562794668">ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ > ਸੁਰੱਖਿਆ ਅਤੇ ਪਰਦੇਦਾਰੀ > ਲਾਕ ਸਕ੍ਰੀਨ ਵਿੱਚ ਜਾ ਕੇ ਅਤੇ ਸਾਈਨ-ਇਨ ਕਰ ਕੇ ਇਸਨੂੰ ਬਾਅਦ ਵਿੱਚ ਚਾਲੂ ਕਰ ਸਕਦੇ ਹੋ</translation> @@ -7103,7 +7100,6 @@ <translation id="6757431299485455321">ਇਸ ਹੌਟਸਪੌਟ ਨੂੰ ਲੱਭਣ ਵਿੱਚ ਦੂਜੇ ਡੀਵਾਈਸਾਂ ਦੀ ਮਦਦ ਕਰੋ।</translation> <translation id="6758056191028427665">ਸਾਨੂੰ ਦੱਸੋ ਕਿ ਸਾਡਾ ਪ੍ਰਦਰਸ਼ਨ ਕਿਹੋ ਜਿਹਾ ਹੈ।</translation> <translation id="6759193508432371551">ਫੈਕਟਰੀ ਰੀਸੈਟ</translation> -<translation id="6761431452438552910">ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਹਾਡਾ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧਕਰਨ ਮੋਡ ਵਿੱਚ ਹੈ ਅਤੇ ਨਜ਼ਦੀਕ ਹੈ। ਸਿਰਫ਼ ਉਨ੍ਹਾਂ ਡੀਵਾਈਸਾਂ ਨਾਲ ਜੋੜਾਬੱਧ ਕਰੋ ਜਿਨ੍ਹਾਂ 'ਤੇ ਤੁਸੀਂ ਭਰੋਸਾ ਕਰਦੇ ਹੋ।</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">ਚਾਲੂ</translation> <translation id="676560328519657314">Google Pay ਵਿੱਚ ਤੁਹਾਡੀਆਂ ਭੁਗਤਾਨ ਵਿਧੀਆਂ</translation> @@ -7397,7 +7393,6 @@ <translation id="6979737339423435258">ਸਾਰੇ ਸਮੇਂ</translation> <translation id="6980402667292348590">ਦਾਖਲ ਕਰੋ</translation> <translation id="6981553172137913845">ਨਿੱਜੀ ਤੌਰ 'ਤੇ ਬ੍ਰਾਊਜ਼ ਕਰਨ ਲਈ, ਬਿੰਦੀਆਂ ਦੇ ਪ੍ਰਤੀਕ ਵਾਲੇ ਮੀਨੂ 'ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਕੋਈ ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋ ਖੋਲ੍ਹੋ</translation> -<translation id="6981761993313539853">ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਹਾਡਾ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧਕਰਨ ਮੋਡ ਵਿੱਚ ਹੈ ਅਤੇ ਨਜ਼ਦੀਕ ਹੈ। ਸਿਰਫ਼ ਉਨ੍ਹਾਂ ਡੀਵਾਈਸਾਂ ਨਾਲ ਜੋੜਾਬੱਧ ਕਰੋ ਜਿਨ੍ਹਾਂ 'ਤੇ ਤੁਸੀਂ ਭਰੋਸਾ ਕਰਦੇ ਹੋ। <ph name="BEGIN_LINK_LEARN_MORE" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ਪਹੁੰਚਯੋਗਤਾ</translation> <translation id="6983507711977005608">ਤਤਕਾਲ ਟੈਦਰਿੰਗ ਨੈੱਟਵਰਕ ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰੋ</translation> <translation id="6983783921975806247">ਰਜਿਸਟਰਡ OID</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 638b53a5e..73e4967 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Przewiń do pierwszej karty</translation> <translation id="1410806973194718079">Nie udało się sprawdzić zasad</translation> <translation id="1411400282355634827">Zresetować wszystkie uprawnienia urządzenia Bluetooth?</translation> -<translation id="1411724932979011919">Wpisany ciąg musi mieć format LPA:1$<adres smdp>$<kod aktywacji></translation> <translation id="1414315029670184034">Nie zezwalaj witrynom na używanie kamery</translation> <translation id="1414648216875402825">Aktualizujesz <ph name="PRODUCT_NAME" /> do niestabilnej wersji zawierającej funkcje, nad którymi wciąż pracujemy. Będą występować awarie i nieoczekiwane błędy. Zachowaj ostrożność.</translation> <translation id="1415708812149920388">Brak uprawnień do odczytu zawartości schowka</translation> @@ -1235,7 +1234,6 @@ <translation id="1972313920920745320">Dodane witryny będą zawsze aktywne i nie będą usuwane z pamięci w celu zwolnienia w niej miejsca. <ph name="BEGIN_LINK" />Więcej informacji o utrzymaniu aktywności konkretnych witryn<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Przeglądarka będzie działać szybciej dzięki proaktywnemu wczytywaniu stron na podstawie danych o bieżącej wizycie na stronie</translation> <translation id="197288927597451399">Zachowaj</translation> -<translation id="1973313062201924554">Uprawnienia przyznane aplikacji <ph name="APP_NAME" /> będą dotyczyć również tej aplikacji.</translation> <translation id="1973763416111613016">Nie można pobrać pliku <ph name="FILE_NAME" /> w bezpieczny sposób. Naciśnij Shift+F6, by przejść do obszaru paska pobranych plików.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Punkty dystrybucji listy CRL</translation> @@ -3912,7 +3910,6 @@ <translation id="4100733287846229632">Na urządzeniu już prawie nie ma miejsca</translation> <translation id="4100853287411968461">Nowy limit czasu używania</translation> <translation id="4101352914005291489">Ukryty identyfikator SSID</translation> -<translation id="4102469565336584882">Nieprawidłowy kod. Wpisany ciąg musi mieć format LPA:1$<adres smdp>$<kod aktywacji></translation> <translation id="4102906002417106771">Uruchom ponownie, by wykonać Powerwash</translation> <translation id="4104163789986725820">E&ksportuj</translation> <translation id="4104944259562794668">Możesz to włączyć później, wybierając Ustawienia > Prywatność i bezpieczeństwo > Ekran blokady i logowanie</translation> @@ -7071,7 +7068,6 @@ <translation id="6757431299485455321">Pomóż innym urządzeniom znaleźć ten hotspot.</translation> <translation id="6758056191028427665">Co sądzisz o efektach naszej pracy?</translation> <translation id="6759193508432371551">Ustawienia fabryczne</translation> -<translation id="6761431452438552910">Sprawdź czy urządzenie Bluetooth znajduje się w pobliżu i ma włączony tryb parowania. Paruj tylko z urządzeniami, którym ufasz.</translation> <translation id="676158322851696513">„<ph name="EXTENSION_NAME" />”</translation> <translation id="6762833852331690540">Włączono</translation> <translation id="676560328519657314">Twoje formy płatności w Google Pay</translation> @@ -7363,7 +7359,6 @@ <translation id="6979737339423435258">Od początku</translation> <translation id="6980402667292348590">Insert</translation> <translation id="6981553172137913845">Aby przeglądać prywatnie, kliknij ikonę menu z kropkami i otwórz okno incognito</translation> -<translation id="6981761993313539853">Sprawdź, czy urządzenie Bluetooth znajduje się w pobliżu i ma włączony tryb parowania. Paruj tylko z urządzeniami, którym ufasz. <ph name="BEGIN_LINK_LEARN_MORE" />Więcej informacji<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Ułatwienia dostępu</translation> <translation id="6983507711977005608">Rozłącz sieć błyskawicznego połączenia w tetheringu</translation> <translation id="6983783921975806247">Zarejestrowany identyfikator OID</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 06da88a..6d0e205b 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">Rolar até a primeira guia</translation> <translation id="1410806973194718079">Não foi possível verificar as políticas</translation> <translation id="1411400282355634827">Redefinir todas as permissões de dispositivos Bluetooth?</translation> -<translation id="1411724932979011919">Sua entrada precisa ter o formato LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Não permitir que os sites usem sua câmera</translation> <translation id="1414648216875402825">Você está atualizando para uma versão instável do <ph name="PRODUCT_NAME" /> que contém recursos que estão em fase de teste. Falhas e erros inesperados ocorrerão. Continue com cautela.</translation> <translation id="1415708812149920388">Acesso de leitura para a área de transferência negado</translation> @@ -1250,7 +1249,6 @@ <translation id="1972313920920745320">Os sites adicionados sempre ficam ativos e a memória não é liberada. <ph name="BEGIN_LINK" />Saiba mais sobre como deixar sites específicos ativos<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Como o conteúdo é carregado proativamente com base na página da Web atual, você navega com mais rapidez</translation> <translation id="197288927597451399">Manter</translation> -<translation id="1973313062201924554">As permissões concedidas para <ph name="APP_NAME" /> também serão dadas para este app.</translation> <translation id="1973763416111613016">Não foi possível fazer o download de <ph name="FILE_NAME" /> por motivos de segurança. Pressione Shift+F6 para voltar à área da barra de downloads.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Pontos de distribuição de lista de certificados revogados</translation> @@ -3944,7 +3942,6 @@ <translation id="4100733287846229632">Espaço em disco do dispositivo criticamente baixo</translation> <translation id="4100853287411968461">Novo limite de tempo de uso</translation> <translation id="4101352914005291489">SSID oculto</translation> -<translation id="4102469565336584882">Código inválido. Sua entrada precisa ter o formato LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Reiniciar para executar o Powerwash</translation> <translation id="4104163789986725820">E&xportar...</translation> <translation id="4104944259562794668">É possível ativar essa opção mais tarde em "Configurações > Segurança e privacidade > Tela de bloqueio e login"</translation> @@ -7104,7 +7101,6 @@ <translation id="6757431299485455321">Ajude outros dispositivos a encontrarem esse ponto de acesso.</translation> <translation id="6758056191028427665">Diga como estamos nos saindo.</translation> <translation id="6759193508432371551">Configuração original</translation> -<translation id="6761431452438552910">Confira se o dispositivo Bluetooth está por perto e no modo de pareamento. Faça o pareamento apenas com dispositivos confiáveis.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Ativado</translation> <translation id="676560328519657314">Suas formas de pagamento no Google Pay</translation> @@ -7398,7 +7394,6 @@ <translation id="6979737339423435258">Todo o período</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Para navegar com privacidade, clique no menu de ícone de pontos para abrir uma janela anônima</translation> -<translation id="6981761993313539853">Confira se o dispositivo Bluetooth está por perto e no modo de pareamento. Faça o pareamento apenas com dispositivos confiáveis. <ph name="BEGIN_LINK_LEARN_MORE" />Saiba mais<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Acessibilidade</translation> <translation id="6983507711977005608">Desconectar rede de tethering instantâneo</translation> <translation id="6983783921975806247">OID registrado</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index d11151d..2220492 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">Desloque o ecrã em direção ao primeiro separador</translation> <translation id="1410806973194718079">Não é possível verificar as políticas</translation> <translation id="1411400282355634827">Repor todas as autorizações do dispositivo Bluetooth?</translation> -<translation id="1411724932979011919">A sua entrada deve ter o formato LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Não permitir que os sites utilizem a câmara</translation> <translation id="1414648216875402825">Está a atualizar para uma versão instável do <ph name="PRODUCT_NAME" /> que contém funcionalidades que estão em curso. Ocorrerão falhas e erros inesperados. Prossiga com cuidado.</translation> <translation id="1415708812149920388">Acesso de leitura à área de transferência negado</translation> @@ -1237,7 +1236,6 @@ <translation id="1972313920920745320">Os sites que adicionar permanecem sempre ativos e a respetiva memória não é libertada. <ph name="BEGIN_LINK" />Saiba como manter ativos sites específicos<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Irá navegar mais depressa porque os conteúdos são carregados proativamente com base na página Web que está a visitar</translation> <translation id="197288927597451399">Manter</translation> -<translation id="1973313062201924554">As autorizações que permitir para a app <ph name="APP_NAME" /> também são permitidas para esta app.</translation> <translation id="1973763416111613016">Não é possível transferir o ficheiro <ph name="FILE_NAME" /> em segurança. Prima Shift + F6 para aceder à área da barra de transferências.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Pontos de distribuição da CRL</translation> @@ -3929,7 +3927,6 @@ <translation id="4100733287846229632">Espaço do dispositivo criticamente baixo</translation> <translation id="4100853287411968461">Novo limite de tempo de utilização.</translation> <translation id="4101352914005291489">SSID oculto</translation> -<translation id="4102469565336584882">Código inválido. A sua entrada deve ter o formato LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Reiniciar para Powerwash</translation> <translation id="4104163789986725820">E&xportar...</translation> <translation id="4104944259562794668">Pode ativá-la mais tarde em Definições > Segurança e privacidade > Ecrã de bloqueio e início de sessão</translation> @@ -7086,7 +7083,6 @@ <translation id="6757431299485455321">Ajude outros dispositivos a encontrar esta zona Wi-Fi.</translation> <translation id="6758056191028427665">Dê-nos a sua opinião acerca do nosso desempenho.</translation> <translation id="6759193508432371551">Reposição de dados de fábrica</translation> -<translation id="6761431452438552910">Certifique-se de que o dispositivo Bluetooth está no modo de sincronização e nas proximidades. Sincronize apenas com dispositivos nos quais confia.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Ativado</translation> <translation id="676560328519657314">Os seus métodos de pagamento no Google Pay</translation> @@ -7380,7 +7376,6 @@ <translation id="6979737339423435258">Sempre</translation> <translation id="6980402667292348590">inserir</translation> <translation id="6981553172137913845">Para navegar em privado, clique no menu dos três pontos de forma a abrir uma janela de navegação anónima</translation> -<translation id="6981761993313539853">Certifique-se de que o dispositivo Bluetooth está no modo de sincronização e nas proximidades. Apenas sincronize com dispositivos nos quais confia. <ph name="BEGIN_LINK_LEARN_MORE" />Saiba mais<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Acessibilidade</translation> <translation id="6983507711977005608">Desligar rede de Ligação (à Internet) via telemóvel instantânea</translation> <translation id="6983783921975806247">OID registado</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 1832c402..304c740b 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -509,7 +509,6 @@ <translation id="1410797069449661718">Derulează spre prima filă</translation> <translation id="1410806973194718079">Nu s-au putut verifica politicile</translation> <translation id="1411400282355634827">Resetezi toate permisiunile pentru dispozitivul Bluetooth?</translation> -<translation id="1411724932979011919">Intrarea ar trebui să aibă formatul LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Nu permite site-urilor să utilizeze camera</translation> <translation id="1414648216875402825">Faceți actualizarea la o versiune <ph name="PRODUCT_NAME" /> instabilă. Aceasta conține funcții nefinalizate. Vor apărea blocări și erori neașteptate. Continuați cu atenție.</translation> <translation id="1415708812149920388">Accesul de citire la clipboard este interzis</translation> @@ -1238,7 +1237,6 @@ <translation id="1972313920920745320">Site-urile pe care le adaugi vor rămâne întotdeauna active și nu vor elibera memorie. <ph name="BEGIN_LINK" />Află mai multe despre menținerea anumitor site-uri active<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Vei naviga mai rapid deoarece conținutul se încarcă proactiv în funcție de pagina web accesată în acel moment</translation> <translation id="197288927597451399">Păstrează</translation> -<translation id="1973313062201924554">Permisiunile pe care le acorzi pentru <ph name="APP_NAME" /> vor fi acordate și pentru această aplicație.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> nu se poate descărca în siguranță. Apasă Shift+F6 ca să revii la zona barei de descărcări.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Puncte de distribuție CRL</translation> @@ -3929,7 +3927,6 @@ <translation id="4100733287846229632">Spațiul de pe dispozitiv este foarte redus</translation> <translation id="4100853287411968461">Limită nouă pentru durata de folosire a dispozitivului</translation> <translation id="4101352914005291489">SSID ascuns</translation> -<translation id="4102469565336584882">Cod nevalid. Intrarea ar trebui să aibă formatul LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Repornește pentru a face Powerwash</translation> <translation id="4104163789986725820">E&xportă...</translation> <translation id="4104944259562794668">O poți activa mai târziu în Setări > Securitate și confidențialitate > Ecranul de blocare și conectarea</translation> @@ -7087,7 +7084,6 @@ <translation id="6757431299485455321">Ajută alte dispozitive să găsească acest hotspot.</translation> <translation id="6758056191028427665">Spune-ne cum ne descurcăm.</translation> <translation id="6759193508432371551">Resetare la setările din fabrică</translation> -<translation id="6761431452438552910">Verifică dacă dispozitivul Bluetooth este în modul de asociere și în apropiere. Asociază-l numai cu dispozitive în care ai încredere.</translation> <translation id="676158322851696513"><ph name="EXTENSION_NAME" /></translation> <translation id="6762833852331690540">Activat</translation> <translation id="676560328519657314">Metodele tale de plată din Google Pay</translation> @@ -7381,7 +7377,6 @@ <translation id="6979737339423435258">Dintotdeauna</translation> <translation id="6980402667292348590">inserați</translation> <translation id="6981553172137913845">Pentru a naviga privat, dă clic pe meniul pictogramei cu puncte pentru a deschide o fereastră incognito</translation> -<translation id="6981761993313539853">Verifică dacă dispozitivul Bluetooth este în modul de asociere și în apropiere. Asociază-l numai cu dispozitive în care ai încredere. <ph name="BEGIN_LINK_LEARN_MORE" />Află mai multe<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Accesibilitate</translation> <translation id="6983507711977005608">Deconectează rețeaua pentru Tethering instantaneu</translation> <translation id="6983783921975806247">OID înregistrat</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index b60f1a23..66b247a 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">Прокрутить в сторону первой вкладки</translation> <translation id="1410806973194718079">Не удалось проверить правила.</translation> <translation id="1411400282355634827">Сбросить все разрешения для устройств Bluetooth?</translation> -<translation id="1411724932979011919">Запись должна быть в формате LPA: 1$<smdp address>$<activation code>.</translation> <translation id="1414315029670184034">Запретить сайтам доступ к камере</translation> <translation id="1414648216875402825">Вы устанавливаете нестабильную версию <ph name="PRODUCT_NAME" />, которая содержит разрабатываемые в настоящий момент функции. Будьте осторожны: возможны сбои и неизвестные ошибки.</translation> <translation id="1415708812149920388">Доступ к буферу обмена закрыт</translation> @@ -1239,7 +1238,6 @@ <translation id="1972313920920745320">Добавленные сайты останутся активными, и их данные не будут удаляться из памяти. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Работа браузера станет быстрее благодаря автоматической загрузке контента с учетом просматриваемой в настоящий момент страницы.</translation> <translation id="197288927597451399">Сохранить</translation> -<translation id="1973313062201924554">Разрешения, предоставленные приложению "<ph name="APP_NAME" />", будут действовать и для этого приложения.</translation> <translation id="1973763416111613016">Невозможно безопасно скачать файл "<ph name="FILE_NAME" />". Чтобы перейти к панели скачанных файлов, нажмите Shift + F6</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Точки распространения списков отзыва сертификатов</translation> @@ -3930,7 +3928,6 @@ <translation id="4100733287846229632">На устройстве почти нет свободного места</translation> <translation id="4100853287411968461">Время использования изменено.</translation> <translation id="4101352914005291489">Скрытое имя сети</translation> -<translation id="4102469565336584882">Недействительный код. Запись должна быть в формате LPA: 1$<smdp address>$<activation code>.</translation> <translation id="4102906002417106771">Перезапустить и использовать Powerwash</translation> <translation id="4104163789986725820">Э&кспорт...</translation> <translation id="4104944259562794668">Вы можете включить эту функцию позже в разделе "Настройки > Конфиденциальность и безопасность > Блокировка экрана и вход".</translation> @@ -7092,7 +7089,6 @@ <translation id="6757431299485455321">Помочь другим устройствам найти эту точку доступа</translation> <translation id="6758056191028427665">Расскажите, как у вас дела.</translation> <translation id="6759193508432371551">Сброс настроек</translation> -<translation id="6761431452438552910">Устройство Bluetooth должно находиться рядом. На нем нужно выбрать режим подключения. Рекомендуется устанавливать соединение только с надежными устройствами.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Включено</translation> <translation id="676560328519657314">Ваши способы оплаты в Google Pay</translation> @@ -7386,7 +7382,6 @@ <translation id="6979737339423435258">Все время</translation> <translation id="6980402667292348590">Insert</translation> <translation id="6981553172137913845">Чтобы просматривать сайты анонимно, нажмите на значок с тремя точками и выберите "Новое окно в режиме инкогнито"</translation> -<translation id="6981761993313539853">Устройство Bluetooth должно находиться рядом. На нем нужно выбрать режим подключения. Рекомендуется устанавливать соединение только с надежными устройствами. <ph name="BEGIN_LINK_LEARN_MORE" />Подробнее…<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Спец. возможности</translation> <translation id="6983507711977005608">Отключиться от мгновенной точки доступа</translation> <translation id="6983783921975806247">Зарегистрированный OID</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index a93bf60..e45be72 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -513,7 +513,6 @@ <translation id="1410797069449661718">පළමු ටැබය දෙසට අනුචලනය කරන්න</translation> <translation id="1410806973194718079">ප්රතිපත්ති පරීක්ෂා කළ නොහැකිය</translation> <translation id="1411400282355634827">සියලු බ්ලූටූත් උපාංග අවසර යළි සකසන්න ද?</translation> -<translation id="1411724932979011919">ඔබගේ ඇතුළත් කිරීමට LPA ආකෘතිය තිබිය යුතුය:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">ඔබගේ කැමරාව භාවිත කිරීමට අඩවිවලට ඉඩ නොදෙන්න</translation> <translation id="1414648216875402825">ඔබ <ph name="PRODUCT_NAME" /> හි අස්ථාවර අනුවාදයක් යාවත් කරමින් සිටින අතර එහි ඉටු කෙරමින් පවතින විශේෂාංග අඩංගු වේ. පිපිරුම් සහ අනපේක්ෂ බග් හට ගනු ඇත. කරුණාකර අවවාදය පිළිපදින්න.</translation> <translation id="1415708812149920388">පසුරු පුවරුව කියවීමේ ප්රවේශය ප්රතික්ෂේපයි</translation> @@ -1244,7 +1243,6 @@ <translation id="1972313920920745320">ඔබ එක් කරන අඩවි සැම විට ම සක්රියව පවතින අතර මතකය ඒවායින් නිදහස් නොවේ. <ph name="BEGIN_LINK" />නිශ්චිත අඩවි සක්රියව තබා ගැනීම පිළිබඳව තව දැන ගන්න<ph name="END_LINK" /></translation> <translation id="1972325230031091483">ඔබගේ වත්මන් වෙබ් පිටුවට පැමිණීම මත පදනම්ව අන්තර්ගතය ප්රගාමීව පූරණය කර ඇති නිසා ඔබ වේගයෙන් බ්රවුස් කරනු ඇත</translation> <translation id="197288927597451399">තබාගන්න</translation> -<translation id="1973313062201924554">ඔබ <ph name="APP_NAME" /> සඳහා ඉඩ දෙන අවසර මෙම යෙදුම සඳහා ද ඉඩ දෙනු ලැබේ.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> සුරක්ෂිතව බාගැනීමට නොහැකිය. බාගැනීම් තීරු ප්රදේශයට මාරු වීමට Shift+F6 ඔබන්න.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL බෙදාහැරීම් ලකුණු</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">උපාංගයේ ඉඩ බරපතළ ලෙස අඩුය</translation> <translation id="4100853287411968461">නව තිර කාල සීමාව</translation> <translation id="4101352914005291489">සැඟවුණ SSID</translation> -<translation id="4102469565336584882">වලංගු නොවන කේතයකි. ඔබගේ ඇතුළත් කිරීමට LPA ආකෘතිය තිබිය යුතුය:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">powerwash යළි අරඹන්න</translation> <translation id="4104163789986725820">අපනයන (&x)...</translation> <translation id="4104944259562794668">ඔබට එය පසුව සැකසීම් > ආරක්ෂාව සහ පෞද්ගලිකත්වය > අගුළු තිරය තුළ සබල කර පුරනය විය හැක</translation> @@ -7102,7 +7099,6 @@ <translation id="6757431299485455321">මෙම හොට්ස්පොට් සොයා ගැනීමට වෙනත් උපාංගවලට උදවු කරන්න.</translation> <translation id="6758056191028427665">අපි සිදු කරන්නේ කෙසේදැයි අපට දන්වන්න.</translation> <translation id="6759193508432371551">කර්මාන්තශාලා නැවත සැකසුම</translation> -<translation id="6761431452438552910">ඔබගේ බ්ලූටූත් උපාංගය යුගල කිරීමේ ප්රකාරයේ සහ අවට තිබෙන බව සහතික කර ගන්න. ඔබ විශ්වාස කරන උපාංග සමඟ පමණක් යුගල කරන්න.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">ක්රියාත්මකයි</translation> <translation id="676560328519657314">Google Pay හි ඔබගේ ගෙවීමේ ක්රම</translation> @@ -7396,7 +7392,6 @@ <translation id="6979737339423435258">සියලු කාලය තුළ</translation> <translation id="6980402667292348590">ඇතුළත් කරන්න</translation> <translation id="6981553172137913845">රහසිගතව බ්රවුස් කිරීම සඳහා, අප්රසිද්ධ කවුළුවක් විවෘත කිරීම සඳහා තිත් නිරූපක මෙනුව ක්ලික් කරන්න</translation> -<translation id="6981761993313539853">ඔබගේ බ්ලූටූත් උපාංගය යුගල කිරීමේ ප්රකාරයේ සහ අවට තිබෙන බව සහතික කර ගන්න. ඔබ විශ්වාස කරන උපාංග සමඟ පමණක් යුගල කරන්න. <ph name="BEGIN_LINK_LEARN_MORE" />තව දැන ගන්න<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ප්රවේශ්යතාව</translation> <translation id="6983507711977005608">ක්ෂණික ටෙදරින් ජාලය විසන්ධි කරන්න</translation> <translation id="6983783921975806247">ලියාපදිංචි කළ OID</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 8b656d9..7bc706c 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Posunúť na prvú kartu</translation> <translation id="1410806973194718079">Pravidla sa nedajú skontrolovať</translation> <translation id="1411400282355634827">Chcete resetovať všetky povolenia pre zariadenia s rozhraním Bluetooth?</translation> -<translation id="1411724932979011919">Mali by ste ho zadať vo formáte LPA:1$<smdp address>$<activation code>.</translation> <translation id="1414315029670184034">Nepovoliť webom používať fotoaparát</translation> <translation id="1414648216875402825">Chystáte sa vykonať aktualizáciu na nestabilnú verziu prehliadača <ph name="PRODUCT_NAME" />, ktorá obsahuje funkcie vo vývoji. Bude dochádzať ku zlyhaniam a neočakávaným chybám. Postupujte opatrne.</translation> <translation id="1415708812149920388">Bol zakázaný prístup k čítaniu obsahu schránky</translation> @@ -1239,7 +1238,6 @@ <translation id="1972313920920745320">Weby, ktoré ste pridali, zostanú vždy aktívne a šetrič ich z pamäte neodstráni. <ph name="BEGIN_LINK" />Ďalšie informácie o tom, ako určité weby zachovať aktívne<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Prehliadanie sa zrýchli, pretože obsah bude proaktívne načítaný na základe vašej návštevy aktuálnej webovej stránky</translation> <translation id="197288927597451399">Uložiť</translation> -<translation id="1973313062201924554">Povolenia, ktoré udelíte aplikácii <ph name="APP_NAME" />, budú udelené aj tejto aplikácii.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> nie je možné bezpečne stiahnuť. Stláčaním klávesov Shift + F6 prejdite do oblasti panela so stiahnutými súbormi.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Distribučné body CRL</translation> @@ -3930,7 +3928,6 @@ <translation id="4100733287846229632">V zariadení je kriticky málo miesta</translation> <translation id="4100853287411968461">Nový limit času používania</translation> <translation id="4101352914005291489">Skrytý identifikátor SSID</translation> -<translation id="4102469565336584882">Neplatný kód. Mali by ste ho zadať vo formáte LPA:1$<smdp address>$<activation code>.</translation> <translation id="4102906002417106771">Reštartovať a spustiť powerwash</translation> <translation id="4104163789986725820">E&xportovať...</translation> <translation id="4104944259562794668">Môžete to povoliť neskôr v sekcii Nastavenia > Zabezpečenie a ochrana súkromia > Uzamknutá obrazovka a prihlásenie</translation> @@ -7090,7 +7087,6 @@ <translation id="6757431299485455321">Umožnite ostatným zariadeniam nájsť tento hotspot.</translation> <translation id="6758056191028427665">Dajte nám tak vedieť, ako sa nám darí v našom úsilí.</translation> <translation id="6759193508432371551">Obnovenie výrobných nastavení</translation> -<translation id="6761431452438552910">Skontrolujte, či je zariadenie s rozhraním Bluetooth v párovacom režime a nablízku. Párujte iba zariadenia, ktorým veríte.</translation> <translation id="676158322851696513">„<ph name="EXTENSION_NAME" />“</translation> <translation id="6762833852331690540">Zapnuté</translation> <translation id="676560328519657314">Vaše spôsoby platby v službe Google Pay</translation> @@ -7384,7 +7380,6 @@ <translation id="6979737339423435258">Celé obdobie</translation> <translation id="6980402667292348590">vložiť</translation> <translation id="6981553172137913845">Ak chcete prehliadať v súkromí, otvorte okno inkognito klepnutím na ponuku s ikonou bodiek</translation> -<translation id="6981761993313539853">Skontrolujte, či je zariadenie s rozhraním Bluetooth v párovacom režime a nablízku. Párujte iba zariadenia, ktorým veríte. <ph name="BEGIN_LINK_LEARN_MORE" />Ďalšie informácie<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Dostupnosť</translation> <translation id="6983507711977005608">Odpojiť sieť dynamického tetheringu</translation> <translation id="6983783921975806247">Registrovaný identifikátor OID</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index a2ed4f8..1f7f5b2 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -513,7 +513,6 @@ <translation id="1410797069449661718">Pomik proti prvemu zavihku</translation> <translation id="1410806973194718079">Ni mogoče preveriti pravilnikov.</translation> <translation id="1411400282355634827">Želite ponastaviti vsa dovoljenja za napravo Bluetooth?</translation> -<translation id="1411724932979011919">Oblika zapisa vašega vnosa mora biti LPA:1$<smdp address>$<activation code>.</translation> <translation id="1414315029670184034">Spletnim mestom ni dovoljena uporaba kamere.</translation> <translation id="1414648216875402825">Posodabljate na nestabilno različico <ph name="PRODUCT_NAME" />, ki še niso v celoti razvite. Prišlo bo do zrušitev in nepričakovanih napak. Nadaljujte previdno.</translation> <translation id="1415708812149920388">Dostop za branje odložišča je zavrnjen</translation> @@ -1252,7 +1251,6 @@ <translation id="1972313920920745320">Spletna mesta, ki jih dodate, bodo ves čas aktivna in pomnilnik zanje se ne bo sprostil. <ph name="BEGIN_LINK" />Preberite več o tem, kako ohranite določena spletna mesta aktivna<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Brskali boste hitreje, ker se vsebina proaktivno naloži glede na trenutni obisk spletne strani.</translation> <translation id="197288927597451399">Obdrži</translation> -<translation id="1973313062201924554">Dovoljenja, ki jih omogočite za aplikacijo <ph name="APP_NAME" />, bodo prav tako omogočena za to aplikacijo.</translation> <translation id="1973763416111613016">Datoteke <ph name="FILE_NAME" /> ni mogoče varno prenesti. Pritisnite Shift + F6, če želite krožiti do območja vrstice s prenosi.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Mesta za distribucijo seznama ukinjenih potrdil</translation> @@ -3946,7 +3944,6 @@ <translation id="4100733287846229632">V napravi kritično primanjkuje prostora</translation> <translation id="4100853287411968461">Nova omejitev časa uporabe</translation> <translation id="4101352914005291489">Skrit SSID</translation> -<translation id="4102469565336584882">Neveljavna koda. Oblika zapisa vašega vnosa mora biti LPA:1$<smdp address>$<activation code>.</translation> <translation id="4102906002417106771">Znova zaženite za izvedbo Powerwasha</translation> <translation id="4104163789986725820">I&zvozi ...</translation> <translation id="4104944259562794668">Omogočite jo lahko pozneje v »Nastavitve« > »Varnost in zasebnost« > »Zaklenjen zaslon in prijava«.</translation> @@ -7111,7 +7108,6 @@ <translation id="6757431299485455321">Drugim napravam pomagajte najti to dostopno točko.</translation> <translation id="6758056191028427665">Sporočite nam, kako ste zadovoljni z nami.</translation> <translation id="6759193508432371551">Ponastavitev na tovarniške nastavitve</translation> -<translation id="6761431452438552910">Naprava Bluetooth mora biti v načinu za seznanjanje in v bližini. Seznanjajte samo z napravami, ki jim zaupate.</translation> <translation id="676158322851696513">»<ph name="EXTENSION_NAME" />«</translation> <translation id="6762833852331690540">Vklopljeno</translation> <translation id="676560328519657314">Vaša plačilna sredstva v Googlu Pay</translation> @@ -7405,7 +7401,6 @@ <translation id="6979737339423435258">Od začetka</translation> <translation id="6980402667292348590">tipka insert</translation> <translation id="6981553172137913845">Če želite brskati zasebno, kliknite meni z ikono pik, da odprete anonimno okno.</translation> -<translation id="6981761993313539853">Naprava Bluetooth mora biti v načinu za seznanjanje in v bližini. Seznanjajte samo z napravami, ki jim zaupate. <ph name="BEGIN_LINK_LEARN_MORE" />Več o tem<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Dostopnost</translation> <translation id="6983507711977005608">Prekinitev povezave z omrežjem za takojšnjo povezavo računalnika z internetom prek mobilnega telefona</translation> <translation id="6983783921975806247">Registriran OID</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 5322587..fae99222 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">Lëviz drejt skedës së parë</translation> <translation id="1410806973194718079">S'mund të kontrollohen politikat</translation> <translation id="1411400282355634827">Të rivendosen të gjitha lejet për pajisjet me Bluetooth?</translation> -<translation id="1411724932979011919">Hyrja jote duhet të jetë në formatin LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Mos lejo që sajtet të përdorin kamerën tënde</translation> <translation id="1414648216875402825">Po e përditëson me një version të paqëndrueshëm të <ph name="PRODUCT_NAME" /> që përmban funksione që janë në progres. Do të ndodhin ndërprerje aksidentale dhe gabime të papritura. Vazhdo me kujdes.</translation> <translation id="1415708812149920388">Qasja për leximin e kujtesës së fragmenteve u refuzua</translation> @@ -1234,7 +1233,6 @@ <translation id="1972313920920745320">Sajtet që shton do të qëndrojnë gjithmonë aktive dhe memoria nuk do të lirohet nga to. <ph name="BEGIN_LINK" />Mëso më shumë në lidhje me mbajtjen aktive të sajteve specifike<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Do të shfletosh më shpejt sepse përmbajtja ngarkohet në mënyrë proaktive bazuar në vizitën aktuale në faqen e uebit</translation> <translation id="197288927597451399">Mbaje</translation> -<translation id="1973313062201924554">Lejet që lejon për <ph name="APP_NAME" /> do të lejohen edhe për këtë aplikacion.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> nuk mund të shkarkohet në mënyrë të sigurt. Shtyp Shift+F6 për të kaluar në cikël në zonën e shiritit të shkarkimeve.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Pikat e shpërndarjes së CRL-së</translation> @@ -3926,7 +3924,6 @@ <translation id="4100733287846229632">Hapësira në pajisje jashtëzakonisht e ulët</translation> <translation id="4100853287411968461">Kufiri i ri i kohës para ekranit</translation> <translation id="4101352914005291489">Identifikuesi SSID i fshehur</translation> -<translation id="4102469565336584882">Kod i pavlefshëm. Hyrja jote duhet të jetë në formatin LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Rivendose për të kryer powerwash</translation> <translation id="4104163789986725820">E&ksporto...</translation> <translation id="4104944259562794668">Mund ta aktivizosh atë më vonë te Cilësimet > Siguria dhe privatësia > Ekrani i kyçjes dhe identifikimi</translation> @@ -7082,7 +7079,6 @@ <translation id="6757431299485455321">Ndihmoji pajisjet e tjera të gjejnë këtë zonë të qasjes për internet.</translation> <translation id="6758056191028427665">Na trego se si po ecim.</translation> <translation id="6759193508432371551">Rivendosje në gjendje fabrike</translation> -<translation id="6761431452438552910">Sigurohu që pajisja jote me Bluetooth të jetë në modalitetin e çiftimit dhe në afërsi. Çiftoje vetëm me pajisjet të cilave u beson.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Aktiv</translation> <translation id="676560328519657314">Metodat e tua të pagesës në Google Pay</translation> @@ -7376,7 +7372,6 @@ <translation id="6979737339423435258">Gjatë të gjithë kohës</translation> <translation id="6980402667292348590">tasti Insert</translation> <translation id="6981553172137913845">Për të shfletuar në mënyrë private, kliko te menyja e ikonës me pika për të hapur një dritare "të fshehtë"</translation> -<translation id="6981761993313539853">Sigurohu që pajisja jote me Bluetooth të jetë në modalitetin e çiftimit dhe në afërsi. Çifto vetëm me pajisjet te të cilat ke besim. <ph name="BEGIN_LINK_LEARN_MORE" />Mëso më shumë<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Qasja</translation> <translation id="6983507711977005608">Shkëput rrjetin e "Ndarjes së internetit në çast"</translation> <translation id="6983783921975806247">OID e regjistruar</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index b433eb5..034cb4b7 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -512,7 +512,6 @@ <translation id="1410797069449661718">Skrolujte ka prvoj kartici</translation> <translation id="1410806973194718079">Ne možemo da proverimo smernice</translation> <translation id="1411400282355634827">Želite da resetujete sve dozvole za Bluetooth uređaje?</translation> -<translation id="1411724932979011919">Unos treba da bude u formatu LPA:1$<smdp adresa>$<aktivacioni kôd></translation> <translation id="1414315029670184034">Ne dozvoljavaj sajtovima da koriste kameru</translation> <translation id="1414648216875402825">Ažurirate na nestabilnu verziju <ph name="PRODUCT_NAME" />-a koja sadrži funkcije koje su u fazi razvoja. Doći će do otkazivanja i neočekivanih grešaka. Nastavite oprezno.</translation> <translation id="1415708812149920388">Pristup za čitanje privremene memorije je odbijen</translation> @@ -1242,7 +1241,6 @@ <translation id="1972313920920745320">Sajtovi koje dodate će uvek ostati aktivni, a memorija se neće osloboditi. <ph name="BEGIN_LINK" />Saznajte više o tome kako da određeni sajtovi ostanu aktivni<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Pregledaćete brže jer se sadržaj proaktivno učitava na osnovu aktuelne posete veb-stranici</translation> <translation id="197288927597451399">Zadrži</translation> -<translation id="1973313062201924554">Dozvole koje pružite za aplikaciju <ph name="APP_NAME" /> će važiti i za ovu aplikaciju.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> ne može bezbedno da se preuzme. Pritiskajte Shift + F6 da biste prešli na oblast trake sa preuzimanjima.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Tačke CRL distribucije</translation> @@ -3936,7 +3934,6 @@ <translation id="4100733287846229632">Prostor na uređaju je izuzetno mali</translation> <translation id="4100853287411968461">Novo ograničenje vremena ispred ekrana</translation> <translation id="4101352914005291489">Skriveni SSID</translation> -<translation id="4102469565336584882">Kôd je nevažeći. Unos treba da bude u formatu LPA:1$<smdp adresa>$<aktivacioni kôd></translation> <translation id="4102906002417106771">Restartujte da biste obavili Powerwash</translation> <translation id="4104163789986725820">I&zvezi...</translation> <translation id="4104944259562794668">Možete da omogućite ovo kasnije u odeljku Podešavanja > Bezbednost i privatnost > Zaključani ekran i prijavljivanje</translation> @@ -7098,7 +7095,6 @@ <translation id="6757431299485455321">Pomaže drugim uređajima da pronađu ovaj hotspot.</translation> <translation id="6758056191028427665">Podelite utiske o našem učinku.</translation> <translation id="6759193508432371551">Vraćanje fabričkih podešavanja</translation> -<translation id="6761431452438552910">Proverite da li je Bluetooth uređaj u režimu uparivanja i u blizini. Uparujte samo sa uređajima u koje imate poverenja.</translation> <translation id="676158322851696513"><ph name="EXTENSION_NAME" /></translation> <translation id="6762833852331690540">Uključeno</translation> <translation id="676560328519657314">Načini plaćanja na Google Pay-u</translation> @@ -7392,7 +7388,6 @@ <translation id="6979737339423435258">Oduvek</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Da biste pregledali privatno, kliknite na ikonu menija sa tačkama da biste otvorili prozor bez arhiviranja</translation> -<translation id="6981761993313539853">Proverite da li je Bluetooth uređaj u režimu uparivanja i u blizini. Uparujte samo sa uređajima u koje imate poverenja. <ph name="BEGIN_LINK_LEARN_MORE" />Saznajte više<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Pristupačnost</translation> <translation id="6983507711977005608">Prekini vezu sa mrežom za trenutno privezivanje</translation> <translation id="6983783921975806247">Registrovani OID</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 8cb8704d..bb325d3 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -512,7 +512,6 @@ <translation id="1410797069449661718">Скролујте ка првој картици</translation> <translation id="1410806973194718079">Не можемо да проверимо смернице</translation> <translation id="1411400282355634827">Желите да ресетујете све дозволе за Bluetooth уређаје?</translation> -<translation id="1411724932979011919">Унос треба да буде у формату LPA:1$<smdp адреса>$<активациони кôд></translation> <translation id="1414315029670184034">Не дозвољавај сајтовима да користе камеру</translation> <translation id="1414648216875402825">Ажурирате на нестабилну верзију <ph name="PRODUCT_NAME" />-а која садржи функције које су у фази развоја. Доћи ће до отказивања и неочекиваних грешака. Наставите опрезно.</translation> <translation id="1415708812149920388">Приступ за читање привремене меморије је одбијен</translation> @@ -1242,7 +1241,6 @@ <translation id="1972313920920745320">Сајтови које додате ће увек остати активни, а меморија се неће ослободити. <ph name="BEGIN_LINK" />Сазнајте више о томе како да одређени сајтови остану активни<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Прегледаћете брже јер се садржај проактивно учитава на основу актуелне посете веб-страници</translation> <translation id="197288927597451399">Задржи</translation> -<translation id="1973313062201924554">Дозволе које пружите за апликацију <ph name="APP_NAME" /> ће важити и за ову апликацију.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> не може безбедно да се преузме. Притискајте Shift + F6 да бисте прешли на област траке са преузимањима.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Тачке CRL дистрибуције</translation> @@ -3936,7 +3934,6 @@ <translation id="4100733287846229632">Простор на уређају је изузетно мали</translation> <translation id="4100853287411968461">Ново ограничење времена испред екрана</translation> <translation id="4101352914005291489">Скривени SSID</translation> -<translation id="4102469565336584882">Кôд је неважећи. Унос треба да буде у формату LPA:1$<smdp адреса>$<активациони кôд></translation> <translation id="4102906002417106771">Рестартујте да бисте обавили Powerwash</translation> <translation id="4104163789986725820">И&звези...</translation> <translation id="4104944259562794668">Можете да омогућите ово касније у одељку Подешавања > Безбедност и приватност > Закључани екран и пријављивање</translation> @@ -7098,7 +7095,6 @@ <translation id="6757431299485455321">Помаже другим уређајима да пронађу овај хотспот.</translation> <translation id="6758056191028427665">Поделите утиске о нашем учинку.</translation> <translation id="6759193508432371551">Враћање фабричких подешавања</translation> -<translation id="6761431452438552910">Проверите да ли је Bluetooth уређај у режиму упаривања и у близини. Упарујте само са уређајима у које имате поверења.</translation> <translation id="676158322851696513"><ph name="EXTENSION_NAME" /></translation> <translation id="6762833852331690540">Укључено</translation> <translation id="676560328519657314">Начини плаћања на Google Pay-у</translation> @@ -7392,7 +7388,6 @@ <translation id="6979737339423435258">Одувек</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Да бисте прегледали приватно, кликните на икону менија са тачкама да бисте отворили прозор без архивирања</translation> -<translation id="6981761993313539853">Проверите да ли је Bluetooth уређај у режиму упаривања и у близини. Упарујте само са уређајима у које имате поверења. <ph name="BEGIN_LINK_LEARN_MORE" />Сазнајте више<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Приступачност</translation> <translation id="6983507711977005608">Прекини везу са мрежом за тренутно привезивање</translation> <translation id="6983783921975806247">Регистровани OID</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 43105094..cc1536d 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Scrolla mot den första fliken</translation> <translation id="1410806973194718079">Principkontrollen gick inte att utföra</translation> <translation id="1411400282355634827">Vill du återställa alla behörigheter för Bluetooth-enheter?</translation> -<translation id="1411724932979011919">Posten ska ha formatet LPA:1$<smdp-adress>$<aktiveringskod></translation> <translation id="1414315029670184034">Tillåt inte att webbplatser använder kameran</translation> <translation id="1414648216875402825">Du uppdaterar till en instabil version av <ph name="PRODUCT_NAME" /> som innehåller funktioner som inte är klara. Du kommer att råka ut för kraschar och oväntade buggar. Var försiktig.</translation> <translation id="1415708812149920388">Läsbehörighet till Urklipp nekades</translation> @@ -1249,7 +1248,6 @@ <translation id="1972313920920745320">Webbplatser du lägger till är alltid aktiva och minne frigörs inte från dem. <ph name="BEGIN_LINK" />Läs mer om hur du håller specifika webbplatser aktiva<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Du surfar snabbare eftersom innehåll läses in proaktivt baserat på den webbsida du besöker för tillfället</translation> <translation id="197288927597451399">Behåll</translation> -<translation id="1973313062201924554">Behörigheter som du tillåter för <ph name="APP_NAME" /> tillåts också för den här appen.</translation> <translation id="1973763416111613016">Det går inte att ladda ned <ph name="FILE_NAME" /> på ett säkert sätt. Stega till nedladdningsfältet med Skift + F6.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL-distributionspunkter</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">Mycket ont om utrymme på enheten</translation> <translation id="4100853287411968461">Ny gräns för skärmtid</translation> <translation id="4101352914005291489">Dolt SSID</translation> -<translation id="4102469565336584882">Ogiltig kod. Posten ska ha formatet LPA:1$<smdp-adress>$<aktiveringskod></translation> <translation id="4102906002417106771">Starta om för att powerwash</translation> <translation id="4104163789986725820">E&xportera...</translation> <translation id="4104944259562794668">Du kan aktivera det senare i Inställningar > Säkerhet och integritet > Låsskärm och inloggning</translation> @@ -7100,7 +7097,6 @@ <translation id="6757431299485455321">Hjälp andra enheter att hitta surfzonen.</translation> <translation id="6758056191028427665">Berätta hur vi sköter oss.</translation> <translation id="6759193508432371551">Återställ standardinställningar</translation> -<translation id="6761431452438552910">Kontrollera att Bluetooth-enheten är i parkopplingsläge och finns i närheten. Parkoppla bara betrodda enheter.</translation> <translation id="676158322851696513"><ph name="EXTENSION_NAME" /></translation> <translation id="6762833852331690540">På</translation> <translation id="676560328519657314">Dina betalningsmetoder i Google Pay</translation> @@ -7394,7 +7390,6 @@ <translation id="6979737339423435258">Sedan kontot skapades</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Öppna ett inkognitofönster genom att klicka på menyn med tre punkter om du vill surfa privat</translation> -<translation id="6981761993313539853">Kontrollera att Bluetooth-enheten är i parkopplingsläge och finns i närheten. Parkoppla bara betrodda enheter. <ph name="BEGIN_LINK_LEARN_MORE" />Läs mer<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Tillgänglighet</translation> <translation id="6983507711977005608">Koppla från nätverket som använder direktinternetdelning</translation> <translation id="6983783921975806247">Registrerat OID</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index d0c75c2..77f5811 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Sogeza kuelekea kichupo cha kwanza</translation> <translation id="1410806973194718079">Tumeshindwa kukagua sera</translation> <translation id="1411400282355634827">Ungependa kuweka upya ruhusa zote za kifaa chenye Bluetooth?</translation> -<translation id="1411724932979011919">Data yako inapaswa kuwa na muundo wa LPA:1$<anwani ya smdp>$<msimbo wa kuanza kutumia></translation> <translation id="1414315029670184034">Usiruhusu tovuti zitumie kamera yako</translation> <translation id="1414648216875402825">Unasasisha kwenda toleo lisilo imara la <ph name="PRODUCT_NAME" /> ambalo lina vipengele ambavyo vinaendelea kuundwa. Hitilafu zisizotarajiwa na kuacha kufanya kazi kutatokea. Tafadhali endelea kwa tahadhari.</translation> <translation id="1415708812149920388">Haina idhini ya kusoma ubao wa kunakili</translation> @@ -1245,7 +1244,6 @@ <translation id="1972313920920745320">Tovuti unazoweka zitaendelea kutumika kila wakati na hifadhi haitarejeshwa kutoka katika tovuti hizo. <ph name="BEGIN_LINK" />Pata maelezo zaidi kuhusu jinsi ya kufanya tovuti zitumike kila wakati<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Utavinjari kwa haraka zaidi kwa sababu maudhui hupakiwa kabla hujayaomba, kulingana na jinsi unavyotembelea ukurasa wa wavuti ulioufungua</translation> <translation id="197288927597451399">Weka</translation> -<translation id="1973313062201924554">Ruhusa unazotoa kwenye <ph name="APP_NAME" /> zitaruhusiwa pia kwenye programu hii.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> haiwezi kupakuliwa kwa usalama. Bonyeza vitufe vya Shift na F6 ili uende kwenye eneo la upau wa vipakuliwa.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Sehemu za Usambazaji wa CRL</translation> @@ -3938,7 +3936,6 @@ <translation id="4100733287846229632">Hifadhi ya kifaa ni ndogo sana</translation> <translation id="4100853287411968461">Imeweka kikomo kipya cha muda wa kutumia kifaa</translation> <translation id="4101352914005291489">SSID iliyofichwa</translation> -<translation id="4102469565336584882">Msimbo wa kuthibitisha si sahihi. Data yako inapaswa kuwa na muundo wa LPA:1$<anwani ya smdp>$<msimbo wa kuanza kutumia></translation> <translation id="4102906002417106771">Zima kifaa kisha ukiwashe ili utumie powerwash</translation> <translation id="4104163789986725820">&Hamisha...</translation> <translation id="4104944259562794668">Unaweza kukiwasha baadaye kwenye Mipangilio > Usalama na Faragha > Skrini Iliyofungwa na kuingia katika akaunti</translation> @@ -7095,7 +7092,6 @@ <translation id="6757431299485455321">Saidia vifaa vingine kupata mtandao pepe huu.</translation> <translation id="6758056191028427665">Tueleze jinsi huduma inavyokuridhisha.</translation> <translation id="6759193508432371551">Rejesha upya mipangilio ya kiwandani</translation> -<translation id="6761431452438552910">Hakikisha kwamba kifaa chako chenye Bluetooth kipo katika hali ya kuoanisha na kipo karibu. Oanisha na vifaa unavyoviamini tu.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Imewashwa</translation> <translation id="676560328519657314">Njia zako za kulipa kwenye Google Pay</translation> @@ -7389,7 +7385,6 @@ <translation id="6979737339423435258">Wakati wote</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Ili uvinjari kwa faragha, bofya menyu ya aikoni ya vitone ili ufungue dirisha fiche</translation> -<translation id="6981761993313539853">Hakikisha kwamba kifaa chako chenye Bluetooth kiko katika hali ya kuoanisha na kiko karibu. Oanisha tu na vifaa unavyoviamini. <ph name="BEGIN_LINK_LEARN_MORE" />Pata maelezo zaidi<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Ufikivu</translation> <translation id="6983507711977005608">Ondoa Mtandao wa Kusambazwa Papo Hapo</translation> <translation id="6983783921975806247">OID Iliyosajiliwa</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 4ef074ec..9b19b9be 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">முதல் பக்கத்திற்குச் செல்லும்</translation> <translation id="1410806973194718079">கொள்கைகளைச் சரிபார்க்க முடியவில்லை</translation> <translation id="1411400282355634827">அனைத்து புளூடூத் சாதன அனுமதிகளையும் மீட்டமைக்கவா?</translation> -<translation id="1411724932979011919">LPA:1$<smdp முகவரி>$<செயல்படுத்தல் குறியீடு> என்ற வடிவமைப்பில் உள்ளீடு இருக்க வேண்டும்</translation> <translation id="1414315029670184034">கேமராவைப் பயன்படுத்த தளங்களை அனுமதிக்காதே</translation> <translation id="1414648216875402825">உருவாக்கப்பட்டு வரும் அம்சங்கள் உள்ள <ph name="PRODUCT_NAME" /> இன் நிலையற்ற பதிப்பிற்கு மேம்படுத்துகிறீர்கள். சிதைவுகள் மற்றும் எதிர்பாராத பிழைகள் ஏற்படும். கவனமாக தொடரவும்.</translation> <translation id="1415708812149920388">கிளிப்போர்டைப் படிப்பதற்கான அணுகல் மறுக்கப்பட்டது</translation> @@ -1249,7 +1248,6 @@ <translation id="1972313920920745320">நீங்கள் சேர்க்கும் தளங்கள் எப்போதும் செயலில் இருக்கும். மேலும் அவற்றுக்கான நினைவகம் காலியாக்கப்படாது. <ph name="BEGIN_LINK" />குறிப்பிட்ட தளங்களைச் செயலில் வைத்திருப்பது குறித்து மேலும் அறிக<ph name="END_LINK" /></translation> <translation id="1972325230031091483">நீங்கள் தற்போது பார்க்கும் இணையப் பக்கத்தின் அடிப்படையில் உள்ளடக்கம் முன்கூட்டியே ஏற்றப்படுவதால் விரைவாக உலாவலாம்</translation> <translation id="197288927597451399">வைத்திரு</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" /> ஆப்ஸிற்கு நீங்கள் வழங்கும் அனுமதிகள் இந்த ஆப்ஸிற்கும் பொருந்தும்.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> ஃபைலைப் பாதுகாப்பாகப் பதிவிறக்க முடியாது. பதிவிறக்கங்கள் பட்டிக்குச் செல்ல Shift+F6 விசைகளை அழுத்தவும்.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL பகிர்வுப் புள்ளிகள்</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">சாதனத்தில் இடம் மிகவும் குறைவாக உள்ளது</translation> <translation id="4100853287411968461">சாதனத்தைப் பயன்படுத்துவதற்கான புதிய நேர வரம்பு</translation> <translation id="4101352914005291489">மறைக்கப்பட்ட SSID</translation> -<translation id="4102469565336584882">தவறான குறியீடு. LPA:1$<smdp முகவரி>$<செயல்படுத்தல் குறியீடு> என்ற வடிவமைப்பில் உள்ளீடு இருக்க வேண்டும்</translation> <translation id="4102906002417106771">பவர்வாஷில் மீண்டும் தொடங்கு</translation> <translation id="4104163789986725820">ஏற்று&மதி...</translation> <translation id="4104944259562794668">அமைப்புகள் > பாதுகாப்பும் தனியுரிமையும் > பூட்டுத் திரை &amp; உள்நுழைவு என்பதில் இதனை நீங்கள் பின்னர் இயக்கலாம்</translation> @@ -7101,7 +7098,6 @@ <translation id="6757431299485455321">இந்த ஹாட்ஸ்பாட்டைப் பிற சாதனங்கள் கண்டறிய உதவும்.</translation> <translation id="6758056191028427665">எவ்வாறு செயல்படுகிறோம் என்பதை எங்களுக்குத் தெரிவிக்கவும்.</translation> <translation id="6759193508432371551">தொழிற்சாலை மீட்டமைவு</translation> -<translation id="6761431452438552910">உங்கள் புளூடூத் சாதனம், இணைத்தல் பயன்முறையிலும் அருகிலும் இருப்பதை உறுதிசெய்துகொள்ளவும். நம்பகமான சாதனங்களை மட்டும் இணைக்கவும்.</translation> <translation id="676158322851696513">“<ph name="EXTENSION_NAME" />”</translation> <translation id="6762833852331690540">ஆன் செய்யப்பட்டுள்ளது</translation> <translation id="676560328519657314">Google Payயில் உள்ள உங்கள் கட்டண முறைகள்</translation> @@ -7395,7 +7391,6 @@ <translation id="6979737339423435258">இதுவரை அனைத்தும்</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">தனிப்பட்ட முறையில் உலாவ, புள்ளிகள் ஐகான் மெனுவைக் கிளிக் செய்து மறைநிலைத் தாவலைத் திறக்கவும்</translation> -<translation id="6981761993313539853">உங்கள் புளூடூத் சாதனம், இணைத்தல் பயன்முறையிலும் அருகிலும் இருப்பதை உறுதிசெய்துகொள்ளவும். நம்பகமான சாதனங்களை மட்டும் இணைக்கவும். <ph name="BEGIN_LINK_LEARN_MORE" />மேலும் அறிக<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">அணுகல் தன்மை</translation> <translation id="6983507711977005608">உடனடி இணைப்பு முறை நெட்வொர்க்கைத் துண்டி</translation> <translation id="6983783921975806247">பதிவுசெய்யப்பட்ட OID</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index dabb90c..fad28042 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">మొదటి ట్యాబ్ వైపు స్క్రోల్ చేయండి</translation> <translation id="1410806973194718079">పాలసీలను సెట్ చెయడం సాధ్యపడలేదు</translation> <translation id="1411400282355634827">బ్లూటూత్ పరికర అనుమతులన్నింటినీ రీసెట్ చేయాలా?</translation> -<translation id="1411724932979011919">మీరు ఎంటర్ చేసేది LPA:1$<smdp address>$<activation code> ఫార్మాట్లో ఉండాలి</translation> <translation id="1414315029670184034">కెమెరాను ఉపయోగించడానికి సైట్లను అనుమతించకండి</translation> <translation id="1414648216875402825">మీరు <ph name="PRODUCT_NAME" /> యొక్క అస్థిర వెర్షన్కు అప్డేట్ చేస్తున్నారు, ఇందులో పురోగతిలో ఉన్న ఫీచర్లు ఉంటాయి. క్రాష్లు మరియు ఊహించని బగ్లు ఏర్పడవచ్చు. దయచేసి జాగ్రత్తగా కొనసాగండి.</translation> <translation id="1415708812149920388">క్లిప్బోర్డ్ను చదివే యాక్సెస్ నిరాకరించబడింది</translation> @@ -1247,7 +1246,6 @@ <translation id="1972313920920745320">మీరు జోడించే సైట్లు ఎల్లప్పుడూ యాక్టివ్గా ఉంటాయి, వాటి నుండి మెమరీ ఖాళీ అవ్వదు. <ph name="BEGIN_LINK" />నిర్దిష్ట సైట్లను యాక్టివ్గా ఉంచడం గురించి మరింత తెలుసుకోండి<ph name="END_LINK" /></translation> <translation id="1972325230031091483">మీరు ప్రస్తుతం సందర్శించిన వెబ్పేజీ ఆధారంగా కంటెంట్ ముందస్తుగా లోడ్ చేయబడింది, కాబట్టి మీరు వేగంగా బ్రౌజ్ చేయగలరు</translation> <translation id="197288927597451399">ఉంచు</translation> -<translation id="1973313062201924554">మీరు ఏ అనుమతులను అయితే <ph name="APP_NAME" />కు మంజూరు చేస్తారో, ఆ అనుమతులే ఈ యాప్నకు కూడా మంజూరు చేయబడతాయి.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" />ను సురక్షితంగా డౌన్లోడ్ చేయడం సాధ్యపడదు. డౌన్లోడ్ల బార్ ప్రాంతంలోకి వెళ్లడం కోసం Shift+F6 నొక్కండి.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL పంపిణీ పాయింట్లు</translation> @@ -3941,7 +3939,6 @@ <translation id="4100733287846229632">పరికరంలో ఖాళీ స్థలం చాలా తక్కువగా ఉంది</translation> <translation id="4100853287411968461">కొత్త స్క్రీన్ సమయ పరిమితి</translation> <translation id="4101352914005291489">దాచబడిన SSID</translation> -<translation id="4102469565336584882">చెల్లని కోడ్. మీరు ఎంటర్ చేసేది LPA:1$<smdp address>$<activation code> ఫార్మాట్లో ఉండాలి</translation> <translation id="4102906002417106771">పవర్వాష్ చేయడానికి రీస్టార్ట్ చేయి</translation> <translation id="4104163789986725820">ఎ&గుమతి...</translation> <translation id="4104944259562794668">మీరు దానిని తర్వాత సెట్టింగ్లు > సెక్యూరిటీ, గోప్యత > లాక్ స్క్రీన్, సైన్ ఇన్ అనే ఆప్షన్లో ఎనేబుల్ చేయవచ్చు</translation> @@ -7098,7 +7095,6 @@ <translation id="6757431299485455321">ఈ హాట్స్పాట్ను కనుగొనడానికి ఇతర పరికరాలకు సహాయపడండి.</translation> <translation id="6758056191028427665">మేము అందించే సేవలు ఎలా ఉన్నాయో మాకు తెలియజేయండి.</translation> <translation id="6759193508432371551">ఫ్యాక్టరీ రీసెట్</translation> -<translation id="6761431452438552910">మీ బ్లూటూత్ పరికరం పెయిరింగ్ మోడ్లో ఉందని, ఇంకా సమీపంలో ఉందని నిర్ధారించుకోండి. మీకు నమ్మకం ఉన్న వ్యక్తుల పరికరాలతో మాత్రమే షేర్ చేయండి.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">ఆన్లో ఉంది</translation> <translation id="676560328519657314">Google Payలో మీ పేమెంట్ ఆప్షన్లు</translation> @@ -7392,7 +7388,6 @@ <translation id="6979737339423435258">మొత్తం సమయం</translation> <translation id="6980402667292348590">ఇన్సర్ట్ కీ</translation> <translation id="6981553172137913845">ప్రైవేట్గా బ్రౌజ్ చేయడానికి, అజ్ఞాత విండోను తెరవడాని చుక్కల చిహ్నం మెనూను క్లిక్ చేయండి</translation> -<translation id="6981761993313539853">మీ బ్లూటూత్ పరికరం పెయిరింగ్ మోడ్లో ఉందని, ఇంకా సమీపంలో ఉందని నిర్ధారించుకోండి. మీకు నమ్మకం ఉన్న వ్యక్తుల పరికరాలతో మాత్రమే షేర్ చేయండి. <ph name="BEGIN_LINK_LEARN_MORE" />మరింత తెలుసుకోండి<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">యాక్సెసిబిలిటీ</translation> <translation id="6983507711977005608">తక్షణ టెథెరింగ్ నెట్వర్క్ డిస్కనెక్ట్ చేయడం</translation> <translation id="6983783921975806247">రిజిస్టర్ చేసిన OID</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index e4bb3477..8b2bd6f 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">เลื่อนไปทางแท็บแรก</translation> <translation id="1410806973194718079">ตรวจสอบนโยบายไม่ได้</translation> <translation id="1411400282355634827">รีเซ็ตสิทธิ์ทั้งหมดของอุปกรณ์บลูทูธไหม</translation> -<translation id="1411724932979011919">รหัสที่คุณป้อนต้องอยู่ในรูปแบบ LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">ไม่อนุญาตให้เว็บไซต์ใช้กล้องของคุณ</translation> <translation id="1414648216875402825">คุณกำลังอัปเดตไปเป็น <ph name="PRODUCT_NAME" /> ในเวอร์ชันที่ไม่เสถียร ซึ่งมีฟีเจอร์ที่ยังอยู่ระหว่างดำเนินการ จะมีข้อขัดข้องและข้อบกพร่องที่ไม่คาดคิดเกิดขึ้น โปรดดำเนินการต่อด้วยความระมัดระวัง</translation> <translation id="1415708812149920388">การเข้าถึงการอ่านคลิปบอร์ดถูกปฏิเสธ</translation> @@ -1237,7 +1236,6 @@ <translation id="1972313920920745320">เว็บไซต์ที่คุณเพิ่มจะทำงานอยู่ตลอดเวลาและระบบจะไม่เพิ่มพื้นที่ว่างในหน่วยความจำ <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติมเกี่ยวกับการทำให้เว็บไซต์ทำงานอยู่ตลอดเวลา<ph name="END_LINK" /></translation> <translation id="1972325230031091483">คุณจะท่องเว็บได้เร็วขึ้นเนื่องจากมีการโหลดเนื้อหาโดยอิงจากหน้าเว็บที่กำลังเข้าชมโดยที่คุณไม่ต้องขอ</translation> <translation id="197288927597451399">เก็บไว้</translation> -<translation id="1973313062201924554">สิทธิ์ที่คุณให้แก่ <ph name="APP_NAME" /> จะให้แก่แอปนี้ด้วย</translation> <translation id="1973763416111613016">ดาวน์โหลด <ph name="FILE_NAME" /> อย่างปลอดภัยไม่ได้ กด Shift+F6 เพื่อวนไปยังบริเวณแถบดาวน์โหลด</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">จุดกระจาย CRL</translation> @@ -3928,7 +3926,6 @@ <translation id="4100733287846229632">พื้นที่ดิสก์เกือบเต็มแล้ว</translation> <translation id="4100853287411968461">เวลาอยู่หน้าจอสูงสุดใหม่</translation> <translation id="4101352914005291489">SSID ที่ซ่อนไว้</translation> -<translation id="4102469565336584882">รหัสไม่ถูกต้อง รหัสที่คุณป้อนต้องอยู่ในรูปแบบ LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">รีสตาร์ทเพื่อทำ Powerwash</translation> <translation id="4104163789986725820">ส่ง&ออก</translation> <translation id="4104944259562794668">คุณเปิดใช้ในภายหลังได้ที่การตั้งค่า > ความปลอดภัยและความเป็นส่วนตัว > หน้าจอล็อกและการลงชื่อเข้าใช้</translation> @@ -7081,7 +7078,6 @@ <translation id="6757431299485455321">ช่วยให้อุปกรณ์อื่นค้นพบฮอตสปอตนี้</translation> <translation id="6758056191028427665">แจ้งให้เราทราบถึงความพึงพอใจ</translation> <translation id="6759193508432371551">รีเซ็ตเป็นค่าเริ่มต้น</translation> -<translation id="6761431452438552910">โปรดตรวจสอบว่าอุปกรณ์บลูทูธอยู่ในโหมดการจับคู่และอยู่ใกล้ จับคู่กับอุปกรณ์ที่คุณเชื่อถือเท่านั้น</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">เปิด</translation> <translation id="676560328519657314">วิธีการชำระเงินของคุณใน Google Pay</translation> @@ -7375,7 +7371,6 @@ <translation id="6979737339423435258">ตั้งแต่ต้น</translation> <translation id="6980402667292348590">Insert</translation> <translation id="6981553172137913845">หากต้องการท่องเว็บแบบส่วนตัว ให้คลิกเมนูไอคอนรูปจุดเพื่อเปิดหน้าต่างที่ไม่ระบุตัวตน</translation> -<translation id="6981761993313539853">โปรดตรวจสอบว่าอุปกรณ์บลูทูธอยู่ในโหมดการจับคู่และอยู่ใกล้ๆ จับคู่กับอุปกรณ์ที่คุณเชื่อถือเท่านั้น <ph name="BEGIN_LINK_LEARN_MORE" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">การช่วยเหลือพิเศษ</translation> <translation id="6983507711977005608">ยกเลิกการเชื่อมต่อเครือข่าย Wi-Fi ฮอตสปอตจากมือถือโดยอัตโนมัติ</translation> <translation id="6983783921975806247">OID ที่ลงทะเบียนแล้ว</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index b5672b5f9..938bcd7 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">İlk sekmeye doğru kaydırın</translation> <translation id="1410806973194718079">Politikalar kontrol edilemiyor</translation> <translation id="1411400282355634827">Tüm Bluetooth cihaz izinleri sıfırlansın mı?</translation> -<translation id="1411724932979011919">Girişiniz, LPA:1$<smdp adresi>$<etkinleştirme kodu> biçiminde olmalıdır</translation> <translation id="1414315029670184034">Sitelerin kameramı kullanmasına izin verme</translation> <translation id="1414648216875402825"><ph name="PRODUCT_NAME" /> ürününün kararsız bir sürümüne güncelleme yapıyorsunuz. Bu sürüm geliştirilmekte olan özellikler içerir. Kilitlenmeler ve beklenmeyen hatalar olacaktır. Lütfen dikkatle ilerleyin.</translation> <translation id="1415708812149920388">Pano okuma erişimi reddedildi</translation> @@ -1237,7 +1236,6 @@ <translation id="1972313920920745320">Eklediğiniz siteler her zaman etkin kalır ve bu sitelerin kullandığı bellekte yer açılmaz. <ph name="BEGIN_LINK" />Belirli siteleri etkin tutma hakkında daha fazla bilgi<ph name="END_LINK" /></translation> <translation id="1972325230031091483">İçerik, mevcut web sayfası ziyaretinize göre proaktif olarak yüklendiğinden internette daha hızlı gezinebilirsiniz</translation> <translation id="197288927597451399">Sakla</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" /> için verdiğiniz izinler, bu uygulamaya da verilir.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> güvenli bir şekilde indirilemiyor. İndirme çubuğu alanına gitmek için Üst Karakter+F6 tuşlarına basın.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL Dağıtım Noktaları</translation> @@ -3926,7 +3924,6 @@ <translation id="4100733287846229632">Cihazda kullanılabilir alan kritik düzeyde az</translation> <translation id="4100853287411968461">Ekran başında kalma süresi için yeni sınır</translation> <translation id="4101352914005291489">Gizli SSID</translation> -<translation id="4102469565336584882">Geçersiz kod. Girişiniz, LPA:1$<smdp adresi>$<etkinleştirme kodu> biçiminde olmalıdır</translation> <translation id="4102906002417106771">Powerwash için yeniden başlat</translation> <translation id="4104163789986725820">&Dışa Aktar...</translation> <translation id="4104944259562794668">Bunu daha sonra Ayarlar > Güvenlik ve Gizlilik > Kilit ekranı ve oturum açma bölümünden etkinleştirebilirsiniz</translation> @@ -7083,7 +7080,6 @@ <translation id="6757431299485455321">Diğer cihazların bu hotspot'u bulmasına yardımcı olun.</translation> <translation id="6758056191028427665">Bizimle ilgili görüşünüzü bildirin.</translation> <translation id="6759193508432371551">Fabrika ayarlarına sıfırlama</translation> -<translation id="6761431452438552910">Bluetooth cihazınızın eşleme modunda ve yakında olduğundan emin olun. Yalnızca güvendiğiniz cihazlarla eşleme yapın.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Açık</translation> <translation id="676560328519657314">Google Pay ödeme yöntemleriniz</translation> @@ -7377,7 +7373,6 @@ <translation id="6979737339423435258">Tüm zamanlar</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">İnternette gizli olarak dolaşmak için nokta simgeli menüyü tıklayarak Gizli pencere açın</translation> -<translation id="6981761993313539853">Bluetooth cihazınızın eşleme modunda ve yakında olduğundan emin olun. Yalnızca güvendiğiniz cihazlarla eşleme yapın. <ph name="BEGIN_LINK_LEARN_MORE" />Daha fazla bilgi<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Erişilebilirlik</translation> <translation id="6983507711977005608">Hızlı Tethering ağının bağlantısını kes</translation> <translation id="6983783921975806247">Kayıtlı OID</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 27ad491..5f05e5a 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -513,7 +513,6 @@ <translation id="1410797069449661718">Прокрутити до першої вкладки</translation> <translation id="1410806973194718079">Не вдалося перевірити правила</translation> <translation id="1411400282355634827">Скинути всі дозволи для пристроїв із Bluetooth?</translation> -<translation id="1411724932979011919">Введіть дані у форматі LPA:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Заборонити сайтам доступ до камери</translation> <translation id="1414648216875402825">Ви змінюєте версію <ph name="PRODUCT_NAME" /> на нестабільну, яка містить функції, які ще на стадії розробки. Можуть виникати аварійні завершення роботи й помилки. Будьте обережні, виконуючи подальші дії.</translation> <translation id="1415708812149920388">Відмовлено в перегляді буфера обміну</translation> @@ -1252,7 +1251,6 @@ <translation id="1972313920920745320">Додані вами сайти завжди залишатимуться активними й пам’ять для них не звільнятиметься. Дізнайтесь, як <ph name="BEGIN_LINK" />вимкнути деактивацію певних сайтів<ph name="END_LINK" />.</translation> <translation id="1972325230031091483">Ви будете швидше переглядати веб-сторінки, оскільки контент попередньо завантажується на основі поточної відкритої веб-сторінки</translation> <translation id="197288927597451399">Зберегти</translation> -<translation id="1973313062201924554">Дозволи, які ви надаєте додатку <ph name="APP_NAME" />, також поширюються на цей додаток.</translation> <translation id="1973763416111613016">Не вдається безпечно завантажити файл "<ph name="FILE_NAME" />". Натискайте Shift+F6, щоб перейти на панель завантажень.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Точки розповсюдження списку відкликаних сертифікатів (CRL)</translation> @@ -3946,7 +3944,6 @@ <translation id="4100733287846229632">На пристрої дуже мало вільного місця</translation> <translation id="4100853287411968461">Нове обмеження часу використання пристрою</translation> <translation id="4101352914005291489">Приховане ім'я мережі</translation> -<translation id="4102469565336584882">Недійсний код. Введіть дані у форматі LPA:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Перезапустити, щоб виконати Powerwash</translation> <translation id="4104163789986725820">Е&кспортувати...</translation> <translation id="4104944259562794668">Цю функцію можна ввімкнути пізніше в розділі "Налаштування > Безпека та конфіденційність > Блокування екрана та вхід"</translation> @@ -7106,7 +7103,6 @@ <translation id="6757431299485455321">Допомагати іншим пристроям знайти цю точку доступу.</translation> <translation id="6758056191028427665">Поділіться з нами своїми враженнями.</translation> <translation id="6759193508432371551">Відновлення заводських налаштувань</translation> -<translation id="6761431452438552910">Переконайтеся, що пристрій із Bluetooth поруч і на ньому ввімкнено режим підключення. Під’єднуйте лише надійні пристрої.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Увімкнено</translation> <translation id="676560328519657314">Ваші способи оплати в Google Pay</translation> @@ -7400,7 +7396,6 @@ <translation id="6979737339423435258">Увесь час</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Щоб переглядати веб-сторінки конфіденційно, натисніть значок меню з трьома крапками й відкрийте вікно в режимі анонімного перегляду</translation> -<translation id="6981761993313539853">Переконайтеся, що пристрій із Bluetooth поруч і на ньому ввімкнено режим підключення. Під’єднуйте лише надійні пристрої. <ph name="BEGIN_LINK_LEARN_MORE" />Докладніше<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Доступність</translation> <translation id="6983507711977005608">Від'єднати мережу миттєвої точки доступу</translation> <translation id="6983783921975806247">Зареєстрований ідентифікатор об'єкта (OID)</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index daca2a86b..7e591809 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">پہلے ٹیب کی طرف اسکرول کریں</translation> <translation id="1410806973194718079">پالیسیز کو چیک کرنے سے قاصر</translation> <translation id="1411400282355634827">بلوٹوتھ آلے کی تمام اجازتیں ری سیٹ کریں؟</translation> -<translation id="1411724932979011919">آپ کے اندراج کا فارمیٹ LPA:1$<smdp address>$<activation code> ہونا چاہیے</translation> <translation id="1414315029670184034">سائٹس کو اپنا کیمرا استعمال کرنے کی اجازت نہ دیں</translation> <translation id="1414648216875402825">آپ <ph name="PRODUCT_NAME" /> کے ایک ناپائیدار ورژن میں اپ ڈیٹ کر رہے ہیں جس میں ایسی خصوصیات شامل ہیں جو جاری ہیں۔ کریشز اور غیر متوقع بگز پیش آئیں گے۔ براہ کرم احتیاط سے آگے بڑھیں۔</translation> <translation id="1415708812149920388">کلپ بورڈ پڑھنے کی رسائی مسترد کر دی گئی</translation> @@ -1243,7 +1242,6 @@ <translation id="1972313920920745320">آپ جو سائٹس شامل کرتے ہیں وہ ہمیشہ فعال رہیں گی اور ان سے میموری کو خالی نہیں کیا جائے گا۔ <ph name="BEGIN_LINK" />مخصوص سائٹس کو فعال رکھنے کے بارے میں مزید جانیں<ph name="END_LINK" /></translation> <translation id="1972325230031091483">آپ تیزی سے براؤز کریں گے کیونکہ مواد آپ کے موجودہ ویب صفحہ کے ملاحظہ کی بنیاد پر فعال طور پر لوڈ ہوتا ہے</translation> <translation id="197288927597451399">رکھیں</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" /> کے لیے آپ کی دی گئی اجازتیں اس ایپ کے لیے بھی قابل اطلاق ہوں گی۔</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> فائل کو محفوظ طریقے سے ڈاؤن لوڈ نہیں کیا جا سکتا۔ ڈاؤن لوڈز بار ایریا پر جانے کے لیے Shift+F6 دبائيں۔</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL تقسیم کے پوائنٹس</translation> @@ -3940,7 +3938,6 @@ <translation id="4100733287846229632">آلہ میں جگہ انتہائی کم ہے</translation> <translation id="4100853287411968461">اسکرین کے وقت کی نئی حد</translation> <translation id="4101352914005291489">پوشیدہ SSID</translation> -<translation id="4102469565336584882">غلط کوڈ۔ آپ کے اندراج کا فارمیٹ LPA:1$<smdp address>$<activation code> ہونا چاہیے</translation> <translation id="4102906002417106771">پاور واش کے لیے ری سٹارٹ کریں</translation> <translation id="4104163789986725820">برآ&مد کریں…</translation> <translation id="4104944259562794668">آپ اسے بعد میں ترتیبات > سیکیورٹی اور رازداری > مقفل اسکرین اور سائن ان میں جا کر فعال کر سکتے ہیں</translation> @@ -7097,7 +7094,6 @@ <translation id="6757431299485455321">اس ہاٹ اسپاٹ کو تلاش کرنے میں دیگر آلات کی مدد کریں۔</translation> <translation id="6758056191028427665">ہماری کارکردگی کے بارے میں ہمیں بتائیں۔</translation> <translation id="6759193508432371551">فیکٹری ری سیٹ</translation> -<translation id="6761431452438552910">اس بات کو یقینی بنائیں کہ آپ کا بلوٹوتھ آلہ جوڑا بنانے والے موڈ میں اور قریبی ہے۔ صرف آپ کے بھروسے مند آلات کے ساتھ جوڑا بنائیں۔</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">آن</translation> <translation id="676560328519657314">Google Pay میں آپ کی ادائیگی کے طریقے</translation> @@ -7391,7 +7387,6 @@ <translation id="6979737339423435258">ہر وقت</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">نجی طور پر براؤز کرنے کی خاطر پوشیدگی ٹیب کھولنے کے لیے نقطے والے آئیکن مینیو پر کلک کریں</translation> -<translation id="6981761993313539853">اس بات کو یقینی بنائیں کہ آپ کا بلوٹوتھ آلہ جوڑا بنانے والے موڈ میں اور قریبی ہے۔ صرف آپ کے بھروسہ مند آلات کے ساتھ جوڑا بنائیں۔ <ph name="BEGIN_LINK_LEARN_MORE" />مزید جانیں<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">ایکسیسبیلٹی</translation> <translation id="6983507711977005608">فوری ٹیدرنگ نیٹ ورک کو غیر منسلک کریں</translation> <translation id="6983783921975806247">رجسٹرڈ OID</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index b4eb9b3..8ed7d31 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">Birinchi varaq tomonga varaqlash</translation> <translation id="1410806973194718079">Qoidalar tekshirilmadi</translation> <translation id="1411400282355634827">Bluetooth qurilmalari uchun barcha ruxsatlar tiklansinmi?</translation> -<translation id="1411724932979011919">Xatosiz formatda kiritilishi zarur (LPA:1$<smdp manzili>$<aktivatsiya kodi></translation> <translation id="1414315029670184034">Saytlarga kameradan foydalanishni taqiqlash</translation> <translation id="1414648216875402825"><ph name="PRODUCT_NAME" />’ning beqaror versiyasiga yangilanmoqdasiz, unda yakunlanmagan xususiyatlar bor. Qotib qolishlar va kamchiliklar uchraydi. Ehtiyotkorlik bilan davom eting.</translation> <translation id="1415708812149920388">Klipborddan o‘qishga ruxsat berilmagan</translation> @@ -1236,7 +1235,6 @@ <translation id="1972313920920745320">Siz kiritgan saytlar doim faol qoladi va ularning xotirasi boʻshatilmaydi. <ph name="BEGIN_LINK" />Muayyan saytlarning faol qolishi haqida batafsil<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Sahifalar joriy tashrifi asosida oldindan yuklanadi va tezroq ochiladi</translation> <translation id="197288927597451399">Saqlash</translation> -<translation id="1973313062201924554"><ph name="APP_NAME" /> ilovasiga bergan ruxsatlaringiz bu ilova uchun ham amal qiladi.</translation> <translation id="1973763416111613016"><ph name="FILE_NAME" /> faylini xavfsiz yuklab olish imkonsiz. Yuklanmalar paneliga qaytish uchun Shift+F6 tugmalarini bosing.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL(sertifikat taqrizlari ro‘yxati) tarqatish nuqtalari</translation> @@ -3930,7 +3928,6 @@ <translation id="4100733287846229632">Qurilmada bo‘sh joy deyarli qolmadi</translation> <translation id="4100853287411968461">Yangi ruxsat berilgan foydalanish vaqti</translation> <translation id="4101352914005291489">Yashirin SSID</translation> -<translation id="4102469565336584882">Kod xato. Xatosiz formatda kiritilishi zarur (LPA:1$<smdp manzili>$<aktivatsiya kodi></translation> <translation id="4102906002417106771">Powerwash amalini bajarish uchun qayta ishga tushirish</translation> <translation id="4104163789986725820">&Eksport qilish...</translation> <translation id="4104944259562794668">Uni keyinroq Sozlamalar > Xavfsizlik va maxfiylik > Ekranni qulflash va kirish sahifasidan yoqish mumkin</translation> @@ -7087,7 +7084,6 @@ <translation id="6757431299485455321">Boshqa qurilmalarga ushbu hotspotni topishga yordam bering</translation> <translation id="6758056191028427665">Bizga fikr-mulohaza yuboring.</translation> <translation id="6759193508432371551">Zavod sozlamalariga qaytarish</translation> -<translation id="6761431452438552910">Bluetooth qurilmasi ulanish rejimida va yaqin-atrofdaligini tekshiring. Faqat ishonchli qurilmalarga ulang.</translation> <translation id="676158322851696513">“<ph name="EXTENSION_NAME" />”</translation> <translation id="6762833852331690540">Yoniq</translation> <translation id="676560328519657314">Google Pay xizmatidagi toʻlov usullaringiz</translation> @@ -7381,7 +7377,6 @@ <translation id="6979737339423435258">Boshidan beri</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Yashirin kezish uchun menyudagi nuqtalar ikonkasini bosib inkognito oyna oching</translation> -<translation id="6981761993313539853">Bluetooth qurilmasi ulanish rejimida va yaqin-atrofdaligini tekshiring. Faqat ishonchli qurilmalarga ulang. <ph name="BEGIN_LINK_LEARN_MORE" />Batafsil<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Qulayliklar</translation> <translation id="6983507711977005608">Tezkor modem rejimini uzish</translation> <translation id="6983783921975806247">Ro‘yxatdan o‘tkazilgan OID</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 35ce2b58..976fc225 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">Di chuyển đến thẻ đầu tiên</translation> <translation id="1410806973194718079">Không thể kiểm tra các chính sách</translation> <translation id="1411400282355634827">Đặt lại tất cả các quyền của thiết bị Bluetooth?</translation> -<translation id="1411724932979011919">Nội dung bạn nhập phải có định dạng LPA:1$<địa chỉ smdp>$<mã kích hoạt></translation> <translation id="1414315029670184034">Không cho phép trang web sử dụng máy ảnh</translation> <translation id="1414648216875402825">Bạn đang cập nhật lên phiên bản không chính thức <ph name="PRODUCT_NAME" /> chứa các tính năng hiện trong quá trình thử nghiệm. Các sự cố và lỗi không mong muốn sẽ xảy ra. Hãy thận trọng khi tiếp tục.</translation> <translation id="1415708812149920388">Đã từ chối quyền truy cập đọc bảng nhớ tạm</translation> @@ -1249,7 +1248,6 @@ <translation id="1972313920920745320">Các trang web bạn thêm sẽ luôn hoạt động và trình tiết kiệm bộ nhớ sẽ không giải phóng bộ nhớ khỏi các trang web này. <ph name="BEGIN_LINK" />Tìm hiểu thêm về cách duy trì trạng thái hoạt động của các trang web cụ thể<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Bạn sẽ duyệt web nhanh hơn vì nội dung được tải chủ động dựa trên trang web bạn đang truy cập</translation> <translation id="197288927597451399">Giữ lại</translation> -<translation id="1973313062201924554">Quyền mà bạn cấp cho <ph name="APP_NAME" /> cũng sẽ được cấp cho ứng dụng này.</translation> <translation id="1973763416111613016">Không thể tải <ph name="FILE_NAME" /> xuống một cách an toàn. Hãy nhấn tổ hợp phím Shift+F6 để chuyển tới khu vực thanh tệp tải xuống.</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">Điểm Phân phối CRL</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">Dung lượng của thiết bị quá thấp</translation> <translation id="4100853287411968461">Giới hạn mới về thời gian sử dụng thiết bị</translation> <translation id="4101352914005291489">SSID ẩn</translation> -<translation id="4102469565336584882">Mã không hợp lệ. Nội dung bạn nhập phải có định dạng LPA:1$<địa chỉ smdp>$<mã kích hoạt></translation> <translation id="4102906002417106771">Khởi động lại để sử dụng chức năng powerwash</translation> <translation id="4104163789986725820">X&uất...</translation> <translation id="4104944259562794668">Bạn có thể bật tính năng này vào lúc khác trong phần Cài đặt > Bảo mật và quyền riêng tư > Màn hình khoá và thông tin đăng nhập</translation> @@ -7100,7 +7097,6 @@ <translation id="6757431299485455321">Giúp các thiết bị khác tìm thấy điểm phát sóng này.</translation> <translation id="6758056191028427665">Hãy cho chúng tôi biết ý kiến của bạn về dịch vụ của chúng tôi.</translation> <translation id="6759193508432371551">Khôi phục cài đặt gốc</translation> -<translation id="6761431452438552910">Hãy đảm bảo thiết bị Bluetooth của bạn đang ở gần và đã bật chế độ ghép nối. Chỉ ghép nối với các thiết bị mà bạn tin tưởng.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Đang bật</translation> <translation id="676560328519657314">Phương thức thanh toán của bạn trong Google Pay</translation> @@ -7394,7 +7390,6 @@ <translation id="6979737339423435258">Từ trước đến nay</translation> <translation id="6980402667292348590">insert</translation> <translation id="6981553172137913845">Để duyệt web ở chế độ riêng tư, hãy nhấp vào trình đơn có biểu tượng ba dấu chấm để mở một cửa sổ Ẩn danh</translation> -<translation id="6981761993313539853">Hãy đảm bảo thiết bị Bluetooth của bạn đang ở gần và đã bật chế độ ghép nối. Chỉ ghép nối với các thiết bị mà bạn tin tưởng. <ph name="BEGIN_LINK_LEARN_MORE" />Tìm hiểu thêm<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Hỗ trợ tiếp cận</translation> <translation id="6983507711977005608">Ngắt kết nối mạng Chia sẻ Internet tức thì</translation> <translation id="6983783921975806247">OID đã Đăng ký</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 7f636438..3521907 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -507,7 +507,6 @@ <translation id="1410797069449661718">滚动至第一个标签页</translation> <translation id="1410806973194718079">无法检查政策</translation> <translation id="1411400282355634827">重置所有蓝牙设备权限?</translation> -<translation id="1411724932979011919">所输入代码的格式应为 LPA:1$<smdp 地址>$<激活码></translation> <translation id="1414315029670184034">不允许网站使用您的摄像头</translation> <translation id="1414648216875402825">您即将更新到 <ph name="PRODUCT_NAME" />的不稳定版本,其中含有尚处于开发阶段的功能。系统可能会出现崩溃和意外错误。继续操作前,请三思。</translation> <translation id="1415708812149920388">已被禁止读取剪贴板</translation> @@ -1228,7 +1227,6 @@ <translation id="1972313920920745320">您添加的网站将始终保持活跃状态,且系统不会从它们中释放内存。<ph name="BEGIN_LINK" />详细了解如何让特定网站保持活跃状态<ph name="END_LINK" /></translation> <translation id="1972325230031091483">您的浏览速度会更快,因为系统会根据您当前访问的网页主动加载内容</translation> <translation id="197288927597451399">保留</translation> -<translation id="1973313062201924554">您向“<ph name="APP_NAME" />”授予的权限也会授给此应用。</translation> <translation id="1973763416111613016">无法安全地下载“<ph name="FILE_NAME" />”。按 Shift+F6 可切换到“下载内容栏”区域。</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL 分发点</translation> @@ -3913,7 +3911,6 @@ <translation id="4100733287846229632">设备存储空间严重不足</translation> <translation id="4100853287411968461">已设定新的设备使用时间上限</translation> <translation id="4101352914005291489">隐藏的 SSID</translation> -<translation id="4102469565336584882">代码无效。所输入代码的格式应为 LPA:1$<smdp 地址>$<激活码></translation> <translation id="4102906002417106771">重启以执行 Powerwash</translation> <translation id="4104163789986725820">导出(&X)...</translation> <translation id="4104944259562794668">您可等到需要时再前往“设置”>“安全和隐私设置”>“锁定屏幕和登录”部分中启用该功能</translation> @@ -7058,7 +7055,6 @@ <translation id="6757431299485455321">有助于其他设备发现此热点。</translation> <translation id="6758056191028427665">让我们知道您的满意度。</translation> <translation id="6759193508432371551">恢复出厂设置</translation> -<translation id="6761431452438552910">请确保您的蓝牙设备处于配对模式且就在附近。应仅与您信任的设备配对。</translation> <translation id="676158322851696513">“<ph name="EXTENSION_NAME" />”</translation> <translation id="6762833852331690540">已开启</translation> <translation id="676560328519657314">您在 Google Pay 中的付款方式</translation> @@ -7352,7 +7348,6 @@ <translation id="6979737339423435258">时间不限</translation> <translation id="6980402667292348590">插入</translation> <translation id="6981553172137913845">若要私密地浏览网页,请点击三点状图标菜单以打开一个无痕式窗口</translation> -<translation id="6981761993313539853">请确保您的蓝牙设备处于配对模式且就在附近。仅与您信任的设备配对。<ph name="BEGIN_LINK_LEARN_MORE" />了解详情<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">无障碍</translation> <translation id="6983507711977005608">断开“即时网络共享”的网络连接</translation> <translation id="6983783921975806247">已注册的 OID</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index abedc8a3..c39d358d 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -510,7 +510,6 @@ <translation id="1410797069449661718">碌去第一個分頁</translation> <translation id="1410806973194718079">無法檢查政策</translation> <translation id="1411400282355634827">要重設所有藍牙裝置權限嗎?</translation> -<translation id="1411724932979011919">輸入的內容必須使用 LPA 格式:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">不允許網站使用攝錄機</translation> <translation id="1414648216875402825">您即將更新為不穩定的 <ph name="PRODUCT_NAME" /> 版本,其中含有仍在開發中的功能。系統可能會發生當機情況和無法預期的錯誤,執行時請特別注意。</translation> <translation id="1415708812149920388">已禁止讀取剪貼簿</translation> @@ -1249,7 +1248,6 @@ <translation id="1972313920920745320">你新增的網站將一律保持使用中的狀態,不會釋出記憶體。<ph name="BEGIN_LINK" />進一步瞭解將特定網站保持在使用中的狀態<ph name="END_LINK" /></translation> <translation id="1972325230031091483">系統會根據您目前瀏覽的網頁主動載入內容,助您加快瀏覽速度</translation> <translation id="197288927597451399">保留</translation> -<translation id="1973313062201924554">如果你將權限授予「<ph name="APP_NAME" />」,這些應用程式亦會取得同樣的權限。</translation> <translation id="1973763416111613016">無法安全下載「<ph name="FILE_NAME" />」。按住 Shift+F6 鍵即可切換至下載內容列的位置。</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL 發佈點</translation> @@ -3939,7 +3937,6 @@ <translation id="4100733287846229632">裝置的儲存空間嚴重不足</translation> <translation id="4100853287411968461">新的裝置使用時間限制</translation> <translation id="4101352914005291489">隱藏的 SSID</translation> -<translation id="4102469565336584882">啟動碼無效。輸入的內容必須使用 LPA 格式:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">重新啟動即可進行 Powerwash</translation> <translation id="4104163789986725820">匯出(&X)…</translation> <translation id="4104944259562794668">您可稍後在「設定」> [安全和私隱] > [上鎖畫面和登入] 啟用</translation> @@ -7094,7 +7091,6 @@ <translation id="6757431299485455321">協助其他裝置尋找此熱點。</translation> <translation id="6758056191028427665">請讓我們瞭解您的滿意度。</translation> <translation id="6759193508432371551">恢復原廠設定</translation> -<translation id="6761431452438552910">請確保藍牙裝置在附近,且已處於配對模式。請只與您信任的裝置配對。</translation> <translation id="676158322851696513">「<ph name="EXTENSION_NAME" />」</translation> <translation id="6762833852331690540">開啟</translation> <translation id="676560328519657314">您喺 Google Pay 入面嘅付款方法</translation> @@ -7388,7 +7384,6 @@ <translation id="6979737339423435258">所有時間</translation> <translation id="6980402667292348590">Insert 鍵</translation> <translation id="6981553172137913845">如要私密瀏覽,請按一下三點圖示選單,然後開啟無痕式視窗</translation> -<translation id="6981761993313539853">請確保藍牙裝置在附近,且已處於配對模式。請只與您信任的裝置配對。<ph name="BEGIN_LINK_LEARN_MORE" />瞭解詳情<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">協助工具</translation> <translation id="6983507711977005608">解除連接「即時網絡共享」網絡</translation> <translation id="6983783921975806247">已註冊的 OID</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index d122fb58..ce857b0d 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -508,7 +508,6 @@ <translation id="1410797069449661718">捲動至第一個分頁</translation> <translation id="1410806973194718079">無法檢查政策</translation> <translation id="1411400282355634827">要重設所有藍牙裝置權限嗎?</translation> -<translation id="1411724932979011919">輸入的內容必須使用 LPA 格式:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">禁止網站使用攝影機</translation> <translation id="1414648216875402825">你即將更新為不穩定的 <ph name="PRODUCT_NAME" />版本,其中含有仍在開發中的功能。系統可能會發生當機情況和無法預期的錯誤,執行時請特別注意。</translation> <translation id="1415708812149920388">已禁止讀取剪貼簿</translation> @@ -1237,7 +1236,6 @@ <translation id="1972313920920745320">清單內的網站一律會保持使用中的狀態,系統不會釋出記憶體。<ph name="BEGIN_LINK" />進一步瞭解如何讓特定網站保持使用中的狀態<ph name="END_LINK" /></translation> <translation id="1972325230031091483">系統會根據你目前造訪的網頁主動載入內容,幫助你加快瀏覽速度</translation> <translation id="197288927597451399">保留</translation> -<translation id="1973313062201924554">如果你將權限授予「<ph name="APP_NAME" />」,這個應用程式也會取得同樣的權限。</translation> <translation id="1973763416111613016">無法安全下載「<ph name="FILE_NAME" />」。按下 Shift + F6 鍵即可返回下載內容列區域。</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1974043046396539880">CRL 發布點</translation> @@ -3927,7 +3925,6 @@ <translation id="4100733287846229632">裝置空間嚴重不足</translation> <translation id="4100853287411968461">新的裝置使用時間限制</translation> <translation id="4101352914005291489">隱藏的 SSID</translation> -<translation id="4102469565336584882">代碼無效,輸入的內容必須使用 LPA 格式:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">重新啟動以執行 Powerwash</translation> <translation id="4104163789986725820">匯出(&X)...</translation> <translation id="4104944259562794668">你之後可以前往「設定」>「安全性與隱私權」>「螢幕鎖定和登入」加以啟用</translation> @@ -7079,7 +7076,6 @@ <translation id="6757431299485455321">協助其他裝置找到這個無線基地台。</translation> <translation id="6758056191028427665">請讓我們瞭解你的滿意度。</translation> <translation id="6759193508432371551">恢復原廠設定</translation> -<translation id="6761431452438552910">請確認你的藍牙裝置放在附近,且處於配對模式。只配對你信任的裝置。</translation> <translation id="676158322851696513">「<ph name="EXTENSION_NAME" />」</translation> <translation id="6762833852331690540">開啟</translation> <translation id="676560328519657314">你的 Google Pay 付款方式</translation> @@ -7373,7 +7369,6 @@ <translation id="6979737339423435258">不限時間</translation> <translation id="6980402667292348590">insert 鍵</translation> <translation id="6981553172137913845">如果想要進行私密瀏覽,請按一下三個圓點圖示的選單,然後開啟無痕式視窗</translation> -<translation id="6981761993313539853">請確認你的藍牙裝置放在附近,且處於配對模式。只配對你信任的裝置。<ph name="BEGIN_LINK_LEARN_MORE" />瞭解詳情<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">無障礙設定</translation> <translation id="6983507711977005608">中斷與「即時網路共用」網路的連線</translation> <translation id="6983783921975806247">已註冊的 OID</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index b0ae2a0..ec3009c 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -511,7 +511,6 @@ <translation id="1410797069449661718">Skrolela ngakuthebhu yokuqala</translation> <translation id="1410806973194718079">Ayikwazi ukuhlola izinqubomgomo</translation> <translation id="1411400282355634827">Setha kabusha zonke izimvume zedivayisi ye-Bluetooth?</translation> -<translation id="1411724932979011919">Ukufaka kwakho kufanele kube ne-LPA yefomethi:1$<smdp address>$<activation code></translation> <translation id="1414315029670184034">Ungavumeli amasayithi asebenzise ikhamera yakho</translation> <translation id="1414648216875402825">Ubuyekezela kunguqulo engazinzile ye-<ph name="PRODUCT_NAME" /> equkethe izici eziqhubekayo. Ukuphahlazeka namaphutha angalindelekile kuzovela. Sicela uqhubeke ngokuqaphela.</translation> <translation id="1415708812149920388">Ukufinyelela ukufunda kubhodi lokunamathisela kunqatshelwe</translation> @@ -1248,7 +1247,6 @@ <translation id="1972313920920745320">Amasayithi owangezayo azohlala njalo esebenza futhi inkumbulo ngeke ikhululwe kusuka kuwo. <ph name="BEGIN_LINK" />Funda kabanzi mayelana nokugcina amasayithi athile esebenza<ph name="END_LINK" /></translation> <translation id="1972325230031091483">Uzobhrawuza ngokushesha ngoba okuqukethwe kulayishwa ngokuqhubekayo ngokusekelwe ekuvakasheni kwakho kwamanje kwekhasi lewebhu</translation> <translation id="197288927597451399">Gcina</translation> -<translation id="1973313062201924554">Izimvume ozivumelayo ze-<ph name="APP_NAME" /> zizovunyelwa kule app.</translation> <translation id="1973763416111613016">I-<ph name="FILE_NAME" /> ayikwazi ukulandwa ngokuvikelekile. Cindezela ku-Shift+F6 ukuze wenze umjikelezo kundawo yebha yokulanda.</translation> <translation id="1973886230221301399">I-ChromeVox</translation> <translation id="1974043046396539880">Amaphoyinti wokusabalalisa we-CRL</translation> @@ -3943,7 +3941,6 @@ <translation id="4100733287846229632">Isikhala sedivayisi siphansi kakhulu</translation> <translation id="4100853287411968461">Umkhawulo omusha wesikhathi sesikrini</translation> <translation id="4101352914005291489">I-SSID efihliwe</translation> -<translation id="4102469565336584882">Ikhodi engavumelekile. Ukufaka kwakho kufanele kube ne-LPA yefomethi:1$<smdp address>$<activation code></translation> <translation id="4102906002417106771">Qala kabusha ku-powerwash</translation> <translation id="4104163789986725820">T&humela...</translation> <translation id="4104944259562794668">Ungayinika amandla kamuva kokuthi Amasethingi > Ukuvikeleka Nobumfihlo > Ukukhiya isikrini nokungena ngemvume</translation> @@ -7105,7 +7102,6 @@ <translation id="6757431299485455321">Siza amanye amadivayisi athole le hotspot.</translation> <translation id="6758056191028427665">Sazise ukuthi siqhuba kanjani.</translation> <translation id="6759193508432371551">Ukusetha kabusha kwasekuqaleni</translation> -<translation id="6761431452438552910">Qiniseka ukuthi idivayisi ye-Bluetooth yakho ikwimodi yokubhangqa futhi iseduze. Bhangqa kuphela namadivayisi owathembayo.</translation> <translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation> <translation id="6762833852331690540">Vuliwe</translation> <translation id="676560328519657314">Izindlela zakho zokukhokha ku-Google Pay</translation> @@ -7399,7 +7395,6 @@ <translation id="6979737339423435258">Sonke isikhathi</translation> <translation id="6980402667292348590">faka</translation> <translation id="6981553172137913845">Ukuze uphequlule ngokuyimfihlo, chofoza imenyu yesithonjana samacashazi ukuze uvule iwindi le-incognito</translation> -<translation id="6981761993313539853">Qiniseka ukuthi idivayisi ye-Bluetooth yakho ikwimodi yokubhangqa futhi iseduze. Bhangqa kuphela namadivayisi owathembayo. <ph name="BEGIN_LINK_LEARN_MORE" />Funda kabanzi<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="6981982820502123353">Ukufinyeleleka</translation> <translation id="6983507711977005608">Nqamula inethiwekhi ye-Tethering esheshayo</translation> <translation id="6983783921975806247">I-OID ebhalisiwe</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb index 17bd0e5..a106c18e 100644 --- a/chrome/app/resources/google_chrome_strings_hi.xtb +++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -155,6 +155,7 @@ <translation id="3582972582564653026">Chrome को अपने सभी डिवाइस पर सिंक करें और मनमुताबिक बनाएं</translation> <translation id="3596080736082218006">{COUNT,plural, =0{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए Chrome को फिर से लॉन्च करें}=1{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए Chrome को फिर से लॉन्च करें. आपकी गुप्त विंडो फिर से नहीं खुलेगी.}one{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए Chrome को फिर से लॉन्च करें. आपकी # गुप्त विंडो फिर से नहीं खुलेंगी.}other{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए Chrome को फिर से लॉन्च करें. आपकी # गुप्त विंडो फिर से नहीं खुलेंगी.}}</translation> <translation id="3622797965165704966">अब अपने Google खाते के साथ और शेयर किए गए कंप्यूटर पर Chrome का उपयोग करना आसान हो गया है.</translation> +<translation id="3635073343384702370">पासवर्ड सेव करने पर ही, Chrome आपके पासवर्ड की जांच कर सकता है</translation> <translation id="3673813398384385993">Chrome को पता चला है कि "<ph name="EXTENSION_NAME" />" में मैलवेयर है</translation> <translation id="3703994572283698466"><ph name="BEGIN_LINK_LINUX_OSS" />Linux डेवलपमेंट एनवायरमेंट<ph name="END_LINK_LINUX_OSS" /> की तरह, ChromeOS को भी अतिरिक्त <ph name="BEGIN_LINK_CROS_OSS" />ओपन सोर्स सॉफ़्टवेयर<ph name="END_LINK_CROS_OSS" /> की मदद से बनाया गया है.</translation> <translation id="3716540481907974026">ChromeOS Flex का वर्शन</translation> @@ -205,6 +206,7 @@ <translation id="4571503333518166079">Chrome की सूचना सेटिंग पर जाएं</translation> <translation id="459622048091363950">Chrome को ऐक्सेस मिलने के बाद, वेबसाइटें आपसे ऐक्सेस मांग सकेंगी.</translation> <translation id="4600710005438004015">Chrome सबसे नए वर्शन में अपडेट नहीं कर सका, इसलिए आपको नई सुविधाएं और सुरक्षा सुधार नहीं मिल रहे हैं.</translation> +<translation id="4624065194742029982">Chrome का गुप्त मोड</translation> <translation id="4627412468266359539">वैकल्पिक: ChromeOS Flex को बेहतर बनाने में हमारी मदद करने के लिए, Google को इसके इस्तेमाल से जुड़ा डेटा और इसकी परफ़ॉर्मेंस की जानकारी अपने-आप भेजने की सुविधा चालू करें.</translation> <translation id="4633000520311261472">Chrome को ज़्यादा सुरक्षित बनाने के लिए, हमने ऐसे कुछ एक्सटेंशन अक्षम कर दिए हैं जो <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> में सूचीबद्ध नहीं हैं और आपकी जानकारी के बिना जोड़े गए हो सकते हैं.</translation> <translation id="4680828127924988555">इंस्टॉल करना रद्द करें</translation> @@ -214,6 +216,7 @@ <translation id="4754614261631455953">Google Chrome Canary (mDNS-In)</translation> <translation id="4771048833395599659">यह फ़ाइल खतरनाक हो सकती है, इसलिए Chrome ने इसे रोक दिया है.</translation> <translation id="479167709087336770">इसमें स्पेलिंग जाँचने वाली उसी सुविधा का इस्तेमाल होता है जिसका इस्तेमाल 'Google सर्च' में किया जाता है. आप ब्राउज़र में जो भी लेख लिखते हैं उसे Google को भेजा जाता है. आप 'सेटिंग' में जाकर इसे कभी भी बदल सकते हैं.</translation> +<translation id="4793679854893018356">जानें कि Chrome आपको इंटरनेट पर कैसे सुरक्षित रखता है</translation> <translation id="4828579605166583682">Google Chrome, मौजूदा पासवर्ड बदलने की कोशिश कर रहा है. इसकी अनुमति देने के लिए, Windows का पासवर्ड डालें.</translation> <translation id="4842397268809523050">ChromeOS Flex आपके डेटा को सिंक नहीं कर सका, क्योंकि आपके डोमेन पर सिंक करने की सुविधा उपलब्ध नहीं है.</translation> <translation id="4873783916118289636">Chrome के निजता और सुरक्षा से जुड़े मुख्य कंट्रोल देखें</translation> @@ -264,6 +267,7 @@ <translation id="5756509061973259733">इस खाते से बनाई गई एक Chrome प्रोफ़ाइल इस डिवाइस पर पहले से मौजूद है</translation> <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome कैनरी</translation> <translation id="5804318322022881572">Chrome लॉन्च नहीं किया जा सका. फिर से कोशिश करें.</translation> +<translation id="586971344380992563">असुरक्षित साइटों और डाउनलोड की गई फ़ाइलों के बारे में, <ph name="BEGIN_LINK" />Chrome आपको चेतावनी देता है<ph name="END_LINK" /></translation> <translation id="5895138241574237353">फिर से प्रारंभ करें</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - नेटवर्क में साइन इन करें</translation> <translation id="5924017743176219022">इंटरनेट से कनेक्ट हो रहा है…</translation> @@ -273,6 +277,7 @@ <translation id="5941830788786076944">Google Chrome को सामान्य ब्राउज़र बनाएं</translation> <translation id="6003112304606738118">डाउनलोड हो रहा है... <ph name="HOURS" /> घंटे बचे हैं</translation> <translation id="6010556343189461180">आगे भी Google Chrome के अपडेट पाते रहने के लिए, आपके कंप्यूटर में macOS 10.15 या इसके बाद का वर्शन इंस्टॉल होना चाहिए. फ़िलहाल, इस कंप्यूटर में macOS 10.14 का इस्तेमाल किया जा रहा है.</translation> +<translation id="6014316319780893079"><ph name="BEGIN_LINK" />Chrome के टूल<ph name="END_LINK" /> की मदद से, सुरक्षित तरीके से ब्राउज़िंग की जा सकती है. साथ ही, अपना डेटा भी कंट्रोल किया जा सकता है</translation> <translation id="6022659036123304283">Chrome को अपने मुताबिक बनाएं</translation> <translation id="6025087594896450715">Google Chrome <ph name="REMAINING_TIME" /> में रीस्टार्ट होगा</translation> <translation id="6040143037577758943">बंद करें</translation> @@ -361,6 +366,7 @@ <translation id="7649070708921625228">सहायता</translation> <translation id="7651907282515937834">Chrome Enterprise लोगो</translation> <translation id="7655455401911432608">आपका ब्राउज़िंग इतिहास, जिसमें इस डिवाइस पर Chrome का इस्तेमाल करके देखी गई साइटों का रिकॉर्ड होता है.</translation> +<translation id="769538538642757151">कोई कार्रवाई ज़रूरी होने पर, Chrome आपको इसकी सूचना देगा</translation> <translation id="7747138024166251722">इंस्टॉलर अस्थायी डायरेक्टरी नहीं बना सका. कृपया डिस्क में खाली जगह और सॉफ़्टवेयर इंस्टॉल करने की अनुमति जांचें.</translation> <translation id="7761834446675418963">Chrome को खोलना और ब्राउज़ करना शुरू करने के लिए अपना नाम क्लिक करें.</translation> <translation id="7777080907402804672">अगर किसी इमेज के बारे में मददगार जानकारी मौजूद नहीं है, तो Chrome उसके बारे में जानकारी देने की कोशिश करेगा. जानकारी तैयार करने के लिए, इमेज Google को भेजी जाती हैं. आप किसी भी समय सेटिंग में जाकर इसे बंद कर सकते हैं.</translation> @@ -388,6 +394,7 @@ <translation id="8129812357326543296">&Google Chrome के बारे में</translation> <translation id="813913629614996137">शुरू हो रहा है...</translation> <translation id="8255190535488645436">Google Chrome आपके कैमरे और माइक्रोफ़ोन का उपयोग कर रहा है.</translation> +<translation id="8267953129876836456">Chrome का सुझाव है कि आपको बेहतर सुरक्षा पाने के लिए कुछ कार्रवाई करनी चाहिए</translation> <translation id="8270775718612349140">वे सर्टिफ़िकेट जिन्हें Chrome मैनेज करता है</translation> <translation id="8286862437124483331">Google Chrome पासवर्ड दिखाने का प्रयास कर रहा है. इसकी अनुमति देने के लिए अपना Windows पासवर्ड लिखें.</translation> <translation id="8290100596633877290">रुकिए! Google Chrome क्रैश हो गया है. अभी फिर से लॉन्च करें?</translation> @@ -402,6 +409,7 @@ <translation id="8403038600646341038">कंप्यूटर की स्क्रीन में Chrome का लोगो.</translation> <translation id="8416347857511542594">Chrome पर दिलचस्पी के मुताबिक विज्ञापन देखने की सुविधा के बारे में ज़्यादा जानें</translation> <translation id="8418845734693287262">ChromeOS आपका डेटा सिंक नहीं कर सका, क्योंकि आपके खाते में साइन इन करने से जुड़ी जानकारी पुरानी हो चुकी है.</translation> +<translation id="842386925677997438">Chrome के सुरक्षा टूल</translation> <translation id="8433638294851456451">यहां से अपने Android फ़ोन पर नंबर भेजने के लिए, दोनों डिवाइस पर Chrome में साइन इन करें.</translation> <translation id="8451192282033883849">आपके खाते को <ph name="MANAGER_NAME" /> मैनेज करता है. आपका एडमिन, इस Chrome ब्राउज़र प्रोफ़ाइल और उसके डेटा को देख सकता है और उसमें बदलाव कर सकता है. जैसे, बुकमार्क, इतिहास, और पासवर्ड.</translation> <translation id="8496177819998570653">Google Password Manager</translation> @@ -442,6 +450,7 @@ <translation id="9195993889682885387">Chrome पिछले कुछ हफ़्तों के ब्राउज़िंग इतिहास के आधार पर, आपकी पसंद के विषयों का अनुमान लगा सकता है. यह जानकारी आपके डिवाइस पर सेव की जाती है.</translation> <translation id="919706545465235479">सिंक शुरू करने के लिए Chrome अपडेट करें</translation> <translation id="922152298093051471">Chrome को पसंद के मुताबिक बनाएं</translation> +<translation id="92460355979482493">इस सेटिंग के चालू होने पर Chrome, पेजों को पहले से लोड कर देता है. इससे, पेजों को ज़्यादा तेज़ी से खोजा और ब्राउज़ किया जा सकता है.</translation> <translation id="93760716455950538">ChromeOS Flex रीस्टार्ट करें</translation> <translation id="940313311831216333">Chrome से जुड़ी चीज़ों को अपने सभी डिवाइसों पर ऐक्सेस करने के लिए, साइन इन करें. इसके बाद, सिंक चालू करें.</translation> <translation id="943390475793766444">Chrome इस फ़ाइल को स्कैन करने का सुझाव देता है, क्योंकि यह खतरनाक हो सकती है.</translation>
diff --git a/chrome/app/theme/google_chrome b/chrome/app/theme/google_chrome index fd5f285..69e8a82c 160000 --- a/chrome/app/theme/google_chrome +++ b/chrome/app/theme/google_chrome
@@ -1 +1 @@ -Subproject commit fd5f28534a5255022dd9cee6915e76755f87cc2f +Subproject commit 69e8a82c73c3a200d51bb612a30b32c04a8f07de
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 512a945..a214247 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -2584,11 +2584,14 @@ deps += [ "//chrome/browser/companion/visual_search:flags", "//chrome/browser/manta/proto:manta_proto", - "//components/compose/core/browser", "//components/user_education/common", ] } + if (!is_android && !is_chromeos) { + deps += [ "//components/compose/core/browser" ] + } + if (enable_screen_ai_service) { sources += [ "accessibility/ax_screen_ai_annotator.cc",
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index 071e9900..b1d3f57 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -1040,6 +1040,8 @@ "diagnostics/diagnostics_browser_delegate_impl.h", "display/quirks_manager_delegate_impl.cc", "display/quirks_manager_delegate_impl.h", + "display/variable_refresh_rate_controller.cc", + "display/variable_refresh_rate_controller.h", "drive/drive_integration_service.cc", "drive/drive_integration_service.h", "drive/drivefs_native_message_host_ash.cc",
diff --git a/chrome/browser/ash/display/variable_refresh_rate_controller.cc b/chrome/browser/ash/display/variable_refresh_rate_controller.cc new file mode 100644 index 0000000..d25e817 --- /dev/null +++ b/chrome/browser/ash/display/variable_refresh_rate_controller.cc
@@ -0,0 +1,41 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/display/variable_refresh_rate_controller.h" + +#include "chromeos/dbus/power_manager/battery_saver.pb.h" +#include "ui/base/ui_base_features.h" + +namespace ash { + +VariableRefreshRateController::VariableRefreshRateController( + display::DisplayConfigurator* display_configurator, + chromeos::PowerManagerClient* power_manager_client, + game_mode::GameModeController* game_mode_controller) + : display_configurator_(display_configurator) { + battery_saver_mode_observer_.Observe(power_manager_client); + game_mode_observer_.Observe(game_mode_controller); +} + +VariableRefreshRateController::~VariableRefreshRateController() = default; + +void VariableRefreshRateController::BatterySaverModeStateChanged( + const power_manager::BatterySaverModeState& state) { + battery_saver_mode_enabled_ = state.has_enabled() && state.enabled(); + RefreshState(); +} + +void VariableRefreshRateController::OnSetGameMode(GameMode game_mode) { + game_mode_ = game_mode; + RefreshState(); +} + +void VariableRefreshRateController::RefreshState() { + display_configurator_->SetVrrEnabled( + ::features::IsVariableRefreshRateAlwaysOn() || + (::features::IsVariableRefreshRateEnabled() && + !battery_saver_mode_enabled_ && game_mode_ == GameMode::BOREALIS)); +} + +} // namespace ash
diff --git a/chrome/browser/ash/display/variable_refresh_rate_controller.h b/chrome/browser/ash/display/variable_refresh_rate_controller.h new file mode 100644 index 0000000..25a0a97 --- /dev/null +++ b/chrome/browser/ash/display/variable_refresh_rate_controller.h
@@ -0,0 +1,70 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_DISPLAY_VARIABLE_REFRESH_RATE_CONTROLLER_H_ +#define CHROME_BROWSER_ASH_DISPLAY_VARIABLE_REFRESH_RATE_CONTROLLER_H_ + +#include "base/scoped_observation.h" +#include "chrome/browser/ash/game_mode/game_mode_controller.h" +#include "chromeos/dbus/power/power_manager_client.h" +#include "ui/display/manager/display_configurator.h" + +namespace power_manager { +class BatterySaverModeState; +} // namespace power_manager + +namespace ash { + +namespace { +using GameMode = ash::ResourcedClient::GameMode; +} // namespace + +// VariableRefreshRateController manages the VRR enabled/disabled state. It is +// responsible for communicating the desired VRR state to the configurator. VRR +// is meant to be enabled as long as Borealis game mode is active, except when +// battery saver mode is also active. +class VariableRefreshRateController + : public chromeos::PowerManagerClient::Observer, + public game_mode::GameModeController::Observer { + public: + VariableRefreshRateController( + display::DisplayConfigurator* display_configurator, + chromeos::PowerManagerClient* power_status, + game_mode::GameModeController* game_mode_controller); + + VariableRefreshRateController(const VariableRefreshRateController&) = delete; + VariableRefreshRateController& operator=( + const VariableRefreshRateController&) = delete; + + ~VariableRefreshRateController() override; + + // PowerManagerClient::Observer implementation. + void BatterySaverModeStateChanged( + const power_manager::BatterySaverModeState& state) override; + + // GameModeController::Observer implementation. + void OnSetGameMode(GameMode game_mode) override; + + private: + void RefreshState(); + + bool battery_saver_mode_enabled_ = false; + GameMode game_mode_ = GameMode::OFF; + + // Not owned. + raw_ptr<display::DisplayConfigurator> display_configurator_; + + base::ScopedObservation<chromeos::PowerManagerClient, + chromeos::PowerManagerClient::Observer> + battery_saver_mode_observer_{this}; + base::ScopedObservation<game_mode::GameModeController, + game_mode::GameModeController::Observer> + game_mode_observer_{this}; + + base::WeakPtrFactory<VariableRefreshRateController> weak_ptr_factory_{this}; +}; + +} // namespace ash + +#endif // CHROME_BROWSER_ASH_DISPLAY_VARIABLE_REFRESH_RATE_CONTROLLER_H_
diff --git a/chrome/browser/ash/game_mode/game_mode_controller.cc b/chrome/browser/ash/game_mode/game_mode_controller.cc index 0448600..01908cc 100644 --- a/chrome/browser/ash/game_mode/game_mode_controller.cc +++ b/chrome/browser/ash/game_mode/game_mode_controller.cc
@@ -35,7 +35,10 @@ public: // Constructs an instance using the task ID of the window it is associated // with. - explicit ArcGameModeCriteria(aura::Window* window) { + ArcGameModeCriteria( + aura::Window* window, + const NotifySetGameModeCallback notify_set_game_mode_callback) + : notify_set_game_mode_callback_(notify_set_game_mode_callback) { // For ARC container boards, Game Mode optimizations are not available // (b/248972198). if (!arc::IsArcVmEnabled()) @@ -101,7 +104,7 @@ void Enable() { bool signal_resourced = base::FeatureList::IsEnabled(arc::kGameModeFeature); enabler_ = std::make_unique<GameModeController::GameModeEnabler>( - GameMode::ARC, signal_resourced); + GameMode::ARC, signal_resourced, notify_set_game_mode_callback_); } raw_ptr<arc::ConnectionHolder<arc::mojom::AppInstance, arc::mojom::AppHost>, @@ -109,6 +112,7 @@ connection_; std::unique_ptr<GameModeController::GameModeEnabler> enabler_; + const NotifySetGameModeCallback notify_set_game_mode_callback_; // This must come last to make sure weak pointers are invalidated first. base::WeakPtrFactory<ArcGameModeCriteria> weak_ptr_factory_{this}; @@ -162,14 +166,23 @@ auto mode = ModeOfWindow(window); VLOG(4) << "Focused window game mode type: " << static_cast<int>(mode); - if (mode != GameMode::OFF) - focused_ = std::make_unique<WindowTracker>(window_state, - std::move(maybe_keep_focused)); + if (mode != GameMode::OFF) { + focused_ = std::make_unique<WindowTracker>( + window_state, std::move(maybe_keep_focused), + base::BindRepeating( + &GameModeController::NotifySetGameMode, + // This is safe because the callback is only used by WindowTracker + // and GameModeCriteria, which are owned by (or transitively owned + // by) GameModeController. Therefore |this| cannot be stale. + base::Unretained(this))); + } } GameModeController::WindowTracker::WindowTracker( ash::WindowState* window_state, - std::unique_ptr<WindowTracker> previous_focus) { + std::unique_ptr<WindowTracker> previous_focus, + NotifySetGameModeCallback notify_set_game_mode_callback) + : notify_set_game_mode_callback_(notify_set_game_mode_callback) { auto* window = window_state->window(); auto mode = ModeOfWindow(window); @@ -221,9 +234,11 @@ // Borealis has no further criteria than the window being fullscreen and // focused, already guaranteed by WindowTracker existing. game_mode_criteria_ = std::make_unique<GameModeEnabler>( - GameMode::BOREALIS, /*signal_resourced=*/true); + GameMode::BOREALIS, /*signal_resourced=*/true, + notify_set_game_mode_callback_); } else if (mode == GameMode::ARC) { - game_mode_criteria_ = std::make_unique<ArcGameModeCriteria>(window); + game_mode_criteria_ = std::make_unique<ArcGameModeCriteria>( + window, notify_set_game_mode_callback_); } else { LOG(DFATAL) << "Unknown GameMode: " << static_cast<int>(mode); } @@ -238,11 +253,17 @@ bool GameModeController::GameModeEnabler::should_record_failure; -GameModeController::GameModeEnabler::GameModeEnabler(GameMode mode, - bool signal_resourced) - : mode_(mode), signal_resourced_(signal_resourced) { +GameModeController::GameModeEnabler::GameModeEnabler( + GameMode mode, + bool signal_resourced, + NotifySetGameModeCallback notify_set_game_mode_callback) + : mode_(mode), + signal_resourced_(signal_resourced), + notify_set_game_mode_callback_(notify_set_game_mode_callback) { DCHECK(mode != GameMode::OFF); + notify_set_game_mode_callback_.Run(mode_); + if (!signal_resourced) return; @@ -261,10 +282,11 @@ GameModeController::GameModeEnabler::~GameModeEnabler() { auto time_in_mode = began_.Elapsed(); - base::UmaHistogramLongTimes100(TimeInGameModeHistogramName(mode_), time_in_mode); + notify_set_game_mode_callback_.Run(GameMode::OFF); + if (!signal_resourced_) return; @@ -302,4 +324,18 @@ } } +void GameModeController::AddObserver(Observer* obs) { + observers_.AddObserver(obs); +} + +void GameModeController::RemoveObserver(Observer* obs) { + observers_.RemoveObserver(obs); +} + +void GameModeController::NotifySetGameMode(GameMode game_mode) { + for (auto& obs : observers_) { + obs.OnSetGameMode(game_mode); + } +} + } // namespace game_mode
diff --git a/chrome/browser/ash/game_mode/game_mode_controller.h b/chrome/browser/ash/game_mode/game_mode_controller.h index 1d2610f..a03aef07c 100644 --- a/chrome/browser/ash/game_mode/game_mode_controller.h +++ b/chrome/browser/ash/game_mode/game_mode_controller.h
@@ -7,6 +7,8 @@ #include "ash/wm/window_state.h" #include "ash/wm/window_state_observer.h" +#include "base/observer_list.h" +#include "base/observer_list_types.h" #include "base/scoped_observation.h" #include "base/timer/elapsed_timer.h" #include "base/timer/timer.h" @@ -16,8 +18,14 @@ namespace game_mode { +namespace { + using GameMode = ash::ResourcedClient::GameMode; +typedef base::RepeatingCallback<void(GameMode)> NotifySetGameModeCallback; + +} // namespace + inline const char* TimeInGameModeHistogramName(GameMode mode) { if (mode == GameMode::BOREALIS) return "GameMode.TimeInGameMode.Borealis"; @@ -42,7 +50,9 @@ // When a Borealis or ARC game app game enters full screen, game mode is // enabled. Game Mode is actually enabled as a result of multiple sets of -// criteria being fulfilled, each checked in sequence. +// criteria being fulfilled, each checked in sequence. The GameModeController +// additionally exposes an Observer interface which allows clients to subscribe +// to changes in the game mode state. // // When one criteria set is met, a new criteria object is constructed which // is responsible for checking the next criteria, and is owned by the prior @@ -107,7 +117,9 @@ // by the GameModeEnabler regardless of resourced signaling, which allows // A/B testing of the effect of optimizations on time spent playing the // game. - GameModeEnabler(GameMode mode, bool signal_resourced); + GameModeEnabler(GameMode mode, + bool signal_resourced, + NotifySetGameModeCallback notify_set_game_mode_callback); ~GameModeEnabler() override; GameMode mode() const override; @@ -124,6 +136,7 @@ const GameMode mode_; const bool signal_resourced_; + const NotifySetGameModeCallback notify_set_game_mode_callback_; }; static GameMode ModeOfWindow(aura::Window* window); @@ -132,7 +145,8 @@ public aura::WindowObserver { public: WindowTracker(ash::WindowState* window_state, - std::unique_ptr<WindowTracker> previous_focused); + std::unique_ptr<WindowTracker> previous_focused, + NotifySetGameModeCallback notify_set_game_mode_callback); ~WindowTracker() override; // Overridden from WindowObserver @@ -151,10 +165,22 @@ base::ScopedObservation<aura::Window, aura::WindowObserver> window_observer_{this}; std::unique_ptr<GameModeCriteria> game_mode_criteria_; + const NotifySetGameModeCallback notify_set_game_mode_callback_; }; + // Observer class which subscribes to changes in the GameMode state. + class Observer : public base::CheckedObserver { + public: + virtual void OnSetGameMode(GameMode game_mode) = 0; + }; + + void AddObserver(Observer* obs); + void RemoveObserver(Observer* obs); + void NotifySetGameMode(GameMode game_mode); + private: std::unique_ptr<WindowTracker> focused_; + base::ObserverList<Observer> observers_; }; } // namespace game_mode
diff --git a/chrome/browser/ash/game_mode/game_mode_controller_for_arc_unittest.cc b/chrome/browser/ash/game_mode/game_mode_controller_for_arc_unittest.cc index 726eb9e..16ad676 100644 --- a/chrome/browser/ash/game_mode/game_mode_controller_for_arc_unittest.cc +++ b/chrome/browser/ash/game_mode/game_mode_controller_for_arc_unittest.cc
@@ -290,5 +290,33 @@ EXPECT_EQ(0, fake_resourced_client_->get_enter_game_mode_count()); } +TEST_F(GameModeControllerForArcTest, TriggersObserver) { + MockGameModeObserver mock_game_mode_observer; + game_mode_controller_->AddObserver(&mock_game_mode_observer); + + arc_app_test_.app_instance()->set_app_category_of_pkg( + "org.funstuff.client", arc::mojom::AppCategory::kGame); + + auto game_widget = arc::ArcTaskWindowBuilder() + .SetTaskId(42) + .SetPackageName("org.funstuff.client") + .BuildOwnsNativeWidget(); + game_widget->Show(); + + fake_resourced_client_->set_set_game_mode_response( + ash::ResourcedClient::GameMode::OFF); + + EXPECT_CALL(mock_game_mode_observer, + OnSetGameMode(testing::Eq(GameMode::ARC))); + game_widget->SetFullscreen(true); + + EXPECT_CALL(mock_game_mode_observer, + OnSetGameMode(testing::Eq(GameMode::OFF))); + game_widget->SetFullscreen(false); + + testing::Mock::VerifyAndClear(&mock_game_mode_observer); + game_mode_controller_->RemoveObserver(&mock_game_mode_observer); +} + } // namespace } // namespace game_mode
diff --git a/chrome/browser/ash/game_mode/game_mode_controller_for_borealis_unittest.cc b/chrome/browser/ash/game_mode/game_mode_controller_for_borealis_unittest.cc index af08669..e95c9608 100644 --- a/chrome/browser/ash/game_mode/game_mode_controller_for_borealis_unittest.cc +++ b/chrome/browser/ash/game_mode/game_mode_controller_for_borealis_unittest.cc
@@ -209,5 +209,21 @@ EXPECT_EQ(0, fake_resourced_client_->get_enter_game_mode_count()); } +TEST_F(GameModeControllerForBorealisTest, TriggersObserver) { + MockGameModeObserver mock_game_mode_observer; + game_mode_controller_->AddObserver(&mock_game_mode_observer); + EXPECT_CALL(mock_game_mode_observer, + OnSetGameMode(testing::Eq(GameMode::BOREALIS))); + std::unique_ptr<views::Widget> test_widget = + CreateFakeWidget("org.chromium.guest_os.borealis.foo", true); + + EXPECT_CALL(mock_game_mode_observer, + OnSetGameMode(testing::Eq(GameMode::OFF))); + test_widget->SetFullscreen(false); + + testing::Mock::VerifyAndClear(&mock_game_mode_observer); + game_mode_controller_->RemoveObserver(&mock_game_mode_observer); +} + } // namespace } // namespace game_mode
diff --git a/chrome/browser/ash/game_mode/testing/game_mode_controller_test_base.cc b/chrome/browser/ash/game_mode/testing/game_mode_controller_test_base.cc index 12d13f6..f1d6a9a 100644 --- a/chrome/browser/ash/game_mode/testing/game_mode_controller_test_base.cc +++ b/chrome/browser/ash/game_mode/testing/game_mode_controller_test_base.cc
@@ -1,3 +1,7 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + #include "chrome/browser/ash/game_mode/testing/game_mode_controller_test_base.h" namespace game_mode {
diff --git a/chrome/browser/ash/game_mode/testing/game_mode_controller_test_base.h b/chrome/browser/ash/game_mode/testing/game_mode_controller_test_base.h index 10b8bfd..daf765c 100644 --- a/chrome/browser/ash/game_mode/testing/game_mode_controller_test_base.h +++ b/chrome/browser/ash/game_mode/testing/game_mode_controller_test_base.h
@@ -17,6 +17,15 @@ namespace game_mode { +class MockGameModeObserver + : public testing::NiceMock<GameModeController::Observer> { + public: + MockGameModeObserver() = default; + ~MockGameModeObserver() override = default; + + MOCK_METHOD(void, OnSetGameMode, (GameMode mode), (override)); +}; + // Test base for all game mode types (e.g. Borealis, ARC). class GameModeControllerTestBase : public ChromeAshTestBase { public:
diff --git a/chrome/browser/ash/growth/campaigns_manager_client_impl.cc b/chrome/browser/ash/growth/campaigns_manager_client_impl.cc index 15b56fe8..268e9ae 100644 --- a/chrome/browser/ash/growth/campaigns_manager_client_impl.cc +++ b/chrome/browser/ash/growth/campaigns_manager_client_impl.cc
@@ -9,9 +9,12 @@ #include "ash/constants/ash_switches.h" #include "base/command_line.h" #include "base/files/file_path.h" +#include "chrome/browser/ash/login/demo_mode/demo_mode_dimensions.h" +#include "chrome/browser/ash/login/demo_mode/demo_session.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/component_updater/cros_component_manager.h" +#include "chrome/browser/profiles/profile_manager.h" #include "chromeos/ash/components/growth/campaigns_manager.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -22,8 +25,9 @@ } // namespace CampaignsManagerClientImpl::CampaignsManagerClientImpl() - : campaigns_manager_( - std::make_unique<growth::CampaignsManager>(/*client=*/this)) {} + : campaigns_manager_(std::make_unique<growth::CampaignsManager>( + /*client=*/this, + g_browser_process->local_state())) {} CampaignsManagerClientImpl::~CampaignsManagerClientImpl() = default; @@ -39,7 +43,7 @@ // Loads campaigns component. auto cros_component_manager = g_browser_process->platform_part()->cros_component_manager(); - DCHECK(cros_component_manager); + CHECK(cros_component_manager); cros_component_manager->Load( kCampaignComponentName, @@ -49,6 +53,18 @@ weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } +bool CampaignsManagerClientImpl::IsDeviceInDemoMode() const { + return ash::DemoSession::IsDeviceInDemoMode(); +} + +bool CampaignsManagerClientImpl::IsCloudGamingDevice() const { + return ash::demo_mode::IsCloudGamingDevice(); +} + +bool CampaignsManagerClientImpl::IsFeatureAwareDevice() const { + return ash::demo_mode::IsFeatureAwareDevice(); +} + void CampaignsManagerClientImpl::OnComponentDownloaded( growth::CampaignComponentLoadedCallback loaded_callback, component_updater::CrOSComponentManager::Error error,
diff --git a/chrome/browser/ash/growth/campaigns_manager_client_impl.h b/chrome/browser/ash/growth/campaigns_manager_client_impl.h index 5d91de8..db2afaf 100644 --- a/chrome/browser/ash/growth/campaigns_manager_client_impl.h +++ b/chrome/browser/ash/growth/campaigns_manager_client_impl.h
@@ -26,6 +26,9 @@ // growth::CampaignsManagerClient: void LoadCampaignsComponent( growth::CampaignComponentLoadedCallback callback) override; + bool IsDeviceInDemoMode() const override; + bool IsCloudGamingDevice() const override; + bool IsFeatureAwareDevice() const override; private: void OnComponentDownloaded(
diff --git a/chrome/browser/ash/growth/campaigns_manager_client_unittest.cc b/chrome/browser/ash/growth/campaigns_manager_client_unittest.cc index 792f1b0..5738d4d 100644 --- a/chrome/browser/ash/growth/campaigns_manager_client_unittest.cc +++ b/chrome/browser/ash/growth/campaigns_manager_client_unittest.cc
@@ -10,6 +10,9 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/component_updater/fake_cros_component_manager.h" #include "chrome/test/base/browser_process_platform_part_test_api_chromeos.h" +#include "chrome/test/base/scoped_testing_local_state.h" +#include "chrome/test/base/testing_browser_process.h" +#include "chrome/test/base/testing_profile_manager.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -18,9 +21,9 @@ using ::component_updater::FakeCrOSComponentManager; -constexpr char kCampaignsComponent[] = "growth-campaigns"; +inline constexpr char kCampaignsComponent[] = "growth-campaigns"; -constexpr char kTestCampaignsComponentMountedPath[] = +inline constexpr char kTestCampaignsComponentMountedPath[] = "/run/imageloader/growth_campaigns"; } // namespace @@ -38,14 +41,17 @@ ~CampaignsManagerClientTest() override = default; void SetUp() override { + SetupProfileManager(); InitializeCrosComponentManager(); - campaigns_manager_client_ = std::make_unique<CampaignsManagerClientImpl>(); } void TearDown() override { cros_component_manager_ = nullptr; browser_process_platform_part_test_api_.ShutdownCrosComponentManager(); + campaigns_manager_client_.reset(); + profile_manager_->DeleteAllTestingProfiles(); + profile_manager_.reset(); } protected: @@ -79,12 +85,19 @@ /*load_response=*/error, install_path, mount_path)); } + void SetupProfileManager() { + profile_manager_ = std::make_unique<TestingProfileManager>( + TestingBrowserProcess::GetGlobal()); + ASSERT_TRUE(profile_manager_->SetUp()); + } + content::BrowserTaskEnvironment task_environment_; std::unique_ptr<CampaignsManagerClientImpl> campaigns_manager_client_; raw_ptr<FakeCrOSComponentManager, ExperimentalAsh> cros_component_manager_ = nullptr; private: + std::unique_ptr<TestingProfileManager> profile_manager_; BrowserProcessPlatformPartTestApi browser_process_platform_part_test_api_; };
diff --git a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc index 7eb542c..e2f1533 100644 --- a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc +++ b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
@@ -702,12 +702,10 @@ bool changed = UpdateAndCleanUpDeviceLocalAccounts( policy::GetDeviceLocalAccounts(cros_settings_)); - // If ephemeral users are enabled and we are on the login screen, take this - // opportunity to clean up by removing all regular users except the owner. + // Remove ephemeral regular users (except the owner) when on the login screen. if (!IsUserLoggedIn()) { ScopedListPrefUpdate prefs_users_update(GetLocalState(), user_manager::kRegularUsersPref); - prefs_users_update->clear(); // Take snapshot because DeleteUser called in the loop will update it. std::vector<user_manager::User*> users = users_; for (user_manager::User* user : users) { @@ -720,9 +718,9 @@ user_manager::UserManager::Get()->NotifyUserRemoved( account_id, user_manager::UserRemovalReason::DEVICE_EPHEMERAL_USERS_ENABLED); + + prefs_users_update->EraseValue(base::Value(account_id.GetUserEmail())); changed = true; - } else if (user->GetType() != user_manager::USER_TYPE_PUBLIC_ACCOUNT) { - prefs_users_update->Append(account_id.GetUserEmail()); } } }
diff --git a/chrome/browser/ash/login/users/user_manager_unittest.cc b/chrome/browser/ash/login/users/user_manager_unittest.cc index 750f05a9..6b51f9f 100644 --- a/chrome/browser/ash/login/users/user_manager_unittest.cc +++ b/chrome/browser/ash/login/users/user_manager_unittest.cc
@@ -5,6 +5,7 @@ #include <cstdlib> #include <cstring> #include <memory> +#include <string> #include <utility> #include <vector> @@ -54,21 +55,23 @@ namespace { -const AccountId kOwnerAccountId = - AccountId::FromUserEmailGaiaId("owner@example.com", "1234567890"); -const AccountId kAccountId0 = - AccountId::FromUserEmailGaiaId("user0@example.com", "0123456789"); -const AccountId kAccountId1 = - AccountId::FromUserEmailGaiaId("user1@example.com", "9012345678"); - -constexpr char kDeviceLocalAccountId[] = "device_local_account"; - AccountId CreateDeviceLocalAccountId(const std::string& account_id, policy::DeviceLocalAccount::Type type) { return AccountId::FromUserEmail( policy::GenerateDeviceLocalAccountUserId(account_id, type)); } +constexpr char kDeviceLocalAccountId[] = "device_local_account"; + +const AccountId kOwnerAccountId = + AccountId::FromUserEmailGaiaId("owner@example.com", "1234567890"); +const AccountId kAccountId0 = + AccountId::FromUserEmailGaiaId("user0@example.com", "0123456789"); +const AccountId kAccountId1 = + AccountId::FromUserEmailGaiaId("user1@example.com", "9012345678"); +const AccountId kKioskAccountId = + CreateDeviceLocalAccountId(kDeviceLocalAccountId, + policy::DeviceLocalAccount::TYPE_KIOSK_APP); } // namespace class UserManagerObserverTest : public user_manager::UserManager::Observer { @@ -216,10 +219,9 @@ settings_helper_.SetString(kDeviceOwner, owner); } - void SetDeviceLocalKioskAppAccount( - const std::string& account_id, - const std::string& kiosk_app_id, - policy::DeviceLocalAccount::EphemeralMode ephemeral_mode) { + void SetKioskAccountPrefs( + policy::DeviceLocalAccount::EphemeralMode ephemeral_mode, + const std::string& account_id = kDeviceLocalAccountId) { settings_helper_.Set( kAccountsPrefDeviceLocalAccounts, base::Value(base::Value::List().Append( @@ -230,8 +232,7 @@ policy::DeviceLocalAccount::TYPE_KIOSK_APP)) .Set(kAccountsPrefDeviceLocalAccountsKeyEphemeralMode, static_cast<int>(ephemeral_mode)) - .Set(kAccountsPrefDeviceLocalAccountsKeyKioskAppId, - kiosk_app_id)))); + .Set(kAccountsPrefDeviceLocalAccountsKeyKioskAppId, "")))); } // Should be used to setup device local accounts of `TYPE_PUBLIC_SESSION` and @@ -411,92 +412,101 @@ // `IsEphemeralAccountId(account_id)` function. TEST_F(UserManagerTest, IsEphemeralAccountIdRespectsFollowDeviceWidePolicyEphemeralMode) { - const AccountId account_id = CreateDeviceLocalAccountId( - kDeviceLocalAccountId, policy::DeviceLocalAccount::TYPE_KIOSK_APP); - - EXPECT_FALSE(IsEphemeralAccountId(account_id)); + EXPECT_FALSE(IsEphemeralAccountId(kKioskAccountId)); SetDeviceSettings( /* ephemeral_users_enabled= */ true, /* owner= */ kOwnerAccountId.GetUserEmail()); - SetDeviceLocalKioskAppAccount( - kDeviceLocalAccountId, "", + SetKioskAccountPrefs( policy::DeviceLocalAccount::EphemeralMode::kFollowDeviceWidePolicy); RetrieveTrustedDevicePolicies(); - EXPECT_TRUE(IsEphemeralAccountId(account_id)); + EXPECT_TRUE(IsEphemeralAccountId(kKioskAccountId)); SetDeviceSettings( /* ephemeral_users_enabled= */ false, /* owner= */ kOwnerAccountId.GetUserEmail()); RetrieveTrustedDevicePolicies(); - EXPECT_FALSE(IsEphemeralAccountId(account_id)); + EXPECT_FALSE(IsEphemeralAccountId(kKioskAccountId)); } // Tests that `UserManager` correctly parses device-local accounts with // ephemeral mode equals to `kUnset` by calling // `IsEphemeralAccountId(account_id)` function. TEST_F(UserManagerTest, IsEphemeralAccountIdRespectsUnsetEphemeralMode) { - const AccountId account_id = CreateDeviceLocalAccountId( - kDeviceLocalAccountId, policy::DeviceLocalAccount::TYPE_KIOSK_APP); - - EXPECT_FALSE(IsEphemeralAccountId(account_id)); + EXPECT_FALSE(IsEphemeralAccountId(kKioskAccountId)); SetDeviceSettings( /* ephemeral_users_enabled= */ true, /* owner= */ kOwnerAccountId.GetUserEmail()); - SetDeviceLocalKioskAppAccount( - kDeviceLocalAccountId, "", - policy::DeviceLocalAccount::EphemeralMode::kUnset); + SetKioskAccountPrefs(policy::DeviceLocalAccount::EphemeralMode::kUnset); RetrieveTrustedDevicePolicies(); - EXPECT_TRUE(IsEphemeralAccountId(account_id)); + EXPECT_TRUE(IsEphemeralAccountId(kKioskAccountId)); SetDeviceSettings( /* ephemeral_users_enabled= */ false, /* owner= */ kOwnerAccountId.GetUserEmail()); RetrieveTrustedDevicePolicies(); - EXPECT_FALSE(IsEphemeralAccountId(account_id)); + EXPECT_FALSE(IsEphemeralAccountId(kKioskAccountId)); } // Tests that `UserManager` correctly parses device-local accounts with // ephemeral mode equals to `kDisable` by calling // `IsEphemeralAccountId(account_id)` function. TEST_F(UserManagerTest, IsEphemeralAccountIdRespectsDisableEphemeralMode) { - const AccountId account_id = CreateDeviceLocalAccountId( - kDeviceLocalAccountId, policy::DeviceLocalAccount::TYPE_KIOSK_APP); - - EXPECT_FALSE(IsEphemeralAccountId(account_id)); + EXPECT_FALSE(IsEphemeralAccountId(kKioskAccountId)); SetDeviceSettings( /* ephemeral_users_enabled= */ true, /* owner= */ kOwnerAccountId.GetUserEmail()); - SetDeviceLocalKioskAppAccount( - kDeviceLocalAccountId, "", - policy::DeviceLocalAccount::EphemeralMode::kDisable); + SetKioskAccountPrefs(policy::DeviceLocalAccount::EphemeralMode::kDisable); RetrieveTrustedDevicePolicies(); EXPECT_TRUE(IsEphemeralAccountId(EmptyAccountId())); - EXPECT_FALSE(IsEphemeralAccountId(account_id)); + EXPECT_FALSE(IsEphemeralAccountId(kKioskAccountId)); } // Tests that `UserManager` correctly parses device-local accounts with // ephemeral mode equals to `kEnable` by calling // `IsEphemeralAccountId(account_id)` function. -TEST_F(UserManagerTest, IsEphemeralAccountIdRespectssEnableEphemeralMode) { - const AccountId account_id = CreateDeviceLocalAccountId( - kDeviceLocalAccountId, policy::DeviceLocalAccount::TYPE_KIOSK_APP); - - EXPECT_FALSE(IsEphemeralAccountId(account_id)); +TEST_F(UserManagerTest, IsEphemeralAccountIdRespectsEnableEphemeralMode) { + EXPECT_FALSE(IsEphemeralAccountId(kKioskAccountId)); SetDeviceSettings( /* ephemeral_users_enabled= */ false, /* owner= */ kOwnerAccountId.GetUserEmail()); - SetDeviceLocalKioskAppAccount( - kDeviceLocalAccountId, "", - policy::DeviceLocalAccount::EphemeralMode::kEnable); + SetKioskAccountPrefs(policy::DeviceLocalAccount::EphemeralMode::kEnable); RetrieveTrustedDevicePolicies(); EXPECT_FALSE(IsEphemeralAccountId(EmptyAccountId())); - EXPECT_TRUE(IsEphemeralAccountId(account_id)); + EXPECT_TRUE(IsEphemeralAccountId(kKioskAccountId)); +} + +// This test covers b/293320330. +// User manager should contain kiosk account, but `kRegularUsersPref` local +// state should not have kiosk account. +TEST_F(UserManagerTest, DoNotSaveKioskAccountsToKRegularUsersPref) { + SetKioskAccountPrefs(policy::DeviceLocalAccount::EphemeralMode::kEnable); + user_manager::UserManager::Get()->UserLoggedIn( + kKioskAccountId, kKioskAccountId.GetUserEmail(), + false /* browser_restart */, false /* is_child */); + ResetUserManager(); + user_manager::UserManager::Get()->UserLoggedIn( + kAccountId0, kAccountId0.GetUserEmail(), false /* browser_restart */, + false /* is_child */); + ResetUserManager(); + + EXPECT_EQ( + 1U, local_state_->Get()->GetList(user_manager::kRegularUsersPref).size()); + EXPECT_EQ(2U, user_manager::UserManager::Get()->GetUsers().size()); + + SetDeviceSettings( + /* ephemeral_users_enabled= */ true, + /* owner= */ kOwnerAccountId.GetUserEmail()); + RetrieveTrustedDevicePolicies(); + + EXPECT_TRUE( + local_state_->Get()->GetList(user_manager::kRegularUsersPref).empty()); + EXPECT_EQ(1U, user_manager::UserManager::Get()->GetUsers().size()); } TEST_F(UserManagerTest, RemoveUser) { @@ -559,7 +569,7 @@ EXPECT_EQ(1U, user_manager->GetUsers().size()); } -TEST_F(UserManagerTest, RemoveAllExceptOwnerFromList) { +TEST_F(UserManagerTest, RemoveRegularUsersExceptOwnerFromList) { // System salt is needed to remove user wallpaper. SystemSaltGetter::Initialize(); SystemSaltGetter::Get()->SetRawSaltForTesting( @@ -578,12 +588,19 @@ false /* is_child */); ResetUserManager(); + SetKioskAccountPrefs(policy::DeviceLocalAccount::EphemeralMode::kEnable); + user_manager::UserManager::Get()->UserLoggedIn( + kKioskAccountId, kKioskAccountId.GetUserEmail(), + false /* browser_restart */, false /* is_child */); + ResetUserManager(); + const user_manager::UserList* users = &user_manager::UserManager::Get()->GetUsers(); - ASSERT_EQ(3U, users->size()); - EXPECT_EQ((*users)[0]->GetAccountId(), kAccountId1); - EXPECT_EQ((*users)[1]->GetAccountId(), kAccountId0); - EXPECT_EQ((*users)[2]->GetAccountId(), kOwnerAccountId); + ASSERT_EQ(4U, users->size()); + EXPECT_EQ((*users)[0]->GetAccountId(), kKioskAccountId); + EXPECT_EQ((*users)[1]->GetAccountId(), kAccountId1); + EXPECT_EQ((*users)[2]->GetAccountId(), kAccountId0); + EXPECT_EQ((*users)[3]->GetAccountId(), kOwnerAccountId); test_wallpaper_controller_.ClearCounts(); SetDeviceSettings( @@ -592,8 +609,10 @@ RetrieveTrustedDevicePolicies(); users = &user_manager::UserManager::Get()->GetUsers(); - EXPECT_EQ(1U, users->size()); - EXPECT_EQ((*users)[0]->GetAccountId(), kOwnerAccountId); + EXPECT_EQ(2U, users->size()); + // Kiosk is not a regular user and is not removed. + EXPECT_EQ((*users)[0]->GetAccountId(), kKioskAccountId); + EXPECT_EQ((*users)[1]->GetAccountId(), kOwnerAccountId); // Verify that the wallpaper is removed when user is removed. EXPECT_EQ(2, test_wallpaper_controller_.remove_user_wallpaper_count()); }
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc index 26ac751..d02c1e5 100644 --- a/chrome/browser/ash/login/wizard_controller.cc +++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -910,7 +910,7 @@ weak_factory_.GetWeakPtr()))); } - if (features::IsPasswordSelectionEnabledInOobe()) { + if (features::IsPasswordlessGaiaEnabledForConsumers()) { append(std::make_unique<PasswordSelectionScreen>( oobe_ui->GetView<PasswordSelectionScreenHandler>()->AsWeakPtr(), base::BindRepeating(&WizardController::OnPasswordSelectionScreenExit, @@ -2190,7 +2190,7 @@ CryptohomeRecoverySetupScreen::Result result) { OnScreenExit(CryptohomeRecoverySetupScreenView::kScreenId, CryptohomeRecoverySetupScreen::GetResultString(result)); - if (ash::features::IsPasswordSelectionEnabledInOobe()) { + if (ash::features::IsPasswordlessGaiaEnabledForConsumers()) { ShowPasswordSelectionScreen(); } else { ShowFingerprintSetupScreen();
diff --git a/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job_browsertest.cc b/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job_browsertest.cc index faa186e..85781a17 100644 --- a/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job_browsertest.cc +++ b/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job_browsertest.cc
@@ -15,14 +15,26 @@ namespace { +// Use a number larger than int32 to catch truncation errors. +const int64_t kInitialCommandId = (1LL << 35) + 1; + // Tests sending remote commands and verifying the results. class DeviceCommandSetVolumeBrowserTest : public DevicePolicyCrosBrowserTest { protected: + void SetUpInProcessBrowserTestFixture() override { + DevicePolicyCrosBrowserTest::SetUpInProcessBrowserTestFixture(); + remote_commands_service_mixin_.SetCurrentIdForTesting(kInitialCommandId); + } + em::RemoteCommandResult SendRemoteCommand( const enterprise_management::RemoteCommand& command) { return remote_commands_service_mixin_.SendRemoteCommand(command); } + void SetInitialCommandId(int64_t id) { + remote_commands_service_mixin_.SetCurrentIdForTesting(id); + } + private: ash::EmbeddedPolicyTestServerMixin policy_test_server_mixin_{&mixin_host_}; RemoteCommandsServiceMixin remote_commands_service_mixin_{ @@ -43,6 +55,7 @@ IN_PROC_BROWSER_TEST_F(DeviceCommandSetVolumeBrowserTest, ShouldWorkWith64BitCommandIds) { + SetInitialCommandId(112233445566778899LL); em::RemoteCommandResult result = SendRemoteCommand(RemoteCommandBuilder() .SetType(em::RemoteCommand::DEVICE_SET_VOLUME)
diff --git a/chrome/browser/ash/policy/reporting/os_updates/os_updates_reporter_browsertest.cc b/chrome/browser/ash/policy/reporting/os_updates/os_updates_reporter_browsertest.cc index 1424a014..5da8876 100644 --- a/chrome/browser/ash/policy/reporting/os_updates/os_updates_reporter_browsertest.cc +++ b/chrome/browser/ash/policy/reporting/os_updates/os_updates_reporter_browsertest.cc
@@ -49,7 +49,6 @@ constexpr char kTestUserEmail[] = "test@example.com"; constexpr char kTestAffiliationId[] = "test_affiliation_id"; constexpr char kNewPlatformVersion[] = "1235.0.0"; -constexpr int kCommandId = 1; static const AccountId kTestAccountId = AccountId::FromUserEmailGaiaId( kTestUserEmail, signin::GetTestGaiaIdForEmail(kTestUserEmail)); @@ -234,8 +233,8 @@ return result; } - void AddPendingRemoteCommand(const em::RemoteCommand& command) { - policy_test_server_mixin_.server() + int64_t AddPendingRemoteCommand(em::RemoteCommand& command) { + return policy_test_server_mixin_.server() ->remote_commands_state() ->AddPendingRemoteCommand(command); } @@ -253,12 +252,11 @@ em::RemoteCommand command; command.set_type(em::RemoteCommand_Type_DEVICE_REMOTE_POWERWASH); - command.set_command_id(kCommandId); - AddPendingRemoteCommand(command); + int64_t command_id = AddPendingRemoteCommand(command); InitializePolicyManager(); TriggerRemoteCommandsFetch(); - em::RemoteCommandResult result = WaitForResult(kCommandId); + em::RemoteCommandResult result = WaitForResult(command_id); EXPECT_EQ(result.result(), em::RemoteCommandResult_ResultType_RESULT_SUCCESS); const Record& update_record = GetNextOsEventsRecord(&observer);
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc index e5d508e..b1e2ec2 100644 --- a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc +++ b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
@@ -3043,7 +3043,7 @@ em::DisplayInfo* display_info = fakeGraphicsStatus.add_displays(); display_info->set_resolution_width(1920 * i); display_info->set_resolution_height(1080 * i); - display_info->set_refresh_rate(60 * i); + display_info->set_refresh_rate(60.0f * i); display_info->set_is_internal(i == 1); }
diff --git a/chrome/browser/ash/policy/test_support/remote_commands_service_mixin.cc b/chrome/browser/ash/policy/test_support/remote_commands_service_mixin.cc index f69fbc7..48b2298 100644 --- a/chrome/browser/ash/policy/test_support/remote_commands_service_mixin.cc +++ b/chrome/browser/ash/policy/test_support/remote_commands_service_mixin.cc
@@ -31,14 +31,14 @@ enterprise_management::RemoteCommandResult RemoteCommandsServiceMixin::SendRemoteCommand( const enterprise_management::RemoteCommand& command) { - AddPendingRemoteCommand(command); + int64_t command_id = AddPendingRemoteCommand(command); SendDeviceRemoteCommandsRequest(); - return WaitForResult(command.command_id()); + return WaitForResult(command_id); } -void RemoteCommandsServiceMixin::AddPendingRemoteCommand( +int64_t RemoteCommandsServiceMixin::AddPendingRemoteCommand( const enterprise_management::RemoteCommand& command) { - remote_commands_state().AddPendingRemoteCommand(command); + return remote_commands_state().AddPendingRemoteCommand(command); } void RemoteCommandsServiceMixin::SendDeviceRemoteCommandsRequest() { @@ -51,6 +51,11 @@ .WaitAndGetResult(); } +void RemoteCommandsServiceMixin::WaitForAcked(int64_t command_id) { + return RemoteCommandsResultWaiter(&remote_commands_state(), command_id) + .WaitAndGetAck(); +} + RemoteCommandsService& RemoteCommandsServiceMixin::remote_commands_service() { DeviceCloudPolicyManagerAsh& policy_manager = CHECK_DEREF(g_browser_process->platform_part() @@ -65,4 +70,8 @@ policy_test_server_mixin_->server()->remote_commands_state()); } +void RemoteCommandsServiceMixin::SetCurrentIdForTesting(int64_t id) { + remote_commands_state().SetCurrentIdForTesting(id); +} + } // namespace policy
diff --git a/chrome/browser/ash/policy/test_support/remote_commands_service_mixin.h b/chrome/browser/ash/policy/test_support/remote_commands_service_mixin.h index 32df39f..17803dfc 100644 --- a/chrome/browser/ash/policy/test_support/remote_commands_service_mixin.h +++ b/chrome/browser/ash/policy/test_support/remote_commands_service_mixin.h
@@ -33,6 +33,14 @@ delete; ~RemoteCommandsServiceMixin() override; + // Sets the initial command id with the given id, the next commands ids will + // be incrementally increasing by 1. + // Note fake_dmserver's implementation of "acknowledging" remote commands + // relies on the id strictly increasing, if this is called with an id which is + // lower than a previously issued remote command, fake_dmserver will miss some + // ack messages. + void SetCurrentIdForTesting(int64_t id); + // Sends the given remote command to the `RemoteCommandsService` and returns // the execution result. enterprise_management::RemoteCommandResult SendRemoteCommand( @@ -41,20 +49,31 @@ // Adds a pending remote command. These will be sent to the // `RemoteCommandsService` the next time it fetches remote commands, which // your test can trigger by calling `SendDeviceRemoteCommandsRequest()`. - void AddPendingRemoteCommand( + // This function assigns a `command_id` and discards any `command_id` that is + // present in the passed `command`. If a specific `command_id` is required + // then use `SetCurrentIdForTesting()` to set the initial id. Returns the + // assigned `command_id`. + int64_t AddPendingRemoteCommand( const enterprise_management::RemoteCommand& command); // Sends all pending remote commands to the `RemoteCommandsService`, causing // it to execute these remote commands asynchronously. void SendDeviceRemoteCommandsRequest(); - // Waits until the remote command with the given command_id` has been + // Waits until the remote command with the given `command_id` has been // executed. // Note that your test is responsible to ensure the `RemoteCommandsService` // fetches and executes this remote command, which you can do by calling // `SendDeviceRemoteCommandsRequest()` prior to calling this. enterprise_management::RemoteCommandResult WaitForResult(int64_t command_id); + // Waits until the remote command with the given `command_id` has been + // acknowledged. + // Note that your test is responsible to ensure the `RemoteCommandsService` + // fetches and executes this remote command, which you can do by calling + // `SendDeviceRemoteCommandsRequest()` prior to calling this. + void WaitForAcked(int64_t command_id); + private: RemoteCommandsService& remote_commands_service(); RemoteCommandsState& remote_commands_state();
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index c01408c..54053df 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -5610,6 +5610,8 @@ hash_realtime_selection = safe_browsing::hash_realtime_utils::DetermineHashRealTimeSelection( profile->IsOffTheRecord(), profile->GetPrefs(), + safe_browsing::hash_realtime_utils::GetCountryCode( + g_browser_process->variations_service()), /*log_usage_histograms=*/true); return safe_browsing::BrowserURLLoaderThrottle::Create(
diff --git a/chrome/browser/enterprise/connectors/connectors_service.cc b/chrome/browser/enterprise/connectors/connectors_service.cc index 30303664..201399ab 100644 --- a/chrome/browser/enterprise/connectors/connectors_service.cc +++ b/chrome/browser/enterprise/connectors/connectors_service.cc
@@ -500,9 +500,10 @@ #if !BUILDFLAG(IS_CHROMEOS_ASH) absl::optional<ConnectorsService::DmToken> ConnectorsService::GetProfileDmToken() const { - if (!CanUseProfileDmToken()) + if (!base::FeatureList::IsEnabled(kEnableRelaxedAffiliationCheck) && + !CanUseProfileDmToken()) { return absl::nullopt; - + } Profile* profile = Profile::FromBrowserContext(context_); policy::UserCloudPolicyManager* policy_manager =
diff --git a/chrome/browser/enterprise/connectors/connectors_service_browsertest.cc b/chrome/browser/enterprise/connectors/connectors_service_browsertest.cc index 0890359..7ba7ae6 100644 --- a/chrome/browser/enterprise/connectors/connectors_service_browsertest.cc +++ b/chrome/browser/enterprise/connectors/connectors_service_browsertest.cc
@@ -297,11 +297,19 @@ class ConnectorsServiceReportingProfileBrowserTest : public ConnectorsServiceProfileBrowserTest, public testing::WithParamInterface< - std::tuple<ReportingConnector, ManagementStatus>> { + std::tuple<ReportingConnector, ManagementStatus, bool>> { public: ConnectorsServiceReportingProfileBrowserTest() - : ConnectorsServiceProfileBrowserTest(std::get<1>(GetParam())) {} + : ConnectorsServiceProfileBrowserTest(std::get<1>(GetParam())) { + if (enable_relaxed_affiliation()) { + scoped_feature_list_.InitAndEnableFeature(kEnableRelaxedAffiliationCheck); + } else { + scoped_feature_list_.InitAndDisableFeature( + kEnableRelaxedAffiliationCheck); + } + } ReportingConnector connector() { return std::get<0>(GetParam()); } + bool enable_relaxed_affiliation() { return std::get<2>(GetParam()); } }; INSTANTIATE_TEST_SUITE_P( @@ -310,7 +318,8 @@ testing::Combine(testing::Values(ReportingConnector::SECURITY_EVENT), testing::Values(ManagementStatus::AFFILIATED, ManagementStatus::UNAFFILIATED, - ManagementStatus::UNMANAGED))); + ManagementStatus::UNMANAGED), + testing::Bool())); IN_PROC_BROWSER_TEST_P(ConnectorsServiceReportingProfileBrowserTest, Test) { SetPrefs(ConnectorPref(connector()), ConnectorScopePref(connector()), @@ -333,8 +342,15 @@ ->GetManagementDomain(); switch (management_status()) { case ManagementStatus::UNAFFILIATED: - EXPECT_FALSE(settings.has_value()); - ASSERT_TRUE(management_domain.empty()); + if (enable_relaxed_affiliation()) { + EXPECT_TRUE(settings.has_value()); + ASSERT_EQ(kFakeProfileDMToken, settings.value().dm_token); + ASSERT_TRUE(settings.value().per_profile); + ASSERT_EQ(kDomain1, management_domain); + } else { + EXPECT_FALSE(settings.has_value()); + ASSERT_TRUE(management_domain.empty()); + } break; case ManagementStatus::AFFILIATED: EXPECT_TRUE(settings.has_value()); @@ -354,18 +370,27 @@ class ConnectorsServiceAnalysisProfileBrowserTest : public ConnectorsServiceProfileBrowserTest, - public testing::WithParamInterface< - std::tuple<AnalysisConnector, ManagementStatus, const char*, bool>> { + public testing::WithParamInterface<std::tuple<AnalysisConnector, + ManagementStatus, + const char*, + bool, + bool>> { public: ConnectorsServiceAnalysisProfileBrowserTest() : ConnectorsServiceProfileBrowserTest(std::get<1>(GetParam())) { + std::vector<base::test::FeatureRef> enabled_features; + std::vector<base::test::FeatureRef> disabled_features; if (enterprise_connectors_enabled_on_mgs()) { - scoped_feature_list_.InitWithFeatures({kEnterpriseConnectorsEnabledOnMGS}, - {}); + enabled_features.push_back(kEnterpriseConnectorsEnabledOnMGS); } else { - scoped_feature_list_.InitWithFeatures( - {}, {kEnterpriseConnectorsEnabledOnMGS}); + disabled_features.push_back(kEnterpriseConnectorsEnabledOnMGS); } + if (enable_relaxed_affiliation()) { + enabled_features.push_back(kEnableRelaxedAffiliationCheck); + } else { + disabled_features.push_back(kEnableRelaxedAffiliationCheck); + } + scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); } AnalysisConnector connector() { return std::get<0>(GetParam()); } const char* settings_value() { return std::get<2>(GetParam()); } @@ -376,6 +401,8 @@ return std::get<3>(GetParam()); } + bool enable_relaxed_affiliation() { return std::get<4>(GetParam()); } + bool is_cloud() { return strcmp(settings_value(), kNormalCloudAnalysisSettingsPref) == 0; } @@ -522,6 +549,7 @@ ManagementStatus::UNMANAGED), testing::Values(kNormalCloudAnalysisSettingsPref, kNormalLocalAnalysisSettingsPref), + testing::Bool(), testing::Bool())); IN_PROC_BROWSER_TEST_P(ConnectorsServiceAnalysisProfileBrowserTest, @@ -622,10 +650,23 @@ ASSERT_EQ("path_user", settings.value().cloud_or_local_settings.local_path()); ASSERT_TRUE(settings.value().cloud_or_local_settings.user_specific()); + ASSERT_NE(management_domain.empty(), enable_relaxed_affiliation()); } else { - ASSERT_FALSE(settings.has_value()); + if (enable_relaxed_affiliation()) { + EXPECT_TRUE(settings.has_value()); + ASSERT_TRUE( + settings.value().cloud_or_local_settings.is_cloud_analysis()); + ASSERT_EQ(kFakeProfileDMToken, + settings.value().cloud_or_local_settings.dm_token()); + ValidateClientMetadata(*settings.value().client_metadata, is_cloud(), + /*profile_reporting*/ true); + ASSERT_TRUE(settings.value().per_profile); + ASSERT_EQ(kDomain1, management_domain); + } else { + ASSERT_TRUE(management_domain.empty()); + ASSERT_FALSE(settings.has_value()); + } } - ASSERT_TRUE(management_domain.empty()); break; case ManagementStatus::AFFILIATED: EXPECT_TRUE(settings.has_value()); @@ -704,10 +745,23 @@ ASSERT_EQ("path_user", settings.value().cloud_or_local_settings.local_path()); ASSERT_TRUE(settings.value().cloud_or_local_settings.user_specific()); + ASSERT_NE(management_domain.empty(), enable_relaxed_affiliation()); } else { - ASSERT_FALSE(settings.has_value()); + if (enable_relaxed_affiliation()) { + EXPECT_TRUE(settings.has_value()); + ASSERT_EQ(kFakeProfileDMToken, + settings.value().cloud_or_local_settings.dm_token()); + if (enterprise_connectors_enabled_on_mgs()) { + ASSERT_FALSE(ContainsClientId(settings.value())); + } else { + ASSERT_FALSE(settings.value().client_metadata); + } + ASSERT_EQ(management_domain, kDomain1); + } else { + ASSERT_FALSE(settings.has_value()); + ASSERT_TRUE(management_domain.empty()); + } } - ASSERT_TRUE(management_domain.empty()); break; case ManagementStatus::AFFILIATED: EXPECT_TRUE(settings.has_value()); @@ -751,6 +805,8 @@ #endif } +// TODO(b/302576851): Consider removing after EnableRelaxedAffiliationCheck +// is cleaned up. IN_PROC_BROWSER_TEST_P(ConnectorsServiceAnalysisProfileBrowserTest, Affiliation) { SetPrefs(ConnectorPref(connector()), ConnectorScopePref(connector()), @@ -788,7 +844,22 @@ #else switch (management_status()) { case ManagementStatus::UNAFFILIATED: - ASSERT_FALSE(settings.has_value()); + if (enable_relaxed_affiliation()) { + // Same as ManagementStatus::AFFILIATED + EXPECT_TRUE(settings.has_value()); + ASSERT_TRUE( + settings.value().cloud_or_local_settings.is_cloud_analysis()); + ASSERT_EQ(kFakeProfileDMToken, + settings.value().cloud_or_local_settings.dm_token()); + if (enterprise_connectors_enabled_on_mgs()) { + ASSERT_FALSE(ContainsClientId(settings.value())); + } else { + ASSERT_FALSE(settings.value().client_metadata); + } + ASSERT_TRUE(settings.value().per_profile); + } else { + ASSERT_FALSE(settings.has_value()); + } break; case ManagementStatus::AFFILIATED: EXPECT_TRUE(settings.has_value());
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl.cc index d67e97db..9fa63c5 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl.cc +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl.cc
@@ -13,6 +13,7 @@ #include "base/task/thread_pool.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_rotation_launcher.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/key_persistence_delegate.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/signing_key_pair.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/signing_key_util.h" #include "crypto/unexportable_key.h" @@ -84,6 +85,21 @@ } } +// Given the `result` from a LoadKey operation, determine whether key creation +// should be kicked-off or not. +bool ShouldTriggerKeyCreation(LoadPersistedKeyResult result) { + switch (result) { + // On Success, don't try to create a new key. + case LoadPersistedKeyResult::kSuccess: + // Unknown failures are treated as retriable. + case LoadPersistedKeyResult::kUnknown: + return false; + case LoadPersistedKeyResult::kNotFound: + case LoadPersistedKeyResult::kMalformedKey: + return true; + } +} + } // namespace DeviceTrustKeyManagerImpl::DeviceTrustKeyManagerImpl( @@ -241,18 +257,18 @@ void DeviceTrustKeyManagerImpl::OnKeyLoaded( bool create_on_fail, - KeyLoader::DTCLoadKeyResult result) { + KeyLoader::DTCLoadKeyResult load_key_result) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - sync_key_response_code_ = result.status_code; - if (result.key_pair && !result.key_pair->is_empty()) { - key_pair_ = std::move(result.key_pair); + sync_key_response_code_ = load_key_result.status_code; + if (load_key_result.key_pair && !load_key_result.key_pair->is_empty()) { + key_pair_ = std::move(load_key_result.key_pair); } else { key_pair_.reset(); } state_ = InitializationState::kDefault; - LogKeyLoadingResult(GetLoadedKeyMetadata()); + LogKeyLoadingResult(GetLoadedKeyMetadata(), load_key_result.result); // Do this check after caching the previous key as failure to rotate will // restore it in persistence. @@ -264,7 +280,8 @@ return; } - if (!IsFullyInitialized() && create_on_fail) { + if (!IsFullyInitialized() && create_on_fail && + ShouldTriggerKeyCreation(load_key_result.result)) { // Key loading failed, so we can kick-off the key creation. This is // guarded by a flag to make sure not to loop infinitely over: // create succeeds -> load fails -> create again...
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl_unittest.cc index a64aad3..07b293d 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl_unittest.cc +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl_unittest.cc
@@ -17,6 +17,7 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" #include "base/test/test_future.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_rotation_launcher.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/mock_key_loader.h" @@ -45,7 +46,6 @@ namespace { constexpr int kSuccessUploadCode = 200; -constexpr int kUnsuccessfulUploadCode = 400; constexpr char kFakeNonce[] = "fake nonce"; constexpr char kOtherFakeNonce[] = "other fake nonce"; @@ -79,7 +79,7 @@ scoped_refptr<SigningKeyPair> test_key_pair() { return test_key_pair_; } - void SetUpKeyLoadAndSyncWithSideAffect(base::RepeatingClosure& side_effect) { + void SetUpKeyLoadAndSyncWithSideEffect(base::RepeatingClosure& side_effect) { EXPECT_CALL(*mock_loader_, LoadKey(_)) .WillRepeatedly( Invoke([side_effect, this](KeyLoader::LoadKeyCallback callback) { @@ -89,12 +89,22 @@ })); } - void SetUpKeyLoadAndSync(int status_code, - scoped_refptr<SigningKeyPair> key_pair) { + void SetUpKeyLoadAndSyncWithSideEffect( + const DTCLoadKeyResult& load_key_result, + base::RepeatingClosure& side_effect) { EXPECT_CALL(*mock_loader_, LoadKey(_)) - .WillRepeatedly(Invoke( - [status_code, key_pair](KeyLoader::LoadKeyCallback callback) { - std::move(callback).Run(DTCLoadKeyResult(status_code, key_pair)); + .WillRepeatedly(Invoke([side_effect, load_key_result]( + KeyLoader::LoadKeyCallback callback) { + side_effect.Run(); + std::move(callback).Run(load_key_result); + })); + } + + void SetUpKeyLoadAndSync(const DTCLoadKeyResult& load_key_result) { + EXPECT_CALL(*mock_loader_, LoadKey(_)) + .WillRepeatedly( + Invoke([load_key_result](KeyLoader::LoadKeyCallback callback) { + std::move(callback).Run(load_key_result); })); } @@ -122,7 +132,7 @@ } void InitializeWithKey() { - SetUpKeyLoadAndSync(kSuccessUploadCode, test_key_pair_); + SetUpKeyLoadAndSync(DTCLoadKeyResult(kSuccessUploadCode, test_key_pair_)); key_manager_->StartInitialization(); @@ -219,7 +229,7 @@ // - Then a client request gets replied successfully. TEST_F(DeviceTrustKeyManagerImplTest, Initialization_InitialNull_CreatesKey_LoadKeySuccess) { - SetUpKeyLoadAndSync(kUnsuccessfulUploadCode, nullptr); + SetUpKeyLoadAndSync(DTCLoadKeyResult(LoadPersistedKeyResult::kNotFound)); base::RunLoop create_key_loop; KeyRotationCommand::Callback key_rotation_callback; EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(std::string(), _)) @@ -234,7 +244,7 @@ create_key_loop.Run(); // Mimic that the key is now loadable. - SetUpKeyLoadAndSync(kSuccessUploadCode, test_key_pair()); + SetUpKeyLoadAndSync(DTCLoadKeyResult(kSuccessUploadCode, test_key_pair())); ASSERT_FALSE(key_rotation_callback.is_null()); std::move(key_rotation_callback).Run(KeyRotationCommand::Status::SUCCEEDED); @@ -261,7 +271,10 @@ // - Then a client request gets replied successfully. TEST_F(DeviceTrustKeyManagerImplTest, Initialization_InitialKeyEmpty_CreatesKey_LoadKeySuccess) { - SetUpKeyLoadAndSync(kUnsuccessfulUploadCode, scoped_refptr<SigningKeyPair>()); + DTCLoadKeyResult load_key_result(LoadPersistedKeyResult::kNotFound); + load_key_result.key_pair = base::MakeRefCounted<SigningKeyPair>( + nullptr, BPKUR::KEY_TRUST_LEVEL_UNSPECIFIED); + SetUpKeyLoadAndSync(std::move(load_key_result)); base::RunLoop create_key_loop; KeyRotationCommand::Callback key_rotation_callback; @@ -277,7 +290,7 @@ create_key_loop.Run(); // Mimic that the key is now loadable. - SetUpKeyLoadAndSync(kSuccessUploadCode, test_key_pair()); + SetUpKeyLoadAndSync(DTCLoadKeyResult(kSuccessUploadCode, test_key_pair())); ASSERT_FALSE(key_rotation_callback.is_null()); std::move(key_rotation_callback).Run(KeyRotationCommand::Status::SUCCEEDED); @@ -306,7 +319,7 @@ // - Then a second client request makes the key load successfully. TEST_F(DeviceTrustKeyManagerImplTest, Initialization_CreatesKey_LoadKeyFail_Retry) { - SetUpKeyLoadAndSync(kUnsuccessfulUploadCode, nullptr); + SetUpKeyLoadAndSync(DTCLoadKeyResult(LoadPersistedKeyResult::kNotFound)); KeyRotationCommand::Callback key_rotation_callback; base::RunLoop create_key_loop; @@ -339,7 +352,7 @@ fail_loop.Run(); // Retry, but with a successful key loading this time. - SetUpKeyLoadAndSync(kSuccessUploadCode, test_key_pair()); + SetUpKeyLoadAndSync(DTCLoadKeyResult(kSuccessUploadCode, test_key_pair())); base::RunLoop success_loop; key_manager()->ExportPublicKeyAsync(base::BindLambdaForTesting( [&success_loop](absl::optional<std::string> value) { @@ -354,6 +367,57 @@ ExpectKeyCreatedMetrics(); } +struct LoadKeyResultTestCase { + LoadPersistedKeyResult result{}; + bool triggers_creation{}; +}; + +// Tests the various possible values of LoadPersistedKeyResult when no key was +// loaded and how they affect triggering key creation. +TEST_F(DeviceTrustKeyManagerImplTest, NoKey_LoadKeyResult_MayTriggerCreation) { + std::array<LoadKeyResultTestCase, 4> test_cases = { + LoadKeyResultTestCase{LoadPersistedKeyResult::kSuccess, + /*triggers_creation=*/false}, + LoadKeyResultTestCase{LoadPersistedKeyResult::kNotFound, + /*triggers_creation=*/true}, + LoadKeyResultTestCase{LoadPersistedKeyResult::kMalformedKey, + /*triggers_creation=*/true}, + LoadKeyResultTestCase{LoadPersistedKeyResult::kUnknown, + /*triggers_creation=*/false}}; + + for (const auto& test_case : test_cases) { + DTCLoadKeyResult load_key_result(test_case.result); + + base::RunLoop run_loop; + if (test_case.triggers_creation) { + SetUpKeyLoadAndSync(load_key_result); + EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(std::string(), _)) + .WillOnce(Invoke( + [&](const std::string& nonce, + KeyRotationCommand::Callback callback) { run_loop.Quit(); })); + } else { + base::RepeatingClosure side_effect = + base::BindLambdaForTesting([&run_loop, this]() { + key_manager()->ExportPublicKeyAsync(base::BindLambdaForTesting( + [&run_loop](absl::optional<std::string> value) { + EXPECT_FALSE(value); + run_loop.Quit(); + })); + }); + SetUpKeyLoadAndSyncWithSideEffect(load_key_result, side_effect); + + EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(std::string(), _)) + .Times(0); + } + + key_manager()->StartInitialization(); + + run_loop.Run(); + RunUntilIdle(); + ResetState(); + } +} + // Tests that: // - StartInitialization will trigger key creation if key loading was not // successful. @@ -363,7 +427,7 @@ // - Key loading succeeds, // - The client request gets fulfilled. TEST_F(DeviceTrustKeyManagerImplTest, Initialization_CreateFails_Retry) { - SetUpKeyLoadAndSync(kUnsuccessfulUploadCode, nullptr); + SetUpKeyLoadAndSync(DTCLoadKeyResult(LoadPersistedKeyResult::kNotFound)); KeyRotationCommand::Callback failed_rotation_callback; base::RunLoop create_key_fail_loop; @@ -413,7 +477,7 @@ // Make the key creation return a successful status and fake that a key is // loadable. - SetUpKeyLoadAndSync(kSuccessUploadCode, test_key_pair()); + SetUpKeyLoadAndSync(DTCLoadKeyResult(kSuccessUploadCode, test_key_pair())); ASSERT_FALSE(success_rotation_callback.is_null()); std::move(success_rotation_callback) .Run(KeyRotationCommand::Status::SUCCEEDED); @@ -445,7 +509,7 @@ // SignStringAsync). TEST_F(DeviceTrustKeyManagerImplTest, Initialization_CreatesKey_SubsequentConcurrentCalls) { - SetUpKeyLoadAndSync(kUnsuccessfulUploadCode, nullptr); + SetUpKeyLoadAndSync(DTCLoadKeyResult(LoadPersistedKeyResult::kNotFound)); KeyRotationCommand::Callback key_rotation_callback; base::RunLoop create_key_loop; @@ -499,7 +563,7 @@ key_manager()->SignStringAsync(kFakeData, sign_string_callback); // Prepare for another key load, but with a valid key this time. - SetUpKeyLoadAndSync(kSuccessUploadCode, test_key_pair()); + SetUpKeyLoadAndSync(DTCLoadKeyResult(kSuccessUploadCode, test_key_pair())); ASSERT_FALSE(key_rotation_callback.is_null()); std::move(key_rotation_callback).Run(KeyRotationCommand::Status::SUCCEEDED); RunUntilIdle(); @@ -881,7 +945,7 @@ // Setup so that a key is loadable, but a rotate request is received at the // same time as it is being loaded. - SetUpKeyLoadAndSyncWithSideAffect(start_rotate); + SetUpKeyLoadAndSyncWithSideEffect(start_rotate); // Starting initialization will start loading the key. key_manager()->StartInitialization(); @@ -890,7 +954,7 @@ // Make the key rotation return a successful status and fake that a key is // loadable. - SetUpKeyLoadAndSync(kSuccessUploadCode, test_key_pair()); + SetUpKeyLoadAndSync(DTCLoadKeyResult(kSuccessUploadCode, test_key_pair())); ASSERT_FALSE(rotation_callback.is_null()); std::move(rotation_callback).Run(KeyRotationCommand::Status::SUCCEEDED); RunUntilIdle(); @@ -932,7 +996,7 @@ // Setup so that a key is loadable, but a rotate request is received at the // same time as it is being loaded. - SetUpKeyLoadAndSyncWithSideAffect(start_rotate); + SetUpKeyLoadAndSyncWithSideEffect(start_rotate); // Starting initialization will start loading the key. key_manager()->StartInitialization(); @@ -982,7 +1046,7 @@ PermanentFailure::kInvalidInstallation}}; for (const auto& test_case : test_cases) { - SetUpKeyLoadAndSync(kUnsuccessfulUploadCode, nullptr); + SetUpKeyLoadAndSync(DTCLoadKeyResult(LoadPersistedKeyResult::kNotFound)); KeyRotationCommand::Callback failed_rotation_callback; base::RunLoop create_key_fail_loop; @@ -1038,7 +1102,7 @@ // concurrent rotation request was received. TEST_F(DeviceTrustKeyManagerImplTest, CreateKeyPermanentFailure_ConcurrentRotate) { - SetUpKeyLoadAndSync(kUnsuccessfulUploadCode, nullptr); + SetUpKeyLoadAndSync(DTCLoadKeyResult(LoadPersistedKeyResult::kNotFound)); base::RunLoop create_key_loop; KeyRotationCommand::Callback key_creation_callback;
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader.cc index 8b2135e..53c1f5d 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader.cc +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/check.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader_impl.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/network/mojo_key_network_delegate.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -17,19 +18,28 @@ KeyLoader::DTCLoadKeyResult::DTCLoadKeyResult( scoped_refptr<SigningKeyPair> key_pair) - : key_pair(key_pair), result(LoadPersistedKeyResult::kSuccess) {} + : key_pair(key_pair), result(LoadPersistedKeyResult::kSuccess) { + CHECK(key_pair); +} KeyLoader::DTCLoadKeyResult::DTCLoadKeyResult( int status_code, scoped_refptr<SigningKeyPair> key_pair) : status_code(status_code), key_pair(key_pair), - result(LoadPersistedKeyResult::kSuccess) {} + result(LoadPersistedKeyResult::kSuccess) { + CHECK(key_pair); +} KeyLoader::DTCLoadKeyResult::~DTCLoadKeyResult() = default; +KeyLoader::DTCLoadKeyResult::DTCLoadKeyResult(const DTCLoadKeyResult& other) = + default; KeyLoader::DTCLoadKeyResult::DTCLoadKeyResult(DTCLoadKeyResult&& other) = default; + +KeyLoader::DTCLoadKeyResult& KeyLoader::DTCLoadKeyResult::operator=( + const KeyLoader::DTCLoadKeyResult& other) = default; KeyLoader::DTCLoadKeyResult& KeyLoader::DTCLoadKeyResult::operator=( KeyLoader::DTCLoadKeyResult&& other) = default;
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader.h b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader.h index e776898..5c6b0655 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader.h +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader.h
@@ -41,10 +41,10 @@ ~DTCLoadKeyResult(); - DTCLoadKeyResult& operator=(const DTCLoadKeyResult& other) = delete; - DTCLoadKeyResult(const DTCLoadKeyResult& other) = delete; - + DTCLoadKeyResult(const DTCLoadKeyResult& other); DTCLoadKeyResult(DTCLoadKeyResult&&); + + DTCLoadKeyResult& operator=(const DTCLoadKeyResult& other); DTCLoadKeyResult& operator=(DTCLoadKeyResult&&); // HTTP response code from the key upload request.
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.cc index 023734b..2de64109 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.cc +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.cc
@@ -17,6 +17,8 @@ constexpr char kLoadedKeyTrustLevelHistogram[] = "Enterprise.DeviceTrust.Key.TrustLevel"; constexpr char kLoadedKeyTypeHistogram[] = "Enterprise.DeviceTrust.Key.Type"; +constexpr char kLoadPersistedKeyResultHistogram[] = + "Enterprise.DeviceTrust.Key.LoadPersistedKeyResult"; constexpr char kKeyCreationResultHistogram[] = "Enterprise.DeviceTrust.Key.CreationResult"; constexpr char kKeyRotationResultHistogram[] = @@ -81,7 +83,10 @@ } // namespace void LogKeyLoadingResult( - absl::optional<DeviceTrustKeyManager::KeyMetadata> key_metadata) { + absl::optional<DeviceTrustKeyManager::KeyMetadata> key_metadata, + LoadPersistedKeyResult result) { + base::UmaHistogramEnumeration(kLoadPersistedKeyResultHistogram, result); + if (!key_metadata.has_value()) { return; }
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.h b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.h index 2f58dfce..00cfdb20 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.h +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.h
@@ -7,6 +7,7 @@ #include "base/time/time.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/key_persistence_delegate.h" #include "components/enterprise/browser/device_trust/device_trust_key_manager.h" #include "components/policy/proto/device_management_backend.pb.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -59,9 +60,11 @@ }; // Logs the `key_metadata` trust level and type. If it is not defined -// (i.e. absl::nullopt), nothing is logged. +// (i.e. absl::nullopt), nothing is logged. Also logs the `result` enum +// value. void LogKeyLoadingResult( - absl::optional<DeviceTrustKeyManager::KeyMetadata> key_metadata); + absl::optional<DeviceTrustKeyManager::KeyMetadata> key_metadata, + LoadPersistedKeyResult result); // Logs the key rotation result based on the value of `status`. Also, if // `had_nonce` is false, it will be logged as a key creation flow.
diff --git a/chrome/browser/extensions/chrome_content_browser_client_extensions_part_bindings.cc b/chrome/browser/extensions/chrome_content_browser_client_extensions_part_bindings.cc index b58e0a7..8bdf01d 100644 --- a/chrome/browser/extensions/chrome_content_browser_client_extensions_part_bindings.cc +++ b/chrome/browser/extensions/chrome_content_browser_client_extensions_part_bindings.cc
@@ -32,8 +32,6 @@ &ExtensionsGuestView::CreateForExtensions, host->GetID())); associated_registry->AddInterface<mojom::RendererHost>(base::BindRepeating( &RendererStartupHelper::BindForRenderer, host->GetID())); - associated_registry->AddInterface<mojom::ServiceWorkerHost>( - base::BindRepeating(&ServiceWorkerHost::BindReceiver, host->GetID())); associated_registry ->AddInterface<extensions::mojom::RendererAutomationRegistry>( base::BindRepeating(&AutomationEventRouter::BindForRenderer, @@ -47,9 +45,18 @@ blink::AssociatedInterfaceRegistry& associated_registry) { CHECK(service_worker_version_info.process_id != content::ChildProcessHost::kInvalidUniqueID); + associated_registry.AddInterface<mojom::ServiceWorkerHost>( + base::BindRepeating(&ServiceWorkerHost::BindReceiver, + service_worker_version_info.process_id)); associated_registry.AddInterface<mojom::RendererHost>( base::BindRepeating(&RendererStartupHelper::BindForRenderer, service_worker_version_info.process_id)); + associated_registry + .AddInterface<extensions::mojom::RendererAutomationRegistry>( + base::BindRepeating(&AutomationEventRouter::BindForRenderer, + service_worker_version_info.process_id)); + associated_registry.AddInterface<mojom::EventRouter>(base::BindRepeating( + &EventRouter::BindForRenderer, service_worker_version_info.process_id)); } } // namespace extensions
diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc index cc2802df..7a184334 100644 --- a/chrome/browser/extensions/extension_management.cc +++ b/chrome/browser/extensions/extension_management.cc
@@ -472,6 +472,11 @@ return force_pinned_list; } +bool ExtensionManagement::IsFileUrlNavigationAllowed(const ExtensionId& id) { + auto* setting = GetSettingsForId(id); + return setting && setting->file_url_navigation_allowed; +} + bool ExtensionManagement::CheckMinimumVersion(const Extension* extension, std::string* required_version) { auto* setting = GetSettingsForId(extension->id());
diff --git a/chrome/browser/extensions/extension_management.h b/chrome/browser/extensions/extension_management.h index b568856..cf002121 100644 --- a/chrome/browser/extensions/extension_management.h +++ b/chrome/browser/extensions/extension_management.h
@@ -233,6 +233,9 @@ // aren't deferred). ExtensionIdSet GetForcePinnedList() const; + // Returns if an extension with |id| can navigate to file URLs. + bool IsFileUrlNavigationAllowed(const ExtensionId& id); + private: using SettingsIdMap = base::flat_map<ExtensionId,
diff --git a/chrome/browser/extensions/extension_management_constants.cc b/chrome/browser/extensions/extension_management_constants.cc index c8ef0fd..b319470 100644 --- a/chrome/browser/extensions/extension_management_constants.cc +++ b/chrome/browser/extensions/extension_management_constants.cc
@@ -42,6 +42,8 @@ const char kForcePinned[] = "force_pinned"; const char kDefaultUnpinned[] = "default_unpinned"; +const char kFileUrlNavigationAllowed[] = "file_url_navigation_allowed"; + const AllowedTypesMapEntry kAllowedTypesMap[] = { {"extension", Manifest::TYPE_EXTENSION}, {"theme", Manifest::TYPE_THEME},
diff --git a/chrome/browser/extensions/extension_management_constants.h b/chrome/browser/extensions/extension_management_constants.h index 8a6ce39..74e71947 100644 --- a/chrome/browser/extensions/extension_management_constants.h +++ b/chrome/browser/extensions/extension_management_constants.h
@@ -43,6 +43,8 @@ extern const char kForcePinned[]; extern const char kDefaultUnpinned[]; +extern const char kFileUrlNavigationAllowed[]; + // If the install of an extension is blocked this admin defined message is // appended to the error message displayed in the Chrome Webstore. extern const char kBlockedInstallMessage[];
diff --git a/chrome/browser/extensions/extension_management_internal.cc b/chrome/browser/extensions/extension_management_internal.cc index d94e17c..2cd633c 100644 --- a/chrome/browser/extensions/extension_management_internal.cc +++ b/chrome/browser/extensions/extension_management_internal.cc
@@ -232,6 +232,12 @@ } } + const absl::optional<bool> is_file_url_navigation_allowed = + dict.FindBool(schema_constants::kFileUrlNavigationAllowed); + if (is_file_url_navigation_allowed) { + file_url_navigation_allowed = is_file_url_navigation_allowed.value(); + } + return true; }
diff --git a/chrome/browser/extensions/extension_management_internal.h b/chrome/browser/extensions/extension_management_internal.h index 0a1aeff..696ad7a 100644 --- a/chrome/browser/extensions/extension_management_internal.h +++ b/chrome/browser/extensions/extension_management_internal.h
@@ -148,6 +148,9 @@ // all times. ExtensionManagement::ToolbarPinMode toolbar_pin = ExtensionManagement::ToolbarPinMode::kDefaultUnpinned; + + // Boolean to indicate whether the extension can navigate to file URLs. + bool file_url_navigation_allowed{false}; }; // Global extension management settings, applicable to all extensions.
diff --git a/chrome/browser/extensions/extension_management_unittest.cc b/chrome/browser/extensions/extension_management_unittest.cc index d102adf..0b4702e 100644 --- a/chrome/browser/extensions/extension_management_unittest.cc +++ b/chrome/browser/extensions/extension_management_unittest.cc
@@ -358,6 +358,10 @@ extension_management_->cws_info_service_ = cws_info_service; } + bool IsFileUrlNavigationAllowed(const ExtensionId& extension_id) { + return extension_management_->IsFileUrlNavigationAllowed(extension_id); + } + content::BrowserTaskEnvironment task_environment_; std::unique_ptr<TestingProfile> profile_; raw_ptr<sync_preferences::TestingPrefServiceSyncable> pref_service_; @@ -1379,6 +1383,21 @@ SetCWSInfoService(nullptr); } +TEST_F(ExtensionManagementServiceTest, IsFileUrlNavigationAllowed) { + EXPECT_EQ(IsFileUrlNavigationAllowed(kTargetExtension), false); + EXPECT_EQ(IsFileUrlNavigationAllowed(kTargetExtension2), false); + + SetExampleDictPref(base::StringPrintf( + R"({ + "%s": { + "file_url_navigation_allowed": true + } + })", + kTargetExtension)); + EXPECT_EQ(IsFileUrlNavigationAllowed(kTargetExtension), true); + EXPECT_EQ(IsFileUrlNavigationAllowed(kTargetExtension2), false); +} + // Tests the flag value indicating that extensions are blocklisted by default. TEST_F(ExtensionAdminPolicyTest, BlocklistedByDefault) { EXPECT_FALSE(BlocklistedByDefault(nullptr));
diff --git a/chrome/browser/extensions/extension_tab_util.cc b/chrome/browser/extensions/extension_tab_util.cc index 56ffb7fc..e24193e 100644 --- a/chrome/browser/extensions/extension_tab_util.cc +++ b/chrome/browser/extensions/extension_tab_util.cc
@@ -22,6 +22,7 @@ #include "chrome/browser/extensions/api/tabs/tabs_constants.h" #include "chrome/browser/extensions/browser_extension_window_controller.h" #include "chrome/browser/extensions/chrome_extension_function_details.h" +#include "chrome/browser/extensions/extension_management.h" #include "chrome/browser/extensions/tab_helper.h" #include "chrome/browser/platform_util.h" #include "chrome/browser/profiles/profile.h" @@ -870,7 +871,10 @@ if (url.SchemeIsFile() && !util::AllowFileAccess(extension->id(), browser_context) && base::FeatureList::IsEnabled( - extensions_features::kRestrictFileURLNavigation)) { + extensions_features::kRestrictFileURLNavigation) && + !extensions::ExtensionManagementFactory::GetForBrowserContext( + browser_context) + ->IsFileUrlNavigationAllowed(extension->id())) { return base::unexpected( tabs_constants::kFileUrlsNotAllowedInExtensionNavigations); }
diff --git a/chrome/browser/extensions/extension_tab_util_unittest.cc b/chrome/browser/extensions/extension_tab_util_unittest.cc index c4825b8..c58c310 100644 --- a/chrome/browser/extensions/extension_tab_util_unittest.cc +++ b/chrome/browser/extensions/extension_tab_util_unittest.cc
@@ -4,10 +4,14 @@ #include "chrome/browser/extensions/extension_tab_util.h" +#include "base/json/json_reader.h" #include "base/test/gmock_expected_support.h" +#include "base/values.h" #include "chrome/browser/extensions/api/tabs/tabs_constants.h" #include "chrome/browser/extensions/extension_service_test_base.h" #include "chrome/browser/extensions/extension_util.h" +#include "components/sync_preferences/testing_pref_service_syncable.h" +#include "extensions/browser/pref_names.h" #include "extensions/common/extension.h" #include "extensions/common/extension_builder.h" #include "testing/gtest/include/gtest/gtest.h" @@ -103,7 +107,7 @@ void ChromeExtensionNavigationTest::SetUp() { ExtensionServiceTestBase::SetUp(); - InitializeEmptyExtensionService(); + InitializeExtensionServiceWithUpdater(); } TEST_F(ChromeExtensionNavigationTest, PrepareURLForNavigation) { @@ -167,6 +171,32 @@ } } +TEST_F(ChromeExtensionNavigationTest, + PrepareURLForNavigationWithEnterprisePolicy) { + // Set the extension to allow file URL navigation via enterprise policy. + std::string extension_id = "abcdefghijklmnopabcdefghijklmnop"; + std::string json = base::StringPrintf( + R"({ + "%s": { + "file_url_navigation_allowed": true + } + })", + extension_id.c_str()); + + absl::optional<base::Value> settings = base::JSONReader::Read(json); + testing_pref_service()->SetManagedPref( + pref_names::kExtensionManagement, + base::Value::ToUniquePtrValue(std::move(settings.value()))); + + auto extension = ExtensionBuilder("test").SetID(extension_id).Build(); + + // File URLs are returned when the extension has access to file. + const std::string kFileURLWithEnterprisePolicy("file:///etc/passwd"); + auto url = ExtensionTabUtil::PrepareURLForNavigation( + kFileURLWithEnterprisePolicy, extension.get(), browser_context()); + EXPECT_THAT(url, base::test::ValueIs(GURL(kFileURLWithEnterprisePolicy))); +} + TEST_F(ChromeExtensionNavigationTest, PrepareURLForNavigationOnDevtools) { const std::string kDevtoolsURL( "devtools://devtools/bundled/devtools_app.html");
diff --git a/chrome/browser/fast_checkout/fast_checkout_client_impl.cc b/chrome/browser/fast_checkout/fast_checkout_client_impl.cc index 8e5cb78..000f287 100644 --- a/chrome/browser/fast_checkout/fast_checkout_client_impl.cc +++ b/chrome/browser/fast_checkout/fast_checkout_client_impl.cc
@@ -436,7 +436,8 @@ *credit_card, autofill::AutofillClient::UnmaskCardReason::kAutofill, weak_ptr_factory_.GetWeakPtr(), - cvc_authenticator->GetAsFullCardRequestUIDelegate()); + cvc_authenticator->GetAsFullCardRequestUIDelegate(), + autofill_client_->GetLastCommittedPrimaryMainFrameOrigin()); } } }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index cb4ff55..66aca1e 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -5110,6 +5110,11 @@ "expiry_milestone": 120 }, { + "name": "ios-incognito-downloads-warning", + "owners": [ "zalmashni@google.com", "chrome-incognito@google.com" ], + "expiry_milestone": 124 + }, + { "name": "ios-iph-for-safari-switcher", "owners": [ "huitingyu", "bling-flags@google.com" ], "expiry_milestone": 121
diff --git a/chrome/browser/ip_protection/ip_protection_config_provider.cc b/chrome/browser/ip_protection/ip_protection_config_provider.cc index 5e7d344..2687c60 100644 --- a/chrome/browser/ip_protection/ip_protection_config_provider.cc +++ b/chrome/browser/ip_protection/ip_protection_config_provider.cc
@@ -21,21 +21,45 @@ IpProtectionConfigProvider::IpProtectionConfigProvider( signin::IdentityManager* identity_manager, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, Profile* profile) - : identity_manager_(identity_manager), - profile_(profile), - url_loader_factory_(url_loader_factory), - ip_protection_config_http_( - std::make_unique<IpProtectionConfigHttp>(url_loader_factory_.get())), - blind_sign_auth_(std::make_unique<quiche::BlindSignAuth>( - ip_protection_config_http_.get(), - privacy::ppn::BlindSignAuthOptions())), - bsa_(blind_sign_auth_.get()) { + : identity_manager_(identity_manager), profile_(profile) { CHECK(identity_manager); identity_manager_->AddObserver(this); } +void IpProtectionConfigProvider::SetUp() { + if (!ip_protection_config_http_) { + if (!url_loader_factory_) { + CHECK(profile_); + url_loader_factory_ = profile_->GetDefaultStoragePartition() + ->GetURLLoaderFactoryForBrowserProcess(); + } + ip_protection_config_http_ = + std::make_unique<IpProtectionConfigHttp>(url_loader_factory_.get()); + } + if (!bsa_) { + if (!blind_sign_auth_) { + blind_sign_auth_ = std::make_unique<quiche::BlindSignAuth>( + ip_protection_config_http_.get(), + privacy::ppn::BlindSignAuthOptions()); + } + bsa_ = blind_sign_auth_.get(); + } +} + +void IpProtectionConfigProvider::SetUpForTesting( + std::unique_ptr<IpProtectionConfigHttp> ip_protection_config_http, + quiche::BlindSignAuthInterface* bsa) { + // Carefully destroy any existing values in the correct order. + ip_protection_config_http_ = nullptr; + url_loader_factory_ = nullptr; + ip_protection_config_http_ = std::move(ip_protection_config_http); + + bsa_ = nullptr; + blind_sign_auth_ = nullptr; + bsa_ = bsa; +} + IpProtectionConfigProvider::~IpProtectionConfigProvider() = default; void IpProtectionConfigProvider::TryGetAuthTokens( @@ -43,6 +67,7 @@ TryGetAuthTokensCallback callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); CHECK(!is_shutting_down_); + SetUp(); // The `batch_size` is cast to an `int` for use by BlindSignAuth, so check for // overflow here. @@ -63,6 +88,10 @@ } void IpProtectionConfigProvider::GetProxyList(GetProxyListCallback callback) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + CHECK(!is_shutting_down_); + SetUp(); + ip_protection_config_http_->GetProxyConfig(base::BindOnce( [](GetProxyListCallback callback, absl::StatusOr<ip_protection::GetProxyConfigResponse> response) { @@ -155,7 +184,6 @@ signin::AccessTokenInfo access_token_info, uint32_t batch_size, TryGetAuthTokensCallback callback) { - DCHECK(bsa_); auto bsa_get_tokens_start_time = base::TimeTicks::Now(); bsa_->GetTokens( access_token_info.token, batch_size, @@ -434,15 +462,3 @@ return; } } - -void IpProtectionConfigProvider::SetIpProtectionConfigHttpForTesting( - std::unique_ptr<IpProtectionConfigHttp> ip_protection_config_http) { - // `blind_sign_auth_` carries a raw pointer to `ip_protection_config_http_`, - // and `bsa_` is a raw pointer to `blind_sign_auth_`, so carefully update - // those without leaving dangling pointers. - bsa_ = nullptr; - blind_sign_auth_ = std::make_unique<quiche::BlindSignAuth>( - ip_protection_config_http.get(), privacy::ppn::BlindSignAuthOptions()); - bsa_ = blind_sign_auth_.get(); - ip_protection_config_http_ = std::move(ip_protection_config_http); -}
diff --git a/chrome/browser/ip_protection/ip_protection_config_provider.h b/chrome/browser/ip_protection/ip_protection_config_provider.h index e0f8a88..7de313ba 100644 --- a/chrome/browser/ip_protection/ip_protection_config_provider.h +++ b/chrome/browser/ip_protection/ip_protection_config_provider.h
@@ -74,19 +74,10 @@ public: IpProtectionConfigProvider( signin::IdentityManager* identity_manager, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, Profile* profile); ~IpProtectionConfigProvider() override; - void SetBlindSignAuthInterfaceForTesting( - quiche::BlindSignAuthInterface* bsa) { - bsa_ = bsa; - } - - void SetIpProtectionConfigHttpForTesting( - std::unique_ptr<IpProtectionConfigHttp> ip_protection_config_http); - // Get a batch of blind-signed auth tokens. // // It is forbidden for two calls to this method to be outstanding at the same @@ -114,6 +105,11 @@ return receiver_id_for_testing_; } + // Like `SetUp()`, but providing values for each of the member variables. + void SetUpForTesting( + std::unique_ptr<IpProtectionConfigHttp> ip_protection_config_http_, + quiche::BlindSignAuthInterface* bsa); + // Base time deltas for calculating `try_again_after`. static constexpr base::TimeDelta kNotEligibleBackoff = base::Days(1); static constexpr base::TimeDelta kTransientBackoff = base::Seconds(5); @@ -125,6 +121,11 @@ FRIEND_TEST_ALL_PREFIXES(IpProtectionConfigProviderBrowserTest, BackoffTimeResetAfterProfileAvailabilityChange); + // Set up `ip_protection_config_http_` and `bsa_`, if not already initialized. + // This accomplishes lazy loading of these components to break dependency + // loops in browser startup. + void SetUp(); + // Calls the IdentityManager asynchronously to request the OAuth token for the // logged in user. void RequestOAuthToken(uint32_t batch_size,
diff --git a/chrome/browser/ip_protection/ip_protection_config_provider_factory.cc b/chrome/browser/ip_protection/ip_protection_config_provider_factory.cc index 15e58ee..23ce4d5 100644 --- a/chrome/browser/ip_protection/ip_protection_config_provider_factory.cc +++ b/chrome/browser/ip_protection/ip_protection_config_provider_factory.cc
@@ -64,8 +64,6 @@ Profile* profile = Profile::FromBrowserContext(context); return std::make_unique<IpProtectionConfigProvider>( IdentityManagerFactory::GetForProfile(profile), - profile->GetDefaultStoragePartition() - ->GetURLLoaderFactoryForBrowserProcess(), profile); }
diff --git a/chrome/browser/ip_protection/ip_protection_config_provider_unittest.cc b/chrome/browser/ip_protection/ip_protection_config_provider_unittest.cc index 3b35449..5cfeec4 100644 --- a/chrome/browser/ip_protection/ip_protection_config_provider_unittest.cc +++ b/chrome/browser/ip_protection/ip_protection_config_provider_unittest.cc
@@ -140,12 +140,12 @@ base::Time::FromTimeT(absl::ToTimeT(absl_expiration_time_))) {} void SetUp() override { - getter_ = std::make_unique<IpProtectionConfigProvider>( - IdentityManager(), - base::MakeRefCounted<network::TestSharedURLLoaderFactory>(), - /*profile=*/nullptr); + getter_ = std::make_unique<IpProtectionConfigProvider>(IdentityManager(), + /*profile=*/nullptr); bsa_ = std::make_unique<MockBlindSignAuth>(); - getter_->SetBlindSignAuthInterfaceForTesting(bsa_.get()); + getter_->SetUpForTesting( + std::make_unique<MockIpProtectionConfigHttp>(absl::nullopt), + bsa_.get()); } void TearDown() override { getter_->Shutdown(); } @@ -556,8 +556,8 @@ TEST_F(IpProtectionConfigProviderTest, GetProxyList) { std::vector<std::string> proxy_list = {"proxy1", "proxy2"}; - getter_->SetIpProtectionConfigHttpForTesting( - std::make_unique<MockIpProtectionConfigHttp>(proxy_list)); + getter_->SetUpForTesting( + std::make_unique<MockIpProtectionConfigHttp>(proxy_list), bsa_.get()); base::test::TestFuture<const absl::optional<std::vector<std::string>>&> proxy_list_future; @@ -568,9 +568,6 @@ } TEST_F(IpProtectionConfigProviderTest, GetProxyListFailure) { - getter_->SetIpProtectionConfigHttpForTesting( - std::make_unique<MockIpProtectionConfigHttp>(absl::nullopt)); - base::test::TestFuture<const absl::optional<std::vector<std::string>>&> proxy_list_future; getter_->GetProxyList(proxy_list_future.GetCallback());
diff --git a/chrome/browser/media/webrtc/media_stream_capture_indicator.cc b/chrome/browser/media/webrtc/media_stream_capture_indicator.cc index 3bd40ff..8ccd48ff 100644 --- a/chrome/browser/media/webrtc/media_stream_capture_indicator.cc +++ b/chrome/browser/media/webrtc/media_stream_capture_indicator.cc
@@ -548,8 +548,9 @@ content::WebContents* web_contents, const WebContentsDeviceUsagePredicate& pred) const { auto it = usage_map_.find(web_contents); - if (it != usage_map_.end() && pred.Run(it->second.get())) + if (it != usage_map_.end() && pred(it->second.get())) { return true; + } for (auto* inner_contents : web_contents->GetInnerWebContents()) { if (CheckUsage(inner_contents, pred)) @@ -562,50 +563,39 @@ bool MediaStreamCaptureIndicator::IsCapturingUserMedia( content::WebContents* web_contents) const { DCHECK_CURRENTLY_ON(BrowserThread::UI); - return CheckUsage( - web_contents, - base::BindRepeating([](const WebContentsDeviceUsage* usage) { - return usage->IsCapturingAudio() || usage->IsCapturingVideo(); - })); + return CheckUsage(web_contents, [](const WebContentsDeviceUsage* usage) { + return usage->IsCapturingAudio() || usage->IsCapturingVideo(); + }); } bool MediaStreamCaptureIndicator::IsCapturingVideo( content::WebContents* web_contents) const { DCHECK_CURRENTLY_ON(BrowserThread::UI); - return CheckUsage( - web_contents, - base::BindRepeating(&WebContentsDeviceUsage::IsCapturingVideo)); + return CheckUsage(web_contents, &WebContentsDeviceUsage::IsCapturingVideo); } bool MediaStreamCaptureIndicator::IsCapturingAudio( content::WebContents* web_contents) const { DCHECK_CURRENTLY_ON(BrowserThread::UI); - return CheckUsage( - web_contents, - base::BindRepeating(&WebContentsDeviceUsage::IsCapturingAudio)); + return CheckUsage(web_contents, &WebContentsDeviceUsage::IsCapturingAudio); } bool MediaStreamCaptureIndicator::IsBeingMirrored( content::WebContents* web_contents) const { DCHECK_CURRENTLY_ON(BrowserThread::UI); - return CheckUsage(web_contents, - base::BindRepeating(&WebContentsDeviceUsage::IsMirroring)); + return CheckUsage(web_contents, &WebContentsDeviceUsage::IsMirroring); } bool MediaStreamCaptureIndicator::IsCapturingWindow( content::WebContents* web_contents) const { DCHECK_CURRENTLY_ON(BrowserThread::UI); - return CheckUsage( - web_contents, - base::BindRepeating(&WebContentsDeviceUsage::IsCapturingWindow)); + return CheckUsage(web_contents, &WebContentsDeviceUsage::IsCapturingWindow); } bool MediaStreamCaptureIndicator::IsCapturingDisplay( content::WebContents* web_contents) const { DCHECK_CURRENTLY_ON(BrowserThread::UI); - return CheckUsage( - web_contents, - base::BindRepeating(&WebContentsDeviceUsage::IsCapturingDisplay)); + return CheckUsage(web_contents, &WebContentsDeviceUsage::IsCapturingDisplay); } void MediaStreamCaptureIndicator::StopMediaCapturing(
diff --git a/chrome/browser/media/webrtc/media_stream_capture_indicator.h b/chrome/browser/media/webrtc/media_stream_capture_indicator.h index e113822..3a570a4 100644 --- a/chrome/browser/media/webrtc/media_stream_capture_indicator.h +++ b/chrome/browser/media/webrtc/media_stream_capture_indicator.h
@@ -9,6 +9,7 @@ #include <vector> #include "base/functional/callback_forward.h" +#include "base/functional/function_ref.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/observer_list.h" @@ -166,7 +167,7 @@ // Checks if |web_contents| or any portal WebContents in its tree is using // a device for capture. The type of capture is specified using |pred|. using WebContentsDeviceUsagePredicate = - base::RepeatingCallback<bool(const WebContentsDeviceUsage*)>; + base::FunctionRef<bool(const WebContentsDeviceUsage*)>; bool CheckUsage(content::WebContents* web_contents, const WebContentsDeviceUsagePredicate& pred) const;
diff --git a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc index a3b7e39..e5728a7 100644 --- a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc +++ b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc
@@ -192,7 +192,7 @@ void PasswordManagerSettingsServiceAndroidImpl::Init() { CHECK(bridge_helper_); - MigratePrefsIfNeeded(); + // TODO(crbug.com/1485556): Copy the pref values to GMSCore for local users. bridge_helper_->SetConsumer(weak_ptr_factory_.GetWeakPtr()); lifecycle_helper_->RegisterObserver(base::BindRepeating( @@ -228,9 +228,39 @@ return; } + WriteToTheCacheAndRegularPref(setting, value); +} + +void PasswordManagerSettingsServiceAndroidImpl::OnSettingValueAbsent( + password_manager::PasswordManagerSetting setting) { + CHECK(bridge_helper_); + UpdateSettingFetchState(setting); + + if (IsUnenrolledFromUPM(pref_service_)) + return; + + if (!IsPasswordSyncEnabled(sync_service_)) + return; + + // This code is currently called only for syncing users. If the setting value + // is absent in GMSCore, the cached setting value is set to the default value, + // which is true for both of the password-related settings: AutoSingIn and + // OfferToSavePasswords. + WriteToTheCacheAndRegularPref(setting, absl::nullopt); + + // TODO(crbug.com/1486847): Handle the absent value for local passwords. +} + +void PasswordManagerSettingsServiceAndroidImpl::WriteToTheCacheAndRegularPref( + PasswordManagerSetting setting, + absl::optional<bool> value) { const PrefService::Preference* android_pref = GetGMSPrefFromSetting(pref_service_, setting); - pref_service_->SetBoolean(android_pref->name(), value); + if (value.has_value()) { + pref_service_->SetBoolean(android_pref->name(), value.value()); + } else { + pref_service_->ClearPref(android_pref->name()); + } // Updating the regular pref now will ensure that if passwods sync turns off // the regular pref contains the latest setting value. This can only be done @@ -240,55 +270,14 @@ if (!HasChosenToSyncPreferences(sync_service_)) { const PrefService::Preference* regular_pref = GetRegularPrefFromSetting(pref_service_, setting); - pref_service_->SetBoolean(regular_pref->name(), value); + if (value.has_value()) { + pref_service_->SetBoolean(regular_pref->name(), value.value()); + } else { + pref_service_->ClearPref(regular_pref->name()); + } } } -void PasswordManagerSettingsServiceAndroidImpl::OnSettingValueAbsent( - password_manager::PasswordManagerSetting setting) { - CHECK(bridge_helper_); - UpdateSettingFetchState(setting); - if (IsUnenrolledFromUPM(pref_service_)) - return; - - if (!IsPasswordSyncEnabled(sync_service_)) - return; - - const PrefService::Preference* pref = - GetGMSPrefFromSetting(pref_service_, setting); - - // If both GMS and Chrome have default values for the setting, then no update - // is needed. - if (!pref_service_->GetUserPrefValue(pref->name())) - return; - - // If Chrome has an explicitly set value, GMS needs to know about it. - // TODO(crbug.com/1289700): Check whether this should be guarded by a - // migration pref. - bridge_helper_->SetPasswordSettingValue( - SyncingAccount(sync_service_->GetAccountInfo().email), setting, - pref->GetValue()->GetBool()); -} - -void PasswordManagerSettingsServiceAndroidImpl::MigratePrefsIfNeeded() { - if (IsUnenrolledFromUPM(pref_service_)) - return; - - if (pref_service_->GetBoolean( - password_manager::prefs::kSettingsMigratedToUPM)) - return; - - base::UmaHistogramBoolean("PasswordManager.MigratedSettingsUPMAndroid", true); - pref_service_->SetBoolean(password_manager::prefs::kSettingsMigratedToUPM, - true); - // No need to copy the values until sync turns on. When sync turns on, this - // will be handled as part of the sync state change rather than migration. - if (!IsPasswordSyncEnabled(sync_service_)) - return; - - DumpChromePrefsIntoGMSPrefs(); -} - void PasswordManagerSettingsServiceAndroidImpl::OnStateChanged( syncer::SyncService* sync) { if (IsUnenrolledFromUPM(pref_service_)) @@ -300,9 +289,6 @@ is_password_sync_enabled_ = IsPasswordSyncEnabled(sync); - if (is_password_sync_enabled_) - DumpChromePrefsIntoGMSPrefs(); - // Fetch settings from the backend to align values stored in GMS Core and // Chrome. fetch_after_sync_status_change_in_progress_ = true; @@ -331,32 +317,11 @@ } } -void PasswordManagerSettingsServiceAndroidImpl::DumpChromePrefsIntoGMSPrefs() { - for (PasswordManagerSetting setting : kAllPasswordSettings) { - const PrefService::Preference* regular_pref = - GetRegularPrefFromSetting(pref_service_, setting); - - if (!pref_service_->GetUserPrefValue(regular_pref->name())) - continue; - - const PrefService::Preference* gms_pref = - GetGMSPrefFromSetting(pref_service_, setting); - - // Make sure the user prefs are consistent. If the settings are set by - // policy, the value of the managed pref will still apply in checks, but - // the UPM prefs should contain the user set value. - pref_service_->SetBoolean( - gms_pref->name(), - pref_service_->GetUserPrefValue(regular_pref->name())->GetBool()); - } -} - void PasswordManagerSettingsServiceAndroidImpl:: OnUnenrollmentPreferenceChanged() { if (!IsUnenrolledFromUPM(pref_service_)) { // Perform actions that are usually done on startup, but were skipped // for the evicted users. - MigratePrefsIfNeeded(); RequestSettingsFromBackend(); } }
diff --git a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.h b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.h index b0d8c818..6fd9a11 100644 --- a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.h +++ b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.h
@@ -70,14 +70,12 @@ void OnSettingValueAbsent( password_manager::PasswordManagerSetting setting) override; - // Updates the non syncable, android-only prefs with the values of the - // syncable cross-platform prefs as the latter won't be used when UPM - // is up and running. There is no need to migrate the values until sync turns - // on, because UPM is not running until then. When sync turns on, this - // will be handled as part of the sync state change rather than migration. - // If a migration was already performed, there is no need - // to migrate again. - void MigratePrefsIfNeeded(); + // Stores the given `value` of the `setting` into the android-only GMS prefs. + // Stores the same `value` in the old prefs are not being synced. + // If the `value` is not given, the prefs will be set to default. + void WriteToTheCacheAndRegularPref( + password_manager::PasswordManagerSetting setting, + absl::optional<bool> value); // syncer::SyncServiceObserver implementation void OnStateChanged(syncer::SyncService* sync) override; @@ -90,10 +88,6 @@ // Asynchronously fetches settings from backend regardless of sync status. void FetchSettings(); - // Copies the values of chrome prefs that have user-set values into the - // GMS prefs. - void DumpChromePrefsIntoGMSPrefs(); - // Migrates settings to GMS Core if the user is reenrolled into the UPM // in the middle of the browser session. void OnUnenrollmentPreferenceChanged();
diff --git a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc index 2b6addd..df25966a 100644 --- a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc +++ b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc
@@ -207,8 +207,6 @@ test_pref_service_.registry()->RegisterStringPref( ::prefs::kGoogleServicesLastUsername, kTestAccount); test_pref_service_.registry()->RegisterBooleanPref( - password_manager::prefs::kSettingsMigratedToUPM, false); - test_pref_service_.registry()->RegisterBooleanPref( password_manager::prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, false); } @@ -233,150 +231,6 @@ } TEST_F(PasswordManagerSettingsServiceAndroidImplTest, - TestNoAdditionalMigration) { - // Imitate the post-migration state by setting the migration pref. - pref_service()->SetBoolean(password_manager::prefs::kSettingsMigratedToUPM, - true); - - // No additional migration should happen if the migration pref wasn't reset. - CreateNewService(); - histogram_tester()->ExpectTotalCount( - "PasswordManager.MigratedSettingsUPMAndroid", 0); - EXPECT_EQ(pref_service()->GetUserPrefValue( - password_manager::prefs::kOfferToSavePasswordsEnabledGMS), - nullptr); - EXPECT_EQ(pref_service()->GetUserPrefValue( - password_manager::prefs::kAutoSignInEnabledGMS), - nullptr); -} - -TEST_F(PasswordManagerSettingsServiceAndroidImplTest, - TestNewMigrationIfPrefUndoneSyncOff) { - // Reset the migration pref. - pref_service()->SetBoolean(password_manager::prefs::kSettingsMigratedToUPM, - false); - // Set an explicit value on the "Offer to save passwords" pref. - pref_service()->SetBoolean(password_manager::prefs::kCredentialsEnableService, - false); - - // No migration should happen if passwords sync is off, but the migration - // should be marked as done. This is because at a later point, when sync - // turns on, the GMS prefs will be updated as part of the sync state change - // instead of the migration. - SetPasswordsSync(false); - CreateNewService(); - histogram_tester()->ExpectUniqueSample( - "PasswordManager.MigratedSettingsUPMAndroid", true, 1); - EXPECT_EQ(pref_service()->GetUserPrefValue( - password_manager::prefs::kOfferToSavePasswordsEnabledGMS), - nullptr); - EXPECT_EQ(pref_service()->GetUserPrefValue( - password_manager::prefs::kAutoSignInEnabledGMS), - nullptr); - EXPECT_TRUE(pref_service()->GetBoolean( - password_manager::prefs::kSettingsMigratedToUPM)); -} - -TEST_F(PasswordManagerSettingsServiceAndroidImplTest, - TestNewMigrationIfPrefUndoneSyncOn) { - // Reset the migration pref. - pref_service()->SetBoolean(password_manager::prefs::kSettingsMigratedToUPM, - false); - // Set an explicit value on the "Offer to save passwords" pref. - pref_service()->SetBoolean(password_manager::prefs::kCredentialsEnableService, - false); - - // Migration changes are expected if sync is on when the service is created. - SetPasswordsSync(true); - CreateNewService(); - histogram_tester()->ExpectUniqueSample( - "PasswordManager.MigratedSettingsUPMAndroid", true, 1); - EXPECT_FALSE(pref_service()->GetBoolean( - password_manager::prefs::kOfferToSavePasswordsEnabledGMS)); - EXPECT_EQ(pref_service()->GetUserPrefValue( - password_manager::prefs::kAutoSignInEnabledGMS), - nullptr); -} - -TEST_F(PasswordManagerSettingsServiceAndroidImplTest, - TestNewMigrationManagedPrefSetValue) { - // Reset the migration pref. - pref_service()->SetBoolean(password_manager::prefs::kSettingsMigratedToUPM, - false); - // Set an explicit value on the "Offer to save passwords" pref. - pref_service()->SetBoolean(password_manager::prefs::kCredentialsEnableService, - true); - // Saving passwords is disabled by policy. - pref_service()->SetManagedPref( - password_manager::prefs::kCredentialsEnableService, base::Value(false)); - - // Create a new service and expect that the migration stores the user value, - // not the one enforced by policy. - SetPasswordsSync(true); - CreateNewService(); - histogram_tester()->ExpectUniqueSample( - "PasswordManager.MigratedSettingsUPMAndroid", true, 1); - EXPECT_TRUE(pref_service()->GetBoolean( - password_manager::prefs::kSettingsMigratedToUPM)); - EXPECT_TRUE(pref_service()->GetBoolean( - password_manager::prefs::kOfferToSavePasswordsEnabledGMS)); - EXPECT_NE(pref_service()->GetUserPrefValue( - password_manager::prefs::kOfferToSavePasswordsEnabledGMS), - nullptr); -} - -TEST_F(PasswordManagerSettingsServiceAndroidImplTest, - TestNewMigrationManagedPrefDefaultValue) { - // Reset the migration pref. - pref_service()->SetBoolean(password_manager::prefs::kSettingsMigratedToUPM, - false); - // Saving passwords is disabled by policy. - pref_service()->SetManagedPref( - password_manager::prefs::kCredentialsEnableService, base::Value(false)); - - // Create a new service and expect that the migration doesn't change the - // GMS pref value, because the user hasn't set any value. - SetPasswordsSync(true); - CreateNewService(); - histogram_tester()->ExpectUniqueSample( - "PasswordManager.MigratedSettingsUPMAndroid", true, 1); - EXPECT_TRUE(pref_service()->GetBoolean( - password_manager::prefs::kSettingsMigratedToUPM)); - EXPECT_TRUE(pref_service()->GetBoolean( - password_manager::prefs::kOfferToSavePasswordsEnabledGMS)); - EXPECT_EQ(pref_service()->GetUserPrefValue( - password_manager::prefs::kOfferToSavePasswordsEnabledGMS), - nullptr); -} - -TEST_F(PasswordManagerSettingsServiceAndroidImplTest, - TestNewMigrationUserUnenrolledFromUPM) { - pref_service()->SetBoolean( - password_manager::prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, - true); - ASSERT_FALSE(pref_service()->GetBoolean( - password_manager::prefs::kSettingsMigratedToUPM)); - // Set an explicit value on the "Offer to save passwords" pref. - pref_service()->SetBoolean(password_manager::prefs::kCredentialsEnableService, - false); - - // No migration should happen if passwords sync is broken, no prefs should - // change and no metrcis should be recorded. - InitializeSettingsService(/*password_sync_enabled=*/true, - /*setting_sync_enabled=*/true); - histogram_tester()->ExpectTotalCount( - "PasswordManager.MigratedSettingsUPMAndroid", 0); - EXPECT_EQ(pref_service()->GetUserPrefValue( - password_manager::prefs::kOfferToSavePasswordsEnabledGMS), - nullptr); - EXPECT_EQ(pref_service()->GetUserPrefValue( - password_manager::prefs::kAutoSignInEnabledGMS), - nullptr); - EXPECT_FALSE(pref_service()->GetBoolean( - password_manager::prefs::kSettingsMigratedToUPM)); -} - -TEST_F(PasswordManagerSettingsServiceAndroidImplTest, OnSaveSettingFetchSyncingBoth) { InitializeSettingsService(/*password_sync_enabled=*/true, /*setting_sync_enabled=*/true); @@ -494,16 +348,18 @@ } TEST_F(PasswordManagerSettingsServiceAndroidImplTest, - OnSaveSettingAbsentSetValueSyncing) { + OnSaveSettingAbsentDoesntSetValueSyncing) { InitializeSettingsService(/*password_sync_enabled=*/true, /*setting_sync_enabled=*/true); pref_service()->SetUserPref( password_manager::prefs::kOfferToSavePasswordsEnabledGMS, base::Value(false)); + // The settings for syncing users should no longer be written to GMSCore. EXPECT_CALL(*bridge_helper(), SetPasswordSettingValue( Eq(SyncingAccount(kTestAccount)), - Eq(PasswordManagerSetting::kOfferToSavePasswords), false)); + Eq(PasswordManagerSetting::kOfferToSavePasswords), false)) + .Times(0); updater_bridge_consumer()->OnSettingValueAbsent( PasswordManagerSetting::kOfferToSavePasswords); } @@ -545,15 +401,18 @@ } TEST_F(PasswordManagerSettingsServiceAndroidImplTest, - OnAutoSignInAbsentSetValueSyncing) { + OnAutoSignInAbsentDontSetValueSyncing) { InitializeSettingsService(/*password_sync_enabled=*/true, /*setting_sync_enabled=*/true); pref_service()->SetUserPref(password_manager::prefs::kAutoSignInEnabledGMS, base::Value(false)); + + // The settings for syncing users should no longer be written to GmsCore. EXPECT_CALL( *bridge_helper(), SetPasswordSettingValue(Eq(SyncingAccount(kTestAccount)), - Eq(PasswordManagerSetting::kAutoSignIn), false)); + Eq(PasswordManagerSetting::kAutoSignIn), false)) + .Times(0); updater_bridge_consumer()->OnSettingValueAbsent( PasswordManagerSetting::kAutoSignIn); } @@ -586,7 +445,7 @@ // Checks that general syncable prefs are dumped into the android-only GMS // prefs before settings are requested when sync is enabled. TEST_F(PasswordManagerSettingsServiceAndroidImplTest, - PasswordSyncEnablingPrefsMoving) { + PasswordSyncEnablingDoesntMovePrefs) { InitializeSettingsService(/*password_sync_enabled=*/false, /*setting_sync_enabled=*/false); pref_service()->SetUserPref( @@ -602,9 +461,9 @@ SetPasswordsSync(/*enabled=*/true); sync_service()->FireStateChanged(); - EXPECT_FALSE(pref_service()->GetBoolean( + EXPECT_TRUE(pref_service()->GetBoolean( password_manager::prefs::kOfferToSavePasswordsEnabledGMS)); - EXPECT_FALSE(pref_service()->GetBoolean( + EXPECT_TRUE(pref_service()->GetBoolean( password_manager::prefs::kAutoSignInEnabledGMS)); } @@ -676,18 +535,19 @@ SetPasswordsSync(/*enabled=*/true); sync_service()->FireStateChanged(); - // If there is no user setting stored in GMS Core, Chrome setting should be - // set in it. + // If there is no user setting stored in GMS Core, Chrome setting should not + // be set in it. EXPECT_CALL( *bridge_helper(), SetPasswordSettingValue(Eq(SyncingAccount(kTestAccount)), - Eq(PasswordManagerSetting::kAutoSignIn), false)); + Eq(PasswordManagerSetting::kAutoSignIn), false)) + .Times(0); updater_bridge_consumer()->OnSettingValueAbsent( PasswordManagerSetting::kAutoSignIn); - EXPECT_FALSE(pref_service()->GetBoolean( + EXPECT_TRUE(pref_service()->GetBoolean( password_manager::prefs::kCredentialsEnableAutosignin)); - EXPECT_FALSE(pref_service()->GetBoolean( + EXPECT_TRUE(pref_service()->GetBoolean( password_manager::prefs::kAutoSignInEnabledGMS)); } @@ -1113,16 +973,13 @@ } TEST_F(PasswordManagerSettingsServiceAndroidImplTest, - TestMigrateSettingsOnReenrollingIntoUPM) { + TestDontMigrateSettingsOnReenrollingIntoUPM) { SetPasswordsSync(true); pref_service()->SetBoolean( password_manager::prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, true); - // Reset the migration pref. - pref_service()->SetBoolean(password_manager::prefs::kSettingsMigratedToUPM, - false); // Set an explicit value on the "Offer to save passwords" pref. pref_service()->SetBoolean(password_manager::prefs::kCredentialsEnableService, false); @@ -1136,10 +993,7 @@ password_manager::prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, false); - // Check that Chrome prefs are dumped into GMS prefs. - histogram_tester()->ExpectUniqueSample( - "PasswordManager.MigratedSettingsUPMAndroid", true, 1); - EXPECT_FALSE(pref_service()->GetBoolean( + EXPECT_TRUE(pref_service()->GetBoolean( password_manager::prefs::kOfferToSavePasswordsEnabledGMS)); EXPECT_EQ(pref_service()->GetUserPrefValue( password_manager::prefs::kAutoSignInEnabledGMS),
diff --git a/chrome/browser/password_manager/android/password_migration_warning_startup_launcher.cc b/chrome/browser/password_manager/android/password_migration_warning_startup_launcher.cc index 5834b33ea..90dc20b 100644 --- a/chrome/browser/password_manager/android/password_migration_warning_startup_launcher.cc +++ b/chrome/browser/password_manager/android/password_migration_warning_startup_launcher.cc
@@ -65,7 +65,7 @@ void PasswordMigrationWarningStartupLauncher:: OnGetPasswordStoreResultsOrErrorFrom( password_manager::PasswordStoreInterface* store, - FormsOrError results_or_error) { + password_manager::LoginsResultOrError results_or_error) { if (absl::holds_alternative<password_manager::PasswordStoreBackendError>( results_or_error)) { return;
diff --git a/chrome/browser/password_manager/android/password_migration_warning_startup_launcher.h b/chrome/browser/password_manager/android/password_migration_warning_startup_launcher.h index affea2c2..b3232d6 100644 --- a/chrome/browser/password_manager/android/password_migration_warning_startup_launcher.h +++ b/chrome/browser/password_manager/android/password_migration_warning_startup_launcher.h
@@ -44,7 +44,7 @@ // it. void OnGetPasswordStoreResultsOrErrorFrom( password_manager::PasswordStoreInterface* store, - FormsOrError results_or_error) override; + password_manager::LoginsResultOrError results_or_error) override; // Not implemented. Required override. void OnGetPasswordStoreResults(
diff --git a/chrome/browser/password_manager/android/password_store_android_backend_unittest.cc b/chrome/browser/password_manager/android/password_store_android_backend_unittest.cc index 222696c..ec06ae69 100644 --- a/chrome/browser/password_manager/android/password_store_android_backend_unittest.cc +++ b/chrome/browser/password_manager/android/password_store_android_backend_unittest.cc
@@ -204,7 +204,6 @@ prefs::kCurrentMigrationVersionToGoogleMobileServices, 1); prefs_.registry()->RegisterDoublePref(prefs::kTimeOfLastMigrationAttempt, 20.22); - prefs_.registry()->RegisterBooleanPref(prefs::kSettingsMigratedToUPM, true); backend_ = std::make_unique<PasswordStoreAndroidBackend>( base::PassKey<class PasswordStoreAndroidBackendTest>(), @@ -696,7 +695,6 @@ prefs::kCurrentMigrationVersionToGoogleMobileServices), 0); EXPECT_EQ(prefs()->GetDouble(prefs::kTimeOfLastMigrationAttempt), 0.0); - EXPECT_FALSE(prefs()->GetBoolean(prefs::kSettingsMigratedToUPM)); const char kErrorCodeMetric[] = "PasswordManager.PasswordStoreAndroidBackend.ErrorCode"; @@ -741,7 +739,6 @@ prefs::kCurrentMigrationVersionToGoogleMobileServices), 0); EXPECT_NE(prefs()->GetDouble(prefs::kTimeOfLastMigrationAttempt), 0.0); - EXPECT_TRUE(prefs()->GetBoolean(prefs::kSettingsMigratedToUPM)); const char kErrorCodeMetric[] = "PasswordManager.PasswordStoreAndroidBackend.ErrorCode"; @@ -795,7 +792,6 @@ prefs::kCurrentMigrationVersionToGoogleMobileServices), 0); EXPECT_EQ(prefs()->GetDouble(prefs::kTimeOfLastMigrationAttempt), 0.0); - EXPECT_FALSE(prefs()->GetBoolean(prefs::kSettingsMigratedToUPM)); const char kErrorCodeMetric[] = "PasswordManager.PasswordStoreAndroidBackend.ErrorCode"; @@ -864,7 +860,6 @@ prefs::kCurrentMigrationVersionToGoogleMobileServices), 0); EXPECT_NE(prefs()->GetDouble(prefs::kTimeOfLastMigrationAttempt), 0.0); - EXPECT_TRUE(prefs()->GetBoolean(prefs::kSettingsMigratedToUPM)); const char kErrorCodeMetric[] = "PasswordManager.PasswordStoreAndroidBackend.ErrorCode"; @@ -1046,7 +1041,6 @@ prefs::kCurrentMigrationVersionToGoogleMobileServices), 0); EXPECT_EQ(prefs()->GetDouble(prefs::kTimeOfLastMigrationAttempt), 0.0); - EXPECT_FALSE(prefs()->GetBoolean(prefs::kSettingsMigratedToUPM)); const char kErrorCodeMetric[] = "PasswordManager.PasswordStoreAndroidBackend.ErrorCode";
diff --git a/chrome/browser/payments/payment_handler_ui_browsertest.cc b/chrome/browser/payments/payment_handler_ui_browsertest.cc index a68ac730..d5e61cdb 100644 --- a/chrome/browser/payments/payment_handler_ui_browsertest.cc +++ b/chrome/browser/payments/payment_handler_ui_browsertest.cc
@@ -119,35 +119,6 @@ ExpectEvent2(JourneyLogger::Event2::kActivationlessShow, false); } -// Test that a browser reload does not allow a consecutive activationless show. -IN_PROC_BROWSER_TEST_F(PaymentRequestActivationlessShowTest, - WithBrowserReload) { - std::string payment_method = - https_server()->GetURL("a.com", "/orenpay.test/pay").spec(); - NavigateTo("b.com", "/payment_handler_status.html"); - std::string show_js = content::JsReplace("getStatus($1)", payment_method); - - // The first call to show() without a user gesture succeeds. - ResetEventWaiterForSingleEvent(TestEvent::kConnectionTerminated); - EXPECT_EQ( - "success", - content::EvalJs(GetActiveWebContents(), show_js, - content::EvalJsOptions::EXECUTE_SCRIPT_NO_USER_GESTURE)); - ExpectEvent2(JourneyLogger::Event2::kActivationlessShow, true); - WaitForObservedEvent(); - - // Reload the page. - NavigateTo("b.com", "/payment_handler_status.html"); - - // A second call to show() without a user gesture gives an error, even after - // a browser page reload. - EXPECT_THAT( - content::EvalJs(GetActiveWebContents(), show_js, - content::EvalJsOptions::EXECUTE_SCRIPT_NO_USER_GESTURE) - .ExtractString(), - ::testing::HasSubstr(errors::kCannotShowWithoutUserActivation)); -} - // Test that activationless show() call is not allowed with the // PaymentRequetsAllowOneActivationlessShow feature disabled. class PaymentRequestActivationlessShowDisabledTest
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 3253e27..0825338 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -949,6 +949,13 @@ inline constexpr char kPrivacySandboxManuallyControlled[] = "privacy_sandbox.manually_controlled"; +// Deprecated 09/2023. +// Boolean value indicating whether the regular prefs were migrated to UPM +// settings for syncing users. +#if BUILDFLAG(IS_ANDROID) +const char kSettingsMigratedToUPM[] = "profile.settings_migrated_to_upm"; +#endif + // Register local state used only for migration (clearing or moving to a new // key). void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) { @@ -1330,6 +1337,9 @@ registry->RegisterBooleanPref(kSyncInitialSyncFeatureSetupCompleteOnAsh, false); #endif +#if BUILDFLAG(IS_ANDROID) + registry->RegisterBooleanPref(kSettingsMigratedToUPM, false); +#endif } } // namespace @@ -2500,6 +2510,9 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) profile_prefs->ClearPref(kSyncInitialSyncFeatureSetupCompleteOnAsh); #endif +#if BUILDFLAG(IS_ANDROID) + profile_prefs->ClearPref(kSettingsMigratedToUPM); +#endif // Please don't delete the following line. It is used by PRESUBMIT.py. // END_MIGRATE_OBSOLETE_PROFILE_PREFS
diff --git a/chrome/browser/prefs/chrome_pref_model_associator_client.cc b/chrome/browser/prefs/chrome_pref_model_associator_client.cc index 3e9c71c..33fe407 100644 --- a/chrome/browser/prefs/chrome_pref_model_associator_client.cc +++ b/chrome/browser/prefs/chrome_pref_model_associator_client.cc
@@ -22,28 +22,6 @@ ChromePrefModelAssociatorClient::~ChromePrefModelAssociatorClient() = default; -bool ChromePrefModelAssociatorClient::IsMergeableListPreference( - const std::string& pref_name) const { - return (pref_name == prefs::kURLsToRestoreOnStartup) || - (pref_name == prefs::kPinnedActions); -} - -bool ChromePrefModelAssociatorClient::IsMergeableDictionaryPreference( - const std::string& pref_name) const { - if (pref_name == sync_preferences::kSyncableMergeableDictPrefForTesting) { - CHECK_IS_TEST(); - return true; - } - - const content_settings::WebsiteSettingsRegistry& registry = - *content_settings::WebsiteSettingsRegistry::GetInstance(); - for (const content_settings::WebsiteSettingsInfo* info : registry) { - if (info->pref_name() == pref_name) - return true; - } - return false; -} - base::Value ChromePrefModelAssociatorClient::MaybeMergePreferenceValues( const std::string& pref_name, const base::Value& local_value,
diff --git a/chrome/browser/prefs/chrome_pref_model_associator_client.h b/chrome/browser/prefs/chrome_pref_model_associator_client.h index 15e7e29..808affef 100644 --- a/chrome/browser/prefs/chrome_pref_model_associator_client.h +++ b/chrome/browser/prefs/chrome_pref_model_associator_client.h
@@ -23,9 +23,6 @@ ~ChromePrefModelAssociatorClient() override; // sync_preferences::PrefModelAssociatorClient implementation. - bool IsMergeableListPreference(const std::string& pref_name) const override; - bool IsMergeableDictionaryPreference( - const std::string& pref_name) const override; base::Value MaybeMergePreferenceValues( const std::string& pref_name, const base::Value& local_value,
diff --git a/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java b/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java index c92ad08..e3c4953 100644 --- a/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java +++ b/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java
@@ -34,6 +34,7 @@ import android.app.Activity; import android.app.Instrumentation; import android.content.Intent; +import android.os.Build.VERSION_CODES; import android.view.View; import androidx.test.espresso.ViewInteraction; @@ -52,6 +53,7 @@ import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.HistogramWatcher; import org.chromium.base.test.util.UserActionTester; @@ -605,6 +607,8 @@ @EnableFeatures( {ChromeFeatureList.PRIVACY_GUIDE_POST_MVP, ChromeFeatureList.PRIVACY_GUIDE_ANDROID_3, ChromeFeatureList.PRIVACY_GUIDE_PRELOAD_ANDROID}) + @DisableIf.Build(message = "Flaky on P. See http://crbug.com/1487153", + sdk_is_greater_than = VERSION_CODES.O, sdk_is_less_than = VERSION_CODES.Q) public void testBackwardNavAllActionsPreloadPG3() { setMSBBState(false);
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.cc index 7ade89d..8ee9803 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.cc
@@ -18,6 +18,7 @@ #include "chrome/browser/content_settings/cookie_settings_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/tpcd/experiment/experiment_manager.h" #include "chrome/browser/tpcd/experiment/tpcd_experiment_features.h" #include "components/content_settings/core/browser/cookie_settings.h" #include "components/content_settings/core/common/content_settings.h" @@ -27,6 +28,7 @@ #include "components/privacy_sandbox/privacy_sandbox_prefs.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/tribool.h" +#include "content/public/common/content_features.h" #if BUILDFLAG(IS_ANDROID) #include "chrome/browser/android/webapps/webapp_registry.h" @@ -42,10 +44,18 @@ identity_manager->FindExtendedAccountInfo(core_account_info); return account_info.capabilities.can_run_chrome_privacy_sandbox_trials(); } + +const base::FeatureParam<bool> kCookieDeprecationUseProfileFiltering{ + &features::kCookieDeprecationFacilitatedTesting, "use_profile_filtering", + false}; + } // namespace -PrivacySandboxSettingsDelegate::PrivacySandboxSettingsDelegate(Profile* profile) - : profile_(profile) +PrivacySandboxSettingsDelegate::PrivacySandboxSettingsDelegate( + Profile* profile, + tpcd::experiment::ExperimentManager* experiment_manager) + : profile_(profile), + experiment_manager_(experiment_manager) #if BUILDFLAG(IS_ANDROID) , webapp_registry_(std::make_unique<WebappRegistry>()) @@ -160,16 +170,32 @@ bool PrivacySandboxSettingsDelegate::IsCookieDeprecationExperimentEligible() const { - // TODO(linnan): Returns the final client-level decision from - // `ExperimentManager`. - - // The 3PCD experiment eligibility persists for the browser session. - if (!is_cookie_deprecation_experiment_eligible_.has_value()) { - is_cookie_deprecation_experiment_eligible_ = - IsCookieDeprecationExperimentCurrentlyEligible(); + if (!base::FeatureList::IsEnabled( + features::kCookieDeprecationFacilitatedTesting)) { + return false; } - return *is_cookie_deprecation_experiment_eligible_; + if (!features::kCookieDeprecationFacilitatedTestingEnableOTRProfiles.Get() && + profile_->IsOffTheRecord()) { + return false; + } + + // Uses per-profile filtering if enabled. + if (kCookieDeprecationUseProfileFiltering.Get()) { + // The 3PCD experiment eligibility persists for the browser session. + if (!is_cookie_deprecation_experiment_eligible_.has_value()) { + is_cookie_deprecation_experiment_eligible_ = + IsCookieDeprecationExperimentCurrentlyEligible(); + } + + return *is_cookie_deprecation_experiment_eligible_; + } + + if (experiment_manager_) { + return experiment_manager_->IsClientEligible().value_or(false); + } + + return false; } bool PrivacySandboxSettingsDelegate::
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.h b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.h index 356e10a..dd56dc07 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.h +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.h
@@ -19,10 +19,16 @@ class WebappRegistry; #endif +namespace tpcd::experiment { +class ExperimentManager; +} // namespace tpcd::experiment + class PrivacySandboxSettingsDelegate : public privacy_sandbox::PrivacySandboxSettings::Delegate { public: - explicit PrivacySandboxSettingsDelegate(Profile* profile); + PrivacySandboxSettingsDelegate( + Profile* profile, + tpcd::experiment::ExperimentManager* experiment_manager); ~PrivacySandboxSettingsDelegate() override; // PrivacySandboxSettings::Delegate: @@ -62,6 +68,9 @@ // `IsCookieDeprecationExperimentEligible()` consults `ExperimentManager`. mutable absl::optional<bool> is_cookie_deprecation_experiment_eligible_; + // The experiment manager is a singleton and lives forever. + raw_ptr<tpcd::experiment::ExperimentManager> experiment_manager_; + #if BUILDFLAG(IS_ANDROID) std::unique_ptr<WebappRegistry> webapp_registry_; #endif
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc index 410f24f..1328b80 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc
@@ -16,8 +16,10 @@ #include "build/build_config.h" #include "build/buildflag.h" #include "chrome/browser/content_settings/cookie_settings_factory.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" #include "chrome/browser/supervised_user/supervised_user_test_util.h" +#include "chrome/browser/tpcd/experiment/mock_experiment_manager.h" #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" @@ -52,8 +54,10 @@ CreateProfileForIdentityTestEnvironment(); adapter_ = std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile_.get()); - delegate_ = - std::make_unique<PrivacySandboxSettingsDelegate>(profile_.get()); + experiment_manager_ = + std::make_unique<tpcd::experiment::MockExperimentManager>(); + delegate_ = std::make_unique<PrivacySandboxSettingsDelegate>( + profile_.get(), experiment_manager_.get()); } protected: @@ -89,12 +93,16 @@ sync_preferences::TestingPrefServiceSyncable* prefs() { return profile()->GetTestingPrefService(); } + tpcd::experiment::MockExperimentManager* experiment_manager() { + return experiment_manager_.get(); + } private: content::BrowserTaskEnvironment browser_task_environment_; base::test::ScopedFeatureList feature_list_; std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> adapter_; std::unique_ptr<TestingProfile> profile_; + std::unique_ptr<tpcd::experiment::MockExperimentManager> experiment_manager_; std::unique_ptr<PrivacySandboxSettingsDelegate> delegate_; }; @@ -415,20 +423,60 @@ #endif }; +// The parameter indicates whether to use per-profile filtering. +class CookieDeprecationExperimentEligibilityOTRProfileTest + : public PrivacySandboxSettingsDelegateTest, + public testing::WithParamInterface<bool> {}; + } // namespace +TEST_F(PrivacySandboxSettingsDelegateTest, IsEligible) { + feature_list()->InitAndEnableFeature( + features::kCookieDeprecationFacilitatedTesting); + + const struct { + const char* description; + absl::optional<bool> is_eligible; + bool expected_eligible; + } kTestCases[] = { + { + .description = "unknown", + .expected_eligible = false, + }, + { + .description = "eligible", + .is_eligible = true, + .expected_eligible = true, + }, + { + .description = "ineligible", + .is_eligible = false, + .expected_eligible = false, + }, + }; + + for (const auto& test_case : kTestCases) { + SCOPED_TRACE(test_case.description); + EXPECT_CALL(*experiment_manager(), IsClientEligible) + .WillOnce(::testing::Return(test_case.is_eligible)); + EXPECT_EQ(delegate()->IsCookieDeprecationExperimentEligible(), + test_case.expected_eligible); + } +} + TEST_P(CookieDeprecationExperimentEligibilityTest, IsEligible) { const CookieDeprecationExperimentEligibilityTestCase& test_case = GetParam(); + feature_list()->InitAndEnableFeatureWithParameters( + features::kCookieDeprecationFacilitatedTesting, + {{"use_profile_filtering", "true"}, + {"force_eligible", test_case.force_eligible ? "true" : "false"}}); + if (test_case.expected_eligible_before) { EXPECT_EQ(delegate()->IsCookieDeprecationExperimentEligible(), *test_case.expected_eligible_before); } - feature_list()->InitAndEnableFeatureWithParameters( - features::kCookieDeprecationFacilitatedTesting, - {{"force_eligible", test_case.force_eligible ? "true" : "false"}}); - if (test_case.is_subject_to_enterprise_policies.has_value()) { // Sign the user in. identity_test_env()->MakePrimaryAccountAvailable( @@ -477,3 +525,48 @@ CookieDeprecationExperimentEligibility, CookieDeprecationExperimentEligibilityTest, ::testing::ValuesIn(kCookieDeprecationExperimentEligibilityTestCases)); + +TEST_P(CookieDeprecationExperimentEligibilityOTRProfileTest, IsEligible) { + Profile* off_the_record_profile = profile()->GetOffTheRecordProfile( + Profile::OTRProfileID::CreateUniqueForTesting(), + /*create_if_needed=*/true); + PrivacySandboxSettingsDelegate delegate_under_test(off_the_record_profile, + experiment_manager()); + + const bool use_profile_filtering = GetParam(); + + const char* use_profile_filtering_param = + use_profile_filtering ? "true" : "false"; + + { + feature_list()->InitAndEnableFeatureWithParameters( + features::kCookieDeprecationFacilitatedTesting, + {{"force_eligible", "true"}, + {"use_profile_filtering", use_profile_filtering_param}, + {"enable_otr_profiles", "true"}}); + + if (!use_profile_filtering) { + EXPECT_CALL(*experiment_manager(), IsClientEligible) + .WillOnce(::testing::Return(true)); + } else { + EXPECT_CALL(*experiment_manager(), IsClientEligible).Times(0); + } + + EXPECT_TRUE(delegate_under_test.IsCookieDeprecationExperimentEligible()); + feature_list()->Reset(); + } + + { + feature_list()->InitAndEnableFeatureWithParameters( + features::kCookieDeprecationFacilitatedTesting, + {{"force_eligible", "true"}, + {"use_profile_filtering", use_profile_filtering_param}, + {"enable_otr_profiles", "false"}}); + EXPECT_FALSE(delegate_under_test.IsCookieDeprecationExperimentEligible()); + feature_list()->Reset(); + } +} + +INSTANTIATE_TEST_SUITE_P(All, + CookieDeprecationExperimentEligibilityOTRProfileTest, + testing::Bool());
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.cc index be958fd..2e3ea00 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.h" #include "chrome/browser/privacy_sandbox/tracking_protection_settings_factory.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/tpcd/experiment/experiment_manager_impl.h" #include "components/content_settings/core/browser/cookie_settings.h" #include "components/keyed_service/core/keyed_service.h" #include "components/privacy_sandbox/privacy_sandbox_settings_impl.h" @@ -51,7 +52,9 @@ Profile* profile = Profile::FromBrowserContext(context); return std::make_unique<privacy_sandbox::PrivacySandboxSettingsImpl>( - std::make_unique<PrivacySandboxSettingsDelegate>(profile), + std::make_unique<PrivacySandboxSettingsDelegate>( + profile, + tpcd::experiment::ExperimentManagerImpl::GetForProfile(profile)), HostContentSettingsMapFactory::GetForProfile(profile), CookieSettingsFactory::GetForProfile(profile), TrackingProtectionSettingsFactory::GetForProfile(profile),
diff --git a/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_microphone_subpage.html b/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_microphone_subpage.html index bfe81806..b31afac7 100644 --- a/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_microphone_subpage.html +++ b/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_microphone_subpage.html
@@ -6,6 +6,20 @@ #onOffText[on] { color: var(--cros-text-color-prominent); } + + .subsection { + padding-inline-end: var(--cr-section-padding); + padding-inline-start: var(--cr-section-indent-padding); + } + + .subsection > cr-link-row { + padding-inline-end: 0; + padding-inline-start: 0; + } + + h2 { + padding-inline-start: var(--cr-section-padding); + } </style> <div class="settings-box first"> <div class="start settings-box-text" aria-hidden="true"> @@ -49,3 +63,20 @@ </template> </div> </template> +<div class="hr"></div> +<div id="websitesSection"> + <h2 id="websitesSectionTitle">$i18n{websitesSectionTitle}</h2> + <cr-link-row + id="managePermissionsInChromeRow" + class="subsection" + start-icon="os-settings:chrome" + label="$i18n{manageMicPermissionsInChromeText}" + on-click="onManagePermissionsInChromeRowClick_" + hidden="[[!prefs.ash.user.microphone_allowed.value]]" + external> + </cr-link-row> + <div id="noWebsiteHasAccessText" class="settings-box-text subsection" + hidden="[[prefs.ash.user.microphone_allowed.value]]"> + $i18n{noWebsiteCanUseMicText} + </div> +</div>
diff --git a/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_microphone_subpage.ts b/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_microphone_subpage.ts index 2293b6cf..688af8e 100644 --- a/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_microphone_subpage.ts +++ b/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_microphone_subpage.ts
@@ -134,6 +134,10 @@ private computeShouldDisableMicrophoneToggle_(): boolean { return this.microphoneHardwareToggleActive_ || this.isMicListEmpty_; } + + private onManagePermissionsInChromeRowClick_(): void { + window.open('chrome://settings/content/microphone'); + } } declare global {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler.js index 9210af3..e924b55 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler.js
@@ -15,7 +15,6 @@ import {TtsSpeechProperties} from '../common/tts_types.js'; import {ChromeVoxRange} from './chromevox_range.js'; -import {ChromeVoxState} from './chromevox_state.js'; import {CommandHandlerInterface} from './command_handler_interface.js'; // setTimeout and its clean-up are referencing each other. So, we need to set @@ -61,8 +60,7 @@ * @param {?AutomationPredicate.Unary} pred The predicate to match. * @param {?CursorUnit} unit The unit to navigate by. * @param {?TtsSpeechProperties} speechProps The optional speech properties - * given to |navigateToRange| to provide feedback from the current - * command. + * given to |navigateTo| to provide feedback from the current command. * @param {AutomationPredicate.Unary} rootPred The predicate that expresses * the current navigation root. * @param {Function} retryCommandFunc The callback used to retry the command @@ -215,7 +213,7 @@ * @param {?AutomationPredicate.Unary} pred The predicate to match. * @param {?CursorUnit} unit The unit to navigate by. * @param {?TtsSpeechProperties} speechProps The optional speech properties - * given to |navigateToRange| to provide feedback of the current command. + * given to |navigateTo| to provide feedback of the current command. * @param {AutomationPredicate.Unary} rootPred The predicate that expresses * the current navigation root. * @param {Function} retryCommandFunc The callback used to retry the command @@ -228,7 +226,7 @@ await this.scrollInDirection_(this.scrollingNode_, dir); if (!scrollResult) { this.isScrolling_ = false; - ChromeVoxState.instance.navigateToRange(target, false, speechProps); + ChromeVoxRange.navigateTo(target, false, speechProps); return; } @@ -255,8 +253,7 @@ const nextRange = this.handleScrollingInAndroidRecyclerView_( pred, unit, dir, rootPred, this.scrollingNode_); - ChromeVoxState.instance.navigateToRange( - nextRange ?? target, false, speechProps); + ChromeVoxRange.navigateTo(nextRange ?? target, false, speechProps); return; }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler_test.js index fb092a8..73bc8646 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler_test.js
@@ -18,7 +18,7 @@ importModule( 'AutoScrollHandler', '/chromevox/background/auto_scroll_handler.js'), importModule( - 'ChromeVoxState', '/chromevox/background/chromevox_state.js'), + 'ChromeVoxRange', '/chromevox/background/chromevox_range.js'), importModule('CursorRange', '/common/cursors/range.js'), ]); @@ -180,7 +180,7 @@ const firstItemCursor = CursorRange.fromNode(list.firstChild); const lastItemCursor = CursorRange.fromNode(list.lastChild); - ChromeVoxState.instance.navigateToRange(firstItemCursor); + ChromeVoxRange.navigateTo(firstItemCursor); assertTrue(handler.onCommandNavigation( lastItemCursor, constants.Dir.FORWARD, /*pred=*/ null, @@ -198,7 +198,7 @@ const firstItemCursor = CursorRange.fromNode(list.firstChild); const lastItemCursor = CursorRange.fromNode(list.lastChild); - ChromeVoxState.instance.navigateToRange(lastItemCursor); + ChromeVoxRange.navigateTo(lastItemCursor); // Make scrolling action void, so that the second invocation should be // ignored.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js index c55da62..b04c081 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -4,7 +4,6 @@ import {AutomationPredicate} from '../../common/automation_predicate.js'; import {AutomationUtil} from '../../common/automation_util.js'; -import {constants} from '../../common/constants.js'; import {CursorRange} from '../../common/cursors/range.js'; import {Flags} from '../../common/flags.js'; import {InstanceChecker} from '../../common/instance_checker.js'; @@ -32,7 +31,6 @@ import {DownloadHandler} from './download_handler.js'; import {Earcons} from './earcons.js'; import {DesktopAutomationHandler} from './event/desktop_automation_handler.js'; -import {DesktopAutomationInterface} from './event/desktop_automation_interface.js'; import {FocusAutomationHandler} from './event/focus_automation_handler.js'; import {MediaAutomationHandler} from './event/media_automation_handler.js'; import {PageLoadSoundHandler} from './event/page_load_sound_handler.js'; @@ -45,9 +43,6 @@ import {EventStreamLogger} from './logging/event_stream_logger.js'; import {LogStore} from './logging/log_store.js'; import {LogUrlWatcher} from './logging/log_url_watcher.js'; -import {MathHandler} from './math_handler.js'; -import {Output} from './output/output.js'; -import {OutputCustomEvent} from './output/output_types.js'; import {PanelBackground} from './panel/panel_background.js'; import {ChromeVoxPrefs} from './prefs.js'; import {SmartStickyMode} from './smart_sticky_mode.js'; @@ -57,7 +52,6 @@ * @fileoverview The entry point for all ChromeVox related code for the * background page. */ -const Dir = constants.Dir; const RoleType = chrome.automation.RoleType; const StateType = chrome.automation.StateType; @@ -177,107 +171,6 @@ this.pageSel_ = newPageSel; } - /** - * Navigate to the given range - it both sets the range and outputs it. - * @param {!CursorRange} range The new range. - * @param {boolean=} opt_focus Focus the range; defaults to true. - * @param {TtsSpeechProperties=} opt_speechProps Speech properties. - * @param {boolean=} opt_skipSettingSelection If true, does not set - * the selection, otherwise it does by default. - * @override - */ - navigateToRange(range, opt_focus, opt_speechProps, opt_skipSettingSelection) { - opt_focus = opt_focus ?? true; - opt_speechProps = opt_speechProps ?? new TtsSpeechProperties(); - opt_skipSettingSelection = opt_skipSettingSelection ?? false; - const prevRange = ChromeVoxRange.getCurrentRangeWithoutRecovery(); - - // Specialization for math output. - let skipOutput = false; - if (MathHandler.init(range)) { - skipOutput = MathHandler.instance.speak(); - opt_focus = false; - } - - if (opt_focus) { - ChromeVoxState.instance.setFocusToRange(range, prevRange); - } - - ChromeVoxRange.set(range); - - const o = new Output(); - let selectedRange; - let msg; - - if (ChromeVoxState.instance.pageSel?.isValid() && range.isValid()) { - // Suppress hints. - o.withoutHints(); - - // Selection across roots isn't supported. - const pageRootStart = ChromeVoxState.instance.pageSel.start.node.root; - const pageRootEnd = ChromeVoxState.instance.pageSel.end.node.root; - const curRootStart = range.start.node.root; - const curRootEnd = range.end.node.root; - - // Deny crossing over the start of the page selection and roots. - if (pageRootStart !== pageRootEnd || pageRootStart !== curRootStart || - pageRootEnd !== curRootEnd) { - o.format('@end_selection'); - DesktopAutomationInterface.instance.ignoreDocumentSelectionFromAction( - false); - ChromeVoxState.instance.pageSel = null; - } else { - // Expand or shrink requires different feedback. - - // Page sel is the only place in ChromeVox where we used directed - // selections. It is important to keep track of the directedness in - // places, but when comparing to other ranges, take the undirected - // range. - const dir = ChromeVoxState.instance.pageSel.normalize().compare(range); - - if (dir) { - // Directed expansion. - msg = '@selected'; - } else { - // Directed shrink. - msg = '@unselected'; - selectedRange = prevRange; - } - const wasBackwardSel = - ChromeVoxState.instance.pageSel.start.compare( - ChromeVoxState.instance.pageSel.end) === Dir.BACKWARD || - dir === Dir.BACKWARD; - ChromeVoxState.instance.pageSel = new CursorRange( - ChromeVoxState.instance.pageSel.start, - wasBackwardSel ? range.start : range.end); - ChromeVoxState.instance.pageSel?.select(); - } - } else if (!opt_skipSettingSelection) { - // Ensure we don't select the editable when we first encounter it. - let lca = null; - if (range.start.node && prevRange.start.node) { - lca = AutomationUtil.getLeastCommonAncestor( - prevRange.start.node, range.start.node); - } - if (!lca || lca.state[StateType.EDITABLE] || - !range.start.node.state[StateType.EDITABLE]) { - range.select(); - } - } - - o.withRichSpeechAndBraille( - selectedRange ?? range, prevRange, OutputCustomEvent.NAVIGATE) - .withInitialSpeechProperties(opt_speechProps); - - if (msg) { - o.format(msg); - } - - if (!skipOutput) { - o.go(); - } - } - /** @override */ onBrailleKeyEvent(evt, content) { return BrailleCommandHandler.onBrailleKeyEvent(evt, content);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_range.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_range.js index 30a373e..3dc105b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_range.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_range.js
@@ -6,15 +6,23 @@ * @fileoverview Classes that handle the ChromeVox range. */ import {AutomationUtil} from '../../common/automation_util.js'; +import {constants} from '../../common/constants.js'; import {CursorRange} from '../../common/cursors/range.js'; import {BridgeConstants} from '../common/bridge_constants.js'; import {BridgeHelper} from '../common/bridge_helper.js'; +import {TtsSpeechProperties} from '../common/tts_types.js'; import {ChromeVox} from './chromevox.js'; import {ChromeVoxState} from './chromevox_state.js'; +import {DesktopAutomationInterface} from './event/desktop_automation_interface.js'; import {FocusBounds} from './focus_bounds.js'; +import {MathHandler} from './math_handler.js'; +import {Output} from './output/output.js'; +import {OutputCustomEvent} from './output/output_types.js'; +const Dir = constants.Dir; const RoleType = chrome.automation.RoleType; +const StateType = chrome.automation.StateType; const Action = BridgeConstants.ChromeVoxRange.Action; const TARGET = BridgeConstants.ChromeVoxRange.TARGET; @@ -121,6 +129,19 @@ }); } + /** + * Navigate to the given range - it both sets the range and outputs it. + * @param {!CursorRange} range The new range. + * @param {boolean=} opt_focus Focus the range; defaults to true. + * @param {TtsSpeechProperties=} opt_speechProps Speech properties. + * @param {boolean=} opt_skipSettingSelection If true, does not set + * the selection, otherwise it does by default. + */ + static navigateTo( + range, opt_focus, opt_speechProps, opt_skipSettingSelection) { + ChromeVoxRange.instance.navigateTo_(...arguments); + } + // ================= Observer Functions ================= /** @param {ChromeVoxRangeObserver} observer */ @@ -139,6 +160,106 @@ // ================= Private Methods ================= /** + * Navigate to the given range - it both sets the range and outputs it. + * @param {!CursorRange} range The new range. + * @param {boolean=} opt_focus Focus the range; defaults to true. + * @param {TtsSpeechProperties=} opt_speechProps Speech properties. + * @param {boolean=} opt_skipSettingSelection If true, does not set + * the selection, otherwise it does by default. + */ + navigateTo_(range, opt_focus, opt_speechProps, opt_skipSettingSelection) { + opt_focus = opt_focus ?? true; + opt_speechProps = opt_speechProps ?? new TtsSpeechProperties(); + opt_skipSettingSelection = opt_skipSettingSelection ?? false; + const prevRange = ChromeVoxRange.getCurrentRangeWithoutRecovery(); + + // Specialization for math output. + let skipOutput = false; + if (MathHandler.init(range)) { + skipOutput = MathHandler.instance.speak(); + opt_focus = false; + } + + if (opt_focus) { + ChromeVoxState.instance.setFocusToRange(range, prevRange); + } + + ChromeVoxRange.set(range); + + const o = new Output(); + let selectedRange; + let msg; + + if (ChromeVoxState.instance.pageSel?.isValid() && range.isValid()) { + // Suppress hints. + o.withoutHints(); + + // Selection across roots isn't supported. + // ADD CONST BACK + const pageRootStart = ChromeVoxState.instance.pageSel.start.node.root; + const pageRootEnd = ChromeVoxState.instance.pageSel.end.node.root; + const curRootStart = range.start.node.root; + const curRootEnd = range.end.node.root; + + // Deny crossing over the start of the page selection and roots. + if (pageRootStart !== pageRootEnd || pageRootStart !== curRootStart || + pageRootEnd !== curRootEnd) { + o.format('@end_selection'); + DesktopAutomationInterface.instance.ignoreDocumentSelectionFromAction( + false); + ChromeVoxState.instance.pageSel = null; + } else { + // Expand or shrink requires different feedback. + + // Page sel is the only place in ChromeVox where we used directed + // selections. It is important to keep track of the directedness in + // places, but when comparing to other ranges, take the undirected + // range. + const dir = ChromeVoxState.instance.pageSel.normalize().compare(range); + if (dir) { + // Directed expansion. + msg = '@selected'; + } else { + // Directed shrink. + msg = '@unselected'; + selectedRange = prevRange; + } + const wasBackwardSel = + ChromeVoxState.instance.pageSel.start.compare( + ChromeVoxState.instance.pageSel.end) === Dir.BACKWARD || + dir === Dir.BACKWARD; + ChromeVoxState.instance.pageSel = new CursorRange( + ChromeVoxState.instance.pageSel.start, + wasBackwardSel ? range.start : range.end); + ChromeVoxState.instance.pageSel?.select(); + } + } else if (!opt_skipSettingSelection) { + // Ensure we don't select the editable when we first encounter it. + let lca = null; + if (range.start.node && prevRange.start.node) { + lca = AutomationUtil.getLeastCommonAncestor( + prevRange.start.node, range.start.node); + } + if (!lca || lca.state[StateType.EDITABLE] || + !range.start.node.state[StateType.EDITABLE]) { + range.select(); + } + } + + o.withRichSpeechAndBraille( + selectedRange ?? range, prevRange, OutputCustomEvent.NAVIGATE) + .withInitialSpeechProperties(opt_speechProps); + + if (msg) { + o.format(msg); + } + + if (!skipOutput) { + o.go(); + } + } + + /** * @param {?CursorRange} range The new range. * @param {boolean=} opt_fromEditing * @private
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js index 0e1ccfd..6f552787 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js
@@ -48,17 +48,6 @@ set pageSel(newPageSel) {} /** - * Navigate to the given range - it both sets the range and outputs it. - * @param {!CursorRange} range The new range. - * @param {boolean=} opt_focus Focus the range; defaults to true. - * @param {TtsSpeechProperties=} opt_speechProps Speech properties. - * @param {boolean=} opt_skipSettingSelection If true, does not set - * the selection, otherwise it does by default. - */ - navigateToRange(range, opt_focus, opt_speechProps, opt_skipSettingSelection) { - } - - /** * Restores the last valid ChromeVox range. */ restoreLastValidRangeIfNeeded() {}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js index 6cef426..b56d10e 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
@@ -809,7 +809,7 @@ ChromeVox.earcons.playEarcon(EarconId.WRAP); } - ChromeVoxState.instance.navigateToRange( + ChromeVoxRange.navigateTo( currentRange, undefined, speechProps, skipSettingSelection); } @@ -1091,7 +1091,7 @@ actionNode = actionNode.parent; } if (actionNode.inPageLinkTarget) { - ChromeVoxState.instance.navigateToRange( + ChromeVoxRange.navigateTo( CursorRange.fromNode(actionNode.inPageLinkTarget)); return; }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/text_edit_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/text_edit_handler.js index b45697c..3c6fec7e 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/text_edit_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/text_edit_handler.js
@@ -7,7 +7,7 @@ import {constants} from '../../../common/constants.js'; import {CursorRange} from '../../../common/cursors/range.js'; import {ChromeVoxEvent} from '../../common/custom_automation_event.js'; -import {ChromeVoxState} from '../chromevox_state.js'; +import {ChromeVoxRange} from '../chromevox_range.js'; import {EditableLine} from './editable_line.js'; import {AutomationEditableText} from './editable_text.js'; @@ -149,8 +149,7 @@ const after = AutomationUtil.findNextNode( this.node_, Dir.FORWARD, AutomationPredicate.object, {skipInitialSubtree: true}); - ChromeVoxState.instance.navigateToRange( - CursorRange.fromNode(after ?? this.node_)); + ChromeVoxRange.navigateTo(CursorRange.fromNode(after ?? this.node_)); } /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js index 3a97b9a..414ca53aa 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js
@@ -17,7 +17,6 @@ import {QueueMode} from '../../common/tts_types.js'; import {ChromeVox} from '../chromevox.js'; import {ChromeVoxRange, ChromeVoxRangeObserver} from '../chromevox_range.js'; -import {ChromeVoxState} from '../chromevox_state.js'; import {Output} from '../output/output.js'; import {OutputCustomEvent} from '../output/output_types.js'; @@ -245,7 +244,7 @@ if (!node) { return; } - ChromeVoxState.instance.navigateToRange(CursorRange.fromNode(node)); + ChromeVoxRange.navigateTo(CursorRange.fromNode(node)); } /** @override */
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js index 62704f5..1d1e059 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js
@@ -16,7 +16,7 @@ import {Msgs} from '../../common/msgs.js'; import {PanelBridge} from '../../common/panel_bridge.js'; import {PanelNodeMenuData, PanelNodeMenuId, PanelNodeMenuItemData} from '../../common/panel_menu_data.js'; -import {ChromeVoxState} from '../chromevox_state.js'; +import {ChromeVoxRange} from '../chromevox_range.js'; import {Output} from '../output/output.js'; import {OutputCustomEvent} from '../output/output_types.js'; @@ -104,8 +104,7 @@ const callbackId = new BridgeCallbackId( BridgeContext.BACKGROUND, - () => ChromeVoxState.instance.navigateToRange( - CursorRange.fromNode(node))); + () => ChromeVoxRange.navigateTo(CursorRange.fromNode(node))); const isActive = node === this.node_ && this.isActivated_; const menuId = this.menuId_; this.addMenuItemFromData_({title, callbackId, isActive, menuId});
diff --git a/chrome/browser/resources/chromeos/login/screens.js b/chrome/browser/resources/chromeos/login/screens.js index 9c35db04..b5a2afb 100644 --- a/chrome/browser/resources/chromeos/login/screens.js +++ b/chrome/browser/resources/chromeos/login/screens.js
@@ -129,7 +129,10 @@ {tag: 'marketing-opt-in-element', id: 'marketing-opt-in'}, {tag: 'multidevice-setup-element', id: 'multidevice-setup-screen'}, {tag: 'offline-ad-login-element', id: 'offline-ad-login'}, - { tag: 'online-authentication-screen-element', id: 'online-authentication-screen' }, + { + tag: 'online-authentication-screen-element', + id: 'online-authentication-screen', + }, {tag: 'oobe-reset-element', id: 'reset'}, { tag: 'os-install-element', @@ -141,7 +144,7 @@ { tag: 'password-selection-element', id: 'password-selection', - condition: 'isPasswordSelectionEnabledInOobe', + condition: 'isOobeConsumersLocalPasswordsEnabled', }, {tag: 'pin-setup-element', id: 'pin-setup'}, {tag: 'recommend-apps-element', id: 'recommend-apps'},
diff --git a/chrome/browser/resources/settings/safety_hub/notification_permissions_module.html b/chrome/browser/resources/settings/safety_hub/notification_permissions_module.html index 0ed7ea8..a9151a3 100644 --- a/chrome/browser/resources/settings/safety_hub/notification_permissions_module.html +++ b/chrome/browser/resources/settings/safety_hub/notification_permissions_module.html
@@ -10,8 +10,11 @@ on-sh-module-more-action-button-click="onMoreActionClick_" header="[[headerString_]]" subheader="[[subheaderString_]]" + button-aria-label-id="safetyCheckNotificationPermissionReviewDontAllowAriaLabel" button-icon="cr20:block" + button-tooltip-text="$i18n{safetyCheckNotificationPermissionReviewDontAllowLabel}" more-action-visible + more-button-aria-label-id="safetyCheckNotificationPermissionReviewMoreActionsAriaLabel" sites="[[sites_]]"> <div slot="button-container"> <cr-button id="blockAllButton" on-click="onBlockAllClick_" @@ -45,7 +48,8 @@ </cr-action-menu> <cr-toast id="undoToast" duration="5000"> <div id="undoNotification">[[toastText_]]</div> - <cr-button id="toastUndoButton" on-click="onUndoClick_"> + <cr-button id="toastUndoButton" on-click="onUndoClick_" + aria-label="$i18n{safetyCheckNotificationPermissionReviewUndo}"> $i18n{safetyCheckNotificationPermissionReviewUndo} </cr-button> </cr-toast>
diff --git a/chrome/browser/resources/settings/safety_hub/safety_hub_module.html b/chrome/browser/resources/settings/safety_hub/safety_hub_module.html index aa2fb91..a7474ea 100644 --- a/chrome/browser/resources/settings/safety_hub/safety_hub_module.html +++ b/chrome/browser/resources/settings/safety_hub/safety_hub_module.html
@@ -116,6 +116,10 @@ .showing { animation-direction: reverse; } + + paper-tooltip { + --paper-tooltip-min-width: max-content; + } </style> <div id="header-wrapper"> @@ -147,16 +151,22 @@ </div> <template is="dom-if" if="[[buttonIcon]]"> <cr-icon-button iron-icon="[[buttonIcon]]" id="mainButton" - on-click="onItemButtonClick_" actionable> + on-click="onItemButtonClick_" actionable + aria-label$="[[getButtonAriaLabelForOrigin_(item.origin)]]" + on-focus="onShowTooltip_" on-mouseenter="onShowTooltip_"> </cr-icon-button> </template> <template is="dom-if" if="[[moreActionVisible]]"> <cr-icon-button class="icon-more-vert" id="moreActionButton" on-click="onMoreActionClick_" title="$i18n{moreActions}" + aria-label$="[[getMoreButtonAriaLabelForOrigin_(item.origin)]]" actionable> </cr-icon-button> </template> </div> </template> </div> + <paper-tooltip fit-to-visible-bounds manual-mode position="top" offset="3"> + [[buttonTooltipText]] + </paper-tooltip> </template>
diff --git a/chrome/browser/resources/settings/safety_hub/safety_hub_module.ts b/chrome/browser/resources/settings/safety_hub/safety_hub_module.ts index 39fae2b63..424d3ba 100644 --- a/chrome/browser/resources/settings/safety_hub/safety_hub_module.ts +++ b/chrome/browser/resources/settings/safety_hub/safety_hub_module.ts
@@ -10,12 +10,18 @@ import 'chrome://resources/cr_elements/cr_button/cr_button.js'; import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js'; import 'chrome://resources/cr_elements/cr_shared_style.css.js'; +import 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js'; import '../settings_shared.css.js'; import '../site_favicon.js'; +import '../i18n_setup.js'; +import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; +import {assert} from 'chrome://resources/js/assert_ts.js'; import {sanitizeInnerHtml} from 'chrome://resources/js/parse_html_subset.js'; import {DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {TooltipMixin} from '../tooltip_mixin.js'; + import {getTemplate} from './safety_hub_module.html.js'; /** @@ -36,7 +42,11 @@ target: EventTarget; } -export class SettingsSafetyHubModuleElement extends PolymerElement { +const SettingsSafetyHubModuleElementBase = + TooltipMixin(I18nMixin(PolymerElement)); + +export class SettingsSafetyHubModuleElement extends + SettingsSafetyHubModuleElementBase { static get is() { return 'settings-safety-hub-module'; } @@ -66,14 +76,24 @@ value: 'cr:error', }, - // The icon for button of the list item. + // The icon for the button of the list item. buttonIcon: String, + // The string ID for the aria label for the button of the list item. + buttonAriaLabelId: String, + + // The string for the tooltip for the button of the list item. + buttonTooltipText: String, + // Whether the more action button is visible. moreActionVisible: { type: Boolean, value: false, }, + + // The string ID for the aria label for the more action button of the list + // item. + moreButtonAriaLabelId: String, }; } @@ -82,6 +102,9 @@ subheader: string|TrustedHTML; headerIcon: string; buttonIcon: string; + buttonAriaLabelId: string; + buttonTooltipText: string; + moreButtonAriaLabelId: string; moreActionVisible: boolean; private modelUpdateDelayMsForTesting_: number|null = null; @@ -238,9 +261,24 @@ })); } + private onShowTooltip_(e: DomRepeatEvent<SiteInfo>) { + e.stopPropagation(); + const tooltip = this.shadowRoot!.querySelector('paper-tooltip'); + assert(tooltip); + this.showTooltipAtTarget(tooltip, e.target!); + } + private sanitizeInnerHtml_(rawString: string): TrustedHTML { return sanitizeInnerHtml(rawString); } + + private getButtonAriaLabelForOrigin_(origin: string): string { + return this.i18n(this.buttonAriaLabelId, origin); + } + + private getMoreButtonAriaLabelForOrigin_(origin: string): string { + return this.i18n(this.moreButtonAriaLabelId, origin); + } } declare global {
diff --git a/chrome/browser/resources/settings/safety_hub/unused_site_permissions_module.html b/chrome/browser/resources/settings/safety_hub/unused_site_permissions_module.html index 6fde750..66e062ca 100644 --- a/chrome/browser/resources/settings/safety_hub/unused_site_permissions_module.html +++ b/chrome/browser/resources/settings/safety_hub/unused_site_permissions_module.html
@@ -9,7 +9,9 @@ on-sh-module-item-button-click="onAllowAgainClick_" header="[[headerString_]]" subheader="[[subheaderString_]]" + button-aria-label-id="safetyCheckUnusedSitePermissionsAllowAgainAriaLabel" button-icon="settings20:undo" + button-tooltip-text="$i18n{safetyCheckUnusedSitePermissionsAllowAgainLabel}" sites="[[sites_]]"> <div slot="button-container"> <cr-button id="gotItButton" on-click="onGotItClick_"
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.html b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.html index 017ca68..975436c 100644 --- a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.html +++ b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.html
@@ -41,6 +41,7 @@ } .dropdown-voice-selection p { margin: 8px 0; + display: inline; } /* TODO(b/1465029): Investigate why chrome refresh colors don't always work on first launch. */ @@ -50,6 +51,9 @@ .back, .section { font-weight: bold; } + .item-invisible-true { + visibility: hidden; + } #font-size-decrease { margin-left: 16px; } @@ -147,11 +151,15 @@ <template is="dom-repeat" items="[[voiceSelectionOptions_]]"> <!-- TODO(crbug.com/1474951): show a header for each locale group before listing the languages of the locale --> - <!-- TODO(crbug.com/1474951): show currently selected language --> <!-- TODO(crbug.com/1474951): allow user to change language --> <button class="dropdown-item dropdown-voice-selection" on-click="onVoiceSelectClick_"> - <p>[[item.title]]</p> + <span> + <iron-icon + class$="button-image item-invisible-[[!item.data.selected]]" + icon="read-anything:check-mark"></iron-icon> + <p>[[item.title]]</p> + </span> <!-- TODO(crbug.com/1474951): Show pause button when a preview is playing --> <cr-icon-button on-click="onVoicePreviewClick_" class="button-image"
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts index 53e32ea..bb6355f 100644 --- a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts +++ b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts
@@ -33,6 +33,11 @@ }; } +interface VoiceDropdown { + voice: SpeechSynthesisVoice; + selected: boolean; +} + interface MenuStateItem<T> { title: string; icon: string; @@ -230,8 +235,7 @@ }, ]; - private voiceSelectionOptions_: Array<MenuStateItem<SpeechSynthesisVoice>> = - []; + private voiceSelectionOptions_: Array<MenuStateItem<VoiceDropdown>> = []; private rateOptions_: number[] = [0.5, 0.8, 1, 1.2, 1.5, 2, 3, 4]; @@ -411,19 +415,35 @@ this.openMenu_(this.$.rateMenu, event.target as HTMLElement); } + private voicesAreEqual_( + voice1?: SpeechSynthesisVoice, voice2?: SpeechSynthesisVoice): boolean { + if (!voice1 || !voice2) { + return false; + } + return voice1.default === voice2.default && voice1.lang === voice2.lang && + voice1.localService === voice2.localService && + voice1.name === voice2.name && voice1.voiceURI === voice2.voiceURI; + } // TODO(crbug.com/1474951): Add unit tests private onVoiceSelectionMenuClick_(event: MouseEvent) { if (this.contentPage) { const voices = this.contentPage.getVoices(); + const selectedVoice = this.contentPage.getSpeechSynthesisVoice(); + this.voiceSelectionOptions_ = Object.entries(voices).reduce( - (aggregateVoiceList: Array<MenuStateItem<SpeechSynthesisVoice>>, + (aggregateVoiceList: Array<MenuStateItem<VoiceDropdown>>, [_, voiceListForLang]) => ([ ...aggregateVoiceList, ...(voiceListForLang).map(speechSynthesisVoice => ({ title: speechSynthesisVoice.name, icon: '', - data: speechSynthesisVoice, + data: { + voice: speechSynthesisVoice, + selected: this.voicesAreEqual_( + selectedVoice, + speechSynthesisVoice), + }, callback: () => {}, })), ]), @@ -502,23 +522,31 @@ } private onVoiceSelectClick_( - event: DomRepeatEvent<MenuStateItem<SpeechSynthesisVoice>>) { + event: DomRepeatEvent<MenuStateItem<VoiceDropdown>>) { // TODO(crbug.com/1474951): Save voice to prefs. if (this.contentPage) { - this.contentPage.setSpeechSynthesisVoice(event.model.item.data); + const selectedVoice = event.model.item.data.voice; + this.contentPage.setSpeechSynthesisVoice(selectedVoice); + this.voiceSelectionOptions_ = this.voiceSelectionOptions_.map( + ({data, ...rest}) => ({ + ...rest, + data: { + voice: data.voice, + selected: this.voicesAreEqual_(selectedVoice, data.voice), + }, + })); } } private onVoicePreviewClick_( - event: DomRepeatEvent<MenuStateItem<SpeechSynthesisVoice>>) { + event: DomRepeatEvent<MenuStateItem<VoiceDropdown>>) { // Because the preview button is layered onto the voice-selection button, // the onVoiceSelectClick_() listener is also subscribed to this event. This // line is to make sure that the voice-selection callback is not triggered. event.stopImmediatePropagation(); if (this.contentPage) { - this.contentPage.previewSpeechSynthesisVoice( - event.model.item.data as SpeechSynthesisVoice); + this.contentPage.previewSpeechSynthesisVoice(event.model.item.data.voice); } }
diff --git a/chrome/browser/safe_browsing/ohttp_key_service_factory.cc b/chrome/browser/safe_browsing/ohttp_key_service_factory.cc index 98743bd2..d45e9fb 100644 --- a/chrome/browser/safe_browsing/ohttp_key_service_factory.cc +++ b/chrome/browser/safe_browsing/ohttp_key_service_factory.cc
@@ -52,7 +52,9 @@ return nullptr; } if (!base::FeatureList::IsEnabled(kHashRealTimeOverOhttp) && - !hash_realtime_utils::IsHashRealTimeLookupEligibleInSession()) { + !hash_realtime_utils::IsHashRealTimeLookupEligibleInSessionAndLocation( + safe_browsing::hash_realtime_utils::GetCountryCode( + g_browser_process->variations_service()))) { return nullptr; } Profile* profile = Profile::FromBrowserContext(context);
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc index 2e965ab..7c9329b 100644 --- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc +++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
@@ -3894,7 +3894,8 @@ "SafeBrowsing.BrowserThrottle.TotalDelay2.HashPrefixDatabaseCheck", /*expected_count=*/0); histogram_tester.ExpectUniqueSample( - "SafeBrowsing.HPRT.Ineligible.IneligibleForSession", /*sample=*/false, + "SafeBrowsing.HPRT.Ineligible.IneligibleForSessionOrLocation", + /*sample=*/false, /*expected_bucket_count=*/1); histogram_tester.ExpectTotalCount( "interstitial.phishing.decision.from_hash_prefix_real_time_check_v5", @@ -3912,7 +3913,8 @@ "SafeBrowsing.BrowserThrottle.TotalDelay2.HashPrefixDatabaseCheck", /*expected_count=*/0); histogram_tester.ExpectUniqueSample( - "SafeBrowsing.HPRT.Ineligible.IneligibleForSession", /*sample=*/false, + "SafeBrowsing.HPRT.Ineligible.IneligibleForSessionOrLocation", + /*sample=*/false, /*expected_bucket_count=*/1); histogram_tester.ExpectTotalCount( "interstitial.phishing.decision.from_hash_prefix_real_time_check_v5", @@ -3930,7 +3932,8 @@ "SafeBrowsing.BrowserThrottle.TotalDelay2.HashPrefixDatabaseCheck", /*expected_count=*/1); histogram_tester.ExpectUniqueSample( - "SafeBrowsing.HPRT.Ineligible.IneligibleForSession", /*sample=*/true, + "SafeBrowsing.HPRT.Ineligible.IneligibleForSessionOrLocation", + /*sample=*/true, /*expected_bucket_count=*/1); histogram_tester.ExpectTotalCount( "interstitial.phishing.decision.from_hash_prefix_real_time_check_v5",
diff --git a/chrome/browser/search_engine_choice/search_engine_choice_browsertest.cc b/chrome/browser/search_engine_choice/search_engine_choice_browsertest.cc index f5aa53a0..6060a71 100644 --- a/chrome/browser/search_engine_choice/search_engine_choice_browsertest.cc +++ b/chrome/browser/search_engine_choice/search_engine_choice_browsertest.cc
@@ -55,6 +55,7 @@ namespace { const std::string kCustomSearchEngineDomain = "bar.com"; +const int kCustomSearchEnginePrepopulateId = 0; // Class that mocks `SearchEngineChoiceService`. class MockSearchEngineChoiceService : public SearchEngineChoiceService { public: @@ -99,6 +100,7 @@ void SetUserSelectedDefaultSearchProvider( TemplateURLService* template_url_service) { TemplateURLData data; + data.prepopulate_id = kCustomSearchEnginePrepopulateId; data.SetShortName(base::UTF8ToUTF16(kCustomSearchEngineDomain)); data.SetKeyword(base::UTF8ToUTF16(kCustomSearchEngineDomain)); data.SetURL("https://" + kCustomSearchEngineDomain + "url?bar={searchTerms}"); @@ -460,8 +462,12 @@ } #endif +// This test is disabled because we currently don't want to show the dialog for +// users who have custom search engines. +// TODO(b/302687046): Modify the test based on the decision towards custom +// search engines. IN_PROC_BROWSER_TEST_F(SearchEngineChoiceBrowserTest, - ChooseCustomDefaultSearchProvider) { + DISABLED_ChooseCustomDefaultSearchProvider) { TemplateURLService* template_url_service = TemplateURLServiceFactory::GetForProfile(browser()->profile()); SetUserSelectedDefaultSearchProvider(template_url_service); @@ -472,11 +478,12 @@ // Navigate to a URL to display the dialog. ASSERT_TRUE(ui_test_utils::NavigateToURLWithDisposition( - browser(), GURL(chrome::kChromeUIVersionURL), + browser(), GURL(chrome::kChromeUINewTabPageURL), WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP)); - search_engine_choice_service->NotifyChoiceMade(/*prepopulate_id=*/0); + search_engine_choice_service->NotifyChoiceMade( + kCustomSearchEnginePrepopulateId); const TemplateURL* default_search_provider = template_url_service->GetDefaultSearchProvider(); EXPECT_EQ(default_search_provider->short_name(), @@ -484,6 +491,25 @@ } IN_PROC_BROWSER_TEST_F(SearchEngineChoiceBrowserTest, + DialogNotDisplayedForUsersWithCustomSearchEngines) { + TemplateURLService* template_url_service = + TemplateURLServiceFactory::GetForProfile(browser()->profile()); + SetUserSelectedDefaultSearchProvider(template_url_service); + auto* search_engine_choice_service = + static_cast<MockSearchEngineChoiceService*>( + SearchEngineChoiceServiceFactory::GetForProfile( + browser()->profile())); + + // Navigate to a URL to display the dialog. + ASSERT_TRUE(ui_test_utils::NavigateToURLWithDisposition( + browser(), GURL(chrome::kChromeUINewTabPageURL), + WindowOpenDisposition::CURRENT_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP)); + + EXPECT_FALSE(search_engine_choice_service->IsShowingDialog(browser())); +} + +IN_PROC_BROWSER_TEST_F(SearchEngineChoiceBrowserTest, DialogDoesNotShowWithExtensionEnabledThatOverridesDSE) { Profile* profile = browser()->profile(); auto* search_engine_choice_service =
diff --git a/chrome/browser/search_engine_choice/search_engine_choice_service.cc b/chrome/browser/search_engine_choice/search_engine_choice_service.cc index bd53e50..6b653c3 100644 --- a/chrome/browser/search_engine_choice/search_engine_choice_service.cc +++ b/chrome/browser/search_engine_choice/search_engine_choice_service.cc
@@ -23,6 +23,8 @@ namespace { bool g_dialog_disabled_for_testing = false; +// A custom search engine would have a `prepopulate_id` of 0. +const int kCustomSearchEngineId = 0; // Checks that the profile is the first profile that sees the search engine // choice dialog. @@ -76,11 +78,9 @@ prefs::kDefaultSearchProviderChoiceScreenCompletionTimestamp, base::Time::Now().ToDeltaSinceWindowsEpoch().InSeconds()); - // A custom search engine would have a `prepopulate_id` of 0. // Having a custom search engine displayed on the choice screen would mean // that it is already the default search engine so we don't need to change // anything. - const int kCustomSearchEngineId = 0; if (prepopulate_id != kCustomSearchEngineId) { std::unique_ptr<TemplateURLData> search_engine = TemplateURLPrepopulateData::GetPrepopulatedEngine(pref_service, @@ -184,6 +184,14 @@ return false; } + // Don't show the dialog for users who set a custom search engine as default. + const TemplateURL* default_search_engine = + template_url_service_->GetDefaultSearchProvider(); + CHECK(default_search_engine); + if (default_search_engine->prepopulate_id() == kCustomSearchEngineId) { + return false; + } + // Dialog should not be shown if it is currently displayed or if the user // already made a choice. return !HasUserMadeChoice() && !IsShowingDialog(&browser) && @@ -191,6 +199,10 @@ } bool SearchEngineChoiceService::HasUserMadeChoice() const { + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kForceSearchEngineChoiceScreen)) { + return false; + } PrefService* pref_service = profile_->GetPrefs(); return pref_service->GetInt64( prefs::kDefaultSearchProviderChoiceScreenCompletionTimestamp);
diff --git a/chrome/browser/signin/bound_session_credentials/registration_token_helper.cc b/chrome/browser/signin/bound_session_credentials/registration_token_helper.cc index fe44b3e..f94699b7 100644 --- a/chrome/browser/signin/bound_session_credentials/registration_token_helper.cc +++ b/chrome/browser/signin/bound_session_credentials/registration_token_helper.cc
@@ -102,9 +102,11 @@ } key_id_ = *result; + crypto::SignatureVerifier::SignatureAlgorithm algorithm = + *unexportable_key_service_->GetAlgorithm(key_id_); absl::optional<std::string> header_and_payload = header_and_payload_generator_.Run( - *unexportable_key_service_->GetAlgorithm(key_id_), + algorithm, *unexportable_key_service_->GetSubjectPublicKeyInfo(key_id_), base::Time::Now()); @@ -119,10 +121,11 @@ key_id_, base::as_bytes(base::make_span(header_and_payload_)), kTaskPriority, base::BindOnce(&RegistrationTokenHelper::OnDataSigned, - weak_ptr_factory_.GetWeakPtr())); + weak_ptr_factory_.GetWeakPtr(), algorithm)); } void RegistrationTokenHelper::OnDataSigned( + crypto::SignatureVerifier::SignatureAlgorithm algorithm, unexportable_keys::ServiceErrorOr<std::vector<uint8_t>> result) { if (!result.has_value()) { // TODO(alexilin): Record a histogram. @@ -130,12 +133,18 @@ return; } const std::vector<uint8_t>& signature = *result; - std::string registration_token = - signin::AppendSignatureToHeaderAndPayload(header_and_payload_, signature); + absl::optional<std::string> registration_token = + signin::AppendSignatureToHeaderAndPayload(header_and_payload_, algorithm, + signature); + if (!registration_token.has_value()) { + // TODO(alexilin): Record a histogram. + std::move(callback_).Run(absl::nullopt); + return; + } std::vector<uint8_t> wrapped_key = *unexportable_key_service_->GetWrappedKey(key_id_); - std::move(callback_).Run( - Result(key_id_, std::move(wrapped_key), std::move(registration_token))); + std::move(callback_).Run(Result(key_id_, std::move(wrapped_key), + std::move(registration_token).value())); }
diff --git a/chrome/browser/signin/bound_session_credentials/registration_token_helper.h b/chrome/browser/signin/bound_session_credentials/registration_token_helper.h index 8c241d6..984ae26 100644 --- a/chrome/browser/signin/bound_session_credentials/registration_token_helper.h +++ b/chrome/browser/signin/bound_session_credentials/registration_token_helper.h
@@ -99,6 +99,7 @@ // Callback for `SignSlowlyAsync()`. void OnDataSigned( + crypto::SignatureVerifier::SignatureAlgorithm algorithm, unexportable_keys::ServiceErrorOr<std::vector<uint8_t>> result); const raw_ref<unexportable_keys::UnexportableKeyService>
diff --git a/chrome/browser/signin/bound_session_credentials/session_binding_helper.cc b/chrome/browser/signin/bound_session_credentials/session_binding_helper.cc index 0a38c57..273fd32 100644 --- a/chrome/browser/signin/bound_session_credentials/session_binding_helper.cc +++ b/chrome/browser/signin/bound_session_credentials/session_binding_helper.cc
@@ -13,6 +13,7 @@ #include "components/unexportable_keys/service_error.h" #include "components/unexportable_keys/unexportable_key_loader.h" #include "components/unexportable_keys/unexportable_key_service.h" +#include "crypto/signature_verifier.h" #include "url/gurl.h" namespace { @@ -24,13 +25,15 @@ std::string CreateAssertionToken( const std::string& header_and_payload, + crypto::SignatureVerifier::SignatureAlgorithm algorithm, unexportable_keys::ServiceErrorOr<std::vector<uint8_t>> signature) { if (!signature.has_value()) { return std::string(); } return signin::AppendSignatureToHeaderAndPayload(header_and_payload, - *signature); + algorithm, *signature) + .value_or(std::string()); } } // namespace @@ -77,9 +80,11 @@ return; } + crypto::SignatureVerifier::SignatureAlgorithm algorithm = + *unexportable_key_service_->GetAlgorithm(*binding_key); absl::optional<std::string> header_and_payload = signin::CreateKeyAssertionHeaderAndPayload( - *unexportable_key_service_->GetAlgorithm(*binding_key), + algorithm, *unexportable_key_service_->GetSubjectPublicKeyInfo(*binding_key), session_id_, challenge, destination_url, kSessionBindingNamespace); @@ -91,6 +96,6 @@ unexportable_key_service_->SignSlowlyAsync( *binding_key, base::as_bytes(base::make_span(*header_and_payload)), kSessionBindingPriority, - base::BindOnce(&CreateAssertionToken, *header_and_payload) + base::BindOnce(&CreateAssertionToken, *header_and_payload, algorithm) .Then(std::move(callback))); }
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java index 5d4c81e..242c7d17 100644 --- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java +++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.signin.services; -import android.accounts.Account; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; @@ -33,6 +32,7 @@ import org.chromium.components.signin.AccountEmailDomainDisplayability; import org.chromium.components.signin.AccountManagerFacadeProvider; import org.chromium.components.signin.base.AccountInfo; +import org.chromium.components.signin.base.CoreAccountInfo; import org.chromium.components.signin.identitymanager.AccountInfoService; import org.chromium.components.signin.identitymanager.AccountInfoServiceProvider; @@ -191,30 +191,35 @@ * Sets a {@link BadgeConfig} for a given account, and then populates the cache with the new * Badge. * - * @param account The account for which to set this badge. + * @param accountEmail The account email for which to set this badge. * @param badgeResId Resource id of the badge to be attached. If 0 then the current Badge is * removed. * * If both a per-account and default badge are set, the per-account badge takes precedence. + * + * TODO(crbug.com/1462264): Replace accountEmail with CoreAccountId or CoreAccountInfo. */ - public void setBadge(Account account, @DrawableRes int badgeResId) { - if (((badgeResId == 0) && !mPerAccountBadgeConfig.containsKey(account.name)) - || ((badgeResId != 0) && mPerAccountBadgeConfig.containsKey(account.name) - && (mPerAccountBadgeConfig.get(account.name).getBadgeResId() - == badgeResId))) { - // Update is a no-op. Skip the work below, both as an optimization and to avoid a - // loop whereby the ProfileDataCache user might call back into this function as a - // result of the notification callback. + public void setBadge(String accountEmail, @DrawableRes int badgeResId) { + if (badgeResId == 0 && !mPerAccountBadgeConfig.containsKey(accountEmail)) { + // Update is a no-op. There is no badgeResId and accountEmail has no per-account + // badge config set. + return; + } + if (badgeResId != 0 && mPerAccountBadgeConfig.containsKey(accountEmail) + && mPerAccountBadgeConfig.get(accountEmail).getBadgeResId() == badgeResId) { + // Update is a no-op. The per-account badge set to accountEmail is the same as the + // badgeResId. return; } if (badgeResId != 0) { - mPerAccountBadgeConfig.put(account.name, new BadgeConfig(mContext, badgeResId)); + mPerAccountBadgeConfig.put(accountEmail, new BadgeConfig(mContext, badgeResId)); } else { - mPerAccountBadgeConfig.remove(account.name); + mPerAccountBadgeConfig.remove(accountEmail); } - AccountInfoServiceProvider.getPromise().then( - accountInfoService -> { populateCacheForAccount(accountInfoService, account); }); + AccountInfoServiceProvider.getPromise().then(accountInfoService -> { + populateCacheForAccount(accountInfoService, accountEmail); + }); } /** @@ -265,15 +270,17 @@ } private void populateCache(AccountInfoService accountInfoService) { - AccountManagerFacadeProvider.getInstance().getAccounts().then(accounts -> { - for (Account account : accounts) { - populateCacheForAccount(accountInfoService, account); + AccountManagerFacadeProvider.getInstance().getCoreAccountInfos().then(coreAccountInfos -> { + for (CoreAccountInfo coreAccountInfo : coreAccountInfos) { + populateCacheForAccount(accountInfoService, coreAccountInfo.getEmail()); } }); } - private void populateCacheForAccount(AccountInfoService accountInfoService, Account account) { - accountInfoService.getAccountInfoByEmail(account.name).then(this::onAccountInfoUpdated); + // TODO(crbug.com/1462264): Replace accountEmail with CoreAccountId or CoreAccountInfo. + private void populateCacheForAccount( + AccountInfoService accountInfoService, String accountEmail) { + accountInfoService.getAccountInfoByEmail(accountEmail).then(this::onAccountInfoUpdated); } private void updateCacheAndNotifyObservers(String email, Bitmap avatar, String fullName,
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java index 6d366976..e0b76c31 100644 --- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java +++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java
@@ -55,11 +55,11 @@ } private void validateAccountSettings() { - mAccountManagerFacade.getAccounts().then(accounts -> { + mAccountManagerFacade.getCoreAccountInfos().then(coreAccountInfos -> { mAccountTrackerService.seedAccountsIfNeeded(() -> { mSigninManager.runAfterOperationInProgress(() -> { - validatePrimaryAccountExists(accounts, /*accountsChanged=*/false); - checkChildAccount(accounts); + validatePrimaryAccountExists(coreAccountInfos, /*accountsChanged=*/false); + checkChildAccount(coreAccountInfos); }); }); }); @@ -69,11 +69,10 @@ * This method is invoked every time the accounts on device are seeded. */ @Override - public void onAccountsSeeded(List<CoreAccountInfo> accountInfos, boolean accountsChanged) { - final List<Account> accounts = AccountUtils.toAndroidAccounts(accountInfos); + public void onAccountsSeeded(List<CoreAccountInfo> coreAccountInfos, boolean accountsChanged) { mSigninManager.runAfterOperationInProgress(() -> { - validatePrimaryAccountExists(accounts, accountsChanged); - checkChildAccount(accounts); + validatePrimaryAccountExists(coreAccountInfos, accountsChanged); + checkChildAccount(coreAccountInfos); }); } @@ -84,7 +83,8 @@ /** * Validates that the primary account exists on device. */ - private void validatePrimaryAccountExists(List<Account> accounts, boolean accountsChanged) { + private void validatePrimaryAccountExists( + List<CoreAccountInfo> coreAccountInfos, boolean accountsChanged) { final CoreAccountInfo oldAccount = mSigninManager.getIdentityManager().getPrimaryAccountInfo(ConsentLevel.SIGNIN); boolean oldSyncConsent = @@ -94,9 +94,9 @@ // Do nothing if user is not signed in return; } - if (AccountUtils.findAccountByName(accounts, oldAccount.getEmail()) != null) { - // Reload the accounts if the primary account is still on device and this is triggered - // by an accounts change event. + if (coreAccountInfos.contains(oldAccount)) { + // Reload the coreAccountInfos if the primary account is still on device and this is + // triggered by an coreAccountInfos change event. if (accountsChanged) { mSigninManager.reloadAllAccountsFromSystem(oldAccount.getId()); } @@ -104,7 +104,7 @@ } // Check whether the primary account is renamed to another account when it is not on device AccountRenameChecker.get() - .getNewNameOfRenamedAccountAsync(oldAccount.getEmail(), accounts) + .getNewNameOfRenamedAccountAsync(oldAccount.getEmail(), coreAccountInfos) .then(newAccountName -> { if (newAccountName != null) { // Sign in to the new account if the current primary account is renamed to @@ -141,9 +141,9 @@ }, false); } - private void checkChildAccount(List<Account> accounts) { - AccountUtils.checkChildAccountStatusLegacy( - mAccountManagerFacade, accounts, this::onChildAccountStatusReady); + private void checkChildAccount(List<CoreAccountInfo> coreAccountInfos) { + AccountUtils.checkChildAccountStatus( + mAccountManagerFacade, coreAccountInfos, this::onChildAccountStatusReady); } private void onChildAccountStatusReady(boolean isChild, @Nullable Account childAccount) {
diff --git a/chrome/browser/tpcd/experiment/eligibility_service_factory.cc b/chrome/browser/tpcd/experiment/eligibility_service_factory.cc index aab24df..7c72a26 100644 --- a/chrome/browser/tpcd/experiment/eligibility_service_factory.cc +++ b/chrome/browser/tpcd/experiment/eligibility_service_factory.cc
@@ -43,17 +43,12 @@ std::unique_ptr<KeyedService> EligibilityServiceFactory::BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const { - if (!base::FeatureList::IsEnabled( - features::kCookieDeprecationFacilitatedTesting)) { - return nullptr; + Profile* profile = Profile::FromBrowserContext(context); + if (auto* experiment_manager = + ExperimentManagerImpl::GetForProfile(profile)) { + return std::make_unique<EligibilityService>(profile, experiment_manager); } - if (!features::kCookieDeprecationFacilitatedTestingEnableIncognito.Get() && - context->IsOffTheRecord()) { - return nullptr; - } - return std::make_unique<EligibilityService>( - Profile::FromBrowserContext(context), - ExperimentManagerImpl::GetInstance()); + return nullptr; } } // namespace tpcd::experiment
diff --git a/chrome/browser/tpcd/experiment/eligibility_service_unittest.cc b/chrome/browser/tpcd/experiment/eligibility_service_unittest.cc index 302d3ae..dfd06419 100644 --- a/chrome/browser/tpcd/experiment/eligibility_service_unittest.cc +++ b/chrome/browser/tpcd/experiment/eligibility_service_unittest.cc
@@ -12,7 +12,7 @@ #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/tpcd/experiment/eligibility_service_factory.h" -#include "chrome/browser/tpcd/experiment/experiment_manager.h" +#include "chrome/browser/tpcd/experiment/mock_experiment_manager.h" #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" @@ -31,18 +31,6 @@ using ::testing::_; using ::testing::Return; -class MockExperimentManager : public ExperimentManager { - public: - MockExperimentManager() = default; - ~MockExperimentManager() override = default; - - MOCK_METHOD(void, - SetClientEligibility, - (bool, EligibilityDecisionCallback), - (override)); - MOCK_METHOD(absl::optional<bool>, IsClientEligible, (), (const, override)); -}; - } // namespace class EligibilityServiceTestBase : public testing::Test { @@ -124,7 +112,7 @@ EligibilityServiceOTRProfileTest() { feature_list_.InitAndEnableFeatureWithParameters( features::kCookieDeprecationFacilitatedTesting, - {{"enable_incognito", GetParam() ? "true" : "false"}}); + {{"enable_otr_profiles", GetParam() ? "true" : "false"}}); } private: @@ -132,13 +120,13 @@ }; TEST_P(EligibilityServiceOTRProfileTest, Creation) { - const bool enable_incognito = GetParam(); + const bool enable_otr_profiles = GetParam(); auto* eligibility_service = EligibilityServiceFactory::GetForProfile(profile_.GetOffTheRecordProfile( Profile::OTRProfileID::CreateUniqueForTesting(), /*create_if_needed=*/true)); - EXPECT_EQ(eligibility_service != nullptr, enable_incognito); + EXPECT_EQ(eligibility_service != nullptr, enable_otr_profiles); } INSTANTIATE_TEST_SUITE_P(All,
diff --git a/chrome/browser/tpcd/experiment/experiment_manager_impl.cc b/chrome/browser/tpcd/experiment/experiment_manager_impl.cc index 7fbedb1..0d61bbb 100644 --- a/chrome/browser/tpcd/experiment/experiment_manager_impl.cc +++ b/chrome/browser/tpcd/experiment/experiment_manager_impl.cc
@@ -16,6 +16,7 @@ #include "base/sequence_checker.h" #include "base/task/single_thread_task_runner.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/tpcd/experiment/tpcd_experiment_features.h" #include "chrome/browser/tpcd/experiment/tpcd_pref_names.h" #include "chrome/browser/tpcd/experiment/tpcd_utils.h" @@ -27,12 +28,22 @@ namespace tpcd::experiment { // static -ExperimentManagerImpl* ExperimentManagerImpl::GetInstance() { +ExperimentManagerImpl* ExperimentManagerImpl::GetForProfile(Profile* profile) { if (!base::FeatureList::IsEnabled( features::kCookieDeprecationFacilitatedTesting)) { return nullptr; } + if (!features::kCookieDeprecationFacilitatedTestingEnableOTRProfiles.Get() && + profile->IsOffTheRecord()) { + return nullptr; + } + + return GetInstance(); +} + +// static +ExperimentManagerImpl* ExperimentManagerImpl::GetInstance() { static base::NoDestructor<ExperimentManagerImpl> instance; return instance.get(); }
diff --git a/chrome/browser/tpcd/experiment/experiment_manager_impl.h b/chrome/browser/tpcd/experiment/experiment_manager_impl.h index 25136fd..501aea9 100644 --- a/chrome/browser/tpcd/experiment/experiment_manager_impl.h +++ b/chrome/browser/tpcd/experiment/experiment_manager_impl.h
@@ -14,12 +14,14 @@ #include "chrome/browser/tpcd/experiment/experiment_manager.h" #include "third_party/abseil-cpp/absl/types/optional.h" +class Profile; + namespace tpcd::experiment { // Can only be used on the main thread. class ExperimentManagerImpl : public ExperimentManager { public: - static ExperimentManagerImpl* GetInstance(); + static ExperimentManagerImpl* GetForProfile(Profile* profile); // The final decision is recorded in a local state pref. If this is called // after the final decision is made, the local state pref value takes @@ -31,6 +33,8 @@ absl::optional<bool> IsClientEligible() const override; protected: + static ExperimentManagerImpl* GetInstance(); + ExperimentManagerImpl(); ~ExperimentManagerImpl() override;
diff --git a/chrome/browser/tpcd/experiment/mock_experiment_manager.cc b/chrome/browser/tpcd/experiment/mock_experiment_manager.cc new file mode 100644 index 0000000..105aa69 --- /dev/null +++ b/chrome/browser/tpcd/experiment/mock_experiment_manager.cc
@@ -0,0 +1,13 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/tpcd/experiment/mock_experiment_manager.h" + +namespace tpcd::experiment { + +MockExperimentManager::MockExperimentManager() = default; + +MockExperimentManager::~MockExperimentManager() = default; + +} // namespace tpcd::experiment
diff --git a/chrome/browser/tpcd/experiment/mock_experiment_manager.h b/chrome/browser/tpcd/experiment/mock_experiment_manager.h new file mode 100644 index 0000000..8d472ae --- /dev/null +++ b/chrome/browser/tpcd/experiment/mock_experiment_manager.h
@@ -0,0 +1,29 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_TPCD_EXPERIMENT_MOCK_EXPERIMENT_MANAGER_H_ +#define CHROME_BROWSER_TPCD_EXPERIMENT_MOCK_EXPERIMENT_MANAGER_H_ + +#include "base/functional/callback.h" +#include "chrome/browser/tpcd/experiment/experiment_manager.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace tpcd::experiment { + +class MockExperimentManager : public ExperimentManager { + public: + MockExperimentManager(); + ~MockExperimentManager() override; + + MOCK_METHOD(void, + SetClientEligibility, + (bool, EligibilityDecisionCallback), + (override)); + MOCK_METHOD(absl::optional<bool>, IsClientEligible, (), (const, override)); +}; + +} // namespace tpcd::experiment + +#endif // CHROME_BROWSER_TPCD_EXPERIMENT_MOCK_EXPERIMENT_MANAGER_H_
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 328c818..2dff416 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -4564,6 +4564,7 @@ "autofill/edit_address_profile_dialog_controller.h", "autofill/edit_address_profile_dialog_controller_impl.cc", "autofill/edit_address_profile_dialog_controller_impl.h", + "autofill/edit_address_profile_view.h", "autofill/payments/iban_bubble_controller.h", "autofill/payments/iban_bubble_controller_impl.cc", "autofill/payments/iban_bubble_controller_impl.h",
diff --git a/chrome/browser/ui/android/plus_addresses/plus_address_creation_controller_android_unittest.cc b/chrome/browser/ui/android/plus_addresses/plus_address_creation_controller_android_unittest.cc index 559a35b7..4f690fb 100644 --- a/chrome/browser/ui/android/plus_addresses/plus_address_creation_controller_android_unittest.cc +++ b/chrome/browser/ui/android/plus_addresses/plus_address_creation_controller_android_unittest.cc
@@ -11,7 +11,7 @@ #include "base/test/mock_callback.h" #include "chrome/browser/plus_addresses/plus_address_service_factory.h" #include "chrome/browser/profiles/profile_test_util.h" -#include "chrome/test/base/testing_profile.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "components/plus_addresses/features.h" #include "components/plus_addresses/plus_address_metrics.h" #include "content/public/browser/browser_context.h" @@ -50,35 +50,39 @@ // Testing very basic functionality for now. As UI complexity increases, this // class will grow and mutate. -class PlusAddressCreationControllerAndroidEnabledTest : public testing::Test { +class PlusAddressCreationControllerAndroidEnabledTest + : public ChromeRenderViewHostTestHarness { public: + PlusAddressCreationControllerAndroidEnabledTest() + : override_profile_selections_( + PlusAddressServiceFactory::GetInstance(), + PlusAddressServiceFactory::CreateProfileSelections()) {} + + void SetUp() override { + ChromeRenderViewHostTestHarness::SetUp(); + PlusAddressServiceFactory::GetInstance()->SetTestingFactoryAndUse( + browser_context(), + base::BindRepeating(&PlusAddressCreationControllerAndroidEnabledTest:: + PlusAddressServiceTestFactory, + base::Unretained(this))); + } std::unique_ptr<KeyedService> PlusAddressServiceTestFactory( content::BrowserContext* context) { return std::make_unique<MockPlusAddressService>(); } protected: - content::BrowserTaskEnvironment task_environment_; base::test::ScopedFeatureList features_{kFeature}; + // Ensures that the feature is known to be enabled, such that + // `PlusAddressServiceFactory` doesn't bail early with a null return. + profiles::testing::ScopedProfileSelectionsForFactoryTesting + override_profile_selections_; base::HistogramTester histogram_tester_; }; TEST_F(PlusAddressCreationControllerAndroidEnabledTest, DirectCallback) { - // Ensure that the feature is known to be enabled, such that - // `PlusAddressServiceFactory` doesn't bail early with a null return. - profiles::testing::ScopedProfileSelectionsForFactoryTesting - overide_profile_selections( - PlusAddressServiceFactory::GetInstance(), - PlusAddressServiceFactory::CreateProfileSelections()); - - TestingProfile test_profile; std::unique_ptr<content::WebContents> web_contents = - content::WebContentsTester::CreateTestWebContents(&test_profile, nullptr); - PlusAddressServiceFactory::GetInstance()->SetTestingFactoryAndUse( - &test_profile, - base::BindRepeating(&PlusAddressCreationControllerAndroidEnabledTest:: - PlusAddressServiceTestFactory, - base::Unretained(this))); + ChromeRenderViewHostTestHarness::CreateTestWebContents(); PlusAddressCreationControllerAndroid::CreateForWebContents( web_contents.get()); @@ -101,21 +105,8 @@ } TEST_F(PlusAddressCreationControllerAndroidEnabledTest, ModalCanceled) { - // Ensure that the feature is known to be enabled, such that - // `PlusAddressServiceFactory` doesn't bail early with a null return. - profiles::testing::ScopedProfileSelectionsForFactoryTesting - overide_profile_selections( - PlusAddressServiceFactory::GetInstance(), - PlusAddressServiceFactory::CreateProfileSelections()); - - TestingProfile test_profile; std::unique_ptr<content::WebContents> web_contents = - content::WebContentsTester::CreateTestWebContents(&test_profile, nullptr); - PlusAddressServiceFactory::GetInstance()->SetTestingFactoryAndUse( - &test_profile, - base::BindRepeating(&PlusAddressCreationControllerAndroidEnabledTest:: - PlusAddressServiceTestFactory, - base::Unretained(this))); + ChromeRenderViewHostTestHarness::CreateTestWebContents(); PlusAddressCreationControllerAndroid::CreateForWebContents( web_contents.get()); @@ -137,23 +128,29 @@ PlusAddressMetrics::PlusAddressModalEvent::kModalCanceled, 1))); } -class PlusAddressCreationControllerAndroidDisabledTest - : public ::testing::Test { - public: - void SetUp() override { features_.InitAndDisableFeature(kFeature); } - - private: - content::BrowserTaskEnvironment task_environment_; - base::test::ScopedFeatureList features_; -}; - // With the feature disabled, the `KeyedService` is not present; ensure this is // handled. While this code path should not be called in that case, it is // validated here for safety. +class PlusAddressCreationControllerAndroidDisabledTest + : public ChromeRenderViewHostTestHarness { + public: + void SetUp() override { + features_.InitAndDisableFeature(kFeature); + ChromeRenderViewHostTestHarness::SetUp(); + PlusAddressServiceFactory::GetInstance()->SetTestingFactory( + browser_context(), + base::BindRepeating( + [](content::BrowserContext* profile) + -> std::unique_ptr<KeyedService> { return nullptr; })); + } + + private: + base::test::ScopedFeatureList features_; +}; + TEST_F(PlusAddressCreationControllerAndroidDisabledTest, ConfirmedNullService) { - TestingProfile profile; std::unique_ptr<content::WebContents> web_contents = - content::WebContentsTester::CreateTestWebContents(&profile, nullptr); + ChromeRenderViewHostTestHarness::CreateTestWebContents(); PlusAddressCreationControllerAndroid::CreateForWebContents( web_contents.get()); @@ -162,15 +159,9 @@ controller->set_suppress_ui_for_testing(true); base::MockOnceCallback<void(const std::string&)> callback; + EXPECT_CALL(callback, Run).Times(0); controller->OfferCreation(url::Origin::Create(GURL("https://test.example")), callback.Get()); - - PlusAddressServiceFactory::GetInstance()->SetTestingFactory( - &profile, base::BindRepeating( - [](content::BrowserContext* profile) - -> std::unique_ptr<KeyedService> { return nullptr; })); - EXPECT_CALL(callback, Run).Times(0); - controller->OnConfirmed(); }
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninUtils.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninUtils.java index 6141628..fa2c249 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninUtils.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninUtils.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.ui.signin; -import android.accounts.Account; import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -14,6 +13,7 @@ import org.chromium.base.IntentUtils; import org.chromium.chrome.browser.signin.services.DisplayableProfileData; +import org.chromium.components.signin.AccountUtils; /** * Helper functions for sign-in and accounts. @@ -27,16 +27,17 @@ /** * Opens a Settings page to configure settings for a single account. * @param activity Activity to use when starting the Activity. - * @param account The account for which the Settings page should be opened. + * @param accountEmail The account email for which the Settings page should be opened. * @return Whether or not Android accepted the Intent. */ - public static boolean openSettingsForAccount(Activity activity, Account account) { + public static boolean openSettingsForAccount(Activity activity, String accountEmail) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // ACCOUNT_SETTINGS_ACTION no longer works on Android O+, always open all accounts page. return openSettingsForAllAccounts(activity); } Intent intent = new Intent(ACCOUNT_SETTINGS_ACTION); - intent.putExtra(ACCOUNT_SETTINGS_ACCOUNT_KEY, account); + intent.putExtra( + ACCOUNT_SETTINGS_ACCOUNT_KEY, AccountUtils.createAccountFromName(accountEmail)); return IntentUtils.safeStartActivity(activity, intent); }
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb index 9ad4f54f..3e0fa94 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">Open in nuwe oortjie in groep</translation> <translation id="1103142993930332957">Help om Chrome te verbeter?</translation> <translation id="1105960400813249514">Skermskoot</translation> -<translation id="1108214977745280468">Bekyk bladinsigte</translation> <translation id="1108938384783527433">Geskiedenissinkronisering</translation> <translation id="1110914759170138831">Gemerkte teks is verkort</translation> <translation id="1111673857033749125">Boekmerke wat op jou ander toestelle gestoor is, sal hier verskyn.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Regsinligting</translation> <translation id="4072805772816336153">Probeer later weer</translation> -<translation id="4080602171844412446">Verwante insigte</translation> <translation id="4084682180776658562">Boekmerk</translation> <translation id="4084712963632273211">Vanaf <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />afgelewer deur Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Jy kan hierdie tablet gebruik om op die toestel aan te meld wat hierdie QR-kode wys.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index c13f82f..df5f068a9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">በቡድን ውስጥ አዲስ ትር ይክፈቱ</translation> <translation id="1103142993930332957">Chromeን ለማሻሻል ይረዱ?</translation> <translation id="1105960400813249514">የማያ ገፅ ቀረጻ</translation> -<translation id="1108214977745280468">የገጽ ግንዛቤዎችን ይመልከቱ</translation> <translation id="1108938384783527433">ታሪክ አስምር</translation> <translation id="1110914759170138831">ማድመቂያ እንዲያጥር ተደርጓል</translation> <translation id="1111673857033749125">በሌሎች መሣሪያዎችዎ ላይ የተቀመጡ ዕልባቶችዎ እዚህ ብቅ ይላሉ።</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">ቀይ ቡናማ</translation> <translation id="4062305924942672200">የህግ መረጃ</translation> <translation id="4072805772816336153">ቆይተው እንደገና ይሞክሩ</translation> -<translation id="4080602171844412446">ተዛማጅ ግንዛቤዎች</translation> <translation id="4084682180776658562">ዕልባት</translation> <translation id="4084712963632273211">ከ<ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />በGoogle የተላከ<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">ይህን QR ኮድ በሚያሳየው መሣሪያ ላይ በመለያ ለመግባት ይህን ጡባዊ መጠቀም ይችላሉ።</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb index 0e8101ce..49f37a4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">الفتح في علامة تبويب جديدة في مجموعة</translation> <translation id="1103142993930332957">هل تريد المساهمة في تحسين أداء Chrome؟</translation> <translation id="1105960400813249514">التقاط الشاشة</translation> -<translation id="1108214977745280468">عرض إحصاءات الصفحة</translation> <translation id="1108938384783527433">مزامنة السجلّ</translation> <translation id="1110914759170138831">تم اقتصاص جزء من النص المحدَّد.</translation> <translation id="1111673857033749125">ستظهر هنا الإشارات التي تم حفظها على أجهزتك الأخرى.</translation> @@ -583,7 +582,6 @@ <translation id="4056223980640387499">بني داكن</translation> <translation id="4062305924942672200">المعلومات القانونية</translation> <translation id="4072805772816336153">يُرجى إعادة المحاولة لاحقًا.</translation> -<translation id="4080602171844412446">إحصاءات ذات صلة</translation> <translation id="4084682180776658562">إشارة</translation> <translation id="4084712963632273211">من <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />تعرضه Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">يمكنك استخدام هذا الجهاز اللوحي لتسجيل الدخول على الجهاز الذي يعرض رمز الاستجابة السريعة هذا.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index 42db1e3..b0491c9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">গোটৰ নতুন টেবত খোলক</translation> <translation id="1103142993930332957">Chromeক উন্নত কৰাত সহায় কৰিবনে?</translation> <translation id="1105960400813249514">স্ক্ৰীন কেপচাৰ</translation> -<translation id="1108214977745280468">পৃষ্ঠাৰ অন্তৰ্দৃষ্টি চাওক</translation> <translation id="1108938384783527433">ইতিহাস ছিংক কৰক</translation> <translation id="1110914759170138831">হাইলাইট কৰা পাঠটো চুটি কৰা হৈছে</translation> <translation id="1111673857033749125">আপোনাৰ ডিভাইচত ছেভ কৰা বুকমাৰ্কবোৰ ইয়াত দেখা পোৱা যাব।</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">ছেপিয়া</translation> <translation id="4062305924942672200">আইনী তথ্য</translation> <translation id="4072805772816336153">পাছত পুনৰ চেষ্টা কৰক</translation> -<translation id="4080602171844412446">প্ৰাসংগিক অন্তৰ্দৃষ্টি</translation> <translation id="4084682180776658562">বুকমাৰ্ক কৰক</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" />ৰপৰা – <ph name="BEGIN_DEEMPHASIZED" />Googleএ যোগান ধৰা<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">আপুনি এই কিউআৰ ক’ডটো প্ৰদৰ্শন কৰি থকা ডিভাইচটোত ছাইন ইন কৰিবলৈ এই টেবলেটটো ব্যৱহাৰ কৰিব পাৰে।</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index 7409f83..41f25fb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Qrupda yeni tabda açın</translation> <translation id="1103142993930332957">Chrome'un təkmilləşdirilməsinə kömək edirsiniz?</translation> <translation id="1105960400813249514">Ekranın Ani Çəkimi</translation> -<translation id="1108214977745280468">Səhifə statistikasına baxın</translation> <translation id="1108938384783527433">Tarixçə sinxronizasiyası</translation> <translation id="1110914759170138831">Vurğulama qısaldılıb</translation> <translation id="1111673857033749125">Digər cihazlarınızda yadda saxlanmış əlfəcinlər burada görünəcək.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Leqal informasiya</translation> <translation id="4072805772816336153">Sonra yenidən sınayın</translation> -<translation id="4080602171844412446">Əlaqəli statistika</translation> <translation id="4084682180776658562">Əlfəcin</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> ünvanından – <ph name="BEGIN_DEEMPHASIZED" />Google tərəfindən çatdırıldı<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Bu QR kodunu göstərən cihaza daxil olmaq üçün bu planşetdən istifadə edə bilərsiniz.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index 922fd28..73cff09 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">У новай укладцы ў групе</translation> <translation id="1103142993930332957">Ці не маглі б вы дапамагчы палепшыць Chrome?</translation> <translation id="1105960400813249514">Здымак экрана</translation> -<translation id="1108214977745280468">Праглядзець статыстыку старонкі</translation> <translation id="1108938384783527433">Сінхранізацыя гісторыі</translation> <translation id="1110914759170138831">Вылучаны тэкст быў скарочаны</translation> <translation id="1111673857033749125">Тут з'явяцца закладкі, захаваныя на вашых іншых прыладах.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Сепія</translation> <translation id="4062305924942672200">Юрыдычная інфармацыя</translation> <translation id="4072805772816336153">Паўтарыце спробу пазней</translation> -<translation id="4080602171844412446">Звязаная статыстыка</translation> <translation id="4084682180776658562">Дадаць у закладкі</translation> <translation id="4084712963632273211">Выдавец – <ph name="PUBLISHER_ORIGIN" />, <ph name="BEGIN_DEEMPHASIZED" />пастаўшчык – Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Вы можаце выкарыстоўваць гэты планшэт, каб уваходзіць ва ўліковы запіс на прыладзе, на якой паказваецца гэты QR-код.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index d941e5d9..07a9718 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Отваряне в нов раздел в група</translation> <translation id="1103142993930332957">Искате ли да помогнете за подобряването на Chrome?</translation> <translation id="1105960400813249514">Заснемане на екрана</translation> -<translation id="1108214977745280468">Статистика за страницата</translation> <translation id="1108938384783527433">Синхронизиране на историята</translation> <translation id="1110914759170138831">Откроеният текст е съкратен</translation> <translation id="1111673857033749125">Тук ще се показват отметките, които сте запазили на другите си устройства.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Сепия</translation> <translation id="4062305924942672200">Правна информация</translation> <translation id="4072805772816336153">Опитайте отново по-късно</translation> -<translation id="4080602171844412446">Сродна статистика</translation> <translation id="4084682180776658562">Отметка</translation> <translation id="4084712963632273211">От <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />показва се от Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Можете да използвате този таблет, за да влезете в профила си на устройството, на което се показва QR кодът.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index e610cc6e..1253566 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">গ্রুপে একটি নতুন ট্যাব খুলুন</translation> <translation id="1103142993930332957">Chrome উন্নত করতে সাহায্য করবেন?</translation> <translation id="1105960400813249514">স্ক্রিন ক্যাপচার</translation> -<translation id="1108214977745280468">পৃষ্ঠার ইনসাইট দেখুন</translation> <translation id="1108938384783527433">ইতিহাস সিঙ্ক করুন</translation> <translation id="1110914759170138831">হাইলাইট সংক্ষিপ্ত করা হয়েছে</translation> <translation id="1111673857033749125">আপনার অন্যান্য ডিভাইসে সেভ করা বুকমার্কগুলি এখানে দেখা যাবে।</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">সেপিয়া</translation> <translation id="4062305924942672200">আইনী তথ্য</translation> <translation id="4072805772816336153">পরে আবার চেষ্টা করুন</translation> -<translation id="4080602171844412446">সম্পর্কিত ইনসাইট</translation> <translation id="4084682180776658562">বুকমার্ক</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> থেকে – <ph name="BEGIN_DEEMPHASIZED" />Google এর মাধ্যমে ডেলিভারি দেওয়া হয়েছে<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">যে ডিভাইসে এই QR কোড দেখানো হচ্ছে তাতে সাইন-ইন করার জন্য আপনি এই ট্যাবলেট ব্যবহার করতে পারবেন।</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index ccfc2160..bae8e80 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Otvori u novoj kartici i grupi</translation> <translation id="1103142993930332957">Želite li pomoći da poboljšamo Chrome?</translation> <translation id="1105960400813249514">Snimanje ekrana</translation> -<translation id="1108214977745280468">Prikaži uvide stranice</translation> <translation id="1108938384783527433">Sihnronizacija historije</translation> <translation id="1110914759170138831">Istaknuta stavka je skraćena</translation> <translation id="1111673857033749125">Oznake koje sačuvate na drugim uređajima će se pojaviti ovdje.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepija</translation> <translation id="4062305924942672200">Pravne informacije</translation> <translation id="4072805772816336153">Pokušajte ponovo kasnije</translation> -<translation id="4080602171844412446">Srodni uvidi</translation> <translation id="4084682180776658562">Oznaka</translation> <translation id="4084712963632273211">Od izvora <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />dostavlja Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Možete koristiti ovaj tablet da se prijavite na uređaj na kojem se ovaj QR kôd prikazuje.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index 1be8dfe3..a57a4aa 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Obre en una pestanya d'un grup</translation> <translation id="1103142993930332957">Vols ajudar a millorar Chrome?</translation> <translation id="1105960400813249514">Captura de pantalla</translation> -<translation id="1108214977745280468">Estadístiques de la pàgina</translation> <translation id="1108938384783527433">Sincronització de l'historial</translation> <translation id="1110914759170138831">El text marcat s'ha escurçat</translation> <translation id="1111673857033749125">Les adreces d'interès desades als altres dispositius es mostraran aquí.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sèpia</translation> <translation id="4062305924942672200">Informació legal</translation> <translation id="4072805772816336153">Torna-ho a provar més tard</translation> -<translation id="4080602171844412446">Informació relacionada</translation> <translation id="4084682180776658562">Adreça d'interès</translation> <translation id="4084712963632273211">Publicada originalment per <ph name="PUBLISHER_ORIGIN" />, <ph name="BEGIN_DEEMPHASIZED" />oferida per Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Pots utilitzar aquesta tauleta per iniciar la sessió al dispositiu que està mostrant aquest codi QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index f497115c..d8f3c2f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Otevřít na nové kartě ve skup.</translation> <translation id="1103142993930332957">Pomoci Chrome zlepšit?</translation> <translation id="1105960400813249514">Snímky obrazovky</translation> -<translation id="1108214977745280468">Zobrazit statistiky stránky</translation> <translation id="1108938384783527433">Synchronizace historie</translation> <translation id="1110914759170138831">Zvýraznění bylo zkráceno</translation> <translation id="1111673857033749125">Zde se objeví záložky, které jste si uložili v ostatních zařízeních.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sépie</translation> <translation id="4062305924942672200">Právní informace</translation> <translation id="4072805772816336153">Zkuste to znovu později</translation> -<translation id="4080602171844412446">Související statistiky</translation> <translation id="4084682180776658562">Záložka</translation> <translation id="4084712963632273211">Zdroj: <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />poskytováno společností Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Tento tablet můžete použít k přihlášení na počítači, na kterém se zobrazuje tento QR kód.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb index e25a95a9..0224f622 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Agor mewn tab a grŵp newydd</translation> <translation id="1103142993930332957">Helpwch i wella Chrome?</translation> <translation id="1105960400813249514">Tynnu Sgrinlun</translation> -<translation id="1108214977745280468">Gweld mewnwelediadau tudalen</translation> <translation id="1108938384783527433">Cysoni hanes</translation> <translation id="1110914759170138831">Byrhawyd yr amlygu</translation> <translation id="1111673857033749125">Bydd nodau tudalen sydd wedi'u cadw ar eich dyfeisiau eraill yn ymddangos yma.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Gwybodaeth gyfreithiol</translation> <translation id="4072805772816336153">Rhowch gynnig arall arni'n nes ymlaen</translation> -<translation id="4080602171844412446">Mewnwelediadau Cysylltiedig</translation> <translation id="4084682180776658562">Nod tudalen</translation> <translation id="4084712963632273211">Gan <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />darparwyd gan Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Gallwch ddefnyddio'r llechen hon i fewngofnodi ar y ddyfais sy'n dangos y cod QR hwn.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 702cd7ca..3daf934 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Åbn i en ny fane i en gruppe</translation> <translation id="1103142993930332957">Vil du hjælpe med at forbedre Chrome?</translation> <translation id="1105960400813249514">Screenshot</translation> -<translation id="1108214977745280468">Se sideindsigt</translation> <translation id="1108938384783527433">Synkronisering af historik</translation> <translation id="1110914759170138831">Fremhævningen er forkortet</translation> <translation id="1111673857033749125">Bogmærker, der er gemt på dine andre enheder, vises her.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Juridiske oplysninger</translation> <translation id="4072805772816336153">Prøv igen senere</translation> -<translation id="4080602171844412446">Relateret indsigt</translation> <translation id="4084682180776658562">Bogmærke</translation> <translation id="4084712963632273211">Fra <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />leveret af Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Du kan bruge denne tablet til at logge ind på den enhed, der viser QR-koden.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index 64931c7..0cd26d5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">In neuem Tab in Gruppe öffnen</translation> <translation id="1103142993930332957">Möchtest du helfen, Chrome zu verbessern?</translation> <translation id="1105960400813249514">Bildschirmaufnahme</translation> -<translation id="1108214977745280468">Seitenstatistiken ansehen</translation> <translation id="1108938384783527433">Verlauf synchronisieren</translation> <translation id="1110914759170138831">Markierter Text wurde gekürzt</translation> <translation id="1111673857033749125">Hier werden die Lesezeichen angezeigt, die auf deinen anderen Geräten gespeichert sind.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Rechtliche Hinweise</translation> <translation id="4072805772816336153">Versuchen Sie es später noch einmal</translation> -<translation id="4080602171844412446">Weitere Informationen</translation> <translation id="4084682180776658562">Lesezeichen</translation> <translation id="4084712963632273211">Von <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />bereitgestellt durch Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Du kannst dich über dieses Tablet auf dem Gerät anmelden, auf dem dieser QR-Code angezeigt wird.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index a64a666b..34d1022 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Άνοιγμα σε νέα καρτ. σε ομάδα</translation> <translation id="1103142993930332957">Θέλετε να συμβάλλετε στη βελτίωση του Chrome;</translation> <translation id="1105960400813249514">Λήψη οθόνης</translation> -<translation id="1108214977745280468">Προβολή insight σελίδας</translation> <translation id="1108938384783527433">Συγχρονισμός ιστορικού</translation> <translation id="1110914759170138831">Έγινε συντόμευση της επισήμανσης</translation> <translation id="1111673857033749125">Οι σελιδοδείκτες που είναι αποθηκευμένοι σε άλλες συσκευές θα εμφανίζονται εδώ.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Σέπια</translation> <translation id="4062305924942672200">Νομικές πληροφορίες</translation> <translation id="4072805772816336153">Δοκιμάστε ξανά αργότερα</translation> -<translation id="4080602171844412446">Σχετικά insight</translation> <translation id="4084682180776658562">Σελιδοδείκτης</translation> <translation id="4084712963632273211">Από <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />παρέχεται από την Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Μπορείτε να χρησιμοποιήσετε αυτό το tablet για να συνδεθείτε στη συσκευή όπου εμφανίζεται αυτός ο κωδικός QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index b1f9832e..8687e0bd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">Open in new tab in group</translation> <translation id="1103142993930332957">Help improve Chrome?</translation> <translation id="1105960400813249514">Screen Capture</translation> -<translation id="1108214977745280468">View page insights</translation> <translation id="1108938384783527433">History sync</translation> <translation id="1110914759170138831">Highlight was shortened</translation> <translation id="1111673857033749125">Bookmarks saved on your other devices will appear here.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Legal information</translation> <translation id="4072805772816336153">Try again later</translation> -<translation id="4080602171844412446">Related insights</translation> <translation id="4084682180776658562">Bookmark</translation> <translation id="4084712963632273211">From <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />delivered by Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">You can use this tablet to sign in on the device that’s displaying this QR code.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index 2956002..c5ee561c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Abrir en pestaña nueva en grupo</translation> <translation id="1103142993930332957">¿Quieres ayudar a mejorar Chrome?</translation> <translation id="1105960400813249514">Captura de pantalla</translation> -<translation id="1108214977745280468">Ver estadísticas de la pág.</translation> <translation id="1108938384783527433">Sincronización del historial</translation> <translation id="1110914759170138831">Se acortó el texto destacado</translation> <translation id="1111673857033749125">Los favoritos guardados en tus otros dispositivos aparecerán aquí.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Información legal</translation> <translation id="4072805772816336153">Vuelve a intentarlo más tarde</translation> -<translation id="4080602171844412446">Estadísticas relacionadas</translation> <translation id="4084682180776658562">Marcador</translation> <translation id="4084712963632273211">De <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />publicado por Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Puedes usar esta tablet para acceder en el dispositivo que muestra este código QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index b240500..44829ab 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Abrir en pestaña nueva en grupo</translation> <translation id="1103142993930332957">¿Quieres ayudar a mejorar Chrome?</translation> <translation id="1105960400813249514">Captura de pantalla</translation> -<translation id="1108214977745280468">Ver métricas de la página</translation> <translation id="1108938384783527433">Sincronización del historial</translation> <translation id="1110914759170138831">Se ha recortado el texto destacado</translation> <translation id="1111673857033749125">Aquí aparecen los marcadores que hayas guardado en otros dispositivos.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Información legal</translation> <translation id="4072805772816336153">Inténtalo de nuevo más tarde</translation> -<translation id="4080602171844412446">Estadísticas relacionadas</translation> <translation id="4084682180776658562">Añadir a marcadores</translation> <translation id="4084712963632273211">De <ph name="PUBLISHER_ORIGIN" /> (<ph name="BEGIN_DEEMPHASIZED" />ofrecida por Google<ph name="END_DEEMPHASIZED" />)</translation> <translation id="409109920254068737">Puedes usar esta tablet para iniciar sesión en el dispositivo donde se muestra este código QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index f3b7e87..3dff247e4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Ava rühmas uuel vahelehel</translation> <translation id="1103142993930332957">Kas soovite aidata Chrome'i täiustada?</translation> <translation id="1105960400813249514">Kuva jäädvustamine</translation> -<translation id="1108214977745280468">Kuva lehe statistika</translation> <translation id="1108938384783527433">Ajaloo sünkroonimine</translation> <translation id="1110914759170138831">Esiletõstu lühendati</translation> <translation id="1111673857033749125">Siin kuvatakse teie teistes seadmetes salvestatud järjehoidjad.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Seepia</translation> <translation id="4062305924942672200">Juriidiline teave</translation> <translation id="4072805772816336153">Proovige hiljem uuesti</translation> -<translation id="4080602171844412446">Seotud statistika</translation> <translation id="4084682180776658562">Järjehoidja</translation> <translation id="4084712963632273211">Avaldajalt <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />sisu pakub Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Võite kasutada tahvelarvutit selles seadmes sisselogimiseks, milles QR-koodi kuvatakse.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index 2e27305f..b4b3848 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Ireki beste fitxa bat taldean</translation> <translation id="1103142993930332957">Chrome hobetzen lagundu nahi duzu?</translation> <translation id="1105960400813249514">Pantaila-argazkia</translation> -<translation id="1108214977745280468">Ikusi orriaren estatistikak</translation> <translation id="1108938384783527433">Historiaren sinkronizazioa</translation> <translation id="1110914759170138831">Moztu da nabarmendutako zatia</translation> <translation id="1111673857033749125">Beste gailuetan gordeta dituzun laster-markak hemen agertuko dira.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Legezko informazioa</translation> <translation id="4072805772816336153">Saiatu berriro geroago</translation> -<translation id="4080602171844412446">Erlazionatutako estatistikak</translation> <translation id="4084682180776658562">Laster-marka</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> da argitaratzailea <ph name="BEGIN_DEEMPHASIZED" />eta Google-k eskaintzen du<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Tableta erabil dezakezu QR kodea erakusten ari den gailuan saioa hasteko.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index 34ea2112..c4211b1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">باز کردن در برگه جدید در گروه</translation> <translation id="1103142993930332957">مایلید به بهبود Chrome کمک کنید؟</translation> <translation id="1105960400813249514">گرفتن عکس از صفحه</translation> -<translation id="1108214977745280468">مشاهده اطلاعات آماری صفحه</translation> <translation id="1108938384783527433">همگامسازی سابقه</translation> <translation id="1110914759170138831">نوشتار برجستهشده کوتاه شد</translation> <translation id="1111673857033749125">نشانکهای ذخیرهشده در سایر دستگاههای شما در اینجا نشان داده میشوند.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">سپیا</translation> <translation id="4062305924942672200">اطلاعات حقوقی</translation> <translation id="4072805772816336153">بعداً دوباره امتحان کنید</translation> -<translation id="4080602171844412446">اطلاعات آماری مرتبط</translation> <translation id="4084682180776658562">نشانک</translation> <translation id="4084712963632273211">از<ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />توسط Google ارائه میشود<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">بااستفاده از این رایانه لوحی میتوانید در دستگاهی که این رمزینه پاسخسریع را نمایش میدهد به سیستم وارد شوید.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index b4411eb..8e8cb715 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Avaa uusi välilehti ja ryhmä</translation> <translation id="1103142993930332957">Haluatko auttaa kehittämään Chromea?</translation> <translation id="1105960400813249514">Kuvakaappaus</translation> -<translation id="1108214977745280468">Katso tietoja sivusta</translation> <translation id="1108938384783527433">Historian synkronointi</translation> <translation id="1110914759170138831">Korostusta lyhennettiin</translation> <translation id="1111673857033749125">Muilla laitteilla tallentamasi kirjanmerkit näytetään täällä.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Seepia</translation> <translation id="4062305924942672200">Oikeudelliset tiedot</translation> <translation id="4072805772816336153">Yritä myöhemmin uudelleen</translation> -<translation id="4080602171844412446">Aiheeseen liittyviä vinkkejä</translation> <translation id="4084682180776658562">Kirjanmerkki</translation> <translation id="4084712963632273211">Lähde: <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />Googlen toimittama<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Voit kirjautua sisään QR-koodin näyttävälle laitteelle tämän tabletin avulla.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index fad9a5b..2b77929 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Buksan sa bagong tab sa grupo</translation> <translation id="1103142993930332957">Tumulong na pahusayin ang Chrome?</translation> <translation id="1105960400813249514">Screen Capture</translation> -<translation id="1108214977745280468">Tingnan ang insight ng page</translation> <translation id="1108938384783527433">Pag-sync ng history</translation> <translation id="1110914759170138831">Pinaikli ang highlight</translation> <translation id="1111673857033749125">Dito lalabas ang mga naka-save na bookmark sa iba mo pang mga device.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Impormasyong legal</translation> <translation id="4072805772816336153">Subukan ulit sa ibang pagkakataon</translation> -<translation id="4080602171844412446">Mga Kaugnay na Insight</translation> <translation id="4084682180776658562">Bookmark</translation> <translation id="4084712963632273211">Mula sa <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />ihinatid ng Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Puwede mong gamitin ang tablet na ito para mag-sign in sa device na nagpapakita ng QR code na ito.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index 3ae12e5..3267f25 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Dans nouvel onglet dans groupe</translation> <translation id="1103142993930332957">Aidez à améliorer Chrome?</translation> <translation id="1105960400813249514">Capture d'écran</translation> -<translation id="1108214977745280468">Afficher les statistiques au sujet de la page</translation> <translation id="1108938384783527433">Synchronisation de l'historique</translation> <translation id="1110914759170138831">La mise en évidence a été raccourcie</translation> <translation id="1111673857033749125">Les favoris enregistrés sur vos autres appareils s'afficheront ici.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sépia</translation> <translation id="4062305924942672200">Mentions juridiques</translation> <translation id="4072805772816336153">Réessayez plus tard</translation> -<translation id="4080602171844412446">Statistiques connexes</translation> <translation id="4084682180776658562">Favoris</translation> <translation id="4084712963632273211">De <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />fourni par Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Vous pouvez utiliser cette tablette pour vous connecter à l'appareil qui affiche ce code QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index 3cff861..c8fb6f0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Dans nouvel onglet dans groupe</translation> <translation id="1103142993930332957">Aider à améliorer Chrome ?</translation> <translation id="1105960400813249514">Capture d'écran</translation> -<translation id="1108214977745280468">Voir insights de la page</translation> <translation id="1108938384783527433">Synchronisation de l'historique</translation> <translation id="1110914759170138831">Texte en surbrillance abrégé</translation> <translation id="1111673857033749125">Les favoris enregistrés sur vos autres appareils s'affichent ici.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sépia</translation> <translation id="4062305924942672200">Informations légales</translation> <translation id="4072805772816336153">Réessayer plus tard</translation> -<translation id="4080602171844412446">Insights associées</translation> <translation id="4084682180776658562">Favori</translation> <translation id="4084712963632273211">De <ph name="PUBLISHER_ORIGIN" />, <ph name="BEGIN_DEEMPHASIZED" />proposé par Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Vous pouvez utiliser cette tablette pour vous connecter sur l'appareil qui affiche le code QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index 6565554..c4390fb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Abrir pestana nova nun grupo</translation> <translation id="1103142993930332957">Queres axudar a mellorar Chrome?</translation> <translation id="1105960400813249514">Screen Capture</translation> -<translation id="1108214977745280468">Ver estatísticas da páxina</translation> <translation id="1108938384783527433">Sincronización do historial</translation> <translation id="1110914759170138831">Acurtouse o texto destacado</translation> <translation id="1111673857033749125">Aquí aparecerán os marcadores que gardases noutros dispositivos.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Información legal</translation> <translation id="4072805772816336153">Téntao de novo máis tarde</translation> -<translation id="4080602171844412446">Estatísticas relacionadas</translation> <translation id="4084682180776658562">Marcador</translation> <translation id="4084712963632273211">Contido publicado por <ph name="PUBLISHER_ORIGIN" /> e <ph name="BEGIN_DEEMPHASIZED" />ofrecido por Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Podes utilizar esta tableta para iniciar sesión no dispositivo no que se mostra este código QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index db40120..a204287 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">ગ્રૂપમાં નવા ટૅબમાં ખોલો</translation> <translation id="1103142993930332957">Chromeને બહેતર બનાવવામાં સહાય કરશો?</translation> <translation id="1105960400813249514">સ્ક્રીન કૅપ્ચર</translation> -<translation id="1108214977745280468">પેજની જાણકારી જુઓ</translation> <translation id="1108938384783527433">ઇતિહાસ સિંક કરો</translation> <translation id="1110914759170138831">હાઇલાઇટ ટૂંકી કરવામાં આવી</translation> <translation id="1111673857033749125">તમારા અન્ય ડિવાઇસ પર સાચવેલા બુકમાર્ક અહીં દેખાશે.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">કાનુની માહિતી</translation> <translation id="4072805772816336153">થોડા સમય પછી ફરી પ્રયાસ કરો</translation> -<translation id="4080602171844412446">સંબંધિત જાણકારી</translation> <translation id="4084682180776658562">બુકમાર્ક</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> તરફથી - <ph name="BEGIN_DEEMPHASIZED" />Google દ્વારા વિતરિત <ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">આ QR કોડ બતાવતા હોય એવા ડિવાઇસ પર સાઇન ઇન કરવા માટે તમે આ ટૅબ્લેટનો ઉપયોગ કરી શકો છો.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index ac9bcdda..2ceb6ba2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">समूह में नए टैब में खोलें</translation> <translation id="1103142993930332957">क्या आप Chrome को बेहतर बनाना चाहते हैं?</translation> <translation id="1105960400813249514">स्क्रीन कैप्चर</translation> -<translation id="1108214977745280468">पेज इनसाइट देखें</translation> <translation id="1108938384783527433">इतिहास सिंक करें</translation> <translation id="1110914759170138831">हाइलाइट छोटी की गई</translation> <translation id="1111673857033749125">आपके अन्य डिवाइस पर सहेजे गए बुकमार्क यहां दिखाई देंगे.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">कानूनी जानकारी</translation> <translation id="4072805772816336153">कुछ समय बाद कोशिश करें</translation> -<translation id="4080602171844412446">इसी विषय से जुड़ी अहम जानकारी</translation> <translation id="4084682180776658562">बुकमार्क</translation> <translation id="4084712963632273211">प्रकाशक: <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />Google की ओर से डिलीवर किया गया<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">इस टैबलेट का इस्तेमाल, उस डिवाइस पर साइन इन करने के लिए किया जा सकता है जिस पर यह क्यूआर कोड दिख रहा है.</translation> @@ -1422,6 +1420,7 @@ <translation id="8127542551745560481">होम पेज में बदलाव करें</translation> <translation id="8130309322784422030">हो सकता है कि आपकी सेव की गई, साइन इन से जुड़ी जानकारी पुरानी हो</translation> <translation id="813082847718468539">साइट जानकारी देखें</translation> +<translation id="8136852699834914183">इस पेज के लिए वीडियो चलाने की सुविधा उपलब्ध नहीं है.</translation> <translation id="8137562778192957619">आपको यह पासवर्ड याद नहीं रखना पड़ेगा. यह Google Password Manager में सेव हो जाएगा.</translation> <translation id="8186512483418048923"><ph name="FILES" /> फ़ाइलें बची हैं</translation> <translation id="8189750580333936930">प्राइवसी सैंडबॉक्स</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index e83ea1b..afe392d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Otvori novu karticu u grupi</translation> <translation id="1103142993930332957">Želite li pomoći poboljšati Chrome?</translation> <translation id="1105960400813249514">Snimka zaslona</translation> -<translation id="1108214977745280468">Prikaži uvide na stranici</translation> <translation id="1108938384783527433">Sinkronizacija povijesti</translation> <translation id="1110914759170138831">Isticanje je skraćeno</translation> <translation id="1111673857033749125">Ovdje će se prikazivati oznake koje ste spremili na drugim uređajima.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepija</translation> <translation id="4062305924942672200">Pravne informacije</translation> <translation id="4072805772816336153">Pokušajte ponovo kasnije</translation> -<translation id="4080602171844412446">Povezani uvidi</translation> <translation id="4084682180776658562">Oznaka</translation> <translation id="4084712963632273211">Objavio <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />omogućio Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Pomoću ovog tableta možete se prijaviti na uređaju na kojem se prikazuje ovaj QR kôd.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index dc055a4..b53d493 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">Megnyitás új lapon, csoportban</translation> <translation id="1103142993930332957">Segíteni szeretne a Chrome fejlesztésében?</translation> <translation id="1105960400813249514">Képernyőrögzítés</translation> -<translation id="1108214977745280468">Oldalstatisztikák mutatása</translation> <translation id="1108938384783527433">Előzmények szinkronizálása</translation> <translation id="1110914759170138831">Kiemelés lerövidítve</translation> <translation id="1111673857033749125">A más eszközökön mentett könyvjelzők itt jelennek meg.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">Szépia</translation> <translation id="4062305924942672200">Jogi információk</translation> <translation id="4072805772816336153">Próbálja újra később</translation> -<translation id="4080602171844412446">Kapcsolódó információk</translation> <translation id="4084682180776658562">Könyvjelző</translation> <translation id="4084712963632273211">A következőtől: <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />megjelenítette a Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Ezzel a táblagéppel bejelentkezhet a QR-kódot megjelenítő eszközön.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index cab16683..f344bf2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Բացել նոր խմբի նոր ներդիրում</translation> <translation id="1103142993930332957">Օգնեք բարելավել Chrome-ը</translation> <translation id="1105960400813249514">Էկրանի լուսանկարում</translation> -<translation id="1108214977745280468">Դիտել էջի վիճակագրությունը</translation> <translation id="1108938384783527433">Պատմության համաժամացում</translation> <translation id="1110914759170138831">Ընդգծված տեքստը կրճատվել է</translation> <translation id="1111673857033749125">Ձեր մյուս սարքերում պահված էջանիշները կտեսնեք այստեղ:</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Սեպիա</translation> <translation id="4062305924942672200">Իրավական տեղեկություններ</translation> <translation id="4072805772816336153">Փորձեք ավելի ուշ</translation> -<translation id="4080602171844412446">Առնչվող տեղեկություններ</translation> <translation id="4084682180776658562">Էջանիշ</translation> <translation id="4084712963632273211">Բովանդակությունը՝ <ph name="PUBLISHER_ORIGIN" /> կայքից։ <ph name="BEGIN_DEEMPHASIZED" />Մատուցվում է Google-ի կողմից<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Դուք կարող եք օգտագործել այս պլանշետը՝ հաշիվ մուտք գործելու սարքում, որում ցուցադրված է այս QR կոդը։</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 2b86c23e..78d44c9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Buka pada tab baru di grup</translation> <translation id="1103142993930332957">Bantu tingkatkan kualitas Chrome?</translation> <translation id="1105960400813249514">Screenshot</translation> -<translation id="1108214977745280468">Lihat insight halaman</translation> <translation id="1108938384783527433">Sinkronisasi histori</translation> <translation id="1110914759170138831">Sorotan dipersingkat</translation> <translation id="1111673857033749125">Bookmark yang tersimpan di perangkat lainnya akan muncul di sini.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Informasi hukum</translation> <translation id="4072805772816336153">Coba lagi nanti</translation> -<translation id="4080602171844412446">Info Terkait</translation> <translation id="4084682180776658562">Bookmark</translation> <translation id="4084712963632273211">Dari <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />dikirim oleh Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Anda dapat menggunakan tablet ini untuk login di perangkat yang menampilkan kode QR ini.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index d7fac6a..736c48e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Opna á nýjum flipa í hópi</translation> <translation id="1103142993930332957">Viltu hjálpa við að bæta Chrome?</translation> <translation id="1105960400813249514">Skjámyndataka</translation> -<translation id="1108214977745280468">Skoða upplýsingar um síðu</translation> <translation id="1108938384783527433">Samstilla feril</translation> <translation id="1110914759170138831">Áherslumerktur texti var styttur</translation> <translation id="1111673857033749125">Bókamerki vistuð í öðrum tækjum munu birtast hér.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Brúnn blær</translation> <translation id="4062305924942672200">Lagalegar upplýsingar</translation> <translation id="4072805772816336153">Reyndu aftur síðar</translation> -<translation id="4080602171844412446">Tengdar upplýsingar</translation> <translation id="4084682180776658562">Bókamerki</translation> <translation id="4084712963632273211">Frá <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />birt af Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Þú getur notað þessa spjaldtölvu til að skrá þig inn í tækinu sem birtir þennan QR-kóða.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index f65e9d38..9153c986 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Apri in nuova scheda in gruppo</translation> <translation id="1103142993930332957">Vuoi contribuire a migliorare Chrome?</translation> <translation id="1105960400813249514">Acquisizione schermo</translation> -<translation id="1108214977745280468">Mostra statistiche pagine</translation> <translation id="1108938384783527433">Sincronizzazione della cronologia</translation> <translation id="1110914759170138831">Testo del contenuto in evidenza abbreviato</translation> <translation id="1111673857033749125">I preferiti salvati sugli altri dispositivi verranno visualizzati qui.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Seppia</translation> <translation id="4062305924942672200">Informazioni legali</translation> <translation id="4072805772816336153">Riprova più tardi</translation> -<translation id="4080602171844412446">Approfondimenti correlati</translation> <translation id="4084682180776658562">Aggiungi ai Preferiti</translation> <translation id="4084712963632273211">Di <ph name="PUBLISHER_ORIGIN" /> - <ph name="BEGIN_DEEMPHASIZED" />pubblicata da Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Puoi utilizzare questo tablet per accedere sul dispositivo che mostra questo codice QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index 5f783854..87b692e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">פתיחה בכרטיסייה חדשה בקבוצה</translation> <translation id="1103142993930332957">רוצה לעזור לנו לשפר את Chrome?</translation> <translation id="1105960400813249514">צילום מסך</translation> -<translation id="1108214977745280468">הצגת התובנות לגבי הדף</translation> <translation id="1108938384783527433">סנכרון ההיסטוריה</translation> <translation id="1110914759170138831">ההדגשה קוצרה</translation> <translation id="1111673857033749125">סימניות שנשמרו במכשירים האחרים שלך יופיעו כאן.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">חום-ספיה</translation> <translation id="4062305924942672200">מידע משפטי</translation> <translation id="4072805772816336153">יש לנסות שוב מאוחר יותר</translation> -<translation id="4080602171844412446">תובנות קשורות</translation> <translation id="4084682180776658562">סימנייה</translation> <translation id="4084712963632273211">מאת <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />מוגש על-ידי Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">יש לך אפשרות להשתמש בטאבלט הזה כדי להיכנס לחשבון במכשיר שמוצג בו קוד ה-QR הזה.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index 7698f03..157deea 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">新しいタブをグループで開く</translation> <translation id="1103142993930332957">Chrome の改善にご協力ください</translation> <translation id="1105960400813249514">スクリーン キャプチャ</translation> -<translation id="1108214977745280468">ページの関連情報を表示</translation> <translation id="1108938384783527433">履歴の同期</translation> <translation id="1110914759170138831">ハイライト表示のテキストは一部省略されています</translation> <translation id="1111673857033749125">他のデバイスに保存されているブックマークがここに表示されます。</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">セピア</translation> <translation id="4062305924942672200">法的情報</translation> <translation id="4072805772816336153">しばらくしてからもう一度お試しください</translation> -<translation id="4080602171844412446">関連分析情報</translation> <translation id="4084682180776658562">ブックマーク</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> のコンテンツ - <ph name="BEGIN_DEEMPHASIZED" />Google により配信<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">この QR コードが表示されているデバイスに、このタブレットを使用してログインできます。</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index 7ce3b5b..7ba6c63 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">ჯგუფში ახალ ჩანართზე გახსნა</translation> <translation id="1103142993930332957">გსურთ, ხელი შეუწყოთ Chrome-ის გაუმჯობესებას?</translation> <translation id="1105960400813249514">ეკრანის აღბეჭდვა</translation> -<translation id="1108214977745280468">გვერდის ანალიზის ნახვა</translation> <translation id="1108938384783527433">ისტორიის სინქრონიზაცია</translation> <translation id="1110914759170138831">მონიშნული ტექსტი შემოკლდა</translation> <translation id="1111673857033749125">თქვენს სხვა მოწყობილობებზე შენახული ჩანართები აქ გამოჩნდება.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">სეპია</translation> <translation id="4062305924942672200">იურიდიული ინფორმაცია</translation> <translation id="4072805772816336153">ცადეთ მოგვიანებით</translation> -<translation id="4080602171844412446">დაკავშირებული ანალიზები</translation> <translation id="4084682180776658562">სანიშნე</translation> <translation id="4084712963632273211">წყარო: <ph name="PUBLISHER_ORIGIN" /> — <ph name="BEGIN_DEEMPHASIZED" />უზრუნველყოფს Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">ამ ტაბლეტის მეშვეობით შეგიძლიათ შეხვიდეთ მოწყობილობაში, რომელზეც ნაჩვენებია ეს QR კოდი.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index ee64742..d428935 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Топтағы жаңа қойындыдан ашу</translation> <translation id="1103142993930332957">Chrome браузерін жақсартуға көмектесесіз бе?</translation> <translation id="1105960400813249514">Экранды жазып алу</translation> -<translation id="1108214977745280468">Бет статистикасын көру</translation> <translation id="1108938384783527433">Тарихты синхрондау</translation> <translation id="1110914759170138831">Ерекшелеу қысқартылды.</translation> <translation id="1111673857033749125">Басқа құрылғыларда сақталған бетбелгілер осы жерде шығады.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Сепия</translation> <translation id="4062305924942672200">Құқықтық ақпарат</translation> <translation id="4072805772816336153">Кейінірек қайталап көріңіз.</translation> -<translation id="4080602171844412446">Қатысты статистика</translation> <translation id="4084682180776658562">Бетбелгі</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> жариялаған, <ph name="BEGIN_DEEMPHASIZED" />Google ұсынады<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Бұл планшетті осы QR кодын көрсетіп тұрған құрылғыға кіру үшін пайдалана аласыз.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index 22dfa33..862a745 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">បើកនៅក្នុងផ្ទាំងថ្មីនៅក្នុងក្រុម</translation> <translation id="1103142993930332957">ជួយកែលម្អ Chrome ដែរទេ?</translation> <translation id="1105960400813249514">ការថតអេក្រង់</translation> -<translation id="1108214977745280468">មើលស្ថិតិទំព័រ</translation> <translation id="1108938384783527433">សមកាលកម្មប្រវត្តិ</translation> <translation id="1110914759170138831">ការរំលេចត្រូវបានកាត់ឱ្យខ្លី</translation> <translation id="1111673857033749125">ចំណាំដែលបានរក្សាទុកនៅលើឧបករណ៍ផ្សេងទៀតរបស់អ្នកនឹងបង្ហាញនៅទីនេះ</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">ព័ត៌មានផ្លូវច្បាប់</translation> <translation id="4072805772816336153">ព្យាយាមម្តងទៀតនៅពេលក្រោយ</translation> -<translation id="4080602171844412446">ស្ថិតិដែលពាក់ព័ន្ធ</translation> <translation id="4084682180776658562">ចំណាំ</translation> <translation id="4084712963632273211">ពី <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />បានបញ្ជូនដោយ Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">អ្នកអាចប្រើថេប្លេតនេះ ដើម្បីចូលគណនីនៅលើឧបករណ៍ដែលកំពុងបង្ហាញកូដ QR នេះ។</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb index 9799de75..c011bd8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">ಗುಂಪಿನ ಹೊಸ ಟ್ಯಾಬ್ನಲ್ಲಿ ತೆರೆ</translation> <translation id="1103142993930332957">Chrome ಸುಧಾರಿಸಲು ಸಹಾಯ ಮಾಡಬೇಕೇ?</translation> <translation id="1105960400813249514">ಪರದೆ ಕ್ಯಾಪ್ಚರ್</translation> -<translation id="1108214977745280468">ಪುಟದ ಒಳನೋಟಗಳನ್ನು ವೀಕ್ಷಿಸಿ</translation> <translation id="1108938384783527433">ಇತಿಹಾಸ ಸಿಂಕ್</translation> <translation id="1110914759170138831">ಹೈಲೈಟ್ ಅನ್ನು ಸಂಕುಚಿಸಲಾಗಿದೆ</translation> <translation id="1111673857033749125">ನಿಮ್ಮ ಇತರ ಸಾಧನಗಳಲ್ಲಿ ಉಳಿಸಲಾದ ಬುಕ್ಮಾರ್ಕ್ಗಳು ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">ಸೆಪಿಯಾ</translation> <translation id="4062305924942672200">ಕಾನೂನು ಮಾಹಿತಿ</translation> <translation id="4072805772816336153">ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation> -<translation id="4080602171844412446">ಸಂಬಂಧಿತ ಒಳನೋಟಗಳು</translation> <translation id="4084682180776658562">ಬುಕ್ಮಾರ್ಕ್</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> ಅವರಿಂದ – <ph name="BEGIN_DEEMPHASIZED" />Google ನಿಂದ ವಿತರಿಸಲಾಗಿದೆ<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">ಈ QR ಕೋಡ್ ಅನ್ನು ಪ್ರದರ್ಶಿಸುವ ಸಾಧನದಲ್ಲಿ ಸೈನ್ ಇನ್ ಮಾಡಲು ನೀವು ಈ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಬಳಸಬಹುದು.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index 3c82571..9681ec5d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">새 탭을 그룹에서 열기</translation> <translation id="1103142993930332957">Chrome을 개선하는 데 도움을 주시겠어요?</translation> <translation id="1105960400813249514">화면 캡처</translation> -<translation id="1108214977745280468">페이지 통계 보기</translation> <translation id="1108938384783527433">방문 기록 동기화</translation> <translation id="1110914759170138831">강조표시가 잘렸습니다.</translation> <translation id="1111673857033749125">다른 기기에서 저장한 북마크가 여기에 표시됩니다.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">세피아</translation> <translation id="4062305924942672200">법적 정보</translation> <translation id="4072805772816336153">나중에 다시 시도해 보세요.</translation> -<translation id="4080602171844412446">관련 유용한 정보</translation> <translation id="4084682180776658562">북마크</translation> <translation id="4084712963632273211">발신자: <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />Google 제공<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">이 태블릿을 사용하여 이 QR 코드가 표시된 기기에 로그인할 수 있습니다.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index db177e7ed..60cfb073 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Топтогу жаңы өтмөктө ачуу</translation> <translation id="1103142993930332957">Chrome'ду жакшыртууга жардам бере аласызбы?</translation> <translation id="1105960400813249514">Экранды тартып алуу</translation> -<translation id="1108214977745280468">Барак статистикасын көрүү</translation> <translation id="1108938384783527433">Таржымалды шайкештирүү</translation> <translation id="1110914759170138831">Кызыктуу көз ирмемдер кыскартылды</translation> <translation id="1111673857033749125">Башка түзмөктөрүңүздө сакталган кыстармалар ушул жерден көрүнөт.</translation> @@ -577,7 +576,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Юридикалык маалымат</translation> <translation id="4072805772816336153">Бир аздан кийин кайталап көрүңүз</translation> -<translation id="4080602171844412446">Окшош статистика</translation> <translation id="4084682180776658562">Кыстарма</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> веб сайтынан – <ph name="BEGIN_DEEMPHASIZED" />Google аркылуу жеткирилген<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Бул планшет менен ушул QR код көрүнүп турган түзмөккө кире аласыз.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index c7c42bd8..6ed7a41 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">ເປີດໃນແຖບໃໝ່ເປັນກຸ່ມ</translation> <translation id="1103142993930332957">ຊ່ວຍປັບປຸງ Chrome ບໍ?</translation> <translation id="1105960400813249514">ການຖ່າຍຮູບໜ້າຈໍ</translation> -<translation id="1108214977745280468">ເບິ່ງຂໍ້ມູນເຈາະເລິກຂອງໜ້າ</translation> <translation id="1108938384783527433">ການຊິ້ງຂໍ້ມູນປະຫວັດ</translation> <translation id="1110914759170138831">ຫຍໍ້ໄຮໄລ້ໃຫ້ສັ້ນລົງແລ້ວ</translation> <translation id="1111673857033749125">ບຸກມາກທີ່ບັນທຶກໄວ້ຢູ່ໃນອຸປະກອນອື່ນຂອງທ່ານຈະປາກົດຢູ່ທີ່ນີ້.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">ສີນໍ້າຕານດໍາ</translation> <translation id="4062305924942672200">ຂໍ້ມູນທາງດ້ານກົດຫມາຍ</translation> <translation id="4072805772816336153">ລອງໃໝ່ໃນພາຍຫລັງ</translation> -<translation id="4080602171844412446">ຂໍ້ມູນເຈາະເລິກທີ່ກ່ຽວຂ້ອງ</translation> <translation id="4084682180776658562">ບຸກມາກຄ໌</translation> <translation id="4084712963632273211">ຈາກ <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />ສົ່ງໃຫ້ໂດຍ Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">ທ່ານສາມາດໃຊ້ແທັບເລັດເຄື່ອງນີ້ເພື່ອເຂົ້າສູ່ລະບົບຢູ່ອຸປະກອນທີ່ສະແດງລະຫັດ QR ນີ້ໄດ້.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index 22559f0e9..e036a4d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Atidar. naujame grup. skirtuke</translation> <translation id="1103142993930332957">Norite padėti tobulinti „Chrome“?</translation> <translation id="1105960400813249514">Ekrano fiksavimas</translation> -<translation id="1108214977745280468">Žr. puslapio įžvalgas</translation> <translation id="1108938384783527433">Istorijos sinchronizavimas</translation> <translation id="1110914759170138831">Paryškinimas sutrumpintas</translation> <translation id="1111673857033749125">Čia bus rodomos kituose įrenginiuose išsaugotos žymės.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepija</translation> <translation id="4062305924942672200">Teisinė informacija</translation> <translation id="4072805772816336153">Vėliau bandykite dar kartą</translation> -<translation id="4080602171844412446">Susijusios įžvalgos</translation> <translation id="4084682180776658562">Žymė</translation> <translation id="4084712963632273211">Nuo <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />pateikė „Google“<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Naudodami šį planšetinį kompiuterį galite prisijungti prie įrenginio, kuriame rodomas šis QR kodas.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index 61a46e86..030b7e1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Atvērt jaunu cilni grupā</translation> <translation id="1103142993930332957">Palīdziet uzlabot Chrome</translation> <translation id="1105960400813249514">Ekrāna tveršana</translation> -<translation id="1108214977745280468">Atvērt lapu ieskatus</translation> <translation id="1108938384783527433">Vēstures sinhronizēšana</translation> <translation id="1110914759170138831">Izceltais teksts tika apgriezts.</translation> <translation id="1111673857033749125">Šeit būs redzamas grāmatzīmes, kuras esat saglabājis citās ierīcēs.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sēpija</translation> <translation id="4062305924942672200">Juridiskā informācija</translation> <translation id="4072805772816336153">Vēlāk mēģiniet vēlreiz.</translation> -<translation id="4080602171844412446">Saistīti ieskati</translation> <translation id="4084682180776658562">Grāmatzīme</translation> <translation id="4084712963632273211">No izdevēja <ph name="PUBLISHER_ORIGIN" /> — <ph name="BEGIN_DEEMPHASIZED" />nodrošina Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Izmantojot šo planšetdatoru, varat pierakstīties ierīcē, kurā tiek rādīts šis kvadrātkods.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb index abbd1e5..876834a5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Отвори во нова картичка во група</translation> <translation id="1103142993930332957">Дали ќе ни помогнете да го подобриме Chrome?</translation> <translation id="1105960400813249514">Screen Capture</translation> -<translation id="1108214977745280468">Прикажи увиди за страниците</translation> <translation id="1108938384783527433">Синхронизација на историја</translation> <translation id="1110914759170138831">Клучните точки се скратени</translation> <translation id="1111673857033749125">Обележувачите зачувани на другите уреди ќе се појават тука.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Правни информации</translation> <translation id="4072805772816336153">Обидете се повторно подоцна</translation> -<translation id="4080602171844412446">Поврзани увиди</translation> <translation id="4084682180776658562">Обележувач</translation> <translation id="4084712963632273211">Од <ph name="PUBLISHER_ORIGIN" /> - <ph name="BEGIN_DEEMPHASIZED" />испорачано од Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Може да го користите таблетов за да се најавите на уредот што го прикажува QR-кодов.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb index 63d32a5..15fad955 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">ഗ്രൂപ്പിലെ പുതിയ ടാബിൽ തുറക്കൂ</translation> <translation id="1103142993930332957">Chrome മെച്ചപ്പെടുത്താൻ സഹായിക്കണോ?</translation> <translation id="1105960400813249514">സ്ക്രീൻ ക്യാപ്ചർ</translation> -<translation id="1108214977745280468">പേജ് ഉൾക്കാഴ്ചകൾ കാണുക</translation> <translation id="1108938384783527433">ചരിത്രം സമന്വയിപ്പിക്കൽ</translation> <translation id="1110914759170138831">ഹെെലെെറ്റ് ഹ്വസ്വമാക്കി</translation> <translation id="1111673857033749125">നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിൽ സംരക്ഷിച്ച ബുക്ക്മാർക്കുകൾ ഇവിടെ ദൃശ്യമാകും.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">സിപിയ</translation> <translation id="4062305924942672200">നിയമ വിവരങ്ങൾ</translation> <translation id="4072805772816336153">പിന്നീട് വീണ്ടും ശ്രമിക്കുക</translation> -<translation id="4080602171844412446">അനുബന്ധ ഉൾക്കാഴ്ചകൾ</translation> <translation id="4084682180776658562">ബുക്മാര്ക്ക്</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" />-ൽ നിന്ന് – <ph name="BEGIN_DEEMPHASIZED" />Google നൽകുന്നത്<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">ഈ QR കോഡ് ദൃശ്യമാക്കുന്ന ഉപകരണത്തിൽ സൈൻ ഇൻ ചെയ്യാൻ നിങ്ങൾക്ക് ഈ ടാബ്ലെറ്റ് ഉപയോഗിക്കാം.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index 911c36c..d2d4833 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Бүлэгт шинэ табад нээнэ үү</translation> <translation id="1103142993930332957">Chrome-г сайжруулахад туслах уу?</translation> <translation id="1105960400813249514">Дэлгэцийн зураг авах</translation> -<translation id="1108214977745280468">Хуудасны статистикийг харах</translation> <translation id="1108938384783527433">Түүхийг синк хийх</translation> <translation id="1110914759170138831">Тодруулгыг богиносгосон</translation> <translation id="1111673857033749125">Таны бусад төхөөрөмжид хадгалсан хавчуурга энд харагдах болно</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Сепиа</translation> <translation id="4062305924942672200">Хууль, эрх зүйн мэдээлэл</translation> <translation id="4072805772816336153">Дараа дахин оролдоно уу</translation> -<translation id="4080602171844412446">Холбоотой статистик</translation> <translation id="4084682180776658562">Хадгалах</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" />-с – <ph name="BEGIN_DEEMPHASIZED" />Google-с хүргэсэн<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Та энэ QR кодыг үзүүлж буй төхөөрөмжид нэвтрэхийн тулд энэ таблетыг ашиглах боломжтой.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index ff92700..15beeccf 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">गटामधील नवीन टॅबमध्ये उघडा</translation> <translation id="1103142993930332957">Chrome मध्ये सुधारणा करण्यात मदत करायची आहे का?</translation> <translation id="1105960400813249514">स्क्रीन कॅप्चर</translation> -<translation id="1108214977745280468">पेज इनसाइट पहा</translation> <translation id="1108938384783527433">इतिहास सिंक करा</translation> <translation id="1110914759170138831">हायलाइट केलेला मजकूर संक्षिप्त केला होता</translation> <translation id="1111673857033749125">आपल्या इतर डिव्हाइसेेसवर सेव्ह केलेले बुकमार्क येथे दिसतील.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">सेपिया</translation> <translation id="4062305924942672200">कायदेशीर माहिती</translation> <translation id="4072805772816336153">नंतर पुन्हा प्रयत्न करा</translation> -<translation id="4080602171844412446">संबंधित इनसाइट</translation> <translation id="4084682180776658562">बुकमार्क</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> कडून – <ph name="BEGIN_DEEMPHASIZED" />Google ने वितरित केले<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">तुम्ही हा QR कोड प्रदर्शित करणाऱ्या डिव्हाइसवर साइन इन करण्यासाठी हा टॅबलेट वापरू शकता.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index ebb0d87..b78219b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">Buka dlm tab baru dlm kumpulan</translation> <translation id="1103142993930332957">Bantu kami menambah baik Chrome?</translation> <translation id="1105960400813249514">Tangkapan Skrin</translation> -<translation id="1108214977745280468">Lihat cerapan halaman</translation> <translation id="1108938384783527433">Penyegerakan sejarah</translation> <translation id="1110914759170138831">Serlahan dipendekkan</translation> <translation id="1111673857033749125">Penanda halaman yang disimpan pada peranti anda yang lain akan dipaparkan di sini.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Maklumat undang-undang</translation> <translation id="4072805772816336153">Cuba lagi nanti</translation> -<translation id="4080602171844412446">Cerapan Berkaitan</translation> <translation id="4084682180776658562">Penanda halaman</translation> <translation id="4084712963632273211">Daripada <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />disampaikan oleh Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Anda boleh menggunakan tablet ini untuk log masuk pada peranti yang memaparkan kod QR ini.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index b50af09..de75bdf9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">အုပ်စုရှိ တဘ်အသစ်တွင် ဖွင့်ပါ</translation> <translation id="1103142993930332957">Chrome ပိုကောင်းစေရန် ကူညီမလား။</translation> <translation id="1105960400813249514">ဖန်သားပြင် ပုံဖမ်းခြင်း</translation> -<translation id="1108214977745280468">စာမျက်နှာ၏သိကောင်းစရာ ကြည့်ရန်</translation> <translation id="1108938384783527433">မှတ်တမ်းစင့်ခ်လုပ်ခြင်း</translation> <translation id="1110914759170138831">မြင်သာအောင်လုပ်ထားသော စာသားကို အတိုချုံ့လိုက်သည်</translation> <translation id="1111673857033749125">သင်၏ အခြားစက်ပစ္စည်းများပေါ်တွင် သိမ်းဆည်းထားသည့် ဝဘ်လိပ်စာများ ဤနေရာတွင် ပေါ်ပါမည်။</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">တရားဝင် သိသင့်စရာများ</translation> <translation id="4072805772816336153">နောက်မှ ထပ်စမ်းကြည့်ပါ</translation> -<translation id="4080602171844412446">ဆက်စပ်သိကောင်းစရာများ</translation> <translation id="4084682180776658562">စာညှပ်</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> မှ – <ph name="BEGIN_DEEMPHASIZED" />Google က ဖြန့်ချိပေးခြင်းဖြစ်သည်<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">ဤ QR ကုဒ် ပြထားသောစက်တွင် လက်မှတ်ထိုးဝင်ရန် ဤတက်ဘလက်ကို သုံးနိုင်သည်။</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index 7792561b..839b0507 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">समूहमा नयाँ ट्याबमा खोल्नुहोस्</translation> <translation id="1103142993930332957">Chrome को गुणस्तर सुधार्न सघाउने हो?</translation> <translation id="1105960400813249514">स्क्रिन क्याप्चर</translation> -<translation id="1108214977745280468">यो पेजको विश्लेषणात्मक डेटा हेर्नुहोस्</translation> <translation id="1108938384783527433">ब्राउजिङ इतिहास सिंक गरियोस्</translation> <translation id="1110914759170138831">हाइलाइट गरिएको पाठ छोट्याइएको छ</translation> <translation id="1111673857033749125">तपाईँका अन्य डिभाइसमा सुरक्षित गरिएका पुस्तक चिन्हहरू यहाँ देखिनेछन्।</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">सेपिया</translation> <translation id="4062305924942672200">कानूनी जानकारी</translation> <translation id="4072805772816336153">पछि फेरि प्रयास गर्नुहोस्</translation> -<translation id="4080602171844412446">सम्बन्धित विश्लेषणात्मक डेटा</translation> <translation id="4084682180776658562">बुकमार्क</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> द्वारा – <ph name="BEGIN_DEEMPHASIZED" />Google ले डेलिभर गरेको<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">तपाईं यो QR कोड देखिइरहेको डिभाइसमा साइन इन गर्न यो ट्याब्लेट प्रयोग गर्न सक्नुहुन्छ।</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index 30e3e3b8..e699d73 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">Open in nieuw tabblad in groep</translation> <translation id="1103142993930332957">Wil je Chrome helpen verbeteren?</translation> <translation id="1105960400813249514">Schermopname</translation> -<translation id="1108214977745280468">Pagina-inzichten bekijken</translation> <translation id="1108938384783527433">Geschiedenissynchronisatie</translation> <translation id="1110914759170138831">Markering is ingekort</translation> <translation id="1111673857033749125">Hier zie je bookmarks die je op andere apparaten hebt opgeslagen.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Juridische informatie</translation> <translation id="4072805772816336153">Probeer het later opnieuw</translation> -<translation id="4080602171844412446">Gerelateerde inzichten</translation> <translation id="4084682180776658562">Bookmark maken</translation> <translation id="4084712963632273211">Van <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />geleverd door Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Je kunt deze tablet gebruiken om in te loggen op het apparaat waarop deze QR-code wordt getoond.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index 3f840b42..5d1555e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Åpne i en ny fane i en gruppe</translation> <translation id="1103142993930332957">Vil du bidra til å gjøre Chrome bedre?</translation> <translation id="1105960400813249514">Skjermdump</translation> -<translation id="1108214977745280468">Se sidestatistikk</translation> <translation id="1108938384783527433">Loggsynkronisering</translation> <translation id="1110914759170138831">Markeringen ble forkortet</translation> <translation id="1111673857033749125">Bokmerker som er lagret på de andre enhetene dine, vises her.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Juridisk informasjon</translation> <translation id="4072805772816336153">Prøv på nytt senere</translation> -<translation id="4080602171844412446">Relatert statistikk</translation> <translation id="4084682180776658562">Legg til bokmerke</translation> <translation id="4084712963632273211">Fra <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />levert av Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Du kan bruke dette nettbrettet til å logge på enheten som viser denne QR-koden.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index 26d7a18..59f66fd7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">ଗୋଷ୍ଠୀରେ ନୂଆ ଟାବ୍ରେ ଖୋଲନ୍ତୁ</translation> <translation id="1103142993930332957">Chromeକୁ ଉନ୍ନତ କରିବାରେ ସହାୟତା କରିବେ?</translation> <translation id="1105960400813249514">ସ୍କ୍ରିନ୍ କ୍ୟାପ୍ଚର୍</translation> -<translation id="1108214977745280468">ପୃଷ୍ଠା ଇନସାଇଟ ଭ୍ୟୁ କରନ୍ତୁ</translation> <translation id="1108938384783527433">ଇତିହାସ ସିଙ୍କ</translation> <translation id="1110914759170138831">ହାଇଲାଇଟକୁ ଛୋଟ କରାଯାଇଛି</translation> <translation id="1111673857033749125">ଏଠାରେ, ଆପଣଙ୍କର ଅନ୍ୟ ଡିଭାଇସ୍ରେ ସେଭ୍ ହୋଇଥିବା ବୁକ୍ମାର୍କ ଦେଖାଯିବ।</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">ସେପିଆ</translation> <translation id="4062305924942672200">ଆଇନଗତ ସୂଚନା</translation> <translation id="4072805772816336153">ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ</translation> -<translation id="4080602171844412446">ସମ୍ବନ୍ଧିତ ଇନସାଇଟ</translation> <translation id="4084682180776658562">ବୁକମାର୍କ</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" />ଙ୍କ ଠାରୁ – <ph name="BEGIN_DEEMPHASIZED" />Google ଦ୍ୱାରା ବିତରଣ କରାଯାଇଛି<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">ଏହି QR କୋଡ ଡିସପ୍ଲେ କରୁଥିବା ଡିଭାଇସରେ ସାଇନ ଇନ କରିବା ପାଇଁ ଆପଣ ଏହି ଟାବଲେଟକୁ ବ୍ୟବହାର କରିପାରିବେ।</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index 7f9da5c9..6299db4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">ਗਰੁੱਪ 'ਚ ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> <translation id="1103142993930332957">ਕੀ Chrome ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> <translation id="1105960400813249514">ਸਕ੍ਰੀਨ ਕੈਪਚਰ</translation> -<translation id="1108214977745280468">ਪੰਨੇ ਦੀਆਂ ਅੰਦਰੂਨੀ-ਝਾਤਾਂ ਦੇਖੋ</translation> <translation id="1108938384783527433">ਇਤਿਹਾਸ ਸਿੰਕ</translation> <translation id="1110914759170138831">ਹਾਈਲਾਈਟ ਨੂੰ ਛੋਟਾ ਕੀਤਾ ਗਿਆ</translation> <translation id="1111673857033749125">ਤੁਹਾਡੀਆਂ ਹੋਰ ਡੀਵਾਈਸ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤੇ ਬੁੱਕਮਾਰਕ ਇੱਥੇ ਵਿਖਾਈ ਦੇਣਗੇ।</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">ਕਨੂੰਨੀ ਜਾਣਕਾਰੀ</translation> <translation id="4072805772816336153">ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation> -<translation id="4080602171844412446">ਸੰਬੰਧਿਤ ਅੰਦਰੂਨੀ-ਝਾਤਾਂ</translation> <translation id="4084682180776658562">ਬੁੱਕਮਾਰਕ</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> ਤੋਂ – <ph name="BEGIN_DEEMPHASIZED" />Google ਰਾਹੀਂ ਡਿਲੀਵਰ ਕੀਤਾ ਗਿਆ<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">ਤੁਸੀਂ ਇਸ QR ਕੋਡ ਨੂੰ ਦਿਖਾਉਣ ਵਾਲੇ ਡੀਵਾਈਸ 'ਤੇ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਇਸ ਟੈਬਲੈੱਟ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ।</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index d4fe5b8..05899ac 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">Otwórz w nowej karcie w grupie</translation> <translation id="1103142993930332957">Pomożesz w ulepszaniu Chrome?</translation> <translation id="1105960400813249514">Zrzut ekranu</translation> -<translation id="1108214977745280468">Wyświetl statystyki strony</translation> <translation id="1108938384783527433">Synchronizacja historii</translation> <translation id="1110914759170138831">Podświetlenie zostało skrócone</translation> <translation id="1111673857033749125">Tutaj wyświetlą się zakładki z innych urządzeń.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Informacje prawne</translation> <translation id="4072805772816336153">Spróbuj ponownie później</translation> -<translation id="4080602171844412446">Powiązane informacje</translation> <translation id="4084682180776658562">Dodaj do zakładek</translation> <translation id="4084712963632273211">Opublikowane na <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />wyświetlone przez Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Za pomocą tego tabletu możesz zalogować się na urządzeniu, na którym wyświetlany jest ten kod QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index a649492..aaf6a58 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">Abrir em nova guia no grupo</translation> <translation id="1103142993930332957">Quer ajudar a melhorar o Chrome?</translation> <translation id="1105960400813249514">Captura de tela</translation> -<translation id="1108214977745280468">Mostrar insights da página</translation> <translation id="1108938384783527433">Sincronizar histórico</translation> <translation id="1110914759170138831">O destaque foi reduzido</translation> <translation id="1111673857033749125">Favoritos salvos nos seus outros dispositivos serão exibidos aqui.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">Sépia</translation> <translation id="4062305924942672200">Informações legais</translation> <translation id="4072805772816336153">Tente novamente mais tarde</translation> -<translation id="4080602171844412446">Insights relacionados</translation> <translation id="4084682180776658562">Favorito</translation> <translation id="4084712963632273211">De <ph name="PUBLISHER_ORIGIN" />: <ph name="BEGIN_DEEMPHASIZED" />veiculado pelo Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Você pode usar o tablet para fazer login no dispositivo que está mostrando o código QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index f7b44a0..e27fa910 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">Abrir num novo sep. no grupo</translation> <translation id="1103142993930332957">Quer ajudar a melhorar o Chrome?</translation> <translation id="1105960400813249514">Ecrã a ser capturado...</translation> -<translation id="1108214977745280468">Ver estatísticas da página</translation> <translation id="1108938384783527433">Sincronização do histórico</translation> <translation id="1110914759170138831">O destaque foi abreviado</translation> <translation id="1111673857033749125">Os marcadores guardados nos seus outros dispositivos são apresentados aqui.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">Sépia</translation> <translation id="4062305924942672200">Informações legais</translation> <translation id="4072805772816336153">Tente mais tarde.</translation> -<translation id="4080602171844412446">Informações relacionadas</translation> <translation id="4084682180776658562">Marcar</translation> <translation id="4084712963632273211">De <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />fornecido pela Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Pode usar este tablet para iniciar sessão no dispositivo que está a apresentar este código QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index 9675e51..fb5ab4e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Deschide în filă nouă în grup</translation> <translation id="1103142993930332957">Ajuți la îmbunătățirea Chrome?</translation> <translation id="1105960400813249514">Captură de ecran</translation> -<translation id="1108214977745280468">Vezi statisticile privind paginile</translation> <translation id="1108938384783527433">Sincronizarea istoricului</translation> <translation id="1110914759170138831">Evidențierea a fost scurtată</translation> <translation id="1111673857033749125">Marcajele salvate pe alte dispozitive vor apărea aici.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Informații juridice</translation> <translation id="4072805772816336153">Încearcă din nou mai târziu</translation> -<translation id="4080602171844412446">Statistici conexe</translation> <translation id="4084682180776658562">Marcaj</translation> <translation id="4084712963632273211">De la <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />livrată de Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Poți folosi această tabletă pentru a te conecta la dispozitivul care afișează acest cod QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index e52ea3a6..d6fd9ed 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Открыть в новой вкладке группы</translation> <translation id="1103142993930332957">Помогите улучшить Chrome</translation> <translation id="1105960400813249514">Демонстрация экрана</translation> -<translation id="1108214977745280468">Открыть статистику страницы</translation> <translation id="1108938384783527433">Синхронизация истории</translation> <translation id="1110914759170138831">Выделенный текст сокращен.</translation> <translation id="1111673857033749125">Здесь появятся закладки, сохраненные на других устройствах.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Сепия</translation> <translation id="4062305924942672200">Юридическая информация</translation> <translation id="4072805772816336153">Повторите попытку позже.</translation> -<translation id="4080602171844412446">Статистика по теме</translation> <translation id="4084682180776658562">Закладка</translation> <translation id="4084712963632273211">Контент сайта <ph name="PUBLISHER_ORIGIN" />. <ph name="BEGIN_DEEMPHASIZED" />Получен с помощью Google<ph name="END_DEEMPHASIZED" />.</translation> <translation id="409109920254068737">Вы сможете использовать планшет, чтобы входить в аккаунт на устройстве, где показан этот QR-код.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index d5880ed..afc28b5e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">කණ්ඩායම තුළ නව පටිත්ත තුළ විවෘත කරන්න</translation> <translation id="1103142993930332957">Chrome වැඩිදියුණු කිරීමට උදව් කරන්නද?</translation> <translation id="1105960400813249514">තිර ග්රහණය</translation> -<translation id="1108214977745280468">පිටු ඇතුළාන්තයන් බලන්න</translation> <translation id="1108938384783527433">ඉතිහාසය සමමුහුර්ත කිරීම</translation> <translation id="1110914759170138831">උද්දීපනය කෙටි කරන ලදි</translation> <translation id="1111673857033749125">ඔබගේ අනෙකුත් උපාංගවල සුරැකි පිටුසන් මෙහි දිස් වනු ඇත.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">නෛතික තොරතුරු</translation> <translation id="4072805772816336153">පසුව නැවත උත්සාහ කරන්න</translation> -<translation id="4080602171844412446">අදාළ ඇතුළාන්ත</translation> <translation id="4084682180776658562">පිටු සලකුණ</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> වෙතින් – <ph name="BEGIN_DEEMPHASIZED" />Google විසින් බෙදා හරින ලදි<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">මෙම QR කේතය සංදර්ශනය කරන උපාංගයට පිරීමට ඔබට මෙම ටැබ්ලටය භාවිතා කළ හැක.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index 92d1662..03abcc7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Otvoriť v skupine na novej karte</translation> <translation id="1103142993930332957">Chcete pomôcť zlepšiť Chrome?</translation> <translation id="1105960400813249514">Snímanie obrazovky</translation> -<translation id="1108214977745280468">Zobraziť štatistiky stránky</translation> <translation id="1108938384783527433">Synchronizácia histórie</translation> <translation id="1110914759170138831">Fakt bol skrátený</translation> <translation id="1111673857033749125">Tu sa zobrazia záložky, ktoré ste uložili na iných zariadeniach.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sépia</translation> <translation id="4062305924942672200">Právne informácie</translation> <translation id="4072805772816336153">Skúste to neskôr</translation> -<translation id="4080602171844412446">Súvisiace štatistiky</translation> <translation id="4084682180776658562">Záložka</translation> <translation id="4084712963632273211">Od: <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />doručené Googlom<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Týmto tabletom sa môžete prihlásiť v zariadení, v ktorom je zobrazený tento QR kód.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index e59caa9..ae7e18c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Odpri nov zavihek v skupini</translation> <translation id="1103142993930332957">Želite pomagati izboljšati Chrome?</translation> <translation id="1105960400813249514">Zajemanje slike</translation> -<translation id="1108214977745280468">Podrobni podatki o strani</translation> <translation id="1108938384783527433">Sinhronizacija zgodovine</translation> <translation id="1110914759170138831">Označeno besedilo je bilo skrajšano.</translation> <translation id="1111673857033749125">Tu bodo prikazani zaznamki, shranjeni v drugih napravah.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepija</translation> <translation id="4062305924942672200">Pravne informacije</translation> <translation id="4072805772816336153">Poskusite znova pozneje</translation> -<translation id="4080602171844412446">Sorodni vpogledi</translation> <translation id="4084682180776658562">Zaznamek</translation> <translation id="4084712963632273211">Vsebino objavil <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />prikazuje jo Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Ta tablični računalnik lahko uporabite za prijavo v napravi, v kateri je prikazana ta koda QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index 498432e..43db9c1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Hap në skedë të re në grup</translation> <translation id="1103142993930332957">Do të ndihmosh për përmirësimin e Chrome?</translation> <translation id="1105960400813249514">Regjistrimi i ekranit</translation> -<translation id="1108214977745280468">Shiko statistikat e faqes</translation> <translation id="1108938384783527433">Sinkronizimi i historikut</translation> <translation id="1110914759170138831">Theksimi është shkurtuar</translation> <translation id="1111673857033749125">Faqeshënuesit e ruajtur në pajisjet e tua të tjera do të shfaqen këtu.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Informacioni ligjor</translation> <translation id="4072805772816336153">Provo përsëri më vonë</translation> -<translation id="4080602171844412446">Informacione të ngjashme</translation> <translation id="4084682180776658562">Faqeshënuesi</translation> <translation id="4084712963632273211">Nga <ph name="PUBLISHER_ORIGIN" /> - <ph name="BEGIN_DEEMPHASIZED" />dërguar nga Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Mund ta përdorësh këtë tablet për t'u identifikuar në pajisjen që po shfaq këtë kod QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index 15c2a75..ec41ad03 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Otvori u novoj kartici u grupi</translation> <translation id="1103142993930332957">Želite li da nam pomognete da poboljšamo Chrome?</translation> <translation id="1105960400813249514">Snimanje ekrana</translation> -<translation id="1108214977745280468">Prikaži uvid u stranicu</translation> <translation id="1108938384783527433">Sinhronizacija istorije</translation> <translation id="1110914759170138831">Istaknuta stavka je skraćena</translation> <translation id="1111673857033749125">Obeleživači sačuvani na drugim uređajima će se prikazati ovde.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepija</translation> <translation id="4062305924942672200">Pravne informacije</translation> <translation id="4072805772816336153">Probajte ponovo kasnije</translation> -<translation id="4080602171844412446">Povezani uvidi</translation> <translation id="4084682180776658562">Obeleživač</translation> <translation id="4084712963632273211">Od objavljivača <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />prikazuje Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Možete da koristite ovaj tablet da biste se prijavili na uređaju koji prikazuje ovaj QR kôd.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index d208d482..fc0b07d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Отвори у новој картици у групи</translation> <translation id="1103142993930332957">Желите ли да нам помогнете да побољшамо Chrome?</translation> <translation id="1105960400813249514">Снимање екрана</translation> -<translation id="1108214977745280468">Прикажи увид у страницу</translation> <translation id="1108938384783527433">Синхронизација историје</translation> <translation id="1110914759170138831">Истакнута ставка је скраћена</translation> <translation id="1111673857033749125">Обележивачи сачувани на другим уређајима ће се приказати овде.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Сепија</translation> <translation id="4062305924942672200">Правне информације</translation> <translation id="4072805772816336153">Пробајте поново касније</translation> -<translation id="4080602171844412446">Повезани увиди</translation> <translation id="4084682180776658562">Обележивач</translation> <translation id="4084712963632273211">Од објављивача <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />приказује Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Можете да користите овај таблет да бисте се пријавили на уређају који приказује овај QR кôд.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index 0aeb1c85..e548bff 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Öppna i en ny flik i en grupp</translation> <translation id="1103142993930332957">Vill du hjälpa till att förbättra Chrome?</translation> <translation id="1105960400813249514">Skärmavbildning</translation> -<translation id="1108214977745280468">Visa sidinsikter</translation> <translation id="1108938384783527433">Synkronisera historiken</translation> <translation id="1110914759170138831">Den markerade texten har förkortats</translation> <translation id="1111673857033749125">Här visas bokmärken som du har sparat på andra enheter.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Juridisk information</translation> <translation id="4072805772816336153">Försök igen senare</translation> -<translation id="4080602171844412446">Relaterade insikter</translation> <translation id="4084682180776658562">Lägg till bokmärke</translation> <translation id="4084712963632273211">Från <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />via Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Du kan logga in med surfplattans hjälp på den enhet där den här QR-koden visas.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index 858e83e..11740bd6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Fungua katika kichupo kipya cha kikundi</translation> <translation id="1103142993930332957">Ungependa kusaidia kuboresha Chrome?</translation> <translation id="1105960400813249514">Piga Picha ya Skrini</translation> -<translation id="1108214977745280468">Angalia maarifa ya ukurasa</translation> <translation id="1108938384783527433">Usawazishaji wa historia</translation> <translation id="1110914759170138831">Maandishi uliyoyaangazia yamefupishwa</translation> <translation id="1111673857033749125">Alamisho zilizohifadhiwa katika vifaa vyako vingine zitaonekana hapa.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepia</translation> <translation id="4062305924942672200">Maelezo ya kisheria</translation> <translation id="4072805772816336153">Jaribu tena baadaye</translation> -<translation id="4080602171844412446">Maarifa Yanayohusiana</translation> <translation id="4084682180776658562">Alamisho</translation> <translation id="4084712963632273211">Kutoka <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />imesafirishwa na Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Unaweza kutumia kompyuta kibao hii kuingia katika akaunti kwenye kifaa kinachoonyesha msimbo huu wa QR.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb index b2c194f..166ccee 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">குழுவில் புதிய தாவலில் திற</translation> <translation id="1103142993930332957">Chromeமை மேம்படுத்த உதவ வேண்டுமா?</translation> <translation id="1105960400813249514">திரைப் படப்பிடிப்பு</translation> -<translation id="1108214977745280468">பக்க புள்ளிவிவரத்தை காட்டு</translation> <translation id="1108938384783527433">தேடல் விவரங்களை ஒத்திசை</translation> <translation id="1110914759170138831">ஹைலைட் சுருக்கப்பட்டது</translation> <translation id="1111673857033749125">உங்கள் பிற சாதனங்களில் சேமிக்கும் புக்மார்க்குகள் இங்கே தோன்றும்.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">செபியா</translation> <translation id="4062305924942672200">சட்டப்பூர்வத் தகவல்</translation> <translation id="4072805772816336153">பிறகு முயலவும்</translation> -<translation id="4080602171844412446">தொடர்புடைய புள்ளிவிவரங்கள்</translation> <translation id="4084682180776658562">புக்மார்க்</translation> <translation id="4084712963632273211">வெளியிடுவது: <ph name="PUBLISHER_ORIGIN" /> (<ph name="BEGIN_DEEMPHASIZED" />Google வழங்குவது<ph name="END_DEEMPHASIZED" />)</translation> <translation id="409109920254068737">இந்த QR குறியீட்டைக் காட்டும் சாதனத்தில் உள்நுழைய இந்த டேப்லெட்டைப் பயன்படுத்தலாம்.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb index f667d99..038a81b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">గ్రూప్లో కొత్త ట్యాబ్లో తెరువు</translation> <translation id="1103142993930332957">Chromeను మెరుగుపరచుకోవడంలో సహాయపడతారా?</translation> <translation id="1105960400813249514">స్క్రీన్ క్యాప్చర్</translation> -<translation id="1108214977745280468">పేజీ గణాంకాలను చూడండి</translation> <translation id="1108938384783527433">హిస్టరీ సింక్</translation> <translation id="1110914759170138831">హైలైట్ కుదించబడింది</translation> <translation id="1111673857033749125">మీ ఇతర పరికరాల్లో సేవ్ చేసిన బుక్మార్క్లు ఇక్కడ చూపబడతాయి.</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">సెపియా</translation> <translation id="4062305924942672200">చట్ట సంబంధిత సమాచారం</translation> <translation id="4072805772816336153">తర్వాత మళ్లీ ట్రై చేయండి</translation> -<translation id="4080602171844412446">సంబంధిత గణాంకాలు</translation> <translation id="4084682180776658562">బుక్మార్క్ చేయండి</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> నుండి – <ph name="BEGIN_DEEMPHASIZED" />Google డెలివరీ చేస్తోంది<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">ఈ QR కోడ్ను చూపించే పరికరంలో సైన్ ఇన్ చేయడానికి మీరు ఈ టాబ్లెట్ను ఉపయోగించవచ్చు.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index f002060..3f095d1f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">เปิดในแท็บใหม่ในกลุ่ม</translation> <translation id="1103142993930332957">หากต้องการช่วยปรับปรุง Chrome</translation> <translation id="1105960400813249514">จับภาพหน้าจอ</translation> -<translation id="1108214977745280468">ดูข้อมูลเชิงลึกของหน้า</translation> <translation id="1108938384783527433">ซิงค์ประวัติการเข้าชม</translation> <translation id="1110914759170138831">มีการตัดไฮไลต์ให้สั้นลง</translation> <translation id="1111673857033749125">บุ๊กมาร์กที่บันทึกไว้ในอุปกรณ์เครื่องอื่นๆ ของคุณจะปรากฏที่นี่</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">ซีเปีย</translation> <translation id="4062305924942672200">ข้อมูลทางกฎหมาย</translation> <translation id="4072805772816336153">ลองอีกครั้งภายหลัง</translation> -<translation id="4080602171844412446">ข้อมูลเชิงลึกที่เกี่ยวข้อง</translation> <translation id="4084682180776658562">บุ๊กมาร์ก</translation> <translation id="4084712963632273211">จาก <ph name="PUBLISHER_ORIGIN" /> - <ph name="BEGIN_DEEMPHASIZED" />แสดงโดย Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">คุณสามารถใช้แท็บเล็ตเครื่องนี้เพื่อลงชื่อเข้าใช้บนอุปกรณ์ที่แสดงคิวอาร์โค้ดนี้</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index 478ea55..495acc0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Grupta yeni sekmede aç</translation> <translation id="1103142993930332957">Chrome'un iyileştirilmesine yardım etmek ister misiniz?</translation> <translation id="1105960400813249514">Ekran Kaydediliyor</translation> -<translation id="1108214977745280468">Sayfa analizlerini göster</translation> <translation id="1108938384783527433">Geçmiş senkronizasyonu</translation> <translation id="1110914759170138831">Vurgulama kısaltıldı</translation> <translation id="1111673857033749125">Diğer cihazlarınızda kaydedilmiş yer işaretleri burada görünür.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepya Tonu</translation> <translation id="4062305924942672200">Yasal bilgiler</translation> <translation id="4072805772816336153">Daha sonra tekrar deneyin</translation> -<translation id="4080602171844412446">İlgili Analizler</translation> <translation id="4084682180776658562">Yer İşareti</translation> <translation id="4084712963632273211"><ph name="PUBLISHER_ORIGIN" /> web sitesinden - <ph name="BEGIN_DEEMPHASIZED" />Google tarafından yayınlandı<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Bu QR kodunu gösteren cihazda oturum açmak için bu tableti kullanabilirsiniz.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index 4551acd4..c39ba26 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Відкрити нову вкладку в групі</translation> <translation id="1103142993930332957">Допомогти покращити Chrome?</translation> <translation id="1105960400813249514">Знімок екрана</translation> -<translation id="1108214977745280468">Статистика сторінки</translation> <translation id="1108938384783527433">Синхронізація історії</translation> <translation id="1110914759170138831">Виділений текст скорочено</translation> <translation id="1111673857033749125">Тут відображатимуться закладки, збережені на інших ваших пристроях.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Сепія</translation> <translation id="4062305924942672200">Правова інформація</translation> <translation id="4072805772816336153">Повторіть спробу пізніше</translation> -<translation id="4080602171844412446">Пов’язана інформація</translation> <translation id="4084682180776658562">Закладка</translation> <translation id="4084712963632273211">Видавець: <ph name="PUBLISHER_ORIGIN" />, <ph name="BEGIN_DEEMPHASIZED" />доставлено Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Ви можете використовувати цей планшет, щоб входити на пристрої, де відображається цей QR-код.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index 806202b..51092aaf 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -20,7 +20,6 @@ <translation id="1100066534610197918">گروپ میں نئے ٹیب میں کھولیں</translation> <translation id="1103142993930332957">Chrome کو بہتر بنانے میں مدد کریں؟</translation> <translation id="1105960400813249514">اسکرین کیپچر</translation> -<translation id="1108214977745280468">صفحے کی بصیرتیں دیکھیں</translation> <translation id="1108938384783527433">سرگزشت سِنک کریں</translation> <translation id="1110914759170138831">ہائی لائٹ چھوٹی کی گئی</translation> <translation id="1111673857033749125">آپ کے دیگر آلات پر محفوظ کردہ بُک مارکس یہاں ظاہر ہوں گے۔</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">سیپیا</translation> <translation id="4062305924942672200">قانونی معلومات</translation> <translation id="4072805772816336153">بعد میں دوبارہ کوشش کریں</translation> -<translation id="4080602171844412446">متعلقہ بصیرتیں</translation> <translation id="4084682180776658562">بُک مارک</translation> <translation id="4084712963632273211">بذریعہ <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />Google کے ذریعے ڈیلیور کردہ<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">آپ اس ٹیبلیٹ کو اس آلہ پر جو یہ QR کوڈ ڈسپلے کر رہا ہے سائن ان کرنے کے لیے استعمال کر سکتے ہیں۔</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb index f9409c31..3d0bcc1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Guruhda yangi varaqda ochish</translation> <translation id="1103142993930332957">Chromeni yaxshilashga yordam berasizmi?</translation> <translation id="1105960400813249514">Ekranni suratga olish</translation> -<translation id="1108214977745280468">Sahifa statistikasi</translation> <translation id="1108938384783527433">Tarix sinxronizatsiyasi</translation> <translation id="1110914759170138831">Belgilov qisqartirildi</translation> <translation id="1111673857033749125">Boshqa qurilmalaringizda saqlangan xatcho‘plar shu yerda ko‘rsatiladi.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Sepiya</translation> <translation id="4062305924942672200">Yuridik ma’lumot</translation> <translation id="4072805772816336153">Keyinroq qayta urining</translation> -<translation id="4080602171844412446">Tegishli statistika</translation> <translation id="4084682180776658562">Xatcho‘p</translation> <translation id="4084712963632273211">Muallifi: <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />Google tomonidan taqdim etildi<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Bu QR kod chiqqan qurilma hisobiga shu planshet orqali kirish mumkin.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index 7bf1cd6..8f5f420 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Mở trong thẻ mới trong nhóm</translation> <translation id="1103142993930332957">Giúp cải thiện Chrome?</translation> <translation id="1105960400813249514">Chụp ảnh màn hình</translation> -<translation id="1108214977745280468">Xem chi tiết về trang</translation> <translation id="1108938384783527433">Đồng bộ nhật ký</translation> <translation id="1110914759170138831">Nội dung nổi bật đã được rút gọn</translation> <translation id="1111673857033749125">Dấu trang được lưu trên thiết bị khác của bạn sẽ xuất hiện tại đây.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">Màu nâu đỏ</translation> <translation id="4062305924942672200">Thông tin pháp lý</translation> <translation id="4072805772816336153">Thử lại sau</translation> -<translation id="4080602171844412446">Thông tin chi tiết có liên quan</translation> <translation id="4084682180776658562">Dấu trang</translation> <translation id="4084712963632273211">Từ <ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />Do Google phân phối<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Bạn có thể dùng máy tính bảng này để đăng nhập trên thiết bị đang hiển thị mã QR này.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index a1d5432d..47ba07b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">在群组内的新标签页中打开</translation> <translation id="1103142993930332957">帮助改进 Chrome?</translation> <translation id="1105960400813249514">屏幕截图</translation> -<translation id="1108214977745280468">查看网页数据洞见</translation> <translation id="1108938384783527433">历史记录同步</translation> <translation id="1110914759170138831">突出显示的内容被缩短了</translation> <translation id="1111673857033749125">您在其他设备上保存的书签将列在此处。</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">棕褐色调</translation> <translation id="4062305924942672200">法律信息</translation> <translation id="4072805772816336153">请稍后重试</translation> -<translation id="4080602171844412446">相关数据洞见</translation> <translation id="4084682180776658562">添加书签</translation> <translation id="4084712963632273211">来自 <ph name="PUBLISHER_ORIGIN" /> - <ph name="BEGIN_DEEMPHASIZED" />由 Google 提供<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">您可以使用此平板电脑在显示该二维码的设备上登录。</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 8508ace..7495e8d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">在群組的新分頁中開啟</translation> <translation id="1103142993930332957">要協助改善 Chrome 嗎?</translation> <translation id="1105960400813249514">擷取螢幕畫面</translation> -<translation id="1108214977745280468">查看網頁分析資料</translation> <translation id="1108938384783527433">同步處理記錄</translation> <translation id="1110914759170138831">已縮短突顯文字長度</translation> <translation id="1111673857033749125">儲存在其他裝置上的書籤會在這裡顯示。</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">棕褐色</translation> <translation id="4062305924942672200">法律資料</translation> <translation id="4072805772816336153">請稍後再試</translation> -<translation id="4080602171844412446">相關分析資料</translation> <translation id="4084682180776658562">書籤</translation> <translation id="4084712963632273211">發佈者:<ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />由 Google 提供<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">您可使用此平板電腦登入顯示此 QR 碼的裝置。</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index 79305919..5583f8c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">在群組的新分頁中開啟</translation> <translation id="1103142993930332957">要協助改善 Chrome 嗎?</translation> <translation id="1105960400813249514">螢幕擷取</translation> -<translation id="1108214977745280468">查看網頁深入分析資訊</translation> <translation id="1108938384783527433">同步處理歷史記錄</translation> <translation id="1110914759170138831">已縮減醒目顯示文字長度</translation> <translation id="1111673857033749125">儲存在您其他裝置上的書籤會顯示在這裡。</translation> @@ -582,7 +581,6 @@ <translation id="4056223980640387499">深褐色調</translation> <translation id="4062305924942672200">法律資訊</translation> <translation id="4072805772816336153">請稍後再試</translation> -<translation id="4080602171844412446">相關深入分析</translation> <translation id="4084682180776658562">書籤</translation> <translation id="4084712963632273211">發布者:<ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />由 Google 所提供<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">你可以使用這部平板電腦登入顯示這個 QR code 的裝置。</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index a5a5d2f..25e8a65 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -19,7 +19,6 @@ <translation id="1100066534610197918">Vula kuthebhu elisha kuqembu</translation> <translation id="1103142993930332957">Siza ukuthuthukisa i-Chrome?</translation> <translation id="1105960400813249514">Ukuthwebusla isikrini</translation> -<translation id="1108214977745280468">Buka imininingwane yekhasi</translation> <translation id="1108938384783527433">Umlando wokuvumelanisa</translation> <translation id="1110914759170138831">Ukugqanyiswa kufushanisiwe</translation> <translation id="1111673857033749125">Amabhukhimakhi alondolozwe kwamanye amadivayisi akho azovela lapha.</translation> @@ -581,7 +580,6 @@ <translation id="4056223980640387499">I-Sepia</translation> <translation id="4062305924942672200">Ulwazi lezomthetho</translation> <translation id="4072805772816336153">Zama futhi emuva kwesikhathi</translation> -<translation id="4080602171844412446">Imininingwane ehlobene</translation> <translation id="4084682180776658562">Ibhukhimakhi</translation> <translation id="4084712963632273211">Kusukela ku-<ph name="PUBLISHER_ORIGIN" /> – <ph name="BEGIN_DEEMPHASIZED" />okulethwe i-Google<ph name="END_DEEMPHASIZED" /></translation> <translation id="409109920254068737">Ungasebenzisa le thebulethi ukuze ungene ngemvume kudivayisi ebonisa le khodi ye-QR.</translation>
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java index 671c56e..8d33fc45 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java
@@ -352,17 +352,6 @@ } mFakeSearchBoxOffsetForSurfacePolishLogoInToolbar = toolbarPlaceholderHeight + getDimenPixel(R.dimen.start_surface_fake_search_box_top_margin); - - // Add the vertical distance, which equals the height of the fake omnibox minus the - // height of the real omnibox, and the top margin of the real omnibox. - // This ensures that the bottom edges of both the fake and real search boxes align - // perfectly. In this way, the fake omnibox overlaps with the real one and - // can be smoothly replaced by it. - int heightDifference = getDimenPixel(R.dimen.ntp_search_box_height_polish) - - getDimenPixel(R.dimen.modern_toolbar_background_size) - - getDimenPixel(R.dimen.location_bar_vertical_margin); - mFakeSearchBoxOffsetForSurfacePolishMoveDownLogo += heightDifference; - mFakeSearchBoxOffsetForSurfacePolishLogoInToolbar += heightDifference; } public TabCountProvider getIncognitoToggleTabCountProviderForTesting() {
diff --git a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc index 5bc6bb1..3a734d6 100644 --- a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc +++ b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
@@ -24,6 +24,7 @@ #include "chrome/browser/ash/app_list/app_list_client_impl.h" #include "chrome/browser/ash/arc/util/arc_window_watcher.h" #include "chrome/browser/ash/crosapi/browser_util.h" +#include "chrome/browser/ash/display/variable_refresh_rate_controller.h" #include "chrome/browser/ash/game_mode/game_mode_controller.h" #include "chrome/browser/ash/geolocation/system_geolocation_source.h" #include "chrome/browser/ash/login/signin/signin_error_notifier_factory.h" @@ -349,6 +350,10 @@ ash_web_view_factory_ = std::make_unique<AshWebViewFactoryImpl>(); game_mode_controller_ = std::make_unique<game_mode::GameModeController>(); + variable_refresh_rate_controller_ = + std::make_unique<ash::VariableRefreshRateController>( + ash::Shell::Get()->display_configurator(), + chromeos::PowerManagerClient::Get(), game_mode_controller_.get()); // Initialize TabScrubberChromeOS after the Ash Shell has been initialized. TabScrubberChromeOS::GetInstance(); @@ -395,6 +400,7 @@ tab_cluster_ui_client_.reset(); // Initialized in PostProfileInit (which may not get called in some tests). + variable_refresh_rate_controller_.reset(); game_mode_controller_.reset(); ash_web_view_factory_.reset(); network_portal_notification_controller_.reset();
diff --git a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.h b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.h index b1632407..e748201 100644 --- a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.h +++ b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.h
@@ -18,6 +18,7 @@ class NetworkPortalNotificationController; class NewWindowDelegateProvider; class NightLightClient; +class VariableRefreshRateController; class VideoConferenceTrayController; } // namespace ash @@ -72,7 +73,7 @@ } // Browser initialization for Ash UI. Only use this for Ash specific -// intitialization (e.g. initialization of chrome/browser/ui/ash classes). +// initialization (e.g. initialization of chrome/browser/ui/ash classes). class ChromeBrowserMainExtraPartsAsh : public ChromeBrowserMainExtraParts { public: // Returns the single instance. Returns null early in startup and late in @@ -146,6 +147,8 @@ std::unique_ptr<internal::ChromeShelfControllerInitializer> chrome_shelf_controller_initializer_; std::unique_ptr<DesksClient> desks_client_; + std::unique_ptr<ash::VariableRefreshRateController> + variable_refresh_rate_controller_; #if BUILDFLAG(ENABLE_WAYLAND_SERVER) std::unique_ptr<ExoParts> exo_parts_;
diff --git a/chrome/browser/ui/ash/game_dashboard/chrome_game_dashboard_delegate.cc b/chrome/browser/ui/ash/game_dashboard/chrome_game_dashboard_delegate.cc index 101526d4e..2134373 100644 --- a/chrome/browser/ui/ash/game_dashboard/chrome_game_dashboard_delegate.cc +++ b/chrome/browser/ui/ash/game_dashboard/chrome_game_dashboard_delegate.cc
@@ -4,8 +4,8 @@ #include "chrome/browser/ui/ash/game_dashboard/chrome_game_dashboard_delegate.h" +#include "ash/components/arc/session/connection_holder.h" #include "chrome/browser/ash/app_list/arc/arc_app_list_prefs.h" -#include "chrome/browser/ash/app_list/arc/arc_app_list_prefs_factory.h" #include "chrome/browser/profiles/profile_manager.h" ChromeGameDashboardDelegate::ChromeGameDashboardDelegate() {} @@ -17,9 +17,8 @@ // Get the app category from ArcAppListPrefs. auto* profile = ProfileManager::GetPrimaryUserProfile(); CHECK(profile); - const auto app_category = - ArcAppListPrefsFactory::GetForBrowserContext(profile)->GetAppCategory( - app_id); + auto* arc_app_list_prefs = ArcAppListPrefs::Get(profile); + const auto app_category = arc_app_list_prefs->GetAppCategory(app_id); // If the category is anything except `kUndefined`, fire the callback, // otherwise, retrieve the category from ARC. if (app_category != arc::mojom::AppCategory::kUndefined) { @@ -27,15 +26,16 @@ return; } - auto* connection = ArcAppListPrefs::Get(profile)->app_connection_holder(); - auto* app_instance = ARC_GET_INSTANCE_FOR_METHOD(connection, GetAppCategory); + auto* app_instance = ARC_GET_INSTANCE_FOR_METHOD( + arc_app_list_prefs->app_connection_holder(), GetAppCategory); if (!app_instance) { // If there's no app instance, assume the app is not a game. std::move(callback).Run(/*is_game=*/false); return; } + app_instance->GetAppCategory( - app_id, + arc_app_list_prefs->GetAppPackageName(app_id), base::BindOnce(&ChromeGameDashboardDelegate::OnReceiveAppCategory, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -46,8 +46,7 @@ auto* profile = ProfileManager::GetPrimaryUserProfile(); CHECK(profile); - auto app_info = - ArcAppListPrefsFactory::GetForBrowserContext(profile)->GetApp(app_id); + auto app_info = ArcAppListPrefs::Get(profile)->GetApp(app_id); if (!app_info) { LOG(ERROR) << "Failed to get app info: " << app_id << "."; return std::string();
diff --git a/chrome/browser/ui/autofill/autofill_bubble_handler.h b/chrome/browser/ui/autofill/autofill_bubble_handler.h index f2f5c75..583210f 100644 --- a/chrome/browser/ui/autofill/autofill_bubble_handler.h +++ b/chrome/browser/ui/autofill/autofill_bubble_handler.h
@@ -14,7 +14,6 @@ class LocalCardMigrationBubbleController; class OfferNotificationBubbleController; class SaveUpdateAddressProfileBubbleController; -class EditAddressProfileDialogController; class SaveCardBubbleController; class IbanBubbleController; class VirtualCardManualFallbackBubbleController; @@ -68,10 +67,6 @@ SaveUpdateAddressProfileBubbleController* controller, bool is_user_gesture) = 0; - virtual AutofillBubbleBase* ShowEditAddressProfileDialog( - content::WebContents* web_contents, - EditAddressProfileDialogController* controller) = 0; - virtual AutofillBubbleBase* ShowVirtualCardManualFallbackBubble( content::WebContents* web_contents, VirtualCardManualFallbackBubbleController* controller,
diff --git a/chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl.cc b/chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl.cc index 2637602..16cea84 100644 --- a/chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl.cc +++ b/chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl.cc
@@ -7,7 +7,7 @@ #include "base/types/optional_util.h" #include "chrome/browser/ui/autofill/autofill_bubble_base.h" -#include "chrome/browser/ui/autofill/autofill_bubble_handler.h" +#include "chrome/browser/ui/autofill/edit_address_profile_view.h" #include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" @@ -49,10 +49,13 @@ footer_message_ = footer_message; on_user_decision_callback_ = std::move(on_user_decision_callback); is_migration_to_account_ = is_migration_to_account; - Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); - dialog_view_ = browser->window() - ->GetAutofillBubbleHandler() - ->ShowEditAddressProfileDialog(web_contents(), this); + + if (view_factory_for_test_) { + dialog_view_ = view_factory_for_test_.Run(web_contents(), this); + return; + } + + dialog_view_ = ShowEditAddressProfileDialogView(web_contents(), this); } std::u16string EditAddressProfileDialogControllerImpl::GetWindowTitle() const { @@ -104,6 +107,11 @@ } } +void EditAddressProfileDialogControllerImpl::SetViewFactoryForTest( + EditAddressProfileViewTestingFactory factory) { + view_factory_for_test_ = std::move(factory); +} + WEB_CONTENTS_USER_DATA_KEY_IMPL(EditAddressProfileDialogControllerImpl); } // namespace autofill
diff --git a/chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl.h b/chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl.h index 0392b850..6235935 100644 --- a/chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl.h +++ b/chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl.h
@@ -23,6 +23,11 @@ public content::WebContentsUserData< EditAddressProfileDialogControllerImpl> { public: + using EditAddressProfileViewTestingFactory = + base::RepeatingCallback<AutofillBubbleBase*( + content::WebContents*, + EditAddressProfileDialogController*)>; + EditAddressProfileDialogControllerImpl( const EditAddressProfileDialogControllerImpl&) = delete; EditAddressProfileDialogControllerImpl& operator=( @@ -54,6 +59,8 @@ // content::WebContentsObserver: void WebContentsDestroyed() override; + void SetViewFactoryForTest(EditAddressProfileViewTestingFactory factory); + private: explicit EditAddressProfileDialogControllerImpl( content::WebContents* web_contents); @@ -86,6 +93,9 @@ // to restore the original prompt state (save or update) if it is reopened. bool is_migration_to_account_ = false; + // Factory used to inject the view instance into this controller in tests. + EditAddressProfileViewTestingFactory view_factory_for_test_; + WEB_CONTENTS_USER_DATA_KEY_DECL(); };
diff --git a/chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl_unittest.cc b/chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl_unittest.cc index cd10f45..4f2255c 100644 --- a/chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl_unittest.cc +++ b/chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl_unittest.cc
@@ -6,6 +6,7 @@ #include "base/functional/callback_helpers.h" #include "base/test/mock_callback.h" +#include "chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_tabstrip.h" #include "chrome/browser/ui/test/test_browser_dialog.h" @@ -30,12 +31,21 @@ EditAddressProfileDialogControllerImpl::CreateForWebContents( web_contents()); ASSERT_THAT(controller(), ::testing::NotNull()); + controller()->SetViewFactoryForTest(base::BindRepeating( + &EditAddressProfileDialogControllerImplTest::GetAutofillBubbleBase, + base::Unretained(this))); controller()->OfferEdit(profile_, /*original_profile=*/nullptr, /*footer_message=*/u"", save_callback_.Get(), /*is_migration_to_account=*/false); } protected: + AutofillBubbleBase* GetAutofillBubbleBase( + content::WebContents* web_contents, + EditAddressProfileDialogController* controller) { + return &autofill_bubble_; + } + content::WebContents* web_contents() { return browser()->tab_strip_model()->GetActiveWebContents(); } @@ -46,6 +56,7 @@ } AutofillProfile profile_ = test::GetFullProfile(); + TestAutofillBubble autofill_bubble_; base::MockOnceCallback<void( AutofillClient::SaveAddressProfileOfferUserDecision, AutofillProfile profile)>
diff --git a/chrome/browser/ui/autofill/edit_address_profile_view.h b/chrome/browser/ui/autofill/edit_address_profile_view.h new file mode 100644 index 0000000..46bc6ecb --- /dev/null +++ b/chrome/browser/ui/autofill/edit_address_profile_view.h
@@ -0,0 +1,24 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_AUTOFILL_EDIT_ADDRESS_PROFILE_VIEW_H_ +#define CHROME_BROWSER_UI_AUTOFILL_EDIT_ADDRESS_PROFILE_VIEW_H_ + +#include "chrome/browser/ui/autofill/edit_address_profile_dialog_controller.h" + +namespace content { +class WebContents; +} // namespace content + +namespace autofill { +class AutofillBubbleBase; + +// Shows a modal dialog for editing an Autofill profile. +AutofillBubbleBase* ShowEditAddressProfileDialogView( + content::WebContents* web_contents, + EditAddressProfileDialogController* controller); + +} // namespace autofill + +#endif // CHROME_BROWSER_UI_AUTOFILL_EDIT_ADDRESS_PROFILE_VIEW_H_
diff --git a/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.cc b/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.cc index 141c9de..7ae54d5 100644 --- a/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.cc +++ b/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.cc
@@ -71,14 +71,6 @@ return update_address_profile_bubble_view_.get(); } -AutofillBubbleBase* TestAutofillBubbleHandler::ShowEditAddressProfileDialog( - content::WebContents* contents, - EditAddressProfileDialogController* controller) { - if (!edit_address_profile_bubble_view_) - edit_address_profile_bubble_view_ = std::make_unique<TestAutofillBubble>(); - return edit_address_profile_bubble_view_.get(); -} - AutofillBubbleBase* TestAutofillBubbleHandler::ShowVirtualCardManualFallbackBubble( content::WebContents* web_contents,
diff --git a/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h b/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h index e3ef902..ad84356 100644 --- a/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h +++ b/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h
@@ -54,9 +54,6 @@ content::WebContents* contents, SaveUpdateAddressProfileBubbleController* controller, bool is_user_gesture) override; - AutofillBubbleBase* ShowEditAddressProfileDialog( - content::WebContents* contents, - EditAddressProfileDialogController* controller) override; AutofillBubbleBase* ShowVirtualCardManualFallbackBubble( content::WebContents* web_contents, VirtualCardManualFallbackBubbleController* controller,
diff --git a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt.h b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt.h index e40076b..43eba89 100644 --- a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt.h +++ b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt.h
@@ -25,7 +25,10 @@ void ShowPrivacySandboxNoticeBubble(Browser* browser); // Returns whether a Privacy Sandbox prompt can be shown in the |browser|. -// Checks if the maximum dialog size fits the prompt. -bool CanWindowFitPrivacySandboxPrompt(Browser* browser); +// Checks if the maximum dialog height fits the prompt height. +bool CanWindowHeightFitPrivacySandboxPrompt(Browser* browser); + +// Returns whether a window can fit PrivacySandbox prompt width. +bool CanWindowWidthFitPrivacySandboxPrompt(Browser* browser); #endif // CHROME_BROWSER_UI_PRIVACY_SANDBOX_PRIVACY_SANDBOX_PROMPT_H_
diff --git a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.cc b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.cc index a007204f..5b6a839d 100644 --- a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.cc +++ b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.h" +#include "base/feature_list.h" #include "base/hash/hash.h" #include "base/metrics/histogram_functions.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h" @@ -18,6 +19,7 @@ #include "chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt.h" #include "chrome/common/extensions/chrome_manifest_url_handlers.h" #include "chrome/common/webui_url_constants.h" +#include "components/privacy_sandbox/privacy_sandbox_features.h" #include "components/sync/service/sync_service.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents.h" @@ -191,12 +193,16 @@ } } - const bool is_window_too_small = !CanWindowFitPrivacySandboxPrompt(browser); + // The PrivacySandbox prompt can always fit inside a normal tabbed window due + // to its minimum width, so checking the height is enough here. Other non + // normal tabbed browsers will be exlcuded in a later check. + const bool is_window_too_small = + !CanWindowHeightFitPrivacySandboxPrompt(browser); base::UmaHistogramBoolean("Settings.PrivacySandbox.DialogWindowTooSmall", is_window_too_small); - // If the windows size is too small, it is difficult to read or interrupt with - // the dialog. The dialog is blocking modal, that is why we want to prevent it - // from showing if there isn't enough space. + // If the windows height is too small, it is difficult to read or interrupt + // with the dialog. The dialog is blocking modal, that is why we want to + // prevent it from showing if there isn't enough space. if (is_window_too_small) { base::UmaHistogramEnumeration( kPrivacySandboxPromptHelperEventHistogram, @@ -204,6 +210,40 @@ return; } + auto required_prompt_type = GetRequiredPromptType(profile()); + + // Avoid showing the prompt on popups, pip, anything that isn't a normal + // browser. + if (base::FeatureList::IsEnabled( + privacy_sandbox::kPrivacySandboxSuppressDialogOnNonNormalBrowsers) && + browser->type() != Browser::TYPE_NORMAL) { + switch (required_prompt_type) { + case PrivacySandboxService::PromptType::kM1Consent: + // Record how often we were going to show a consent page on a window + // with a width that isn't enough for the prompt. + base::UmaHistogramBoolean( + "Settings.PrivacySandbox.CanNonNormalBrowserWindowFitConsentWidth", + CanWindowWidthFitPrivacySandboxPrompt(browser)); + break; + case PrivacySandboxService::PromptType::kM1NoticeROW: + case PrivacySandboxService::PromptType::kM1NoticeEEA: + case PrivacySandboxService::PromptType::kM1NoticeRestricted: + // Record how often we were going to show a notice page on a window + // with a width that isn't enough for the prompt. + base::UmaHistogramBoolean( + "Settings.PrivacySandbox.CanNonNormalBrowserWindowFitNoticeWidth", + CanWindowWidthFitPrivacySandboxPrompt(browser)); + break; + default: + break; + } + + base::UmaHistogramEnumeration( + kPrivacySandboxPromptHelperEventHistogram, + SettingsPrivacySandboxPromptHelperEvent::kNonNormalBrowser); + return; + } + // Record the URL that the prompt was displayed over. uint32_t host_hash = base::Hash(navigation_handle->GetURL().IsAboutBlank() ? "about:blank" @@ -215,7 +255,7 @@ browser->tab_strip_model()->GetIndexOfWebContents( navigation_handle->GetWebContents())); - ShowPrivacySandboxPrompt(browser, GetRequiredPromptType(profile())); + ShowPrivacySandboxPrompt(browser, required_prompt_type); base::UmaHistogramEnumeration( kPrivacySandboxPromptHelperEventHistogram, SettingsPrivacySandboxPromptHelperEvent::kPromptShown);
diff --git a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.h b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.h index a6b606a..207b59b 100644 --- a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.h +++ b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.h
@@ -58,6 +58,13 @@ FRIEND_TEST_ALL_PREFIXES( PrivacySandboxPromptHelperTestWithSearchEngineChoiceEnabled, NoPromptWhenSearchEngineChoiceDialogIsDisplayed); + FRIEND_TEST_ALL_PREFIXES( + PrivacySandboxPromptNonNormalBrowserFeatureDisabledTest, + NonNormalBrowserShowsPrompt); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxPromptNonNormalBrowserTest, + NoPromptInSmallBrowser); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxPromptNonNormalBrowserTest, + NoPromptInLargeBrowser); // Contains all the events that the helper goes through when attempting to // show a Privacy Sandbox prompt. Must be kept in sync with the @@ -74,9 +81,10 @@ kWindowTooSmall = 8, kPromptShown = 9, kSearchEngineChoiceDialogShown = 10, + kNonNormalBrowser = 11, // Add values above this line with a corresponding label in // tools/metrics/histograms/enums.xml - kMaxValue = kSearchEngineChoiceDialogShown, + kMaxValue = kNonNormalBrowser, }; explicit PrivacySandboxPromptHelper(content::WebContents* web_contents);
diff --git a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper_browsertest.cc b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper_browsertest.cc index 8aa95b8..135d3653 100644 --- a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper_browsertest.cc +++ b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper_browsertest.cc
@@ -518,6 +518,156 @@ PrivacySandboxService::PromptType::kConsent, PrivacySandboxService::PromptType::kNotice)); +struct PrivacySandboxNonNormalBrowserTestData { + const PrivacySandboxService::PromptType prompt_type; + const char* width_histogram; +}; + +class PrivacySandboxPromptNonNormalBrowserTest + : public PrivacySandboxPromptHelperTest, + public testing::WithParamInterface< + PrivacySandboxNonNormalBrowserTestData> { + public: + PrivacySandboxService::PromptType TestPromptType() override { + return GetParam().prompt_type; + } +}; + +IN_PROC_BROWSER_TEST_P(PrivacySandboxPromptNonNormalBrowserTest, + NoPromptInLargeBrowser) { + base::HistogramTester histogram_tester; + EXPECT_CALL(*mock_privacy_sandbox_service(), + PromptOpenedForBrowser(testing::_, testing::_)) + .Times(0); + + NavigateParams params(browser(), GURL(chrome::kChromeUINewTabPageURL), + ui::PAGE_TRANSITION_FIRST); + params.window_action = NavigateParams::SHOW_WINDOW; + params.disposition = WindowOpenDisposition::NEW_POPUP; + params.window_features.bounds = gfx::Rect(0, 0, 500, 500); + ui_test_utils::NavigateToURL(¶ms); + + ValidatePromptEventEntries( + &histogram_tester, + {{PrivacySandboxPromptHelper::SettingsPrivacySandboxPromptHelperEvent:: + kCreated, + 1}, + {PrivacySandboxPromptHelper::SettingsPrivacySandboxPromptHelperEvent:: + kNonNormalBrowser, + 1}, + {PrivacySandboxPromptHelper::SettingsPrivacySandboxPromptHelperEvent:: + kPromptShown, + 0}}); + + histogram_tester.ExpectBucketCount(GetParam().width_histogram, true, 1); + histogram_tester.ExpectBucketCount(GetParam().width_histogram, false, 0); +} + +IN_PROC_BROWSER_TEST_P(PrivacySandboxPromptNonNormalBrowserTest, + NoPromptInSmallBrowser) { + base::HistogramTester histogram_tester; + EXPECT_CALL(*mock_privacy_sandbox_service(), + PromptOpenedForBrowser(testing::_, testing::_)) + .Times(0); + + NavigateParams params(browser(), GURL(chrome::kChromeUINewTabPageURL), + ui::PAGE_TRANSITION_FIRST); + params.window_action = NavigateParams::SHOW_WINDOW; + params.disposition = WindowOpenDisposition::NEW_POPUP; + params.window_features.bounds = gfx::Rect(0, 0, 200, 200); + ui_test_utils::NavigateToURL(¶ms); + + ValidatePromptEventEntries( + &histogram_tester, + {{PrivacySandboxPromptHelper::SettingsPrivacySandboxPromptHelperEvent:: + kCreated, + 1}, + {PrivacySandboxPromptHelper::SettingsPrivacySandboxPromptHelperEvent:: + kNonNormalBrowser, + 1}, + {PrivacySandboxPromptHelper::SettingsPrivacySandboxPromptHelperEvent:: + kPromptShown, + 0}}); + + histogram_tester.ExpectBucketCount(GetParam().width_histogram, true, 0); + histogram_tester.ExpectBucketCount(GetParam().width_histogram, false, 1); +} + +INSTANTIATE_TEST_SUITE_P( + PrivacySandboxPromptNonNormalBrowserTestInstance, + PrivacySandboxPromptNonNormalBrowserTest, + testing::Values<PrivacySandboxNonNormalBrowserTestData>( + PrivacySandboxNonNormalBrowserTestData{ + PrivacySandboxService::PromptType::kM1Consent, + "Settings.PrivacySandbox.CanNonNormalBrowserWindowFitConsentWidth"}, + PrivacySandboxNonNormalBrowserTestData{ + PrivacySandboxService::PromptType::kM1NoticeEEA, + "Settings.PrivacySandbox.CanNonNormalBrowserWindowFitNoticeWidth"}, + PrivacySandboxNonNormalBrowserTestData{ + PrivacySandboxService::PromptType::kM1NoticeROW, + "Settings.PrivacySandbox.CanNonNormalBrowserWindowFitNoticeWidth"}, + PrivacySandboxNonNormalBrowserTestData{ + PrivacySandboxService::PromptType::kM1NoticeRestricted, + "Settings.PrivacySandbox." + "CanNonNormalBrowserWindowFitNoticeWidth"})); + +class PrivacySandboxPromptNonNormalBrowserParamTest + : public PrivacySandboxPromptHelperTest { + public: + PrivacySandboxService::PromptType TestPromptType() override { + return PrivacySandboxService::PromptType::kM1NoticeEEA; + } +}; + +class PrivacySandboxPromptNonNormalBrowserFeatureDisabledTest + : public PrivacySandboxPromptHelperTestWithParam { + public: + void SetUpInProcessBrowserTestFixture() override { + feature_list_.InitWithFeatures( + {}, + {privacy_sandbox::kPrivacySandboxSuppressDialogOnNonNormalBrowsers}); + PrivacySandboxPromptHelperTest::SetUpInProcessBrowserTestFixture(); + } + + private: + PrivacySandboxService::PromptType TestPromptType() override { + return GetParam(); + } + base::test::ScopedFeatureList feature_list_; +}; + +IN_PROC_BROWSER_TEST_P(PrivacySandboxPromptNonNormalBrowserFeatureDisabledTest, + NonNormalBrowserShowsPrompt) { + base::HistogramTester histogram_tester; + EXPECT_CALL(*mock_privacy_sandbox_service(), + PromptOpenedForBrowser(testing::_, testing::_)) + .Times(1); + + ui_test_utils::NavigateToURLWithDisposition( + browser(), GURL(url::kAboutBlankURL), WindowOpenDisposition::NEW_POPUP, + ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP); + + ValidatePromptEventEntries( + &histogram_tester, + {{PrivacySandboxPromptHelper::SettingsPrivacySandboxPromptHelperEvent:: + kCreated, + 1}, + {PrivacySandboxPromptHelper::SettingsPrivacySandboxPromptHelperEvent:: + kNonNormalBrowser, + 0}, + {PrivacySandboxPromptHelper::SettingsPrivacySandboxPromptHelperEvent:: + kPromptShown, + 1}}); +} + +INSTANTIATE_TEST_SUITE_P( + PrivacySandboxPromptNonNormalBrowserFeatureDisabledTestInstance, + PrivacySandboxPromptNonNormalBrowserFeatureDisabledTest, + testing::Values(PrivacySandboxService::PromptType::kM1Consent, + PrivacySandboxService::PromptType::kM1NoticeEEA, + PrivacySandboxService::PromptType::kM1NoticeROW, + PrivacySandboxService::PromptType::kM1NoticeRestricted)); + // Checking the `ENABLE_SEARCH_ENGINE_CHOICE` build flag is needed because the // test runs on Fuchsia while the search engine choice code doesn't. #if BUILDFLAG(ENABLE_SEARCH_ENGINE_CHOICE)
diff --git a/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.cc b/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.cc index a0234a0..6a23bf0 100644 --- a/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.cc +++ b/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.cc
@@ -10,7 +10,6 @@ #include "chrome/browser/ui/autofill/payments/save_card_ui.h" #include "chrome/browser/ui/autofill/payments/save_iban_ui.h" #include "chrome/browser/ui/browser_commands.h" -#include "chrome/browser/ui/views/autofill/edit_address_profile_view.h" #include "chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.h" #include "chrome/browser/ui/views/autofill/payments/local_card_migration_icon_view.h" #include "chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.h" @@ -227,15 +226,6 @@ return bubble; } -AutofillBubbleBase* AutofillBubbleHandlerImpl::ShowEditAddressProfileDialog( - content::WebContents* web_contents, - EditAddressProfileDialogController* controller) { - EditAddressProfileView* dialog = new EditAddressProfileView(controller); - dialog->ShowForWebContents(web_contents); - constrained_window::ShowWebModalDialogViews(dialog, web_contents); - return dialog; -} - AutofillBubbleBase* AutofillBubbleHandlerImpl::ShowVirtualCardManualFallbackBubble( content::WebContents* web_contents,
diff --git a/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h b/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h index 76d2694..054cd45 100644 --- a/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h +++ b/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h
@@ -62,9 +62,6 @@ content::WebContents* web_contents, SaveUpdateAddressProfileBubbleController* controller, bool is_user_gesture) override; - AutofillBubbleBase* ShowEditAddressProfileDialog( - content::WebContents* web_contents, - EditAddressProfileDialogController* controller) override; AutofillBubbleBase* ShowVirtualCardManualFallbackBubble( content::WebContents* web_contents, VirtualCardManualFallbackBubbleController* controller,
diff --git a/chrome/browser/ui/views/autofill/edit_address_profile_view.cc b/chrome/browser/ui/views/autofill/edit_address_profile_view.cc index 1d186c8..18c43dc 100644 --- a/chrome/browser/ui/views/autofill/edit_address_profile_view.cc +++ b/chrome/browser/ui/views/autofill/edit_address_profile_view.cc
@@ -8,10 +8,13 @@ #include <utility> #include "chrome/browser/ui/autofill/address_editor_controller.h" +#include "chrome/browser/ui/autofill/autofill_bubble_base.h" #include "chrome/browser/ui/autofill/edit_address_profile_dialog_controller.h" +#include "chrome/browser/ui/autofill/edit_address_profile_view.h" #include "chrome/browser/ui/views/autofill/address_editor_view.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "components/autofill/core/common/autofill_features.h" +#include "components/constrained_window/constrained_window_views.h" #include "components/strings/grit/components_strings.h" #include "ui/base/l10n/l10n_util.h" #include "ui/views/controls/label.h" @@ -21,6 +24,15 @@ namespace autofill { +AutofillBubbleBase* ShowEditAddressProfileDialogView( + content::WebContents* web_contents, + EditAddressProfileDialogController* controller) { + EditAddressProfileView* dialog = new EditAddressProfileView(controller); + dialog->ShowForWebContents(web_contents); + constrained_window::ShowWebModalDialogViews(dialog, web_contents); + return dialog; +} + EditAddressProfileView::EditAddressProfileView( EditAddressProfileDialogController* controller) : controller_(controller) {
diff --git a/chrome/browser/ui/views/autofill/popup/popup_cell_with_button_view.cc b/chrome/browser/ui/views/autofill/popup/popup_cell_with_button_view.cc index 74dad2e..1f79573 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_cell_with_button_view.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_cell_with_button_view.cc
@@ -137,13 +137,21 @@ button_placeholder_->SetLayoutManager(std::make_unique<views::BoxLayout>()); button_placeholder_->SetPreferredSize(cell_button->GetPreferredSize()); button_ = button_placeholder_->AddChildView(std::move(cell_button)); - button_->SetVisible(selected_); + button_->SetVisible(ShouldCellButtonBeVisible()); button_->SetButtonController(std::make_unique<CellButtonController>( button_, this, std::make_unique<views::Button::DefaultButtonControllerDelegate>( button_.get()))); } +void PopupCellWithButtonView::SetCellButtonBehavior( + CellButtonBehavior cell_button_behavior) { + cell_button_behavior_ = cell_button_behavior; + if (button_) { + button_->SetVisible(ShouldCellButtonBeVisible()); + } +} + void PopupCellWithButtonView::HandleKeyPressEventFocusOnButton() { if (!button_) { return; @@ -226,11 +234,14 @@ // announces "delete jon". This does not happen if the button has no // accessible name. if (button_) { - button_->SetVisible(selected); + button_->SetVisible(ShouldCellButtonBeVisible()); button_->SetAccessibleName(u""); } autofill::PopupCellView::SetSelected(selected); + if (button_) { + button_->SetVisible(ShouldCellButtonBeVisible()); + } // There are cases where SetSelect is called with the same value as before // but we still want to refresh the style. For example in the case where there @@ -275,4 +286,13 @@ } } +bool PopupCellWithButtonView::ShouldCellButtonBeVisible() const { + switch (cell_button_behavior_) { + case CellButtonBehavior::kShowOnHoverOrSelect: + return selected_; + case CellButtonBehavior::kShowAlways: + return true; + } +} + } // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/popup/popup_cell_with_button_view.h b/chrome/browser/ui/views/autofill/popup/popup_cell_with_button_view.h index 9ba42a6b..dddc8c0 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_cell_with_button_view.h +++ b/chrome/browser/ui/views/autofill/popup/popup_cell_with_button_view.h
@@ -76,6 +76,17 @@ void SetCellButton(std::unique_ptr<views::ImageButton> cell_button); views::ImageButton* GetCellButtonForTest() { return button_; } + // Determines under which conditions the button (if there is one) is visible. + enum class CellButtonBehavior { + // The button is only visible if the cell or the button are selected or + // hovered. + kShowOnHoverOrSelect, + // The button is always visible. + kShowAlways, + }; + // Sets the visibility behavior of the cell button. + void SetCellButtonBehavior(CellButtonBehavior cell_button_behavior); + // Returns the view that contains the button or `nullptr` if no button is set. views::View* GetButtonContainer() { return button_placeholder_; } @@ -95,12 +106,19 @@ void HandleKeyPressEventFocusOnButton(); void HandleKeyPressEventFocusOnContent(); + // Returns whether the cell button (if there is one) should be visible. + bool ShouldCellButtonBeVisible() const; + raw_ptr<views::ImageButton> button_ = nullptr; raw_ptr<ButtonPlaceholder> button_placeholder_ = nullptr; // Whether the button has been focused. Used for accessibility and arrow // navigation purposes. bool button_focused_ = false; + + CellButtonBehavior cell_button_behavior_ = + CellButtonBehavior::kShowOnHoverOrSelect; + // TODO(crbug.com/1417187): Remove once the work-around is fixed. std::u16string button_accessible_name_; };
diff --git a/chrome/browser/ui/views/autofill/popup/popup_cell_with_button_view_unittest.cc b/chrome/browser/ui/views/autofill/popup/popup_cell_with_button_view_unittest.cc index 2b0653f..71e5aa8 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_cell_with_button_view_unittest.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_cell_with_button_view_unittest.cc
@@ -35,10 +35,11 @@ #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_utils.h" +namespace autofill { + using ::testing::Return; using ::testing::StrictMock; - -namespace autofill { +using CellButtonBehavior = PopupCellWithButtonView::CellButtonBehavior; class PopupCellWithButtonViewTest : public ChromeViewsTestBase { public: @@ -71,7 +72,9 @@ } views::ImageButton* CreateRowAndGetButton( - base::RepeatingClosure button_callback = base::DoNothing()) { + base::RepeatingClosure button_callback = base::DoNothing(), + CellButtonBehavior cell_button_behavior = + CellButtonBehavior::kShowOnHoverOrSelect) { auto cell = std::make_unique<PopupCellWithButtonView>( /*should_ignore_mouse_observed_outside_item_bounds_check=*/true); cell->SetLayoutManager(std::make_unique<views::BoxLayout>( @@ -79,6 +82,7 @@ cell->AddChildView(std::make_unique<views::Label>(u"Some label")); cell->SetAccessibilityDelegate( std::make_unique<TestAccessibilityDelegate>()); + cell->SetCellButtonBehavior(cell_button_behavior); cell->SetCellButton( std::make_unique<views::ImageButton>(std::move(button_callback))); views::ImageButton* button = cell->GetCellButtonForTest(); @@ -100,14 +104,28 @@ TEST_F(PopupCellWithButtonViewTest, ShowsOrHideButtonOnSelected) { views::ImageButton* button = CreateRowAndGetButton(); - // Show delete button if row is selected. - ASSERT_FALSE(button->GetVisible()); + // The button is shown if the row is selected. + EXPECT_FALSE(button->GetVisible()); view().SetSelected(true); - ASSERT_TRUE(button->GetVisible()); + EXPECT_TRUE(button->GetVisible()); - // Hide delete button if row is not selected. + // The button is hidden if the row is not selected. view().SetSelected(false); - ASSERT_FALSE(button->GetVisible()); + EXPECT_FALSE(button->GetVisible()); +} + +// Tests that the cell button is always visible for +// `CellButtonBehavior::kShowAlways`. +TEST_F(PopupCellWithButtonViewTest, DoNotHideButtonForShowAlwaysBehavior) { + views::ImageButton* button = CreateRowAndGetButton( + /*button_callback=*/base::DoNothing(), CellButtonBehavior::kShowAlways); + + EXPECT_TRUE(button->GetVisible()); + view().SetSelected(true); + EXPECT_TRUE(button->GetVisible()); + + view().SetSelected(false); + EXPECT_TRUE(button->GetVisible()); } TEST_F(PopupCellWithButtonViewTest,
diff --git a/chrome/browser/ui/views/autofill/popup/popup_row_strategy.cc b/chrome/browser/ui/views/autofill/popup/popup_row_strategy.cc index 727f37657..383c273 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_row_strategy.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_row_strategy.cc
@@ -168,8 +168,7 @@ PopupSuggestionStrategy::PopupSuggestionStrategy( base::WeakPtr<AutofillPopupController> controller, int line_number) - : PopupRowBaseStrategy(std::move(controller), line_number), - popup_type_(GetController()->GetPopupType()) {} + : PopupRowBaseStrategy(std::move(controller), line_number) {} PopupSuggestionStrategy::~PopupSuggestionStrategy() = default;
diff --git a/chrome/browser/ui/views/autofill/popup/popup_row_strategy.h b/chrome/browser/ui/views/autofill/popup/popup_row_strategy.h index 66c9f2df8..7290e6687 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_row_strategy.h +++ b/chrome/browser/ui/views/autofill/popup/popup_row_strategy.h
@@ -84,17 +84,12 @@ std::unique_ptr<PopupCellView> CreateControl() override; private: - // Returns the type of the popup that this row belongs to. - PopupType GetPopupType() const { return popup_type_; } - // Creates the cell for an Autocomplete entry with a delete button. std::unique_ptr<PopupCellView> CreateAutocompleteWithDeleteButtonCell(); // Adds content and labels for a suggestion. A helper method used by all // suggestion types. void AddContentLabelsAndCallbacks(PopupCellView& view); - - const PopupType popup_type_; }; // A `PopupRowStrategy` that creates the content for password suggestion rows.
diff --git a/chrome/browser/ui/views/payments/payment_handler_header_view_ui_browsertest.cc b/chrome/browser/ui/views/payments/payment_handler_header_view_ui_browsertest.cc index ab8f682..f1845654 100644 --- a/chrome/browser/ui/views/payments/payment_handler_header_view_ui_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_handler_header_view_ui_browsertest.cc
@@ -34,8 +34,8 @@ void SetUpCommandLine(base::CommandLine* command_line) override { PaymentRequestBrowserTestBase::SetUpCommandLine(command_line); - if (minimal_header_ux_enabled_) { - command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures, + if (!minimal_header_ux_enabled_) { + command_line->AppendSwitchASCII(switches::kDisableBlinkFeatures, "PaymentHandlerMinimalHeaderUX"); } }
diff --git a/chrome/browser/ui/views/payments/payment_handler_window_size_browsertest.cc b/chrome/browser/ui/views/payments/payment_handler_window_size_browsertest.cc index 6342ee7..f7043f04 100644 --- a/chrome/browser/ui/views/payments/payment_handler_window_size_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_handler_window_size_browsertest.cc
@@ -8,13 +8,15 @@ #include "chrome/browser/ui/views/payments/payment_request_dialog_view_ids.h" #include "chrome/browser/ui/views/payments/payment_request_views_util.h" #include "components/autofill/core/browser/autofill_test_utils.h" +#include "content/public/common/content_switches.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "testing/gtest/include/gtest/gtest.h" namespace payments { -class PaymentHandlerWindowSizeTest : public PaymentRequestBrowserTestBase { +class PaymentHandlerWindowSizeTest : public PaymentRequestBrowserTestBase, + public testing::WithParamInterface<bool> { public: PaymentHandlerWindowSizeTest(const PaymentHandlerWindowSizeTest&) = delete; PaymentHandlerWindowSizeTest& operator=(const PaymentHandlerWindowSizeTest&) = @@ -22,7 +24,8 @@ protected: PaymentHandlerWindowSizeTest() - : expected_payment_request_dialog_size_( + : minimal_header_ux_enabled_(GetParam()), + expected_payment_request_dialog_size_( gfx::Size(kDialogMinWidth, kDialogHeight)) {} ~PaymentHandlerWindowSizeTest() override = default; @@ -32,12 +35,21 @@ NavigateTo("/payment_handler.html"); } + void SetUpCommandLine(base::CommandLine* command_line) override { + PaymentRequestBrowserTestBase::SetUpCommandLine(command_line); + if (!minimal_header_ux_enabled_) { + command_line->AppendSwitchASCII(switches::kDisableBlinkFeatures, + "PaymentHandlerMinimalHeaderUX"); + } + } + gfx::Size DialogViewSize() { return dialog_view()->CalculatePreferredSize(); } + bool minimal_header_ux_enabled_; const gfx::Size expected_payment_request_dialog_size_; }; -IN_PROC_BROWSER_TEST_F(PaymentHandlerWindowSizeTest, ValidateDialogSize) { +IN_PROC_BROWSER_TEST_P(PaymentHandlerWindowSizeTest, ValidateDialogSize) { // Add an autofill profile, so [Continue] button is enabled. autofill::AutofillProfile profile(autofill::test::GetFullProfile()); AddAutofillProfile(profile); @@ -75,9 +87,18 @@ EXPECT_EQ(expected_payment_handler_dialog_size, DialogViewSize()); // Check that dialog size resets after back navigation from payment handler - // window. - ClickOnBackArrow(); - EXPECT_EQ(expected_payment_request_dialog_size_, DialogViewSize()); + // window. The dialog only has a back button prior to minimal header UX. + if (!minimal_header_ux_enabled_) { + ClickOnBackArrow(); + EXPECT_EQ(expected_payment_request_dialog_size_, DialogViewSize()); + } + + // The test flakily hangs if we don't close the payment handler dialog. + ResetEventWaiter(DialogEvent::DIALOG_CLOSED); + ClickOnDialogViewAndWait(DialogViewID::CANCEL_BUTTON, + /*wait_for_animation=*/false); } +INSTANTIATE_TEST_SUITE_P(All, PaymentHandlerWindowSizeTest, testing::Bool()); + } // namespace payments
diff --git a/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc index df6171f..13bf014 100644 --- a/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc
@@ -13,6 +13,7 @@ #include "components/autofill/core/browser/field_types.h" #include "components/autofill/core/browser/personal_data_manager.h" #include "components/strings/grit/components_strings.h" +#include "content/public/common/content_switches.h" #include "content/public/test/browser_test.h" #include "net/dns/mock_host_resolver.h" #include "testing/gtest/include/gtest/gtest.h" @@ -194,9 +195,20 @@ DialogViewID::PAYMENT_SHEET_CONTACT_INFO_SECTION)); } -typedef PaymentRequestBrowserTestBase PaymentHandlerUITest; +class PaymentHandlerBackButtonTest : public PaymentRequestBrowserTestBase { + protected: + PaymentHandlerBackButtonTest() = default; -IN_PROC_BROWSER_TEST_F(PaymentHandlerUITest, BackReturnsToPaymentSheet) { + void SetUpCommandLine(base::CommandLine* command_line) override { + PaymentRequestBrowserTestBase::SetUpCommandLine(command_line); + // The back button is only present prior to the minimal header UX refresh. + command_line->AppendSwitchASCII(switches::kDisableBlinkFeatures, + "PaymentHandlerMinimalHeaderUX"); + } +}; + +IN_PROC_BROWSER_TEST_F(PaymentHandlerBackButtonTest, + BackReturnsToPaymentSheet) { NavigateTo("/payment_handler.html"); // Add an autofill profile so the [Continue] button is enabled. @@ -236,7 +248,8 @@ EXPECT_FALSE(IsViewVisible(DialogViewID::PAYMENT_APP_OPENED_WINDOW_SHEET)); } -IN_PROC_BROWSER_TEST_F(PaymentHandlerUITest, BackAbortsRequestIfSkipSheet) { +IN_PROC_BROWSER_TEST_F(PaymentHandlerBackButtonTest, + BackAbortsRequestIfSkipSheet) { NavigateTo("/payment_handler.html"); std::string payment_method; InstallPaymentApp("a.com", "/payment_handler_sw.js", &payment_method);
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc index 6640c79d..aa22144 100644 --- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc +++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
@@ -32,6 +32,7 @@ constexpr int kDefaultConsentDialogHeight = 569; constexpr int kDefaultNoticeDialogHeight = 494; constexpr int kMinRequiredDialogHeight = 100; +constexpr int kMinRequiredDialogWidth = 400; GURL GetDialogURL(PrivacySandboxService::PromptType prompt_type) { GURL base_url = GURL(chrome::kChromeUIPrivacySandboxDialogURL); @@ -99,7 +100,7 @@ } // namespace // static -bool CanWindowFitPrivacySandboxPrompt(Browser* browser) { +bool CanWindowHeightFitPrivacySandboxPrompt(Browser* browser) { const int max_dialog_height = browser->window() ->GetWebContentsModalDialogHost() ->GetMaximumDialogSize() @@ -107,6 +108,14 @@ return max_dialog_height >= kMinRequiredDialogHeight; } +bool CanWindowWidthFitPrivacySandboxPrompt(Browser* browser) { + const int max_dialog_width = browser->window() + ->GetWebContentsModalDialogHost() + ->GetMaximumDialogSize() + .width(); + return max_dialog_width >= kMinRequiredDialogWidth; +} + // static void ShowPrivacySandboxDialog(Browser* browser, PrivacySandboxService::PromptType prompt_type) {
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.cc index 4751389..d71dd6e 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.cc
@@ -92,86 +92,82 @@ LoadWindowControlsOverlayTestPageWithDataAndGetURL( net::test_server::EmbeddedTestServer* embedded_test_server, base::ScopedTempDir* temp_dir) { - constexpr char kTestHTML[] = - "<!DOCTYPE html>" - "<style>" - " body {" - " background: blue;" - " }" - " @media (display-mode: window-controls-overlay) {" - " body {" - " background: red;" - " }" - " }" - " #draggable {" - " app-region: drag;" - " position: absolute;" - " top: 100px;" - " left: 100px;" - " height: 10px;" - " width: 10px;" - " }" - " #non-draggable {" - " app-region: no-drag;" - " position: relative;" - " top: 5px;" - " left: 5px;" - " height: 2px;" - " width: 2px;" - " }" - " #target {" - " padding-left: env(titlebar-area-x);" - " padding-right: env(titlebar-area-width);" - " padding-top: env(titlebar-area-y);" - " padding-bottom: env(titlebar-area-height);" - " }" - "</style>" - "<div id=\"draggable\">" - " <div id=\"non-draggable\"></div>" - "</div>" - "<div id=\"target\"></div>"; - - return LoadTestPageWithDataAndGetURL(embedded_test_server, temp_dir, - kTestHTML); + return LoadTestPageWithDataAndGetURL(embedded_test_server, temp_dir, R"( + <!DOCTYPE html> + <style> + body { + background: blue; + } + @media (display-mode: window-controls-overlay) { + body { + background: red; + } + } + #draggable { + app-region: drag; + position: absolute; + top: 100px; + left: 100px; + height: 10px; + width: 10px; + } + #non-draggable { + app-region: no-drag; + position: relative; + top: 5px; + left: 5px; + height: 2px; + width: 2px; + } + #target { + padding-left: env(titlebar-area-x); + padding-right: env(titlebar-area-width); + padding-top: env(titlebar-area-y); + padding-bottom: env(titlebar-area-height); + } + </style> + <div id='draggable'> + <div id='non-draggable'></div> + </div> + <div id='target'></div> + )"); } GURL WebAppFrameToolbarTestHelper:: LoadWholeAppIsDraggableTestPageWithDataAndGetURL( net::test_server::EmbeddedTestServer* embedded_test_server, base::ScopedTempDir* temp_dir) { - constexpr char kTestHTML[] = - "<!DOCTYPE html>" - "<style>" - " div {" - " app-region: drag;" - " width: 100%;" - " height: 100%;" - " padding: 0px;" - " margin: 0px;" - " position: absolute;" - " }" - " body {" - " padding: 0px;" - " margin: 0px;" - " }" - "</style>" - "<div>Hello draggable world</div>"; - - return LoadTestPageWithDataAndGetURL(embedded_test_server, temp_dir, - kTestHTML); + return LoadTestPageWithDataAndGetURL(embedded_test_server, temp_dir, R"( + <!DOCTYPE html> + <style> + div { + app-region: drag; + width: 100%; + height: 100%; + padding: 0px; + margin: 0px; + position: absolute; + } + body { + padding: 0px; + margin: 0px; + } + </style> + <div>Hello draggable world</div> + )"); } GURL WebAppFrameToolbarTestHelper::LoadTestPageWithDataAndGetURL( net::test_server::EmbeddedTestServer* embedded_test_server, base::ScopedTempDir* temp_dir, - const char kTestHTML[]) { + base::StringPiece test_html) { // Write kTestHTML to a temporary file that can be later reached at // http://127.0.0.1/test_file_*.html. static int s_test_file_number = 1; base::FilePath file_path = temp_dir->GetPath().AppendASCII( base::StringPrintf("test_file_%d.html", s_test_file_number++)); base::ScopedAllowBlockingForTesting allow_temp_file_writing; - base::WriteFile(file_path, kTestHTML); + base::WriteFile(file_path, test_html); GURL url = embedded_test_server->GetURL("/" + file_path.BaseName().AsUTF8Unsafe()); return url; @@ -197,16 +193,16 @@ void WebAppFrameToolbarTestHelper::SetupGeometryChangeCallback( content::WebContents* web_contents) { - EXPECT_TRUE( - ExecJs(web_contents->GetPrimaryMainFrame(), - "var geometrychangeCount = 0;" - "document.title = 'beforegeometrychange';" - "navigator.windowControlsOverlay.ongeometrychange = (e) => {" - " geometrychangeCount++;" - " overlay_rect_from_event = e.titlebarAreaRect;" - " overlay_visible_from_event = e.visible;" - " document.title = 'ongeometrychange';" - "}")); + EXPECT_TRUE(ExecJs(web_contents->GetPrimaryMainFrame(), R"( + var geometrychangeCount = 0; + document.title = 'beforegeometrychange'; + navigator.windowControlsOverlay.ongeometrychange = (e) => { + geometrychangeCount++; + overlay_rect_from_event = e.titlebarAreaRect; + overlay_visible_from_event = e.visible; + document.title = 'ongeometrychange'; + } + )")); } // TODO(https://crbug.com/1277860): Flaky.
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.h b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.h index 3bc4385..f46b83c 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.h +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.h
@@ -101,7 +101,7 @@ GURL LoadTestPageWithDataAndGetURL( net::test_server::EmbeddedTestServer* embedded_test_server, base::ScopedTempDir* temp_dir, - const char kTestHTML[]); + base::StringPiece test_html); }; #endif // CHROME_BROWSER_UI_VIEWS_WEB_APPS_FRAME_TOOLBAR_WEB_APP_FRAME_TOOLBAR_TEST_HELPER_H_
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc index 5e666a5..0e70168 100644 --- a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc +++ b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc
@@ -15,9 +15,7 @@ #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/gfx/geometry/insets.h" #include "ui/views/controls/button/md_text_button.h" -#include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" // static @@ -95,14 +93,22 @@ SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, sheet_->model()->GetCancelButtonLabel()); - // Whether to show the `Choose another option` button, or other dialog - // configuration is delegated to the |sheet_|, and the new sheet likely wants - // to provide a new configuration. - other_mechanisms_button_->SetVisible(ShouldOtherMechanismsButtonBeVisible()); - other_mechanisms_button_->SetText( - sheet_->model()->GetOtherMechanismButtonLabel()); - manage_devices_button_->SetVisible( - sheet_->model()->IsManageDevicesButtonVisible()); + if (ShouldOtherMechanismsButtonBeVisible()) { + SetExtraView(std::make_unique<views::MdTextButton>( + base::BindRepeating( + &AuthenticatorRequestDialogView::OtherMechanismsButtonPressed, + base::Unretained(this)), + sheet_->model()->GetOtherMechanismButtonLabel())); + } else if (sheet_->model()->IsManageDevicesButtonVisible()) { + SetExtraView(std::make_unique<views::MdTextButton>( + base::BindRepeating( + &AuthenticatorRequestDialogView::ManageDevicesButtonPressed, + base::Unretained(this)), + l10n_util::GetStringUTF16(IDS_WEBAUTHN_MANAGE_DEVICES))); + } else { + SetExtraView<views::View>(nullptr); + } + DialogModelChanged(); // If the widget is not yet shown or already being torn down, we are done. In @@ -237,27 +243,6 @@ DCHECK(!model_->should_dialog_be_closed()); model_->AddObserver(this); - // This View contains buttons that can appear at the bottom left of the - // dialog. Only a single button is expected to be visible at a time so the - // padding between them is zero. - auto hbox = std::make_unique<views::View>(); - hbox->SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal, gfx::Insets(), 0)); - - other_mechanisms_button_ = new views::MdTextButton(base::BindRepeating( - &AuthenticatorRequestDialogView::OtherMechanismsButtonPressed, - base::Unretained(this))); - hbox->AddChildView(other_mechanisms_button_.get()); - - manage_devices_button_ = new views::MdTextButton( - base::BindRepeating( - &AuthenticatorRequestDialogView::ManageDevicesButtonPressed, - base::Unretained(this)), - l10n_util::GetStringUTF16(IDS_WEBAUTHN_MANAGE_DEVICES)); - hbox->AddChildView(manage_devices_button_.get()); - - SetExtraView(std::move(hbox)); - SetCloseCallback( base::BindOnce(&AuthenticatorRequestDialogView::OnDialogClosing, base::Unretained(this)));
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h index e41ebe10..fdb0392 100644 --- a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h +++ b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h
@@ -22,10 +22,6 @@ class AuthenticatorRequestDialogViewTestApi; } -namespace views { -class MdTextButton; -} - class AuthenticatorRequestSheetView; // A tab-modal dialog shown while a Web Authentication API request is active. @@ -109,8 +105,6 @@ raw_ptr<AuthenticatorRequestDialogModel> model_; raw_ptr<AuthenticatorRequestSheetView, DanglingUntriaged> sheet_ = nullptr; - raw_ptr<views::MdTextButton> other_mechanisms_button_ = nullptr; - raw_ptr<views::View> manage_devices_button_ = nullptr; std::unique_ptr<views::MenuRunner> other_mechanisms_menu_runner_; bool first_shown_ = false;
diff --git a/chrome/browser/ui/webui/ash/login/oobe_ui.cc b/chrome/browser/ui/webui/ash/login/oobe_ui.cc index 516d39cb..1d59bc13 100644 --- a/chrome/browser/ui/webui/ash/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/ash/login/oobe_ui.cc
@@ -339,9 +339,6 @@ source->AddBoolean("isOobeSoftwareUpdateEnabled", features::IsOobeSoftwareUpdateEnabled()); - source->AddBoolean("isPasswordSelectionEnabledInOobe", - features::IsPasswordSelectionEnabledInOobe()); - source->AddBoolean("isOobeConsumersLocalPasswordsEnabled", features::AreLocalPasswordsEnabledForConsumers()); @@ -538,7 +535,7 @@ AddScreenHandler(std::make_unique<ThemeSelectionScreenHandler>()); - if (features::IsPasswordSelectionEnabledInOobe()) { + if (features::IsPasswordlessGaiaEnabledForConsumers()) { AddScreenHandler(std::make_unique<PasswordSelectionScreenHandler>()); }
diff --git a/chrome/browser/ui/webui/settings/ash/privacy_section.cc b/chrome/browser/ui/webui/settings/ash/privacy_section.cc index 8afcaf1..448f5d0 100644 --- a/chrome/browser/ui/webui/settings/ash/privacy_section.cc +++ b/chrome/browser/ui/webui/settings/ash/privacy_section.cc
@@ -446,6 +446,12 @@ IDS_OS_SETTINGS_PRIVACY_HUB_GEOLOCATION_TOGGLE_DESC}, {"microphoneHwToggleTooltip", IDS_OS_SETTINGS_PRIVACY_HUB_HW_MICROPHONE_TOGGLE_TOOLTIP}, + {"websitesSectionTitle", + IDS_OS_SETTINGS_PRIVACY_HUB_WEBSITES_SECTION_TITLE}, + {"manageMicPermissionsInChromeText", + IDS_OS_SETTINGS_PRIVACY_HUB_MANAGE_MIC_PERMISSIONS_IN_CHROME_TEXT}, + {"noWebsiteCanUseMicText", + IDS_OS_SETTINGS_PRIVACY_HUB_NO_WEBSITE_CAN_USE_MIC_TEXT}, }; html_source->AddLocalizedStrings(kLocalizedStrings);
diff --git a/chrome/browser/vr/cmd_buffer_surface_provider.cc b/chrome/browser/vr/cmd_buffer_surface_provider.cc index ab828b6a..a011b10 100644 --- a/chrome/browser/vr/cmd_buffer_surface_provider.cc +++ b/chrome/browser/vr/cmd_buffer_surface_provider.cc
@@ -9,6 +9,7 @@ #include "gpu/command_buffer/client/gles2_lib.h" #include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h" #include "third_party/skia/include/gpu/GrDirectContext.h" +#include "third_party/skia/include/gpu/ganesh/gl/GrGLDirectContext.h" #include "third_party/skia/include/gpu/gl/GrGLInterface.h" #include "ui/gfx/geometry/size.h" @@ -21,7 +22,7 @@ sk_sp<const GrGLInterface> gr_interface = skia_bindings::CreateGLES2InterfaceBindings(gles2_implementation, gles2_implementation); - gr_context_ = GrDirectContext::MakeGL(std::move(gr_interface)); + gr_context_ = GrDirectContexts::MakeGL(std::move(gr_interface)); DCHECK(gr_context_); }
diff --git a/chrome/browser/vr/native_gl_surface_provider.cc b/chrome/browser/vr/native_gl_surface_provider.cc index 65287e8..fe1b546 100644 --- a/chrome/browser/vr/native_gl_surface_provider.cc +++ b/chrome/browser/vr/native_gl_surface_provider.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/vr/native_gl_surface_provider.h" #include "third_party/skia/include/gpu/GrDirectContext.h" +#include "third_party/skia/include/gpu/ganesh/gl/GrGLDirectContext.h" #include "ui/gfx/geometry/size.h" #include "ui/gl/gl_implementation.h" #include "ui/gl/gl_version_info.h" @@ -24,7 +25,7 @@ sk_sp<const GrGLInterface> gr_interface = gl::init::CreateGrGLInterface(gl_version_info, use_version_es2); DCHECK(gr_interface.get()); - gr_context_ = GrDirectContext::MakeGL(std::move(gr_interface)); + gr_context_ = GrDirectContexts::MakeGL(std::move(gr_interface)); DCHECK(gr_context_.get()); }
diff --git a/chrome/browser/web_applications/policy/web_app_policy_manager_unittest.cc b/chrome/browser/web_applications/policy/web_app_policy_manager_unittest.cc index a843ec0..f947428b 100644 --- a/chrome/browser/web_applications/policy/web_app_policy_manager_unittest.cc +++ b/chrome/browser/web_applications/policy/web_app_policy_manager_unittest.cc
@@ -323,9 +323,15 @@ enum class TestLacrosParam { kLacrosDisabled, kLacrosEnabled }; +enum class PreventCloseStatus { + kPreventCloseEnabled, + kPreventCloseDisabled, + kPreventCloseDefault +}; + struct TestParam { TestLacrosParam lacros_params; - bool prevent_close_enabled; + PreventCloseStatus prevent_close_status; }; class WebAppPolicyManagerTest : public ChromeRenderViewHostTestHarness, @@ -468,10 +474,14 @@ } #endif // BUILDFLAG(IS_CHROMEOS_ASH) - if (GetParam().prevent_close_enabled) { - enabled_features.push_back( - features::kDesktopPWAsEnforceWebAppSettingsPolicy); + enabled_features.push_back( + features::kDesktopPWAsEnforceWebAppSettingsPolicy); + if (GetParam().prevent_close_status == + PreventCloseStatus::kPreventCloseEnabled) { enabled_features.push_back(features::kDesktopPWAsPreventClose); + } else if (GetParam().prevent_close_status == + PreventCloseStatus::kPreventCloseDisabled) { + disabled_features.push_back(features::kDesktopPWAsPreventClose); } scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); @@ -1470,7 +1480,10 @@ loop.Run(); #if BUILDFLAG(IS_CHROMEOS) - if (GetParam().prevent_close_enabled) { + if (GetParam().prevent_close_status == + PreventCloseStatus::kPreventCloseEnabled || + GetParam().prevent_close_status == + PreventCloseStatus::kPreventCloseDefault) { EXPECT_TRUE(IsPreventCloseEnabled(kWindowedUrl)); EXPECT_FALSE(IsPreventCloseEnabled(kTabbedUrl)); EXPECT_FALSE(IsPreventCloseEnabled(kNoContainerUrl)); @@ -1486,34 +1499,48 @@ #endif // BUILDFLAG(IS_CHROMEOS) } -INSTANTIATE_TEST_SUITE_P(WebAppPolicyManagerTestWithParams, - WebAppPolicyManagerTest, - testing::Values( +INSTANTIATE_TEST_SUITE_P( + WebAppPolicyManagerTestWithParams, + WebAppPolicyManagerTest, + testing::Values( #if BUILDFLAG(IS_CHROMEOS_ASH) - TestParam({TestLacrosParam::kLacrosDisabled, - /*prevent_close_enabled=*/false}), - TestParam({TestLacrosParam::kLacrosDisabled, - /*prevent_close_enabled=*/true}), + TestParam({TestLacrosParam::kLacrosDisabled, + /*prevent_close_status=*/PreventCloseStatus:: + kPreventCloseDisabled}), + TestParam({TestLacrosParam::kLacrosDisabled, + /*prevent_close_status=*/PreventCloseStatus:: + kPreventCloseEnabled}), + TestParam({TestLacrosParam::kLacrosDisabled, + /*prevent_close_status=*/PreventCloseStatus:: + kPreventCloseDefault}), #endif // BUILDFLAG(IS_CHROMEOS_ASH) - TestParam({TestLacrosParam::kLacrosEnabled, - /*prevent_close_enabled=*/false}), - TestParam({TestLacrosParam::kLacrosEnabled, - /*prevent_close_enabled=*/true})), - [](const ::testing::TestParamInfo<TestParam>& info) { - std::string test_name = "Test_"; - if (info.param.lacros_params == - TestLacrosParam::kLacrosEnabled) - test_name.append("LacrosEnabled_"); - else - test_name.append("LacrosDisabled_"); + TestParam({TestLacrosParam::kLacrosEnabled, + /*prevent_close_status=*/PreventCloseStatus:: + kPreventCloseDisabled}), + TestParam({TestLacrosParam::kLacrosEnabled, + /*prevent_close_status=*/PreventCloseStatus:: + kPreventCloseEnabled}), + TestParam({TestLacrosParam::kLacrosEnabled, + /*prevent_close_status=*/PreventCloseStatus:: + kPreventCloseDefault})), + [](const ::testing::TestParamInfo<TestParam>& info) { + std::string test_name = "Test_"; + if (info.param.lacros_params == TestLacrosParam::kLacrosEnabled) + test_name.append("LacrosEnabled_"); + else + test_name.append("LacrosDisabled_"); - if (info.param.prevent_close_enabled) { - test_name.append("PreventCloseEnabled"); - } else { - test_name.append("PreventCloseDisabled"); - } - return test_name; - }); + if (info.param.prevent_close_status == + PreventCloseStatus::kPreventCloseEnabled) { + test_name.append("PreventCloseEnabled"); + } else if (info.param.prevent_close_status == + PreventCloseStatus::kPreventCloseDisabled) { + test_name.append("PreventCloseDisabled"); + } else { + test_name.append("PreventCloseDefault"); + } + return test_name; + }); class WebAppPolicyForceUnregistrationTest : public WebAppTest { public:
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt index 0381f22a..923b53e 100644 --- a/chrome/build/android-arm32.pgo.txt +++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@ -chrome-android32-main-1695967146-11d72fe292686db8da66fa79ac20ff09a2bdfbcf.profdata +chrome-android32-main-1695988503-14b8e4ec77a895b0c067f3316a57f32015f6af38.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt index e1337e28..7ebc471 100644 --- a/chrome/build/android-arm64.pgo.txt +++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@ -chrome-android64-main-1695967146-dd2fbf8fbb81ab78479105c673d05c39359d1c09.profdata +chrome-android64-main-1695988503-4aea2cf66895cc0784f73b770f3951c28a25c9d7.profdata
diff --git a/chrome/build/lacros64.pgo.txt b/chrome/build/lacros64.pgo.txt index 419de62..1b08fcbd 100644 --- a/chrome/build/lacros64.pgo.txt +++ b/chrome/build/lacros64.pgo.txt
@@ -1 +1 @@ -chrome-chromeos-amd64-generic-main-1695945611-5f9552a6c6132cf696e9caf7358bb0ff660871c2.profdata +chrome-chromeos-amd64-generic-main-1695988503-88887fa1274adbea45c7df1049dcdb2c99ae1002.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index f3f6213..7f861a48 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1695967146-442d036dfb39556e6a56805d803577723ac7a035.profdata +chrome-linux-main-1695988503-86875a438c37fa8ab1dea5fdfa94249730fa4edd.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 90a0c04..b02aa11 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1695981280-1f0e8b2822b03fab6be0ad808f3bec6249f64ccc.profdata +chrome-mac-arm-main-1695995693-5dfa403e03080395db7bceeedfde34098857550a.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index e90f257..1975fcb9 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1695967146-f4099b742b6e2bcd1671994768733632271f799c.profdata +chrome-mac-main-1695988503-73be492f2f3a2a3b261a11471fa0627853100134.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index caa6f6b..f7aaafdc 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1695967146-ab9384de8921784e3c08805c9bce04c956609425.profdata +chrome-win-arm64-main-1695988503-cc12b36fc3a62b587b95e47266f0ce55ec0521fc.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 0b6bd1f6..b493786 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1695967146-837878cb546f1f7e85955c26007c4eb5b17805af.profdata +chrome-win32-main-1695988503-9bd44924682440794220f649782911500106522f.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 9c1dcc9..4903d82 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1695967146-964242ea82d1aa39c54c29344721cebf90adb339.profdata +chrome-win64-main-1695988503-774c0e247da2406fd526203a7268939aa4729fc4.profdata
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 91c7b8e..05a9bccb 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -303,7 +303,8 @@ // Enables or disables Desktop PWAs to be auto-started on OS login. BASE_FEATURE(kDesktopPWAsRunOnOsLogin, "DesktopPWAsRunOnOsLogin", -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ + BUILDFLAG(IS_CHROMEOS) base::FEATURE_ENABLED_BY_DEFAULT #else base::FEATURE_DISABLED_BY_DEFAULT @@ -313,7 +314,12 @@ // If enabled, allow-listed PWAs cannot be closed manually by the user. BASE_FEATURE(kDesktopPWAsPreventClose, "DesktopPWAsPreventClose", - base::FEATURE_DISABLED_BY_DEFAULT); +#if BUILDFLAG(IS_CHROMEOS) + base::FEATURE_ENABLED_BY_DEFAULT +#else + base::FEATURE_DISABLED_BY_DEFAULT +#endif +); // Runs diagnostics during start up to measure how broken web app icons are to // feed into metrics.
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 47a70a7..eaa8c758 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -199,6 +199,8 @@ "../browser/signin/identity_test_environment_profile_adaptor.h", "../browser/signin/test_signin_client_builder.cc", "../browser/signin/test_signin_client_builder.h", + "../browser/tpcd/experiment/mock_experiment_manager.cc", + "../browser/tpcd/experiment/mock_experiment_manager.h", "../browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl_test_api.h", "base/chrome_render_view_host_test_harness.cc", "base/chrome_render_view_host_test_harness.h",
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_ip_config_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_ip_config_test.js index a0a29a5..47f3b9a 100644 --- a/chrome/test/data/webui/cr_components/chromeos/network/network_ip_config_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/network/network_ip_config_test.js
@@ -110,46 +110,4 @@ assertTrue(!!getAutoConfig()); }); - - test('Do not apply observed changes for static config type', function() { - const ipAddress = '127.0.0.1'; - ipConfig.managedProperties = { - ipAddressConfigType: { - activeValue: 'Static', - policySource: PolicySource.kNone, - }, - staticIpConfig: { - ipAddress: { - activeValue: ipAddress, - }, - }, - connectionState: ConnectionStateType.kNotConnected, - type: NetworkType.kWiFi, - }; - flush(); - - const getIpAddress = () => - ipConfig.shadowRoot.querySelector('network-property-list-mojo') - .shadowRoot.querySelector('cr-input') - .value; - assertEquals(ipAddress, getIpAddress()); - - ipConfig.managedProperties = { - ipAddressConfigType: { - activeValue: 'Static', - policySource: PolicySource.kNone, - }, - staticIpConfig: { - ipAddress: { - activeValue: '127.0.0.2', - }, - }, - connectionState: ConnectionStateType.kNotConnected, - type: NetworkType.kWiFi, - }; - flush(); - - // Observed changes should not be applied if the config type is static. - assertEquals(ipAddress, getIpAddress()); - }); });
diff --git a/chrome/test/data/webui/settings/chromeos/os_privacy_page/privacy_hub_microphone_subpage_test.ts b/chrome/test/data/webui/settings/chromeos/os_privacy_page/privacy_hub_microphone_subpage_test.ts index d404c43..ff112ad4 100644 --- a/chrome/test/data/webui/settings/chromeos/os_privacy_page/privacy_hub_microphone_subpage_test.ts +++ b/chrome/test/data/webui/settings/chromeos/os_privacy_page/privacy_hub_microphone_subpage_test.ts
@@ -5,7 +5,7 @@ import 'chrome://os-settings/lazy_load.js'; import {MediaDevicesProxy, PrivacyHubBrowserProxyImpl, SettingsPrivacyHubMicrophoneSubpage} from 'chrome://os-settings/lazy_load.js'; -import {CrToggleElement, PaperTooltipElement, Router} from 'chrome://os-settings/os_settings.js'; +import {CrLinkRowElement, CrToggleElement, PaperTooltipElement, Router} from 'chrome://os-settings/os_settings.js'; import {webUIListenerCallback} from 'chrome://resources/js/cr.js'; import {DomRepeat, flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {assertEquals, assertFalse, assertNull, assertTrue} from 'chrome://webui-test/chai_assert.js'; @@ -273,4 +273,53 @@ } } }); + + function getManagePermissionsInChromeRow(): CrLinkRowElement { + const managePermissionsInChromeRow = + privacyHubMicrophoneSubpage.shadowRoot!.querySelector<CrLinkRowElement>( + '#managePermissionsInChromeRow'); + assertTrue(!!managePermissionsInChromeRow); + return managePermissionsInChromeRow; + } + + function getNoWebsiteHasAccessTextRow(): HTMLDivElement { + const noWebsiteHasAccessTextRow = + privacyHubMicrophoneSubpage.shadowRoot!.querySelector<HTMLDivElement>( + '#noWebsiteHasAccessText'); + assertTrue(!!noWebsiteHasAccessTextRow); + return noWebsiteHasAccessTextRow; + } + + + test('Websites section texts', async () => { + assertEquals( + privacyHubMicrophoneSubpage.i18n('websitesSectionTitle'), + privacyHubMicrophoneSubpage.shadowRoot! + .querySelector('#websitesSectionTitle')!.textContent!.trim()); + + assertEquals( + privacyHubMicrophoneSubpage.i18n('manageMicPermissionsInChromeText'), + getManagePermissionsInChromeRow().label); + + assertEquals( + privacyHubMicrophoneSubpage.i18n('noWebsiteCanUseMicText'), + getNoWebsiteHasAccessTextRow().textContent!.trim()); + }); + + test('Websites section when microphone allowed', async () => { + assertFalse(getManagePermissionsInChromeRow().hidden); + assertTrue(getNoWebsiteHasAccessTextRow().hidden); + }); + + test('Websites section when microphone not allowed', async () => { + mediaDevices.addDevice('audioinput', 'Fake Microphone'); + await waitAfterNextRender(privacyHubMicrophoneSubpage); + + // Toggle microphone access. + getMicrophoneCrToggle().click(); + await waitAfterNextRender(privacyHubMicrophoneSubpage); + + assertTrue(getManagePermissionsInChromeRow().hidden); + assertFalse(getNoWebsiteHasAccessTextRow().hidden); + }); });
diff --git a/chrome/test/data/webui/settings/safety_hub_module_test.ts b/chrome/test/data/webui/settings/safety_hub_module_test.ts index 06685eab..476b6a2 100644 --- a/chrome/test/data/webui/settings/safety_hub_module_test.ts +++ b/chrome/test/data/webui/settings/safety_hub_module_test.ts
@@ -73,6 +73,8 @@ test('testItemButton', async function() { await assignAndShowTestData(); testElement.buttonIcon = 'cr20:block'; + testElement.buttonAriaLabelId = + 'safetyCheckNotificationPermissionReviewDontAllowAriaLabel'; flush(); // User clicks the button of the 2nd item in the list. @@ -119,4 +121,33 @@ assertFalse(isVisible(testElement.shadowRoot!.querySelector('#line'))); assertFalse(isVisible(testElement.shadowRoot!.querySelector('#siteList'))); }); + + test('testTooltip', async function() { + // Check the item list is filled with the data. + const text = 'Dummy tooltip text'; + await assignAndShowTestData(); + testElement.buttonIcon = 'cr20:block'; + testElement.buttonAriaLabelId = + 'safetyCheckNotificationPermissionReviewDontAllowAriaLabel'; + testElement.buttonTooltipText = text; + flush(); + + // Check that the tooltip is not visible. + let tooltip = testElement.shadowRoot!.querySelector('paper-tooltip'); + assertTrue(!!tooltip); + assertFalse(isVisible(tooltip)); + + // User focuses the button of the 2nd item in the list. + const item = getEntries()[1]!; + const button = item.querySelector('cr-icon-button'); + assertTrue(!!button); + button.focus(); + flush(); + + // Check that the tooltip gets visible with the correct text. + tooltip = testElement.shadowRoot!.querySelector('paper-tooltip'); + assertTrue(!!tooltip); + assertTrue(isVisible(tooltip)); + assertEquals(text, tooltip!.textContent!.trim()); + }); });
diff --git a/chromeos/ash/components/chaps_util/BUILD.gn b/chromeos/ash/components/chaps_util/BUILD.gn index 0d9655a..e337561 100644 --- a/chromeos/ash/components/chaps_util/BUILD.gn +++ b/chromeos/ash/components/chaps_util/BUILD.gn
@@ -16,13 +16,18 @@ "chaps_util.h", "chaps_util_impl.cc", "chaps_util_impl.h", + "key_helper.cc", + "key_helper.h", "pkcs12_reader.cc", "pkcs12_reader.h", + "pkcs12_validator.cc", + "pkcs12_validator.h", ] deps = [ "//base", "//crypto", + "//net", "//third_party/abseil-cpp:absl", "//third_party/boringssl", ]
diff --git a/chromeos/ash/components/chaps_util/chaps_util_impl.cc b/chromeos/ash/components/chaps_util/chaps_util_impl.cc index 25359a1..7e5ae02 100644 --- a/chromeos/ash/components/chaps_util/chaps_util_impl.cc +++ b/chromeos/ash/components/chaps_util/chaps_util_impl.cc
@@ -18,9 +18,10 @@ #include "base/functional/callback.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" -#include "base/strings/string_piece.h" #include "chromeos/ash/components/chaps_util/chaps_slot_session.h" +#include "chromeos/ash/components/chaps_util/key_helper.h" #include "chromeos/ash/components/chaps_util/pkcs12_reader.h" +#include "chromeos/ash/components/chaps_util/pkcs12_validator.h" #include "crypto/chaps_support.h" #include "crypto/scoped_nss_types.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -38,8 +39,6 @@ constexpr CK_ATTRIBUTE_TYPE kKeyInSoftware = CKA_VENDOR_DEFINED + 5; constexpr char kPkcs12ImportFailed[] = "Chaps util PKCS12 import failed with "; constexpr char kPkcs12KeyImportFailed[] = "Chaps util key import failed with "; -constexpr char kPkcs12CertImportFailed[] = - "Chaps util cert import failed with "; // Wraps public key and private key PKCS#11 object handles. struct KeyPairHandles { CK_OBJECT_HANDLE public_key; @@ -161,16 +160,6 @@ return key_in_software; } -crypto::ScopedSECItem MakeIdFromPubKeyNss(std::vector<CK_BYTE>& rsa_modulus) { - SECItem secitem_modulus; - secitem_modulus.data = rsa_modulus.data(); - secitem_modulus.len = rsa_modulus.size(); - return crypto::ScopedSECItem(PK11_MakeIDFromPubKey(&secitem_modulus)); -} - -std::vector<uint8_t> SECItemToBytes(const crypto::ScopedSECItem& id) { - return std::vector<uint8_t>(id->data, id->data + id->len); -} // Create the CKA_ID value that NSS would use for |key_pair| and return it. crypto::ScopedSECItem CreateNssCkaId(ChapsSlotSession* chaps_session, const KeyPairHandles& key_pair) { @@ -211,34 +200,26 @@ base::NumberToString(static_cast<int>(error_code)); } -std::string MakePkcs12CertImportErrorMessage( - Pkcs12ReaderStatusCode error_code) { - return kPkcs12CertImportFailed + - base::NumberToString(static_cast<int>(error_code)); -} - std::string MakePkcs12ImportErrorMessage(Pkcs12ReaderStatusCode error_code) { return kPkcs12ImportFailed + base::NumberToString(static_cast<int>(error_code)); } Pkcs12ReaderStatusCode ImportRsaKey(ChapsSlotSession* chaps_session, - bssl::UniquePtr<EVP_PKEY> key, + const KeyData& key_data, bool is_software_backed, const Pkcs12Reader* pkcs12_reader, - std::vector<uint8_t>& out_id, CK_OBJECT_HANDLE& out_key_handle) { - if (!key) { + if (!key_data.key) { LOG(ERROR) << MakePkcs12KeyImportErrorMessage( Pkcs12ReaderStatusCode::kKeyDataMissed); return Pkcs12ReaderStatusCode::kKeyDataMissed; } - // All the data variables must stay alive until `key_template` is sent to - // Chaps. - const RSA* rsa_key = EVP_PKEY_get0_RSA(key.get()); - std::vector<uint8_t> public_modulus_bytes = - pkcs12_reader->BignumToBytes(RSA_get0_n(rsa_key)); - out_id = SECItemToBytes(MakeIdFromPubKeyNss(public_modulus_bytes)); + // All the data variables must stay alive until `attrs` is sent to Chaps. + const RSA* rsa_key = EVP_PKEY_get0_RSA(key_data.key.get()); + const std::vector<uint8_t>& public_modulus_bytes = + key_data.rsa_key_modulus_bytes; + const std::vector<uint8_t>& cka_id = key_data.cka_id_value; std::vector<uint8_t> public_exponent_bytes = pkcs12_reader->BignumToBytes(RSA_get0_e(rsa_key)); std::vector<uint8_t> private_exponent_bytes = @@ -254,7 +235,7 @@ std::vector<uint8_t> coefficient = pkcs12_reader->BignumToBytes(RSA_get0_iqmp(rsa_key)); - if (public_modulus_bytes.empty() || out_id.empty() || + if (public_modulus_bytes.empty() || cka_id.empty() || public_exponent_bytes.empty() || private_exponent_bytes.empty() || prime_factor_1.empty() || prime_factor_2.empty() || exponent_1.empty() || exponent_2.empty() || coefficient.empty()) { @@ -278,8 +259,9 @@ {CKA_DECRYPT, &true_value, sizeof(CK_BBOOL)}, {CKA_SIGN, &true_value, sizeof(CK_BBOOL)}, {CKA_SIGN_RECOVER, &true_value, sizeof(CK_BBOOL)}, - {CKA_MODULUS, public_modulus_bytes.data(), public_modulus_bytes.size()}, - {CKA_ID, out_id.data(), out_id.size()}, + {CKA_MODULUS, const_cast<uint8_t*>(public_modulus_bytes.data()), + public_modulus_bytes.size()}, + {CKA_ID, const_cast<uint8_t*>(cka_id.data()), cka_id.size()}, {CKA_PUBLIC_EXPONENT, public_exponent_bytes.data(), public_exponent_bytes.size()}, {CKA_PRIVATE_EXPONENT, private_exponent_bytes.data(), @@ -303,16 +285,16 @@ } Pkcs12ReaderStatusCode ImportOneCert(ChapsSlotSession* chaps_session, - X509* cert, + const CertData& cert_data, const std::vector<uint8_t>& id, - CK_OBJECT_HANDLE key_handle, const Pkcs12Reader* pkcs12_helper, bool is_software_backed) { - if (!cert) { + if (!cert_data.x509) { LOG(ERROR) << MakePkcs12CertImportErrorMessage( Pkcs12ReaderStatusCode::kCertificateDataMissed); return Pkcs12ReaderStatusCode::kCertificateDataMissed; } + X509* cert = cert_data.x509.get(); CK_OBJECT_CLASS cert_class = CKO_CERTIFICATE; CK_CERTIFICATE_TYPE cert_type = CKC_X_509; @@ -354,13 +336,7 @@ return get_serial_der_result; } - std::string label; - Pkcs12ReaderStatusCode get_label_result = - pkcs12_helper->GetLabel(cert, label); - if (get_label_result != Pkcs12ReaderStatusCode::kSuccess) { - LOG(ERROR) << MakePkcs12CertImportErrorMessage(get_label_result); - return get_label_result; - } + std::string label = cert_data.nickname; CK_BBOOL force_software_attribute = is_software_backed ? CK_TRUE : CK_FALSE; @@ -395,12 +371,11 @@ } Pkcs12ReaderStatusCode ImportAllCerts(ChapsSlotSession* chaps_session, - bssl::UniquePtr<STACK_OF(X509)> certs, + std::vector<CertData>& certs_data, const std::vector<uint8_t>& id, - CK_OBJECT_HANDLE key_handle, const Pkcs12Reader* pkcs12_helper, bool is_software_backed) { - if (!certs) { + if (certs_data.empty()) { LOG(ERROR) << MakePkcs12CertImportErrorMessage( Pkcs12ReaderStatusCode::kCertificateDataMissed); return Pkcs12ReaderStatusCode::kCertificateDataMissed; @@ -408,9 +383,8 @@ Pkcs12ReaderStatusCode is_every_cert_imported = Pkcs12ReaderStatusCode::kSuccess; - for (size_t i = 0; i < sk_X509_num(certs.get()); ++i) { - if (ImportOneCert(chaps_session, sk_X509_value(certs.get(), i), id, - key_handle, pkcs12_helper, + for (CertData cert_data : certs_data) { + if (ImportOneCert(chaps_session, cert_data, id, pkcs12_helper, is_software_backed) != Pkcs12ReaderStatusCode::kSuccess) { is_every_cert_imported = Pkcs12ReaderStatusCode::kFailureDuringCertImport; } @@ -488,7 +462,7 @@ const std::vector<uint8_t>& pkcs12_data, const std::string& password, const bool is_software_backed, - const Pkcs12Reader& pkcs12_helper_inc) { + const Pkcs12Reader& pkcs12_reader) { std::unique_ptr<ChapsSlotSession> chaps_session = GetChapsSlotSessionForSlot(slot); if (!chaps_session) { @@ -497,32 +471,58 @@ return false; } - bssl::UniquePtr<EVP_PKEY> key; + KeyData key_data; bssl::UniquePtr<STACK_OF(X509)> certs; Pkcs12ReaderStatusCode get_key_and_cert_status = - pkcs12_helper_inc.GetPkcs12KeyAndCerts(pkcs12_data, password, key, certs); + pkcs12_reader.GetPkcs12KeyAndCerts(pkcs12_data, password, key_data.key, + certs); if (get_key_and_cert_status != Pkcs12ReaderStatusCode::kSuccess) { LOG(ERROR) << MakePkcs12ImportErrorMessage(get_key_and_cert_status); return false; } CK_OBJECT_HANDLE key_handle; - // Same id will be used for the key and certs. - std::vector<uint8_t> cka_id_value; - Pkcs12ReaderStatusCode import_key_status = - ImportRsaKey(chaps_session.get(), std::move(key), is_software_backed, - &pkcs12_helper_inc, cka_id_value, key_handle); - if (import_key_status != Pkcs12ReaderStatusCode::kSuccess) { - LOG(ERROR) << MakePkcs12ImportErrorMessage(import_key_status); + Pkcs12ReaderStatusCode enrich_key_data_result = + pkcs12_reader.EnrichKeyData(key_data); + if (enrich_key_data_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12ImportErrorMessage(enrich_key_data_result); return false; } - Pkcs12ReaderStatusCode import_cert_status = - ImportAllCerts(chaps_session.get(), std::move(certs), cka_id_value, - key_handle, &pkcs12_helper_inc, is_software_backed); - if (import_cert_status != Pkcs12ReaderStatusCode::kSuccess) { - LOG(ERROR) << MakePkcs12ImportErrorMessage(import_cert_status); + // This will keep raw_pointers from `certs`, it cannot outlive `certs`. + std::vector<CertData> certs_data; + Pkcs12ReaderStatusCode prepare_certs_status = ValidateAndPrepareCertData( + slot, pkcs12_reader, certs, key_data, certs_data); + if (prepare_certs_status != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12ImportErrorMessage(prepare_certs_status); + return false; + } + + bool is_key_installed = false; + Pkcs12ReaderStatusCode key_installed_result = CanFindInstalledKey( + slot, certs_data.front(), pkcs12_reader, is_key_installed); + if (key_installed_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << "Failed to find installed key in slot due to: " + << MakePkcs12CertImportErrorMessage(key_installed_result); + return false; + } + + if (!is_key_installed) { + Pkcs12ReaderStatusCode import_key_status = + ImportRsaKey(chaps_session.get(), key_data, is_software_backed, + &pkcs12_reader, key_handle); + if (import_key_status != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12ImportErrorMessage(import_key_status); + return false; + } + } + // Same id will be used for the key and certs. + Pkcs12ReaderStatusCode import_certs_status = + ImportAllCerts(chaps_session.get(), certs_data, key_data.cka_id_value, + &pkcs12_reader, is_software_backed); + if (import_certs_status != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12ImportErrorMessage(import_certs_status); return false; }
diff --git a/chromeos/ash/components/chaps_util/chaps_util_impl.h b/chromeos/ash/components/chaps_util/chaps_util_impl.h index 5a482db..33b2dfc 100644 --- a/chromeos/ash/components/chaps_util/chaps_util_impl.h +++ b/chromeos/ash/components/chaps_util/chaps_util_impl.h
@@ -36,13 +36,13 @@ const std::string& password, bool is_software_backed) override; - // Public for testing, allows replacing ChapsPkcs12Helper. + // Public for testing, allows replacing Pkcs12Reader. bool ImportPkcs12CertificateImpl( PK11SlotInfo* slot, const std::vector<uint8_t>& pkcs12_data, const std::string& password, const bool is_software_backed, - const Pkcs12Reader& pkcs12_helper1 = Pkcs12Reader()); + const Pkcs12Reader& pkcs12_reader = Pkcs12Reader()); // If called with true, every slot is assumed to be a chaps-provided slot. void SetIsChapsProvidedSlotForTesting(
diff --git a/chromeos/ash/components/chaps_util/chaps_util_impl_unittest.cc b/chromeos/ash/components/chaps_util/chaps_util_impl_unittest.cc index c45f0b35..2b155f9 100644 --- a/chromeos/ash/components/chaps_util/chaps_util_impl_unittest.cc +++ b/chromeos/ash/components/chaps_util/chaps_util_impl_unittest.cc
@@ -14,17 +14,19 @@ #include <utility> #include <vector> -#include "base/memory/raw_ptr.h" #include "chromeos/ash/components/chaps_util/chaps_slot_session.h" #include "chromeos/ash/components/chaps_util/pkcs12_reader.h" #include "crypto/nss_key_util.h" #include "crypto/scoped_nss_types.h" #include "crypto/scoped_test_nss_db.h" +#include "net/cert/x509_util_nss.h" +#include "net/test/cert_test_util.h" #include "net/test/test_data_directory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/boringssl/src/include/openssl/bn.h" +#include "third_party/boringssl/src/include/openssl/x509.h" namespace chromeos { namespace { @@ -39,6 +41,11 @@ enum AttrValueType { kNotDefined, kCkBool, kCkUlong, kCkBytes }; const char kPkcs12FilePassword[] = "12345"; +const absl::optional<std::vector<CK_BYTE>> default_encoded_cert_label = + base::Base64Decode("dGVzdHVzZXJjZXJ0"); +// python print(base64.b64encode("default nickname".encode('utf-8'))). +const absl::optional<std::vector<CK_BYTE>> default_encoded_label = + base::Base64Decode("VW5rbm93biBvcmc="); // Class helper to keep relations between all possible attribute's types, // attribute's names and attribute's value types. @@ -477,8 +484,14 @@ const std::string& password, bssl::UniquePtr<EVP_PKEY>& key, bssl::UniquePtr<STACK_OF(X509)>& certs) const override { - if (get_pkcs12_key_and_cert_status != Pkcs12ReaderStatusCode::kSuccess) { - return get_pkcs12_key_and_cert_status; + get_pkcs12_key_and_cert_called_++; + if (fake_certs_.get()) { + certs = std::move(fake_certs_); + return Pkcs12ReaderStatusCode::kSuccess; + } + + if (get_pkcs12_key_and_cert_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_pkcs12_key_and_cert_status_; } return Pkcs12Reader::GetPkcs12KeyAndCerts(pkcs12_data, password, key, certs); @@ -487,8 +500,9 @@ Pkcs12ReaderStatusCode GetDerEncodedCert(X509* cert, bssl::UniquePtr<uint8_t>& cert_der, int& cert_der_size) const override { - if (get_cert_der_status != Pkcs12ReaderStatusCode::kSuccess) { - return get_cert_der_status; + get_der_encode_cert_called_++; + if (get_der_encoded_cert_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_der_encoded_cert_status_; } return Pkcs12Reader::GetDerEncodedCert(cert, cert_der, cert_der_size); } @@ -496,8 +510,8 @@ Pkcs12ReaderStatusCode GetIssuerNameDer( X509* cert, base::span<const uint8_t>& issuer_name_data) const override { - if (get_issuer_name_der_status != Pkcs12ReaderStatusCode::kSuccess) { - return get_issuer_name_der_status; + if (get_issuer_name_der_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_issuer_name_der_status_; } return Pkcs12Reader::GetIssuerNameDer(cert, issuer_name_data); } @@ -505,39 +519,191 @@ Pkcs12ReaderStatusCode GetSubjectNameDer( X509* cert, base::span<const uint8_t>& subject_name_data) const override { - if (get_subject_name_der_status != Pkcs12ReaderStatusCode::kSuccess) { - return get_subject_name_der_status; + get_subject_name_der_called_++; + if (get_subject_name_der_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_subject_name_der_status_; } return Pkcs12Reader::GetSubjectNameDer(cert, subject_name_data); } + Pkcs12ReaderStatusCode GetSerialNumberDer( X509* cert, bssl::UniquePtr<uint8_t>& serial_number_der, int& serial_number_der_size) const override { - if (get_serial_number_der_status != Pkcs12ReaderStatusCode::kSuccess) { - return get_serial_number_der_status; + if (get_serial_number_der_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_serial_number_der_status_; } return Pkcs12Reader::GetSerialNumberDer(cert, serial_number_der, serial_number_der_size); } + Pkcs12ReaderStatusCode EnrichKeyData(KeyData& key_data) const override { + get_key_data_called_++; + if (get_key_data_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_key_data_status_; + } + return Pkcs12Reader::EnrichKeyData(key_data); + } + + Pkcs12ReaderStatusCode CheckRelation(const KeyData& key_data, + X509* cert, + bool& is_related) const override { + check_relation_data_called_++; + if (check_relation_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return check_relation_status_; + } + return Pkcs12Reader::CheckRelation(key_data, cert, is_related); + } + + Pkcs12ReaderStatusCode FindRawCertsWithSubject( + PK11SlotInfo* slot, + base::span<const uint8_t> required_subject_name, + CERTCertificateList& found_certs) const override { + find_raw_certs_with_subject_called_++; + + if (fake_some_certs_in_slot_) { + // Some multi steps action here to mock returned CERTCertificateList with + // one cert. This all should go away when PK11_FindRawCertsWithSubject is + // replaced with a new function. + scoped_refptr<net::X509Certificate> x509_cert = + net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem"); + net::ScopedCERTCertificate nss_cert = + net::x509_util::CreateCERTCertificateFromX509Certificate( + x509_cert.get()); + found_certs = *CERT_CertListFromCert(nss_cert.get()); + + return Pkcs12ReaderStatusCode::kSuccess; + } + + if (find_raw_certs_with_subject_ != Pkcs12ReaderStatusCode::kSuccess) { + return find_raw_certs_with_subject_; + } + return Pkcs12Reader::FindRawCertsWithSubject(slot, required_subject_name, + found_certs); + } + + Pkcs12ReaderStatusCode GetLabel(X509* cert, + std::string& label) const override { + get_label_called_++; + if (get_label_override_) { + label = std::string(); + return Pkcs12ReaderStatusCode::kSuccess; + } + if (get_label_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_label_status_; + } + return Pkcs12Reader::GetLabel(cert, label); + } + + Pkcs12ReaderStatusCode IsCertWithNicknameInSlots( + const std::string& nickname_in, + bool& is_nickname_present) const override { + is_certs_with_nickname_in_slots_called_++; + + // Override allows to return first N request to isCertsWithNicknamesInSlot + // with True and then return False, so can verify behaviour when nicknames + // are found in slot. + if (is_certs_with_nickname_in_slots_override_ > 0 && + is_certs_with_nickname_in_slots_override_ < + is_certs_with_nickname_in_slots_called_) { + is_nickname_present = false; + return Pkcs12ReaderStatusCode::kSuccess; + } + + // By default nothing is returned from PK11_FindCertsFromNickname() and + // is_nickname_present will be false, this will override + // is_nickname_present to true for tests. + if (is_certs_nickname_used_) { + is_nickname_present = is_certs_nickname_used_; + return Pkcs12ReaderStatusCode::kSuccess; + } + + if (is_certs_with_nickname_in_slot_status_ != + Pkcs12ReaderStatusCode::kSuccess) { + return is_certs_with_nickname_in_slot_status_; + } + return Pkcs12Reader::IsCertWithNicknameInSlots(nickname_in, + is_nickname_present); + } + + Pkcs12ReaderStatusCode DoesKeyForCertExist( + PK11SlotInfo* slot, + const scoped_refptr<net::X509Certificate>& cert) const override { + find_key_by_cert_called_++; + if (find_key_by_cert_status_ != Pkcs12ReaderStatusCode::kKeyDataMissed) { + return find_key_by_cert_status_; + } + return Pkcs12Reader::DoesKeyForCertExist(slot, cert); + } + + Pkcs12ReaderStatusCode DoesKeyForDerCertExist( + PK11SlotInfo* slot, + const scoped_refptr<net::X509Certificate>& cert) const override { + find_key_by_der_cert_called_++; + if (find_key_by_der_cert_status_ != + Pkcs12ReaderStatusCode::kKeyDataMissed) { + return find_key_by_der_cert_status_; + } + return Pkcs12Reader::DoesKeyForDerCertExist(slot, cert); + } + + Pkcs12ReaderStatusCode GetCertFromDerData( + const unsigned char* der_cert_data, + int der_cert_len, + bssl::UniquePtr<X509>& x509) const override { + return Pkcs12Reader::GetCertFromDerData(der_cert_data, der_cert_len, x509); + } + std::vector<uint8_t> BignumToBytes(const BIGNUM* bignum) const override { - if (bignum_to_bytes_value) { - return bignum_to_bytes_value.value(); + if (bignum_to_bytes_value_) { + return bignum_to_bytes_value_.value(); } return Pkcs12Reader::BignumToBytes(bignum); } - Pkcs12ReaderStatusCode get_pkcs12_key_and_cert_status = + mutable int get_pkcs12_key_and_cert_called_ = 0; + mutable bssl::UniquePtr<STACK_OF(X509)> fake_certs_; + Pkcs12ReaderStatusCode get_pkcs12_key_and_cert_status_ = Pkcs12ReaderStatusCode::kSuccess; - Pkcs12ReaderStatusCode get_cert_der_status = Pkcs12ReaderStatusCode::kSuccess; - Pkcs12ReaderStatusCode get_issuer_name_der_status = + mutable int get_der_encode_cert_called_ = 0; + Pkcs12ReaderStatusCode get_der_encoded_cert_status_ = Pkcs12ReaderStatusCode::kSuccess; - Pkcs12ReaderStatusCode get_subject_name_der_status = + mutable int get_issuer_name_der_called_ = 0; + Pkcs12ReaderStatusCode get_issuer_name_der_status_ = Pkcs12ReaderStatusCode::kSuccess; - Pkcs12ReaderStatusCode get_serial_number_der_status = + mutable int get_subject_name_der_called_ = 0; + Pkcs12ReaderStatusCode get_subject_name_der_status_ = Pkcs12ReaderStatusCode::kSuccess; - absl::optional<std::vector<uint8_t>> bignum_to_bytes_value = absl::nullopt; + mutable int get_serial_number_der_called_ = 0; + Pkcs12ReaderStatusCode get_serial_number_der_status_ = + Pkcs12ReaderStatusCode::kSuccess; + mutable int find_raw_certs_with_subject_called_ = 0; + Pkcs12ReaderStatusCode find_raw_certs_with_subject_ = + Pkcs12ReaderStatusCode::kSuccess; + mutable bssl::UniquePtr<STACK_OF(X509)> certs_with_same_DN_override_; + mutable bool fake_some_certs_in_slot_ = false; + mutable int get_label_called_ = 0; + mutable int get_label_override_ = false; + Pkcs12ReaderStatusCode get_label_status_ = Pkcs12ReaderStatusCode::kSuccess; + mutable int is_certs_with_nickname_in_slots_override_ = 0; + mutable int is_certs_with_nickname_in_slots_called_ = 0; + Pkcs12ReaderStatusCode is_certs_with_nickname_in_slot_status_ = + Pkcs12ReaderStatusCode::kSuccess; + bool is_certs_nickname_used_ = false; + mutable int get_key_data_called_ = 0; + Pkcs12ReaderStatusCode get_key_data_status_ = + Pkcs12ReaderStatusCode::kSuccess; + mutable int check_relation_data_called_ = 0; + Pkcs12ReaderStatusCode check_relation_status_ = + Pkcs12ReaderStatusCode::kSuccess; + mutable int find_key_by_cert_called_ = 0; + Pkcs12ReaderStatusCode find_key_by_cert_status_ = + Pkcs12ReaderStatusCode::kKeyDataMissed; + mutable int find_key_by_der_cert_called_ = 0; + Pkcs12ReaderStatusCode find_key_by_der_cert_status_ = + Pkcs12ReaderStatusCode::kKeyDataMissed; + + absl::optional<std::vector<uint8_t>> bignum_to_bytes_value_ = absl::nullopt; }; class ChapsUtilImplTest : public ::testing::Test { @@ -574,6 +740,25 @@ return pkcs12_data_; } + bool KeyImportNeverDone() const { + ObjectAttributes data = passed_data_.pkcs12_key_attributes; + return data.Size() == 0; + } + + bool CertImportNeverDone() const { + return passed_data_.pkcs12_cert_attributes.empty(); + } + + bool KeyImportDone() const { + ObjectAttributes data = passed_data_.pkcs12_key_attributes; + return data.Size() == 19; // valid only for ReadTestFile("client.p12"). + } + + bool CertImportDone() const { + ObjectAttributes data = passed_data_.pkcs12_cert_attributes[0]; + return data.Size() == 10; // valid only for ReadTestFile("client.p12"). + } + crypto::ScopedTestNSSDB nss_test_db_; PassedData passed_data_; @@ -684,7 +869,7 @@ expected_cert_data[CKA_CERTIFICATE_TYPE] = base::Base64Decode("AAAAAAAAAAA="); expected_cert_data[CKA_ID] = base::Base64Decode("U65QueEa+ljfdKySfD6QbFrXEcM="); - expected_cert_data[CKA_LABEL] = base::Base64Decode("dGVzdHVzZXJjZXJ0"); + expected_cert_data[CKA_LABEL] = default_encoded_cert_label; expected_cert_data[CKA_VALUE] = base::Base64Decode( "MIICpTCCAg6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJBVTETMBEGA1UE" "CBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMQ8wDQYD" @@ -913,7 +1098,7 @@ // Failed import PKCS12 due to empty keys. TEST_F(ChapsUtilPKCS12ImportTest, EmptyKeyPtrPKCS12ImportFailed) { - fake_pkcs12_reader_.get_pkcs12_key_and_cert_status = + fake_pkcs12_reader_.get_pkcs12_key_and_cert_status_ = Pkcs12ReaderStatusCode::kKeyExtractionFailed; bool import_result = RunImportPkcs12Certificate(); EXPECT_EQ(import_result, false); @@ -921,9 +1106,8 @@ // Failed import PKCS12 due to missed key attribute. TEST_F(ChapsUtilPKCS12ImportTest, MissedKeyAttributePKCS12ImportFailed) { - std::vector<uint8_t> empty_vector({}); // This will set all attributes to empty. - fake_pkcs12_reader_.bignum_to_bytes_value = absl::make_optional(empty_vector); + fake_pkcs12_reader_.bignum_to_bytes_value_ = std::vector<uint8_t>(); bool import_result = RunImportPkcs12Certificate(); EXPECT_EQ(import_result, false); } @@ -937,7 +1121,7 @@ } TEST_F(ChapsUtilPKCS12ImportTest, FailedGetCertDerPKCS12ImportFailed) { - fake_pkcs12_reader_.get_cert_der_status = + fake_pkcs12_reader_.get_der_encoded_cert_status_ = Pkcs12ReaderStatusCode::kKeyExtractionFailed; bool import_result = RunImportPkcs12Certificate(); @@ -945,7 +1129,7 @@ } TEST_F(ChapsUtilPKCS12ImportTest, FailedGetIssuerNameDerPKCS12ImportFailed) { - fake_pkcs12_reader_.get_issuer_name_der_status = + fake_pkcs12_reader_.get_issuer_name_der_status_ = Pkcs12ReaderStatusCode::kPkcs12CertIssuerDerNameFailed; bool import_result = RunImportPkcs12Certificate(); @@ -953,7 +1137,7 @@ } TEST_F(ChapsUtilPKCS12ImportTest, FailedGetSubjectNameDerPKCS12ImportFailed) { - fake_pkcs12_reader_.get_subject_name_der_status = + fake_pkcs12_reader_.get_subject_name_der_status_ = Pkcs12ReaderStatusCode::kPkcs12CertSubjectNameDerFailed; bool import_result = RunImportPkcs12Certificate(); @@ -961,7 +1145,7 @@ } TEST_F(ChapsUtilPKCS12ImportTest, FailedGetSerialNumberDerPKCS12ImportFailed) { - fake_pkcs12_reader_.get_serial_number_der_status = + fake_pkcs12_reader_.get_serial_number_der_status_ = Pkcs12ReaderStatusCode::kPkcs12CertSerialNumberDerFailed; bool import_result = RunImportPkcs12Certificate(); @@ -975,7 +1159,303 @@ passed_data_.operation_results[1] = CKR_GENERAL_ERROR; bool import_result = RunImportPkcs12Certificate(); - EXPECT_EQ(import_result, false); + + EXPECT_FALSE(import_result); +} + +// Empty list returned for certificates from GetPkcs12KeyAndCerts, key is ok. +// Import failed. +TEST_F(ChapsUtilPKCS12ImportTest, NoCertsForValidationPKCS12ImportFailed) { + fake_pkcs12_reader_.fake_certs_ = + bssl::UniquePtr<STACK_OF(X509)>(sk_X509_new_null()); + + bool import_result = chaps_util_impl_->ImportPkcs12CertificateImpl( + nss_test_db_.slot(), GetPkcs12Data(), kPkcs12FilePassword, + /*is_software_backed=*/true, fake_pkcs12_reader_); + + EXPECT_EQ(fake_pkcs12_reader_.get_pkcs12_key_and_cert_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.get_key_data_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.check_relation_data_called_, 0); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// GetKeyData failed to extract data for the key, validation failed. +// Import failed. +TEST_F(ChapsUtilPKCS12ImportTest, GetKeyDataFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.get_key_data_status_ = + Pkcs12ReaderStatusCode::kKeyDataMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_key_data_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.check_relation_data_called_, 0); + + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// CheckRelation between cert and key failed, validation failed. +// Import failed. +TEST_F(ChapsUtilPKCS12ImportTest, CheckRelationFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.check_relation_status_ = + Pkcs12ReaderStatusCode::kKeyDataMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.check_relation_data_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.get_subject_name_der_called_, 0); + + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// Cert is not related to key, validation failed. +// Import failed. +TEST_F(ChapsUtilPKCS12ImportTest, CertNotRelatedToKeyPKCS12ImportFailed) { + fake_pkcs12_reader_.check_relation_status_ = + Pkcs12ReaderStatusCode::kPkcs12NoValidCertificatesFound; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.check_relation_data_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.get_subject_name_der_called_, 0); + + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// Cert has no DER subject name, GetNickname failed, validation failed. +// Import failed. +TEST_F(ChapsUtilPKCS12ImportTest, CertHasNoDERSubjectNamePKCS12ImportFailed) { + fake_pkcs12_reader_.get_subject_name_der_status_ = + Pkcs12ReaderStatusCode::kPkcs12CertSubjectNameMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_subject_name_der_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.find_raw_certs_with_subject_called_, 0); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// FindRawCertsWithSubject failed during searching for cert with required +// subject in slot. GetNickname failed, validation failed. +// Import failed. +TEST_F(ChapsUtilPKCS12ImportTest, + FindRawCertsWithSubjectFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.find_raw_certs_with_subject_ = + Pkcs12ReaderStatusCode::kPkcs12FindCertsWithSubjectFailed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_subject_name_der_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.find_raw_certs_with_subject_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 0); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// There is one certificate with the same subject in slot, but GetLabel for it +// failed. +// Import successful with the currents cert's nickname. +TEST_F(ChapsUtilPKCS12ImportTest, + GetLabelForFoundCertFailedPKCS12ImportSucess) { + fake_pkcs12_reader_.fake_some_certs_in_slot_ = true; + fake_pkcs12_reader_.get_label_status_ = + Pkcs12ReaderStatusCode::kPkcs12CertIssuerNameMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 2); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_TRUE(KeyImportDone()); + EXPECT_TRUE(import_result); +} + +// There is one certificate with the same subject in slot. +// Import successful with already stored test cert's nickname. +TEST_F(ChapsUtilPKCS12ImportTest, + CertWithSameSubjectInSlotPKCS12ImportSuccess) { + fake_pkcs12_reader_.fake_some_certs_in_slot_ = true; + // python print(base64.b64encode("127.0.0.1".encode('utf-8'))). + auto expected_encoded_label = base::Base64Decode("MTI3LjAuMC4x"); + + bool import_result = RunImportPkcs12Certificate(); + + ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; + EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), expected_encoded_label); + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 0); + EXPECT_TRUE(KeyImportDone()); + EXPECT_TRUE(import_result); +} + +// There is one certificate with the same subject, but GetLabel for it returns +// empty string. Import successful with the cert's nickname. +TEST_F(ChapsUtilPKCS12ImportTest, GetLabelReturnsEmptyPKCS12ImportSuccess) { + fake_pkcs12_reader_.fake_some_certs_in_slot_ = true; + fake_pkcs12_reader_.get_label_override_ = true; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 2); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_TRUE(KeyImportDone()); + EXPECT_TRUE(import_result); +} + +// No certificate with the same subject exists, GetLabel for current cert +// failed, import is successful with default label. +TEST_F(ChapsUtilPKCS12ImportTest, GetLabelFailedPKCS12ImportSuccess) { + fake_pkcs12_reader_.get_label_status_ = + Pkcs12ReaderStatusCode::kPkcs12LabelCreationFailed; + + bool import_result = RunImportPkcs12Certificate(); + + ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; + EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), default_encoded_label); + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_TRUE(KeyImportDone()); + EXPECT_TRUE(import_result); +} + +// No certificate with the same subject in slot, GetLabel for the current cert +// returned empty string, import is successful with default label. +TEST_F(ChapsUtilPKCS12ImportTest, GetLabelReturnEmptyPKCS12ImportSuccess) { + fake_pkcs12_reader_.get_label_override_ = true; + + bool import_result = RunImportPkcs12Certificate(); + + ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; + EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), default_encoded_label); + + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_TRUE(KeyImportDone()); + EXPECT_TRUE(import_result); +} + +// No certificate with same subject exists, MakeNicknameUnique failed, import +// failed. +TEST_F(ChapsUtilPKCS12ImportTest, MakeNicknameUniqueFailedPKCS12ImportFailed) { + // Setting is_certs_nickname_used = true will lead to fail of making label + // unique, it will increase counter to 100 and at the end return + // Pkcs12ReaderStatusCode::kReachedMaxAttemptForUniqueness. + fake_pkcs12_reader_.is_certs_nickname_used_ = true; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 100); + + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// No certificate with same subject exists, MakeNicknameUnique is called, but +// isCertsWithNicknamesInSlot has failed. +// Import failed. +TEST_F(ChapsUtilPKCS12ImportTest, CertsSearchInSlotFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.is_certs_with_nickname_in_slot_status_ = + Pkcs12ReaderStatusCode::kPkcs12MissedNickname; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// 20 certificates with same subject already exists in slot, import successful. +// cert nicknames in slot will be 'testusercert', 'testusercert 1', ..., +// 'testusercert 19'. +TEST_F(ChapsUtilPKCS12ImportTest, CertsSearchInSlot20TimesPKCS12ImportFailed) { + fake_pkcs12_reader_.is_certs_with_nickname_in_slots_override_ = 20; + fake_pkcs12_reader_.is_certs_nickname_used_ = true; + // python print(base64.b64encode("testusercert 20".encode('utf-8'))) + auto expected_encoded_label = base::Base64Decode("dGVzdHVzZXJjZXJ0IDIw"); + + bool import_result = RunImportPkcs12Certificate(); + ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; + + EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), expected_encoded_label); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 21); + EXPECT_TRUE(import_result); + EXPECT_TRUE(KeyImportDone()); +} + +// GetScopedCert is failed inside CanFindInstalledKey. +// Import failed. +TEST_F(ChapsUtilPKCS12ImportTest, GetScopedCertFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.get_der_encoded_cert_status_ = + Pkcs12ReaderStatusCode::kPkcs12CertDerMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_der_encode_cert_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// FindPrivateKeyFromCert is failed inside CanFindInstalledKey. +// Import failed. +TEST_F(ChapsUtilPKCS12ImportTest, + FindPrivateKeyFromCertFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.find_key_by_cert_status_ = + Pkcs12ReaderStatusCode::kPkcs12CertIssuerNameMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_der_cert_called_, 0); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// Private key found by cert inside CanFindInstalledKey. +// Key import is never happened, but cert is imported. +TEST_F(ChapsUtilPKCS12ImportTest, FindPrivateKeyFromCertSuccPKCS12ImportSucc) { + fake_pkcs12_reader_.find_key_by_cert_status_ = + Pkcs12ReaderStatusCode::kSuccess; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_der_cert_called_, 0); + EXPECT_TRUE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); + EXPECT_TRUE(CertImportDone()); +} + +// FindKeyByDERCert is failed inside CanFindInstalledKey. +// Import failed. +TEST_F(ChapsUtilPKCS12ImportTest, FindKeyByDERCertFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.find_key_by_der_cert_status_ = + Pkcs12ReaderStatusCode::kPkcs12CertIssuerNameMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_der_cert_called_, 1); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// Private key found in slot by DER cert inside CanFindInstalledKey. +// Key import is never happened, but cert is imported. +TEST_F(ChapsUtilPKCS12ImportTest, FindKeyByDERCertSuccPKCS12ImportSucc) { + fake_pkcs12_reader_.find_key_by_der_cert_status_ = + Pkcs12ReaderStatusCode::kSuccess; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_der_cert_called_, 1); + EXPECT_TRUE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); + EXPECT_TRUE(CertImportDone()); } } // namespace
diff --git a/chromeos/ash/components/chaps_util/key_helper.cc b/chromeos/ash/components/chaps_util/key_helper.cc new file mode 100644 index 0000000..adb8a4db --- /dev/null +++ b/chromeos/ash/components/chaps_util/key_helper.cc
@@ -0,0 +1,21 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/ash/components/chaps_util/key_helper.h" + +namespace chromeos { + +crypto::ScopedSECItem MakeIdFromPubKeyNss( + std::vector<CK_BYTE>& public_key_bytes) { + SECItem secitem_modulus; + secitem_modulus.data = public_key_bytes.data(); + secitem_modulus.len = public_key_bytes.size(); + return crypto::ScopedSECItem(PK11_MakeIDFromPubKey(&secitem_modulus)); +} + +std::vector<uint8_t> SECItemToBytes(const crypto::ScopedSECItem& id) { + return std::vector<uint8_t>(id->data, id->data + id->len); +} + +} // namespace chromeos
diff --git a/chromeos/ash/components/chaps_util/key_helper.h b/chromeos/ash/components/chaps_util/key_helper.h new file mode 100644 index 0000000..88c82f8b --- /dev/null +++ b/chromeos/ash/components/chaps_util/key_helper.h
@@ -0,0 +1,25 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_KEY_HELPER_H_ +#define CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_KEY_HELPER_H_ + +#include <stdint.h> + +#include <vector> + +#include "crypto/scoped_nss_types.h" + +namespace chromeos { + +// Calculates and returns CKA_ID from public key bytes (`public_key_bytes`). +crypto::ScopedSECItem MakeIdFromPubKeyNss( + std::vector<CK_BYTE>& public_key_bytes); + +// Converts ScopedSECItem id (`id`) to vector<uint8_t>. +std::vector<uint8_t> SECItemToBytes(const crypto::ScopedSECItem& id); + +} // namespace chromeos + +#endif // CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_KEY_HELPER_H_
diff --git a/chromeos/ash/components/chaps_util/pkcs12_reader.cc b/chromeos/ash/components/chaps_util/pkcs12_reader.cc index 957facf..5fe6867 100644 --- a/chromeos/ash/components/chaps_util/pkcs12_reader.cc +++ b/chromeos/ash/components/chaps_util/pkcs12_reader.cc
@@ -3,7 +3,10 @@ // found in the LICENSE file. #include <vector> +#include <nss/pk11pub.h> +#include "chromeos/ash/components/chaps_util/key_helper.h" #include "chromeos/ash/components/chaps_util/pkcs12_reader.h" +#include "net/cert/x509_util_nss.h" #include "third_party/boringssl/src/include/openssl/bn.h" #include "third_party/boringssl/src/include/openssl/mem.h" #include "third_party/boringssl/src/include/openssl/pkcs8.h" @@ -78,6 +81,24 @@ return Pkcs12ReaderStatusCode::kSuccess; } +Pkcs12ReaderStatusCode Pkcs12Reader::FindRawCertsWithSubject( + PK11SlotInfo* slot, + base::span<const uint8_t> required_subject_name, + CERTCertificateList& found_certs) const { + SECItem subject_item; + subject_item.len = required_subject_name.size(); + subject_item.data = const_cast<uint8_t*>(required_subject_name.data()); + + // This is a call to NSS, replace it later with a call to Chaps. + CERTCertificateList* found_certs_addr = &found_certs; + SECStatus fetch_cert_with_same_subject_status = + PK11_FindRawCertsWithSubject(slot, &subject_item, &found_certs_addr); + if (fetch_cert_with_same_subject_status != SECSuccess) { + return Pkcs12ReaderStatusCode::kPkcs12FindCertsWithSubjectFailed; + } + return Pkcs12ReaderStatusCode::kSuccess; +} + Pkcs12ReaderStatusCode Pkcs12Reader::GetSubjectNameDer( X509* cert, base::span<const uint8_t>& subject_name_data) const { @@ -124,22 +145,137 @@ return Pkcs12ReaderStatusCode::kPkcs12CertIssuerNameMissed; } - // This is basic implementation which is using common name from the - // Subject name for the label. - // TODO(b/284144984): Replace with proper implementation and update tests. + int alias_len = 0; + const unsigned char* parsed_alias = X509_alias_get0(cert, &alias_len); + if (parsed_alias) { + label = std::string(reinterpret_cast<const char*>(parsed_alias), + static_cast<size_t>(alias_len)); + + return Pkcs12ReaderStatusCode::kSuccess; + } + X509_NAME* subject_name = X509_get_subject_name(cert); if (!subject_name) { return Pkcs12ReaderStatusCode::kPkcs12CertIssuerNameMissed; } - char temp_label[512] = ""; - int get_label_result = X509_NAME_get_text_by_NID( + char temp_label[512]; + int get_common_name = X509_NAME_get_text_by_NID( subject_name, NID_commonName, temp_label, sizeof(temp_label)); - if (!get_label_result) { - return Pkcs12ReaderStatusCode::kPkcs12LabelCreationFailed; + if (get_common_name < 0) { + return Pkcs12ReaderStatusCode::kPkcs12CNExtractionFailed; + } + label = temp_label; + return Pkcs12ReaderStatusCode::kSuccess; +} + +Pkcs12ReaderStatusCode Pkcs12Reader::IsCertWithNicknameInSlots( + const std::string& nickname, + bool& is_nickname_present) const { + if (nickname.empty()) { + return Pkcs12ReaderStatusCode::kPkcs12MissedNickname; + } + CERTCertList* results = + PK11_FindCertsFromNickname(nickname.c_str(), /*wincx=*/nullptr); + is_nickname_present = results && results->list.next != NULL; + return Pkcs12ReaderStatusCode::kSuccess; +} + +Pkcs12ReaderStatusCode Pkcs12Reader::DoesKeyForCertExist( + PK11SlotInfo* slot, + const scoped_refptr<net::X509Certificate>& cert) const { + if (!cert) { + return Pkcs12ReaderStatusCode::kPkcs12CertIssuerNameMissed; + } + if (!slot) { + return Pkcs12ReaderStatusCode::kMissedSlotInfo; + } + net::ScopedCERTCertificate nss_cert = + net::x509_util::CreateCERTCertificateFromX509Certificate(cert.get()); + + SECKEYPrivateKey* private_key = + PK11_FindPrivateKeyFromCert(slot, nss_cert.get(), nullptr); + + if (private_key) { + return Pkcs12ReaderStatusCode::kSuccess; + } + return Pkcs12ReaderStatusCode::kKeyDataMissed; +} + +Pkcs12ReaderStatusCode Pkcs12Reader::DoesKeyForDerCertExist( + PK11SlotInfo* slot, + const scoped_refptr<net::X509Certificate>& cert) const { + if (!cert) { + return Pkcs12ReaderStatusCode::kPkcs12CertIssuerNameMissed; + } + if (!slot) { + return Pkcs12ReaderStatusCode::kMissedSlotInfo; + } + net::ScopedCERTCertificate nss_cert = + net::x509_util::CreateCERTCertificateFromX509Certificate(cert.get()); + + SECKEYPrivateKey* private_key = + PK11_FindKeyByDERCert(slot, nss_cert.get(), nullptr); + + if (private_key) { + return Pkcs12ReaderStatusCode::kSuccess; + } + return Pkcs12ReaderStatusCode::kKeyDataMissed; +} + +Pkcs12ReaderStatusCode Pkcs12Reader::EnrichKeyData(KeyData& key_data) const { + if (!key_data.key) { + return Pkcs12ReaderStatusCode::kKeyDataMissed; + } + if (EVP_PKEY_base_id(key_data.key.get()) == EVP_PKEY_RSA) { + const RSA* rsa_key = EVP_PKEY_get0_RSA(key_data.key.get()); + key_data.rsa_key_modulus_bytes = BignumToBytes(RSA_get0_n(rsa_key)); + key_data.cka_id_value = + SECItemToBytes(MakeIdFromPubKeyNss(key_data.rsa_key_modulus_bytes)); + return Pkcs12ReaderStatusCode::kSuccess; } - label = temp_label; + return Pkcs12ReaderStatusCode::kPkcs12NotSupportedKeyType; +} + +Pkcs12ReaderStatusCode Pkcs12Reader::CheckRelation(const KeyData& key_data, + X509* cert, + bool& is_related) const { + if (!key_data.key) { + return Pkcs12ReaderStatusCode::kKeyDataMissed; + } + + if (!cert) { + return Pkcs12ReaderStatusCode::kCertificateDataMissed; + } + + // Check for RSA key. + if (!key_data.rsa_key_modulus_bytes.empty()) { + EVP_PKEY* pub_key_ptr = X509_get_pubkey(cert); + bssl::UniquePtr<EVP_PKEY> pubkey(pub_key_ptr); + const RSA* rsa_pub_key = EVP_PKEY_get0_RSA(pubkey.get()); + std::vector<uint8_t> public_modulus_bytes = + BignumToBytes(RSA_get0_n(rsa_pub_key)); + + if (key_data.rsa_key_modulus_bytes != public_modulus_bytes) { + return Pkcs12ReaderStatusCode::kPkcs12NoValidCertificatesFound; + } + is_related = true; + return Pkcs12ReaderStatusCode::kSuccess; + } + + return Pkcs12ReaderStatusCode::kPkcs12NotSupportedKeyType; +} + +Pkcs12ReaderStatusCode Pkcs12Reader::GetCertFromDerData( + const unsigned char* der_cert_data, + int der_cert_len, + bssl::UniquePtr<X509>& x509) const { + if (!der_cert_data || !der_cert_len) { + return Pkcs12ReaderStatusCode::kPkcs12NoValidCertificatesFound; + }; + X509* cert = d2i_X509(NULL, &der_cert_data, der_cert_len); + x509 = bssl::UniquePtr<X509>(cert); return Pkcs12ReaderStatusCode::kSuccess; }
diff --git a/chromeos/ash/components/chaps_util/pkcs12_reader.h b/chromeos/ash/components/chaps_util/pkcs12_reader.h index 0c9d666e..18211828 100644 --- a/chromeos/ash/components/chaps_util/pkcs12_reader.h +++ b/chromeos/ash/components/chaps_util/pkcs12_reader.h
@@ -5,9 +5,16 @@ #ifndef CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_PKCS12_READER_H_ #define CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_PKCS12_READER_H_ +#include <cstdint> +#include <string> +#include <vector> + +#include <nss/certt.h> #include "base/component_export.h" #include "base/containers/span.h" #include "chromeos/ash/components/chaps_util/chaps_slot_session.h" +#include "crypto/scoped_nss_types.h" +#include "net/cert/x509_certificate.h" #include "third_party/boringssl/src/include/openssl/pkcs7.h" namespace chromeos { @@ -33,6 +40,34 @@ kFailedToParsePkcs12Data = 17, kMissedPkcs12Data = 18, kPkcs12LabelCreationFailed = 19, + kPkcs12FindCertsWithSubjectFailed = 20, + kPkcs12NoValidCertificatesFound = 21, + kPkcs12ErrorDuringExistingCertConversion = 22, + kPkcs12NoNicknamesWasExtracted = 23, + kPkcs12CanNotExtractDefaultLabelFromCert = 24, + kPkcs12CanNotDecodeRawCert = 25, + kPkcs12ReachedMaxAttemptForUniqueness = 26, + kPkcs12MissedNickname = 27, + kMissedSlotInfo = 28, + kPkcs12NotSupportedKeyType = 29, + kPkcs12CNExtractionFailed = 30, +}; + +struct CertData { + raw_ptr<X509> x509; + std::string nickname; + CertData(); + ~CertData(); +}; + +struct KeyData { + bssl::UniquePtr<EVP_PKEY> key; + std::vector<uint8_t> rsa_key_modulus_bytes; + std::vector<uint8_t> ec_key_public_bytes; + std::vector<uint8_t> common_name; + std::vector<uint8_t> cka_id_value; + KeyData(); + ~KeyData(); }; // Class helper for operations with X509 certificates data which are required @@ -84,6 +119,56 @@ // Converts BIGNUM (`bignum`) to bytes. virtual std::vector<uint8_t> BignumToBytes(const BIGNUM* bignum) const; + + // Fetches X509 certificates (`found_certs`) with required Subject name + // (`required_subject_name`) from the provided slot (`slot`). + // Returns status code. + virtual Pkcs12ReaderStatusCode FindRawCertsWithSubject( + PK11SlotInfo* slot, + base::span<const uint8_t> required_subject_name, + CERTCertificateList& found_certs) const; + + // Check if there are certificates with the same nickname (`nickname_in`) is + // present in any PK11 slots. Set (`is_nickname_present`) to true or false. + // Returns status code. + virtual Pkcs12ReaderStatusCode IsCertWithNicknameInSlots( + const std::string& nickname_in, + bool& is_nickname_present) const; + + // Search if private key is already present in slot (`slot`) using + // related X509 certificate (`cert`). Returns Pkcs12ReaderStatusCode::kSuccess + // if key found, Pkcs12ReaderStatusCode::kKeyDataMissed if key is missed or + // a status code. + virtual Pkcs12ReaderStatusCode DoesKeyForCertExist( + PK11SlotInfo* slot, + const scoped_refptr<net::X509Certificate>& cert) const; + + // Check if private key is already present in slot (`slot`) using DER + // representation of X509 certificate (`cert`). Returns + // Pkcs12ReaderStatusCode::kSuccess if key found, + // Pkcs12ReaderStatusCode::kKeyDataMissed if key is missed or a + // status code. + virtual Pkcs12ReaderStatusCode DoesKeyForDerCertExist( + PK11SlotInfo* slot, + const scoped_refptr<net::X509Certificate>& cert) const; + + // Calculates additional data which can be used for checking key to + // certificate relation from (`key`). For RSA key it will be modulus. Returns + // status code. + virtual Pkcs12ReaderStatusCode EnrichKeyData(KeyData& key_data) const; + + // Check if certificate (`cert`) is related to private key which was used for + // the calculation of key_data (`key_data`), sets boolean (`is_related`). + // Returns status code. + virtual Pkcs12ReaderStatusCode CheckRelation(const KeyData& key_data, + X509* cert, + bool& is_related) const; + // Converts certificates data from DER representation (`der_cert_data`) and + // (`der_cert_len`) to X509 (`x509`). + virtual Pkcs12ReaderStatusCode GetCertFromDerData( + const unsigned char* der_cert_data, + int der_cert_len, + bssl::UniquePtr<X509>& x509) const; }; } // namespace chromeos
diff --git a/chromeos/ash/components/chaps_util/pkcs12_reader_unittest.cc b/chromeos/ash/components/chaps_util/pkcs12_reader_unittest.cc index 5322620..fe91b2ec 100644 --- a/chromeos/ash/components/chaps_util/pkcs12_reader_unittest.cc +++ b/chromeos/ash/components/chaps_util/pkcs12_reader_unittest.cc
@@ -5,6 +5,9 @@ #include <vector> #include "chromeos/ash/components/chaps_util/pkcs12_reader.h" +#include "crypto/scoped_test_nss_db.h" +#include "net/test/cert_test_util.h" +#include "net/test/test_data_directory.h" #include "testing/gmock/include/gmock/gmock.h" #include "third_party/boringssl/src/include/openssl/mem.h" #include "third_party/boringssl/src/include/openssl/x509.h" @@ -43,6 +46,10 @@ return ScopedBIGNUM(BN_new()); } +scoped_refptr<net::X509Certificate> GetTestCert() { + return net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem"); +} + // Tests for testing methods in chaps_util_helper.cc // ChapsUtilImplTest is testing successful import and values, these tests // are mainly checking errors handling. @@ -93,7 +100,7 @@ /*set=*/0); } - void SetOrgDataToX509Name(X509_NAME* X509_name) { + void SetOrgDataWithoutCNToX509Name(X509_NAME* X509_name) { // Country unsigned char country_name[] = "DE"; SetFieldToX509Name(X509_name, "C", country_name); @@ -101,12 +108,18 @@ // Company/Organization unsigned char org_name[] = "Test company"; SetFieldToX509Name(X509_name, "O", org_name); + } + + void SetOrgDataToX509Name(X509_NAME* X509_name) { + // Country name and Company/Organization name + SetOrgDataWithoutCNToX509Name(X509_name); // Common name - unsigned char common_name[] = "common_name"; - SetFieldToX509Name(X509_name, "CN", common_name); + SetFieldToX509Name(X509_name, "CN", common_name_); } + unsigned char common_name_[12] = "common name"; + protected: std::unique_ptr<Pkcs12Reader> pkcs12Reader_; }; @@ -314,16 +327,8 @@ EXPECT_EQ(result, Pkcs12ReaderStatusCode::kPkcs12CertIssuerNameMissed); } - // Empty object for the issuer, operation will succeed. - { - ScopedX509 cert = X509New(); - - Pkcs12ReaderStatusCode result = GetLabel(cert.get()); - EXPECT_EQ(result, Pkcs12ReaderStatusCode::kSuccess); - } - - // Certificate with normal issuer name, operation will succeed. - // Check only import success, values are checked in ChapsUtilImplTest. + // Certificate with present friendly name (alias), operation will + // succeed. Label is taken from friendly name (alias). { ScopedX509 cert = X509New(); ScopedX509_NAME subject = X509NameNew(); @@ -331,10 +336,135 @@ // This only sets org name, country and common name. SetOrgDataToX509Name(subject.get()); X509_set_subject_name(cert.get(), subject.get()); + unsigned char alias[20] = "new alias"; + std::string expected_label(reinterpret_cast<char*>(alias)); + X509_alias_set1(cert.get(), alias, std::size(alias)); std::string label; Pkcs12ReaderStatusCode result = pkcs12Reader_->GetLabel(cert.get(), label); + EXPECT_EQ(result, Pkcs12ReaderStatusCode::kSuccess); + EXPECT_EQ(label.c_str(), expected_label); + } + + // Certificate with no friendly name (alias), but with defined issuer name, + // operation will succeed. Label will be taken from CN. + { + ScopedX509 cert = X509New(); + ScopedX509_NAME subject = X509NameNew(); + + // This only sets org name, country and common name. + SetOrgDataToX509Name(subject.get()); + X509_set_subject_name(cert.get(), subject.get()); + std::string expected_label(reinterpret_cast<char*>(common_name_)); + std::string label; + + Pkcs12ReaderStatusCode result = pkcs12Reader_->GetLabel(cert.get(), label); + + EXPECT_EQ(result, Pkcs12ReaderStatusCode::kSuccess); + EXPECT_EQ(label.c_str(), expected_label); + } + + // Certificate with no friendly name (alias) and with empty subject name, + // operation will fail with kPkcs12CNExtractionFailed. + { + ScopedX509 cert = X509New(); + std::string label; + + Pkcs12ReaderStatusCode result = pkcs12Reader_->GetLabel(cert.get(), label); + EXPECT_TRUE(label.empty()); + EXPECT_EQ(result, Pkcs12ReaderStatusCode::kPkcs12CNExtractionFailed); + } +} + +TEST_F(Pkcs12ReaderTest, isCertsWithNicknamesInSlots) { + // Empty nickname, isCertsWithNicknamesInSlot returns fail. + { + std::string nickname = ""; + bool is_nickname_present = false; + + Pkcs12ReaderStatusCode result = + pkcs12Reader_->IsCertWithNicknameInSlots(nickname, is_nickname_present); + EXPECT_EQ(result, Pkcs12ReaderStatusCode::kPkcs12MissedNickname); + } + + // Not defined nickname, isCertsWithNicknamesInSlot returns fail. + { + std::string not_defined_nickname; + bool is_nickname_present = false; + + Pkcs12ReaderStatusCode result = pkcs12Reader_->IsCertWithNicknameInSlots( + not_defined_nickname, is_nickname_present); + EXPECT_EQ(result, Pkcs12ReaderStatusCode::kPkcs12MissedNickname); + } + + // Not testing normal case, it is tested with certificate in + // chaps_util_impl_unittest.cc +} + +TEST_F(Pkcs12ReaderTest, FindKeyByCert) { + crypto::ScopedTestNSSDB nss_test_db_; + + // Empty certificate, operation will fail. + { + PK11SlotInfo* slot = nullptr; + scoped_refptr<net::X509Certificate> cert = nullptr; + + Pkcs12ReaderStatusCode result = + pkcs12Reader_->DoesKeyForCertExist(slot, cert); + EXPECT_EQ(result, Pkcs12ReaderStatusCode::kPkcs12CertIssuerNameMissed); + } + + // Empty slot, operation will fail. + { + PK11SlotInfo* slot = nullptr; + scoped_refptr<net::X509Certificate> cert = GetTestCert(); + + Pkcs12ReaderStatusCode result = + pkcs12Reader_->DoesKeyForCertExist(slot, cert); + EXPECT_EQ(result, Pkcs12ReaderStatusCode::kMissedSlotInfo); + } + + // Slot and cert provided, it is a test slot, so key will be missed. + { + scoped_refptr<net::X509Certificate> cert = GetTestCert(); + + Pkcs12ReaderStatusCode result = + pkcs12Reader_->DoesKeyForCertExist(nss_test_db_.slot(), cert); + EXPECT_EQ(result, Pkcs12ReaderStatusCode::kKeyDataMissed); + } +} + +TEST_F(Pkcs12ReaderTest, FindKeyByDERCert) { + crypto::ScopedTestNSSDB nss_test_db_; + + // Empty certificate, operation will fail. + { + PK11SlotInfo* slot = nullptr; + scoped_refptr<net::X509Certificate> cert = nullptr; + + Pkcs12ReaderStatusCode result = + pkcs12Reader_->DoesKeyForDerCertExist(slot, cert); + EXPECT_EQ(result, Pkcs12ReaderStatusCode::kPkcs12CertIssuerNameMissed); + } + + // Empty slot, operation will fail. + { + PK11SlotInfo* slot = nullptr; + scoped_refptr<net::X509Certificate> cert = GetTestCert(); + + Pkcs12ReaderStatusCode result = + pkcs12Reader_->DoesKeyForDerCertExist(slot, cert); + EXPECT_EQ(result, Pkcs12ReaderStatusCode::kMissedSlotInfo); + } + + // Slot and cert provided, it is a test slot, so key will be missed. + { + scoped_refptr<net::X509Certificate> cert = GetTestCert(); + + Pkcs12ReaderStatusCode result = + pkcs12Reader_->DoesKeyForDerCertExist(nss_test_db_.slot(), cert); + EXPECT_EQ(result, Pkcs12ReaderStatusCode::kKeyDataMissed); } }
diff --git a/chromeos/ash/components/chaps_util/pkcs12_validator.cc b/chromeos/ash/components/chaps_util/pkcs12_validator.cc new file mode 100644 index 0000000..e4632a8 --- /dev/null +++ b/chromeos/ash/components/chaps_util/pkcs12_validator.cc
@@ -0,0 +1,301 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/ash/components/chaps_util/pkcs12_validator.h" + +#include "base/logging.h" +#include "base/strings/string_number_conversions.h" +#include "chromeos/ash/components/chaps_util/pkcs12_reader.h" +#include "third_party/boringssl/src/include/openssl/mem.h" +#include "third_party/boringssl/src/include/openssl/pkcs8.h" + +namespace chromeos { +namespace { + +constexpr char kPkcs12CertImportFailed[] = + "Chaps util cert import failed with "; +constexpr int kMaxAttemptUniqueNicknameCreation = 100; +constexpr const char kDefaultNickname[] = "Unknown org"; + +std::string AddUniqueIndex(std::string old_name, int unique_number) { + if (unique_number == 0) { + return old_name; + } + return old_name + " " + base::NumberToString(unique_number); +} + +Pkcs12ReaderStatusCode MakeNicknameUnique(PK11SlotInfo* slot, + const std::string& nickname, + const Pkcs12Reader& pkcs12_reader, + std::string& unique_nickname) { + int unique_counter = 0; + std::string temp_nickname; + bool is_nickname_used = true; + while (is_nickname_used && + unique_counter < kMaxAttemptUniqueNicknameCreation) { + temp_nickname = AddUniqueIndex(nickname, unique_counter); + Pkcs12ReaderStatusCode nickname_search_result = + pkcs12_reader.IsCertWithNicknameInSlots(temp_nickname, + is_nickname_used); + if (nickname_search_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(nickname_search_result); + return nickname_search_result; + } + unique_counter++; + } + + if (unique_counter == kMaxAttemptUniqueNicknameCreation) { + return Pkcs12ReaderStatusCode::kPkcs12ReachedMaxAttemptForUniqueness; + } + unique_nickname = temp_nickname; + + return Pkcs12ReaderStatusCode::kSuccess; +} + +Pkcs12ReaderStatusCode GetFirstCertNicknameWithSubject( + PK11SlotInfo* slot, + const Pkcs12Reader& pkcs12_reader, + base::span<const uint8_t> required_subject_name, + std::string& previously_used_nickname) { + CERTCertificateList found_certs; + Pkcs12ReaderStatusCode fetch_cert_status = + pkcs12_reader.FindRawCertsWithSubject(slot, required_subject_name, + found_certs); + if (fetch_cert_status != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(fetch_cert_status); + return fetch_cert_status; + } + + if (found_certs.certs) { + for (int certIndex = 0; certIndex < found_certs.len; certIndex++) { + const unsigned char* der_cert_data = found_certs.certs[certIndex].data; + int der_cert_len = found_certs.certs[certIndex].len; + bssl::UniquePtr<X509> x509_cert; + + Pkcs12ReaderStatusCode get_cert_result = pkcs12_reader.GetCertFromDerData( + der_cert_data, der_cert_len, x509_cert); + if (get_cert_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(get_cert_result); + continue; + } + if (!x509_cert) { + LOG(ERROR) << "Empty certificate received from Pkcs12ReaderStatusCode"; + continue; + } + + std::string nickname; + Pkcs12ReaderStatusCode label_fetch_result = + pkcs12_reader.GetLabel(x509_cert.get(), nickname); + if (label_fetch_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(label_fetch_result); + continue; + } + if (!nickname.empty()) { + PORT_FreeArena(found_certs.arena, PR_FALSE); + previously_used_nickname = nickname; + return Pkcs12ReaderStatusCode::kSuccess; + } + } + } + + PORT_FreeArena(found_certs.arena, PR_FALSE); + return Pkcs12ReaderStatusCode::kPkcs12NoNicknamesWasExtracted; +} + +Pkcs12ReaderStatusCode GetScopedCert( + X509* cert, + const Pkcs12Reader& pkcs12_reader, + scoped_refptr<net::X509Certificate>& scoped_cert) { + int cert_der_size = 0; + bssl::UniquePtr<uint8_t> cert_der; + Pkcs12ReaderStatusCode get_cert_der_result = + pkcs12_reader.GetDerEncodedCert(cert, cert_der, cert_der_size); + if (get_cert_der_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(get_cert_der_result); + return get_cert_der_result; + } + + scoped_cert = net::X509Certificate::CreateFromBytes( + base::make_span(cert_der.get(), static_cast<size_t>(cert_der_size))); + + return Pkcs12ReaderStatusCode::kSuccess; +} + +} // namespace + +CertData::CertData() = default; +CertData::~CertData() = default; + +KeyData::KeyData() = default; +KeyData::~KeyData() = default; + +std::string MakePkcs12CertImportErrorMessage( + Pkcs12ReaderStatusCode error_code) { + return kPkcs12CertImportFailed + + base::NumberToString(static_cast<int>(error_code)); +} + +Pkcs12ReaderStatusCode GetNickname(PK11SlotInfo* slot, + X509* cert, + const Pkcs12Reader& pkcs12_reader, + std::string& cert_nickname) { + base::span<const uint8_t> required_subject; + Pkcs12ReaderStatusCode get_subject_name_result = + pkcs12_reader.GetSubjectNameDer(cert, required_subject); + if (get_subject_name_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(get_subject_name_result); + return get_subject_name_result; + } + + std::string already_used_nickname; + Pkcs12ReaderStatusCode fetch_certs_result = GetFirstCertNicknameWithSubject( + slot, pkcs12_reader, required_subject, already_used_nickname); + + bool acceptable_fetch_certs_result = + fetch_certs_result == Pkcs12ReaderStatusCode::kSuccess || + fetch_certs_result == + Pkcs12ReaderStatusCode::kPkcs12NoNicknamesWasExtracted; + + if (!acceptable_fetch_certs_result) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(fetch_certs_result); + return fetch_certs_result; + } + + if (fetch_certs_result == Pkcs12ReaderStatusCode::kSuccess && + !already_used_nickname.empty()) { + cert_nickname = already_used_nickname; + return Pkcs12ReaderStatusCode::kSuccess; + } + + // No certs with the same subject were found in slot, + // will try to extract nickname from the cert. + std::string nickname; + Pkcs12ReaderStatusCode nickname_extraction_result = + pkcs12_reader.GetLabel(cert, nickname); + if (nickname_extraction_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(WARNING) << MakePkcs12CertImportErrorMessage( + nickname_extraction_result); + } + + if (nickname.empty()) { + // We did try our best, giving default nickname. + nickname = kDefaultNickname; + } + + std::string new_unique_nickname; + Pkcs12ReaderStatusCode make_nickname_uniq_result = + MakeNicknameUnique(slot, nickname, pkcs12_reader, new_unique_nickname); + if (make_nickname_uniq_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(make_nickname_uniq_result); + return make_nickname_uniq_result; + } + + cert_nickname = new_unique_nickname; + return Pkcs12ReaderStatusCode::kSuccess; +} + +Pkcs12ReaderStatusCode CanFindInstalledKey(PK11SlotInfo* slot, + const CertData& cert, + const Pkcs12Reader& pkcs12_reader, + bool& is_key_installed) { + scoped_refptr<net::X509Certificate> scoped_cert; + Pkcs12ReaderStatusCode scoped_cert_result = + GetScopedCert(cert.x509, pkcs12_reader, scoped_cert); + if (scoped_cert_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(scoped_cert_result); + return scoped_cert_result; + } + + // Searching using X509 cert. + Pkcs12ReaderStatusCode res = + pkcs12_reader.DoesKeyForCertExist(slot, scoped_cert); + if (res == Pkcs12ReaderStatusCode::kSuccess) { + is_key_installed = true; + return Pkcs12ReaderStatusCode::kSuccess; + } + + if (res != Pkcs12ReaderStatusCode::kKeyDataMissed) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(res); + return res; + } + + // Searching using DER form of X509 cert. + res = pkcs12_reader.DoesKeyForDerCertExist(slot, scoped_cert); + if (res == Pkcs12ReaderStatusCode::kSuccess) { + is_key_installed = true; + return Pkcs12ReaderStatusCode::kSuccess; + } + + if (res != Pkcs12ReaderStatusCode::kKeyDataMissed) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(res); + return res; + } + + return Pkcs12ReaderStatusCode::kSuccess; +} + +Pkcs12ReaderStatusCode ValidateAndPrepareCertData( + PK11SlotInfo* slot, + const Pkcs12Reader& pkcs12_reader, + const bssl::UniquePtr<STACK_OF(X509)>& certs, + KeyData& key_data, + std::vector<CertData>& valid_certs_data) { + if (!slot) { + return Pkcs12ReaderStatusCode::kMissedSlotInfo; + } + if (!certs) { + return Pkcs12ReaderStatusCode::kCertificateDataMissed; + } + if (!key_data.key) { + return Pkcs12ReaderStatusCode::kKeyDataMissed; + } + + // Normal case if there is one private key and one certificate in pkcs12, but + // it might be the whole chain included. All certs that are not directly + // related to the key will be filtered out. + std::string cert_nickname; + for (size_t i = 0; i < sk_X509_num(certs.get()); ++i) { + X509* cert = sk_X509_value(certs.get(), i); + if (!cert) { + LOG(WARNING) << MakePkcs12CertImportErrorMessage( + Pkcs12ReaderStatusCode::kCertificateDataMissed); + continue; + } + + bool is_cert_related_to_key = false; + Pkcs12ReaderStatusCode cert_to_key_check_result = + pkcs12_reader.CheckRelation(key_data, cert, is_cert_related_to_key); + if (cert_to_key_check_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(cert_to_key_check_result); + continue; + } + if (!is_cert_related_to_key) { + LOG(WARNING) << "Cert is not directly related to key, skipping"; + continue; + } + + if (cert_nickname.empty()) { + Pkcs12ReaderStatusCode get_cert_nickname_result = + GetNickname(slot, cert, pkcs12_reader, cert_nickname); + if (get_cert_nickname_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(WARNING) << "Can not get nickname for the certificate due to: " + << MakePkcs12CertImportErrorMessage( + get_cert_nickname_result); + continue; + } + } + + CertData& cert_data = valid_certs_data.emplace_back(); + cert_data.x509 = cert; + cert_data.nickname = cert_nickname; + } + + if (valid_certs_data.size() > 0) { + return Pkcs12ReaderStatusCode::kSuccess; + } + + return Pkcs12ReaderStatusCode::kPkcs12NoValidCertificatesFound; +} + +} // namespace chromeos
diff --git a/chromeos/ash/components/chaps_util/pkcs12_validator.h b/chromeos/ash/components/chaps_util/pkcs12_validator.h new file mode 100644 index 0000000..3c96a143 --- /dev/null +++ b/chromeos/ash/components/chaps_util/pkcs12_validator.h
@@ -0,0 +1,54 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains a group of functions which are used for pkcs12 data +// validation before data import to chaps. They are used in chaps_util_impl.cc, +// but they are not related to chaps, so they were moved to a separate file. + +#ifndef CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_PKCS12_VALIDATOR_H_ +#define CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_PKCS12_VALIDATOR_H_ + +#include "base/memory/raw_ptr_cast.h" +#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ref.h" +#include "chromeos/ash/components/chaps_util/pkcs12_reader.h" +#include "third_party/boringssl/src/include/openssl/base.h" + +namespace chromeos { + +// Returns an error message corresponding to the given import error code. +std::string MakePkcs12CertImportErrorMessage(Pkcs12ReaderStatusCode error_code); + +// Prepares nickname (friendlyName/alias) for the certificate (`cert`) +// using several attempts - searches for the same DN (Distinguished name) among +// certificates in slot (`slot`) for reusing it. Then extracts nickname from +// certificate itself, then gets CommonName attribute and at the end assign some +// default nickname. +Pkcs12ReaderStatusCode GetNickname(PK11SlotInfo* slot, + X509* cert, + const Pkcs12Reader* pkcs12_reader, + std::string& cert_nickname); + +// Filter out certs from (`certs`) which are not directly related to key_data +// (`key_data`), extracts nickname from the certificate or placing default +// nickname and stores certificates which will be installed to +// (`valid_certs_data`). +Pkcs12ReaderStatusCode ValidateAndPrepareCertData( + PK11SlotInfo* slot, + const Pkcs12Reader& pkcs12_reader, + const bssl::UniquePtr<STACK_OF(X509)>& certs, + KeyData& key_data, + std::vector<CertData>& valid_certs_data); + +// Checks if private key is already present in slot (`slot`) by searching +// for the key using certificate (`cert`) and setting result to +// (`is_key_installed`). +Pkcs12ReaderStatusCode CanFindInstalledKey(PK11SlotInfo* slot, + const CertData& cert, + const Pkcs12Reader& pkcs12_reader, + bool& is_key_installed); + +} // namespace chromeos + +#endif // CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_PKCS12_VALIDATOR_H_
diff --git a/chromeos/ash/components/growth/BUILD.gn b/chromeos/ash/components/growth/BUILD.gn index 4c14857..b8240764 100644 --- a/chromeos/ash/components/growth/BUILD.gn +++ b/chromeos/ash/components/growth/BUILD.gn
@@ -16,7 +16,11 @@ "campaigns_model.h", ] - deps = [ "//base" ] + deps = [ + "//ash/constants", + "//base", + "//components/prefs", + ] defines = [ "IS_CHROMEOS_ASH_COMPONENTS_GROWTH_IMPL" ] } @@ -40,7 +44,10 @@ deps = [ ":growth", ":test_support", + "//ash/constants", "//base/test:test_support", + "//components/prefs:prefs", + "//components/prefs:test_support", "//testing/gmock", "//testing/gtest", ]
diff --git a/chromeos/ash/components/growth/DEPS b/chromeos/ash/components/growth/DEPS index e6afc99b..8f5bda0 100644 --- a/chromeos/ash/components/growth/DEPS +++ b/chromeos/ash/components/growth/DEPS
@@ -1,3 +1,5 @@ include_rules = [ + "+ash/constants", "+base", + "+components/prefs", ] \ No newline at end of file
diff --git a/chromeos/ash/components/growth/campaigns_manager.cc b/chromeos/ash/components/growth/campaigns_manager.cc index 9233db2..152fb5a 100644 --- a/chromeos/ash/components/growth/campaigns_manager.cc +++ b/chromeos/ash/components/growth/campaigns_manager.cc
@@ -3,13 +3,14 @@ // found in the LICENSE file. #include "chromeos/ash/components/growth/campaigns_manager.h" -#include <memory> + #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/json/json_reader.h" #include "base/logging.h" #include "base/task/thread_pool.h" #include "chromeos/ash/components/growth/campaigns_matcher.h" +#include "components/prefs/pref_service.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace growth { @@ -32,7 +33,8 @@ absl::optional<base::Value> value(base::JSONReader::Read(campaigns_data)); if (!value || !value->is_dict()) { - LOG(ERROR) << "Failed to parse campaigns file."; + // TODO(b/299305911): Add metrics to track fail parsing campaign file. + LOG(ERROR) << "Failed to parse campaigns file: " << campaigns_data; return absl::nullopt; } return std::move(value->GetDict()); @@ -46,8 +48,9 @@ return g_instance; } -CampaignsManager::CampaignsManager(CampaignsManagerClient* client) - : client_(client) { +CampaignsManager::CampaignsManager(CampaignsManagerClient* client, + PrefService* local_state) + : client_(client), matcher_(client, local_state) { CHECK_EQ(g_instance, nullptr); g_instance = this; } @@ -65,7 +68,13 @@ observers_.RemoveObserver(observer); } +void CampaignsManager::SetPrefs(PrefService* prefs) { + // Pass `prefs` to `CampaignsMatcher` to enable prefs related targettings. + matcher_.SetPrefs(prefs); +} + void CampaignsManager::LoadCampaigns() { + // TODO(b/299305911): Add metrics to track campaigns load latency. // Load campaigns component via component updater. client_->LoadCampaignsComponent( base::BindOnce(&CampaignsManager::OnCampaignsComponentLoaded, @@ -82,10 +91,11 @@ const absl::optional<const base::FilePath>& path) { if (!path.has_value()) { LOG(ERROR) << "Failed to load campaign component."; + // TODO(b/299305911): Add metrics to track fail loading campaigns component. OnCampaignsLoaded(/*campaigns=*/absl::nullopt); return; } - // Read the campaign file from component mounted path. + // Read the campaigns file from component mounted path. base::ThreadPool::PostTaskAndReplyWithResult( FROM_HERE, {base::MayBlock()}, base::BindOnce(&ReadCampaignsFile, *path), base::BindOnce(&CampaignsManager::OnCampaignsLoaded, @@ -94,7 +104,7 @@ void CampaignsManager::OnCampaignsLoaded( absl::optional<base::Value::Dict> campaigns_dict) { - // Load campaigns into campaign store. + // Load campaigns into campaigns store. if (campaigns_dict.has_value()) { // Update campaigns store. campaigns_store_ = std::move(campaigns_dict.value());
diff --git a/chromeos/ash/components/growth/campaigns_manager.h b/chromeos/ash/components/growth/campaigns_manager.h index 58d8dcc0..773d730 100644 --- a/chromeos/ash/components/growth/campaigns_manager.h +++ b/chromeos/ash/components/growth/campaigns_manager.h
@@ -14,6 +14,8 @@ #include "chromeos/ash/components/growth/campaigns_matcher.h" #include "chromeos/ash/components/growth/campaigns_model.h" +class PrefService; + namespace growth { // A class that manages growth campaigns. @@ -32,7 +34,7 @@ virtual void OnCampaignsLoadCompleted() = 0; }; - explicit CampaignsManager(CampaignsManagerClient* client); + CampaignsManager(CampaignsManagerClient* client, PrefService* local_state); CampaignsManager(const CampaignsManager&) = delete; CampaignsManager& operator=(const CampaignsManager&) = delete; ~CampaignsManager(); @@ -43,6 +45,8 @@ void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); + void SetPrefs(PrefService* prefs); + // Download and install campaigns. Once installed, trigger the // `OnCampaignsLoaded` to install campaigns and notifier observers when // complete loading campaigns.
diff --git a/chromeos/ash/components/growth/campaigns_manager_client.h b/chromeos/ash/components/growth/campaigns_manager_client.h index 6d5f773e..6aa50bc 100644 --- a/chromeos/ash/components/growth/campaigns_manager_client.h +++ b/chromeos/ash/components/growth/campaigns_manager_client.h
@@ -25,6 +25,15 @@ // when loaded. virtual void LoadCampaignsComponent( CampaignComponentLoadedCallback callback) = 0; + + // True if the device is in demo mode. + virtual bool IsDeviceInDemoMode() const = 0; + + // True if the device is cloud gaming device. + virtual bool IsCloudGamingDevice() const = 0; + + // True if the device is feature aware device. + virtual bool IsFeatureAwareDevice() const = 0; }; } // namespace growth
diff --git a/chromeos/ash/components/growth/campaigns_manager_unittest.cc b/chromeos/ash/components/growth/campaigns_manager_unittest.cc index 5e5bc12..d52e95cbc 100644 --- a/chromeos/ash/components/growth/campaigns_manager_unittest.cc +++ b/chromeos/ash/components/growth/campaigns_manager_unittest.cc
@@ -3,43 +3,48 @@ // found in the LICENSE file. #include "chromeos/ash/components/growth/campaigns_manager.h" + #include <memory> + +#include "ash/constants/ash_pref_names.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" +#include "base/strings/stringprintf.h" #include "base/test/task_environment.h" +#include "chromeos/ash/components/growth/campaigns_model.h" #include "chromeos/ash/components/growth/mock_campaigns_manager_client.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/abseil-cpp/absl/types/optional.h" using ::testing::_; namespace growth { namespace { -constexpr char kValidCampaignsFile[] = R"( +constexpr char kValidCampaignsFileTemplate[] = R"( { "reactiveCampaigns": { "0": [ + // Invalid targeting. { "id": 1, "targetings": [ + [] + ], + "payload": {} + }, + "Invalid campaign", + { + "id": 3, + "targetings": [ { - "deviceTargeting": { - "langs": ["en-AU"] - }, - "demoModeTargeting": { - "storeIds": [ - "2", - "4", - "6" - ], - "country": "US" - } + %s } ], "payload": { - "demoMode": { + "demoModeApp": { "attractionLoop": { "videoSrcLang1": "/asset/peripherals_lang1.mp4", "videoSrcLang2": "/asset/peripherals_lang2.mp4" @@ -53,6 +58,18 @@ } )"; +constexpr char kValidDemoModeTargeting[] = R"( + "demoMode": { + "retailers": ["bby", "bestbuy", "bbt"], + "storeIds": ["2", "4", "6"], + "countries": ["US"], + "capability": { + "isCloudGamingDevice": true, + "isFeatureAwareDevice": true + } + } +)"; + constexpr char kCampaignsFileName[] = "campaigns.json"; // testing::InvokeArgument<N> does not work with base::OnceCallback. Use this @@ -90,36 +107,227 @@ // testing::Test: void SetUp() override { testing::Test::SetUp(); - campaigns_manager_ = std::make_unique<CampaignsManager>(&mock_client_); + + InitializePrefService(); + + campaigns_manager_ = + std::make_unique<CampaignsManager>(&mock_client_, local_state_.get()); + campaigns_manager_->SetPrefs(pref_.get()); } protected: + void LoadComponentAndVerifyLoadComplete( + const base::StringPiece& file_content) { + TestCampaignsManagerObserver observer; + campaigns_manager_->AddObserver(&observer); + + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + base::FilePath campaigns_file( + temp_dir_.GetPath().Append(kCampaignsFileName)); + + base::WriteFile(campaigns_file, file_content); + + EXPECT_CALL(mock_client_, LoadCampaignsComponent(_)) + .WillOnce(InvokeCallbackArgument<0, CampaignComponentLoadedCallback>( + temp_dir_.GetPath())); + + campaigns_manager_->LoadCampaigns(); + observer.Wait(); + + ASSERT_TRUE(observer.load_completed()); + } + + void MockDemoMode(bool in_demo_mode, + bool cloud_gaming_device, + bool feature_aware_device, + const base::StringPiece& store_id, + const base::StringPiece& retailer_id, + const base::StringPiece& country) { + EXPECT_CALL(mock_client_, IsDeviceInDemoMode) + .WillRepeatedly(testing::Return(in_demo_mode)); + EXPECT_CALL(mock_client_, IsCloudGamingDevice) + .WillRepeatedly(testing::Return(cloud_gaming_device)); + EXPECT_CALL(mock_client_, IsFeatureAwareDevice) + .WillRepeatedly(testing::Return(feature_aware_device)); + local_state_->SetString(ash::prefs::kDemoModeStoreId, store_id); + local_state_->SetString(ash::prefs::kDemoModeRetailerId, retailer_id); + local_state_->SetString(ash::prefs::kDemoModeCountry, country); + } + + void VerifyDemoModePayload(const Campaign* campaign) { + const auto* payload = campaign->FindDictByDottedPath("payload.demoModeApp"); + ASSERT_EQ("/asset/peripherals_lang1.mp4", + *payload->FindStringByDottedPath("attractionLoop.videoSrcLang1")); + ASSERT_EQ("/asset/peripherals_lang2.mp4", + *payload->FindStringByDottedPath("attractionLoop.videoSrcLang2")); + } + base::test::TaskEnvironment task_environment_; MockCampaignsManagerClient mock_client_; base::ScopedTempDir temp_dir_; + std::unique_ptr<TestingPrefServiceSimple> local_state_; + std::unique_ptr<TestingPrefServiceSimple> pref_; std::unique_ptr<CampaignsManager> campaigns_manager_; + + private: + void InitializePrefService() { + local_state_ = std::make_unique<TestingPrefServiceSimple>(); + pref_ = std::make_unique<TestingPrefServiceSimple>(); + + local_state_->registry()->RegisterStringPref(ash::prefs::kDemoModeCountry, + "US"); + local_state_->registry()->RegisterStringPref( + ash::prefs::kDemoModeRetailerId, std::string()); + local_state_->registry()->RegisterStringPref(ash::prefs::kDemoModeStoreId, + std::string()); + } }; -TEST_F(CampaignsManagerTest, LoadCampiagns) { - TestCampaignsManagerObserver observer; - campaigns_manager_->AddObserver(&observer); +TEST_F(CampaignsManagerTest, LoadAndGetDemoModeCampiagn) { + LoadComponentAndVerifyLoadComplete( + base::StringPrintf(kValidCampaignsFileTemplate, kValidDemoModeTargeting)); - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - base::FilePath campaigns_file(temp_dir_.GetPath().Append(kCampaignsFileName)); + MockDemoMode( + /*in_demo_mode=*/true, + /*cloud_gaming_device=*/true, + /*feature_aware_device=*/true, + /*store_id=*/"2", + /*retailer_id=*/"bby", + /*country=*/"US"); - base::WriteFile(campaigns_file, kValidCampaignsFile); - - EXPECT_CALL(mock_client_, LoadCampaignsComponent(_)) - .WillOnce(InvokeCallbackArgument<0, CampaignComponentLoadedCallback>( - temp_dir_.GetPath())); - - campaigns_manager_->LoadCampaigns(); - observer.Wait(); - - ASSERT_TRUE(observer.load_completed()); + VerifyDemoModePayload( + campaigns_manager_->GetCampaignBySlot(Slot::kDemoModeApp)); } -TEST_F(CampaignsManagerTest, LoadCampiagnsFailed) { +TEST_F(CampaignsManagerTest, GetCampiagnNoTargeting) { + LoadComponentAndVerifyLoadComplete( + base::StringPrintf(kValidCampaignsFileTemplate, "")); + + MockDemoMode( + /*in_demo_mode=*/true, + /*cloud_gaming_device=*/true, + /*feature_aware_device=*/true, + /*store_id=*/"2", + /*retailer_id=*/"bby", + /*country=*/"US"); + + // Verify that the campaign is selected if there is no demo mode targeting. + VerifyDemoModePayload( + campaigns_manager_->GetCampaignBySlot(Slot::kDemoModeApp)); +} + +TEST_F(CampaignsManagerTest, GetCampiagnNoTargetingNotInDemoMode) { + LoadComponentAndVerifyLoadComplete( + base::StringPrintf(kValidCampaignsFileTemplate, "")); + + MockDemoMode( + /*in_demo_mode=*/false, + /*cloud_gaming_device=*/true, + /*feature_aware_device=*/true, + /*store_id=*/"2", + /*retailer_id=*/"bby", + /*country=*/"US"); + + // Verify that the campaign is selected if there is not in demo mode. + VerifyDemoModePayload( + campaigns_manager_->GetCampaignBySlot(Slot::kDemoModeApp)); +} + +// TODO(b/302360652): After user prefs targeting is implemented, add test to +// verify that campaign with user prefs related targeting is not selected when +// user prefs are not available. + +TEST_F(CampaignsManagerTest, GetDemoModeCampiagnNotInDemoMode) { + LoadComponentAndVerifyLoadComplete( + base::StringPrintf(kValidCampaignsFileTemplate, kValidDemoModeTargeting)); + + MockDemoMode( + /*in_demo_mode=*/false, + /*cloud_gaming_device=*/true, + /*feature_aware_device=*/true, + /*store_id=*/"2", + /*retailer_id=*/"bby", + /*country=*/"US"); + + ASSERT_EQ(nullptr, campaigns_manager_->GetCampaignBySlot(Slot::kDemoModeApp)); +} + +TEST_F(CampaignsManagerTest, GetDemoModeCampiagnNotGamingDevice) { + LoadComponentAndVerifyLoadComplete( + base::StringPrintf(kValidCampaignsFileTemplate, kValidDemoModeTargeting)); + + MockDemoMode( + /*in_demo_mode=*/true, + /*cloud_gaming_device=*/false, + /*feature_aware_device=*/true, + /*store_id=*/"2", + /*retailer_id=*/"bby", + /*country=*/"US"); + + ASSERT_EQ(nullptr, campaigns_manager_->GetCampaignBySlot(Slot::kDemoModeApp)); +} + +TEST_F(CampaignsManagerTest, GetDemoModeCampiagnNotFeatureAwareDevice) { + LoadComponentAndVerifyLoadComplete( + base::StringPrintf(kValidCampaignsFileTemplate, kValidDemoModeTargeting)); + + MockDemoMode( + /*in_demo_mode=*/true, + /*cloud_gaming_device=*/true, + /*feature_aware_device=*/false, + /*store_id=*/"2", + /*retailer_id=*/"bby", + /*country=*/"US"); + + ASSERT_EQ(nullptr, campaigns_manager_->GetCampaignBySlot(Slot::kDemoModeApp)); +} + +TEST_F(CampaignsManagerTest, GetDemoModeCampaignstoreIdMismatch) { + LoadComponentAndVerifyLoadComplete( + base::StringPrintf(kValidCampaignsFileTemplate, kValidDemoModeTargeting)); + + MockDemoMode( + /*in_demo_mode=*/true, + /*cloud_gaming_device=*/true, + /*feature_aware_device=*/true, + /*store_id=*/"1", + /*retailer_id=*/"bby", + /*country=*/"US"); + + ASSERT_EQ(nullptr, campaigns_manager_->GetCampaignBySlot(Slot::kDemoModeApp)); +} + +TEST_F(CampaignsManagerTest, GetDemoModeCampiagnRetailerIdMismatch) { + LoadComponentAndVerifyLoadComplete( + base::StringPrintf(kValidCampaignsFileTemplate, kValidDemoModeTargeting)); + + MockDemoMode( + /*in_demo_mode=*/true, + /*cloud_gaming_device=*/true, + /*feature_aware_device=*/true, + /*store_id=*/"2", + /*retailer_id=*/"abc", + /*country=*/"US"); + + ASSERT_EQ(nullptr, campaigns_manager_->GetCampaignBySlot(Slot::kDemoModeApp)); +} + +TEST_F(CampaignsManagerTest, GetDemoModeCampiagnCountryMismatch) { + LoadComponentAndVerifyLoadComplete( + base::StringPrintf(kValidCampaignsFileTemplate, kValidDemoModeTargeting)); + + MockDemoMode( + /*in_demo_mode=*/true, + /*cloud_gaming_device=*/true, + /*feature_aware_device=*/true, + /*store_id=*/"2", + /*retailer_id=*/"bby", + /*country=*/"UK"); + + ASSERT_EQ(nullptr, campaigns_manager_->GetCampaignBySlot(Slot::kDemoModeApp)); +} + +TEST_F(CampaignsManagerTest, LoadCampaignsFailed) { TestCampaignsManagerObserver observer; campaigns_manager_->AddObserver(&observer); @@ -133,8 +341,50 @@ observer.Wait(); ASSERT_TRUE(observer.load_completed()); + + ASSERT_EQ(nullptr, campaigns_manager_->GetCampaignBySlot(Slot::kDemoModeApp)); } -// TODO(b/298467438): Verify getting campaign for a given slot. +TEST_F(CampaignsManagerTest, LoadCampaignsInvalidFile) { + TestCampaignsManagerObserver observer; + campaigns_manager_->AddObserver(&observer); + + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + base::FilePath campaigns_file(temp_dir_.GetPath().Append(kCampaignsFileName)); + + base::WriteFile(campaigns_file, "abc"); + + EXPECT_CALL(mock_client_, LoadCampaignsComponent(_)) + .WillOnce(InvokeCallbackArgument<0, CampaignComponentLoadedCallback>( + temp_dir_.GetPath())); + + campaigns_manager_->LoadCampaigns(); + observer.Wait(); + + ASSERT_TRUE(observer.load_completed()); + + ASSERT_EQ(nullptr, campaigns_manager_->GetCampaignBySlot(Slot::kDemoModeApp)); +} + +TEST_F(CampaignsManagerTest, LoadCampaignsEmptyFile) { + TestCampaignsManagerObserver observer; + campaigns_manager_->AddObserver(&observer); + + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + base::FilePath campaigns_file(temp_dir_.GetPath().Append(kCampaignsFileName)); + + base::WriteFile(campaigns_file, ""); + + EXPECT_CALL(mock_client_, LoadCampaignsComponent(_)) + .WillOnce(InvokeCallbackArgument<0, CampaignComponentLoadedCallback>( + campaigns_file)); + + campaigns_manager_->LoadCampaigns(); + observer.Wait(); + + ASSERT_TRUE(observer.load_completed()); + + ASSERT_EQ(nullptr, campaigns_manager_->GetCampaignBySlot(Slot::kDemoModeApp)); +} } // namespace growth
diff --git a/chromeos/ash/components/growth/campaigns_matcher.cc b/chromeos/ash/components/growth/campaigns_matcher.cc index bb39349f0d..daaf316 100644 --- a/chromeos/ash/components/growth/campaigns_matcher.cc +++ b/chromeos/ash/components/growth/campaigns_matcher.cc
@@ -3,11 +3,46 @@ // found in the LICENSE file. #include "chromeos/ash/components/growth/campaigns_matcher.h" + +#include "ash/constants/ash_pref_names.h" +#include "base/containers/contains.h" #include "base/logging.h" +#include "chromeos/ash/components/growth/campaigns_manager_client.h" +#include "chromeos/ash/components/growth/campaigns_model.h" +#include "components/prefs/pref_service.h" namespace growth { +namespace { -CampaignsMatcher::CampaignsMatcher() = default; +bool MatchPref(const base::Value::List* criterias, + base::StringPiece pref_path, + const PrefService* pref_service) { + if (!pref_service) { + // TODO(b/299305911): This is unexpected. Add metrics to track this case. + LOG(ERROR) << "Matching pref before pref service is available"; + return false; + } + + if (!criterias) { + // No related targeting found in campaign targeting, returns true. + return true; + } + + auto& value = pref_service->GetValue(pref_path); + + // String list targeting. + if (criterias) { + return Contains(*criterias, value); + } + + return false; +} + +} // namespace + +CampaignsMatcher::CampaignsMatcher(CampaignsManagerClient* client, + PrefService* local_state) + : client_(client), local_state_(local_state) {} CampaignsMatcher::~CampaignsMatcher() = default; void CampaignsMatcher::SetCampaigns(const CampaignsPerSlot* proactiveCampaigns, @@ -16,10 +51,95 @@ reactive_campaigns_ = reactiveCampaigns; } +void CampaignsMatcher::SetPrefs(PrefService* prefs) { + prefs_ = prefs; +} + const Campaign* CampaignsMatcher::GetCampaignBySlot(Slot slot) const { - // TODO(b/298467438): Add demo mode targeting and select campaign for the - // given `slot`. + auto* targeted_campaigns = GetCampaignsBySlot(reactive_campaigns_, slot); + if (!targeted_campaigns) { + return nullptr; + } + + for (auto& campaign_value : *targeted_campaigns) { + const auto* campaign = campaign_value.GetIfDict(); + if (!campaign) { + LOG(ERROR) << "Invalid campaign."; + continue; + } + + const auto* targetings = GetTargetings(campaign); + + if (Matched(targetings)) { + return campaign; + } + } + return nullptr; } +bool CampaignsMatcher::MatchDemoModeTier( + const DemoModeTargeting& targeting) const { + const auto is_cloud_gaming = targeting.TargetCloudGamingDevice(); + if (is_cloud_gaming.has_value()) { + if (is_cloud_gaming != client_->IsCloudGamingDevice()) { + return false; + } + } + + const auto is_feature_aware_device = targeting.TargetFeatureAwareDevice(); + if (is_feature_aware_device.has_value()) { + if (is_feature_aware_device != client_->IsFeatureAwareDevice()) { + return false; + } + } + return true; +} + +bool CampaignsMatcher::MaybeMatchDemoModeTargeting( + const DemoModeTargeting& targeting) const { + if (!targeting.IsValid()) { + // Campaigns matched if there is no demo mode targeting. + return true; + } + + if (!client_->IsDeviceInDemoMode()) { + // Return early if it is not in demo mode while the campaign is targeting + // demo mode. + return false; + } + + // TODO(b/298467438): Add demo mode app version targeting. + + if (!MatchDemoModeTier(targeting)) { + return false; + } + + return MatchPref(targeting.GetStoreIds(), ash::prefs::kDemoModeStoreId, + local_state_) && + MatchPref(targeting.GetRetailers(), ash::prefs::kDemoModeRetailerId, + local_state_) && + MatchPref(targeting.GetCountries(), ash::prefs::kDemoModeCountry, + local_state_); +} + +bool CampaignsMatcher::Matched(const Targetings* targetings) const { + // TODO(b/299305911): Add metrics to track matching latency. + if (!targetings || targetings->empty()) { + return true; + } + + // TODO(b/299334282): Implement AND targeting operator when the list contains + // more than one targeting. + const auto* targeting = targetings->front().GetIfDict(); + if (!targeting) { + // Targeting is invalid. Skip the current campaign. + // TODO(b/299305911): Add metrics to track when a targeting is invalid. + LOG(ERROR) << "Invalid targeting."; + return false; + } + + return MaybeMatchDemoModeTargeting(DemoModeTargeting(*targeting)); +} + } // namespace growth
diff --git a/chromeos/ash/components/growth/campaigns_matcher.h b/chromeos/ash/components/growth/campaigns_matcher.h index 5cbba7d..d62f74e0d 100644 --- a/chromeos/ash/components/growth/campaigns_matcher.h +++ b/chromeos/ash/components/growth/campaigns_matcher.h
@@ -5,17 +5,24 @@ #ifndef CHROMEOS_ASH_COMPONENTS_GROWTH_CAMPAIGNS_MATCHER_H_ #define CHROMEOS_ASH_COMPONENTS_GROWTH_CAMPAIGNS_MATCHER_H_ +#include "chromeos/ash/components/growth/campaigns_manager_client.h" #include "chromeos/ash/components/growth/campaigns_model.h" +class PrefService; + namespace growth { class CampaignsMatcher { public: - CampaignsMatcher(); + CampaignsMatcher(CampaignsManagerClient* client, PrefService* local_state); CampaignsMatcher(const CampaignsMatcher&) = delete; CampaignsMatcher& operator=(const CampaignsMatcher&) = delete; ~CampaignsMatcher(); + // Prefs related targeting will only be enabled after this method is call + // explicitly to set user prefs. + void SetPrefs(PrefService* prefs); + void SetCampaigns(const CampaignsPerSlot* proactiveCampaigns, const CampaignsPerSlot* reactiveCampaigns); @@ -24,11 +31,18 @@ const Campaign* GetCampaignBySlot(Slot slot) const; private: + bool MatchDemoModeTier(const DemoModeTargeting& targeting) const; + bool MaybeMatchDemoModeTargeting(const DemoModeTargeting& targeting) const; + bool Matched(const Targetings* targetings) const; + // Owned by CampaignsManager. raw_ptr<const CampaignsPerSlot, ExperimentalAsh> proactive_campaigns_ = nullptr; raw_ptr<const CampaignsPerSlot, ExperimentalAsh> reactive_campaigns_ = nullptr; + raw_ptr<CampaignsManagerClient, ExperimentalAsh> client_ = nullptr; + raw_ptr<PrefService, ExperimentalAsh> local_state_ = nullptr; + raw_ptr<PrefService, ExperimentalAsh> prefs_ = nullptr; }; } // namespace growth
diff --git a/chromeos/ash/components/growth/campaigns_model.cc b/chromeos/ash/components/growth/campaigns_model.cc index 4f743888..83052e4 100644 --- a/chromeos/ash/components/growth/campaigns_model.cc +++ b/chromeos/ash/components/growth/campaigns_model.cc
@@ -4,6 +4,9 @@ #include "chromeos/ash/components/growth/campaigns_model.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/stringprintf.h" + namespace growth { namespace { @@ -12,6 +15,15 @@ inline constexpr char kTargetings[] = "targetings"; +// Demo Mode targeting paths. +inline constexpr char kDemoModeTargeting[] = "demoMode"; +inline constexpr char kDemoModeStoreIds[] = "storeIds"; +inline constexpr char kDemoModeRetailers[] = "retailers"; +inline constexpr char kDemoModeCountries[] = "countries"; +inline constexpr char kDemoModeFeatureAware[] = + "capability.isFeatureAwareDevice"; +inline constexpr char kDemoModeCloudGaming[] = "capability.isCloudGamingDevice"; + inline constexpr char kPayloadPathTemplate[] = "payload.%s"; inline constexpr char kDemoModePayloadPath[] = "demoModeApp"; @@ -48,4 +60,61 @@ return nullptr; } +// Targeting Base. +TargetingBase::TargetingBase(const Targeting& targeting_dict, + const char* targeting_path) + : targeting_(targeting_dict), targeting_path_(targeting_path) {} + +TargetingBase::~TargetingBase() = default; + +bool TargetingBase::IsValid() const { + return !!targeting_.FindDict(targeting_path_); +} + +const base::Value::List* TargetingBase::GetListCriteria( + const char* path_suffix) const { + return targeting_.FindListByDottedPath(GetCriteriaPath(path_suffix)); +} + +const absl::optional<bool> TargetingBase::GetBoolCriteria( + const char* path_suffix) const { + return targeting_.FindBoolByDottedPath(GetCriteriaPath(path_suffix)); +} + +const std::string* TargetingBase::GetStringCriteria( + const char* path_suffix) const { + return targeting_.FindStringByDottedPath(GetCriteriaPath(path_suffix)); +} + +const std::string TargetingBase::GetCriteriaPath( + const char* path_suffix) const { + return base::StringPrintf("%s.%s", targeting_path_, path_suffix); +} + +// Demo Mode Targeting. +DemoModeTargeting::DemoModeTargeting(const Targeting& targeting_dict) + : TargetingBase(targeting_dict, kDemoModeTargeting) {} + +DemoModeTargeting::~DemoModeTargeting() = default; + +const base::Value::List* DemoModeTargeting::GetStoreIds() const { + return GetListCriteria(kDemoModeStoreIds); +} + +const base::Value::List* DemoModeTargeting::GetRetailers() const { + return GetListCriteria(kDemoModeRetailers); +} + +const base::Value::List* DemoModeTargeting::GetCountries() const { + return GetListCriteria(kDemoModeCountries); +} + +const absl::optional<bool> DemoModeTargeting::TargetCloudGamingDevice() const { + return GetBoolCriteria(kDemoModeCloudGaming); +} + +const absl::optional<bool> DemoModeTargeting::TargetFeatureAwareDevice() const { + return GetBoolCriteria(kDemoModeFeatureAware); +} + } // namespace growth
diff --git a/chromeos/ash/components/growth/campaigns_model.h b/chromeos/ash/components/growth/campaigns_model.h index d2c972d3..5550d71 100644 --- a/chromeos/ash/components/growth/campaigns_model.h +++ b/chromeos/ash/components/growth/campaigns_model.h
@@ -5,9 +5,8 @@ #ifndef CHROMEOS_ASH_COMPONENTS_GROWTH_CAMPAIGNS_MODEL_H_ #define CHROMEOS_ASH_COMPONENTS_GROWTH_CAMPAIGNS_MODEL_H_ -#include "base/strings/string_number_conversions.h" -#include "base/strings/stringprintf.h" #include "base/values.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace growth { @@ -76,6 +75,92 @@ const Payload* GetPayloadBySlot(const Campaign* campaign, Slot slot); +// Lists of campaigns keyed by the targeted slot. The key is the slot ID in +// string. For example: +// { +// "0": [...] +// "1": [...] +// } +using CampaignsPerSlot = base::Value::Dict; + +// All campaigns including proactive and reactive campaigns. For example: +// { +// "proactiveCampaigns" : { +// "0": [...], +// "1": [...] +// }, +// "reactiveCampaigns" : { +// "3": [...], +// "4": [...] +// }, +// } +using CampaignsStore = base::Value::Dict; + +const CampaignsPerSlot* GetProactiveCampaigns( + const CampaignsStore* campaigns_store); + +const CampaignsPerSlot* GetReactiveCampaigns( + const CampaignsStore* campaigns_store); + +const Campaigns* GetCampaignsBySlot(const CampaignsPerSlot* campaigns_per_slot, + Slot slot); + +const Targetings* GetTargetings(const Campaign* campaign); + +const Payload* GetPayloadBySlot(const Campaign* campaign, Slot slot); + +class TargetingBase { + public: + explicit TargetingBase(const Targeting& targeting_dict, + const char* targeting_path); + TargetingBase(const TargetingBase&) = delete; + TargetingBase& operator=(const TargetingBase) = delete; + ~TargetingBase(); + + // True if the specific targeting (e.g: demoMode) was found in the targeting + // dictionary. The campaign will be selected if the targeted criteria is not + // found and defer to the next criteria matching. + bool IsValid() const; + + protected: + const base::Value::List* GetListCriteria(const char* path_suffix) const; + const absl::optional<bool> GetBoolCriteria(const char* path_suffix) const; + const std::string* GetStringCriteria(const char* path_suffix) const; + + private: + const std::string GetCriteriaPath(const char* path_suffix) const; + + // The dictionary that contains targeting definition. Owned by + // `CampaignsManager`. + const Targeting& targeting_; + // The targeting path. + const char* targeting_path_; +}; + +// Demo mode targeting. For example: +// { +// "retailers": ["bb", "bsb"]; +// "storeIds": ["2", "4", "6"], +// "country": ["US"], +// "capability": { +// "isFeatureAwareDevice": false, +// "isCloudGamingDevice": true, +// } +// } +class DemoModeTargeting : public TargetingBase { + public: + explicit DemoModeTargeting(const Targeting& targeting_dict); + DemoModeTargeting(const DemoModeTargeting&) = delete; + DemoModeTargeting& operator=(const DemoModeTargeting) = delete; + ~DemoModeTargeting(); + + const base::Value::List* GetStoreIds() const; + const base::Value::List* GetRetailers() const; + const base::Value::List* GetCountries() const; + const absl::optional<bool> TargetCloudGamingDevice() const; + const absl::optional<bool> TargetFeatureAwareDevice() const; +}; + } // namespace growth #endif // CHROMEOS_ASH_COMPONENTS_GROWTH_CAMPAIGNS_MODEL_H_
diff --git a/chromeos/ash/components/growth/mock_campaigns_manager_client.h b/chromeos/ash/components/growth/mock_campaigns_manager_client.h index 71a0b332..42d521d1 100644 --- a/chromeos/ash/components/growth/mock_campaigns_manager_client.h +++ b/chromeos/ash/components/growth/mock_campaigns_manager_client.h
@@ -22,6 +22,9 @@ // CampaignsManagerClient: MOCK_METHOD1(LoadCampaignsComponent, void(CampaignComponentLoadedCallback callback)); + MOCK_CONST_METHOD0(IsDeviceInDemoMode, bool()); + MOCK_CONST_METHOD0(IsCloudGamingDevice, bool()); + MOCK_CONST_METHOD0(IsFeatureAwareDevice, bool()); }; } // namespace growth
diff --git a/chromeos/ash/components/network/BUILD.gn b/chromeos/ash/components/network/BUILD.gn index 06260d3d..633bdcb 100644 --- a/chromeos/ash/components/network/BUILD.gn +++ b/chromeos/ash/components/network/BUILD.gn
@@ -95,6 +95,8 @@ "device_state.h", "enterprise_managed_metadata_store.cc", "enterprise_managed_metadata_store.h", + "ephemeral_network_policies_enablement_handler.cc", + "ephemeral_network_policies_enablement_handler.h", "fast_transition_observer.cc", "fast_transition_observer.h", "geolocation_handler.cc", @@ -219,12 +221,14 @@ "//dbus", ] deps = [ + "//ash/constants", "//base", "//chromeos:test_utils", "//chromeos/ash/components/dbus/shill", "//chromeos/components/onc:test_support", "//chromeos/services/network_config/public/mojom", "//components/onc", + "//components/prefs", "//components/sync_preferences:test_support", "//dbus", "//net:test_support", @@ -326,6 +330,7 @@ "client_cert_resolver_unittest.cc", "client_cert_util_unittest.cc", "device_state_unittest.cc", + "ephemeral_network_policies_enablement_handler_unittest.cc", "fast_transition_observer_unittest.cc", "geolocation_handler_unittest.cc", "hidden_network_handler_unittest.cc",
diff --git a/chromeos/ash/components/network/ephemeral_network_policies_enablement_handler.cc b/chromeos/ash/components/network/ephemeral_network_policies_enablement_handler.cc new file mode 100644 index 0000000..09ef238 --- /dev/null +++ b/chromeos/ash/components/network/ephemeral_network_policies_enablement_handler.cc
@@ -0,0 +1,92 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/ash/components/network/ephemeral_network_policies_enablement_handler.h" + +#include <memory> + +#include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" +#include "base/functional/callback.h" +#include "chromeos/ash/components/network/policy_util.h" +#include "components/prefs/pref_member.h" + +namespace ash { + +EphemeralNetworkPoliciesEnablementHandler:: + EphemeralNetworkPoliciesEnablementHandler( + base::OnceClosure on_ephemeral_network_policies_enabled) + : on_ephemeral_network_policies_enabled_( + std::move(on_ephemeral_network_policies_enabled)) { + DCHECK(on_ephemeral_network_policies_enabled_); + if (features::AreEphemeralNetworkPoliciesEnabled()) { + // Ephemeral network policies are enabled unconditionally. + EnableEphemeralNetworkPolicies(); + } +} + +EphemeralNetworkPoliciesEnablementHandler:: + ~EphemeralNetworkPoliciesEnablementHandler() = default; + +void EphemeralNetworkPoliciesEnablementHandler::SetDevicePrefs( + PrefService* device_prefs) { + if (!device_prefs) { + ephemeral_network_policies_enabled_pref_.reset(); + return; + } + + if (policy_util::AreEphemeralNetworkPoliciesEnabled()) { + // Already enabled - don't care about the policy value. + return; + } + + if (!features::CanEphemeralNetworkPoliciesBeEnabledByPolicy()) { + // The policy should not be respected. + return; + } + + ephemeral_network_policies_enabled_pref_ = + std::make_unique<BooleanPrefMember>(); + ephemeral_network_policies_enabled_pref_->Init( + prefs::kDeviceEphemeralNetworkPoliciesEnabled, device_prefs, + base::BindRepeating( + &EphemeralNetworkPoliciesEnablementHandler::EvaluatePolicyValue, + base::Unretained(this))); + + // Also evaluate the initial state of enablement. + EvaluatePolicyValue(); +} + +void EphemeralNetworkPoliciesEnablementHandler::EvaluatePolicyValue() { + // Only observing if the policy should be respected. + DCHECK(features::CanEphemeralNetworkPoliciesBeEnabledByPolicy()); + + // Don't do anything if ephemeral network policies are already enabled - can + // only be disabled again by restarting ash-chrome. + if (policy_util::AreEphemeralNetworkPoliciesEnabled()) { + return; + } + + if (ephemeral_network_policies_enabled_pref_ && + ephemeral_network_policies_enabled_pref_->GetValue()) { + EnableEphemeralNetworkPolicies(); + } +} + +void EphemeralNetworkPoliciesEnablementHandler:: + EnableEphemeralNetworkPolicies() { + // Ephemeral network policies became enabled - mark as such and notify the + // observer. This can only happen once per process lifetime (see the guard + // clauses above). + policy_util::SetEphemeralNetworkPoliciesEnabled(); + + DCHECK(on_ephemeral_network_policies_enabled_); + std::move(on_ephemeral_network_policies_enabled_).Run(); + + // There's no need to watch the policy enablement anymore after ephemeral + // network policies have been enabled. + ephemeral_network_policies_enabled_pref_.reset(); +} + +} // namespace ash
diff --git a/chromeos/ash/components/network/ephemeral_network_policies_enablement_handler.h b/chromeos/ash/components/network/ephemeral_network_policies_enablement_handler.h new file mode 100644 index 0000000..50682fe4 --- /dev/null +++ b/chromeos/ash/components/network/ephemeral_network_policies_enablement_handler.h
@@ -0,0 +1,73 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_ASH_COMPONENTS_NETWORK_EPHEMERAL_NETWORK_POLICIES_ENABLEMENT_HANDLER_H_ +#define CHROMEOS_ASH_COMPONENTS_NETWORK_EPHEMERAL_NETWORK_POLICIES_ENABLEMENT_HANDLER_H_ + +#include <memory> + +#include "base/component_export.h" +#include "base/functional/callback.h" +#include "components/prefs/pref_member.h" + +class PrefService; + +namespace ash { + +// EphemeralNetworkPoliciesEnablementHandler watches and propagates enablement +// of the "ephemeral network policies" feature. +// The feature can be enabled in two ways: +// - ash::feature::kEphemeralNetworkPolicies is enabled through the +// experimentation framework (useful to enable the policies for the +// whole population) +// or +// - ash::feature::kEphemeralNetworkPoliciesEnabledPolicy is enabled (default) +// and the device policy DeviceEphemeralNetworkPoliciesEnabled is set to true +// (so individual customers can enable the policies) +// +// When any of these two is detected, EphemeralNetworkPoliciesEnablementHandler +// sets the enablement in ash::policy_util::SetEphemeralNetworkPoliciesEnabled +// and notifies its observer. +// +// ash::policy_util is used to propagate the value for easy access from all +// ash network handling layers. +class COMPONENT_EXPORT(CHROMEOS_NETWORK) + EphemeralNetworkPoliciesEnablementHandler { + public: + // `on_ephemeral_network_policies_enabled` will be called when ephemeral + // network policies become enabled. This will be called at most once. It will + // not be called after EphemeralNetworkPoliciesEnablementHandler has been + // destroyed. + EphemeralNetworkPoliciesEnablementHandler( + base::OnceClosure on_ephemeral_network_policies_enabled); + ~EphemeralNetworkPoliciesEnablementHandler(); + + EphemeralNetworkPoliciesEnablementHandler( + const EphemeralNetworkPoliciesEnablementHandler&) = delete; + EphemeralNetworkPoliciesEnablementHandler& operator=( + const EphemeralNetworkPoliciesEnablementHandler&) = delete; + + // `device_prefs` can be nullptr, e.g. when shutting down. + void SetDevicePrefs(PrefService* device_prefs); + + private: + // Called when a new DeviceEphemeralNetworkPoliciesEnabled policy value is + // available. + void EvaluatePolicyValue(); + + // Enables ephemeral network policies and notifies the observer. + // May only be called once. + void EnableEphemeralNetworkPolicies(); + + // To be called when ephemeral network policy support has been enabled. + base::OnceClosure on_ephemeral_network_policies_enabled_; + + // Watches the pref mirroring the DeviceEphemeralNetworkPoliciesEnabled + // policy. + std::unique_ptr<BooleanPrefMember> ephemeral_network_policies_enabled_pref_; +}; + +} // namespace ash + +#endif // CHROMEOS_ASH_COMPONENTS_NETWORK_EPHEMERAL_NETWORK_POLICIES_ENABLEMENT_HANDLER_H_
diff --git a/chromeos/ash/components/network/ephemeral_network_policies_enablement_handler_unittest.cc b/chromeos/ash/components/network/ephemeral_network_policies_enablement_handler_unittest.cc new file mode 100644 index 0000000..55e9949 --- /dev/null +++ b/chromeos/ash/components/network/ephemeral_network_policies_enablement_handler_unittest.cc
@@ -0,0 +1,170 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/ash/components/network/ephemeral_network_policies_enablement_handler.h" + +#include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" +#include "base/functional/bind.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/task_environment.h" +#include "base/values.h" +#include "chromeos/ash/components/network/policy_util.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash { + +class EphemeralNetworkPoliciesEnablementHandlerTest : public ::testing::Test { + public: + EphemeralNetworkPoliciesEnablementHandlerTest() { + policy_util::ResetEphemeralNetworkPoliciesEnabledForTesting(); + device_prefs_.registry()->RegisterBooleanPref( + prefs::kDeviceEphemeralNetworkPoliciesEnabled, false); + } + + protected: + std::unique_ptr<EphemeralNetworkPoliciesEnablementHandler> + CreateEphemeralNetworkPoliciesEnablementHandler() { + return std::make_unique<EphemeralNetworkPoliciesEnablementHandler>( + base::BindOnce(&EphemeralNetworkPoliciesEnablementHandlerTest:: + OnEphemeralNetworkPoliciesEnabled, + base::Unretained(this))); + } + + base::test::TaskEnvironment task_environment_; + + TestingPrefServiceSimple device_prefs_; + + bool ephemeral_network_policies_enabled_called_ = false; + + // Note that this can only ever be called once because it's bound using + // BindOnce, resulting in a OnceCallback. + void OnEphemeralNetworkPoliciesEnabled() { + ephemeral_network_policies_enabled_called_ = true; + } +}; + +TEST_F(EphemeralNetworkPoliciesEnablementHandlerTest, Disabled) { + auto handler = CreateEphemeralNetworkPoliciesEnablementHandler(); + + EXPECT_FALSE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + + handler->SetDevicePrefs(&device_prefs_); + + EXPECT_FALSE(ash::policy_util::AreEphemeralNetworkPoliciesEnabled()); + EXPECT_FALSE(ephemeral_network_policies_enabled_called_); + + handler->SetDevicePrefs(nullptr); +} + +TEST_F(EphemeralNetworkPoliciesEnablementHandlerTest, EnabledByFeature) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(features::kEphemeralNetworkPolicies); + + auto handler = CreateEphemeralNetworkPoliciesEnablementHandler(); + + EXPECT_TRUE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + EXPECT_TRUE(ephemeral_network_policies_enabled_called_); + + // Setting prefs doesn't change anything anymore. + handler->SetDevicePrefs(&device_prefs_); + + EXPECT_TRUE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + EXPECT_TRUE(ephemeral_network_policies_enabled_called_); + + handler->SetDevicePrefs(nullptr); +} + +TEST_F(EphemeralNetworkPoliciesEnablementHandlerTest, EnabledByPref_OnInit) { + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{features::kEphemeralNetworkPoliciesEnabledPolicy}, + /*disabled_features=*/{features::kEphemeralNetworkPolicies}); + + auto handler = CreateEphemeralNetworkPoliciesEnablementHandler(); + + EXPECT_FALSE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + EXPECT_FALSE(ephemeral_network_policies_enabled_called_); + + device_prefs_.SetManagedPref(prefs::kDeviceEphemeralNetworkPoliciesEnabled, + base::Value(true)); + + handler->SetDevicePrefs(&device_prefs_); + + EXPECT_TRUE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + EXPECT_TRUE(ephemeral_network_policies_enabled_called_); + + // Going back to false doesn't change the decision. + device_prefs_.SetManagedPref(prefs::kDeviceEphemeralNetworkPoliciesEnabled, + base::Value(false)); + + EXPECT_TRUE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + + handler->SetDevicePrefs(nullptr); +} + +TEST_F(EphemeralNetworkPoliciesEnablementHandlerTest, EnabledByPref_AfterInit) { + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{features::kEphemeralNetworkPoliciesEnabledPolicy}, + /*disabled_features=*/{features::kEphemeralNetworkPolicies}); + + auto handler = CreateEphemeralNetworkPoliciesEnablementHandler(); + + EXPECT_FALSE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + EXPECT_FALSE(ephemeral_network_policies_enabled_called_); + + handler->SetDevicePrefs(&device_prefs_); + + EXPECT_FALSE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + EXPECT_FALSE(ephemeral_network_policies_enabled_called_); + + device_prefs_.SetManagedPref(prefs::kDeviceEphemeralNetworkPoliciesEnabled, + base::Value(true)); + + EXPECT_TRUE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + EXPECT_TRUE(ephemeral_network_policies_enabled_called_); + + // Going back to false doesn't change the decision. + device_prefs_.SetManagedPref(prefs::kDeviceEphemeralNetworkPoliciesEnabled, + base::Value(false)); + + EXPECT_TRUE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + + handler->SetDevicePrefs(nullptr); +} + +TEST_F(EphemeralNetworkPoliciesEnablementHandlerTest, + EnabledByPref_NotRespected_KillSwitch) { + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{}, + /*disabled_features=*/{features::kEphemeralNetworkPolicies, + features::kEphemeralNetworkPoliciesEnabledPolicy}); + + auto handler = CreateEphemeralNetworkPoliciesEnablementHandler(); + + EXPECT_FALSE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + EXPECT_FALSE(ephemeral_network_policies_enabled_called_); + + device_prefs_.SetManagedPref(prefs::kDeviceEphemeralNetworkPoliciesEnabled, + base::Value(true)); + + handler->SetDevicePrefs(&device_prefs_); + + EXPECT_FALSE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + EXPECT_FALSE(ephemeral_network_policies_enabled_called_); + + // Going back to false doesn't change the decision. + device_prefs_.SetManagedPref(prefs::kDeviceEphemeralNetworkPoliciesEnabled, + base::Value(false)); + + EXPECT_FALSE(policy_util::AreEphemeralNetworkPoliciesEnabled()); + + handler->SetDevicePrefs(nullptr); +} + +} // namespace ash
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler.h b/chromeos/ash/components/network/managed_network_configuration_handler.h index 51fb8fec..7d6472e 100644 --- a/chromeos/ash/components/network/managed_network_configuration_handler.h +++ b/chromeos/ash/components/network/managed_network_configuration_handler.h
@@ -244,6 +244,13 @@ // Return true if the AllowOnlyPolicyNetworksToAutoconnect policy is enabled. virtual bool AllowOnlyPolicyNetworksToAutoconnect() const = 0; + // Return true if the RecommendedValuesAreEphemeral policy is enabled. + virtual bool RecommendedValuesAreEphemeral() const = 0; + + // Return true if the UserCreatedNetworkConfigurationsAreEphemeral policy is + // enabled. + virtual bool UserCreatedNetworkConfigurationsAreEphemeral() const = 0; + // Returns the value for the AllowTextMessages policy. virtual PolicyTextMessageSuppressionState GetAllowTextMessages() const = 0;
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc b/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc index d32d159..d360e77 100644 --- a/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc +++ b/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc
@@ -1033,6 +1033,22 @@ .value_or(false); } +bool ManagedNetworkConfigurationHandlerImpl::RecommendedValuesAreEphemeral() + const { + DCHECK(policy_util::AreEphemeralNetworkPoliciesEnabled()); + return FindGlobalPolicyBool( + ::onc::global_network_config::kRecommendedValuesAreEphemeral) + .value_or(false); +} + +bool ManagedNetworkConfigurationHandlerImpl:: + UserCreatedNetworkConfigurationsAreEphemeral() const { + DCHECK(policy_util::AreEphemeralNetworkPoliciesEnabled()); + return FindGlobalPolicyBool(::onc::global_network_config:: + kUserCreatedNetworkConfigurationsAreEphemeral) + .value_or(false); +} + std::vector<std::string> ManagedNetworkConfigurationHandlerImpl::GetBlockedHexSSIDs() const { const base::Value::List* blocked_value =
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler_impl.h b/chromeos/ash/components/network/managed_network_configuration_handler_impl.h index d6df6459..410d195 100644 --- a/chromeos/ash/components/network/managed_network_configuration_handler_impl.h +++ b/chromeos/ash/components/network/managed_network_configuration_handler_impl.h
@@ -153,6 +153,8 @@ bool AllowOnlyPolicyWiFiToConnect() const override; bool AllowOnlyPolicyWiFiToConnectIfAvailable() const override; bool AllowOnlyPolicyNetworksToAutoconnect() const override; + bool RecommendedValuesAreEphemeral() const override; + bool UserCreatedNetworkConfigurationsAreEphemeral() const override; std::vector<std::string> GetBlockedHexSSIDs() const override; // NetworkProfileObserver overrides
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc b/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc index c60fd5f..5a69c07 100644 --- a/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc +++ b/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc
@@ -38,6 +38,7 @@ #include "chromeos/ash/components/network/network_policy_observer.h" #include "chromeos/ash/components/network/network_profile_handler.h" #include "chromeos/ash/components/network/network_state.h" +#include "chromeos/ash/components/network/policy_util.h" #include "chromeos/ash/components/network/prohibited_technologies_handler.h" #include "chromeos/ash/components/network/proxy/ui_proxy_config_service.h" #include "chromeos/ash/components/network/technology_state_controller.h" @@ -1479,6 +1480,50 @@ EXPECT_TRUE(managed_handler()->GetBlockedHexSSIDs().empty()); } +TEST_F(ManagedNetworkConfigurationHandlerTest, + RecommendedValuesAreEphemeralAccessor) { + policy_util::SetEphemeralNetworkPoliciesEnabled(); + + EXPECT_FALSE(managed_handler()->RecommendedValuesAreEphemeral()); + + const char* const onc_policy = R"( + { + "GlobalNetworkConfiguration": { + "RecommendedValuesAreEphemeral": true + }, + "Type": "UnencryptedConfiguration" + })"; + EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_DEVICE_POLICY, std::string(), + base::test::ParseJsonDict(onc_policy))); + FastForwardProfileRefreshDelay(); + base::RunLoop().RunUntilIdle(); + + EXPECT_TRUE(managed_handler()->RecommendedValuesAreEphemeral()); +} + +TEST_F(ManagedNetworkConfigurationHandlerTest, + UserCreatedNetworkConfigurationsAreEphemeral) { + policy_util::SetEphemeralNetworkPoliciesEnabled(); + + EXPECT_FALSE( + managed_handler()->UserCreatedNetworkConfigurationsAreEphemeral()); + + const char* const onc_policy = R"( + { + "GlobalNetworkConfiguration": { + "UserCreatedNetworkConfigurationsAreEphemeral": true + }, + "Type": "UnencryptedConfiguration" + })"; + EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_DEVICE_POLICY, std::string(), + base::test::ParseJsonDict(onc_policy))); + FastForwardProfileRefreshDelay(); + base::RunLoop().RunUntilIdle(); + + EXPECT_TRUE( + managed_handler()->UserCreatedNetworkConfigurationsAreEphemeral()); +} + TEST_F(ManagedNetworkConfigurationHandlerTest, AllowCellularSimLock) { // Set 'AllowCellularSimLock' policy. EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_DEVICE_POLICY, std::string(),
diff --git a/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.cc b/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.cc index 98c1559..76f384a 100644 --- a/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.cc +++ b/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.cc
@@ -423,6 +423,14 @@ kPolicyAllowTextMessagesSuppressionStateHistogram, histogram_type); } +// static +void CellularNetworkMetricsLogger::CellularNetworkMetricsLogger:: + LogTextMessageNotificationSuppressionState( + NotificationSuppressionState state) { + base::UmaHistogramEnumeration(kAllowTextMessagesNotificationSuppressionState, + state); +} + void CellularNetworkMetricsLogger::OnConnectionResult( const std::string& guid, const absl::optional<std::string>& shill_error) {
diff --git a/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.h b/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.h index 90143642..1c7c5b53 100644 --- a/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.h +++ b/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.h
@@ -97,6 +97,15 @@ kMaxValue = kTextMessagesSuppress, }; + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + enum class NotificationSuppressionState { + kNotSuppressed = 0, + kUserSuppressed = 1, + kPolicySuppressed = 2, + kMaxValue = kPolicySuppressed, + }; + static constexpr char kCreateCustomApnResultHistogram[] = "Network.Ash.Cellular.Apn.CreateCustomApn.Result"; static constexpr char kCreateCustomApnAuthenticationTypeHistogram[] = @@ -225,6 +234,8 @@ "Network.Ash.Cellular.AllowTextMessages.User.SuppressionState"; static constexpr char kPolicyAllowTextMessagesSuppressionStateHistogram[] = "Network.Ash.Cellular.AllowTextMessages.Policy.SuppressionState"; + static constexpr char kAllowTextMessagesNotificationSuppressionState[] = + "Network.Ash.Cellular.AllowTextMessages.NotificationSuppressionState"; CellularNetworkMetricsLogger( NetworkStateHandler* network_state_handler, @@ -290,6 +301,9 @@ static void LogPolicyTextMessageSuppressionState( ash::PolicyTextMessageSuppressionState state); + static void LogTextMessageNotificationSuppressionState( + NotificationSuppressionState state); + private: // ConnectionInfoMetricsLogger::Observer: void OnConnectionResult(
diff --git a/chromeos/ash/components/network/mock_managed_network_configuration_handler.h b/chromeos/ash/components/network/mock_managed_network_configuration_handler.h index f941cc2..0ebbede 100644 --- a/chromeos/ash/components/network/mock_managed_network_configuration_handler.h +++ b/chromeos/ash/components/network/mock_managed_network_configuration_handler.h
@@ -109,6 +109,8 @@ MOCK_CONST_METHOD0(AllowOnlyPolicyWiFiToConnect, bool()); MOCK_CONST_METHOD0(AllowOnlyPolicyWiFiToConnectIfAvailable, bool()); MOCK_CONST_METHOD0(AllowOnlyPolicyNetworksToAutoconnect, bool()); + MOCK_CONST_METHOD0(RecommendedValuesAreEphemeral, bool()); + MOCK_CONST_METHOD0(UserCreatedNetworkConfigurationsAreEphemeral, bool()); MOCK_CONST_METHOD0(GetAllowTextMessages, PolicyTextMessageSuppressionState()); MOCK_CONST_METHOD0(GetBlockedHexSSIDs, std::vector<std::string>()); };
diff --git a/chromeos/ash/components/network/network_handler.cc b/chromeos/ash/components/network/network_handler.cc index 4498bf3..910c778 100644 --- a/chromeos/ash/components/network/network_handler.cc +++ b/chromeos/ash/components/network/network_handler.cc
@@ -18,6 +18,7 @@ #include "chromeos/ash/components/network/cellular_policy_handler.h" #include "chromeos/ash/components/network/client_cert_resolver.h" #include "chromeos/ash/components/network/enterprise_managed_metadata_store.h" +#include "chromeos/ash/components/network/ephemeral_network_policies_enablement_handler.h" #include "chromeos/ash/components/network/geolocation_handler.h" #include "chromeos/ash/components/network/hidden_network_handler.h" #include "chromeos/ash/components/network/hotspot_allowed_flag_handler.h" @@ -47,6 +48,7 @@ #include "chromeos/ash/components/network/network_sms_handler.h" #include "chromeos/ash/components/network/network_state_handler.h" #include "chromeos/ash/components/network/network_state_handler_observer.h" +#include "chromeos/ash/components/network/policy_util.h" #include "chromeos/ash/components/network/prohibited_technologies_handler.h" #include "chromeos/ash/components/network/proxy/ui_proxy_config_service.h" #include "chromeos/ash/components/network/stub_cellular_networks_provider.h" @@ -107,6 +109,20 @@ if (ash::features::IsCellularCarrierLockEnabled()) { network_3gpp_handler_.reset(new Network3gppHandler()); } + + // Only watch ephemeral network policies enablement if ephemeral network + // policies should be enabled by the feature or if the device policy to enable + // ephemeral network policies should be respected. + if (features::AreEphemeralNetworkPoliciesEnabled() || + features::CanEphemeralNetworkPoliciesBeEnabledByPolicy()) { + // base::Unretained is safe because + // `ephemeral_network_policies_enablement_handler_` is a member of + // NetworkHandler so it will be destroyed before `this`. + ephemeral_network_policies_enablement_handler_ = + std::make_unique<EphemeralNetworkPoliciesEnablementHandler>( + base::BindOnce(&NetworkHandler::OnEphemeralNetworkPoliciesEnabled, + base::Unretained(this))); + } } NetworkHandler::~NetworkHandler() { @@ -263,9 +279,16 @@ text_message_provider_->SetNetworkMetadataStore( network_metadata_store_.get()); } + if (ephemeral_network_policies_enablement_handler_) { + ephemeral_network_policies_enablement_handler_->SetDevicePrefs( + device_prefs); + } } void NetworkHandler::ShutdownPrefServices() { + if (ephemeral_network_policies_enablement_handler_) { + ephemeral_network_policies_enablement_handler_->SetDevicePrefs(nullptr); + } cellular_esim_profile_handler_->SetDevicePrefs(nullptr); managed_cellular_pref_handler_->SetDevicePrefs(nullptr); ui_proxy_config_service_.reset(); @@ -416,4 +439,9 @@ } } +void NetworkHandler::OnEphemeralNetworkPoliciesEnabled() { + // TODO(b/300880332): Instantiate EphemeralNetworkConfigurationHandler. + DCHECK(policy_util::AreEphemeralNetworkPoliciesEnabled()); +} + } // namespace ash
diff --git a/chromeos/ash/components/network/network_handler.h b/chromeos/ash/components/network/network_handler.h index 7aa66c4f..5250cec 100644 --- a/chromeos/ash/components/network/network_handler.h +++ b/chromeos/ash/components/network/network_handler.h
@@ -27,6 +27,7 @@ class ClientCertResolver; class ConnectionInfoMetricsLogger; class EnterpriseManagedMetadataStore; +class EphemeralNetworkPoliciesEnablementHandler; class ESimPolicyLoginMetricsLogger; class GeolocationHandler; class HiddenNetworkHandler; @@ -147,6 +148,9 @@ void Init(); + // Called when ephemeral network policies become enabled. + void OnEphemeralNetworkPoliciesEnabled(); + // The order of these determines the (inverse) destruction order. scoped_refptr<base::SingleThreadTaskRunner> task_runner_; const std::unique_ptr<NetworkStateHandler> network_state_handler_; @@ -197,6 +201,8 @@ std::unique_ptr<GeolocationHandler> geolocation_handler_; std::unique_ptr<UIProxyConfigService> ui_proxy_config_service_; std::unique_ptr<NetworkMetadataStore> network_metadata_store_; + std::unique_ptr<EphemeralNetworkPoliciesEnablementHandler> + ephemeral_network_policies_enablement_handler_; // True when the device is managed by policy. bool is_enterprise_managed_ = false;
diff --git a/chromeos/ash/components/network/network_handler_test_helper.cc b/chromeos/ash/components/network/network_handler_test_helper.cc index a988b39..8e9ad7d 100644 --- a/chromeos/ash/components/network/network_handler_test_helper.cc +++ b/chromeos/ash/components/network/network_handler_test_helper.cc
@@ -4,12 +4,14 @@ #include "chromeos/ash/components/network/network_handler_test_helper.h" +#include "ash/constants/ash_pref_names.h" #include "chromeos/ash/components/network/cellular_esim_profile_handler_impl.h" #include "chromeos/ash/components/network/managed_cellular_pref_handler.h" #include "chromeos/ash/components/network/network_handler.h" #include "chromeos/ash/components/network/network_metadata_store.h" #include "chromeos/ash/components/network/network_test_helper_base.h" #include "components/onc/onc_pref_names.h" +#include "components/prefs/pref_registry_simple.h" namespace ash { @@ -37,6 +39,8 @@ NetworkMetadataStore::RegisterPrefs(user_registry); ::onc::RegisterProfilePrefs(user_registry); } + device_registry->RegisterBooleanPref( + prefs::kDeviceEphemeralNetworkPoliciesEnabled, false); } void NetworkHandlerTestHelper::InitializePrefs(PrefService* user_prefs,
diff --git a/chromeos/ash/components/network/policy_util.cc b/chromeos/ash/components/network/policy_util.cc index fc04f78..dfcd02a 100644 --- a/chromeos/ash/components/network/policy_util.cc +++ b/chromeos/ash/components/network/policy_util.cc
@@ -37,6 +37,10 @@ namespace { +// When this is true, ephemeral network policies have been enabled by device +// policy. +bool g_ephemeral_network_policies_enabled_by_policy = false; + std::string GetString(const base::Value::Dict& dict, const char* key) { const std::string* value = dict.FindString(key); return value ? *value : std::string(); @@ -573,4 +577,16 @@ return absl::nullopt; } +void SetEphemeralNetworkPoliciesEnabled() { + g_ephemeral_network_policies_enabled_by_policy = true; +} + +void ResetEphemeralNetworkPoliciesEnabledForTesting() { + g_ephemeral_network_policies_enabled_by_policy = false; +} + +bool AreEphemeralNetworkPoliciesEnabled() { + return g_ephemeral_network_policies_enabled_by_policy; +} + } // namespace ash::policy_util
diff --git a/chromeos/ash/components/network/policy_util.h b/chromeos/ash/components/network/policy_util.h index f34c317a..c1c430b 100644 --- a/chromeos/ash/components/network/policy_util.h +++ b/chromeos/ash/components/network/policy_util.h
@@ -118,6 +118,23 @@ absl::optional<SmdxActivationCode> GetSmdxActivationCodeFromONC( const base::Value::Dict& onc_config); +// When this is called, `AreEphemeralNetworkPoliciesEnabled()` will return true +// until the process is restarted (or +// ResetEphemeralNetworkPoliciesEnabledForTesting is called). +COMPONENT_EXPORT(CHROMEOS_NETWORK) +void SetEphemeralNetworkPoliciesEnabled(); + +// Resets the effect of SetEphemeralNetworkPoliciesEnabled. +// This is for unittests only - supporting this properly in production code +// would be difficult (e.g. no DCHECKs that the feature is enabled in posted +// tasks). +COMPONENT_EXPORT(CHROMEOS_NETWORK) +void ResetEphemeralNetworkPoliciesEnabledForTesting(); + +// Returns true if ephemeral network policies are enabled. +COMPONENT_EXPORT(CHROMEOS_NETWORK) +bool AreEphemeralNetworkPoliciesEnabled(); + } // namespace policy_util } // namespace ash
diff --git a/chromeos/ash/components/network/text_message_provider.cc b/chromeos/ash/components/network/text_message_provider.cc index d3e1552..a174fd6 100644 --- a/chromeos/ash/components/network/text_message_provider.cc +++ b/chromeos/ash/components/network/text_message_provider.cc
@@ -40,7 +40,7 @@ NET_LOG(EVENT) << "Allowing text message from network with guid: " << guid; for (auto& observer : observers_) { - observer.MessageReceived(message_data); + observer.MessageReceived(guid, message_data); } } @@ -58,14 +58,44 @@ } } +void TextMessageProvider::LogTextMessageNotificationMetrics( + const std::string& guid) { + auto notification_suppression_state = CellularNetworkMetricsLogger:: + NotificationSuppressionState::kNotSuppressed; + + // Policy suppression state takes precedence over user set suppression state. + if (IsAllowTextMessagesPolicySet()) { + if (*policy_suppression_state_ == + PolicyTextMessageSuppressionState::kSuppress) { + notification_suppression_state = CellularNetworkMetricsLogger:: + NotificationSuppressionState::kPolicySuppressed; + } + } else if (IsMessageSuppressedByUser(guid)) { + notification_suppression_state = CellularNetworkMetricsLogger:: + NotificationSuppressionState::kUserSuppressed; + } + + CellularNetworkMetricsLogger::LogTextMessageNotificationSuppressionState( + notification_suppression_state); +} + +bool TextMessageProvider::IsAllowTextMessagesPolicySet() { + return policy_suppression_state_.has_value() && + *policy_suppression_state_ != + PolicyTextMessageSuppressionState::kUnset; +} + +bool TextMessageProvider::IsMessageSuppressedByUser(const std::string& guid) { + return network_metadata_store_->GetUserTextMessageSuppressionState(guid) == + UserTextMessageSuppressionState::kSuppress; +} + bool TextMessageProvider::ShouldAllowTextMessages(const std::string& guid) { - if (policy_suppression_state_.has_value() && - *policy_suppression_state_ != PolicyTextMessageSuppressionState::kUnset) { + if (IsAllowTextMessagesPolicySet()) { return *policy_suppression_state_ == PolicyTextMessageSuppressionState::kAllow; } - return network_metadata_store_->GetUserTextMessageSuppressionState(guid) == - UserTextMessageSuppressionState::kAllow; + return !IsMessageSuppressedByUser(guid); } void TextMessageProvider::AddObserver(Observer* observer) {
diff --git a/chromeos/ash/components/network/text_message_provider.h b/chromeos/ash/components/network/text_message_provider.h index 4d141de..a8735214 100644 --- a/chromeos/ash/components/network/text_message_provider.h +++ b/chromeos/ash/components/network/text_message_provider.h
@@ -26,7 +26,8 @@ ~Observer() override = default; // Called when a new message arrives. - virtual void MessageReceived(const TextMessageData& message_data) {} + virtual void MessageReceived(const std::string& guid, + const TextMessageData& message_data) {} }; TextMessageProvider(); @@ -49,10 +50,16 @@ managed_network_configuration_handler); void SetNetworkMetadataStore(NetworkMetadataStore* network_metadata_store); + // Logs the success metrics for the AllowTextMessage feature. Called after a + // notification is received. + void LogTextMessageNotificationMetrics(const std::string& guid); + private: friend class TextMessageProviderTest; bool ShouldAllowTextMessages(const std::string& guid); + bool IsAllowTextMessagesPolicySet(); + bool IsMessageSuppressedByUser(const std::string& guid); absl::optional<PolicyTextMessageSuppressionState> policy_suppression_state_;
diff --git a/chromeos/ash/components/network/text_message_provider_unittest.cc b/chromeos/ash/components/network/text_message_provider_unittest.cc index 39ced1a..4b4965e 100644 --- a/chromeos/ash/components/network/text_message_provider_unittest.cc +++ b/chromeos/ash/components/network/text_message_provider_unittest.cc
@@ -38,7 +38,8 @@ TestObserver() = default; ~TestObserver() override = default; - void MessageReceived(const TextMessageData& message_data) override { + void MessageReceived(const std::string& guid, + const TextMessageData& message_data) override { text_messages_.emplace_back(message_data.number, message_data.text, message_data.timestamp); }
diff --git a/chromeos/components/onc/onc_signature.cc b/chromeos/components/onc/onc_signature.cc index d85e2fa..f7cb620c 100644 --- a/chromeos/components/onc/onc_signature.cc +++ b/chromeos/components/onc/onc_signature.cc
@@ -414,6 +414,11 @@ &kStringListSignature}, {::onc::global_network_config::kBlockedHexSSIDs, &kStringListSignature}, {::onc::global_network_config::kDisableNetworkTypes, &kStringListSignature}, + {::onc::global_network_config::kRecommendedValuesAreEphemeral, + &kBoolSignature}, + {::onc::global_network_config:: + kUserCreatedNetworkConfigurationsAreEphemeral, + &kBoolSignature}, {nullptr}}; const OncFieldSignature certificate_fields[] = {
diff --git a/chromeos/components/onc/onc_validator.cc b/chromeos/components/onc/onc_validator.cc index 87fc92f..c722a7a 100644 --- a/chromeos/components/onc/onc_validator.cc +++ b/chromeos/components/onc/onc_validator.cc
@@ -8,6 +8,7 @@ #include <stdint.h> #include <algorithm> +#include <string_view> #include <utility> #include "base/containers/contains.h" @@ -375,7 +376,7 @@ } // namespace bool Validator::IsInDevicePolicy(base::Value::Dict* result, - const std::string& field_name) { + std::string_view field_name) { if (result->contains(field_name)) { if (onc_source_ != ::onc::ONC_SOURCE_DEVICE_POLICY) { std::ostringstream msg; @@ -1081,29 +1082,23 @@ } } - // Validate that kAllowTextMessages, kAllowCellularSimLock, - // kAllowCellularHotspot, kDisableNetworkTypes, kAllowOnlyPolicyWiFiToConnect, - // kAllowOnlyPolicyCellularNetworks and kBlockedHexSSIDs are only allowed in - // device policy. - if (!IsInDevicePolicy(result, - ::onc ::global_network_config::kAllowTextMessages) || - !IsInDevicePolicy(result, - ::onc ::global_network_config::kAllowCellularSimLock) || - !IsInDevicePolicy(result, - ::onc ::global_network_config::kAllowCellularHotspot) || - !IsInDevicePolicy(result, - ::onc::global_network_config::kDisableNetworkTypes) || - !IsInDevicePolicy( - result, - ::onc::global_network_config::kAllowOnlyPolicyCellularNetworks) || - !IsInDevicePolicy( - result, - ::onc::global_network_config::kAllowOnlyPolicyWiFiToConnect) || - !IsInDevicePolicy(result, ::onc::global_network_config:: - kAllowOnlyPolicyWiFiToConnectIfAvailable) || - !IsInDevicePolicy(result, - ::onc::global_network_config::kBlockedHexSSIDs)) { - return false; + // Validate that these are only allowed in device policy. + const std::string_view kDevicePolicyOnlyKeys[] = { + ::onc::global_network_config::kAllowTextMessages, + ::onc::global_network_config::kAllowCellularSimLock, + ::onc::global_network_config::kAllowCellularHotspot, + ::onc::global_network_config::kDisableNetworkTypes, + ::onc::global_network_config::kAllowOnlyPolicyCellularNetworks, + ::onc::global_network_config::kAllowOnlyPolicyWiFiToConnect, + ::onc::global_network_config::kAllowOnlyPolicyWiFiToConnectIfAvailable, + ::onc::global_network_config::kBlockedHexSSIDs, + ::onc::global_network_config::kRecommendedValuesAreEphemeral, + ::onc::global_network_config:: + kUserCreatedNetworkConfigurationsAreEphemeral}; + for (std::string_view key : kDevicePolicyOnlyKeys) { + if (!IsInDevicePolicy(result, key)) { + return false; + } } // Ensure the list contains only legitimate network type identifiers.
diff --git a/chromeos/components/onc/onc_validator.h b/chromeos/components/onc/onc_validator.h index c2af0b3..06a38f03 100644 --- a/chromeos/components/onc/onc_validator.h +++ b/chromeos/components/onc/onc_validator.h
@@ -8,6 +8,7 @@ #include <memory> #include <set> #include <string> +#include <string_view> #include <vector> #include "base/component_export.h" @@ -218,8 +219,7 @@ bool IsValidValue(const std::string& field_value, const std::vector<const char*>& valid_values); - bool IsInDevicePolicy(base::Value::Dict* result, - const std::string& field_name); + bool IsInDevicePolicy(base::Value::Dict* result, std::string_view field_name); bool FieldExistsAndHasNoValidValue( const base::Value::Dict& object,
diff --git a/chromeos/components/onc/onc_validator_unittest.cc b/chromeos/components/onc/onc_validator_unittest.cc index 2c42c4b..c620ad1e 100644 --- a/chromeos/components/onc/onc_validator_unittest.cc +++ b/chromeos/components/onc/onc_validator_unittest.cc
@@ -194,6 +194,17 @@ &kToplevelConfigurationSignature, true, ::onc::ONC_SOURCE_DEVICE_POLICY), + // RecommendedValuesAreEphemeral is only allowed for device policies. + OncParams("managed_toplevel_with_recommended_values_ephemeral.onc", + &kToplevelConfigurationSignature, + true, + ::onc::ONC_SOURCE_DEVICE_POLICY), + // UserCreatedNetworkConfigurationsAreEphemeral is only allowed for + // device policies. + OncParams("managed_toplevel_with_user_created_configs_ephemeral.onc", + &kToplevelConfigurationSignature, + true, + ::onc::ONC_SOURCE_DEVICE_POLICY), OncParams("managed_toplevel_l2tpipsec.onc", &kToplevelConfigurationSignature, true),
diff --git a/chromeos/components/test/data/onc/managed_toplevel_with_recommended_values_ephemeral.onc b/chromeos/components/test/data/onc/managed_toplevel_with_recommended_values_ephemeral.onc new file mode 100644 index 0000000..3dc62eba --- /dev/null +++ b/chromeos/components/test/data/onc/managed_toplevel_with_recommended_values_ephemeral.onc
@@ -0,0 +1,15 @@ +{ + "GlobalNetworkConfiguration":{ + "RecommendedValuesAreEphemeral": true, + }, + "NetworkConfigurations":[ + { + "Ethernet":{ + "Authentication":"None" + }, + "GUID":"guid", + "Name":"name", + "Type":"Ethernet" + } + ] +}
diff --git a/chromeos/components/test/data/onc/managed_toplevel_with_user_created_configs_ephemeral.onc b/chromeos/components/test/data/onc/managed_toplevel_with_user_created_configs_ephemeral.onc new file mode 100644 index 0000000..345f1a769 --- /dev/null +++ b/chromeos/components/test/data/onc/managed_toplevel_with_user_created_configs_ephemeral.onc
@@ -0,0 +1,15 @@ +{ + "GlobalNetworkConfiguration":{ + "UserCreatedNetworkConfigurationsAreEphemeral": true, + }, + "NetworkConfigurations":[ + { + "Ethernet":{ + "Authentication":"None" + }, + "GUID":"guid", + "Name":"name", + "Type":"Ethernet" + } + ] +}
diff --git a/clank b/clank index e775e49..f41631d 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit e775e4966d9fa7e59540a94a7d87e2905a54b787 +Subproject commit f41631da115900d689ade4e0722174e5e5644d7e
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.cc b/components/autofill/core/browser/autofill_suggestion_generator.cc index 80168110..adfa8b3 100644 --- a/components/autofill/core/browser/autofill_suggestion_generator.cc +++ b/components/autofill/core/browser/autofill_suggestion_generator.cc
@@ -7,6 +7,7 @@ #include <string> #include "base/containers/contains.h" +#include "base/containers/cxx20_erase_vector.h" #include "base/feature_list.h" #include "base/notreached.h" #include "base/ranges/algorithm.h" @@ -272,7 +273,7 @@ // Duplicates across sources are resolved in favour of `kAccount` profiles. std::vector<const AutofillProfile*> unique_matched_profiles = suggestion_selection::DeduplicatedProfilesForSuggestions( - type, field_types, comparator, matched_profiles); + matched_profiles, type, field_types, comparator); return unique_matched_profiles; } @@ -546,8 +547,9 @@ if (suppress_disused_cards) { const base::Time min_last_used = AutofillClock::Now() - kDisusedDataModelTimeDelta; - AutofillSuggestionGenerator::RemoveExpiredCreditCardsNotUsedSinceTimestamp( - AutofillClock::Now(), min_last_used, &available_cards); + AutofillSuggestionGenerator:: + RemoveExpiredLocalCreditCardsNotUsedSinceTimestamp(min_last_used, + available_cards); } std::vector<CreditCard> cards_to_suggest; @@ -639,28 +641,20 @@ } // static -void AutofillSuggestionGenerator::RemoveExpiredCreditCardsNotUsedSinceTimestamp( - base::Time comparison_time, - base::Time min_last_used, - std::vector<CreditCard*>* cards) { - const size_t original_size = cards->size(); - // Split the vector into two groups - // 1. All server cards, unexpired local cards, or local cards that have been - // used after |min_last_used|; - // 2. Expired local cards that have not been used since |min_last_used|; - // then delete the latter. - cards->erase(std::stable_partition( - cards->begin(), cards->end(), - [comparison_time, min_last_used](const CreditCard* c) { - return !c->IsExpired(comparison_time) || - c->use_date() >= min_last_used || - c->record_type() != - CreditCard::RecordType::kLocalCard; - }), - cards->end()); - const size_t num_cards_supressed = original_size - cards->size(); +void AutofillSuggestionGenerator:: + RemoveExpiredLocalCreditCardsNotUsedSinceTimestamp( + base::Time min_last_used, + std::vector<CreditCard*>& cards) { + const size_t original_size = cards.size(); + base::EraseIf(cards, [comparison_time = AutofillClock::Now(), + min_last_used](const CreditCard* card) { + return card->IsExpired(comparison_time) && + card->use_date() < min_last_used && + card->record_type() == CreditCard::RecordType::kLocalCard; + }); + const size_t num_cards_suppressed = original_size - cards.size(); AutofillMetrics::LogNumberOfCreditCardsSuppressedForDisuse( - num_cards_supressed); + num_cards_suppressed); } std::u16string AutofillSuggestionGenerator::GetDisplayNicknameForCreditCard(
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.h b/components/autofill/core/browser/autofill_suggestion_generator.h index ad5991e..1d00f44 100644 --- a/components/autofill/core/browser/autofill_suggestion_generator.h +++ b/components/autofill/core/browser/autofill_suggestion_generator.h
@@ -129,13 +129,11 @@ static std::vector<Suggestion> GetPromoCodeSuggestionsFromPromoCodeOffers( const std::vector<const AutofillOfferData*>& promo_code_offers); - // Remove credit cards that are expired at |comparison_time| and not used - // since |min_last_used| from |cards|. The relative ordering of |cards| is - // maintained. - static void RemoveExpiredCreditCardsNotUsedSinceTimestamp( - base::Time comparison_time, + // Removes expired local credit cards not used since `min_last_used` from + // `cards`. The relative ordering of `cards` is maintained. + static void RemoveExpiredLocalCreditCardsNotUsedSinceTimestamp( base::Time min_last_used, - std::vector<CreditCard*>* cards); + std::vector<CreditCard*>& cards); // Return a nickname for the |card| to display. This is generally the nickname // stored in |card|, unless |card| exists as a local and a server copy. In
diff --git a/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc b/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc index 3f3bf4067..4ff898ec 100644 --- a/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc +++ b/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc
@@ -1405,8 +1405,9 @@ // Filter the cards while capturing histograms. base::HistogramTester histogram_tester; - AutofillSuggestionGenerator::RemoveExpiredCreditCardsNotUsedSinceTimestamp( - kNow, kNow - base::Days(175), &cards); + AutofillSuggestionGenerator:: + RemoveExpiredLocalCreditCardsNotUsedSinceTimestamp( + kNow - base::Days(175), cards); // Validate that we get the expected filtered cards and histograms. EXPECT_EQ(expected_cards, cards); @@ -1427,8 +1428,9 @@ // Filter the cards while capturing histograms. base::HistogramTester histogram_tester; - AutofillSuggestionGenerator::RemoveExpiredCreditCardsNotUsedSinceTimestamp( - kNow, kNow - base::Days(115), &cards); + AutofillSuggestionGenerator:: + RemoveExpiredLocalCreditCardsNotUsedSinceTimestamp( + kNow - base::Days(115), cards); // Validate that we get the expected filtered cards and histograms. EXPECT_EQ(expected_cards, cards); @@ -1452,8 +1454,8 @@ // Filter the cards while capturing histograms. base::HistogramTester histogram_tester; - AutofillSuggestionGenerator::RemoveExpiredCreditCardsNotUsedSinceTimestamp( - kNow, k115DaysAgo, &cards); + AutofillSuggestionGenerator:: + RemoveExpiredLocalCreditCardsNotUsedSinceTimestamp(k115DaysAgo, cards); // Validate that we have the right cards. Iterate of the the shuffled // primary copy and the filtered copy at the same time. making sure that @@ -1489,8 +1491,9 @@ // Filter the cards while capturing histograms. base::HistogramTester histogram_tester; - AutofillSuggestionGenerator::RemoveExpiredCreditCardsNotUsedSinceTimestamp( - kNow, kNow - base::Days(720), &cards); + AutofillSuggestionGenerator:: + RemoveExpiredLocalCreditCardsNotUsedSinceTimestamp( + kNow - base::Days(720), cards); // Validate that we get the expected filtered cards and histograms. EXPECT_EQ(all_card_ptrs, cards); @@ -1508,8 +1511,9 @@ // Filter the cards while capturing histograms. base::HistogramTester histogram_tester; - AutofillSuggestionGenerator::RemoveExpiredCreditCardsNotUsedSinceTimestamp( - kNow, kNow + base::Days(1), &cards); + AutofillSuggestionGenerator:: + RemoveExpiredLocalCreditCardsNotUsedSinceTimestamp(kNow + base::Days(1), + cards); // Validate that we get the expected filtered cards and histograms. EXPECT_TRUE(cards.empty()); @@ -1529,8 +1533,9 @@ // Filter the cards while capturing histograms. base::HistogramTester histogram_tester; - AutofillSuggestionGenerator::RemoveExpiredCreditCardsNotUsedSinceTimestamp( - kNow, kNow + base::Days(1), &cards); + AutofillSuggestionGenerator:: + RemoveExpiredLocalCreditCardsNotUsedSinceTimestamp(kNow + base::Days(1), + cards); // Validate that we get the expected filtered cards and histograms. EXPECT_EQ(1U, cards.size());
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager.cc b/components/autofill/core/browser/payments/credit_card_access_manager.cc index 8c556a84..d6ec875 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager.cc +++ b/components/autofill/core/browser/payments/credit_card_access_manager.cc
@@ -1113,6 +1113,10 @@ virtual_card_unmask_request_details_ .last_committed_primary_main_frame_origin = last_committed_primary_main_frame_origin; + if (!client_->IsOffTheRecord()) { + virtual_card_unmask_request_details_.merchant_domain_for_footprints = + client_->GetLastCommittedPrimaryMainFrameOrigin(); + } virtual_card_unmask_request_details_.card = *card_; if (ShouldShowCardMetadata(*card_)) { virtual_card_unmask_request_details_.client_behavior_signals.push_back(
diff --git a/components/autofill/core/browser/payments/credit_card_cvc_authenticator.cc b/components/autofill/core/browser/payments/credit_card_cvc_authenticator.cc index dc2da3f..75ce67bb 100644 --- a/components/autofill/core/browser/payments/credit_card_cvc_authenticator.cc +++ b/components/autofill/core/browser/payments/credit_card_cvc_authenticator.cc
@@ -70,12 +70,14 @@ *card, AutofillClient::UnmaskCardReason::kAutofill, weak_ptr_factory_.GetWeakPtr(), weak_ptr_factory_.GetWeakPtr(), last_committed_primary_main_frame_origin, *vcn_context_token, - *selected_challenge_option); + *selected_challenge_option, + client_->GetLastCommittedPrimaryMainFrameOrigin()); } full_card_request_->GetFullCard( *card, AutofillClient::UnmaskCardReason::kAutofill, - weak_ptr_factory_.GetWeakPtr(), weak_ptr_factory_.GetWeakPtr()); + weak_ptr_factory_.GetWeakPtr(), weak_ptr_factory_.GetWeakPtr(), + client_->GetLastCommittedPrimaryMainFrameOrigin()); } void CreditCardCvcAuthenticator::OnFullCardRequestSucceeded(
diff --git a/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc b/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc index 3fa8090..7f98d22 100644 --- a/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc +++ b/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc
@@ -776,6 +776,7 @@ full_card_request_->GetFullCardViaFIDO( *card_, AutofillClient::UnmaskCardReason::kAutofill, weak_ptr_factory_.GetWeakPtr(), std::move(response), + autofill_client_->GetLastCommittedPrimaryMainFrameOrigin(), last_committed_primary_main_frame_origin, context_token_); // Return here to skip the OptChange call. return;
diff --git a/components/autofill/core/browser/payments/credit_card_otp_authenticator.cc b/components/autofill/core/browser/payments/credit_card_otp_authenticator.cc index cc5dc0c..ea3a201 100644 --- a/components/autofill/core/browser/payments/credit_card_otp_authenticator.cc +++ b/components/autofill/core/browser/payments/credit_card_otp_authenticator.cc
@@ -48,6 +48,10 @@ unmask_request_->last_committed_primary_main_frame_origin = last_committed_primary_main_frame_origin; } + if (!autofill_client_->IsOffTheRecord()) { + unmask_request_->merchant_domain_for_footprints = + autofill_client_->GetLastCommittedPrimaryMainFrameOrigin(); + } // Populating risk data and showing OTP dialog may occur asynchronously. // If |risk_data_| has already been loaded, send the unmask card request.
diff --git a/components/autofill/core/browser/payments/full_card_request.cc b/components/autofill/core/browser/payments/full_card_request.cc index e73e2d2..c5fbc721 100644 --- a/components/autofill/core/browser/payments/full_card_request.cc +++ b/components/autofill/core/browser/payments/full_card_request.cc
@@ -6,6 +6,7 @@ #include <memory> +#include "base/check_deref.h" #include "base/check_op.h" #include "base/functional/bind.h" #include "base/notreached.h" @@ -22,36 +23,39 @@ #include "components/autofill/core/common/autofill_clock.h" #include "components/autofill/core/common/autofill_payments_features.h" #include "components/autofill/core/common/autofill_tick_clock.h" +#include "url/origin.h" namespace autofill { namespace payments { -FullCardRequest::FullCardRequest(RiskDataLoader* risk_data_loader, +FullCardRequest::FullCardRequest(AutofillClient* autofill_client, payments::PaymentsClient* payments_client, PersonalDataManager* personal_data_manager) - : risk_data_loader_(risk_data_loader), + : autofill_client_(CHECK_DEREF(autofill_client)), payments_client_(payments_client), personal_data_manager_(personal_data_manager), result_delegate_(nullptr), ui_delegate_(nullptr), should_unmask_card_(false) { - DCHECK(risk_data_loader_); DCHECK(payments_client_); DCHECK(personal_data_manager_); } FullCardRequest::~FullCardRequest() = default; -void FullCardRequest::GetFullCard(const CreditCard& card, - AutofillClient::UnmaskCardReason reason, - base::WeakPtr<ResultDelegate> result_delegate, - base::WeakPtr<UIDelegate> ui_delegate) { +void FullCardRequest::GetFullCard( + const CreditCard& card, + AutofillClient::UnmaskCardReason reason, + base::WeakPtr<ResultDelegate> result_delegate, + base::WeakPtr<UIDelegate> ui_delegate, + const url::Origin& merchant_domain_for_footprints) { DCHECK(ui_delegate); GetFullCardImpl(card, reason, result_delegate, ui_delegate, /*fido_assertion_info=*/absl::nullopt, /*last_committed_primary_main_frame_origin=*/absl::nullopt, /*context_token=*/absl::nullopt, - /*selected_challenge_option=*/absl::nullopt); + /*selected_challenge_option=*/absl::nullopt, + merchant_domain_for_footprints); } void FullCardRequest::GetFullVirtualCardViaCVC( @@ -61,7 +65,8 @@ base::WeakPtr<UIDelegate> ui_delegate, const GURL& last_committed_primary_main_frame_origin, const std::string& vcn_context_token, - const CardUnmaskChallengeOption& selected_challenge_option) { + const CardUnmaskChallengeOption& selected_challenge_option, + const url::Origin& merchant_domain_for_footprints) { DCHECK(ui_delegate); DCHECK(last_committed_primary_main_frame_origin.is_valid()); DCHECK(!vcn_context_token.empty()); @@ -69,7 +74,7 @@ GetFullCardImpl(card, reason, result_delegate, ui_delegate, /*fido_assertion_info=*/absl::nullopt, last_committed_primary_main_frame_origin, vcn_context_token, - selected_challenge_option); + selected_challenge_option, merchant_domain_for_footprints); } void FullCardRequest::GetFullCardViaFIDO( @@ -77,12 +82,14 @@ AutofillClient::UnmaskCardReason reason, base::WeakPtr<ResultDelegate> result_delegate, base::Value::Dict fido_assertion_info, + const url::Origin& merchant_domain_for_footprints, absl::optional<GURL> last_committed_primary_main_frame_origin, absl::optional<std::string> context_token) { GetFullCardImpl( card, reason, result_delegate, nullptr, std::move(fido_assertion_info), std::move(last_committed_primary_main_frame_origin), - std::move(context_token), /*selected_challenge_option=*/absl::nullopt); + std::move(context_token), /*selected_challenge_option=*/absl::nullopt, + merchant_domain_for_footprints); } void FullCardRequest::GetFullCardImpl( @@ -93,7 +100,8 @@ absl::optional<base::Value::Dict> fido_assertion_info, absl::optional<GURL> last_committed_primary_main_frame_origin, absl::optional<std::string> context_token, - absl::optional<CardUnmaskChallengeOption> selected_challenge_option) { + absl::optional<CardUnmaskChallengeOption> selected_challenge_option, + const url::Origin& merchant_domain_for_footprints) { // Retrieval of card information should happen via CVC auth or FIDO, but not // both. Use |ui_delegate|'s existence as evidence of doing CVC auth and // |fido_assertion_info| as evidence of doing FIDO auth. @@ -137,6 +145,9 @@ request_->card = card; request_->last_committed_primary_main_frame_origin = last_committed_primary_main_frame_origin; + if (!autofill_client_->IsOffTheRecord()) { + request_->merchant_domain_for_footprints = merchant_domain_for_footprints; + } if (context_token) request_->context_token = *context_token; if (selected_challenge_option) @@ -169,7 +180,7 @@ } if (should_unmask_card_) { - risk_data_loader_->LoadRiskData( + autofill_client_->LoadRiskData( base::BindOnce(&FullCardRequest::OnDidGetUnmaskRiskData, weak_ptr_factory_.GetWeakPtr())); }
diff --git a/components/autofill/core/browser/payments/full_card_request.h b/components/autofill/core/browser/payments/full_card_request.h index 8e4e6b8..c79a617 100644 --- a/components/autofill/core/browser/payments/full_card_request.h +++ b/components/autofill/core/browser/payments/full_card_request.h
@@ -9,6 +9,7 @@ #include <string> #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "build/build_config.h" @@ -16,6 +17,7 @@ #include "components/autofill/core/browser/payments/card_unmask_delegate.h" #include "components/autofill/core/browser/payments/payments_client.h" #include "components/autofill/core/browser/ui/payments/card_unmask_prompt_options.h" +#include "url/origin.h" namespace autofill { @@ -105,7 +107,7 @@ }; // The parameters should outlive the FullCardRequest. - FullCardRequest(RiskDataLoader* risk_data_loader, + FullCardRequest(AutofillClient* autofill_client, payments::PaymentsClient* payments_client, PersonalDataManager* personal_data_manager); @@ -125,7 +127,8 @@ void GetFullCard(const CreditCard& card, AutofillClient::UnmaskCardReason reason, base::WeakPtr<ResultDelegate> result_delegate, - base::WeakPtr<UIDelegate> ui_delegate); + base::WeakPtr<UIDelegate> ui_delegate, + const url::Origin& merchant_domain_for_footprints); // Refer to the comment above `GetFullCard()` for the high level overview of // how this function works. The additional fields in this function are @@ -138,16 +141,20 @@ base::WeakPtr<UIDelegate> ui_delegate, const GURL& last_committed_primary_main_frame_origin, const std::string& vcn_context_token, - const CardUnmaskChallengeOption& selected_challenge_option); + const CardUnmaskChallengeOption& selected_challenge_option, + const url::Origin& merchant_domain_for_footprints); - // Retrieves the pan for |card| through a FIDO assertion and invokes + // Retrieves the pan for `card` through a FIDO assertion and invokes // Delegate::OnFullCardRequestSucceeded() or // Delegate::OnFullCardRequestFailed(). Only one request should be active at a - // time. |last_committed_primary_main_frame_origin| is the full origin of the - // primary main frame where the card retrieval happens. |context_token| is - // used for providing context of the request to the server to link related - // requests. |last_committed_primary_main_frame_origin| and |context_token| - // are populated if the full card request is for a virtual card. + // time. `merchant_domain_for_footprints` is the full origin of the primary + // frame where the unmasking happened this is used for personalization if the + // user is not in incognito mode. `last_committed_primary_main_frame_origin` + // is the full origin of the primary main frame where the card retrieval + // happens. `context_token` is used for providing context of the request to + // the server to link related requests. + // `last_committed_primary_main_frame_origin` and `context_token` are + // populated if the full card request is for a virtual card. // // If the card is local, has a non-empty GUID, and the user has updated its // expiration date, then this function will write the new information to @@ -157,6 +164,7 @@ AutofillClient::UnmaskCardReason reason, base::WeakPtr<ResultDelegate> result_delegate, base::Value::Dict fido_assertion_info, + const url::Origin& merchant_domain_for_footprints, absl::optional<GURL> last_committed_primary_main_frame_origin = absl::nullopt, absl::optional<std::string> context_token = absl::nullopt); @@ -204,6 +212,9 @@ // authentication methods. `last_committed_primary_main_frame_origin`, // `context_token`, and `selected_challenge_option` need to be specified if // the full card request is for a virtual card. + // `merchant_domain_for_footprints` is the full origin of the primary main + // frame where the unmasking happened that is used for personalization if the + // user is not in incognito mode. // // If the card is local, has a non-empty GUID, and the user has updated its // expiration date, then this function will write the new information to @@ -216,7 +227,8 @@ absl::optional<base::Value::Dict> fido_assertion_info, absl::optional<GURL> last_committed_primary_main_frame_origin, absl::optional<std::string> context_token, - absl::optional<CardUnmaskChallengeOption> selected_challenge_option); + absl::optional<CardUnmaskChallengeOption> selected_challenge_option, + const url::Origin& merchant_domain_for_footprints); // CardUnmaskDelegate: void OnUnmaskPromptAccepted( @@ -234,8 +246,8 @@ // Resets the state of the request. void Reset(); - // Used to fetch risk data for this request. - const raw_ptr<RiskDataLoader> risk_data_loader_; + // The associated autofill client. + const raw_ref<AutofillClient> autofill_client_; // Responsible for unmasking a masked server card. const raw_ptr<payments::PaymentsClient> payments_client_;
diff --git a/components/autofill/core/browser/payments/full_card_request_unittest.cc b/components/autofill/core/browser/payments/full_card_request_unittest.cc index c6f41e4..477bab45 100644 --- a/components/autofill/core/browser/payments/full_card_request_unittest.cc +++ b/components/autofill/core/browser/payments/full_card_request_unittest.cc
@@ -30,6 +30,7 @@ #include "services/network/test/test_url_loader_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/origin.h" namespace autofill { namespace payments { @@ -111,9 +112,17 @@ return *this; } + FullCardRequestOptions& with_merchant_domain_for_footprints( + url::Origin mdff) { + merchant_domain_for_footprints = mdff; + return *this; + } + CreditCard credit_card; AutofillClient::UnmaskCardReason unmask_card_reason = AutofillClient::UnmaskCardReason::kAutofill; + url::Origin merchant_domain_for_footprints = + url::Origin::Create(GURL("https://example.com/")); }; FullCardRequestTest() @@ -151,6 +160,8 @@ MockUIDelegate* ui_delegate() { return &ui_delegate_; } + TestAutofillClient* autofill_client() { return &autofill_client_; } + void OnDidGetRealPan(AutofillClient::PaymentsRpcResult result, const std::string& real_pan, bool is_virtual_card = false) { @@ -176,7 +187,8 @@ void MakeGetFullCardRequest(FullCardRequestOptions options) { request()->GetFullCard(options.credit_card, options.unmask_card_reason, result_delegate()->AsWeakPtr(), - ui_delegate()->AsWeakPtr()); + ui_delegate()->AsWeakPtr(), + options.merchant_domain_for_footprints); } private: @@ -270,7 +282,15 @@ request()->GetFullCardViaFIDO( CreditCard(CreditCard::RecordType::kMaskedServerCard, "server_id"), AutofillClient::UnmaskCardReason::kAutofill, - result_delegate()->AsWeakPtr(), base::Value::Dict()); + result_delegate()->AsWeakPtr(), base::Value::Dict(), + url::Origin::Create(GURL("https://example.com")), + GURL("https://example.com")); + payments::PaymentsClient::UnmaskRequestDetails* request_details = + request()->GetUnmaskRequestDetailsForTesting(); + EXPECT_EQ(request_details->last_committed_primary_main_frame_origin->spec(), + GURL("https://example.com/").spec()); + EXPECT_EQ(request_details->merchant_domain_for_footprints->Serialize(), + "https://example.com"); OnDidGetRealPan(AutofillClient::PaymentsRpcResult::kSuccess, "4111"); } @@ -407,7 +427,8 @@ request()->GetFullVirtualCardViaCVC( card, AutofillClient::UnmaskCardReason::kAutofill, result_delegate()->AsWeakPtr(), ui_delegate()->AsWeakPtr(), - GURL("https://example.com/"), "test_context_token", challenge_option); + GURL("https://example.com/"), "test_context_token", challenge_option, + url::Origin::Create(GURL("https://example.com"))); ASSERT_TRUE(request()->GetShouldUnmaskCardForTesting()); payments::PaymentsClient::UnmaskRequestDetails* request_details = request()->GetUnmaskRequestDetailsForTesting(); @@ -418,6 +439,8 @@ EXPECT_EQ(request_details->context_token, "test_context_token"); EXPECT_EQ(request_details->last_committed_primary_main_frame_origin->spec(), GURL("https://example.com/").spec()); + EXPECT_EQ(request_details->merchant_domain_for_footprints->Serialize(), + "https://example.com"); CardUnmaskDelegate::UserProvidedUnmaskDetails details; details.cvc = u"123"; @@ -436,6 +459,26 @@ card_unmask_delegate()->OnUnmaskPromptClosed(); } +TEST_F(FullCardRequestTest, + DoesNotIncludeMerchantDomainForFootprintsWhenOffTheRecord) { + autofill_client()->set_is_off_the_record(true); + + MakeGetFullCardRequest( + FullCardRequestOptions() + .with_credit_card(CreditCard( + CreditCard::RecordType::kMaskedServerCard, "server_id")) + .with_merchant_domain_for_footprints( + url::Origin::Create(GURL("http://example.com")))); + payments::PaymentsClient::UnmaskRequestDetails* request_details = + request()->GetUnmaskRequestDetailsForTesting(); + ASSERT_EQ(request_details->merchant_domain_for_footprints, absl::nullopt); + + CardUnmaskDelegate::UserProvidedUnmaskDetails details; + details.cvc = u"123"; + card_unmask_delegate()->OnUnmaskPromptAccepted(details); + OnDidGetRealPan(AutofillClient::PaymentsRpcResult::kSuccess, "4111"); +} + // Only one request at a time should be allowed. TEST_F(FullCardRequestTest, OneRequestAtATime) { EXPECT_CALL( @@ -544,7 +587,8 @@ result_delegate()->AsWeakPtr(), ui_delegate()->AsWeakPtr(), GURL("https://example.com/"), "test_context_token", test::GetCardUnmaskChallengeOptions( - {CardUnmaskChallengeOptionType::kCvc})[0]); + {CardUnmaskChallengeOptionType::kCvc})[0], + url::Origin::Create(GURL("https://example.com"))); CardUnmaskDelegate::UserProvidedUnmaskDetails details; details.cvc = u"123"; card_unmask_delegate()->OnUnmaskPromptAccepted(details); @@ -576,7 +620,8 @@ result_delegate()->AsWeakPtr(), ui_delegate()->AsWeakPtr(), GURL("https://example.com/"), "test_context_token", test::GetCardUnmaskChallengeOptions( - {CardUnmaskChallengeOptionType::kCvc})[0]); + {CardUnmaskChallengeOptionType::kCvc})[0], + url::Origin::Create(GURL("https://example.com"))); CardUnmaskDelegate::UserProvidedUnmaskDetails details; details.cvc = u"123"; card_unmask_delegate()->OnUnmaskPromptAccepted(details); @@ -703,7 +748,8 @@ request()->GetFullVirtualCardViaCVC( test::GetVirtualCard(), AutofillClient::UnmaskCardReason::kAutofill, result_delegate()->AsWeakPtr(), ui_delegate()->AsWeakPtr(), - GURL("https://example.com/"), "test_context_token", challenge_option); + GURL("https://example.com/"), "test_context_token", challenge_option, + url::Origin::Create(GURL("https://example.com"))); CardUnmaskDelegate::UserProvidedUnmaskDetails user_provided_details; user_provided_details.cvc = u"321"; card_unmask_delegate()->OnUnmaskPromptAccepted(user_provided_details); @@ -727,6 +773,10 @@ ->GetUnmaskRequestDetailsForTesting() ->last_committed_primary_main_frame_origin->spec(), "https://example.com/"); + EXPECT_EQ(request() + ->GetUnmaskRequestDetailsForTesting() + ->merchant_domain_for_footprints->Serialize(), + "https://example.com"); histogram_tester.ExpectUniqueSample( "Autofill.CvcAuth.VirtualCard.RetryableError", autofill_metrics::CvcAuthEvent::kTemporaryErrorCvcMismatch, 1);
diff --git a/components/autofill/core/browser/payments/payments_client.cc b/components/autofill/core/browser/payments/payments_client.cc index cf3b610..69ad577 100644 --- a/components/autofill/core/browser/payments/payments_client.cc +++ b/components/autofill/core/browser/payments/payments_client.cc
@@ -129,6 +129,7 @@ otp = other.otp; last_committed_primary_main_frame_origin = other.last_committed_primary_main_frame_origin; + merchant_domain_for_footprints = other.merchant_domain_for_footprints; selected_challenge_option = other.selected_challenge_option; client_behavior_signals = other.client_behavior_signals; return *this;
diff --git a/components/autofill/core/browser/payments/payments_client.h b/components/autofill/core/browser/payments/payments_client.h index 07ff8b28..eec2957 100644 --- a/components/autofill/core/browser/payments/payments_client.h +++ b/components/autofill/core/browser/payments/payments_client.h
@@ -28,6 +28,7 @@ #include "components/autofill/core/browser/payments/virtual_card_enrollment_flow.h" #include "google_apis/gaia/google_service_auth_error.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "url/origin.h" namespace signin { class AccessTokenFetcher; @@ -130,6 +131,10 @@ // A vector of signals used to share client behavior with the Payments // server. std::vector<ClientBehaviorConstants> client_behavior_signals; + // The origin of the primary main frame where the unmasking happened. Should + // only be populated when the client is not in incognito mode since it will + // be used for personalization. + absl::optional<url::Origin> merchant_domain_for_footprints; }; // Information retrieved from an UnmaskRequest.
diff --git a/components/autofill/core/browser/payments/payments_requests/unmask_card_request.cc b/components/autofill/core/browser/payments/payments_requests/unmask_card_request.cc index dbc87b2..0b91f3f4 100644 --- a/components/autofill/core/browser/payments/payments_requests/unmask_card_request.cc +++ b/components/autofill/core/browser/payments/payments_requests/unmask_card_request.cc
@@ -292,6 +292,14 @@ std::move(virtual_card_request_info)); } + if (base::FeatureList::IsEnabled( + features::kAutofillEnableMerchantDomainInUnmaskCardRequest) && + request_details_.merchant_domain_for_footprints.has_value()) { + request_dict.Set( + "merchant_domain", + request_details_.merchant_domain_for_footprints->Serialize()); + } + std::string json_request; base::JSONWriter::Write(request_dict, &json_request); std::string request_content;
diff --git a/components/autofill/core/browser/payments/payments_requests/unmask_card_request_unittest.cc b/components/autofill/core/browser/payments/payments_requests/unmask_card_request_unittest.cc index 476fc1be..385cbcea 100644 --- a/components/autofill/core/browser/payments/payments_requests/unmask_card_request_unittest.cc +++ b/components/autofill/core/browser/payments/payments_requests/unmask_card_request_unittest.cc
@@ -9,9 +9,12 @@ #include "base/functional/callback_helpers.h" #include "base/json/json_reader.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_feature_list.h" #include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/payments/card_unmask_challenge_option.h" +#include "components/autofill/core/common/autofill_payments_features.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/origin.h" namespace autofill::payments { @@ -36,6 +39,20 @@ std::string::npos; } + // Returns true if `field_name_or_value` is included in the `request_`'s + // request content exactly `n` times, false otherwise. + bool IsIncludedInRequestContentNTimes(const std::string& field_name_or_value, + size_t n) { + std::string content = GetRequest()->GetRequestContent(); + size_t count = 0; + std::size_t found = content.find(field_name_or_value); + while (found != std::string::npos) { + count++; + found = content.find(field_name_or_value, found + 1); + } + return count == n; + } + // Returns the response details that was created for the current test // instance. const PaymentsClient::UnmaskResponseDetails& GetParsedResponse() const { @@ -43,12 +60,12 @@ } protected: + base::test::ScopedFeatureList feature_list_; // The `request_` that is created for each specific test instance. Set in the // initial test set up. std::unique_ptr<UnmaskCardRequest> request_; - private: - void SetUpUnmaskCardRequest() { + PaymentsClient::UnmaskRequestDetails GetDefaultUnmaskRequestDetails() { PaymentsClient::UnmaskRequestDetails request_details; request_details.billing_customer_number = 111222333444; request_details.card = test::GetMaskedServerCard(); @@ -59,10 +76,17 @@ base::UTF8ToUTF16(test::NextYear()); request_details.user_response.cvc = u"123"; request_details.risk_data = "some risk data"; + request_details.merchant_domain_for_footprints = + url::Origin::Create(GURL("https://example.com/")); request_details.client_behavior_signals = { ClientBehaviorConstants::kShowingCardArtImageAndCardProductName}; + return request_details; + } + + private: + void SetUpUnmaskCardRequest() { request_ = std::make_unique<UnmaskCardRequest>( - request_details, /*full_sync_enabled=*/true, + GetDefaultUnmaskRequestDetails(), /*full_sync_enabled=*/true, /*callback=*/base::DoNothing()); } }; @@ -70,6 +94,8 @@ // Test to ensure that the request content is correctly populated for a regular // unmask request. TEST_F(UnmaskCardRequestTest, GetRequestContent) { + feature_list_.InitAndEnableFeature( + features::kAutofillEnableMerchantDomainInUnmaskCardRequest); EXPECT_EQ(GetRequest()->GetRequestUrlPath(), "payments/apis-secure/creditcardservice/" "getrealpan?s7e_suffix=chromewallet"); @@ -86,12 +112,31 @@ EXPECT_TRUE(IsIncludedInRequestContent("encrypted_cvc")); EXPECT_TRUE(IsIncludedInRequestContent("&s7e_13_cvc=123")); EXPECT_TRUE(IsIncludedInRequestContent("client_behavior_signals")); + EXPECT_TRUE(IsIncludedInRequestContent("merchant_domain")); EXPECT_TRUE(IsIncludedInRequestContent( "%5B2%5D")); // '[2]' here stands for the // kShowingCardArtImageAndCardProductName in the // client_behavior_signals. } +TEST_F(UnmaskCardRequestTest, DoesNotIncludeMerchantDomainWhenFlagDisabled) { + feature_list_.InitAndDisableFeature( + features::kAutofillEnableMerchantDomainInUnmaskCardRequest); + EXPECT_FALSE(IsIncludedInRequestContent("merchant_domain")); +} + +TEST_F(UnmaskCardRequestTest, DoesNotIncludeMerchantDomainWhenMissingField) { + feature_list_.InitAndEnableFeature( + features::kAutofillEnableMerchantDomainInUnmaskCardRequest); + PaymentsClient::UnmaskRequestDetails request_details = + GetDefaultUnmaskRequestDetails(); + request_details.merchant_domain_for_footprints = absl::nullopt; + request_ = std::make_unique<UnmaskCardRequest>( + request_details, /*full_sync_enabled=*/true, + /*callback=*/base::DoNothing()); + EXPECT_FALSE(IsIncludedInRequestContent("merchant_domain")); +} + // Params of the VirtualCardUnmaskCardRequestTest: // -- autofill::CardUnmaskChallengeOptionType challenge_option_type // -- bool autofill_enable_email_otp_for_vcn_yellow_path @@ -138,6 +183,8 @@ request_details.risk_data = "some risk data"; request_details.last_committed_primary_main_frame_origin = GURL("https://example.com/"); + request_details.merchant_domain_for_footprints = + url::Origin::Create(GURL("https://example.com/")); request_details.selected_challenge_option = test::GetCardUnmaskChallengeOptions( {CardUnmaskChallengeOptionType::kCvc})[0]; @@ -149,6 +196,8 @@ }; TEST_P(VirtualCardUnmaskCardRequestTest, GetRequestContent) { + feature_list_.InitAndEnableFeature( + features::kAutofillEnableMerchantDomainInUnmaskCardRequest); if (IsCvcChallengeOption()) { EXPECT_EQ(GetRequest()->GetRequestUrlPath(), "payments/apis-secure/creditcardservice/" @@ -164,18 +213,25 @@ EXPECT_TRUE(IsIncludedInRequestContent("expiration_month")); EXPECT_TRUE(IsIncludedInRequestContent("expiration_year")); EXPECT_TRUE(IsIncludedInRequestContent("opt_in_fido_auth")); - EXPECT_TRUE(IsIncludedInRequestContent("merchant_domain")); EXPECT_TRUE(IsIncludedInRequestContent("encrypted_cvc")); EXPECT_TRUE(IsIncludedInRequestContent("&s7e_13_cvc=123")); EXPECT_TRUE(IsIncludedInRequestContent("cvc_challenge_option")); EXPECT_TRUE(IsIncludedInRequestContent("challenge_id")); EXPECT_TRUE(IsIncludedInRequestContent("cvc_length")); EXPECT_TRUE(IsIncludedInRequestContent("cvc_position")); + EXPECT_TRUE(IsIncludedInRequestContentNTimes("merchant_domain", 2)); EXPECT_FALSE(IsIncludedInRequestContent("client_behavior_signals")); } } TEST_P(VirtualCardUnmaskCardRequestTest, + IncludesOneMerchantDomainWhenFlagDisabled) { + feature_list_.InitAndDisableFeature( + features::kAutofillEnableMerchantDomainInUnmaskCardRequest); + EXPECT_TRUE(IsIncludedInRequestContentNTimes("merchant_domain", 1)); +} + +TEST_P(VirtualCardUnmaskCardRequestTest, ChallengeOptionsReturned_ParseResponse) { base::test::ScopedFeatureList feature_list_email_otp; feature_list_email_otp.InitWithFeatureState(
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc index 0962f00..498ce36 100644 --- a/components/autofill/core/browser/personal_data_manager_unittest.cc +++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -992,41 +992,40 @@ } TEST_F(PersonalDataManagerTest, AddLocalIbans) { - Iban iban0; - iban0.set_value(base::UTF8ToUTF16(std::string(test::kIbanValue))); - iban0.set_nickname(u"Nickname for Iban"); - Iban iban1; - iban1.set_value(base::UTF8ToUTF16(std::string(test::kIbanValue_1))); - iban1.set_nickname(u"Nickname 1"); + iban1.set_value(base::UTF8ToUTF16(std::string(test::kIbanValue))); + iban1.set_nickname(u"Nickname for Iban"); - Iban iban1_1 = iban1; - iban1_1.set_nickname(u"Nickname 1_1"); + Iban iban2; + iban2.set_value(base::UTF8ToUTF16(std::string(test::kIbanValue_1))); + iban2.set_nickname(u"Original nickname"); - // Add two test IBANs to the database. `iban1_1` has the same value - // as `iban1` but with a different nickname. Verify that only `iban1` is - // added. - std::string guid = personal_data_->AddIban(iban0); - // Adding the IBAN as a local IBAN would have set its GUID. - EXPECT_NE(guid, ""); + Iban iban2_with_different_nickname = iban2; + iban2_with_different_nickname.set_nickname(u"Different nickname"); + // Attempt to add all three IBANs to the database. The first two should add + // successfully, but the third should get skipped because its value is + // identical to `iban2`. + std::string guid = personal_data_->AddIban(iban1); PersonalDataProfileTaskWaiter(*personal_data_).Wait(); - // Should set identifier and record_type manually here as `iban0` has been + // Should set identifier and record_type manually here as `iban1` has been // passed by value above in `AddIban`, and `AddIban` method sets identifier - // and record_type to the given `iban0`. - iban0.set_identifier(Iban::Guid(guid)); - iban0.set_record_type(Iban::kLocalIban); - - guid = personal_data_->AddIban(iban1); - PersonalDataProfileTaskWaiter(*personal_data_).Wait(); + // and record_type to the given `iban1`. iban1.set_identifier(Iban::Guid(guid)); iban1.set_record_type(Iban::kLocalIban); - personal_data_->AddIban(iban1_1); + guid = personal_data_->AddIban(iban2); + PersonalDataProfileTaskWaiter(*personal_data_).Wait(); + iban2.set_identifier(Iban::Guid(guid)); + iban2.set_record_type(Iban::kLocalIban); - std::vector<Iban*> ibans; - ibans.push_back(&iban0); - ibans.push_back(&iban1); + // Do not add `PersonalDataProfileTaskWaiter(*personal_data_).Wait()` for this + // `AddIban` operation, as it will be terminated prematurely for + // `iban2_with_different_nickname` due to the presence of an IBAN with the + // same value. + personal_data_->AddIban(iban2_with_different_nickname); + + std::vector<Iban*> ibans = {&iban1, &iban2}; ExpectSameElements(ibans, personal_data_->GetLocalIbans()); } @@ -1047,14 +1046,21 @@ std::vector<Iban*> ibans = {&iban}; ExpectSameElements(ibans, personal_data_->GetLocalIbans()); - // Update the `iban` with new value and nickname. - iban.set_nickname(u"Another nickname"); + // Update the `iban` with new value. iban.SetRawInfo(IBAN_VALUE, u"GB98 MIDL 0700 9312 3456 78"); personal_data_->UpdateIban(iban); PersonalDataProfileTaskWaiter(*personal_data_).Wait(); ibans = {&iban}; ExpectSameElements(ibans, personal_data_->GetLocalIbans()); + + // Update the `iban` with new nickname. + iban.set_nickname(u"Another nickname"); + personal_data_->UpdateIban(iban); + PersonalDataProfileTaskWaiter(*personal_data_).Wait(); + + ibans = {&iban}; + ExpectSameElements(ibans, personal_data_->GetLocalIbans()); } TEST_F(PersonalDataManagerTest, RemoveLocalIbans) { @@ -1076,6 +1082,9 @@ RemoveByGUIDFromPersonalDataManager(guid); EXPECT_TRUE(personal_data_->GetLocalIbans().empty()); + + // Verify that removal of a GUID that doesn't exist won't crash. + RemoveByGUIDFromPersonalDataManager(guid); } // Ensure that new IBANs can be updated and saved via
diff --git a/components/autofill/core/browser/ui/suggestion_selection.cc b/components/autofill/core/browser/ui/suggestion_selection.cc index af6b709..14ec429 100644 --- a/components/autofill/core/browser/ui/suggestion_selection.cc +++ b/components/autofill/core/browser/ui/suggestion_selection.cc
@@ -417,8 +417,9 @@ #endif // BUILDFLAG(IS_ANDROID) std::u16string value = GetSuggestionMainText(profile, type, app_locale); - if (value.empty()) + if (value.empty()) { continue; + } std::u16string suggestion_canon = NormalizeForComparisonForType(value, type.GetStorableType()); @@ -432,55 +433,66 @@ return matched_profiles; } +// TODO(crbug.com/1417975): Remove `trigger_field_type` when +// `kAutofillUseAddressRewriterInProfileSubsetComparison` launches. std::vector<const AutofillProfile*> DeduplicatedProfilesForSuggestions( - const AutofillType& type, + const std::vector<const AutofillProfile*>& matched_profiles, + const AutofillType& trigger_field_type, const ServerFieldTypeSet& field_types, - const AutofillProfileComparator& comparator, - const std::vector<const AutofillProfile*> matched_profiles) { - std::vector<const AutofillProfile*> unique_matched_profiles; + const AutofillProfileComparator& comparator) { + // TODO(crbug.com/1417975): Remove when + // `kAutofillUseAddressRewriterInProfileSubsetComparison` launches. std::vector<std::u16string> suggestion_main_text; for (const AutofillProfile* profile : matched_profiles) { - suggestion_main_text.push_back( - GetSuggestionMainText(profile, type, comparator.app_locale())); + suggestion_main_text.push_back(GetSuggestionMainText( + profile, trigger_field_type, comparator.app_locale())); } + std::vector<const AutofillProfile*> unique_matched_profiles; // Limit number of unique profiles as having too many makes the // browser hang due to drawing calculations (and is also not // very useful for the user). - for (size_t i = 0; - i < matched_profiles.size() && + for (size_t a = 0; + a < matched_profiles.size() && unique_matched_profiles.size() < kMaxUniqueSuggestedProfilesCount; - ++i) { + ++a) { bool include = true; - const AutofillProfile* profile_a = matched_profiles[i]; - for (size_t j = 0; j < matched_profiles.size(); ++j) { - const AutofillProfile* profile_b = matched_profiles[j]; - // Check if profile A is a subset of profile B. If not, continue. - if (i == j || - !comparator.Compare(suggestion_main_text[i], - suggestion_main_text[j]) || - !profile_a->IsSubsetOfForFieldSet(comparator, *profile_b, + const AutofillProfile* profile_a = matched_profiles[a]; + for (size_t b = 0; b < matched_profiles.size(); ++b) { + const AutofillProfile* profile_b = matched_profiles[b]; + + // TODO(crbug.com/1417975): Remove when + // `kAutofillUseAddressRewriterInProfileSubsetComparison` launches. + if (profile_a == profile_b || + !comparator.Compare(suggestion_main_text[a], + suggestion_main_text[b])) { + continue; + } + + if (!profile_a->IsSubsetOfForFieldSet(comparator, *profile_b, field_types)) { continue; } - // Check if profile B is also a subset of profile A. If so, the - // profiles are identical and only one should be included. + if (!profile_b->IsSubsetOfForFieldSet(comparator, *profile_a, + field_types)) { + // One-way subset. Don't include profile A. + include = false; + break; + } + + // The profiles are identical and only one should be included. // Prefer `kAccount` profiles over `kLocalOrSyncable` ones. In case the // profiles have the same source, prefer the earlier one (since the // profiles are pre-sorted by their relevance). const bool prefer_a_over_b = profile_a->source() == profile_b->source() - ? i < j + ? a < b : profile_a->source() == AutofillProfile::Source::kAccount; - if (prefer_a_over_b && profile_b->IsSubsetOfForFieldSet( - comparator, *profile_a, field_types)) { - continue; + if (!prefer_a_over_b) { + include = false; + break; } - - // One-way subset. Don't include profile A. - include = false; - break; } if (include) { unique_matched_profiles.push_back(profile_a);
diff --git a/components/autofill/core/browser/ui/suggestion_selection.h b/components/autofill/core/browser/ui/suggestion_selection.h index a49e163..16129be 100644 --- a/components/autofill/core/browser/ui/suggestion_selection.h +++ b/components/autofill/core/browser/ui/suggestion_selection.h
@@ -78,14 +78,13 @@ // ServerFieldTypes relevant for the current suggestions, including that of the // field on which the user is currently focused. std::vector<const AutofillProfile*> DeduplicatedProfilesForSuggestions( - const AutofillType& type, + const std::vector<const AutofillProfile*>& matched_profiles, + const AutofillType& trigger_field_type, const ServerFieldTypeSet& field_types, - const AutofillProfileComparator& comparator, - const std::vector<const AutofillProfile*> matched_profiles); + const AutofillProfileComparator& comparator); -// Returns whether the |suggestion_canon| is valid considering the -// |field_contents_canon|, the |type|, |is_masked_server_card|, and -// |field_is_autofilled|. +// Returns whether the `suggestion_canon` is a valid match given +// `field_contents_canon`. bool IsValidSuggestionForFieldContents(std::u16string suggestion_canon, std::u16string field_contents_canon, const AutofillType& type,
diff --git a/components/autofill/core/browser/ui/suggestion_selection_unittest.cc b/components/autofill/core/browser/ui/suggestion_selection_unittest.cc index f0063421..4d6b825f 100644 --- a/components/autofill/core/browser/ui/suggestion_selection_unittest.cc +++ b/components/autofill/core/browser/ui/suggestion_selection_unittest.cc
@@ -149,8 +149,8 @@ profile2.get()}; std::vector<const AutofillProfile*> unique_matched_profiles = - DeduplicatedProfilesForSuggestions(AutofillType(NAME_FIRST), {}, - comparator_, profile_pointers); + DeduplicatedProfilesForSuggestions( + profile_pointers, AutofillType(NAME_FIRST), {}, comparator_); ASSERT_EQ(1U, unique_matched_profiles.size()); EXPECT_EQ(profile1.get(), unique_matched_profiles[0]); @@ -171,8 +171,8 @@ profile1.get(), profile2.get(), profile3.get()}; std::vector<const AutofillProfile*> unique_matched_profiles = - DeduplicatedProfilesForSuggestions(AutofillType(NAME_FIRST), {NAME_LAST}, - comparator_, profile_pointers); + DeduplicatedProfilesForSuggestions( + profile_pointers, AutofillType(NAME_FIRST), {NAME_LAST}, comparator_); ASSERT_EQ(3U, unique_matched_profiles.size()); @@ -189,25 +189,25 @@ } // Map all the pointers into an array that has the right type. - std::vector<const AutofillProfile*> profiles_pointers; - base::ranges::transform(profiles_data, std::back_inserter(profiles_pointers), + std::vector<const AutofillProfile*> profile_pointers; + base::ranges::transform(profiles_data, std::back_inserter(profile_pointers), &std::unique_ptr<AutofillProfile>::get); std::vector<const AutofillProfile*> unique_matched_profiles = - DeduplicatedProfilesForSuggestions(AutofillType(NAME_FIRST), {NAME_LAST}, - comparator_, profiles_pointers); + DeduplicatedProfilesForSuggestions( + profile_pointers, AutofillType(NAME_FIRST), {NAME_LAST}, comparator_); ASSERT_EQ(kMaxUniqueSuggestedProfilesCount, unique_matched_profiles.size()); // All profiles are different. for (size_t i = 0; i < unique_matched_profiles.size(); i++) { - ASSERT_EQ(profiles_pointers[i], unique_matched_profiles[i]); + ASSERT_EQ(profile_pointers[i], unique_matched_profiles[i]); } } TEST_F(SuggestionSelectionTest, GetUniqueSuggestions_EmptyMatchingProfiles) { - ASSERT_EQ(0U, DeduplicatedProfilesForSuggestions(AutofillType(NAME_FIRST), - {NAME_LAST}, comparator_, {}) + ASSERT_EQ(0U, DeduplicatedProfilesForSuggestions({}, AutofillType(NAME_FIRST), + {NAME_LAST}, comparator_) .size()); } @@ -221,12 +221,12 @@ local_profile->set_source_for_testing( AutofillProfile::Source::kLocalOrSyncable); // Place `account_profile` behind `local_profile`. - std::vector<const AutofillProfile*> profiles = {local_profile.get(), - account_profile.get()}; + std::vector<const AutofillProfile*> profile_pointers = { + local_profile.get(), account_profile.get()}; std::vector<const AutofillProfile*> unique_matched_profiles = - DeduplicatedProfilesForSuggestions(AutofillType(NAME_FIRST), {}, - comparator_, profiles); + DeduplicatedProfilesForSuggestions( + profile_pointers, AutofillType(NAME_FIRST), {}, comparator_); // Usually, duplicates are resolved in favour of the earlier profile. Expect // that this is not the case when profiles of different sources are involved. EXPECT_THAT(unique_matched_profiles, ElementsAre(account_profile.get()));
diff --git a/components/browser_ui/accessibility/android/java/res/layout/page_zoom_preference.xml b/components/browser_ui/accessibility/android/java/res/layout/page_zoom_preference.xml index 690749f..4ed68fe 100644 --- a/components/browser_ui/accessibility/android/java/res/layout/page_zoom_preference.xml +++ b/components/browser_ui/accessibility/android/java/res/layout/page_zoom_preference.xml
@@ -62,7 +62,7 @@ android:textAlignment="center" /> <include - android:id="@+id/text_size_contrast_seekbar" + android:id="@+id/text_size_contrast_layout_container" layout="@layout/text_size_contrast_slider" android:visibility="gone" />
diff --git a/components/browser_ui/accessibility/android/java/res/layout/text_size_contrast_slider.xml b/components/browser_ui/accessibility/android/java/res/layout/text_size_contrast_slider.xml index 562cbfd..26dcad74 100644 --- a/components/browser_ui/accessibility/android/java/res/layout/text_size_contrast_slider.xml +++ b/components/browser_ui/accessibility/android/java/res/layout/text_size_contrast_slider.xml
@@ -17,6 +17,7 @@ android:layout_width="@dimen/min_touch_target_size" android:layout_height="@dimen/min_touch_target_size" android:src="@drawable/ic_remove" + android:visibility="gone" android:background="@drawable/page_zoom_ripple" android:tint="@color/default_icon_color_tint_list" /> @@ -25,6 +26,7 @@ android:layout_weight="1" android:layout_width="0dp" android:layout_height="@dimen/min_touch_target_size" + android:visibility="gone" android:contentDescription="@string/page_zoom_label" /> <org.chromium.ui.widget.ChromeImageButton @@ -32,6 +34,7 @@ android:layout_width="@dimen/min_touch_target_size" android:layout_height="@dimen/min_touch_target_size" android:src="@drawable/ic_add" + android:visibility="gone" android:background="@drawable/page_zoom_ripple" android:tint="@color/default_icon_color_tint_list" />
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomPreference.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomPreference.java index 2a034f6..7ba185bc 100644 --- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomPreference.java +++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomPreference.java
@@ -109,21 +109,26 @@ if (ContentFeatureMap.isEnabled(ContentFeatureList.SMART_ZOOM)) { holder.findViewById(R.id.text_size_contrast_title).setVisibility(View.VISIBLE); holder.findViewById(R.id.text_size_contrast_summary).setVisibility(View.VISIBLE); + holder.findViewById(R.id.text_size_contrast_layout_container) + .setVisibility(View.VISIBLE); mTextSizeContrastCurrentLevelText = (TextView) holder.findViewById(R.id.text_size_contrast_current_value_text); mTextSizeContrastCurrentLevelText.setText( getContext().getResources().getString(R.string.text_size_contrast_level, 0)); + mTextSizeContrastCurrentLevelText.setVisibility(View.VISIBLE); mTextSizeContrastDecreaseButton = (ChromeImageButton) holder.findViewById( R.id.text_size_contrast_decrease_zoom_button); mTextSizeContrastDecreaseButton.setOnClickListener( v -> onHandleContrastDecreaseClicked()); + mTextSizeContrastDecreaseButton.setVisibility(View.VISIBLE); mTextSizeContrastIncreaseButton = (ChromeImageButton) holder.findViewById( R.id.text_size_contrast_increase_zoom_button); mTextSizeContrastIncreaseButton.setOnClickListener( v -> onHandleContrastIncreaseClicked()); + mTextSizeContrastIncreaseButton.setVisibility(View.VISIBLE); mTextSizeContrastSeekBar = (SeekBar) holder.findViewById(R.id.text_size_contrast_slider); @@ -131,13 +136,8 @@ mTextSizeContrastSeekBar.setMax(PageZoomUtils.TEXT_SIZE_CONTRAST_MAX_LEVEL); mTextSizeContrastFactor = mTextSizeContrastDelegate.getValue(); mTextSizeContrastSeekBar.setProgress(mTextSizeContrastFactor); + mTextSizeContrastSeekBar.setVisibility(View.VISIBLE); updateViewsOnProgressChanged(mTextSizeContrastFactor, mTextSizeContrastSeekBar); - - mTextSizeContrastCurrentLevelText.setVisibility(View.VISIBLE); - holder.findViewById(R.id.text_size_contrast_current_value_text) - .setVisibility(View.VISIBLE); - holder.findViewById(R.id.text_size_contrast_summary).setVisibility(View.VISIBLE); - holder.findViewById(R.id.text_size_contrast_seekbar).setVisibility(View.VISIBLE); } } @@ -285,4 +285,24 @@ private void saveTextSizeContrastValueToPreferences() { mTextSizeContrastDelegate.setValue(mTextSizeContrastSeekBar.getProgress()); } + + // Testing methods. + + public SeekBar getZoomSliderForTesting() { + return mSeekBar; + } + + public void setZoomValueForTesting(int progress) { + mSeekBar.setProgress(progress); + updateViewsOnProgressChanged(progress, mSeekBar); + } + + public SeekBar getTextSizeContrastSliderForTesting() { + return mTextSizeContrastSeekBar; + } + + public void setTextContrastValueForTesting(int contrast) { + mTextSizeContrastSeekBar.setProgress(contrast); + updateViewsOnProgressChanged(contrast, mTextSizeContrastSeekBar); + } } \ No newline at end of file
diff --git a/components/browser_ui/device_lock/android/OWNERS b/components/browser_ui/device_lock/OWNERS similarity index 100% rename from components/browser_ui/device_lock/android/OWNERS rename to components/browser_ui/device_lock/OWNERS
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb index c661b61b..5a727400 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Deel tans jou skerm</translation> <translation id="5922967540311291836">Blokkeer derdepartywebkoekies:</translation> <translation id="5939518447894949180">Stel terug</translation> -<translation id="5964247741333118902">Ingebedde inhoud</translation> <translation id="5968921426641056619">Voer webadres in</translation> <translation id="5975083100439434680">Zoem uit</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb index fd8f7d5..b4de5d3d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">ማያ ገጽዎን በማጋራት ላይ</translation> <translation id="5922967540311291836">የሶስተኛ ወገን ኩኪዎችን ያግዱ፦</translation> <translation id="5939518447894949180">ዳግም አስጀምር</translation> -<translation id="5964247741333118902">የተከተተ ይዘት</translation> <translation id="5968921426641056619">የድር አድራሻን ያስገቡ</translation> <translation id="5975083100439434680">አሳንስ</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />፣ <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb index 5592046f..5b279728 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -284,7 +284,6 @@ <translation id="5922853908706496913">جارٍ مشاركة شاشتك</translation> <translation id="5922967540311291836">حظر ملفات تعريف الارتباط التابعة لجهات خارجية:</translation> <translation id="5939518447894949180">إعادة الضبط</translation> -<translation id="5964247741333118902">المحتوى المضمَّن</translation> <translation id="5968921426641056619">أدخِل عنوان الويب.</translation> <translation id="5975083100439434680">تصغير</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb index e4ade4c..e3d93d9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">আপোনাৰ স্ক্ৰীন শ্বেয়াৰ কৰি থকা হৈছে</translation> <translation id="5922967540311291836">তৃতীয় পক্ষৰ কুকি অৱৰোধ কৰক:</translation> <translation id="5939518447894949180">ৰিছেট কৰক</translation> -<translation id="5964247741333118902">এম্বেড কৰা সমল</translation> <translation id="5968921426641056619">ৱেবৰ ঠিকনা দিয়ক</translation> <translation id="5975083100439434680">জুম আউট কৰক</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb index 8e3f824..751574a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Ekranınız paylaşılır</translation> <translation id="5922967540311291836">Üçüncü tərəf kukiləri bloklayın:</translation> <translation id="5939518447894949180">Sıfırlayın</translation> -<translation id="5964247741333118902">Daxil edilmiş kontent</translation> <translation id="5968921426641056619">Veb ünvanını daxil edin</translation> <translation id="5975083100439434680">Kiçildin</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />-<ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb index 6abf8384..451f71db 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Ваш экран абагульваецца</translation> <translation id="5922967540311291836">Блакіраваць староннія файлы cookie:</translation> <translation id="5939518447894949180">Скінуць</translation> -<translation id="5964247741333118902">Убудаванае змесціва</translation> <translation id="5968921426641056619">Увядзіце вэб-адрас</translation> <translation id="5975083100439434680">Паменшыць</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb index 17129be6..2232643 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Екранът ви се споделя</translation> <translation id="5922967540311291836">Блокиране на „бисквитките“ на трети страни:</translation> <translation id="5939518447894949180">Нулиране</translation> -<translation id="5964247741333118902">Вградено съдържание</translation> <translation id="5968921426641056619">Въведете уеб адрес</translation> <translation id="5975083100439434680">Намаляване на мащаба</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb index 013e603..93b3cc1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">আপনার স্ক্রিন শেয়ার করা হচ্ছে</translation> <translation id="5922967540311291836">থার্ড-পার্টি কুকি ব্লক করুন:</translation> <translation id="5939518447894949180">রিসেট করুন</translation> -<translation id="5964247741333118902">এম্বেড করা কন্টেন্ট</translation> <translation id="5968921426641056619">ওয়েব ঠিকানা লিখুন</translation> <translation id="5975083100439434680">ছোট করুন</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb index 020d037..812f7c4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Dijeljenje ekrana</translation> <translation id="5922967540311291836">Blokirajte kolačiće treće strane:</translation> <translation id="5939518447894949180">Vrati na zadano</translation> -<translation id="5964247741333118902">Ugrađeni sadržaj</translation> <translation id="5968921426641056619">Unesite web adresu</translation> <translation id="5975083100439434680">Umanjivanje</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb index ec97689..ae27d7e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">S'està compartint la pantalla</translation> <translation id="5922967540311291836">Bloqueja les galetes de tercers:</translation> <translation id="5939518447894949180">Restableix</translation> -<translation id="5964247741333118902">Contingut inserit</translation> <translation id="5968921426641056619">Introdueix l'adreça web</translation> <translation id="5975083100439434680">Redueix</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb index 2e5a066..15f7370 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Sdílíte obrazovku</translation> <translation id="5922967540311291836">Blokovat soubory cookie třetích stran:</translation> <translation id="5939518447894949180">Resetovat</translation> -<translation id="5964247741333118902">Vložený obsah</translation> <translation id="5968921426641056619">Zadejte webovou adresu</translation> <translation id="5975083100439434680">Oddálit</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb index 916ed73..9a00d02 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Wrthi'n rhannu eich sgrîn</translation> <translation id="5922967540311291836">Rhwystro cwcis trydydd parti:</translation> <translation id="5939518447894949180">Ailosod</translation> -<translation id="5964247741333118902">Cynnwys wedi'i fewnblannu</translation> <translation id="5968921426641056619">Rhowch gyfeiriad gwe</translation> <translation id="5975083100439434680">Pellhau</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb index caf1aa6a..6a03fa9fa 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Deling af din skærm</translation> <translation id="5922967540311291836">Bloker tredjepartscookies:</translation> <translation id="5939518447894949180">Nulstil</translation> -<translation id="5964247741333118902">Indlejret indhold</translation> <translation id="5968921426641056619">Angiv webadresse</translation> <translation id="5975083100439434680">Zoom ud</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb index 001456a3..da94870 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Bildschirmfreigabe läuft</translation> <translation id="5922967540311291836">Drittanbieter-Cookies blockieren:</translation> <translation id="5939518447894949180">Zurücksetzen</translation> -<translation id="5964247741333118902">Eingebettete Inhalte</translation> <translation id="5968921426641056619">Webadresse eingeben</translation> <translation id="5975083100439434680">Verkleinern</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb index 85f6a8e..c18ad29 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Κοινή χρήση της οθόνης σας</translation> <translation id="5922967540311291836">Αποκλεισμός cookie τρίτου μέρους:</translation> <translation id="5939518447894949180">Επαναφορά</translation> -<translation id="5964247741333118902">Ενσωματωμένο περιεχόμενο</translation> <translation id="5968921426641056619">Εισαγωγή διεύθυνσης ιστού</translation> <translation id="5975083100439434680">Σμίκρυνση</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb index 47ac052..70cedd1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Sharing your screen</translation> <translation id="5922967540311291836">Block third-party cookies:</translation> <translation id="5939518447894949180">Reset</translation> -<translation id="5964247741333118902">Embedded content</translation> <translation id="5968921426641056619">Enter web address</translation> <translation id="5975083100439434680">Zoom out</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb index f4e2a42..340663e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Compartiendo tu pantalla</translation> <translation id="5922967540311291836">Bloquear cookies de terceros:</translation> <translation id="5939518447894949180">Restablecer</translation> -<translation id="5964247741333118902">Contenido incorporado</translation> <translation id="5968921426641056619">Ingresa una dirección web</translation> <translation id="5975083100439434680">Alejar</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb index 29f40d7f..93f22fc0 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Compartiendo tu pantalla</translation> <translation id="5922967540311291836">Bloquea cookies de terceros:</translation> <translation id="5939518447894949180">Restablecer</translation> -<translation id="5964247741333118902">Contenido insertado</translation> <translation id="5968921426641056619">Introduce una dirección web</translation> <translation id="5975083100439434680">Reducir</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb index f10443f..e6ec82a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Ekraanikuva jagamine</translation> <translation id="5922967540311291836">Kolmanda osapoole küpsisefailide blokeerimine</translation> <translation id="5939518447894949180">Lähtesta</translation> -<translation id="5964247741333118902">Manustatud sisu</translation> <translation id="5968921426641056619">Sisestage veebiaadress</translation> <translation id="5975083100439434680">Suumib välja</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb index 9e47974..337f9bdb 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Pantaila partekatzen</translation> <translation id="5922967540311291836">Blokeatu hirugarrenen cookieak:</translation> <translation id="5939518447894949180">Berrezarri</translation> -<translation id="5964247741333118902">Eduki kapsulatua</translation> <translation id="5968921426641056619">Idatzi web-helbidea</translation> <translation id="5975083100439434680">Txikitu</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />: <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb index 873c0b3..82c86c4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">درحال همرسانی صفحهنمایش</translation> <translation id="5922967540311291836">مسدود کردن کوکیهای شخص ثالث:</translation> <translation id="5939518447894949180">بازنشانی</translation> -<translation id="5964247741333118902">محتوای جاسازیشده</translation> <translation id="5968921426641056619">نشانی وب را وارد کنید</translation> <translation id="5975083100439434680">دورنمایی کردن</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb index a1d63a5..33962d69 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Näyttösi jaetaan</translation> <translation id="5922967540311291836">Estä kolmannen osapuolen evästeet:</translation> <translation id="5939518447894949180">Tyhjennä</translation> -<translation id="5964247741333118902">Upotettu sisältö</translation> <translation id="5968921426641056619">Lisää verkko-osoite</translation> <translation id="5975083100439434680">Loitonna</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb index 2d11213..0d8b331 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Ibinabahagi ang iyong screen</translation> <translation id="5922967540311291836">I-block ang third-party na cookies:</translation> <translation id="5939518447894949180">I-reset</translation> -<translation id="5964247741333118902">Naka-embed na content</translation> <translation id="5968921426641056619">Ilagay ang address sa web</translation> <translation id="5975083100439434680">Mag-zoom out</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb index e132381a..793e4e2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Partage de votre écran en cours…</translation> <translation id="5922967540311291836">Bloquer les témoins tiers :</translation> <translation id="5939518447894949180">Recommencer</translation> -<translation id="5964247741333118902">Contenu intégré</translation> <translation id="5968921426641056619">Entrez l'adresse Web</translation> <translation id="5975083100439434680">Zoom arrière</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> : <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb index 9aa5473..d3df0b2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Partage de votre écran…</translation> <translation id="5922967540311291836">Bloquer les cookies tiers :</translation> <translation id="5939518447894949180">Réinitialiser</translation> -<translation id="5964247741333118902">Contenu intégré</translation> <translation id="5968921426641056619">Saisissez une adresse Web</translation> <translation id="5975083100439434680">Zoom arrière</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb index 0d01cd25..a2b08a7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Compartindo pantalla</translation> <translation id="5922967540311291836">Bloquea as cookies de terceiros:</translation> <translation id="5939518447894949180">Restablecer</translation> -<translation id="5964247741333118902">Contido inserido</translation> <translation id="5968921426641056619">Indica o enderezo web</translation> <translation id="5975083100439434680">Afastar</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />: <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb index a2cd009..dacfd1a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">તમારી સ્ક્રીન શેર કરીએ છીએ</translation> <translation id="5922967540311291836">ત્રીજા પક્ષની કુકીને બ્લૉક કરો:</translation> <translation id="5939518447894949180">રીસેટ કરો</translation> -<translation id="5964247741333118902">શામેલ કરેલું કન્ટેન્ટ</translation> <translation id="5968921426641056619">વેબ ઍડ્રેસ દાખલ કરો</translation> <translation id="5975083100439434680">ઝૂમ ઘટાડો</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb index 64f00a14..1a05b5b4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">आपकी स्क्रीन शेयर की जा रही है</translation> <translation id="5922967540311291836">तीसरे पक्ष की कुकी ब्लॉक करें:</translation> <translation id="5939518447894949180">रीसेट करें</translation> -<translation id="5964247741333118902">एम्बेड किया गया कॉन्टेंट</translation> <translation id="5968921426641056619">वेब पता डालें</translation> <translation id="5975083100439434680">ज़ूम आउट</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb index 0111b59..7bd93562 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Dijeljenje zaslona</translation> <translation id="5922967540311291836">Blokiraj kolačiće trećih strana:</translation> <translation id="5939518447894949180">Ponovno postavi</translation> -<translation id="5964247741333118902">Ugrađeni sadržaj</translation> <translation id="5968921426641056619">Unesite web-adresu</translation> <translation id="5975083100439434680">Smanji</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb index 0cd9db9..764a64c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Képernyő megosztása</translation> <translation id="5922967540311291836">Harmadik féltől származó cookie-k letiltása</translation> <translation id="5939518447894949180">Visszaállítás</translation> -<translation id="5964247741333118902">Beágyazott tartalom</translation> <translation id="5968921426641056619">Adja meg a kívánt internetcímet</translation> <translation id="5975083100439434680">Kicsinyítés</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb index 2056c2e6..af5918c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Էկրանը ցուցադրվում է</translation> <translation id="5922967540311291836">Արգելափակել երրորդ կողմի քուքիները․</translation> <translation id="5939518447894949180">Վերակայել</translation> -<translation id="5964247741333118902">Զետեղված բովանդակություն</translation> <translation id="5968921426641056619">Մուտքագրեք վեբ հասցեն</translation> <translation id="5975083100439434680">Փոքրացնել</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb index 4814826..bd61e2c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Membagikan layar Anda</translation> <translation id="5922967540311291836">Blokir cookie pihak ketiga:</translation> <translation id="5939518447894949180">Reset</translation> -<translation id="5964247741333118902">Konten yang disematkan</translation> <translation id="5968921426641056619">Masukkan alamat web</translation> <translation id="5975083100439434680">Perkecil</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb index 767fc251..aab5862 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Deiling skjásins þíns</translation> <translation id="5922967540311291836">Loka á fótspor þriðju aðila:</translation> <translation id="5939518447894949180">Endurstilla</translation> -<translation id="5964247741333118902">Innfellt efni</translation> <translation id="5968921426641056619">Sláðu inn vefslóð</translation> <translation id="5975083100439434680">Minnka aðdrátt</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb index 52a9ea4..03940cb 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Condivisione dello schermo</translation> <translation id="5922967540311291836">Blocca cookie di terze parti:</translation> <translation id="5939518447894949180">Reimposta</translation> -<translation id="5964247741333118902">Contenuti incorporati</translation> <translation id="5968921426641056619">Inserisci l'indirizzo web</translation> <translation id="5975083100439434680">Diminuisci lo zoom</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb index fde1bd92..517e73e7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">מתבצע שיתוף מסך</translation> <translation id="5922967540311291836">חסימת קובצי cookie של צד שלישי:</translation> <translation id="5939518447894949180">איפוס</translation> -<translation id="5964247741333118902">תוכן מוטמע</translation> <translation id="5968921426641056619">צריך להזין כתובת אינטרנט</translation> <translation id="5975083100439434680">התרחקות</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb index 8a6965ec..1e38585 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">画面を共有しています</translation> <translation id="5922967540311291836">サードパーティの Cookie をブロックする:</translation> <translation id="5939518447894949180">リセット</translation> -<translation id="5964247741333118902">埋め込みコンテンツ</translation> <translation id="5968921426641056619">ウェブアドレスを入力</translation> <translation id="5975083100439434680">縮小する</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />~<ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb index c2d7d61..b50dc979 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">თქვენი ეკრანი ზიარდება</translation> <translation id="5922967540311291836">მესამე მხარის ქუქი-ჩანაწერების დაბლოკვა:</translation> <translation id="5939518447894949180">გადატვირთვა</translation> -<translation id="5964247741333118902">ჩაშენებული კონტენტი</translation> <translation id="5968921426641056619">შეიყვანეთ ვებ-მისამართი</translation> <translation id="5975083100439434680">დაშორება</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> — <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb index a278033d..1ceda95 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Экранды бөлісіп жатырсыз.</translation> <translation id="5922967540311291836">Үшінші тарап cookie файлдарын бөгеу:</translation> <translation id="5939518447894949180">Қалпына келтіру</translation> -<translation id="5964247741333118902">Ендірілген контент</translation> <translation id="5968921426641056619">Веб-мекенжайды енгізіңіз</translation> <translation id="5975083100439434680">Кішірейту</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb index 720cb40d..b2e59c2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">កំពុងចែករំលែកអេក្រង់របស់អ្នក</translation> <translation id="5922967540311291836">ទប់ស្កាត់ខូគីភាគីទីបី៖</translation> <translation id="5939518447894949180">កំណត់ឡើងវិញ</translation> -<translation id="5964247741333118902">ខ្លឹមសារដែលបានបង្កប់</translation> <translation id="5968921426641056619">បញ្ចូលអាសយដ្ឋានទំព័រ</translation> <translation id="5975083100439434680">បង្រួម</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb index bd81af4..ee414547 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ</translation> <translation id="5922967540311291836">ಥರ್ಡ್-ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ:</translation> <translation id="5939518447894949180">ಮರುಹೊಂದಿಸು</translation> -<translation id="5964247741333118902">ಎಂಬೆಡ್ ಮಾಡಲಾದ ಕಂಟೆಂಟ್</translation> <translation id="5968921426641056619">ವೆಬ್ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ</translation> <translation id="5975083100439434680">ಝೂಮ್ ಔಟ್</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb index 94a6a6d..93bc2c3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">화면 공유</translation> <translation id="5922967540311291836">서드 파티 쿠키 차단:</translation> <translation id="5939518447894949180">초기화</translation> -<translation id="5964247741333118902">삽입한 콘텐츠</translation> <translation id="5968921426641056619">웹 주소 입력</translation> <translation id="5975083100439434680">축소</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb index c8ba61bd4..05e3d8a9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Экраныңыз бөлүшүлүүдө</translation> <translation id="5922967540311291836">Үчүнчү тараптын cookie файлдарын бөгөттөө:</translation> <translation id="5939518447894949180">Кайра коюу</translation> -<translation id="5964247741333118902">Жалгаштырылган контент</translation> <translation id="5968921426641056619">Веб дарегин киргизиңиз</translation> <translation id="5975083100439434680">Кичирейтүү</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />, <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb index c4e2a88..7d1f34b3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">ກຳລັງແບ່ງປັນໜ້າຈໍຂອງທ່ານ</translation> <translation id="5922967540311291836">ບລັອກຄຸກກີ້ພາກສ່ວນທີສາມ:</translation> <translation id="5939518447894949180">ຕັ້ງຄ່າຄືນໃໝ່</translation> -<translation id="5964247741333118902">ເນື້ອຫາທີ່ຝັງໄວ້</translation> <translation id="5968921426641056619">ລະບຸທີ່ຢູ່ເວັບ</translation> <translation id="5975083100439434680">ຊູມອອກ</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb index 0298014..5bb5220 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Bendrinamas ekranas</translation> <translation id="5922967540311291836">Blokuoti trečiųjų šalių slapukus:</translation> <translation id="5939518447894949180">Nustatyti iš naujo</translation> -<translation id="5964247741333118902">Įterptas turinys</translation> <translation id="5968921426641056619">Įveskite žiniatinklio adresą</translation> <translation id="5975083100439434680">Tolinti</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb index 7ba0017..118f84d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Notiek jūsu ekrāna kopīgošana</translation> <translation id="5922967540311291836">Bloķēt trešo pušu sīkfailus:</translation> <translation id="5939518447894949180">Atiestatīt</translation> -<translation id="5964247741333118902">Iegultais saturs</translation> <translation id="5968921426641056619">Ievadiet tīmekļa adresi</translation> <translation id="5975083100439434680">Tālināt</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> — <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb index 399d8ce..b45ca06 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Се споделува екранот</translation> <translation id="5922967540311291836">Блокирајте колачиња од трети страни:</translation> <translation id="5939518447894949180">Ресетирај</translation> -<translation id="5964247741333118902">Вметнати содржини</translation> <translation id="5968921426641056619">Внесете интернет-адреса</translation> <translation id="5975083100439434680">Одзумирај</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb index 265ce60..cd148d8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">നിങ്ങളുടെ സ്ക്രീൻ പങ്കിടുന്നു</translation> <translation id="5922967540311291836">മൂന്നാം-കക്ഷി കുക്കികള് ബ്ലോക്ക് ചെയ്യുക:</translation> <translation id="5939518447894949180">റീസെറ്റ് ചെയ്യുക</translation> -<translation id="5964247741333118902">ഉൾച്ചേർത്ത ഉള്ളടക്കം</translation> <translation id="5968921426641056619">വെബ് വിലാസം നൽകുക</translation> <translation id="5975083100439434680">സൂം ഔട്ട് ചെയ്യുക</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb index f6d5bb3d..471606f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Таны дэлгэцийг хуваалцаж байна</translation> <translation id="5922967540311291836">Гуравдагч талын күүкиг блоклох:</translation> <translation id="5939518447894949180">Дахин сэргээх</translation> -<translation id="5964247741333118902">Оруулсан контент</translation> <translation id="5968921426641056619">Веб хаяг оруулна уу</translation> <translation id="5975083100439434680">Багасгаж харах</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb index ee9d982f..86eb61a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">तुमची स्क्रीन शेअर करत आहे</translation> <translation id="5922967540311291836">तृतीय पक्ष कुकी ब्लॉक करा:</translation> <translation id="5939518447894949180">रीसेट करा</translation> -<translation id="5964247741333118902">एंबेड केलेला आशय</translation> <translation id="5968921426641056619">वेब अॅड्रेस एंटर करा</translation> <translation id="5975083100439434680">झूम कमी करा</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb index f84b7cf..313e29a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Berkongsi skrin anda</translation> <translation id="5922967540311291836">Sekat kuki pihak ketiga:</translation> <translation id="5939518447894949180">Tetapkan semula</translation> -<translation id="5964247741333118902">Kandungan terbenam</translation> <translation id="5968921426641056619">Masukkan alamat web</translation> <translation id="5975083100439434680">Zum keluar</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb index a0c324f1..41684ed 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">သင့်ဖန်သားပြင်ကို မျှဝေနေသည်</translation> <translation id="5922967540311291836">ပြင်ပကုမ္ပဏီ၏ကွတ်ကီးများကို ပိတ်ထားခြင်း-</translation> <translation id="5939518447894949180">ပြင်ဆင်သတ်မှတ်ရန်</translation> -<translation id="5964247741333118902">မြှုပ်သွင်းထားသော အကြောင်းအရာ</translation> <translation id="5968921426641056619">ဝဘ်လိပ်စာထည့်ပါ</translation> <translation id="5975083100439434680">ဇူးမ်ဖြုတ်ရန်</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb index 3d45114d..c5e9f4b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">तपाईंको स्क्रिन सेयर गर्दै</translation> <translation id="5922967540311291836">तेस्रो पक्षीय कुकीहरू ब्लक गरियोस्:</translation> <translation id="5939518447894949180">रिसेट गर्नुहोस्</translation> -<translation id="5964247741333118902">इम्बेड गरिएको सामग्री</translation> <translation id="5968921426641056619">वेब ठेगाना हाल्नुहोस्</translation> <translation id="5975083100439434680">जुम आउट</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />, <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb index 077e189a..fdcedf9b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Je scherm delen</translation> <translation id="5922967540311291836">Cookies van derden blokkeren:</translation> <translation id="5939518447894949180">Resetten</translation> -<translation id="5964247741333118902">Ingesloten content</translation> <translation id="5968921426641056619">Webadres opgeven</translation> <translation id="5975083100439434680">Uitzoomen</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb index f9716ce..15cff6db 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Deler skjermen din</translation> <translation id="5922967540311291836">Blokker informasjonskapsler fra tredjeparter:</translation> <translation id="5939518447894949180">Tilbakestill</translation> -<translation id="5964247741333118902">Innebygd innhold</translation> <translation id="5968921426641056619">Skriv inn en nettadresse</translation> <translation id="5975083100439434680">Zoom ut</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb index c97613c..ebd543a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">ଆପଣଙ୍କ ସ୍କ୍ରିନ୍ ସେୟାର୍ କରାଯାଉଛି</translation> <translation id="5922967540311291836">ତୃତୀୟ-ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ବ୍ଲକ କରନ୍ତୁ:</translation> <translation id="5939518447894949180">ପୁନଃସେଟ୍</translation> -<translation id="5964247741333118902">ଏମ୍ବେଡ କରାଯାଇଥିବା ବିଷୟବସ୍ତୁ</translation> <translation id="5968921426641056619">ୱେବ ଠିକଣା ଲେଖନ୍ତୁ</translation> <translation id="5975083100439434680">ଜୁମ୍ କମାନ୍ତୁ</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb index 613f7353..d35117c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਸਾਂਝੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation> <translation id="5922967540311291836">ਤੀਜੀ-ਧਿਰ ਦੀਆਂ ਕੁਕੀਜ਼ ਨੂੰ ਬਲਾਕ ਕਰੋ:</translation> <translation id="5939518447894949180">ਰੀਸੈਟ ਕਰੋ</translation> -<translation id="5964247741333118902">ਜੋੜੀ ਗਈ ਸਮੱਗਰੀ</translation> <translation id="5968921426641056619">ਵੈੱਬ ਪਤਾ ਦਾਖਲ ਕਰੋ</translation> <translation id="5975083100439434680">ਜ਼ੂਮ ਘਟਾਓ</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb index 1f368e5..52436e9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Udostępnianie ekranu</translation> <translation id="5922967540311291836">Blokuj pliki cookie innych firm:</translation> <translation id="5939518447894949180">Resetuj</translation> -<translation id="5964247741333118902">Umieszczona treść</translation> <translation id="5968921426641056619">Podaj adres internetowy</translation> <translation id="5975083100439434680">Pomniejsz</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb index d50badd..4b7c97a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Compartilhando a tela</translation> <translation id="5922967540311291836">Bloquear cookies de terceiros:</translation> <translation id="5939518447894949180">Redefinir</translation> -<translation id="5964247741333118902">Conteúdo incorporado</translation> <translation id="5968921426641056619">Digite o endereço da Web</translation> <translation id="5975083100439434680">Diminuir zoom</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb index 7a00c24..ae02f2ec 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Partilhar o ecrã</translation> <translation id="5922967540311291836">Bloqueie cookies de terceiros:</translation> <translation id="5939518447894949180">Repor</translation> -<translation id="5964247741333118902">Conteúdo incorporado</translation> <translation id="5968921426641056619">Introduza o endereço Web</translation> <translation id="5975083100439434680">Reduzir</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb index 7f12642..9b0388f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Se permite accesul la ecran</translation> <translation id="5922967540311291836">Blochează cookie-urile terță parte:</translation> <translation id="5939518447894949180">Resetează</translation> -<translation id="5964247741333118902">Conținut încorporat</translation> <translation id="5968921426641056619">Introdu adresa web</translation> <translation id="5975083100439434680">Micșorează</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb index 9cd611f..66852bc 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Предоставлен доступ к вашему экрану</translation> <translation id="5922967540311291836">Блокировать сторонние файлы cookie</translation> <translation id="5939518447894949180">Сбросить</translation> -<translation id="5964247741333118902">Встроенный контент</translation> <translation id="5968921426641056619">Введите веб-адрес</translation> <translation id="5975083100439434680">Уменьшить</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb index 91c1d7d..3858ec2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">ඔබේ තිරය බෙදා ගැනීම</translation> <translation id="5922967540311291836">තෙවන පාර්ශ්ව කුකී අවහිර කරන්න:</translation> <translation id="5939518447894949180">නැවත සකසන්න</translation> -<translation id="5964247741333118902">කාවද්දන ලද අන්තර්ගතය</translation> <translation id="5968921426641056619">වෙබ් ලිපිනය ඇතුළු කරන්න</translation> <translation id="5975083100439434680">විශාලනය අඩු කරන්න</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb index 9cb26ce..be3f4a9f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Zdieľate obrazovku</translation> <translation id="5922967540311291836">Blokovať súbory cookie tretích strán:</translation> <translation id="5939518447894949180">Resetovať</translation> -<translation id="5964247741333118902">Vložený obsah</translation> <translation id="5968921426641056619">Zadajte webovú adresu</translation> <translation id="5975083100439434680">Oddialiť</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb index 75cc3c51a0..17d9d7b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Deljenje zaslona</translation> <translation id="5922967540311291836">Blokiranje piškotkov tretjih oseb:</translation> <translation id="5939518447894949180">Ponastavi</translation> -<translation id="5964247741333118902">Vdelana vsebina</translation> <translation id="5968921426641056619">Vnesite spletni naslov</translation> <translation id="5975083100439434680">Pomanjšaj</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb index 9fc6828b..86f7063 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Po ndan ekranin tënd</translation> <translation id="5922967540311291836">Blloko kukit e palëve të treta</translation> <translation id="5939518447894949180">Rivendos</translation> -<translation id="5964247741333118902">Përmbajtjet e integruara</translation> <translation id="5968921426641056619">Fut adresën e uebit</translation> <translation id="5975083100439434680">Zvogëlo</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb index 67fe5bb..3da20f9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Deli se ekran</translation> <translation id="5922967540311291836">Blokirajte kolačiće trećih strana:</translation> <translation id="5939518447894949180">Resetuj</translation> -<translation id="5964247741333118902">Ugrađen sadržaj</translation> <translation id="5968921426641056619">Unesite veb-adresu</translation> <translation id="5975083100439434680">Umanjivanje</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb index d6491f8f..69242ae 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Дели се екран</translation> <translation id="5922967540311291836">Блокирајте колачиће трећих страна:</translation> <translation id="5939518447894949180">Ресетуј</translation> -<translation id="5964247741333118902">Уграђен садржај</translation> <translation id="5968921426641056619">Унесите веб-адресу</translation> <translation id="5975083100439434680">Умањивање</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb index 6d5d51c..0b7f2b7d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Delar skärmen</translation> <translation id="5922967540311291836">Blockera cookies från tredje part</translation> <translation id="5939518447894949180">Återställ</translation> -<translation id="5964247741333118902">Inbäddat innehåll</translation> <translation id="5968921426641056619">Ange webbadress</translation> <translation id="5975083100439434680">Zooma ut</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb index 5b33761c..4164ef80 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Inashiriki skrini yako</translation> <translation id="5922967540311291836">Kuzuia vidakuzi vya washirika wengine:</translation> <translation id="5939518447894949180">Weka upya</translation> -<translation id="5964247741333118902">Maudhui yaliyopachikwa</translation> <translation id="5968921426641056619">Weka anwani ya wavuti</translation> <translation id="5975083100439434680">Fifiza</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb index 45a6b6b..c07724a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">உங்கள் திரையைப் பகிர்கிறது</translation> <translation id="5922967540311291836">மூன்றாம் தரப்புக் குக்கீகளைத் தடு:</translation> <translation id="5939518447894949180">மீட்டமை</translation> -<translation id="5964247741333118902">உட்பொதிக்கப்பட்ட உள்ளடக்கம்</translation> <translation id="5968921426641056619">வலை முகவரியை டைப் செய்யவும்</translation> <translation id="5975083100439434680">சிறிதாக்கு</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb index 9cbb3b2..1929259 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">మీ స్క్రీన్ను షేర్ చేయడం</translation> <translation id="5922967540311291836">థర్డ్-పార్టీ కుక్కీలను బ్లాక్ చేయండి:</translation> <translation id="5939518447894949180">రీసెట్ చేయండి</translation> -<translation id="5964247741333118902">పొందుపరచబడిన కంటెంట్</translation> <translation id="5968921426641056619">వెబ్ అడ్రస్ను ఎంటర్ చేయండి</translation> <translation id="5975083100439434680">దూరంగా జూమ్ చేయి</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb index bd4cc01..1958158 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">กำลังแชร์หน้าจอ</translation> <translation id="5922967540311291836">บล็อกคุกกี้ของบุคคลที่สาม:</translation> <translation id="5939518447894949180">รีเซ็ต</translation> -<translation id="5964247741333118902">เนื้อหาที่ฝัง</translation> <translation id="5968921426641056619">ป้อนที่อยู่เว็บ</translation> <translation id="5975083100439434680">ย่อ</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb index 81514a3..ba199a2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Ekranınız paylaşılıyor</translation> <translation id="5922967540311291836">Üçüncü taraf çerezlerini engelle:</translation> <translation id="5939518447894949180">Sıfırla</translation> -<translation id="5964247741333118902">Yerleştirilmiş içerik</translation> <translation id="5968921426641056619">Web adresini girin</translation> <translation id="5975083100439434680">Uzaklaştır</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb index 34a004b..9f09896 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Доступ до вашого екрана</translation> <translation id="5922967540311291836">Блокувати сторонні файли cookie:</translation> <translation id="5939518447894949180">Скинути</translation> -<translation id="5964247741333118902">Вбудований контент</translation> <translation id="5968921426641056619">Введіть веб-адресу</translation> <translation id="5975083100439434680">Зменшити масштаб</translation> <translation id="5976059395673079613">"<ph name="PERMISSION" />" – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb index 0710396..067f635 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">آپ کی اسکرین کا اشتراک کیا جا رہا ہے</translation> <translation id="5922967540311291836">فریق ثالث کوکیز کو مسدود کریں:</translation> <translation id="5939518447894949180">دوبارہ ترتیب دیں</translation> -<translation id="5964247741333118902">سرایت کردہ مواد</translation> <translation id="5968921426641056619">ویب پتہ درج کریں</translation> <translation id="5975083100439434680">زوم آؤٹ کریں</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb index 5a7cbef..61519065 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Ekran namoyish qilinmoqda</translation> <translation id="5922967540311291836">Tashqi cookie fayllarni bloklash:</translation> <translation id="5939518447894949180">Asliga qaytarish</translation> -<translation id="5964247741333118902">Joylashtirilgan kontent</translation> <translation id="5968921426641056619">Veb-manzilni kiriting</translation> <translation id="5975083100439434680">Kichiklashtirish</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb index 41952c6..0f5702c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Đang chia sẻ màn hình của bạn</translation> <translation id="5922967540311291836">Chặn cookie của bên thứ ba:</translation> <translation id="5939518447894949180">Đặt lại</translation> -<translation id="5964247741333118902">Nội dung được nhúng</translation> <translation id="5968921426641056619">Nhập địa chỉ web</translation> <translation id="5975083100439434680">Thu nhỏ</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb index 2f7ea39..65572f81 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">正在共享您的屏幕</translation> <translation id="5922967540311291836">阻止第三方 Cookie:</translation> <translation id="5939518447894949180">重置</translation> -<translation id="5964247741333118902">嵌入式内容</translation> <translation id="5968921426641056619">输入网址</translation> <translation id="5975083100439434680">缩小</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb index 5589f22f..d4c1d515 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">正在分享螢幕畫面</translation> <translation id="5922967540311291836">封鎖第三方 Cookie:</translation> <translation id="5939518447894949180">重設</translation> -<translation id="5964247741333118902">已嵌入的內容</translation> <translation id="5968921426641056619">輸入網址</translation> <translation id="5975083100439434680">縮小</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb index aaf57288..190fa1a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">正在分享你的螢幕畫面</translation> <translation id="5922967540311291836">封鎖第三方 Cookie:</translation> <translation id="5939518447894949180">重設</translation> -<translation id="5964247741333118902">嵌入的內容</translation> <translation id="5968921426641056619">輸入網址</translation> <translation id="5975083100439434680">縮小</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb index ca7df2f..02bbe64 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
@@ -283,7 +283,6 @@ <translation id="5922853908706496913">Yabelana ngesikrini sakho</translation> <translation id="5922967540311291836">Vimba amakhukhi angahlangene ngqo:</translation> <translation id="5939518447894949180">Setha kabusha</translation> -<translation id="5964247741333118902">Okuqukethwe okushumekiwe</translation> <translation id="5968921426641056619">Faka ikheli lewebhu</translation> <translation id="5975083100439434680">Hlehlisa isithombe</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />, <ph name="WARNING_MESSAGE" /></translation>
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 78e4a31..b1492c44 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "25.10", - "log_list_timestamp": "2023-09-28T13:00:28Z", + "version": "25.11", + "log_list_timestamp": "2023-09-29T13:06:17Z", "operators": [ { "name": "Google",
diff --git a/components/commerce/core/commerce_feature_list.cc b/components/commerce/core/commerce_feature_list.cc index 6a3181b..fe9e5c4 100644 --- a/components/commerce/core/commerce_feature_list.cc +++ b/components/commerce/core/commerce_feature_list.cc
@@ -50,6 +50,7 @@ map[&kPriceInsightsRegionLaunched] = {{"us", {"en-us"}}}; map[&kShowDiscountOnNavigationRegionLaunched] = {{"us", {"en-us"}}}; map[&kShoppingPageTypesRegionLaunched] = {{"us", {"en-us"}}}; + map[&kParcelTrackingRegionLaunched] = {{"us", {"en-us"}}}; return map; }()); @@ -272,6 +273,9 @@ BASE_FEATURE(kParcelTracking, "ParcelTracking", base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kParcelTrackingRegionLaunched, + "ParcelTrackingRegionLaunched", + base::FEATURE_DISABLED_BY_DEFAULT); // Params for Discount Consent V2 in the NTP Cart module. const char kNtpChromeCartModuleDiscountConsentNtpVariationParam[] =
diff --git a/components/commerce/core/commerce_feature_list.h b/components/commerce/core/commerce_feature_list.h index 6ec8295..f2c6a7c5 100644 --- a/components/commerce/core/commerce_feature_list.h +++ b/components/commerce/core/commerce_feature_list.h
@@ -134,6 +134,7 @@ // Feature flag for parcel tracking. BASE_DECLARE_FEATURE(kParcelTracking); +BASE_DECLARE_FEATURE(kParcelTrackingRegionLaunched); // Shopping list update interval. constexpr base::FeatureParam<base::TimeDelta>
diff --git a/components/commerce/core/mock_shopping_service.cc b/components/commerce/core/mock_shopping_service.cc index cec95a9c..8c2252f0 100644 --- a/components/commerce/core/mock_shopping_service.cc +++ b/components/commerce/core/mock_shopping_service.cc
@@ -247,4 +247,9 @@ .WillByDefault(testing::Return(bookmark_model)); } +void MockShoppingService::SetIsParcelTrackingEligible(bool is_eligible) { + ON_CALL(*this, IsParcelTrackingEligible) + .WillByDefault(testing::Return(is_eligible)); +} + } // namespace commerce
diff --git a/components/commerce/core/mock_shopping_service.h b/components/commerce/core/mock_shopping_service.h index c7eb785..bb0edecb 100644 --- a/components/commerce/core/mock_shopping_service.h +++ b/components/commerce/core/mock_shopping_service.h
@@ -104,6 +104,7 @@ MOCK_METHOD(bool, IsMerchantViewerEnabled, (), (override)); MOCK_METHOD(bool, IsPriceInsightsEligible, (), (override)); MOCK_METHOD(bool, IsDiscountEligibleToShowOnNavigation, (), (override)); + MOCK_METHOD(bool, IsParcelTrackingEligible, (), (override)); MOCK_METHOD(void, GetDiscountInfoForUrls, (const std::vector<GURL>& urls, DiscountInfoCallback callback), @@ -139,6 +140,7 @@ void SetIsDiscountEligibleToShowOnNavigation(bool is_eligible); void SetResponseForGetDiscountInfoForUrls(const DiscountsMap& discounts_map); void SetBookmarkModelUsedForSync(bookmarks::BookmarkModel* bookmark_model); + void SetIsParcelTrackingEligible(bool is_eligible); }; } // namespace commerce
diff --git a/components/commerce/core/parcel/parcels_manager.cc b/components/commerce/core/parcel/parcels_manager.cc index 4babb303..da426caf 100644 --- a/components/commerce/core/parcel/parcels_manager.cc +++ b/components/commerce/core/parcel/parcels_manager.cc
@@ -27,6 +27,7 @@ ParcelIdentifier id; id.set_carrier(identifier.first); id.set_tracking_id(identifier.second); + result.emplace_back(std::move(id)); } return result; }
diff --git a/components/commerce/core/parcel/parcels_manager_unittest.cc b/components/commerce/core/parcel/parcels_manager_unittest.cc index 0a35450..c5cb95c 100644 --- a/components/commerce/core/parcel/parcels_manager_unittest.cc +++ b/components/commerce/core/parcel/parcels_manager_unittest.cc
@@ -130,6 +130,7 @@ const std::vector<ParcelIdentifier>& parcel_identifiers, const std::string& source_page_domain, ParcelsServerProxy::GetParcelStatusCallback callback) { + CHECK_EQ(parcel_identifiers[0].tracking_id(), tracking_id); std::move(callback).Run(succeeded, BuildParcelStatus(tracking_id, state)); });
diff --git a/components/commerce/core/shopping_service.cc b/components/commerce/core/shopping_service.cc index 605ba36..bdaef68 100644 --- a/components/commerce/core/shopping_service.cc +++ b/components/commerce/core/shopping_service.cc
@@ -793,6 +793,16 @@ account_checker_->IsAnonymizedUrlDataCollectionEnabled(); } +bool ShoppingService::IsParcelTrackingEligible() { + if (!IsRegionLockedFeatureEnabled(kParcelTracking, + kParcelTrackingRegionLaunched, + country_on_startup_, locale_on_startup_)) { + return false; + } + return account_checker_ && account_checker_->IsSignedIn() && + account_checker_->IsAnonymizedUrlDataCollectionEnabled(); +} + bool ShoppingService::IsShoppingPageTypesApiEnabled() { return IsRegionLockedFeatureEnabled(kShoppingPageTypes, kShoppingPageTypesRegionLaunched,
diff --git a/components/commerce/core/shopping_service.h b/components/commerce/core/shopping_service.h index 957d4f52..8aa4434 100644 --- a/components/commerce/core/shopping_service.h +++ b/components/commerce/core/shopping_service.h
@@ -401,6 +401,12 @@ // feature-related infrastructure. virtual bool IsDiscountEligibleToShowOnNavigation(); + // Check if parcel tracking is eligible for use. This not only checks the + // feature flag, but also checks user's sign in state, country code, etc. The + // value returned here can change during runtime so it should not be used + // when deciding to build infrastructure. + virtual bool IsParcelTrackingEligible(); + // Starts tracking a list of parcels from a given page. void StartTrackingParcels( const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>&
diff --git a/components/exo/wayland/clients/client_base.cc b/components/exo/wayland/clients/client_base.cc index a6384e3..7d87f41 100644 --- a/components/exo/wayland/clients/client_base.cc +++ b/components/exo/wayland/clients/client_base.cc
@@ -43,6 +43,7 @@ #include "third_party/skia/include/gpu/GrDirectContext.h" #include "third_party/skia/include/gpu/ganesh/SkSurfaceGanesh.h" #include "third_party/skia/include/gpu/ganesh/gl/GrGLBackendSurface.h" +#include "third_party/skia/include/gpu/ganesh/gl/GrGLDirectContext.h" #include "third_party/skia/include/gpu/gl/GrGLAssembleInterface.h" #include "third_party/skia/include/gpu/gl/GrGLInterface.h" #include "third_party/skia/include/gpu/gl/GrGLTypes.h" @@ -504,7 +505,7 @@ nullptr, [](void* ctx, const char name[]) { return eglGetProcAddress(name); }); DCHECK(native_interface); - gr_context_ = GrDirectContext::MakeGL(std::move(native_interface)); + gr_context_ = GrDirectContexts::MakeGL(std::move(native_interface)); DCHECK(gr_context_); #if defined(USE_VULKAN)
diff --git a/components/module_installer/android/java/src/org/chromium/components/module_installer/builder/Module.java b/components/module_installer/android/java/src/org/chromium/components/module_installer/builder/Module.java index ffdfad3..9b884104 100644 --- a/components/module_installer/android/java/src/org/chromium/components/module_installer/builder/Module.java +++ b/components/module_installer/android/java/src/org/chromium/components/module_installer/builder/Module.java
@@ -30,6 +30,8 @@ private final String mName; private final Class<T> mInterfaceClass; private final String mImplClassName; + private ModuleDescriptor mModuleDescriptor; + private Context mContext; private T mImpl; private InstallEngine mInstaller; private boolean mIsNativeLoaded; @@ -96,20 +98,23 @@ * installed. */ public T getImpl() { + T ret = mImpl; + if (ret != null) { + return ret; + } + assert isInstalled(); try (Timer timer = new Timer()) { - if (mImpl != null) return mImpl; - assert isInstalled(); - - ModuleDescriptor moduleDescriptor = loadModuleDescriptor(mName); + ModuleDescriptor moduleDescriptor = getModuleDescriptor(); if (moduleDescriptor.getLoadNativeOnGetImpl()) { // Load the module's native code and/or resources if they are present, and the // Chrome native library itself has been loaded. ensureNativeLoaded(); } - Object impl = instantiateReflectively(mName, mImplClassName); + Object impl = instantiateReflectively(mImplClassName); try { - mImpl = mInterfaceClass.cast(impl); + ret = mInterfaceClass.cast(impl); + mImpl = ret; } catch (ClassCastException e) { ClassLoader interfaceClassLoader = mInterfaceClass.getClassLoader(); ClassLoader implClassLoader = impl.getClass().getClassLoader(); @@ -125,8 +130,8 @@ + ")", e); } - return mImpl; } + return ret; } /** @@ -137,7 +142,7 @@ // Can only initialize native once per lifetime of Chrome. if (mIsNativeLoaded) return; assert LibraryLoader.getInstance().isInitialized(); - ModuleDescriptor moduleDescriptor = loadModuleDescriptor(mName); + ModuleDescriptor moduleDescriptor = getModuleDescriptor(); String[] libraries = moduleDescriptor.getLibraries(); String[] paks = moduleDescriptor.getPaks(); if (libraries.length > 0 || paks.length > 0) { @@ -153,31 +158,45 @@ * module. For APKs, returns an empty descriptor since APKs won't have * descriptors packaged into them. * - * @param name The module's name. * @return The module's {@link ModuleDescriptor}. */ - private static ModuleDescriptor loadModuleDescriptor(String name) { - if (!BundleUtils.isBundle()) { - return new ModuleDescriptor() { - @Override - public String[] getLibraries() { - return new String[0]; - } + private ModuleDescriptor getModuleDescriptor() { + ModuleDescriptor ret = mModuleDescriptor; + if (ret == null) { + if (BundleUtils.isBundle()) { + ret = (ModuleDescriptor) instantiateReflectively( + "org.chromium.components.module_installer.builder.ModuleDescriptor_" + + mName); + } else { + ret = new ModuleDescriptor() { + @Override + public String[] getLibraries() { + return new String[0]; + } - @Override - public String[] getPaks() { - return new String[0]; - } + @Override + public String[] getPaks() { + return new String[0]; + } - @Override - public boolean getLoadNativeOnGetImpl() { - return false; - } - }; + @Override + public boolean getLoadNativeOnGetImpl() { + return false; + } + }; + } + mModuleDescriptor = ret; } + return ret; + } - return (ModuleDescriptor) instantiateReflectively( - name, "org.chromium.components.module_installer.builder.ModuleDescriptor_" + name); + /** + * Returns the Context associated with the module. + */ + public Context getContext() { + // Ensure mContext is initialized. + getImpl(); + return mContext; } /** @@ -186,17 +205,23 @@ * Ignores strict mode violations since accessing code in a module may cause its DEX file to be * loaded and on some devices that can cause such a violation. * - * @param moduleName The module's name. * @param className The object's class name. * @return The object. */ - private static Object instantiateReflectively(String moduleName, String className) { - Context context = ContextUtils.getApplicationContext(); - if (BundleUtils.isIsolatedSplitInstalled(moduleName)) { - context = BundleUtils.createIsolatedSplitContext(context, moduleName); + private Object instantiateReflectively(String className) { + Context context = mContext; + if (context == null) { + context = ContextUtils.getApplicationContext(); + String moduleName = mName; + if (BundleUtils.isIsolatedSplitInstalled(moduleName)) { + context = BundleUtils.createIsolatedSplitContext(context, moduleName); + } } try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) { - return context.getClassLoader().loadClass(className).newInstance(); + Object ret = context.getClassLoader().loadClass(className).newInstance(); + // Cache only if reflection succeeded since the module might not have been installed. + mContext = context; + return ret; } catch (Exception e) { throw new RuntimeException(e); }
diff --git a/components/omnibox/browser/zero_suggest_provider.cc b/components/omnibox/browser/zero_suggest_provider.cc index 9642c7b..b6f10b7 100644 --- a/components/omnibox/browser/zero_suggest_provider.cc +++ b/components/omnibox/browser/zero_suggest_provider.cc
@@ -233,21 +233,24 @@ return false; } + const AutocompleteInput zero_suggest_input = + GetZeroSuggestInput(input, client); + if (!SearchSuggestionParser::ParseSuggestResults( - *response_data, input, client->GetSchemeClassifier(), + *response_data, zero_suggest_input, client->GetSchemeClassifier(), kDefaultZeroSuggestRelevance, /*is_keyword_result=*/false, results)) { return false; } - const auto page_class = input.current_page_classification(); + const auto page_class = zero_suggest_input.current_page_classification(); if (!ShouldCacheResultTypeInContext(result_type, page_class)) { return true; } // Force use of empty page URL when given an input with "No URL" result type. const std::string page_url = result_type != ResultType::kRemoteNoURL - ? input.current_url().spec() + ? zero_suggest_input.current_url().spec() : std::string(); client->GetZeroSuggestCacheService()->StoreZeroSuggestResponse(page_url, response_json); @@ -255,7 +258,7 @@ return true; } -// Called in Start() with an input ensured to be appropriate for zero-suggest. +// Called in Start(). // // Returns true if the response stored in the user prefs is applicable to // |result_type| and can be successfully parsed for |input|. If so, populates @@ -267,14 +270,17 @@ DCHECK(results); DCHECK_NE(ResultType::kNone, result_type); - const auto page_class = input.current_page_classification(); + const AutocompleteInput zero_suggest_input = + GetZeroSuggestInput(input, client); + + const auto page_class = zero_suggest_input.current_page_classification(); if (!ShouldCacheResultTypeInContext(result_type, page_class)) { return false; } // Force use of empty page URL when given an input with "No URL" result type. const std::string page_url = result_type != ResultType::kRemoteNoURL - ? input.current_url().spec() + ? zero_suggest_input.current_url().spec() : std::string(); std::string response_json = client->GetZeroSuggestCacheService() ->ReadZeroSuggestResponse(page_url) @@ -290,7 +296,7 @@ } if (!SearchSuggestionParser::ParseSuggestResults( - *response_data, input, client->GetSchemeClassifier(), + *response_data, zero_suggest_input, client->GetSchemeClassifier(), kDefaultZeroSuggestRelevance, /*is_keyword_result=*/false, results)) { return false; @@ -445,8 +451,7 @@ template_url, search_terms_args, template_url_service->search_terms_data(), base::BindOnce(&ZeroSuggestProvider::OnPrefetchURLLoadComplete, - weak_ptr_factory_.GetWeakPtr(), - GetZeroSuggestInput(input, client()), + weak_ptr_factory_.GetWeakPtr(), input, result_type)); LogEvent(Event::kRequestSent, result_type, /*is_prefetch=*/true); @@ -468,8 +473,7 @@ // Convert the stored response to |matches_|, if applicable. SearchSuggestionParser::Results results; - if (ReadStoredResponse(client(), GetZeroSuggestInput(input, client()), - result_type_running_, &results)) { + if (ReadStoredResponse(client(), input, result_type_running_, &results)) { ConvertSuggestResultsToAutocompleteMatches(results, input); LogEvent(Event::kCachedResponseConvertedToMatches, result_type_running_, /*is_prefetch=*/false); @@ -503,8 +507,7 @@ template_url, search_terms_args, template_url_service->search_terms_data(), base::BindOnce(&ZeroSuggestProvider::OnURLLoadComplete, - weak_ptr_factory_.GetWeakPtr(), - GetZeroSuggestInput(input, client()), + weak_ptr_factory_.GetWeakPtr(), input, result_type_running_)); LogEvent(Event::kRequestSent, result_type_running_, /*is_prefetch=*/false); @@ -683,9 +686,11 @@ // Add all the SuggestResults to the map. We display all ZeroSuggest search // suggestions as unbolded. + const AutocompleteInput zero_suggest_input = + GetZeroSuggestInput(input, client()); MatchMap map; for (size_t i = 0; i < results.suggest_results.size(); ++i) { - AddMatchToMap(results.suggest_results[i], std::string(), input, + AddMatchToMap(results.suggest_results[i], std::string(), zero_suggest_input, client()->GetTemplateURLService()->GetDefaultSearchProvider(), client()->GetTemplateURLService()->search_terms_data(), i, false, false, &map);
diff --git a/components/onc/docs/onc_spec.md b/components/onc/docs/onc_spec.md index 390114f507..3c39bb0 100644 --- a/components/onc/docs/onc_spec.md +++ b/components/onc/docs/onc_spec.md
@@ -240,6 +240,21 @@ connections may still be established successfully but will be closed shortly after that by the Chrome OS connection manager. +* **RecommendedValuesAreEphemeral** + * (optional, defaults to false) - **boolean** + * When this field is set to true, settings of device-wide policy-provided + network configurations marked as "Recommended" will be regarded as + ephemeral. These settings will be reverted to the policy-recommended (or + default) value on reboot (startup), logout, and when the device has been + idle. + +* **UserCreatedNetworkConfigurationsAreEphemeral** + * (optional, defaults to false) - **boolean** + * When this field is set to true, device-wide network configurations created + by the user will be regarded as ephemeral. These network configurations + will be deleted on reboot (startup), logout, and when the device has been + idle. + ## Network Configuration Field **NetworkConfigurations** is an array of
diff --git a/components/onc/onc_constants.cc b/components/onc/onc_constants.cc index e8dce79..af5bc56f 100644 --- a/components/onc/onc_constants.cc +++ b/components/onc/onc_constants.cc
@@ -554,6 +554,9 @@ const char kBlacklistedHexSSIDs[] = "BlacklistedHexSSIDs"; // Deprecated const char kBlockedHexSSIDs[] = "BlockedHexSSIDs"; const char kDisableNetworkTypes[] = "DisableNetworkTypes"; +const char kRecommendedValuesAreEphemeral[] = "RecommendedValuesAreEphemeral"; +const char kUserCreatedNetworkConfigurationsAreEphemeral[] = + "UserCreatedNetworkConfigurationsAreEphemeral"; } // global_network_config namespace device_state {
diff --git a/components/onc/onc_constants.h b/components/onc/onc_constants.h index 015654d..e527dc0 100644 --- a/components/onc/onc_constants.h +++ b/components/onc/onc_constants.h
@@ -552,6 +552,9 @@ COMPONENT_EXPORT(ONC) extern const char kBlacklistedHexSSIDs[]; // Deprecated COMPONENT_EXPORT(ONC) extern const char kBlockedHexSSIDs[]; COMPONENT_EXPORT(ONC) extern const char kDisableNetworkTypes[]; +COMPONENT_EXPORT(ONC) extern const char kRecommendedValuesAreEphemeral[]; +COMPONENT_EXPORT(ONC) +extern const char kUserCreatedNetworkConfigurationsAreEphemeral[]; } // namespace global_network_config namespace device_state {
diff --git a/components/page_image_service/image_service_consent_helper.cc b/components/page_image_service/image_service_consent_helper.cc index 49bfa2c..9201ba7 100644 --- a/components/page_image_service/image_service_consent_helper.cc +++ b/components/page_image_service/image_service_consent_helper.cc
@@ -6,6 +6,7 @@ #include "base/feature_list.h" #include "base/metrics/field_trial_params.h" +#include "base/metrics/histogram_functions.h" #include "components/page_image_service/features.h" #include "components/page_image_service/metrics_util.h" #include "components/sync/service/sync_service.h" @@ -23,6 +24,15 @@ : PageImageServiceConsentStatus::kFailure); } +PageImageServiceConsentStatus ConsentStatusToUmaStatus( + absl::optional<bool> consent_status) { + if (!consent_status) { + return PageImageServiceConsentStatus::kTimedOut; + } + return consent_status.value() ? PageImageServiceConsentStatus::kSuccess + : PageImageServiceConsentStatus::kFailure; +} + } // namespace ImageServiceConsentHelper::ImageServiceConsentHelper( @@ -58,6 +68,7 @@ void ImageServiceConsentHelper::EnqueueRequest( base::OnceCallback<void(PageImageServiceConsentStatus)> callback) { + base::UmaHistogramBoolean("PageImageService.ConsentStatusRequestCount", true); if (consent_throttle_) { consent_throttle_->EnqueueRequest( base::BindOnce(&RunConsentThrottleCallback, std::move(callback))); @@ -126,6 +137,10 @@ void ImageServiceConsentHelper::OnTimeoutExpired() { for (auto& request_callback : enqueued_request_callbacks_) { + // Report consent status on timeout for each request to compare against the + // number of all requests. + base::UmaHistogramEnumeration("PageImageService.ConsentStatusOnTimeout", + ConsentStatusToUmaStatus(GetConsentStatus())); std::move(request_callback).Run(PageImageServiceConsentStatus::kTimedOut); } enqueued_request_callbacks_.clear();
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index 2eac5b3..c6c840e 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -169,24 +169,15 @@ "password_store.cc", "password_store.h", "password_store_backend.h", - "password_store_backend_error.cc", - "password_store_backend_error.h", "password_store_backend_metrics_recorder.cc", "password_store_backend_metrics_recorder.h", "password_store_built_in_backend.cc", "password_store_built_in_backend.h", - "password_store_change.cc", - "password_store_change.h", - "password_store_consumer.cc", - "password_store_consumer.h", "password_store_factory_util.cc", "password_store_factory_util.h", - "password_store_interface.h", "password_store_signin_notifier.h", "password_store_sync.cc", "password_store_sync.h", - "password_store_util.cc", - "password_store_util.h", "password_sync_util.cc", "password_sync_util.h", "password_ui_utils.cc", @@ -237,6 +228,7 @@ all_dependent_configs = [ ":password_reuse_detection_config" ] public_deps = [ + ":password_store_interface", ":password_form", ":sql_builder", "//base", @@ -394,6 +386,28 @@ ] } +source_set("password_store_interface") { + sources = [ + "password_store_backend_error.h", + "password_store_backend_error.cc", + "password_store_interface.h", + "password_store_change.cc", + "password_store_change.h", + "password_store_consumer.cc", + "password_store_consumer.h", + "interactions_stats.h", + "interactions_stats.cc", + "password_store_util.h", + "password_store_util.cc", + ] + deps = [ + ":password_form", + "//url", + "//base", + "//components/keyed_service/core", + ] +} + if (is_android) { # Wrap the java_cpp_enum in android_library so it can be used by both # chrome_java and modules.
diff --git a/components/password_manager/core/browser/credential_manager_pending_request_task.h b/components/password_manager/core/browser/credential_manager_pending_request_task.h index ebe5b8c..1c0aa6c 100644 --- a/components/password_manager/core/browser/credential_manager_pending_request_task.h +++ b/components/password_manager/core/browser/credential_manager_pending_request_task.h
@@ -13,6 +13,7 @@ #include "base/functional/callback_forward.h" #include "base/memory/raw_ptr.h" #include "components/password_manager/core/browser/form_fetcher.h" +#include "components/password_manager/core/browser/password_form_digest.h" #include "components/password_manager/core/common/credential_manager_types.h" #include "url/gurl.h" #include "url/origin.h"
diff --git a/components/password_manager/core/browser/form_fetcher_impl.cc b/components/password_manager/core/browser/form_fetcher_impl.cc index f14693a4..8eaac52 100644 --- a/components/password_manager/core/browser/form_fetcher_impl.cc +++ b/components/password_manager/core/browser/form_fetcher_impl.cc
@@ -306,7 +306,7 @@ void FormFetcherImpl::OnGetPasswordStoreResultsOrErrorFrom( PasswordStoreInterface* store, - FormFetcherImpl::FormsOrError results_or_error) { + LoginsResultOrError results_or_error) { // TODO(https://crbug.com/1365324): Handle errors coming from the account // store. if (store == client_->GetProfilePasswordStore()) {
diff --git a/components/password_manager/core/browser/form_fetcher_impl.h b/components/password_manager/core/browser/form_fetcher_impl.h index b632319..baa2050 100644 --- a/components/password_manager/core/browser/form_fetcher_impl.h +++ b/components/password_manager/core/browser/form_fetcher_impl.h
@@ -109,7 +109,7 @@ void OnGetSiteStatistics(std::vector<InteractionsStats> stats) override; void OnGetPasswordStoreResultsOrErrorFrom( PasswordStoreInterface* store, - FormsOrError results_or_error) override; + LoginsResultOrError results_or_error) override; // HttpPasswordStoreMigrator::Consumer: void ProcessMigratedForms(
diff --git a/components/password_manager/core/browser/form_fetcher_impl_unittest.cc b/components/password_manager/core/browser/form_fetcher_impl_unittest.cc index 7cfca1c..46a1de5 100644 --- a/components/password_manager/core/browser/form_fetcher_impl_unittest.cc +++ b/components/password_manager/core/browser/form_fetcher_impl_unittest.cc
@@ -309,8 +309,8 @@ } void DeliverPasswordStoreResults( - PasswordStoreConsumer::FormsOrError profile_store_results, - PasswordStoreConsumer::FormsOrError account_store_results) { + LoginsResultOrError profile_store_results, + LoginsResultOrError account_store_results) { store_consumer()->OnGetPasswordStoreResultsOrErrorFrom( profile_mock_store_.get(), std::move(profile_store_results)); if (account_mock_store_) {
diff --git a/components/password_manager/core/browser/interactions_stats.cc b/components/password_manager/core/browser/interactions_stats.cc new file mode 100644 index 0000000..dcd8652 --- /dev/null +++ b/components/password_manager/core/browser/interactions_stats.cc
@@ -0,0 +1,17 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/password_manager/core/browser/interactions_stats.h" + +namespace password_manager { + +bool operator==(const InteractionsStats& lhs, const InteractionsStats& rhs) { + return lhs.origin_domain == rhs.origin_domain && + lhs.username_value == rhs.username_value && + lhs.dismissal_count == rhs.dismissal_count && + lhs.update_time == rhs.update_time; +} + +} // namespace password_manager + \ No newline at end of file
diff --git a/components/password_manager/core/browser/interactions_stats.h b/components/password_manager/core/browser/interactions_stats.h new file mode 100644 index 0000000..63efa14 --- /dev/null +++ b/components/password_manager/core/browser/interactions_stats.h
@@ -0,0 +1,32 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_INTERACTIONS_STATS_H_ +#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_INTERACTIONS_STATS_H_ + +#include "base/time/time.h" +#include "url/gurl.h" + +namespace password_manager { + +// The statistics containing user interactions with a site. +struct InteractionsStats { + // The domain of the site. + GURL origin_domain; + + // The value of the username. + std::u16string username_value; + + // Number of times the user dismissed the bubble. + int dismissal_count = 0; + + // The date when the row was updated. + base::Time update_time; +}; + +bool operator==(const InteractionsStats& lhs, const InteractionsStats& rhs); + +} // namespace password_manager + +#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_INTERACTIONS_STATS_H_ \ No newline at end of file
diff --git a/components/password_manager/core/browser/mock_password_store_consumer.h b/components/password_manager/core/browser/mock_password_store_consumer.h index e08d037..34239bed 100644 --- a/components/password_manager/core/browser/mock_password_store_consumer.h +++ b/components/password_manager/core/browser/mock_password_store_consumer.h
@@ -31,7 +31,7 @@ MOCK_METHOD(void, OnGetPasswordStoreResultsOrErrorFrom, - (PasswordStoreInterface*, FormsOrError), + (PasswordStoreInterface*, LoginsResultOrError), (override)); base::WeakPtr<PasswordStoreConsumer> GetWeakPtr();
diff --git a/components/password_manager/core/browser/password_counter.cc b/components/password_manager/core/browser/password_counter.cc index cfeb86459..59fafe6 100644 --- a/components/password_manager/core/browser/password_counter.cc +++ b/components/password_manager/core/browser/password_counter.cc
@@ -31,7 +31,7 @@ void PasswordCounter::OnGetPasswordStoreResultsOrErrorFrom( PasswordStoreInterface* store, - FormsOrError results_or_error) { + LoginsResultOrError results_or_error) { if (absl::holds_alternative<password_manager::PasswordStoreBackendError>( results_or_error)) { return;
diff --git a/components/password_manager/core/browser/password_counter.h b/components/password_manager/core/browser/password_counter.h index 001675f2..6c7ac4e 100644 --- a/components/password_manager/core/browser/password_counter.h +++ b/components/password_manager/core/browser/password_counter.h
@@ -43,7 +43,7 @@ // PasswordStoreConsumer: void OnGetPasswordStoreResultsOrErrorFrom( PasswordStoreInterface* store, - FormsOrError results_or_error) override; + LoginsResultOrError results_or_error) override; // PasswordStoreInterface::Observer: void OnLoginsChanged(PasswordStoreInterface* store,
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc index 3a4e79154..b2e6dc0 100644 --- a/components/password_manager/core/browser/password_manager.cc +++ b/components/password_manager/core/browser/password_manager.cc
@@ -306,7 +306,6 @@ registry->RegisterBooleanPref(prefs::kOfferToSavePasswordsEnabledGMS, true); registry->RegisterBooleanPref(prefs::kSavePasswordsSuspendedByError, false); registry->RegisterBooleanPref(prefs::kAutoSignInEnabledGMS, true); - registry->RegisterBooleanPref(prefs::kSettingsMigratedToUPM, false); registry->RegisterBooleanPref(prefs::kSettingsMigratedToUPMLocal, false); registry->RegisterIntegerPref( prefs::kCurrentMigrationVersionToGoogleMobileServices, 0);
diff --git a/components/password_manager/core/browser/password_manager_eviction_util.cc b/components/password_manager/core/browser/password_manager_eviction_util.cc index c413cd4..f3c1a91 100644 --- a/components/password_manager/core/browser/password_manager_eviction_util.cc +++ b/components/password_manager/core/browser/password_manager_eviction_util.cc
@@ -42,7 +42,6 @@ password_manager::prefs::kCurrentMigrationVersionToGoogleMobileServices, 0); prefs->SetDouble(password_manager::prefs::kTimeOfLastMigrationAttempt, 0.0); - prefs->SetBoolean(password_manager::prefs::kSettingsMigratedToUPM, false); base::UmaHistogramBoolean("PasswordManager.UnenrolledFromUPMDueToErrors", true);
diff --git a/components/password_manager/core/browser/password_manager_eviction_util_unittest.cc b/components/password_manager/core/browser/password_manager_eviction_util_unittest.cc index 88bf4754..fb844dd1 100644 --- a/components/password_manager/core/browser/password_manager_eviction_util_unittest.cc +++ b/components/password_manager/core/browser/password_manager_eviction_util_unittest.cc
@@ -67,8 +67,6 @@ 0); test_pref_service_.registry()->RegisterDoublePref( password_manager::prefs::kTimeOfLastMigrationAttempt, 0.0); - test_pref_service_.registry()->RegisterBooleanPref( - password_manager::prefs::kSettingsMigratedToUPM, false); } PasswordManagerEvictionUtilTest::~PasswordManagerEvictionUtilTest() = default; @@ -79,8 +77,6 @@ 1); pref_service()->SetDouble( password_manager::prefs::kTimeOfLastMigrationAttempt, 20.22); - pref_service()->SetBoolean(password_manager::prefs::kSettingsMigratedToUPM, - true); base::HistogramTester histogram_tester; @@ -101,8 +97,6 @@ EXPECT_EQ(pref_service()->GetDouble( password_manager::prefs::kTimeOfLastMigrationAttempt), 0.0); - EXPECT_FALSE(pref_service()->GetBoolean( - password_manager::prefs::kSettingsMigratedToUPM)); histogram_tester.ExpectUniqueSample(kUnenrollmentHistogram, true, 1); histogram_tester.ExpectUniqueSample(kUnenrollmentReasonHistogram,
diff --git a/components/password_manager/core/browser/password_store_backend.h b/components/password_manager/core/browser/password_store_backend.h index 249baad..81236016b 100644 --- a/components/password_manager/core/browser/password_store_backend.h +++ b/components/password_manager/core/browser/password_store_backend.h
@@ -10,7 +10,7 @@ #include "base/functional/callback_forward.h" #include "base/memory/weak_ptr.h" #include "components/password_manager/core/browser/password_form_digest.h" -#include "components/password_manager/core/browser/password_store_backend_error.h" +#include "components/password_manager/core/browser/password_store_consumer.h" #include "components/password_manager/core/browser/password_store_change.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -28,17 +28,9 @@ class AffiliatedMatchHelper; class SmartBubbleStatsStore; -using LoginsResult = std::vector<std::unique_ptr<PasswordForm>>; using LoginsReply = base::OnceCallback<void(LoginsResult)>; - -using PasswordChanges = absl::optional<PasswordStoreChangeList>; -using PasswordChangesOrError = - absl::variant<PasswordChanges, PasswordStoreBackendError>; using PasswordChangesOrErrorReply = base::OnceCallback<void(PasswordChangesOrError)>; - -using LoginsResultOrError = - absl::variant<LoginsResult, PasswordStoreBackendError>; using LoginsOrErrorReply = base::OnceCallback<void(LoginsResultOrError)>; // The backend is used by the `PasswordStore` to interact with the storage in a
diff --git a/components/password_manager/core/browser/password_store_change.h b/components/password_manager/core/browser/password_store_change.h index 37b8a0b..53f61aae 100644 --- a/components/password_manager/core/browser/password_store_change.h +++ b/components/password_manager/core/browser/password_store_change.h
@@ -9,6 +9,8 @@ #include <vector> #include "components/password_manager/core/browser/password_form.h" +#include "components/password_manager/core/browser/password_store_backend_error.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace password_manager { @@ -50,7 +52,10 @@ InsecureCredentialsChanged insecure_credentials_changed_{false}; }; -typedef std::vector<PasswordStoreChange> PasswordStoreChangeList; +using PasswordStoreChangeList = std::vector<PasswordStoreChange>; +using PasswordChanges = absl::optional<PasswordStoreChangeList>; +using PasswordChangesOrError = + absl::variant<PasswordChanges, PasswordStoreBackendError>; // For testing. #if defined(UNIT_TEST)
diff --git a/components/password_manager/core/browser/password_store_consumer.cc b/components/password_manager/core/browser/password_store_consumer.cc index 3ada7e3..53189fd 100644 --- a/components/password_manager/core/browser/password_store_consumer.cc +++ b/components/password_manager/core/browser/password_store_consumer.cc
@@ -7,7 +7,7 @@ #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/password_store_interface.h" #include "components/password_manager/core/browser/password_store_util.h" -#include "components/password_manager/core/browser/statistics_table.h" +#include "components/password_manager/core/browser/interactions_stats.h" namespace password_manager { @@ -23,7 +23,7 @@ void PasswordStoreConsumer::OnGetPasswordStoreResultsOrErrorFrom( PasswordStoreInterface* store, - FormsOrError results_or_error) { + LoginsResultOrError results_or_error) { OnGetPasswordStoreResultsFrom(store, password_manager::GetLoginsOrEmptyListOnFailure( std::move(results_or_error)));
diff --git a/components/password_manager/core/browser/password_store_consumer.h b/components/password_manager/core/browser/password_store_consumer.h index 63d1e24..735633a9 100644 --- a/components/password_manager/core/browser/password_store_consumer.h +++ b/components/password_manager/core/browser/password_store_consumer.h
@@ -19,6 +19,10 @@ struct PasswordForm; class PasswordStoreInterface; +using LoginsResult = std::vector<std::unique_ptr<PasswordForm>>; +using LoginsResultOrError = + absl::variant<LoginsResult, PasswordStoreBackendError>; + // Reads from the PasswordStoreInterface are done asynchronously on a separate // thread. PasswordStoreConsumer provides the virtual callback method, which is // guaranteed to be executed on this (the UI) thread. It also provides the @@ -27,8 +31,6 @@ class PasswordStoreConsumer { public: // TODO(crbug.com/1361990): Use base::expected instead of absl::variant. - using FormsOrError = absl::variant<std::vector<std::unique_ptr<PasswordForm>>, - PasswordStoreBackendError>; PasswordStoreConsumer(); // Called when `GetLogins()` request is finished, with a vector of forms or @@ -38,7 +40,7 @@ // between the profile-scoped and account-scoped password stores. virtual void OnGetPasswordStoreResultsOrErrorFrom( PasswordStoreInterface* store, - FormsOrError results_or_error); + LoginsResultOrError results_or_error); // Called when the GetSiteStats() request is finished, with the associated // site statistics. @@ -58,7 +60,7 @@ // TODO(crbug.com/1360343): Remove when the `FormsOrError` version is // implemented by all consumers. virtual void OnGetPasswordStoreResults( - std::vector<std::unique_ptr<PasswordForm>> results); + LoginsResult results); // Like OnGetPasswordStoreResults(), but also receives the originating // PasswordStoreInterface as a parameter. This is useful for consumers that @@ -69,7 +71,7 @@ // implemented by all consumers. virtual void OnGetPasswordStoreResultsFrom( PasswordStoreInterface* store, - std::vector<std::unique_ptr<PasswordForm>> results); + LoginsResult results); private: base::CancelableTaskTracker cancelable_task_tracker_;
diff --git a/components/password_manager/core/browser/password_store_consumer_unittest.cc b/components/password_manager/core/browser/password_store_consumer_unittest.cc index 206721a..ceb921c 100644 --- a/components/password_manager/core/browser/password_store_consumer_unittest.cc +++ b/components/password_manager/core/browser/password_store_consumer_unittest.cc
@@ -49,7 +49,7 @@ ON_CALL(consumer, OnGetPasswordStoreResultsOrErrorFrom) .WillByDefault( [&consumer](PasswordStoreInterface* store, - PasswordStoreConsumer::FormsOrError forms_or_error) { + LoginsResultOrError forms_or_error) { return consumer .PasswordStoreConsumer::OnGetPasswordStoreResultsOrErrorFrom( store, std::move(forms_or_error)); @@ -75,7 +75,7 @@ ON_CALL(consumer, OnGetPasswordStoreResultsOrErrorFrom) .WillByDefault( [&consumer](PasswordStoreInterface* store, - PasswordStoreConsumer::FormsOrError forms_or_error) { + LoginsResultOrError forms_or_error) { return consumer .PasswordStoreConsumer::OnGetPasswordStoreResultsOrErrorFrom( store, std::move(forms_or_error));
diff --git a/components/password_manager/core/browser/password_store_util.cc b/components/password_manager/core/browser/password_store_util.cc index ac30a461..0516e47 100644 --- a/components/password_manager/core/browser/password_store_util.cc +++ b/components/password_manager/core/browser/password_store_util.cc
@@ -5,9 +5,6 @@ #include "components/password_manager/core/browser/password_store_util.h" #include "base/ranges/algorithm.h" -#include "components/password_manager/core/browser/password_store_backend.h" -#include "components/password_manager/core/browser/password_store_backend_error.h" -#include "components/password_manager/core/browser/password_store_change.h" namespace password_manager {
diff --git a/components/password_manager/core/browser/password_store_util.h b/components/password_manager/core/browser/password_store_util.h index e3c8075..945586c3 100644 --- a/components/password_manager/core/browser/password_store_util.h +++ b/components/password_manager/core/browser/password_store_util.h
@@ -7,8 +7,8 @@ #include <vector> -#include "components/password_manager/core/browser/password_store_backend.h" #include "components/password_manager/core/browser/password_store_change.h" +#include "components/password_manager/core/browser/password_store_consumer.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace password_manager {
diff --git a/components/password_manager/core/browser/statistics_table.cc b/components/password_manager/core/browser/statistics_table.cc index a6c6820a9..d918dd7 100644 --- a/components/password_manager/core/browser/statistics_table.cc +++ b/components/password_manager/core/browser/statistics_table.cc
@@ -40,13 +40,6 @@ } // namespace -bool operator==(const InteractionsStats& lhs, const InteractionsStats& rhs) { - return lhs.origin_domain == rhs.origin_domain && - lhs.username_value == rhs.username_value && - lhs.dismissal_count == rhs.dismissal_count && - lhs.update_time == rhs.update_time; -} - StatisticsTable::StatisticsTable() = default; StatisticsTable::~StatisticsTable() = default;
diff --git a/components/password_manager/core/browser/statistics_table.h b/components/password_manager/core/browser/statistics_table.h index cc45ee0..7b4a41e 100644 --- a/components/password_manager/core/browser/statistics_table.h +++ b/components/password_manager/core/browser/statistics_table.h
@@ -10,8 +10,7 @@ #include "base/functional/callback_forward.h" #include "base/memory/raw_ptr.h" -#include "base/time/time.h" -#include "url/gurl.h" +#include "components/password_manager/core/browser/interactions_stats.h" namespace sql { class Database; @@ -19,23 +18,6 @@ namespace password_manager { -// The statistics containing user interactions with a site. -struct InteractionsStats { - // The domain of the site. - GURL origin_domain; - - // The value of the username. - std::u16string username_value; - - // Number of times the user dismissed the bubble. - int dismissal_count = 0; - - // The date when the row was updated. - base::Time update_time; -}; - -bool operator==(const InteractionsStats& lhs, const InteractionsStats& rhs); - // Represents the 'stats' table in the Login Database. class StatisticsTable { public:
diff --git a/components/password_manager/core/common/password_manager_pref_names.cc b/components/password_manager/core/common/password_manager_pref_names.cc index cd252119..875e8c0 100644 --- a/components/password_manager/core/common/password_manager_pref_names.cc +++ b/components/password_manager/core/common/password_manager_pref_names.cc
@@ -23,7 +23,6 @@ "profile.save_passwords_enabed_gms"; const char kSavePasswordsSuspendedByError[] = "profile.save_passwords_suspended_by_error"; -const char kSettingsMigratedToUPM[] = "profile.settings_migrated_to_upm"; const char kSettingsMigratedToUPMLocal[] = "profile.settings_migrated_to_upm_local";
diff --git a/components/password_manager/core/common/password_manager_pref_names.h b/components/password_manager/core/common/password_manager_pref_names.h index 29cfcf8..63fc982 100644 --- a/components/password_manager/core/common/password_manager_pref_names.h +++ b/components/password_manager/core/common/password_manager_pref_names.h
@@ -65,10 +65,6 @@ // can only be stricter than any policy applied extern const char kSavePasswordsSuspendedByError[]; -// Boolean value indicating whether the regular prefs were migrated to UPM -// settings for syncing users. -extern const char kSettingsMigratedToUPM[]; - // Boolean value indicating whether the regular prefs that apply to the local // password store were migrated to UPM settings. It will be set to true // automatically if there is nothing to migrate.
diff --git a/components/payments/content/payment_request_web_contents_manager_unittest.cc b/components/payments/content/payment_request_web_contents_manager_unittest.cc index 76150c5..ecfbb2ed 100644 --- a/components/payments/content/payment_request_web_contents_manager_unittest.cc +++ b/components/payments/content/payment_request_web_contents_manager_unittest.cc
@@ -111,6 +111,16 @@ manager_->RecordActivationlessShow(); ASSERT_TRUE(manager_->HadActivationlessShow()); + // A browser reload should not reset the activationless show state. + { + auto navigation_simulator = + content::NavigationSimulator::CreateBrowserInitiated( + GURL("http://example2.test"), web_contents()); + navigation_simulator->Start(); + navigation_simulator->Commit(); + ASSERT_TRUE(manager_->HadActivationlessShow()); + } + // A browser initiated navigation should reset the activationless show state. { auto navigation_simulator =
diff --git a/components/performance_manager/DEPS b/components/performance_manager/DEPS index 8a30e578..12b4f1e 100644 --- a/components/performance_manager/DEPS +++ b/components/performance_manager/DEPS
@@ -17,6 +17,7 @@ "+services/metrics/public/cpp", "+services/resource_coordinator/public/cpp/memory_instrumentation", "+services/service_manager/public/cpp", + "+third_party/blink/public/common/associated_interfaces/associated_interface_provider.h", "+third_party/blink/public/common/features.h", "+third_party/blink/public/common/storage_key/storage_key.h", "+third_party/blink/public/common/tokens",
diff --git a/components/performance_manager/service_worker_context_adapter.cc b/components/performance_manager/service_worker_context_adapter.cc index 95c357e6..0790e9d 100644 --- a/components/performance_manager/service_worker_context_adapter.cc +++ b/components/performance_manager/service_worker_context_adapter.cc
@@ -13,6 +13,7 @@ #include "base/task/single_thread_task_runner.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host_observer.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" namespace performance_manager { @@ -221,10 +222,13 @@ service_manager::InterfaceProvider& ServiceWorkerContextAdapter::GetRemoteInterfaces( int64_t service_worker_version_id) { - NOTIMPLEMENTED(); - static base::NoDestructor<service_manager::InterfaceProvider> - interface_provider(base::SingleThreadTaskRunner::GetCurrentDefault()); - return *interface_provider; + NOTREACHED_NORETURN(); +} + +blink::AssociatedInterfaceProvider& +ServiceWorkerContextAdapter::GetRemoteAssociatedInterfaces( + int64_t service_worker_version_id) { + NOTREACHED_NORETURN(); } void ServiceWorkerContextAdapter::StartServiceWorkerAndDispatchMessage(
diff --git a/components/performance_manager/service_worker_context_adapter.h b/components/performance_manager/service_worker_context_adapter.h index da3f83fc..b230f82 100644 --- a/components/performance_manager/service_worker_context_adapter.h +++ b/components/performance_manager/service_worker_context_adapter.h
@@ -104,6 +104,8 @@ bool IsLiveRunningServiceWorker(int64_t service_worker_version_id) override; service_manager::InterfaceProvider& GetRemoteInterfaces( int64_t service_worker_version_id) override; + blink::AssociatedInterfaceProvider& GetRemoteAssociatedInterfaces( + int64_t service_worker_version_id) override; // content::ServiceWorkerContextObserver: void OnRegistrationCompleted(const GURL& scope) override;
diff --git a/components/plus_addresses/plus_address_client.cc b/components/plus_addresses/plus_address_client.cc index 281613d..3b5f229 100644 --- a/components/plus_addresses/plus_address_client.cc +++ b/components/plus_addresses/plus_address_client.cc
@@ -9,6 +9,7 @@ #include "base/sequence_checker.h" #include "base/strings/strcat.h" #include "components/plus_addresses/features.h" +#include "components/plus_addresses/plus_address_metrics.h" #include "components/plus_addresses/plus_address_parser.h" #include "components/plus_addresses/plus_address_types.h" #include "components/signin/public/base/consent_level.h" @@ -19,6 +20,7 @@ #include "services/network/public/cpp/resource_request.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/simple_url_loader.h" +#include "services/network/public/mojom/url_response_head.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" @@ -212,6 +214,7 @@ base::Unretained(this), loaders_for_creation_.insert(loaders_for_creation_.begin(), std::move(loader)), + PlusAddressNetworkRequestType::kGetOrCreate, clock_->Now(), std::move(callback)), network::SimpleURLLoader::kMaxBoundedStringDownloadSize); } @@ -258,6 +261,7 @@ base::Unretained(this), loaders_for_creation_.insert(loaders_for_creation_.begin(), std::move(loader)), + PlusAddressNetworkRequestType::kReserve, clock_->Now(), std::move(callback)), network::SimpleURLLoader::kMaxBoundedStringDownloadSize); } @@ -306,6 +310,7 @@ base::Unretained(this), loaders_for_creation_.insert(loaders_for_creation_.begin(), std::move(loader)), + PlusAddressNetworkRequestType::kCreate, clock_->Now(), std::move(callback)), network::SimpleURLLoader::kMaxBoundedStringDownloadSize); } @@ -344,22 +349,33 @@ url_loader_factory_.get(), base::BindOnce(&PlusAddressClient::OnGetAllPlusAddressesComplete, // Safe since this class owns the loader_for_sync_. - base::Unretained(this), std::move(callback)), + base::Unretained(this), clock_->Now(), + std::move(callback)), // TODO(b/301984623) - Measure average downloadsize and change this. network::SimpleURLLoader::kMaxBoundedStringDownloadSize); } void PlusAddressClient::OnCreateOrReservePlusAddressComplete( UrlLoaderList::iterator it, + PlusAddressNetworkRequestType type, + base::Time request_start, PlusAddressCallback callback, std::unique_ptr<std::string> response) { - // TODO (b/301071850): Add metrics to measure error or healthy request here - // with SimpleUrlLoader::NetError(). + // Record relevant metrics. + std::unique_ptr<network::SimpleURLLoader> loader = std::move(*it); + PlusAddressMetrics::RecordNetworkRequestLatency( + type, clock_->Now() - request_start); + if (loader && loader->ResponseInfo() && loader->ResponseInfo()->headers) { + PlusAddressMetrics::RecordNetworkRequestResponseCode( + type, loader->ResponseInfo()->headers->response_code()); + } + // Destroy the loader before returning. loaders_for_creation_.erase(it); if (!response) { - // The request has failed. return; } + PlusAddressMetrics::RecordNetworkRequestResponseSize(type, response->size()); + // Parse the response & return it via callback. data_decoder::DataDecoder::ParseJsonIsolated( *response, base::BindOnce(&PlusAddressParser::ParsePlusAddressFromV1Create) @@ -374,16 +390,26 @@ } void PlusAddressClient::OnGetAllPlusAddressesComplete( + base::Time request_start, PlusAddressMapCallback callback, std::unique_ptr<std::string> response) { - // TODO (b/301071850): Add metrics to measure error or healthy request here - // with SimpleUrlLoader::NetError(). + // Record relevant metrics. + PlusAddressMetrics::RecordNetworkRequestLatency( + PlusAddressNetworkRequestType::kList, clock_->Now() - request_start); + if (loader_for_sync_ && loader_for_sync_->ResponseInfo() && + loader_for_sync_->ResponseInfo()->headers) { + PlusAddressMetrics::RecordNetworkRequestResponseCode( + PlusAddressNetworkRequestType::kList, + loader_for_sync_->ResponseInfo()->headers->response_code()); + } + // Destroy the loader before returning. loader_for_sync_.reset(); if (!response) { - // The request has failed. return; } - + PlusAddressMetrics::RecordNetworkRequestResponseSize( + PlusAddressNetworkRequestType::kList, response->size()); + // Parse the response & return it via callback. data_decoder::DataDecoder::ParseJsonIsolated( *response, base::BindOnce(&PlusAddressParser::ParsePlusAddressMapFromV1List) @@ -432,6 +458,7 @@ signin::AccessTokenInfo access_token_info) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); access_token_fetcher_.reset(); + PlusAddressMetrics::RecordNetworkRequestOauthError(error); if (error.state() == GoogleServiceAuthError::NONE) { access_token_info_ = access_token_info; // Run stored callbacks. @@ -441,7 +468,6 @@ } } else { access_token_request_error_ = error; - // TODO (kaklilu): Replace this log with Histogram of OAuth errors. VLOG(1) << "PlusAddressClient failed to get OAuth token:" << error.ToString(); }
diff --git a/components/plus_addresses/plus_address_client.h b/components/plus_addresses/plus_address_client.h index 4dfd6e5..a4d2b37a 100644 --- a/components/plus_addresses/plus_address_client.h +++ b/components/plus_addresses/plus_address_client.h
@@ -97,9 +97,12 @@ // they all use `loaders_for_creation_` and have the same return type. void OnCreateOrReservePlusAddressComplete( UrlLoaderList::iterator it, + PlusAddressNetworkRequestType type, + base::Time request_start, PlusAddressCallback callback, std::unique_ptr<std::string> response); - void OnGetAllPlusAddressesComplete(PlusAddressMapCallback callback, + void OnGetAllPlusAddressesComplete(base::Time request_start, + PlusAddressMapCallback callback, std::unique_ptr<std::string> response); // Initiates a network request for an OAuth token, and may only be // called by GetAuthToken. This also must be run on the UI thread.
diff --git a/components/plus_addresses/plus_address_client_unittest.cc b/components/plus_addresses/plus_address_client_unittest.cc index 7e0b757c..5ecc91f 100644 --- a/components/plus_addresses/plus_address_client_unittest.cc +++ b/components/plus_addresses/plus_address_client_unittest.cc
@@ -9,30 +9,51 @@ #include "base/strings/strcat.h" #include "base/test/bind.h" #include "base/test/gtest_util.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_clock.h" #include "base/test/task_environment.h" #include "base/time/time.h" #include "components/plus_addresses/features.h" +#include "components/plus_addresses/plus_address_metrics.h" #include "components/signin/public/base/consent_level.h" #include "components/signin/public/identity_manager/identity_test_environment.h" #include "components/signin/public/identity_manager/scope_set.h" -#include "services/data_decoder/public/cpp/data_decoder.h" #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" #include "services/network/public/cpp/resource_request.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/public/mojom/url_response_head.mojom.h" #include "services/network/test/test_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" #include "third_party/abseil-cpp/absl/types/optional.h" -#include "url/gurl.h" namespace plus_addresses { +namespace { +std::string LatencyHistogramFor(PlusAddressNetworkRequestType type) { + return base::ReplaceStringPlaceholders( + "Autofill.PlusAddresses.NetworkRequest.$1.Latency", + {PlusAddressMetrics::PlusAddressNetworkRequestTypeToString(type)}, + /*offsets=*/nullptr); +} +std::string ResponseCodeHistogramFor(PlusAddressNetworkRequestType type) { + return base::ReplaceStringPlaceholders( + "Autofill.PlusAddresses.NetworkRequest.$1.ResponseCode", + {PlusAddressMetrics::PlusAddressNetworkRequestTypeToString(type)}, + /*offsets=*/nullptr); +} +std::string ResponseByteSizeHistogramFor(PlusAddressNetworkRequestType type) { + return base::ReplaceStringPlaceholders( + "Autofill.PlusAddresses.NetworkRequest.$1.ResponseByteSize", + {PlusAddressMetrics::PlusAddressNetworkRequestTypeToString(type)}, + /*offsets=*/nullptr); +} +constexpr char kPlusAddressOauthErrorHistogram[] = + "Autofill.PlusAddresses.NetworkRequest.OauthError"; +} // namespace // Tests that use fake out the URL loading and issues requests to the enterprise // provided server. @@ -47,39 +68,50 @@ [&](const network::ResourceRequest& request) { last_request = request; })); - features_.InitAndEnableFeatureWithParameters( kFeature, {{kEnterprisePlusAddressServerUrl.name, server_base_url}, {kEnterprisePlusAddressOAuthScope.name, test_scope}}); + clock_.SetNow(start_time); } protected: + void AdvanceTimeTo(base::Time now) { + ASSERT_GE(now, clock_.Now()); + clock_.SetNow(now); + } + + base::Clock* test_clock() { return &clock_; } + // Not used directly, but required for `IdentityTestEnvironment` to work. base::test::TaskEnvironment task_environment; std::string server_base_url = "https://enterprise.foo/"; std::string test_scope = "scope"; - std::string fullProfileEndpoint = base::StrCat({server_base_url, kServerPlusProfileEndpoint}); std::string fullReserveEndpoint = base::StrCat({server_base_url, kServerReservePlusAddressEndpoint}); std::string fullConfirmEndpoint = base::StrCat({server_base_url, kServerCreatePlusAddressEndpoint}); - std::string token = "myToken"; signin::AccessTokenInfo eternal_token_info = signin::AccessTokenInfo(token, base::Time::Max(), ""); + // Issue all requests starting at this time to test the latency metrics. + base::Time start_time = base::Time::FromDoubleT(1); + + scoped_refptr<network::SharedURLLoaderFactory> + scoped_shared_url_loader_factory; network::TestURLLoaderFactory test_url_loader_factory; network::ResourceRequest last_request; signin::IdentityTestEnvironment identity_test_env; - scoped_refptr<network::SharedURLLoaderFactory> - scoped_shared_url_loader_factory; raw_ptr<signin::IdentityManager> identity_manager; + base::HistogramTester histogram_tester; + private: base::test::ScopedFeatureList features_; + base::SimpleTestClock clock_; data_decoder::test::InProcessDataDecoder decoder_; }; @@ -154,6 +186,7 @@ TEST_F(PlusAddressClientRequests, CreatePlusAddressV1_RunsCallbackOnSuccess) { PlusAddressClient client(identity_manager, scoped_shared_url_loader_factory); client.SetAccessTokenInfoForTesting(eternal_token_info); + client.SetClockForTesting(test_clock()); std::string site = "https://foobar.com"; base::MockOnceCallback<void(const std::string&)> on_response_parsed; @@ -161,8 +194,10 @@ client.CreatePlusAddress(site, on_response_parsed.Get()); // Fulfill the request and the callback should be run EXPECT_CALL(on_response_parsed, Run("plusone@plus.plus")).Times(1); - test_url_loader_factory.SimulateResponseForPendingRequest(fullProfileEndpoint, - R"( + + base::TimeDelta latency = base::Milliseconds(2400); + AdvanceTimeTo(start_time + latency); + const std::string json = R"( { "plusProfile": { "unwanted": 123, @@ -173,7 +208,20 @@ }, "unwanted": "abc" } - )"); + )"; + test_url_loader_factory.SimulateResponseForPendingRequest(fullProfileEndpoint, + json); + + // Verify expected metrics. + histogram_tester.ExpectUniqueTimeSample( + LatencyHistogramFor(PlusAddressNetworkRequestType::kGetOrCreate), latency, + 1); + histogram_tester.ExpectUniqueSample( + ResponseCodeHistogramFor(PlusAddressNetworkRequestType::kGetOrCreate), + 200, 1); + histogram_tester.ExpectUniqueSample( + ResponseByteSizeHistogramFor(PlusAddressNetworkRequestType::kGetOrCreate), + json.size(), 1); } // TODO (kaklilu): Add tests verifying behavior when request times out or the @@ -182,6 +230,7 @@ CreatePlusAddressV1_FailedRequestDoesntRunCallback) { PlusAddressClient client(identity_manager, scoped_shared_url_loader_factory); client.SetAccessTokenInfoForTesting(eternal_token_info); + client.SetClockForTesting(test_clock()); std::string site = "https://foobar.com"; base::MockOnceCallback<void(const std::string&)> on_response_parsed; @@ -190,10 +239,20 @@ // The request fails and the callback is never run EXPECT_CALL(on_response_parsed, Run).Times(0); + base::TimeDelta latency = base::Milliseconds(2400); + AdvanceTimeTo(start_time + latency); EXPECT_TRUE(test_url_loader_factory.SimulateResponseForPendingRequest( - GURL(fullProfileEndpoint), - network::URLLoaderCompletionStatus(net::HTTP_NOT_FOUND), - network::CreateURLResponseHead(net::HTTP_NOT_FOUND), "")); + fullProfileEndpoint, "", net::HTTP_NOT_FOUND)); + // Verify expected metrics. + histogram_tester.ExpectUniqueTimeSample( + LatencyHistogramFor(PlusAddressNetworkRequestType::kGetOrCreate), latency, + 1); + histogram_tester.ExpectUniqueSample( + ResponseCodeHistogramFor(PlusAddressNetworkRequestType::kGetOrCreate), + net::HTTP_NOT_FOUND, 1); + histogram_tester.ExpectTotalCount( + ResponseByteSizeHistogramFor(PlusAddressNetworkRequestType::kGetOrCreate), + 0); } TEST_F(PlusAddressClientRequests, @@ -307,6 +366,7 @@ TEST_F(PlusAddressClientRequests, ReservePlusAddress_RunsCallbackOnSuccess) { PlusAddressClient client(identity_manager, scoped_shared_url_loader_factory); client.SetAccessTokenInfoForTesting(eternal_token_info); + client.SetClockForTesting(test_clock()); std::string site = "https://foobar.com"; base::MockOnceCallback<void(const std::string&)> on_response_parsed; @@ -314,8 +374,9 @@ client.ReservePlusAddress(site, on_response_parsed.Get()); // Fulfill the request and the callback should be run EXPECT_CALL(on_response_parsed, Run("plusone@plus.plus")).Times(1); - test_url_loader_factory.SimulateResponseForPendingRequest(fullReserveEndpoint, - R"( + base::TimeDelta latency = base::Milliseconds(2400); + AdvanceTimeTo(start_time + latency); + const std::string json = R"( { "plusProfile": { "unwanted": 123, @@ -326,13 +387,26 @@ }, "unwanted": "abc" } - )"); + )"; + test_url_loader_factory.SimulateResponseForPendingRequest(fullReserveEndpoint, + json); + + // Verify expected metrics. + histogram_tester.ExpectUniqueTimeSample( + LatencyHistogramFor(PlusAddressNetworkRequestType::kReserve), latency, 1); + histogram_tester.ExpectUniqueSample( + ResponseCodeHistogramFor(PlusAddressNetworkRequestType::kReserve), 200, + 1); + histogram_tester.ExpectUniqueSample( + ResponseByteSizeHistogramFor(PlusAddressNetworkRequestType::kReserve), + json.size(), 1); } TEST_F(PlusAddressClientRequests, ReservePlusAddress_FailedRequestDoesntRunCallback) { PlusAddressClient client(identity_manager, scoped_shared_url_loader_factory); client.SetAccessTokenInfoForTesting(eternal_token_info); + client.SetClockForTesting(test_clock()); std::string site = "https://foobar.com"; base::MockOnceCallback<void(const std::string&)> on_response_parsed; @@ -341,10 +415,18 @@ // The request fails and the callback is never run EXPECT_CALL(on_response_parsed, Run).Times(0); + base::TimeDelta latency = base::Milliseconds(2400); + AdvanceTimeTo(start_time + latency); EXPECT_TRUE(test_url_loader_factory.SimulateResponseForPendingRequest( - GURL(fullReserveEndpoint), - network::URLLoaderCompletionStatus(net::HTTP_NOT_FOUND), - network::CreateURLResponseHead(net::HTTP_NOT_FOUND), "")); + fullReserveEndpoint, "", net::HTTP_NOT_FOUND)); + // Verify expected metrics. + histogram_tester.ExpectUniqueTimeSample( + LatencyHistogramFor(PlusAddressNetworkRequestType::kReserve), latency, 1); + histogram_tester.ExpectUniqueSample( + ResponseCodeHistogramFor(PlusAddressNetworkRequestType::kReserve), + net::HTTP_NOT_FOUND, 1); + histogram_tester.ExpectTotalCount( + ResponseByteSizeHistogramFor(PlusAddressNetworkRequestType::kReserve), 0); } // Ensures the request sent by Chrome matches what we intended. @@ -417,6 +499,7 @@ TEST_F(PlusAddressClientRequests, ConfirmPlusAddress_RunsCallbackOnSuccess) { PlusAddressClient client(identity_manager, scoped_shared_url_loader_factory); client.SetAccessTokenInfoForTesting(eternal_token_info); + client.SetClockForTesting(test_clock()); std::string site = "https://foobar.com"; std::string plus_address = "plus@plus.plus"; @@ -425,8 +508,9 @@ client.ConfirmPlusAddress(site, plus_address, on_response_parsed.Get()); // Fulfill the request and the callback should be run EXPECT_CALL(on_response_parsed, Run(plus_address)).Times(1); - test_url_loader_factory.SimulateResponseForPendingRequest(fullConfirmEndpoint, - R"( + base::TimeDelta latency = base::Milliseconds(2400); + AdvanceTimeTo(start_time + latency); + const std::string json = R"( { "plusProfile": { "unwanted": 123, @@ -437,13 +521,25 @@ }, "unwanted": "abc" } - )"); + )"; + test_url_loader_factory.SimulateResponseForPendingRequest(fullConfirmEndpoint, + json); + + // Verify expected metrics. + histogram_tester.ExpectUniqueTimeSample( + LatencyHistogramFor(PlusAddressNetworkRequestType::kCreate), latency, 1); + histogram_tester.ExpectUniqueSample( + ResponseCodeHistogramFor(PlusAddressNetworkRequestType::kCreate), 200, 1); + histogram_tester.ExpectUniqueSample( + ResponseByteSizeHistogramFor(PlusAddressNetworkRequestType::kCreate), + json.size(), 1); } TEST_F(PlusAddressClientRequests, ConfirmPlusAddress_FailedRequestDoesntRunCallback) { PlusAddressClient client(identity_manager, scoped_shared_url_loader_factory); client.SetAccessTokenInfoForTesting(eternal_token_info); + client.SetClockForTesting(test_clock()); std::string site = "https://foobar.com"; std::string plus_address = "plus@plus.plus"; @@ -453,10 +549,18 @@ // The request fails and the callback is never run EXPECT_CALL(on_response_parsed, Run).Times(0); + base::TimeDelta latency = base::Milliseconds(2400); + AdvanceTimeTo(start_time + latency); EXPECT_TRUE(test_url_loader_factory.SimulateResponseForPendingRequest( - GURL(fullConfirmEndpoint), - network::URLLoaderCompletionStatus(net::HTTP_NOT_FOUND), - network::CreateURLResponseHead(net::HTTP_NOT_FOUND), "")); + fullConfirmEndpoint, "", net::HTTP_NOT_FOUND)); + // Verify expected metrics. + histogram_tester.ExpectUniqueTimeSample( + LatencyHistogramFor(PlusAddressNetworkRequestType::kCreate), latency, 1); + histogram_tester.ExpectUniqueSample( + ResponseCodeHistogramFor(PlusAddressNetworkRequestType::kCreate), + net::HTTP_NOT_FOUND, 1); + histogram_tester.ExpectTotalCount( + ResponseByteSizeHistogramFor(PlusAddressNetworkRequestType::kCreate), 0); } // Ensures the request sent by Chrome matches what we intended. @@ -516,6 +620,7 @@ TEST_F(PlusAddressClientRequests, GetAllPlusAddressesV1_RunsCallbackOnSuccess) { PlusAddressClient client(identity_manager, scoped_shared_url_loader_factory); client.SetAccessTokenInfoForTesting(eternal_token_info); + client.SetClockForTesting(test_clock()); base::MockOnceCallback<void(const PlusAddressMap&)> on_response_parsed; // Initiate a request... @@ -524,8 +629,9 @@ {"netflix.com", "plusplustwo@plus.plus"}}); // Fulfill the request and the callback should be run EXPECT_CALL(on_response_parsed, Run(expected)).Times(1); - test_url_loader_factory.SimulateResponseForPendingRequest(fullProfileEndpoint, - R"( + base::TimeDelta latency = base::Milliseconds(2400); + AdvanceTimeTo(start_time + latency); + const std::string json = R"( { "plusProfiles": [ { @@ -544,13 +650,24 @@ ], "unwanted": "abc" } - )"); + )"; + test_url_loader_factory.SimulateResponseForPendingRequest(fullProfileEndpoint, + json); + // Verify expected metrics. + histogram_tester.ExpectUniqueTimeSample( + LatencyHistogramFor(PlusAddressNetworkRequestType::kList), latency, 1); + histogram_tester.ExpectUniqueSample( + ResponseCodeHistogramFor(PlusAddressNetworkRequestType::kList), 200, 1); + histogram_tester.ExpectUniqueSample( + ResponseByteSizeHistogramFor(PlusAddressNetworkRequestType::kList), + json.size(), 1); } TEST_F(PlusAddressClientRequests, GetAllPlusAddressesV1_FailedRequestDoesntRunCallback) { PlusAddressClient client(identity_manager, scoped_shared_url_loader_factory); client.SetAccessTokenInfoForTesting(eternal_token_info); + client.SetClockForTesting(test_clock()); base::MockOnceCallback<void(const PlusAddressMap&)> on_response_parsed; // Initiate a request... @@ -558,10 +675,18 @@ // The request fails and the callback is never run EXPECT_CALL(on_response_parsed, Run).Times(0); + base::TimeDelta latency = base::Milliseconds(2400); + AdvanceTimeTo(start_time + latency); EXPECT_TRUE(test_url_loader_factory.SimulateResponseForPendingRequest( - GURL(fullProfileEndpoint), - network::URLLoaderCompletionStatus(net::HTTP_NOT_FOUND), - network::CreateURLResponseHead(net::HTTP_NOT_FOUND), "")); + fullProfileEndpoint, "", net::HTTP_NOT_FOUND)); + // Verify expected metrics. + histogram_tester.ExpectUniqueTimeSample( + LatencyHistogramFor(PlusAddressNetworkRequestType::kList), latency, 1); + histogram_tester.ExpectUniqueSample( + ResponseCodeHistogramFor(PlusAddressNetworkRequestType::kList), + net::HTTP_NOT_FOUND, 1); + histogram_tester.ExpectTotalCount( + ResponseByteSizeHistogramFor(PlusAddressNetworkRequestType::kList), 0); } TEST_F(PlusAddressClientRequests, @@ -659,6 +784,8 @@ signin::ScopeSet test_scopes_ = {test_scope_}; base::Time test_token_expiration_time_ = base::Time::FromDoubleT(1000); + base::HistogramTester histogram_tester; + private: // Required by `signin::IdentityTestEnvironment`. base::test::TaskEnvironment task_environment_; @@ -682,6 +809,8 @@ EXPECT_FALSE(ran_callback); WaitForSignInAndToken(); EXPECT_TRUE(ran_callback); + EXPECT_THAT(histogram_tester.GetAllSamples(kPlusAddressOauthErrorHistogram), + BucketsAre(base::Bucket(GoogleServiceAuthError::State::NONE, 1))); } TEST_F(PlusAddressAuthToken, RequestedUserNeverSignsIn) { @@ -692,6 +821,7 @@ base::MockOnceClosure callback; EXPECT_CALL(callback, Run).Times(0); client.GetAuthToken(callback.Get()); + histogram_tester.ExpectTotalCount(kPlusAddressOauthErrorHistogram, 0); } TEST_F(PlusAddressAuthToken, RequestedAfterExpiration) { @@ -702,6 +832,7 @@ base::MockOnceClosure first_callback; client.GetAuthToken(first_callback.Get()); EXPECT_CALL(first_callback, Run).Times(1); + histogram_tester.ExpectTotalCount(kPlusAddressOauthErrorHistogram, 0); // Sign in, get a token, and fast-forward to after it is expired. WaitForSignInAndToken(); @@ -715,6 +846,8 @@ // Callback is only run once the new OAuth token request has completed. EXPECT_CALL(second_callback, Run).Times(1); WaitForToken(/*expiration_time=*/now + base::Hours(1)); + EXPECT_THAT(histogram_tester.GetAllSamples(kPlusAddressOauthErrorHistogram), + BucketsAre(base::Bucket(GoogleServiceAuthError::State::NONE, 2))); } } // namespace plus_addresses
diff --git a/components/plus_addresses/plus_address_metrics.cc b/components/plus_addresses/plus_address_metrics.cc index aaf6226..245b089 100644 --- a/components/plus_addresses/plus_address_metrics.cc +++ b/components/plus_addresses/plus_address_metrics.cc
@@ -5,18 +5,80 @@ #include "components/plus_addresses/plus_address_metrics.h" #include "base/metrics/histogram_functions.h" +#include "base/strings/string_util.h" +#include "components/plus_addresses/plus_address_types.h" +#include "google_apis/gaia/google_service_auth_error.h" namespace plus_addresses { - +// static void PlusAddressMetrics::RecordModalEvent( PlusAddressModalEvent plus_address_modal_event) { base::UmaHistogramEnumeration("Autofill.PlusAddresses.Modal.Events", plus_address_modal_event); } +// static void PlusAddressMetrics::RecordAutofillSuggestionEvent( PlusAddressAutofillSuggestionEvent plus_address_autofill_suggestion_event) { base::UmaHistogramEnumeration("Autofill.PlusAddresses.Suggestion.Events", plus_address_autofill_suggestion_event); } +// static +void PlusAddressMetrics::RecordNetworkRequestLatency( + PlusAddressNetworkRequestType type, + base::TimeDelta request_latency) { + base::UmaHistogramTimes( + base::ReplaceStringPlaceholders( + "Autofill.PlusAddresses.NetworkRequest.$1.Latency", + {PlusAddressNetworkRequestTypeToString(type)}, + /*offsets=*/nullptr), + request_latency); +} +// static +void PlusAddressMetrics::RecordNetworkRequestResponseCode( + PlusAddressNetworkRequestType type, + int response_code) { + // Mapped to "HttpErrorCodes" in histograms.xml. + base::UmaHistogramSparse( + base::ReplaceStringPlaceholders( + "Autofill.PlusAddresses.NetworkRequest.$1.ResponseCode", + {PlusAddressNetworkRequestTypeToString(type)}, + /*offsets=*/nullptr), + response_code); +} +// static +void PlusAddressMetrics::RecordNetworkRequestResponseSize( + PlusAddressNetworkRequestType type, + int response_size) { + base::UmaHistogramCounts10000( + base::ReplaceStringPlaceholders( + "Autofill.PlusAddresses.NetworkRequest.$1.ResponseByteSize", + {PlusAddressNetworkRequestTypeToString(type)}, + /*offsets=*/nullptr), + response_size); +} +// static +void PlusAddressMetrics::RecordNetworkRequestOauthError( + GoogleServiceAuthError error) { + base::UmaHistogramEnumeration( + "Autofill.PlusAddresses.NetworkRequest.OauthError", error.state(), + GoogleServiceAuthError::NUM_STATES); +} +// static +std::string PlusAddressMetrics::PlusAddressNetworkRequestTypeToString( + PlusAddressNetworkRequestType type) { + // Make sure to keep "AutofillPlusAddressNetworkRequestType" in + // tools/metrics/histograms/metadata/autofill/histograms.xml in sync with + // this. + switch (type) { + case PlusAddressNetworkRequestType::kCreate: + return "Create"; + case PlusAddressNetworkRequestType::kGetOrCreate: + return "GetOrCreate"; + case PlusAddressNetworkRequestType::kList: + return "List"; + case PlusAddressNetworkRequestType::kReserve: + return "Reserve"; + } +} } // namespace plus_addresses
diff --git a/components/plus_addresses/plus_address_metrics.h b/components/plus_addresses/plus_address_metrics.h index fc487f3..653070c 100644 --- a/components/plus_addresses/plus_address_metrics.h +++ b/components/plus_addresses/plus_address_metrics.h
@@ -5,6 +5,11 @@ #ifndef COMPONENTS_PLUS_ADDRESSES_PLUS_ADDRESS_METRICS_H_ #define COMPONENTS_PLUS_ADDRESSES_PLUS_ADDRESS_METRICS_H_ +#include "base/time/time.h" +#include "components/plus_addresses/plus_address_types.h" + +class GoogleServiceAuthError; + namespace plus_addresses { // A small, stateless utility class for logging metrics. It will handle autofill // metrics, plus_address_service metrics, and user interaction metrics. @@ -38,6 +43,21 @@ static void RecordAutofillSuggestionEvent( PlusAddressAutofillSuggestionEvent plus_address_autofill_suggestion_event); + // Log latency of `request`. + static void RecordNetworkRequestLatency(PlusAddressNetworkRequestType type, + base::TimeDelta request_latency); + // Log the status code of the response to `request`. + static void RecordNetworkRequestResponseCode( + PlusAddressNetworkRequestType type, + int response_code); + // Log the size of the response to `request`. + static void RecordNetworkRequestResponseSize( + PlusAddressNetworkRequestType type, + int response_size); + // Log the OAuth errors that occur when PlusAddressClient requests a token. + static void RecordNetworkRequestOauthError(GoogleServiceAuthError error); + static std::string PlusAddressNetworkRequestTypeToString( + PlusAddressNetworkRequestType type); }; } // namespace plus_addresses
diff --git a/components/plus_addresses/plus_address_types.h b/components/plus_addresses/plus_address_types.h index f58dba35..f4a8030 100644 --- a/components/plus_addresses/plus_address_types.h +++ b/components/plus_addresses/plus_address_types.h
@@ -17,6 +17,15 @@ typedef std::unordered_map<std::string, std::string> PlusAddressMap; typedef base::OnceCallback<void(const PlusAddressMap&)> PlusAddressMapCallback; +// Defined for use in metrics and to share code for certain network-requests. +enum class PlusAddressNetworkRequestType { + kGetOrCreate = 0, + kList = 1, + kReserve = 2, + kCreate = 3, + kMaxValue = kCreate, +}; + } // namespace plus_addresses #endif // COMPONENTS_PLUS_ADDRESSES_PLUS_ADDRESS_TYPES_H_
diff --git a/components/policy/core/common/remote_commands/test_support/remote_command_builders.cc b/components/policy/core/common/remote_commands/test_support/remote_command_builders.cc index 977b97f..3bec8bc1 100644 --- a/components/policy/core/common/remote_commands/test_support/remote_command_builders.cc +++ b/components/policy/core/common/remote_commands/test_support/remote_command_builders.cc
@@ -11,22 +11,11 @@ namespace policy { -// static -// -// Note we deliberately use a number that doesn't fit in an int32 to discover -// truncation errors. -int64_t RemoteCommandBuilder::g_last_command_id_ = (1LL << 35) + 1; - -RemoteCommandBuilder::RemoteCommandBuilder() { - result_.set_command_id(g_last_command_id_ + 1); -} - enterprise_management::RemoteCommand RemoteCommandBuilder::Build() { return std::move(result_); } RemoteCommandBuilder& RemoteCommandBuilder::SetCommandId(int64_t value) { - g_last_command_id_ = value; result_.set_command_id(value); return *this; }
diff --git a/components/policy/core/common/remote_commands/test_support/remote_command_builders.h b/components/policy/core/common/remote_commands/test_support/remote_command_builders.h index e898c66..8348907 100644 --- a/components/policy/core/common/remote_commands/test_support/remote_command_builders.h +++ b/components/policy/core/common/remote_commands/test_support/remote_command_builders.h
@@ -18,7 +18,7 @@ // assign your own command id if more control is needed. class RemoteCommandBuilder { public: - RemoteCommandBuilder(); + RemoteCommandBuilder() = default; RemoteCommandBuilder(const RemoteCommandBuilder&) = default; RemoteCommandBuilder& operator=(const RemoteCommandBuilder&) = default; @@ -37,10 +37,6 @@ private: enterprise_management::RemoteCommand result_; - - // The last assigned command id, which is used to assign a higher command id - // to the next created remote command. - static int64_t g_last_command_id_; }; // Builder class to construct `enterprise_management::SignedData`.
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto index 63656d5..97042251 100644 --- a/components/policy/proto/device_management_backend.proto +++ b/components/policy/proto/device_management_backend.proto
@@ -1370,7 +1370,7 @@ // Resolution height optional uint32 resolution_height = 2; // Refresh rate (Hz) - optional uint32 refresh_rate = 3; + optional float refresh_rate = 3; // Set to true if display is internal, otherwise set to false. optional bool is_internal = 4; }
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 5208b17..7a76cb1 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -2324,6 +2324,13 @@ <ph name="MANAGED_ACCOUNTS_SIGNIN_RESTRICTION_POLICY_NAME" /> = <ph name="POLICY_VALUE_PRIMARY_ACCOUNT_STRICT_KEEP_EXISTING_DATA" /> Dieses Verhalten entspricht <ph name="POLICY_VALUE_PRIMARY_ACCOUNT_KEEP_EXISTING_DATA" />, außer dass das neu erstellte Profil keine sekundären Konten enthalten darf.</translation> +<translation id="3079575168312257780">Wenn die Richtlinie auf 0 gesetzt ist (Standardeinstellung), kannst du auf die Entwicklertools und die JavaScript-Konsole zugreifen. Für Erweiterungen, die über die Unternehmensrichtlinie installiert wurden, oder ab Version 114 für Erweiterungen, die in den Browser eines verwalteten Nutzers integriert sind, ist der Zugriff aber nicht möglich. Ist die Richtlinie auf 1 gesetzt, kannst du die Entwicklertools und die JavaScript-Konsole in allen Kontexten aufrufen, also auch bei Erweiterungen, die über die Unternehmensrichtlinie installiert wurden. Wenn die Richtlinie auf 2 gesetzt ist, kann nicht auf die Entwicklertools zugegriffen werden und Websiteelemente können nicht geprüft werden. + + Alle Tastenkombinationen und Einträge im Menü oder Kontextmenü, mit denen die Entwicklertools oder die JavaScript-Konsole aufgerufen werden, werden deaktiviert. + + Ab Version 99 von <ph name="PRODUCT_NAME" /> werden durch diese Einstellung auch Einstiegspunkte für die Funktion „Seiten-Quelltext anzeigen“ bestimmt. Wenn diese Richtlinie auf DeveloperToolsDisallowed (Wert 2) festgelegt ist, können Nutzer sich den Quelltext nicht über Tastenkombinationen oder das Kontextmenü anzeigen lassen. Soll die Anzeige des Quelltexts komplett blockiert werden, musst du der Richtlinie <ph name="URL_BLOCKLIST_POLICY_NAME" /> auch „view-source:*“ hinzufügen. + + Ab Version 119 von <ph name="PRODUCT_NAME" /> wird durch diese Einstellung außerdem bestimmt, ob der Entwicklermodus für isolierte Web-Apps aktiviert und verwendet werden kann.</translation> <translation id="3083259245974004342">Passwortschutz</translation> <translation id="308356121098374167">WebSQL wird in nicht sicheren Kontexten verfügbar sein.</translation> <translation id="3086995894968271156">Konfigurieren von Cast Receiver in <ph name="PRODUCT_NAME" />.</translation> @@ -2549,6 +2556,7 @@ <translation id="3240609035816615922">Richtlinie für den Zugriff auf die Konfiguration von Druckern.</translation> <translation id="324062325008698789">Hiermit wird eine Liste von Druckern konfiguriert</translation> <translation id="3240655340884151271">MAC-Adresse der im Dock verbauten NIC</translation> +<translation id="3242480111684005642">Der Nutzer kann die <ph name="GOOGLE_DRIVE_NAME" />-Dateisynchronisierungsfunktion verwenden.</translation> <translation id="3242756958360374888">Diese Richtlinie enthält eine Liste von Mustern, mit denen die Sichtbarkeit von Konten in <ph name="PRODUCT_NAME" /> gesteuert wird. Alle Google-Konten auf dem Gerät werden mit den in dieser Richtlinie gespeicherten Mustern abgeglichen, um zu ermitteln, welche Konten in <ph name="PRODUCT_NAME" /> angezeigt werden sollen. Konten sind sichtbar, wenn ihr Name mit einem Muster in der Liste übereinstimmt. Andernfalls werden sie ausgeblendet. @@ -2608,6 +2616,7 @@ Unter <ph name="MS_WIN_NAME" /> steht diese Richtlinie nur bei Instanzen zur Verfügung, die Teil einer <ph name="MS_AD_NAME" />-Domain oder von <ph name="MS_AAD_NAME" /> sind oder die in<ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" /> angemeldet sind.</translation> <translation id="3300784749135986828">Aktiviere oder deaktiviere die Funktion <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" />.</translation> <translation id="3301698868852716692">Erweiterung „Insights“ aktivieren</translation> +<translation id="3302723130703323097">Die <ph name="GOOGLE_DRIVE_NAME" />-Dateisynchronisierungsfunktion auf unterstützten Geräten in der App „Dateien“ von <ph name="PRODUCT_OS_NAME" /> sichtbar und zum Aktivieren/Deaktivieren verfügbar machen</translation> <translation id="3302829897293005699">Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, werden über registrierte Geräte Informationen zur aktiven Kiosksitzung gemeldet, z. B. die Anwendungs-ID und -version. Ist sie deaktiviert, senden registrierte Geräte keine Informationen zur Kiosksitzung.</translation> @@ -2692,6 +2701,13 @@ Wenn die Richtlinie auf „ausgeblendet“ gesetzt ist, können die deaktivierten Funktionen nicht mehr verwendet werden und sind nicht für Nutzer sichtbar. Wenn sie nicht konfiguriert ist oder einen ungültigen Wert enthält, ist der Deaktivierungsmodus in den Systemfunktionen auf „blockiert“ gesetzt.</translation> +<translation id="3410963889229735344">Mit der <ph name="GOOGLE_DRIVE_NAME" />-Dateisynchronisierung sind Dateien eines Nutzers in „Meine Ablage“ auf unterstützten Geräten automatisch offline verfügbar (sofern genügend Speicherplatz vorhanden ist). Nachdem anfangs alle Dateien offline verfügbar gemacht werden, werden später automatisch alle neuen Dateien ebenfalls offline verfügbar gemacht. Wenn die Funktion aktiviert wurde und später nicht mehr genügend Speicherplatz vorhanden ist, werden nicht mehr alle neuen Dateien automatisch offline verfügbar gemacht, jedoch können Nutzer weiterhin manuell Dateien speichern. + +Wenn die Richtlinie auf „<ph name="POLICY_VALUE_VISIBLE" />“ gesetzt ist, wird die Dateisynchronisierungsfunktion in der App „Dateien“ und auf der Seite „Einstellungen“ angezeigt. Nutzer müssen die Dateisynchronisierungsfunktion weiterhin selbst aktivieren. + +Ist die Richtlinie auf „<ph name="POLICY_VALUE_DISABLED" />“ gesetzt, so wird die Dateisynchronisierungsfunktion deaktiviert, wenn sie zuvor vom Nutzer aktiviert wurde, und außerdem in der App „Dateien“ und in den Einstellungen ausgeblendet, sodass der Nutzer sie nicht wieder aktivieren kann. Vorhandene Dateien, die vom Nutzer offline verfügbar gemacht wurden, bleiben offline verfügbar, und der Nutzer kann einzelne Dateien manuell offline verfügbar machen (sie sind nicht automatisch offline verfügbar). + +Wenn die Richtlinie nicht konfiguriert ist, wird „<ph name="POLICY_VALUE_VISIBLE" />“ als Standardwert verwendet.</translation> <translation id="341285788698114069">Diese Richtlinie steuert die Priorität des Audioprozesses unter Windows. Wenn diese Richtlinie aktiviert ist, wird der Audioprozess mit einer Priorität ausgeführt, die über der normalen liegt. Wird sie deaktiviert, erfolgt die Ausführung des Audioprozesses mit normaler Priorität. @@ -2776,6 +2792,7 @@ Hinweis: Wenn die Richtlinie <ph name="COMPONENT_UPDATES_ENABLED_POLICY_NAME" /> deaktiviert, <ph name="HISTORY_CLUSTERS_VISIBLE_POLICY_NAME" /> jedoch aktiviert oder nicht konfiguriert ist, ist die in Gruppen eingeteilte Chrome-Verlaufsseite trotzdem unter chrome://history/grouped verfügbar, auch wenn sie möglicherweise weniger relevant für den Nutzer ist. </translation> <translation id="3478024346823118645">Nutzerdaten bei Abmeldung löschen</translation> +<translation id="3478406829037689272">Detailliertere Scans von heruntergeladenen Dateien im Rahmen von Safe Browsing aktivieren</translation> <translation id="3480961938508521469">Lädt den Akku mit normaler Geschwindigkeit vollständig auf.</translation> <translation id="348110646151632565">Hiermit wird die Bedienungshilfe "Vorlesen" auf dem Anmeldebildschirm aktiviert. @@ -3750,6 +3767,9 @@ <translation id="4380159792986204036">Einer Kiosk-Webanwendung erlauben, mehrere Browserfenster auf beliebigen Bildschirmen zu öffnen</translation> <translation id="4381227367939912539">Easter-Egg-Dinosaurierspiel deaktivieren</translation> <translation id="4382413175336720282">Die URL-Echtzeitüberprüfung ist deaktiviert.</translation> +<translation id="4384911996235542086">Wenn diese Richtlinie aktiviert oder nicht konfiguriert ist, kann <ph name="PRODUCT_NAME" /> verdächtige Downloads von Nutzern, die Safe Browsing aktiviert haben, zur Prüfung auf Malware an Google senden. +Ist diese Richtlinie deaktiviert, wird keine Prüfung durchgeführt. +Diese Richtlinie wirkt sich nicht auf die von Chrome Enterprise Connectors konfigurierte Analyse von heruntergeladenen Inhalten aus.</translation> <translation id="4387741272680827493">Wenn die Richtlinie konfiguriert ist, wird eine Liste mit Hostnamen angegeben, die vorab geladene HSTS-Upgrades von http auf https umgehen. Für diese Richtlinie sind nur Single-Label-Hostnamen zulässig und sie gilt nur für „statische“ HSTS-Preloaded-Eingaben (beispielsweise <ph name="EXAMPLE_HSTS_PRELOAD_TLDS" />). Diese Richtlinie verhindert keine HSTS-Upgrades für Server, die diese „dynamisch“ mit einem <ph name="HSTS_HEADER_NAME" />-Antwortheader anfragen. @@ -4425,6 +4445,7 @@ <translation id="5036013147560568855">Version des Zertifikatbereitstellungsprotokolls. Der Standardwert ist 1. 1 entspricht dem statischen Protokoll. 2 entspricht dem dynamischen Protokoll.</translation> <translation id="5039110755072335605">Unterstützung für CORS-Anfrageheader ohne Platzhalter</translation> <translation id="504116558738617678">Warnungen bei wenig Speicherplatz nur anzeigen, wenn das Gerät nicht verwaltet wird oder es nur einen Nutzer gibt</translation> +<translation id="5046376406561077773">Der Nutzer kann die Elemente der Benutzeroberfläche im Zusammenhang mit der <ph name="GOOGLE_DRIVE_NAME" />-Dateisynchronisierungsfunktion nicht sehen.</translation> <translation id="5055474681190962362">Tag im Monat (1–31), an dem der Neustart ausgeführt werden soll, angegeben in der lokalen Zeit des Geräts. Diese Richtlinie wird nur verwendet, wenn „frequency“ auf „MONTHLY“ gesetzt ist. Falls der Wert höher ist als die maximale Anzahl von Tagen in einem bestimmten Monat, wird der jeweils letzte Tag des Monats gewählt.</translation> <translation id="5056708224511062314">Lupe deaktiviert</translation> <translation id="5058573563327660283">Strategie auswählen, die bei der automatischen Bereinigung zur Freigabe von Festplattenspeicher verwendet wird (eingestellt)</translation> @@ -5453,6 +5474,7 @@ <translation id="6042407236638640864">Seiten mit dem Header „<ph name="CACHE_CONTROL_NO_STORE_NAME" />“ dürfen im Back-Forward-Cache gespeichert werden</translation> <translation id="604243460476563291">Dateiübertragung in Remote-Supportverbindungen von Unternehmensadministratoren deaktivieren</translation> <translation id="6042629184389251062">Das Erfassen von URL-Messwerten ist nicht zulässig</translation> +<translation id="6045733613334942660">Scannertreiber</translation> <translation id="6046615715547751255">Steuerelemente für detailliertes Reporting nicht zulassen</translation> <translation id="6048199181629830227">Energieverwaltung zum Umschalten bei Leistungsspitzen aktivieren</translation> <translation id="6048690591359317353">Nutzern nicht erlauben, VPN-Verbindungen manuell zu trennen oder zu ändern</translation> @@ -5665,6 +5687,7 @@ Normalerweise wird der Vollbildmodus ausgeschaltet, wenn der Sperrbildschirm deaktiviert wird, um das Risiko von Phishing-Angriffen zu reduzieren. Mit dieser Richtlinie kannst du bestimmte URLs angeben, die dann als vertrauenswürdige Quellen gelten und im Vollbildmodus bleiben dürfen, wenn der Sperrbildschirm deaktiviert wird. Wenn du diese Richtlinie konfigurieren möchtest, musst du eine Liste von URL-Mustern angeben, die folgendermaßen formatiert ist: https://support.google.com/chrome/a?p=url_blocklist_filter_format. Du kannst beispielsweise den Vollbildmodus immer beibehalten, wenn der Sperrbildschirm deaktiviert wird, und die Benachrichtigungen durch das Platzhalterzeichen „<ph name="WILDCARD_VALUE" />“ deaktivieren, das allen URLs entspricht. Falls diese Richtlinie nicht konfiguriert ist oder eine leere Liste festgelegt wurde, sind keine URLs von der Vollbildbenachrichtigung ausgenommen.</translation> +<translation id="6240222568708113780">Bei Nutzern, die Safe Browsing aktiviert haben, detailliertere Scans von heruntergeladenen Dateien zulassen</translation> <translation id="624080397610861618">InScript-Layout für Hindi deaktivieren</translation> <translation id="6242147107333796512">Informationen im Zusammenhang mit Absturzberichten melden, wie Remote ID, Zeitstempel und Ursache. @@ -7171,6 +7194,7 @@ <translation id="7485481791539008776">Regeln zur Auswahl des Standarddruckers</translation> <translation id="7486205887492534734">Aufforderung auf dem Anmeldebildschirm, wenn mehrere Zertifikate passen</translation> <translation id="748873163367340515">Nur notwendige Cookies und Daten in der Suche verwenden.</translation> +<translation id="7489169777107143496">Detailliertere Scans von heruntergeladenen Dateien im Rahmen von Safe Browsing deaktivieren</translation> <translation id="7489661071474025727">Gibt an, ob der Dienst zur Kontowiederherstellung für deine Nutzer auf <ph name="PRODUCT_OS_NAME" />-Geräten aktiviert ist. Wenn die Richtlinie aktiviert ist, ist die Wiederherstellung der Nutzerdaten aktiviert. Falls die Richtlinie deaktiviert oder nicht konfiguriert ist, ist die Wiederherstellung der Nutzerdaten nicht aktiviert. @@ -7208,6 +7232,7 @@ Wenn die Richtlinie nicht konfiguriert ist, ist die Standardeinstellung für vom Unternehmen verwaltete Nutzer „<ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />“ und für nicht verwaltete Nutzer „<ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" />“. Künftig kannst du <ph name="LACROS_NAME" /> unter <ph name="PRODUCT_OS_NAME" /> mit dem Wert „<ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />“ als einzigen verfügbaren Browser festlegen.</translation> +<translation id="751071954873065775">DLCs (herunterladbare Inhalte) auswählen, die vorab heruntergeladen werden müssen</translation> <translation id="7512065400265675158">Der <ph name="USER_AGENT_HEADER_NAME" />-HTTP-Anfrageheader soll reduziert werden. Um Tests und Kompatibilität zu ermöglichen, kann diese Richtlinie die Verringerungsfunktion für alle Websites aktivieren oder die Aktivierung der Funktion durch Ursprungstests oder Field Trials erlauben oder verweigern. Weitere Informationen zur Funktion <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> und deren Zeitachse findest du hier: @@ -8676,6 +8701,9 @@ Ist sie deaktiviert, ist die <ph name="SEARCH_SIDE_PANEL_FEATURE_NAME" /> auf keiner Webseite verfügbar.</translation> <translation id="8860894781631833477">Nutzer dürfen die <ph name="PRODUCT_OS_NAME" />-Release-Version konfigurieren</translation> +<translation id="8862086508140571198">Mit dieser Richtlinie kann eine Liste von DLCs (herunterladbaren Inhalten) festgelegt werden, die so schnell wie möglich heruntergeladen werden sollen. Die heruntergeladenen DLCs sind dann für alle Nutzer auf dem Gerät verfügbar. + +Das ist hilfreich, wenn der Administrator weiß, dass die Nutzer des Geräts wahrscheinlich eine Funktion verwenden werden, für die diese DLCs vorhanden sein müssen.</translation> <translation id="8864975621965365890">Unterdrückung des Hinweises auf Einstellung des Frames, der beim Rendern einer Website durch <ph name="PRODUCT_FRAME_NAME" /> erscheint</translation> <translation id="8865404058177794289">Standardeinstellung für Prüfung der RSA-Schlüsselverwendung verwenden</translation> <translation id="8866430022832109569">Berichte zum App-Inventar</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 14918d7..2c98a7d 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -969,6 +969,11 @@ <translation id="1861206724856734193">Establece una lista de reglas para prevenir la filtración de datos</translation> <translation id="1862267110714201519">Inhabilitar la función de ventana fantasma.</translation> <translation id="1865417998205858223">Permisos de clave</translation> +<translation id="1865867000796030567">Si habilitas esta política, el valor de la clave del manifiesto de <ph name="REQUIRED_PLATFORM_VERSION" /> de la aplicación de kiosco sin tiempos de espera con inicio automático se usará como prefijo de la versión de destino de actualización automática. + +Si inhabilitas la política o no la estableces, se ignorará la clave del manifiesto de <ph name="REQUIRED_PLATFORM_VERSION" /> y la actualización automática se realizará con normalidad. + +Advertencia: No delegues el control de la versión de <ph name="PRODUCT_OS_NAME" /> a una aplicación de kiosco, ya que hacerlo podría impedir que el dispositivo reciba actualizaciones de software y correcciones de seguridad importantes. La delegación del control de la versión de <ph name="PRODUCT_OS_NAME" /> podría poner en riesgo a los usuarios.</translation> <translation id="186719019195685253">Acción a realizar si se alcanza la demora de inactividad mientras el dispositivo funciona con alimentación de corriente</translation> <translation id="1869688072690234823">Si estableces la política, controlarás qué factores de WebAuthn se pueden usar. @@ -1204,6 +1209,11 @@ Si no estableces la política o estableces una lista vacía, no habrá modos de desbloqueo rápido disponibles para los dispositivos administrados. Esta política dejó de estar disponible; usa <ph name="QUICK_UNLOCK_MODE_ALLOW_LIST_POLICY_NAME" /> en su lugar.</translation> +<translation id="2035995535603698706">Si habilitas la política, las imágenes de terceros de una página podrán mostrar una solicitud de autenticación. + +Si inhabilitas la política o no la estableces, las imágenes de terceros no podrán mostrar una solicitud de autenticación. + +Esta política suele estar inhabilitada para ofrecer protección frente al phishing.</translation> <translation id="2036522553891755455">Si habilitas la política, la detección de elementos compartidos (la función Network File Shares para <ph name="PRODUCT_NAME" />) usará el protocolo <ph name="NETBIOS_PROTOCOL" /> para detectar archivos compartidos en la red. Si la inhabilitas, la detección de elementos compartidos no utilizará este protocolo para detectar archivos compartidos. Si no la estableces, de forma predeterminada se desactivará para los usuarios administrados y se activará para los demás usuarios.</translation> @@ -1373,6 +1383,19 @@ Para obtener más información sobre las sesiones <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, consulta la especificación de la <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation> <translation id="2175353308236295184">Objeto de configuración JSON específico de la app con un conjunto de pares clave-valor, p. ej., '"managedConfiguration": { "key1": value1, "key2": value2 }'. Las claves se definen en el manifiesto de la app.</translation> <translation id="2176115444876446233">Impide que los usuarios registren el rendimiento de todo el sistema</translation> +<translation id="2177382213857119200">Te permite controlar si se habilita o no la función de Navegación segura de <ph name="PRODUCT_NAME" /> y el modo en el que opera. + + Si se establece esta política como "NoProtection" (valor 0), no se activará nunca la Navegación segura. + + Si se establece como "StandardProtection" (valor 1, el cual es el predeterminado), la Navegación segura estará siempre activa en el modo estándar. + + Si se establece como "EnhancedProtection" (valor 2), la Navegación segura estará siempre activa en el modo mejorado, el cual es más seguro, pero requiere que compartas con Google más datos sobre la navegación. + + Si la estableces como obligatoria, los usuarios no podrán cambiar ni anular la configuración de la Navegación segura en <ph name="PRODUCT_NAME" />. + + Si no se establece, la Navegación segura operará en el modo de protección estándar, pero los usuarios podrán cambiar esta configuración. + + Para obtener más información sobre la Navegación segura, consulta https://support.google.com/chrome?p=safe_browsing_preferences.</translation> <translation id="2177696016354404697">Inhabilitar siempre la pantalla de privacidad</translation> <translation id="2178899310296064282">Aplicar al menos el modo restringido moderado en YouTube</translation> <translation id="2180958780733364832">Controlar el uso del modo sin interfaz gráfica</translation> @@ -2027,6 +2050,11 @@ Si la estableces como falsa, el visor de PDF no podrá agregar anotaciones en archivos PDF.</translation> <translation id="2769952903507981510">Configura el nombre de dominio requerido para los hosts de acceso remoto.</translation> +<translation id="2770376586681635746">Determina si los usuarios pueden agregar cuentas de Kerberos. + +Si inhabilitas esta política o no la estableces, los usuarios podrán agregar cuentas de Kerberos con la configuración de las cuentas de Kerberos en la página de configuración de Kerberos. Los usuarios tendrán control total de las cuentas que agregan y podrán modificarlas o quitarlas. + +Si se inhabilita esta política, los usuarios no podrán agregar cuentas de Kerberos. Las cuentas solo se pueden agregar con la política "Configurar cuentas de Kerberos". Este es un procedimiento eficaz para proteger las cuentas.</translation> <translation id="2772231477628401250">Usar HTTP para las descargas de actualizaciones</translation> <translation id="2772955711376920612">Si habilitas la política y estableces <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> y <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" />, se mantendrá activada la carga fuera del horario de mayor consumo (cuando lo admita el dispositivo). La política para la administración de carga fuera del horario de mayor consumo es una política destinada a ahorrar energía que minimiza el uso de corriente alterna en horas de mayor consumo. Puedes establecer una hora de inicio y finalización para ejecutar el modo de carga fuera del horario de mayor consumo en cada día de la semana. Mientras la batería esté por encima del umbral especificado, el dispositivo funcionará con la batería en los horarios establecidos (incluso si está conectado a la corriente alterna). Después de la hora de finalización especificada, el dispositivo funcionará con corriente alterna (en caso de estar conectado), pero no cargará la batería. El dispositivo volverá a funcionar con normalidad usando corriente alterna y cargará la batería después de la hora de inicio de carga especificada. @@ -3780,6 +3808,9 @@ Si no la estableces, es posible que la resolución de DNS del sistema se ejecute en el servicio de red, fuera del servicio de red, o bien parcialmente dentro y parcialmente fuera, según la configuración del sistema y las marcas de función.</translation> <translation id="4239720644496144453">Las apps de Android no usan caché. Si varios usuarios instalan la misma app de Android, se descargará una para cada usuario.</translation> <translation id="424318624725112807">Habilitar la función para resaltar el signo de intercalación en la pantalla de acceso</translation> +<translation id="4245159233848584683">Si habilitas la política o no la estableces, en caso de que una cuenta local de un dispositivo sin conexión se haya configurado para el acceso automático sin tiempos de espera, <ph name="PRODUCT_OS_NAME" /> mostrará una solicitud de configuración de red. + +Si inhabilitas la política, se mostrará un mensaje de error en lugar de la solicitud de configuración de red.</translation> <translation id="4248277954659222481">Permite la reproducción automática de contenido multimedia en una lista de patrones de URL permitidos</translation> <translation id="4250680216510889253">No</translation> <translation id="4252522848899331223">Permitir que el usuario omita la advertencia de Navegación segura</translation> @@ -3924,6 +3955,11 @@ <translation id="4410236409016356088">Habilitar la velocidad moderada del ancho de banda de la red</translation> <translation id="4411734231900934213">La diferencia permitida entre el reloj del dispositivo del niño y el del padre o la madre (en segundos).</translation> <translation id="441217499641439905">Inhabilitar Google Drive a través de conexiones móviles en la app de Archivos de <ph name="PRODUCT_OS_NAME" /></translation> +<translation id="4412885120239670573">Si habilitas la política, se desactivará el visor de PDF interno de <ph name="PRODUCT_NAME" />, se tratarán los archivos PDF como descargas y los usuarios podrán abrir los archivos PDF con la aplicación predeterminada. + +Si inhabilitas la política, se abrirán los archivos PDF, a menos que los usuarios desactiven el complemento de PDF. + +Si estableces esta política, los usuarios no podrán cambiarla en <ph name="PRODUCT_NAME" />. Si no la estableces, los usuarios podrán elegir si desean abrir los archivos PDF de forma externa o no.</translation> <translation id="4413453659814156568">Te permite establecer una lista de patrones de URL de sitios donde se indiquen los que pueden ejecutar JavaScript con el compilador JIT (Just In Time) habilitado. Para obtener información detallada sobre los patrones de URL de sitios válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> no es un valor aceptado para esta política. @@ -4013,6 +4049,7 @@ <translation id="4482784169143060077">Habilitar las actualizaciones automáticas de HTTPS</translation> <translation id="4483120730995943109">Si setTimeout() de JavaScript tiene un tiempo de espera de 0 ms, no se restringirá a 1 ms.</translation> <translation id="4483649828988077221">Inhabilitar la actualización automática</translation> +<translation id="4483738129334574255">Inhabilitar el juego del huevo de pascua del dinosaurio en los dispositivos <ph name="PRODUCT_OS_NAME" /> inscritos y habilitarlo en otras circunstancias</translation> <translation id="4484515651939984695">Especificar el tiempo (en segundos) que un dispositivo de transmisión seleccionado con un código QR o de acceso permanece en la lista de dispositivos de transmisión del menú de <ph name="PRODUCT_NAME" /></translation> <translation id="4485425108474077672">Configurar la URL de la página Nueva pestaña</translation> <translation id="4490420545181481759">Los certificados X.509 pueden codificar restricciones, como limitaciones de nombres, @@ -4347,6 +4384,7 @@ En instancias de <ph name="MAC_OS_NAME" />, las apps y extensiones que no provengan de Chrome Web Store podrán instalarse de manera automática solo si la instancia está administrada con MDM, vinculada a un dominio a través de MCX o inscrita en <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />.</translation> <translation id="4742973303930120836">Restringe el modo de impresión con gráficos de fondo</translation> +<translation id="4744467872051608680">A partir de la versión M119, si estableces esta política como falsa o no la estableces, WebSQL estará inhabilitado, pero se podrá habilitar con la función experimental de Chrome "web-sql-access". Si estableces la política como verdadera, se habilitará el acceso a WebSQL.</translation> <translation id="4745232963710538589">Habilitar la extensión de estadísticas para métricas de informes de uso</translation> <translation id="4749670563834935149">Habilita <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> para ver una lista de URLs en la pantalla de acceso y de bloqueo. @@ -4924,6 +4962,9 @@ Para obtener información detallada sobre los patrones de <ph name="URL_LABEL" /> válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Esta política solo establece coincidencias basadas en el origen; por lo tanto, se ignoran todas las rutas de acceso que se incluyan en el patrón de URL.</translation> <translation id="5318185076587284965">Habilitar el uso de servidores de retransmisión por parte del host de acceso remoto</translation> +<translation id="5321624917465764266">Si habilitas la política o no la estableces, podrán borrarse los historiales de navegación y de descargas en Chrome, y los usuarios no podrán cambiar esta configuración. + +Si inhabilitas la política, no podrán borrarse los historiales de navegación ni de descargas. Incluso con la política desactivada, no se garantiza la conservación de los historiales de navegación y de descarga. Es posible que los usuarios puedan editar o borrar los archivos de la base de datos del historial directamente, y que el propio navegador pueda caducar o archivar algunos o todos los elementos del historial en cualquier momento.</translation> <translation id="5323200200131319468">Habilita los comentarios por voz en la pantalla de acceso</translation> <translation id="5323271643727095577">No mostrar el diálogo de cancelación cuando se llame a event.preventDefault() para el evento beforeunload Mostrar el diálogo de cancelación cuando beforeunload event.returnValue sea la cadena vacía del evento beforeunload</translation> <translation id="5323355956693037267">Habilitar el teclado en pantalla en la pantalla de acceso</translation> @@ -5163,6 +5204,9 @@ <translation id="5535256585099022933">Establecer el lapso para el reinicio</translation> <translation id="553806128266843748">Una función experimental booleana que indica si está habilitada la limitación de la red.</translation> <translation id="5540885720415375851">Permite el descubrimiento de dispositivos locales</translation> +<translation id="5542235730745104308">Si estableces la política como verdadera, <ph name="PRODUCT_NAME" /> utilizará páginas de error alternativas integradas en el navegador (como "no se encontró la página"). Si la estableces como falsa, <ph name="PRODUCT_NAME" /> no utilizará nunca páginas de error alternativas. + +Si estableces la política, los usuarios no podrán cambiarla. Si no la estableces, la política estará activa, pero los usuarios podrán cambiar esta configuración.</translation> <translation id="5544059132156503357">Si estableces la política, se designarán los tipos de encriptación que estarán permitidos cuando se soliciten tickets de Kerberos desde un servidor de <ph name="MS_AD_NAME" />. Si estableces la política en los siguientes valores: @@ -5933,6 +5977,9 @@ <translation id="625580680776945310">Se habilitará el modo de alta eficiencia</translation> <translation id="6258658183356534534">Controlar la función de actualización de GREASE de optimización del cliente de usuario-cliente</translation> <translation id="6261643884958898336">Enviar la información de identificación de la máquina</translation> +<translation id="6264247808139384018">Si habilitas la política o no la estableces, los usuarios que se autentiquen con una contraseña podrán bloquear la pantalla. + +Si inhabilitas la política, los usuarios no podrán bloquear la pantalla (solo podrán salir de la sesión de usuario).</translation> <translation id="6265892395051519509">Permite el acceso a los sensores en estos sitios</translation> <translation id="6266043141694454734">Determina si se usarán Chrome Root Store y el verificador de certificados integrado para verificar los certificados de servidores</translation> <translation id="6267130578410325007">Esta política permite el agrupamiento en clústeres de agentes con clave de origen de forma predeterminada. @@ -6205,6 +6252,9 @@ <translation id="6412352702230183710">Permitir solo hosts de mensajería nativa a nivel del sistema</translation> <translation id="6416506846917150119">Inhabilitar la escritura predictiva en el teclado físico cuando los usuarios escriben</translation> <translation id="6417265370957905582">Asistente de Google</translation> +<translation id="6421254653839955267">Si habilitas la política, se omitirá la búsqueda de CNAME. Se usará el nombre del servidor tal como se haya introducido al generar el SPN de Kerberos. + +Si inhabilitas la política o no la estableces, la búsqueda de CNAME determinará el nombre canónico del servidor al generar el SPN de Kerberos.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6424486395812679373">Realiza las verificaciones de la Navegación segura en todos los archivos descargados</translation> <translation id="6433697627431665375">Impedir que se incluyan los datos de <ph name="PRODUCT_NAME" /> en las copias de seguridad</translation> @@ -6333,6 +6383,11 @@ El valor de la política debe especificarse en milisegundos. Se establecerán los valores de modo que sean inferiores a la demora de inactividad.</translation> <translation id="6497085755801788141">Usar el verificador de certificados integrado</translation> +<translation id="6504720469162323184">Si estableces la política, se determinará la cantidad de tiempo (expresado en milisegundos) sin actividad del usuario antes de acceder automáticamente a la cuenta local del dispositivo especificada en la política <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" />. + +Si no la estableces, se utilizará 0 milisegundos como tiempo de espera. + +Si no estableces la política <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" />, esta política no tendrá efecto.</translation> <translation id="65055701428353978">Si estableces esta política, se especificará para cada extensión afectada una lista de las URLs de redireccionamiento de OAuth que pueden usar las extensiones con la API de <ph name="IDENTITY_API_NAME" /> (<ph name="IDENTITY_API_URL" />) @@ -6436,6 +6491,7 @@ Ten en cuenta que se puede anular esta política con las políticas EnabledPlugins y DisabledPluginsExceptions. Si no se configura esta política, el usuario podrá usar cualquier complemento instalado en el sistema, excepto aquellos que sean peligrosos, obsoletos o incompatibles por el código.</translation> +<translation id="6571055160227165318">Permitir que una función experimental de Chrome inhabilite WebSQL</translation> <translation id="6574903167639386816">Borrar los datos de perfil en el disco cuando finalice la sesión del usuario</translation> <translation id="6575403002861093126">Si estableces la política, se especificará la duración (expresada en horas) de almacenamiento en caché del Objeto de directiva de grupo (GPO). Este valor indica el tiempo máximo en el que pueden reutilizarse los GPO antes de que se vuelvan a descargar. En lugar de volverlos a descargar en cada recuperación de la política, el sistema volverá a utilizar los GPO almacenados en caché, siempre que no cambien de versión. @@ -6564,6 +6620,11 @@ Si la inhabilitas o no la estableces, los comandos de impresión mostrarán la pantalla de vista previa de impresión.</translation> <translation id="6655274714135630366">Hash SHA-256 con codificación hexadecimal de la imagen de disco.</translation> +<translation id="6655844456903132379">Si habilitas esta política, la autenticación HTTP respetará la aprobación de la política de KDC, es decir, <ph name="PRODUCT_NAME" /> delegará las credenciales de usuario para el servicio al que se accede si KDC establece <ph name="OK_AS_DELEGATE" /> en el ticket de servicio. Consulta la RFC 5896 ( https://tools.ietf.org/html/rfc5896.html ). La política <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> debe permitir este servicio. + +Si inhabilitas la política o no la estableces, se ignorará la política de KDC en las plataformas admitidas y solo se respetará la política <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />. + +En <ph name="MS_WIN_NAME" />, siempre se respeta la política de KDC.</translation> <translation id="6658245400435704251">Especifica la cantidad máxima de segundos que un dispositivo puede retrasar aleatoriamente la descarga de una actualización desde el momento en el que la descarga se envío al servidor por primera vez. El dispositivo puede dedicar una parte de este tiempo al proceso de actualización y el resto a realizar las comprobaciones necesarias. En cualquier caso, el límite superior de la dispersión es un período de tiempo constante, para que el dispositivo no se quede bloqueado mientras espera descargar una actualización.</translation> <translation id="6659537776197644458">No activar los flujos de autenticación para la sincronización de contraseñas</translation> <translation id="6661178198729301029">Habilitar los informes en la nube para los perfiles administrados</translation> @@ -7117,6 +7178,11 @@ Si la estableces como falsa, se inhabilitará esta funcionalidad.</translation> <translation id="7123271473727774529">Habilitar la función de accesibilidad de corrección de colores</translation> <translation id="7126716959063786004">Permitir finalizar procesos en el Administrador de tareas</translation> +<translation id="7126787606641224668">Determina si se habilita la función "Recordar contraseña" en el cuadro de diálogo de la autenticación Kerberos. Las contraseñas se almacenan encriptadas en el disco, y solo puede acceder a ellas el daemon del sistema Kerberos durante la sesión de usuario. + +Si se habilita esta política o no se establece, los usuarios podrán decidir si se recuerdan las contraseñas de Kerberos para no tener que ingresarlas de nuevo. Los tickets de Kerberos se recuperan automáticamente a menos que se requiera autenticación adicional (autenticación de dos factores). + +Si se inhabilita esta política, las contraseñas no se recordarán nunca y se quitarán todas las contraseñas previamente almacenadas. Los usuarios deberán ingresar su contraseña cada vez que necesiten autenticación en el sistema Kerberos. Según la configuración del servidor, esta acción debe realizarse cada 8 horas o cada varios meses.</translation> <translation id="7126928806195745404">Configuración de JavaScript</translation> <translation id="7127980134843952133">Historial de descargas</translation> <translation id="7128513247945602297">Habilitar la actualización automática de contenido mixto en sitios HTTPS</translation> @@ -7184,6 +7250,9 @@ <translation id="7157329428182136164">Habilitar la compatibilidad de las API de gráficos en 3D</translation> <translation id="7158358621906236999">Configuración predeterminada de los sensores</translation> <translation id="7161568070244869726">Forzar la habilitación de Memoria caché de la app</translation> +<translation id="7165879643294314958">Si habilitas la política o no la estableces, se definirá una cuenta local del dispositivo para el acceso automático sin tiempos de espera. <ph name="PRODUCT_OS_NAME" /> permitirá usar la combinación de teclas Ctrl + Alt + S para omitir el acceso automático y mostrar la pantalla de acceso. + +Si inhabilitas la política, los usuarios no podrán omitir el acceso automático sin tiempos de espera (si se configuró).</translation> <translation id="7165882688932913315">Esta política regula el acceso a las funciones controlables de la IU de descubrimiento local (<ph name="CHROME_DEVICES_LINK" />) que muestra cuáles son los dispositivos detectables cerca del usuario y los dispositivos en la nube que están registrados con él. En todos los sistemas operativos, excepto en <ph name="PRODUCT_OS_NAME" />, la IU de descubrimiento local también permite que los usuarios agreguen a <ph name="CLOUD_PRINT_NAME" /> impresoras clásicas conectadas a sus computadoras. Si habilitas la política o no la estableces, se permitirá el descubrimiento de dispositivos locales. @@ -7299,6 +7368,11 @@ <translation id="7269263983506766969">Usa la prioridad predeterminada para el proceso de audio</translation> <translation id="7270001383428188269">El identificador para este certificado de cliente.</translation> <translation id="7271085005502526897">Importar la página principal del navegador predeterminado en la primera ejecución</translation> +<translation id="7272892848025145170">Determina si se habilita la funcionalidad Kerberos. Kerberos es un protocolo de autenticación que puede usarse para autenticar apps web y archivos compartidos. + +Si se habilita esta política, se permitirá la funcionalidad Kerberos. Podrán agregarse las cuentas de Kerberos con la política "Configurar cuentas de Kerberos" o la configuración de las cuentas de Kerberos en la página de configuración de Kerberos. + +Si inhabilitas esta política o no la estableces, no se permitirá la configuración de las cuentas de Kerberos. No se podrán agregar cuentas de Kerberos ni usar la autenticación Kerberos. Se borrarán todas las cuentas de Kerberos existentes y todas las contraseñas almacenadas.</translation> <translation id="7273785848231509306">No mostrar nunca los nombres de usuario y las fotos</translation> <translation id="7274077256421167535">Habilitar el uso compartido de energía por USB</translation> <translation id="7275334191706090484">Favoritos administrados</translation> @@ -7959,6 +8033,9 @@ Si no la estableces, el contraste alto estará inicialmente inhabilitado en la pantalla de acceso, pero el usuario podrá habilitarlo en cualquier momento.</translation> <translation id="7864539943188674973">Desactivar Bluetooth</translation> <translation id="7869986671709030417">Modo predeterminado de impresión de los gráficos de fondo</translation> +<translation id="7872692545596413465">Si habilitas esta política y, luego, introduces un puerto no estándar (es decir, cualquiera que no sea el 80 ni el 443), ese puerto se incluirá en el SPN de Kerberos generado. + +Si la inhabilitas o no la estableces, el SPN de Kerberos que se genere no incluirá ningún puerto.</translation> <translation id="7877924399554599110">Permite combinar las políticas de nube destinadas a los usuarios con las políticas de la máquina</translation> <translation id="7881421274383404138">Si estableces esta política, se configurarán las impresoras empresariales. Su formato coincide con el diccionario de <ph name="PRINTERS_POLICY_NAME" />. Incluye un campo <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> obligatorio adicional para cada impresora para la lista de impresoras permitidas o bloqueadas. El tamaño del archivo no puede superar los 5 MB y está en formato JSON (un archivo de ese tamaño contiene aproximadamente 21,000 impresoras). El hash criptográfico permite verificar la integridad de la descarga. Cada vez que cambie la URL o el hash, se descargará el archivo, se almacenará en caché y se volverá a descargar. <ph name="PRODUCT_OS_NAME" /> descargará el archivo para las configuraciones de impresoras y hará que las impresoras estén disponibles junto con <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> y <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" />. @@ -8011,6 +8088,11 @@ Esta política empresarial existe para permitir que los administradores controlen si sus usuarios pueden activar o no la limitación adicional. Si la inhabilitas, no se podrá habilitar la limitación. Si habilitas la política o no la estableces, el usuario podrá habilitar la limitación, o bien se podrá habilitar mediante variantes de Chrome.</translation> <translation id="793188693675675950">Inhabilitar la importación de la página principal en la primera ejecución</translation> +<translation id="7932017046032784156">Si habilitas la política, se mostrará el ícono de Cast en la barra de herramientas o el menú ampliado; los usuarios no podrán quitarlo. + +Si la inhabilitas o no la estableces, los usuarios podrán fijar o quitar el ícono desde el menú contextual. + +Si inhabilitas la política <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" />, el valor de esta política no tendrá ningún efecto y no se mostrará el ícono de la barra de herramientas.</translation> <translation id="7933141401888114454">Habilita la creación de usuarios supervisados.</translation> <translation id="793473937901685727">Establecer la disponibilidad de certificados para apps de ARC</translation> <translation id="7936302526928951356">El string usuario-agente no bloqueará los cambios para la versión principal</translation> @@ -8805,6 +8887,9 @@ <translation id="8584279193368801689">Restringe el modo de impresión con PIN. Si no se configura la política, no se aplicará ninguna restricción. Si el modo no está disponible, se ignorará esta política. Ten en cuenta que solo se habilitará la función de impresión con PIN para impresoras que usen uno de los siguientes protocolos: IPPS, HTTPS, USB o IPP por USB.</translation> <translation id="8587229956764455752">Permitir la creación de nuevas cuentas de usuario</translation> <translation id="8589285015138337712">No permitir que el usuario personalice las combinaciones de teclas del sistema</translation> +<translation id="8589346048177748110">Si estableces la política como verdadera, los usuarios podrán jugar al juego del dinosaurio. Si estableces la política como falsa, los usuarios no podrán jugar al juego del huevo de pascua del dinosaurio cuando el dispositivo esté sin conexión. + +Si no la estableces, los usuarios no podrán jugar al juego en el <ph name="PRODUCT_OS_NAME" /> registrado, pero podrán hacerlo en otras circunstancias.</translation> <translation id="8591713876665299827">Ten en cuenta que esta política es obsoleta y se quitará en la versión 85 de <ph name="PRODUCT_OS_NAME" />. En su lugar, utiliza <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Especifica el período sin intervención del usuario después del cual se ejecutará la acción de inactividad cuando el dispositivo esté funcionando con CA.
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 8f1fff9..00af7df 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -966,6 +966,11 @@ <translation id="1861206724856734193">Configura una lista de reglas de prevención de filtración de datos.</translation> <translation id="1862267110714201519">Inhabilitar la función de ventana fantasma</translation> <translation id="1865417998205858223">Permisos clave</translation> +<translation id="1865867000796030567">Si se habilita esta política, el valor de la clave del archivo de manifiesto de <ph name="REQUIRED_PLATFORM_VERSION" /> de la aplicación de kiosco sin retardo con inicio automático se usará como prefijo de la versión de destino de actualización automática. + +Si se inhabilita o no se define, la clave del archivo de manifiesto <ph name="REQUIRED_PLATFORM_VERSION" /> se ignorará y la actualización automática se realizará con normalidad. + +Advertencia: No delegues el control de la versión de <ph name="PRODUCT_OS_NAME" /> a una aplicación de kiosco, ya que podría impedir que el dispositivo reciba actualizaciones de software y correcciones de seguridad importantes. Si se delega el control de la versión de <ph name="PRODUCT_OS_NAME" />, se podría poner en riesgo a los usuarios.</translation> <translation id="186719019195685253">Acción a emprender si se alcanza el retraso de inactividad mientras el dispositivo está conectado a la red eléctrica</translation> <translation id="1869688072690234823">Si se define esta política, controlará qué factores de WebAuthn se pueden usar. @@ -1214,6 +1219,11 @@ Si esta política no se define o se le asigna una lista vacía, no habrá ningún modo de desbloqueo rápido disponible para los dispositivos administrados. Esta política está obsoleta. Usa la política <ph name="QUICK_UNLOCK_MODE_ALLOW_LIST_POLICY_NAME" /> en su lugar</translation> +<translation id="2035995535603698706">Si se habilita esta política, se permite que las imágenes de terceros de una página muestren una solicitud de autenticación. + +Si se inhabilita la política o no se define, las imágenes de terceros no podrán mostrar una solicitud de autenticación. + +Esta política suele estar inhabilitada para ofrecer protección contra phishing.</translation> <translation id="2036522553891755455">Si se habilita esta política, la búsqueda de sistemas de archivos compartidos (la función de sistemas de archivos compartidos en red de <ph name="PRODUCT_NAME" />) usará el <ph name="NETBIOS_PROTOCOL" /> para buscar sistemas en la red. Si se inhabilita, la búsqueda de sistemas de archivos compartidos no usará ese protocolo para buscar sistemas de archivos compartidos en la red. Si no se asigna ningún valor a esta política, el comportamiento estará inhabilitado para los usuarios gestionados y habilitado para el resto de los usuarios de forma predeterminada.</translation> @@ -1381,6 +1391,19 @@ Para obtener más información sobre las sesiones <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, consulta la especificación de <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation> <translation id="2175353308236295184">Objeto de configuración JSON específico de la aplicación con un conjunto de pares clave-valor; por ejemplo, '"managedConfiguration": { "key1": value1, "key2": value2 }'. Las claves se definen en el manifiesto de la aplicación.</translation> <translation id="2176115444876446233">Evita que los usuarios recojan trazas de rendimiento del sistema.</translation> +<translation id="2177382213857119200">Te permite controlar si la función Navegación segura de <ph name="PRODUCT_NAME" /> está habilitada y el modo en el que funciona. + + Si se le asigna el valor NoProtection (valor 0) a esta política, Navegación segura no estará activa nunca. + + Si se le asigna el valor StandardProtection (valor 1, que es el predeterminado), Navegación segura estará siempre activa en modo Estándar. + + Si se le asigna el valor EnhancedProtection (valor 2), Navegación segura estará siempre activa en modo Mejorado, que aunque proporciona mayor seguridad, requiere compartir más información de navegación con Google. + + Si defines esta política como obligatoria, los usuarios no podrán cambiar ni anular el ajuste Navegación segura en <ph name="PRODUCT_NAME" />. + + Si no se define esta política, Navegación segura funcionará en modo Protección estándar, pero los usuarios podrán cambiar este ajuste. + + Consulta https://support.google.com/chrome?p=safe_browsing_preferences para obtener más información sobre Navegación segura.</translation> <translation id="2177696016354404697">Inhabilitar siempre la pantalla de privacidad</translation> <translation id="2178899310296064282">Aplicar como mínimo el modo restringido moderado en YouTube</translation> <translation id="2180958780733364832">Controla el uso del modo sin interfaz gráfica</translation> @@ -2021,6 +2044,11 @@ Si se le asigna el valor false, el visor de PDF no podrá anotar PDFs.</translation> <translation id="2769952903507981510">Configurar el nombre de dominio obligatorio para hosts de acceso remoto</translation> +<translation id="2770376586681635746">Controla si los usuarios pueden añadir cuentas de Kerberos. + +Si se habilita esta política o no se define, los usuarios podrán añadir cuentas de Kerberos a través de la configuración de cuentas de Kerberos en la página de configuración de cuentas de Kerberos. Los usuarios tendrán control total sobre las cuentas que han añadido y podrán modificarlas o eliminarlas. + +Si se inhabilita esta política, los usuarios no podrán añadir cuentas de Kerberos. Solo se podrán añadir cuentas mediante la política "Configurar cuentas de Kerberos". Esta es una forma eficaz de bloquear cuentas.</translation> <translation id="2772231477628401250">Usar HTTP para descargar actualizaciones</translation> <translation id="2772955711376920612">Si se habilita la política y se establecen <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> y <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" />, se mantiene activado el cambio de alimentación en picos (en caso de ser compatible con el dispositivo). La política de gestión del cambio de alimentación en picos es una política de ahorro de energía que minimiza el uso de corriente alterna durante las horas en las que más energía se utiliza del día. Para ejecutar el modo de cambio de alimentación en picos, se puede configurar una hora de inicio y de finalización para cada día de la semana. Siempre y cuando la batería se mantenga por encima del umbral especificado, el dispositivo funciona con la batería durante esas horas (aunque esté conectada la corriente alterna). Después de la hora de finalización especificada, el dispositivo funcionará con corriente alterna (si está conectada), pero no cargará la batería. El dispositivo volverá a funcionar con normalidad usando la corriente alterna y cargando la batería después de la hora de inicio de carga especificada. @@ -3748,6 +3776,9 @@ Si no se establece esta política, es posible que la resolución de DNS del sistema se ejecute dentro del servicio de red, fuera del servicio de red, o bien parcialmente dentro y fuera de él, en función de la configuración del sistema y las marcas de funciones.</translation> <translation id="4239720644496144453">La caché no se utiliza en las aplicaciones para Android. Si varios usuarios instalan la misma aplicación para Android, se descargará una nueva para cada uno de ellos.</translation> <translation id="424318624725112807">Habilitar el resaltado del cursor de texto en la pantalla de inicio de sesión</translation> +<translation id="4245159233848584683">Si se habilita esta política o no se define, en caso de que una cuenta local de un dispositivo sin conexión se haya configurado para el inicio de sesión automático sin retardo, <ph name="PRODUCT_OS_NAME" /> mostrará una solicitud de configuración de red. + +Si se inhabilita, se mostrará un mensaje de error en lugar de la solicitud de configuración de red.</translation> <translation id="4248277954659222481">Permitir la reproducción automática de contenido multimedia en una lista de patrones de URL permitidos</translation> <translation id="4250680216510889253">No</translation> <translation id="4252522848899331223">Permitir que el usuario omita las advertencias de Navegación segura</translation> @@ -3898,6 +3929,11 @@ <translation id="4410236409016356088">Habilitar la limitación de ancho de banda</translation> <translation id="4411734231900934213">La diferencia permitida entre el reloj de los dispositivos del niño/a y del padre o madre (en segundos).</translation> <translation id="441217499641439905">Inhabilitar Google Drive a través de conexiones móviles en la aplicación Archivos de <ph name="PRODUCT_OS_NAME" /></translation> +<translation id="4412885120239670573">Si se habilita esta política, se desactivará el visor interno de PDF en <ph name="PRODUCT_NAME" />, los archivos PDF se tratarán como descargas y los usuarios podrán abrir PDFs con la aplicación predeterminada. + +Si se inhabilita, se abrirán los archivos PDF, a menos que los usuarios desactiven el complemento de PDF. + +Si se define esta política, los usuarios no podrán modificarla en <ph name="PRODUCT_NAME" />. Si no se define, los usuarios podrán elegir si se abren o no los PDFs de forma externa.</translation> <translation id="4413453659814156568">Te permite definir una lista con patrones de URL de sitios donde se especifique qué sitios pueden ejecutar JavaScript con un compilador en tiempo de ejecución (JIT) habilitado. Para obtener información detallada sobre los patrones de URL de sitios válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> no es un valor aceptado para esta política. @@ -4005,6 +4041,7 @@ <translation id="4482784169143060077">Habilitar los cambios automáticos a HTTPS</translation> <translation id="4483120730995943109">Si la función de JavaScript setTimeout() tiene un tiempo de espera de 0 ms, no se redondeará a 1 ms.</translation> <translation id="4483649828988077221">Inhabilitar actualización automática</translation> +<translation id="4483738129334574255">Inhabilitar el juego del huevo de pascua del dinosaurio en dispositivos <ph name="PRODUCT_OS_NAME" /> registrados y habilitarlo en otras circunstancias</translation> <translation id="4484515651939984695">Especifica cuánto tiempo (en segundos) permanece un dispositivo de emisión seleccionado con un código de acceso o un código QR en la lista de dispositivos de emisión del menú de <ph name="PRODUCT_NAME" />.</translation> <translation id="4485425108474077672">Configurar la URL de la página Nueva pestaña</translation> <translation id="4490420545181481759">Los certificados X.509 pueden codificar restricciones, como restricciones de nombres, en extensiones del certificado. RFC 5280 especifica que implementar obligatoriamente estas restricciones en los certificados de anclas de confianza es opcional. A partir de la versión 112 de <ph name="PRODUCT_NAME" />, se implementarán obligatoriamente estas restricciones en los certificados cargados desde el almacén de certificados de la plataforma. @@ -4314,6 +4351,7 @@ En las instancias de <ph name="MAC_OS_NAME" />, las aplicaciones y extensiones externas a Chrome Web Store solo se podrán instalar de manera forzada si la instancia se gestiona mediante MDM, está vinculada a un dominio a través de MCX o se ha registrado en <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />.</translation> <translation id="4742973303930120836">Restringir el modo de impresión con gráficos de fondo</translation> +<translation id="4744467872051608680">A partir de la versión M119, si se le asigna el valor false a esta política o no se define, WebSQL se inhabilitará, pero se podrá habilitar mediante la marca de Chrome "web-sql-access". Si se le asigna el valor true, se habilitará el acceso a WebSQL.</translation> <translation id="4745232963710538589">Habilitar la extensión de estadísticas para informar sobre métricas de uso</translation> <translation id="4749670563834935149">Habilita <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> para una lista de URLs en las pantallas de inicio de sesión y de bloqueo. @@ -4894,6 +4932,9 @@ Para obtener información detallada sobre los patrones de <ph name="URL_LABEL" /> válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Esta política solo detecta coincidencias basadas en el origen, así que se ignora cualquier ruta del patrón de URL.</translation> <translation id="5318185076587284965">Habilita el uso de servidores de retransmisión por parte del host de acceso remoto</translation> +<translation id="5321624917465764266">Si la política se habilita o no se define, el historial de navegación y el historial de descargas se podrán eliminar en Chrome, y los usuarios no podrán cambiar este ajuste. + +Si la política se inhabilita, el historial de navegación y el de descargas no se podrán eliminar. Aunque la política esté desactivada, no se garantiza que los historiales de navegación y de descargas se puedan conservar. Es posible que los usuarios puedan editar o eliminar directamente los archivos de la base de datos del historial. Además, el propio navegador puede archivar o clasificar como caducados elementos del historial en cualquier momento.</translation> <translation id="5323200200131319468">Habilitar los mensajes de voz en la pantalla de inicio de sesión</translation> <translation id="5323271643727095577">No mostrar el cuadro de diálogo de cancelación cuando se llame a event.preventDefault() para el evento beforeunload. Mostrar el cuadro de diálogo de cancelación cuando beforeunload event.returnValue sea la cadena vacía del evento beforeunload.</translation> <translation id="5323355956693037267">Habilitar el teclado en pantalla en la pantalla de inicio de sesión</translation> @@ -5135,6 +5176,9 @@ <translation id="5535256585099022933">Definir el intervalo de tiempo para el reinicio</translation> <translation id="553806128266843748">Un indicador booleano que especifica si las limitaciones de ancho de banda están habilitadas.</translation> <translation id="5540885720415375851">Permitir descubrimiento de dispositivos locales</translation> +<translation id="5542235730745104308">Si se asigna el valor true a esta política, <ph name="PRODUCT_NAME" /> usará páginas de error alternativas que vienen incorporadas (como "No se encuentra la página"). Si se le asigna el valor false, <ph name="PRODUCT_NAME" /> nunca usará páginas de error alternativas. + +Si se define esta política, los usuarios no podrán modificarla. Si no se define, la política estará activada, pero los usuarios podrán cambiar este ajuste.</translation> <translation id="5544059132156503357">Si se define esta política, se designará qué tipos de cifrado se admiten cuando se solicitan tickets de Kerberos de un servidor de <ph name="MS_AD_NAME" />. Estos son los efectos de cada valor: @@ -5900,6 +5944,9 @@ <translation id="625580680776945310">Se habilitará el modo Alta eficiencia.</translation> <translation id="6258658183356534534">Controla la función User-Agent Client Hints GREASE Update.</translation> <translation id="6261643884958898336">Proporcionar información de identificación de equipos</translation> +<translation id="6264247808139384018">Si se habilita esta política o no se define, se permitirá que los usuarios que usen la autenticación con contraseña bloqueen la pantalla. + +Si se inhabilita, los usuarios no podrán bloquear la pantalla. Solo podrán cerrar la sesión de usuario.</translation> <translation id="6265892395051519509">Permitir el acceso a los sensores en estos sitios web</translation> <translation id="6266043141694454734">Determina si Chrome Root Store y el verificador de certificados integrado se usarán para verificar los certificados de los servidores</translation> <translation id="6267130578410325007">Esta política permite los clústeres de agentes con clave de origen de forma predeterminada. @@ -6144,6 +6191,9 @@ <translation id="6412352702230183710">Permitir solo hosts de mensajería nativa a nivel de sistema</translation> <translation id="6416506846917150119">Inhabilitar la escritura predictiva en el teclado físico cuando los usuarios escriban</translation> <translation id="6417265370957905582">Asistente de Google</translation> +<translation id="6421254653839955267">Si se habilita esta política, se omitirá la consulta de CNAME. El nombre del servidor se usará tal como se haya introducido al generar el SPN de Kerberos. + +Si se inhabilita esta política o no se define, se hará una consulta de CNAME para determinar el nombre canónico del servidor al generar el SPN de Kerberos.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6424486395812679373">Realizar comprobaciones de Navegación segura en todos los archivos descargados</translation> <translation id="6433697627431665375">Impedir que se incluyan datos de <ph name="PRODUCT_NAME" /> en copias de seguridad</translation> @@ -6281,6 +6331,11 @@ El valor de esta política debe especificarse en milisegundos. Los valores deben ser inferiores al retraso de inactividad.</translation> <translation id="6497085755801788141">Usar el verificador de certificados integrado</translation> +<translation id="6504720469162323184">Si se define esta política, determinará la cantidad de tiempo (en milisegundos) que debe pasar sin actividad de usuario para que se inicie sesión automáticamente en la cuenta local del dispositivo especificada en la política <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" />. + +Si no se define, el tiempo de espera será de 0 milisegundos. + +Esta política no tendrá efecto si no se define la política <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" />.</translation> <translation id="65055701428353978">Si se define esta política, se especificará para cada extensión afectada una lista de URLs de redirección de OAuth que pueden ser usadas por las extensiones con la API <ph name="IDENTITY_API_NAME" /> (<ph name="IDENTITY_API_URL" />), además de la URL de redirección estándar https://<extension id>.chromiumapp.org/. Si no se define esta política o se proporciona una lista vacía de URLs, todas las aplicaciones o extensiones solo podrán usar la URL de redirección estándar cuando usen la API <ph name="IDENTITY_API_NAME" />.</translation> @@ -6380,6 +6435,7 @@ Ten en cuenta que EnabledPlugins y DisabledPluginsExceptions pueden anular esta política. Si no se asigna ningún valor a esta política, el usuario puede utilizar cualquier complemento que esté instalado en el sistema, excepto complementos incompatibles preprogramados, obsoletos o peligrosos.</translation> +<translation id="6571055160227165318">Permitir que una marca de Chrome inhabilite WebSQL</translation> <translation id="6574903167639386816">Borrar los datos del perfil del disco cuando finalice la sesión del usuario</translation> <translation id="6575403002861093126">Si se establece esta política, se especificará en horas el tiempo de vida en caché de Group Policy Object (GPO). La duración máxima durante la cual los GPO pueden reutilizarse antes de que sea necesario volver a descargarlos. En lugar de volver a descargar los GPO cada vez que se recogen datos de políticas, el sistema puede reutilizar los GPO almacenados en caché siempre que su versión no cambie. @@ -6508,6 +6564,11 @@ Si se inhabilita la política o no se establece, los comandos de impresión muestran la pantalla de vista previa de impresión</translation> <translation id="6655274714135630366">Hash SHA-256 codificado en formato hexadecimal de la imagen de disco.</translation> +<translation id="6655844456903132379">Si se habilita esta política, la autenticación HTTP respetará la aprobación por parte de la política del centro de distribución de claves (KDC). Es decir, <ph name="PRODUCT_NAME" /> delegará las credenciales de usuario al servicio al que se esté accediendo si el KDC define el valor <ph name="OK_AS_DELEGATE" /> en el ticket de servicio. Consulta la RFC 5896 (https://tools.ietf.org/html/rfc5896.html). También es necesario que <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> permita este servicio. + +Si se inhabilita esta política o no se define, se ignorará la política del KDC en las plataformas admitidas y solo se respetará la política <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />. + +En <ph name="MS_WIN_NAME" />, la política del KDC se respeta siempre.</translation> <translation id="6658245400435704251">Especifica el número de segundos hasta los que un dispositivo puede retrasar aleatoriamente la descarga de una actualización desde el momento en el que esta se envío al servidor por primera vez. El dispositivo puede dedicar una parte de este tiempo al propio proceso de actualización y el resto a realizar las comprobaciones necesarias. En cualquier caso, el límite superior de la dispersión es un periodo de tiempo constante, para que el dispositivo no se quede bloqueado mientras descarga una actualización.</translation> <translation id="6659537776197644458">No activar flujos de autenticación para la sincronización de contraseñas</translation> <translation id="6661178198729301029">Habilitar los informes en la nube de un perfil gestionado</translation> @@ -7045,6 +7106,11 @@ Si se le asigna el valor False, se inhabilitará esta función.</translation> <translation id="7123271473727774529">Habilitar la función de accesibilidad de corrección de color</translation> <translation id="7126716959063786004">Habilitar la finalización de procesos en el administrador de tareas</translation> +<translation id="7126787606641224668">Permite controlar si la función Recordar contraseña está habilitada en el cuadro de diálogo de autenticación de Kerberos. Las contraseñas se almacenan cifradas en disco y solo se puede acceder a ellas con el daemon del sistema Kerberos durante una sesión de usuario. + +Si se habilita esta política o no se define, los usuarios podrán decidir si se recuerdan las contraseñas de Kerberos para que no tengan que introducirlas de nuevo. Los tickets de Kerberos se obtienen automáticamente a menos que se necesite una autenticación adicional (autenticación de dos factores). + +Si se inhabilita esta política, nunca se recordarán las contraseñas y se eliminarán todas las contraseñas almacenadas anteriormente. Los usuarios tendrán que introducir la contraseña cada vez que quieran autenticarse con el sistema Kerberos. Según la configuración del servidor, esto puede ocurrir cada 8 horas o cada varios meses.</translation> <translation id="7126928806195745404">Configuración de JavaScript</translation> <translation id="7127980134843952133">Historial de descargas</translation> <translation id="7128513247945602297">Habilitar la actualización automática de contenido mixto en sitios HTTPS</translation> @@ -7112,6 +7178,9 @@ <translation id="7157329428182136164">Habilitar compatibilidad con APIs de gráficos 3D</translation> <translation id="7158358621906236999">Configuración predeterminada de los sensores</translation> <translation id="7161568070244869726">Forzar que se habilite AppCache</translation> +<translation id="7165879643294314958">Si se habilita esta política o no se define, se configurará una cuenta local del dispositivo para el inicio de sesión automático sin retardo. <ph name="PRODUCT_OS_NAME" /> permitirá usar la combinación de teclas Ctrl + Alt + S para omitir el inicio de sesión automático y mostrar la pantalla de inicio de sesión. + +Si se inhabilita, los usuarios no podrán omitir el inicio de sesión automático sin retardo (si se ha configurado).</translation> <translation id="7165882688932913315">Esta política determina el acceso a las funciones controlables de la interfaz de descubrimiento de dispositivos (<ph name="CHROME_DEVICES_LINK" />), que muestra los dispositivos visibles cercanos al usuario, así como los dispositivos en la nube que tenga registrados. En todos los sistemas operativos, excepto <ph name="PRODUCT_OS_NAME" />, la interfaz de descubrimiento de dispositivos también permite a los usuarios añadir a <ph name="CLOUD_PRINT_NAME" /> las impresoras clásicas conectadas a sus ordenadores. Si se habilita la política o no se define, se permitirá el descubrimiento de dispositivos locales. @@ -7228,6 +7297,11 @@ <translation id="7269263983506766969">Utiliza la prioridad predeterminada para el proceso de audio</translation> <translation id="7270001383428188269">El identificador de este certificado de cliente.</translation> <translation id="7271085005502526897">Importar la página de inicio desde el navegador predeterminado en la primera ejecución</translation> +<translation id="7272892848025145170">Controla si la función Kerberos está habilitada. Kerberos es un protocolo de autenticación que puede usarse para autenticarse en aplicaciones web y en archivos compartidos. + +Si se habilita esta política, se habilitará la función Kerberos. Las cuentas de Kerberos pueden añadirse mediante la política "Configurar cuentas de Kerberos" o a través de la configuración de cuentas de Kerberos en la página de configuración de cuentas de Kerberos. + +Si se inhabilita esta política o no se define, se inhabilitará la configuración de cuentas de Kerberos. No se podrán añadir cuentas de Kerberos ni se podrá utilizar la autenticación de Kerberos. Se eliminarán todas las cuentas de Kerberos ya añadidas y todas las contraseñas almacenadas.</translation> <translation id="7273785848231509306">No mostrar nunca nombres ni fotos de usuarios</translation> <translation id="7274077256421167535">Habilita la potencia compartida por USB</translation> <translation id="7275334191706090484">Marcadores administrados</translation> @@ -7895,6 +7969,9 @@ Si no se asigna ningún valor a esta política, el contraste alto se inhabilitará inicialmente en la pantalla de inicio de sesión, pero el usuario podrá habilitarlo en cualquier momento.</translation> <translation id="7864539943188674973">Inhabilitar Bluetooth</translation> <translation id="7869986671709030417">Modo de impresión de gráficos de fondo predeterminado</translation> +<translation id="7872692545596413465">Si se habilita esta política y se introduce un puerto no estándar (es decir, cualquier puerto que no sea el 80 ni el 443), ese puerto se incluirá en el SPN de Kerberos generado. + +Si se inhabilita o no se define, el SPN de Kerberos no incluirá ningún puerto.</translation> <translation id="7877924399554599110">Habilita la fusión de políticas basadas en la nube a nivel de usuario con políticas a nivel de ordenador</translation> <translation id="7881421274383404138">Esta política configura las impresoras de empresa. El formato es el mismo que el del diccionario <ph name="PRINTERS_POLICY_NAME" />, con un campo adicional <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> obligatorio por impresora para incluirla en una lista de permitidas o bloqueadas. El tamaño del archivo no debe exceder los 5 MB y debe estar en formato JSON. El tamaño de un archivo que contiene unas 21.000 impresoras es de 5 MB. El hash criptográfico ayuda a comprobar la integridad de la descarga. Si se cambia la URL o el hash, el archivo se descarga, se almacena en caché y se vuelve a descargar. <ph name="PRODUCT_OS_NAME" /> descarga el archivo con las configuraciones de las impresoras y estas están disponibles según lo especificado en las políticas <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> y <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" />. @@ -7947,6 +8024,11 @@ La finalidad de esta política de empresa es permitir que los administradores controlen si sus usuarios pueden activar o no la limitación adicional. Si se inhabilita esta política, se impedirá que se habilite la limitación. Si se habilita esta política o no se define, el usuario podrá habilitar la limitación o esta se podrá habilitar mediante variaciones de Chrome.</translation> <translation id="793188693675675950">Inhabilitar la importación de la página principal en la primera ejecución</translation> +<translation id="7932017046032784156">Si se habilita esta política, se mostrará el icono de la barra de herramientas para enviar contenido en la barra de herramientas o en el menú adicional, y los usuarios no podrán quitarlo. + +Si se inhabilita o no se define, los usuarios podrán fijar o quitar el icono a través del menú contextual. + +Si se inhabilita la política <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" />, el valor de esta política no tendrá efecto y el icono de la barra de herramientas no se mostrará.</translation> <translation id="7933141401888114454">Habilitar la creación de usuarios supervisados</translation> <translation id="793473937901685727">Establecer la disponibilidad del certificado para las aplicaciones ARC</translation> <translation id="7936302526928951356">La cadena user-agent no bloqueará la versión principal.</translation> @@ -8716,6 +8798,9 @@ <translation id="8584279193368801689">Restringe el modo de impresión con PIN. Si no se establece esta política, no se aplicará ninguna restricción. Si el modo no está disponible, se ignorará esta política. Ten en cuenta que la función de impresión con PIN solo está habilitada en impresoras que utilizan uno de los protocolos IPPS, HTTPS, USB o IPP por USB.</translation> <translation id="8587229956764455752">Permitir la creación de nuevas cuentas de usuario</translation> <translation id="8589285015138337712">No permitir que el usuario personalice los accesos directos del sistema</translation> +<translation id="8589346048177748110">Si se asigna el valor true a esta política, los usuarios podrán jugar al juego del dinosaurio. Si se le asigna el valor false, los usuarios no podrán jugar al juego del huevo de pascua del dinosaurio cuando el dispositivo no tenga conexión. + +Si no se define esta política, los usuarios no podrán jugar al juego del dinosaurio en dispositivos <ph name="PRODUCT_OS_NAME" /> registrados, pero podrán hacerlo en otras circunstancias.</translation> <translation id="8591713876665299827">Ten en cuenta que esta política está obsoleta y se eliminará de la versión 85 de <ph name="PRODUCT_OS_NAME" />. Utiliza <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> en su lugar. Permite especificar el tiempo que debe transcurrir sin que el usuario realice ninguna acción antes de que se habilite el modo de inactividad (con conexión a la red eléctrica).
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 7f178fc..687c299 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -634,6 +634,11 @@ Jika kebijakan disetel ke Nonaktif, permintaan HTTP yang tidak aman akan dilarang menggunakan skema autentikasi <ph name="BASIC_AUTH" />; hanya HTTPS yang diizinkan. Setelan kebijakan ini akan diabaikan (dan <ph name="BASIC_AUTH" /> akan selalu dilarang) jika kebijakan <ph name="AUTH_SCHEMES_POLICY_NAME" /> disetel dan <ph name="BASIC_AUTH" /> tidak disertakan.</translation> +<translation id="1573074208167290576">Mengizinkan Anda menetapkan apakah pengguna dapat menambahkan pengecualian untuk mengizinkan konten campuran bagi situs tertentu. + +Kebijakan ini dapat diganti dengan pola URL tertentu menggunakan kebijakan 'InsecureContentAllowedForUrls' dan 'InsecureContentBlockedForUrls'. + +Jika kebijakan ini tidak disetel, pengguna akan diizinkan untuk menambahkan pengecualian guna mengizinkan konten campuran yang dapat diblokir dan menonaktifkan upgrade otomatis untuk konten campuran yang dapat diblokir secara opsional.</translation> <translation id="1573444493980402757">Memungkinkan Anda menetapkan daftar pola URL situs yang menentukan situs yang akan otomatis menolak izin penempatan jendela. Hal ini akan membatasi kemampuan situs untuk melihat informasi tentang layar perangkat dan menggunakan informasi tersebut untuk membuka dan menempatkan jendela atau meminta mode layar penuh pada layar tertentu. Untuk informasi selengkapnya tentang pola URL situs yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Karakter pengganti, <ph name="WILDCARD_VALUE" />, diizinkan. Kebijakan ini hanya mencocokkan berdasarkan asal, sehingga jalur apa pun di pola URL akan diabaikan. @@ -912,6 +917,13 @@ Kebijakan ini tidak digunakan lagi. Sebagai gantinya, gunakan <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />. </translation> +<translation id="1825583118566970564">Mengontrol penginstalan ekstensi eksternal. + +Jika kebijakan ini disetel ke Aktif, ekstensi eksternal tidak akan dapat diinstal. + +Jika kebijakan ini disetel ke Nonaktif atau tidak disetel, ekstensi eksternal akan dapat diinstal. + +Ekstensi eksternal dan penginstalannya didokumentasikan di https://developer.chrome.com/apps/external_extensions.</translation> <translation id="1827523283178827583">Gunakan server proxy tetap</translation> <translation id="1829117241432374848">Akun terkelola harus berupa akun utama yang tidak memiliki akun sekunder dan pengguna dapat mengimpor data penjelajahan yang ada pada saat pembuatannya</translation> <translation id="1829839214911753838">Jika kebijakan disetel ke Aktif, host bantuan jarak jauh akan berjalan dalam proses dengan izin <ph name="UIACCESS_PERMISSION_NAME" />. Ini memungkinkan pengguna jarak jauh berinteraksi dengan jendela administrator di desktop pengguna lokal. @@ -991,6 +1003,15 @@ Kolom <ph name="RUN_ON_OS_LOGIN_FIELD" /> menentukan apakah aplikasi web dapat dijalankan selama login OS. Jika kolom ini disetel ke <ph name="BLOCKED" />, aplikasi web tidak akan dijalankan selama login OS dan pengguna tidak akan dapat mengaktifkannya nanti. Jika kolom ini disetel ke <ph name="RUN_WINDOWED" />, aplikasi web akan dijalankan selama login OS dan pengguna tidak akan dapat menonaktifkannya nanti. Jika kolom ini disetel ke <ph name="ALLOWED" />, pengguna akan dapat mengonfigurasi aplikasi web untuk dijalankan saat login OS. Konfigurasi default hanya mengizinkan nilai <ph name="ALLOWED" /> dan <ph name="BLOCKED" />. (Sejak versi 117) Kolom <ph name="PREVENT_CLOSE_FIELD" /> menentukan apakah aplikasi web harus dicegah agar tidak ditutup dengan cara apa pun (mis. oleh pengguna, pengelola tugas, API web). Perilaku ini hanya dapat diaktifkan jika <ph name="RUN_ON_OS_LOGIN_FIELD" /> disetel ke <ph name="RUN_WINDOWED" />. Jika aplikasi sudah berjalan, properti ini hanya akan berlaku setelah aplikasi dimulai ulang. Jika kolom ini tidak ditentukan, aplikasi akan dapat ditutup oleh pengguna. (Sejak versi 118) Kolom <ph name="FORCE_UNREGISTER_OS_INTEGRATION" /> menentukan apakah semua integrasi OS untuk aplikasi web, yaitu pintasan, pengendali file, pengendali protokol, dll. akan dihapus atau tidak. Jika aplikasi sudah berjalan, properti ini akan berlaku setelah aplikasi dimulai ulang. Tindakan ini harus digunakan dengan hati-hati, karena hal ini dapat mengganti integrasi OS apa pun yang disetel otomatis saat sistem aplikasi web dimulai. Saat ini hanya berfungsi di platform Windows, Mac, dan Linux.</translation> +<translation id="1874719875297132073">Kebijakan ini mengontrol apakah informasi yang dapat digunakan untuk mengidentifikasi pengguna akan dilaporkan atau tidak, misalnya login OS, login Profil <ph name="PRODUCT_NAME" />, nama Profil <ph name="PRODUCT_NAME" />, jalur Profil <ph name="PRODUCT_NAME" />, dan jalur <ph name="PRODUCT_NAME" /> yang dapat dieksekusi. + +Jika kebijakan <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> tidak disetel atau disetel ke nonaktif, kebijakan ini akan diabaikan. + +Jika kebijakan ini tidak disetel atau disetel ke Benar (True), informasi yang dapat digunakan untuk mengidentifikasi pengguna akan dikumpulkan. +Jika kebijakan ini disetel ke Salah (False), informasi yang dapat digunakan untuk mengidentifikasi pengguna tidak akan dikumpulkan. + +Kebijakan ini hanya berlaku saat perangkat didaftarkan dengan <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> untuk <ph name="PRODUCT_NAME" />. +Kebijakan ini selalu berlaku untuk <ph name="PRODUCT_OS_NAME" />.</translation> <translation id="1883274744253492031">Aktifkan upgrade otomatis konten campuran</translation> <translation id="1885782360784839335">Mengaktifkan ditampilkannya konten promosi tab penuh</translation> <translation id="1888871729456797026">Token pendaftaran kebijakan cloud di desktop</translation> @@ -1018,6 +1039,9 @@ Jika tidak disetel, halaman Tab Baru akan dibuka saat browser mulai dijalankan. Di <ph name="MS_WIN_NAME" />, kebijakan ini hanya tersedia pada instance yang dihubungkan ke domain <ph name="MS_AD_NAME" />, dihubungkan ke <ph name="MS_AAD_NAME" />, atau didaftarkan di <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />.</translation> +<translation id="1897095538209040086">Jika kebijakan disetel ke Aktif atau tidak disetel, <ph name="PRODUCT_NAME" /> akan menyimpan setidaknya satu tab terbuka setelah beralih ke browser alternatif. + +Jika kebijakan disetel ke Nonaktif, <ph name="PRODUCT_NAME" /> akan menutup tab setelah beralih ke browser alternatif, meskipun tab tersebut adalah tab terakhir. Hal ini menyebabkan <ph name="PRODUCT_NAME" /> keluar sepenuhnya.</translation> <translation id="1897365952389968758">Izinkan semua situs menjalankan JavaScript</translation> <translation id="1902043648529789224">Mengontrol posisi rak</translation> <translation id="1904323733389537794">Jika kebijakan disetel ke Benar (True), pemeriksaan <ph name="OCSP_CRL_LABEL" /> online akan dilakukan. @@ -1492,6 +1516,9 @@ <translation id="225830954785359083">Cegah halaman menampilkan pop-up selama penghapusan muatan</translation> <translation id="2261648512244797294">Nonaktifkan pencetakan privet yang tidak digunakan lagi</translation> <translation id="2266422599396179941">Izinkan pengguna mengirim masukan</translation> +<translation id="2268891553068901979">Jika kebijakan disetel ke Aktif, sinkronisasi <ph name="GOOGLE_DRIVE_NAME" /> di aplikasi File <ph name="PRODUCT_OS_NAME" /> akan dinonaktifkan saat terhubung melalui koneksi seluler. Data hanya disinkronkan ke Drive saat terhubung melalui Wi-Fi atau Ethernet. + +Jika kebijakan disetel ke Nonaktif atau tidak disetel, pengguna akan dapat mentransfer file ke Drive melalui koneksi seluler.</translation> <translation id="2269319728625047531">Aktifkan menampilkan Izin Sinkronisasi saat login</translation> <translation id="2270113153862588648">Jika kebijakan disetel ke Aktif, pengesahan jarak jauh untuk perangkat dapat dilakukan. Sertifikat akan otomatis dibuat dan diupload ke Server Pengelolaan Perangkat. @@ -2011,6 +2038,9 @@ <translation id="2727844239611930002">Izinkan <ph name="PRODUCT_NAME" /> menentukan apakah akan menampilkan perintah <ph name="PRIVACY_SANDBOX_NAME" />.</translation> <translation id="2730200383593984228">Izinkan pengguna yang tidak terafiliasi menggunakan aplikasi Android</translation> <translation id="2730419309754848345">Mencetak PDF sebagai Gambar secara Default</translation> +<translation id="2730644640965800157">Jika kebijakan disetel ke Aktif, sinkronisasi <ph name="GOOGLE_DRIVE_NAME" /> di aplikasi File <ph name="PRODUCT_OS_NAME" /> akan dinonaktifkan. Tidak ada data yang diupload ke Drive. + +Jika kebijakan disetel ke Nonaktif atau tidak disetel, pengguna akan dapat mentransfer file ke Drive.</translation> <translation id="2731299561202635374">Kebijakan ini mengontrol pemeriksaan URL secara real time untuk mengidentifikasi URL yang tidak aman. Jika kebijakan ini tidak disetel atau disetel ke ‘Nonaktif’, pemeriksaan Safe Browsing default akan diterapkan. Pemeriksaan Safe Browsing default tetap dapat disertai pencarian real-time, bergantung pada nilai setelan "Jadikan penelusuran dan penjelajahan lebih baik" dan nilai kebijakan UrlKeyedAnonymizedDataCollectionEnabled. @@ -2071,6 +2101,9 @@ Jika ExternalStorageReadOnly ditetapkan ke Salah (False) atau tidak ditetapkan, pengguna dapat membuat dan memodifikasi file perangkat penyimpanan eksternal yang dapat ditulis secara fisik, kecuali penyimpanan eksternal diblokir. (Anda dapat memblokir penyimpanan eksternal dengan menetapkan ExternalStorageDisable ke Benar (True).)</translation> <translation id="2789742777235177478">Membatasi waktu bagi pengguna yang diautentikasi melalui GAIA tanpa SAML untuk dapat login secara offline di layar kunci</translation> +<translation id="2795923835422513629">Jika kebijakan disetel ke 1, situs akan dapat menampilkan pop-up. Jika kebijakan disetel ke 2, situs tidak akan dapat menampilkan pop-up. + +Jika kebijakan tidak disetel, <ph name="BLOCK_POPUPS_POLICY_NAME" /> akan berlaku, tetapi pengguna dapat mengubah setelan ini.</translation> <translation id="2796714419743648316">Daftar yang Diizinkan terkait Batas Waktu per Aplikasi</translation> <translation id="2801065672151277034">Setelan pengelolaan sertifikat</translation> <translation id="2801155097555584385">Menetapkan nilai awal pengisian daya baterai kustom dalam persen</translation> @@ -2595,6 +2628,9 @@ Untuk informasi selengkapnya tentang pola URL yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> bukanlah nilai yang diterima untuk kebijakan ini.</translation> <translation id="3205825995289802549">Maksimalkan jendela browser pertama di percobaan pertama</translation> +<translation id="320607884987562184">Jika kebijakan disetel ke 1, situs akan dapat menjalankan JavaScript. Jika kebijakan disetel ke 2, situs tidak akan dapat menjalankan JavaScript. + +Jika kebijakan tidak disetel, JavaScript akan diizinkan, tetapi pengguna dapat mengubah setelan ini.</translation> <translation id="3206959584699016689">Menyetel kebijakan memungkinkan Anda menetapkan daftar pola URL yang menentukan situs mana yang dapat mengakses sensor seperti sensor gerakan dan cahaya. Tidak menyetel kebijakan berarti <ph name="DEFAULT_SENSORS_SETTING_POLICY_NAME" /> akan berlaku untuk semua situs, jika disetel. Jika tidak, setelan pribadi pengguna akan digunakan. @@ -2779,6 +2815,10 @@ <translation id="3362584244602846824">Gunakan Transisi Cepat jika titik akses nirkabel mendukungnya</translation> <translation id="3363360928811201045">Menambahkan batasan di akun terkelola</translation> <translation id="3364400740222114778">Pemulihan akun</translation> +<translation id="3367361756115023251">Mengizinkan akses root pengguna ini ke penampung Crostini. + +Jika kebijakan disetel ke benar (true) atau tidak disetel, akses root ke penampung Crostini akan diberikan kepada pengguna. +Jika kebijakan disetel ke salah (false), akses root ke penampung Crostini yang ada maupun yang baru tidak akan diberikan kepada pengguna.</translation> <translation id="3373381043600809954">Mengaktifkan <ph name="PRODUCT_NAME" /></translation> <translation id="3374587000313305002">Mengonfigurasi direktori yang akan digunakan <ph name="PRODUCT_NAME" /> untuk menyimpan data pengguna. @@ -3063,6 +3103,15 @@ <translation id="3554498762428140109">Mengaktifkan Penghalangan Jendela Native</translation> <translation id="3554984410014457319">Mengizinkan Asisten Google mendengarkan frasa aktivasi suara</translation> <translation id="3557586898458302131">Sertakan port non-standar di SPN Kerberos yang dibuat</translation> +<translation id="3558024517032824255">Menentukan jumlah minimum rollback milestone <ph name="PRODUCT_OS_NAME" /> akan diizinkan mulai versi yang stabil kapan saja. + +Jumlah defaultnya adalah 0 untuk pelanggan, 4 (sekitar setengah tahun) untuk perangkat yang didaftarkan perusahaan. + +Jika kebijakan ini disetel, perlindungan rollback tidak akan diterapkan untuk setidaknya jumlah milestone ini. + +Jika kebijakan ini disetel ke nilai yang lebih rendah, hal ini memiliki dampak permanen: perangkat MUNGKIN tidak dapat di-roll back ke versi sebelumnya setelah kebijakan direset ke nilai yang lebih tinggi. + +Kemungkinan rollback aktual juga dapat bergantung pada model perangkat dan patch kerentanan kritis.</translation> <translation id="35668690622495904"> Panggilan tidak akan ditolak jika berasal dari daftar konteks yang tidak diizinkan. (Panggilan mungkin masih dapat ditolak karena alasan lain.)</translation> <translation id="3568762199045490351">Fungsi setTimeout() JavaScript dengan waktu tunggu 0 md akan dibulatkan ke 1 md.</translation> @@ -3137,6 +3186,15 @@ <translation id="3637063789824963261">Jika kebijakan ini disetel ke aktif, perangkat yang terdaftar akan melaporkan penghitung runtime perangkat (khusus Intel vPro Gen 14+). Jika kebijakan ini disetel ke nonaktif atau tidak disetel, perangkat yang terdaftar tidak akan merekam atau melaporkan penghitung runtime perangkat.</translation> +<translation id="3640677352428533707">Kebijakan ini mengontrol apakah informasi versi akan dilaporkan atau tidak, misalnya versi OS, platform OS, arsitektur OS, versi <ph name="PRODUCT_NAME" />, dan saluran <ph name="PRODUCT_NAME" />. + +Jika kebijakan <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> tidak disetel atau disetel ke nonaktif, kebijakan ini akan diabaikan. + +Jika kebijakan ini tidak disetel atau disetel ke Benar (True), informasi versi akan dikumpulkan. +Jika kebijakan ini disetel ke Salah (False), informasi versi tidak akan dikumpulkan. + +Kebijakan ini hanya berlaku saat perangkat didaftarkan dengan <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> untuk <ph name="PRODUCT_NAME" />. +Kebijakan ini selalu berlaku untuk <ph name="PRODUCT_OS_NAME" />.</translation> <translation id="3642557248926713561">Nonaktifkan Perlindungan Ekstensi Safe Browsing</translation> <translation id="3644735978203799620">Mengaktifkan pemilihan otomatis untuk multi-screenshot</translation> <translation id="3646859102161347133">Menyetel jenis lup</translation> @@ -3860,6 +3918,9 @@ Kebijakan ini akan diabaikan dan notifikasi akan selalu ditampilkan jika perangkat tidak dikelola atau hanya terdapat satu pengguna. Jika terdapat beberapa akun pengguna di perangkat terkelola, notifikasi hanya akan ditampilkan saat kebijakan ini diaktifkan.</translation> +<translation id="4297483555396496700">Jika kebijakan ini disetel ke Benar (True), pengguna hanya akan diizinkan mengubah saluran rilis perangkat. Jika kebijakan ini disetel ke Salah (False) atau tidak disetel, pengguna tidak akan diizinkan mengubah saluran. + +Menyetel <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> hanya akan berpengaruh jika <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> disetel ke Salah (False).</translation> <translation id="4298476374822550051">Aktifkan perjanjian kunci pasca-kuantum Kyber untuk TLS</translation> <translation id="4303167373847512281">Izinkan mode developer</translation> <translation id="4307116964468610577">Kebijakan ini memperpanjang masa pakai baterai sistem dengan mengisi daya baterai hingga kapasitas penuh hanya sekali per hari. Selama sisa hari tersebut, baterai berada dalam status pengisian daya lambat dan lebih baik untuk penyimpanan daya, bahkan ketika sistem dicolokkan ke sumber listrik. @@ -3870,6 +3931,9 @@ Pengguna tidak dapat mengubah setelan ini.</translation> <translation id="4309091698378414920">Aktifkan sorotan tanda sisipan</translation> +<translation id="4311141497190183490">Jika kebijakan disetel ke 1, situs akan dapat melacak lokasi fisik pengguna secara default. Jika kebijakan disetel ke 2, situs tidak akan dapat melacak lokasi fisik pengguna secara default. Anda dapat menyetel kebijakan untuk menanyakan setiap kali situs ingin melacak lokasi fisik pengguna. + +Jika kebijakan tidak disetel, kebijakan <ph name="ASK_GEOLOCATION_POLICY_NAME" /> akan berlaku, tetapi pengguna dapat mengubah setelan ini.</translation> <translation id="4311195029067684288">Penuh</translation> <translation id="4311662690937656540">Terapkan login online di layar login dan layar kunci</translation> <translation id="4313767483634435271">Alamat MAC dok yang ditetapkan untuk perangkat</translation> @@ -4017,6 +4081,15 @@ <translation id="445505634382262792">Jika kebijakan disetel ke 3, situs web akan diizinkan meminta akses tulis ke file dan direktori di sistem file sistem operasi host. Jika kebijakan disetel ke 2, akses akan ditolak. Jika tidak disetel, situs dapat meminta akses tetapi pengguna dapat mengubah setelan ini.</translation> +<translation id="4455258118946528063">Kebijakan ini mengontrol apakah informasi ekstensi dan plugin akan dilaporkan atau tidak. + +Jika kebijakan <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> tidak disetel atau disetel ke nonaktif, kebijakan ini akan diabaikan. + +Jika kebijakan ini tidak disetel atau disetel ke Benar (True), data ekstensi dan plugin akan dikumpulkan. +Jika kebijakan ini disetel ke Salah (False), data ekstensi dan plugin tidak akan dikumpulkan. + +Kebijakan ini hanya berlaku saat perangkat didaftarkan dengan <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> untuk <ph name="PRODUCT_NAME" />. +Kebijakan ini selalu berlaku untuk <ph name="PRODUCT_OS_NAME" />.</translation> <translation id="4457113781439375078">Kebijakan ini tidak digunakan lagi. Jika kebijakan disetel ke Aktif, perangkat yang terdaftar akan melaporkan lokasinya secara berkala. @@ -4040,6 +4113,15 @@ <translation id="4467952432486360968">Blokir cookie pihak ketiga</translation> <translation id="4472740647327683596">Lebar halaman dalam mikrometer.</translation> <translation id="4474167089968829729">Aktifkan penyimpanan sandi di pengelola sandi</translation> +<translation id="4475131520521739161">Kecuali kebijakan <ph name="SYSTEM_TIMEZONE_POLICY_NAME" /> menonaktifkan deteksi zona waktu otomatis, menyetel kebijakan akan menguraikan metode deteksi zona waktu otomatis, yang tidak dapat diubah pengguna. + +Jika kebijakan disetel ke: + * <ph name="POLICY_ENUM_SYSTEMTIMEZONEAUTOMATICDETECTION_TIMEZONEAUTOMATICDETECTIONDISABLED" />, deteksi zona waktu otomatis akan tetap nonaktif. + * <ph name="POLICY_ENUM_SYSTEMTIMEZONEAUTOMATICDETECTION_TTIMEZONEAUTOMATICDETECTIONIPONLY" />, deteksi zona waktu otomatis akan tetap aktif, menggunakan metode khusus IP. + * <ph name="POLICY_ENUM_SYSTEMTIMEZONEAUTOMATICDETECTION_TIMEZONEAUTOMATICDETECTIONSENDWIFIACCESSPOINTS" />, deteksi zona waktu otomatis akan tetap aktif, dan daftar titik akses Wi-Fi yang terlihat terus-menerus dikirim ke server Geolocation API untuk deteksi zona waktu yang lebih mendetail. + * <ph name="POLICY_ENUM_SYSTEMTIMEZONEAUTOMATICDETECTION_TIMEZONEAUTOMATICDETECTIONSENDALLLOCATIONINFO" />, deteksi zona waktu otomatis akan tetap aktif, dan informasi lokasi (seperti titik akses Wi-Fi, menara BTS yang dapat dijangkau, GPS) terus-menerus dikirim ke server untuk deteksi zona waktu yang paling mendetail. + +Jika kebijakan tidak disetel, disetel ke Biarkan pengguna memutuskan, atau disetel ke Tidak Ada, pengguna akan mengontrol deteksi zona waktu otomatis menggunakan kontrol normal di chrome://settings.</translation> <translation id="4476769083125004742">Jika kebijakan ini disetel ke <ph name="BLOCK_GEOLOCATION_SETTING" />, aplikasi Android tidak dapat mengakses informasi lokasi. Jika Anda menyetel kebijakan ini ke nilai lain atau tidak menyetel kebijakan, pengguna akan dimintai persetujuan ketika aplikasi Android ingin mengakses informasi lokasi.</translation> <translation id="4478248026668918517">Blokir deteksi cakupan Kebijakan.</translation> <translation id="4479671363221255277">Menyetel kebijakan memungkinkan Anda menetapkan daftar pola URL yang menentukan situs mana yang dapat meminta akses baca ke file atau direktori di sistem file pada sistem operasi host melalui File System API. @@ -4263,6 +4345,9 @@ <translation id="46321462262887935">Perlakukan tombol baris atas sebagai tombol fungsi, tetapi izinkan pengguna mengubahnya</translation> <translation id="4632343302005518762">Izinkan <ph name="PRODUCT_FRAME_NAME" /> menangani jenis konten yang tercantum</translation> <translation id="4636354638176939375">Nonaktifkan pembuatan pengguna yang diawasi</translation> +<translation id="46383668315040154">Menentukan saluran rilis yang harus dikaitkan ke perangkat ini. + +Menyetel <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> hanya akan berpengaruh jika <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> disetel ke Salah (False).</translation> <translation id="4646626362889216307">Jika kebijakan disetel, penggabungan kebijakan yang dipilih akan memungkinkan jika kebijakan tersebut berasal dari sumber yang berbeda, dengan cakupan dan level yang sama. Penggabungan ini ada di kunci level pertama kamus dari setiap sumber. Kunci yang berasal dari sumber prioritas tertinggi akan diutamakan. Gunakan karakter pengganti '*' untuk mengizinkan penggabungan semua kebijakan kamus yang didukung. @@ -4647,6 +4732,14 @@ <translation id="499654521603185442">Pelaporan telemetri situs</translation> <translation id="4997074784107449343">Opsi Cetak sebagai gambar tidak akan disetel sebagai default untuk pratinjau cetak dokumen PDF jika tersedia.</translation> <translation id="500149597848135831">Aktifkan semua variasi</translation> +<translation id="5017157692744444035">Kebijakan ini mengontrol apakah informasi yang dapat digunakan untuk mengidentifikasi perangkat akan dilaporkan atau tidak, misalnya nama perangkat dan alamat jaringan. + +Jika kebijakan <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> tidak disetel atau disetel ke nonaktif, kebijakan ini akan diabaikan. + +Jika kebijakan ini tidak disetel atau disetel ke Benar (True), informasi yang dapat digunakan untuk mengidentifikasi perangkat akan dikumpulkan. +Jika kebijakan ini disetel ke Salah (False), informasi yang dapat digunakan untuk mengidentifikasi perangkat tidak akan dikumpulkan. + +Kebijakan ini hanya berlaku saat perangkat didaftarkan dengan <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> untuk <ph name="PRODUCT_NAME" />.</translation> <translation id="5017369989680827157">Jika kebijakan ditetapkan ke Benar (True) atau tidak ditetapkan, pengguna akan dapat mengontrol fitur Isi otomatis alamat di UI. Jika kebijakan ditetapkan ke Salah (False), Isi otomatis tidak akan menyarankan atau mengisi informasi alamat, juga tidak akan menyimpan informasi alamat tambahan yang dikirimkan pengguna saat menjelajahi web.</translation> @@ -4669,6 +4762,7 @@ <translation id="5036013147560568855">Versi protokol penyediaan sertifikat. Default-nya adalah 1. 1 adalah protokol 'statis'. 2 adalah protokol 'dinamis'.</translation> <translation id="5039110755072335605">Dukungan header permintaan non-karakter pengganti CORS</translation> <translation id="504116558738617678">Hanya tampilkan peringatan ruang penyimpanan hampir penuh jika perangkat tidak dikelola atau hanya terdapat 1 pengguna</translation> +<translation id="5041315457555330432">Izinkan <ph name="PRODUCT_NAME" /> untuk hanya terhubung ke perangkat di alamat IP pribadi, kecuali jika fitur CastAllowAllIPs diaktifkan.</translation> <translation id="5046376406561077773">Pengguna tidak dapat melihat UI yang terkait dengan fitur Sinkronisasi File <ph name="GOOGLE_DRIVE_NAME" />.</translation> <translation id="5055474681190962362">Hari dalam sebulan [1-31] saat mulai ulang harus dilakukan, disesuaikan dengan zona waktu lokal perangkat. Hanya digunakan saat 'frequency'-nya 'MONTHLY'. Jika lebih dari jumlah hari maksimum dalam bulan tertentu, hari terakhir bulan itu akan dipilih.</translation> <translation id="5056708224511062314">Lup dinonaktifkan</translation> @@ -4908,6 +5002,9 @@ Jika kebijakan ditetapkan ke Salah (False) atau tidak ditetapkan, Desktop Terpadu akan dinonaktifkan dan pengguna tidak dapat mengaktifkannya.</translation> <translation id="5255162913209987122">Dapat Direkomendasikan</translation> <translation id="525543707238275321">Nonaktifkan pelaporan info CPU perangkat</translation> +<translation id="5255790642269910630">Jika kebijakan disetel, setiap tampilan akan diputar sesuai dengan setelan orientasi layar setiap kali dimulai ulang dan saat pertama kali terhubung setelah nilai kebijakan berubah. Pengguna dapat mengubah rotasi tampilan melalui halaman setelan setelah login, tetapi tampilan akan kembali berubah saat mulai ulang berikutnya. Kebijakan ini berlaku untuk tampilan utama dan sekunder. + +Jika tidak disetel, nilai default adalah 0 derajat dan pengguna dapat mengubahnya. Dalam hal ini, nilai default tidak diterapkan kembali saat mulai ulang.</translation> <translation id="5257395339965216304">Data aplikasi yang dihosting</translation> <translation id="5258445772095084618">Izinkan pengguna yang tidak terafiliasi menggunakan mesin virtual yang diperlukan untuk mendukung aplikasi Linux</translation> <translation id="5262320080678421295">Nonaktifkan kepercayaan pada sertifikat yang dikeluarkan oleh IKP Lama Symantec Corporation</translation> @@ -5376,6 +5473,9 @@ <translation id="5660228672907979869">Blokir pengaktifan partisi penyimpanan pihak ketiga.</translation> <translation id="5660950553460381588">Tetapkan penyimpanan default pembuatan kunci sandi ke Rantai Kunci iCloud jika memungkinkan.</translation> <translation id="5666457529647159548">Mengizinkan pengguna mengelola sertifikat klien yang terinstal.</translation> +<translation id="5670249935663090320">Jika kebijakan disetel ke Aktif atau tidak disetel, <ph name="PRODUCT_NAME" /> akan diaktifkan dan pengguna dapat meluncurkannya dari menu aplikasi, menu konteks halaman, kontrol media di situs yang kompatibel untuk Cast, dan ikon toolbar Cast (jika ditampilkan). + +Jika kebijakan disetel ke Nonaktif, <ph name="PRODUCT_NAME" /> akan dinonaktifkan.</translation> <translation id="567377007899266033">Jika kebijakan disetel ke Benar (True), laporan peristiwa penting penginstalan ekstensi Android yang dipicu kebijakan akan dikirimkan ke Google. Jika kebijakan disetel ke Salah (False), tidak ada peristiwa yang direkam. Jika kebijakan tidak disetel, nilai default akan disetel ke Benar (True).</translation> <translation id="5676740747107495269">Menampilkan opsi aksesibilitas di menu baki sistem pada layar login</translation> <translation id="5679540979548648200">Cegah pengguna perangkat ini menggunakan sideload ADB dan paksa perangkat melakukan powerwash jika sideload telah diaktifkan sebelumnya</translation> @@ -5736,6 +5836,7 @@ <translation id="6042407236638640864">Izinkan halaman dengan header <ph name="CACHE_CONTROL_NO_STORE_NAME" /> masuk ke back-forward cache</translation> <translation id="604243460476563291">Nonaktifkan transfer file di koneksi dukungan jarak jauh dari admin perusahaan</translation> <translation id="6042629184389251062">Pengumpulan metrik yang menyertakan URL tidak diizinkan</translation> +<translation id="6045733613334942660">Driver pemindai</translation> <translation id="6046615715547751255">Jangan izinkan kontrol pelaporan terperinci</translation> <translation id="6048199181629830227">Mengaktifkan fitur manajemen pengaktifan daya baterai</translation> <translation id="6048690591359317353">Jangan izinkan pengguna memutuskan koneksi atau mengubah VPN secara manual</translation> @@ -6333,7 +6434,21 @@ <translation id="6462604655173570082">Jika kebijakan tidak disetel atau disetel ke Aktif, pengguna akan diizinkan melihat dan menggunakan tombol <ph name="GOOGLE_LENS_PRODUCT_NAME" /> di kotak penelusuran pada halaman Tab Baru. Jika kebijakan disetel ke Nonaktif, pengguna tidak akan melihat tombol <ph name="GOOGLE_LENS_PRODUCT_NAME" /> di kotak penelusuran pada halaman Tab Baru.</translation> <translation id="6464074037294098618">Mengaktifkan IsiOtomatis untuk alamat</translation> <translation id="6467613372414922590">Mengizinkan host Native Messaging level pengguna (diinstal tanpa izin admin)</translation> +<translation id="6467707081687600148">Menjadwalkan mulai ulang otomatis setelah update <ph name="PRODUCT_OS_NAME" /> diterapkan. + +Jika kebijakan ini disetel ke benar (true), mulai ulang otomatis akan dijadwalkan saat update <ph name="PRODUCT_OS_NAME" /> diterapkan dan mulai ulang akan diperlukan untuk menyelesaikan proses update. Mulai ulang akan segera dijadwalkan, tetapi mungkin tertunda hingga 24 jam jika pengguna sedang menggunakan perangkat. + +Jika kebijakan ini disetel ke salah (false), mulai ulang otomatis tidak akan dijadwalkan setelah menerapkan update <ph name="PRODUCT_OS_NAME" />. Proses update akan diselesaikan saat berikutnya pengguna memulai ulang perangkat. + +Jika Anda menyetel kebijakan ini, pengguna tidak dapat mengubah atau menggantinya. + +Catatan: Saat ini, mulai ulang otomatis hanya diaktifkan ketika layar login ditampilkan atau sesi aplikasi kios sedang berlangsung.</translation> <translation id="6471018476824827813">Pengumpulan metrik yang menyertakan URL diizinkan</translation> +<translation id="6471927932956897852">Menentukan apakah P2P akan digunakan untuk payload update OS. +Jika disetel ke Benar (True), perangkat akan berbagi dan berusaha menggunakan payload update di LAN, serta berpotensi mengurangi penggunaan dan kemacetan bandwidth internet. Jika payload update tidak tersedia di LAN, perangkat tersebut akan kembali mendownload dari server update. +Jika disetel ke Salah (False), P2P tidak akan digunakan. + +CATATAN: Perilaku default bagi perangkat konsumen dan perusahaan berbeda: P2P akan diaktifkan di perangkat terkelola, tetapi tidak akan diaktifkan di perangkat yang tidak terkelola.</translation> <translation id="6473623140202114570">Mengonfigurasi daftar domain tempat Safe Browsing tidak akan memicu peringatan.</translation> <translation id="6474194795370862403">Perilaku lama offsetParent akan digunakan.</translation> <translation id="647645276885673708">Aktifkan <ph name="LACROS_NAME" /> dan jadikan sebagai browser utama</translation> @@ -6655,6 +6770,11 @@ <translation id="6670794785040100077">Nonaktifkan pengiriman dokumen ke <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="6672070613706645316">Izinkan pengguna menyesuaikan latar belakang di halaman Tab Baru</translation> <translation id="6672630473862787247">Mengaktifkan autentikasi pasif di sesi reguler, samaran, dan tamu.</translation> +<translation id="6676012253361586167">Menentukan apakah penerusan port ke penampung Crostini diizinkan. + +Jika kebijakan ini disetel ke Benar (True) atau tidak disetel, pengguna akan dapat mengonfigurasi penerusan port ke penampung Crostini. + +Jika kebijakan ini disetel ke Salah (False), penerusan port ke penampung Crostini akan dinonaktifkan.</translation> <translation id="6677291257287862684">Aktifkan tombol lekat di layar login</translation> <translation id="6682305153467826752">Aktifkan pelaporan informasi identifikasi mesin</translation> <translation id="6685903773201985073">Mengaktifkan autentikasi pasif di sesi tamu dan reguler.</translation> @@ -7055,6 +7175,9 @@ Biarkan kebijakan ini tidak disetel, jika Anda memilih mode lain untuk menyetel kebijakan proxy. Catatan: Untuk contoh mendetail, buka Project Chromium ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation> +<translation id="7001915679435065291">Jika kebijakan disetel ke 1, semua situs akan dapat menampilkan gambar. Jika kebijakan disetel ke 2, situs tidak akan dapat menampilkan gambar. + +Jika kebijakan tidak disetel, kebijakan akan mengizinkan gambar, tetapi pengguna dapat mengubah setelan ini.</translation> <translation id="7002040773317582266">Pemeriksaan URL frame utama secara real-time diaktifkan.</translation> <translation id="7003746348783715221">Preferensi <ph name="PRODUCT_NAME" /></translation> <translation id="7007283257527015835">Tanda boolean menunjukkan apakah pengendali protokol harus disetel sebagai default.</translation> @@ -7669,12 +7792,16 @@ Jika kebijakan tidak disetel, setelan default adalah <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" /> untuk pengguna yang dikelola perusahaan dan <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> untuk pengguna yang tidak dikelola perusahaan. Di masa mendatang, <ph name="LACROS_NAME" /> mungkin bisa menjadi satu-satunya browser yang tersedia di <ph name="PRODUCT_OS_NAME" /> dengan nilai <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />.</translation> +<translation id="751071954873065775">Memilih DLC (Konten yang Dapat Didownload) yang perlu didownload terlebih dahulu</translation> <translation id="7512065400265675158">Header permintaan HTTP <ph name="USER_AGENT_HEADER_NAME" /> dijadwalkan akan dikurangi. Untuk memudahkan pengujian dan kompatibilitas, kebijakan ini dapat mengaktifkan fitur pengurangan untuk semua situs, atau menonaktifkan kemampuan uji coba asal atau uji coba kolom untuk mengaktifkan fitur tersebut. Untuk mempelajari <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> dan linimasanya lebih lanjut, baca di sini: https://blog.chromium.org/2021/09/user-agent-reduction-origin-trial-and-dates.html </translation> +<translation id="7512514325152952954">Payload update otomatis di <ph name="PRODUCT_OS_NAME" /> dapat didownload melalui HTTP, bukan HTTPS. Cara ini memungkinkan penyimpanan cache HTTP yang transparan dari download HTTP. + +Jika kebijakan ini disetel ke benar (true), <ph name="PRODUCT_OS_NAME" /> akan berupaya mendownload payload update otomatis melalui HTTP. Jika kebijakan ini disetel ke salah (false) atau tidak disetel, HTTPS akan digunakan untuk mendownload payload update otomatis.</translation> <translation id="7515953732107149296">Kebijakan ini dihapus di M53 setelah RC4 dihapus dari <ph name="PRODUCT_NAME" />. Jika kebijakan tidak disetel atau disetel ke salah (false), cipher suite RC4 di TLS tidak akan diaktifkan. Jika tidak, kebijakan dapat disetel ke benar (true) untuk mempertahankan kompatibilitas dengan server yang sudah tidak update. Ini adalah tindakan sementara dan server harus dikonfigurasi ulang.</translation> @@ -7687,6 +7814,11 @@ Jika kebijakan tidak disetel atau disetel ke Benar (True), peringatan akan ditampilkan untuk mengingatkan pengguna agar keluar dari layar penuh sebelum memasukkan sandi. Jika kebijakan disetel ke Salah (False), tidak ada peringatan yang akan ditampilkan.</translation> <translation id="7531630046107845550">Mengizinkan koneksi SSH klien keluar di Terminal System App</translation> +<translation id="7533385610709354870">Kecuali <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> disetel ke Nonaktif, menyetel <ph name="MEDIA_ROUTER_CAST_ALLOW_ALL_IPS_POLICY_NAME" /> ke Aktif akan menghubungkan <ph name="PRODUCT_NAME" /> ke perangkat Transmisi di semua alamat IP, bukan hanya alamat pribadi RFC1918/RFC4193. + +Jika kebijakan disetel ke Nonaktif, <ph name="PRODUCT_NAME" /> hanya akan terhubung ke perangkat Transmisi di RFC1918/RFC4193. + +Jika kebijakan tidak disetel, <ph name="PRODUCT_NAME" /> hanya akan terhubung ke perangkat Transmisi di RFC1918/RFC4193, kecuali fitur CastAllowAllIPs diaktifkan.</translation> <translation id="7534199150025803530">Kebijakan ini tidak memengaruhi aplikasi Google Drive Android. Jika ingin mencegah penggunaan Google Drive melalui sambungan seluler, sebaiknya Anda tidak mengizinkan penginstalan aplikasi Google Drive Android.</translation> <translation id="7538583957913002726">Kebijakan ini disetel ke Aktif secara default. Kebijakan mengontrol perangkat terdaftar agar melaporkan nama model, arsitektur, dan kecepatan clock maksimum CPU (serta penggunaan dan suhu CPU untuk M96 dan yang lebih baru). @@ -7975,6 +8107,13 @@ Tidak menyetel kebijakan berarti <ph name="DEFAULT_CLIPBOARD_SETTING" /> akan berlaku untuk semua situs, jika disetel. Jika tidak, setelan pribadi pengguna akan digunakan. Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> bukanlah nilai yang diterima untuk kebijakan ini.</translation> +<translation id="7790221177424764797">Kebijakan ini akan mengontrol apakah aturan dari kebijakan SiteList <ph name="IE_PRODUCT_NAME" /> dimuat atau tidak. + +Jika kebijakan ini disetel ke benar (true), <ph name="PRODUCT_NAME" /> akan membaca <ph name="IEEM_SITELIST_POLICY" /> <ph name="IE_PRODUCT_NAME" /> untuk mendapatkan URL daftar situs. <ph name="PRODUCT_NAME" /> kemudian mendownload daftar situs dari URL tersebut, dan menerapkan aturan seolah-olah aturan tersebut dikonfigurasikan dengan kebijakan <ph name="BROWSER_SWITCHER_URL_LIST_POLICY_NAME" />. + +Jika kebijakan ini disetel ke salah (false) atau tidak disetel, <ph name="PRODUCT_NAME" /> tidak akan menggunakan kebijakan <ph name="IEEM_SITELIST_POLICY" /> <ph name="IE_PRODUCT_NAME" /> sebagai sumber aturan untuk beralih browser. + +Untuk informasi selengkapnya terkait kebijakan <ph name="IEEM_SITELIST_POLICY" /> Internet Explorer: https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation> <translation id="7791215522423893512">Jangan izinkan pengguna mengambil screenshot atau rekaman video</translation> <translation id="7792796937016596423">Pengguna tidak akan dapat melakukan rekaman paket jaringan</translation> <translation id="7798441698807517880">Kebijakan ini telah dihapus sejak <ph name="PRODUCT_NAME" /> versi 89 karena <ph name="FLASH_PLUGIN_NAME" /> tidak digunakan lagi. @@ -8301,6 +8440,11 @@ Jika kebijakan ini disetel, pengguna tidak dapat mengubah atau menggantinya.</translation> <translation id="8080200590486938727">Nonaktifkan pencari plugin</translation> +<translation id="8086746212954621799">Jika setelan disetel ke Benar (True), update otomatis akan dinonaktifkan. + +Jika setelan ini tidak dikonfigurasi atau disetel ke Salah (False), perangkat <ph name="PRODUCT_OS_NAME" /> otomatis memeriksa update. + +Peringatan: Sebaiknya tetap aktifkan update otomatis sehingga pengguna menerima update software dan perbaikan keamanan penting. Menonaktifkan update otomatis dapat menimbulkan risiko terhadap pengguna.</translation> <translation id="8089200718228084417">Aktifkan pencetakan privet yang tidak digunakan lagi</translation> <translation id="8091982561085048989">Tanda boolean menunjukkan apakah IPP Everywhere harus digunakan untuk menyiapkan printer. Tanda ini didukung di <ph name="PRODUCT_OS_NAME" /> versi 76 dan lebih tinggi.</translation> <translation id="8094095107731619070">Aktifkan koreksi otomatis keyboard fisik saat pengguna mengetik</translation> @@ -8919,6 +9063,15 @@ Jika kebijakan ini tidak disetel, laporan akan diupload setiap 24 jam. Jika kebijakan disetel, jumlah jam antara dua upload laporan yang berurutan akan ditentukan oleh kebijakan ini.</translation> +<translation id="8618037841203431360">Kebijakan ini mengontrol apakah data kebijakan dan waktu pengambilan kebijakan akan dilaporkan atau tidak. + +Jika kebijakan <ph name="CLOUD_REPORTING_ENABLED_POLICY_NAME" /> tidak disetel atau disetel ke nonaktif, kebijakan ini akan diabaikan. + +Jika kebijakan ini tidak disetel atau disetel ke Benar (True), data kebijakan dan waktu pengambilan kebijakan akan dikumpulkan. +Jika kebijakan ini disetel ke Salah (False), data kebijakan dan waktu pengambilan kebijakan tidak akan dikumpulkan. + +Kebijakan ini hanya berlaku saat perangkat didaftarkan dengan <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> untuk <ph name="PRODUCT_NAME" />. +Kebijakan ini selalu berlaku untuk <ph name="PRODUCT_OS_NAME" />.</translation> <translation id="8619748440665904084">Nonaktifkan impor data formulir isi otomatis saat browser pertama kali dijalankan</translation> <translation id="8623672932476443039">Jika kebijakan disetel ke Aktif, pengguna akan dapat mengakses Mode Developer untuk Aplikasi Terisolasi. Jika kebijakan disetel ke Nonaktif, pengguna tidak dapat mengakses kemampuan tersebut. @@ -9185,6 +9338,9 @@ Jika disetel ke Nonaktif, <ph name="SEARCH_SIDE_PANEL_FEATURE_NAME" /> tidak akan tersedia di halaman web mana pun.</translation> <translation id="8860894781631833477">Pengguna dapat mengonfigurasi saluran rilis <ph name="PRODUCT_OS_NAME" /></translation> +<translation id="8862086508140571198">Dengan kebijakan ini, Anda dapat menetapkan daftar DLC (Konten yang Dapat Didownload) untuk didownload sesegera mungkin. DLC yang telah didownload akan tersedia untuk semua pengguna di perangkat. + +Hal ini berguna saat administrator mengetahui bahwa fitur yang memerlukan DLC kemungkinan akan digunakan oleh pengguna perangkat.</translation> <translation id="8864975621965365890">Menimpa permintaan penghentian yang muncul saat situs dirender oleh <ph name="PRODUCT_FRAME_NAME" />.</translation> <translation id="8865404058177794289">Gunakan setelan default untuk pemeriksaan penggunaan kunci RSA</translation> <translation id="8866430022832109569">Pelaporan inventaris aplikasi</translation> @@ -9329,6 +9485,9 @@ Pemeriksaan ini akan dimulai setiap kali layar login dimuat, lalu dicoba lagi setiap jam (selama perangkat masih menampilkan layar login). Tindakan ini mencegah migrasi dimulai di tengah-tengah sesi pengguna, yang akan menyebabkan potensi masalah bagi pengguna akhir.</translation> <translation id="9003823644527627017">Mengonfigurasi VM Bruschetta di <ph name="PRODUCT_OS_NAME" /></translation> +<translation id="9004469022085379212">Jika kebijakan disetel ke Aktif, perangkat dapat menjalankan virtual machine di <ph name="PRODUCT_OS_NAME" />. <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> dan <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> harus disetel ke Aktif untuk menggunakan <ph name="PRODUCT_CROSTINI_NAME" />. Jika kebijakan disetel ke Nonaktif, perangkat tidak dapat menjalankan virtual machine. Jika setelan diubah ke Nonaktif, kebijakan mulai diterapkan ke virtual machine baru yang akan dijalankan, bukan yang sudah berjalan. + +Jika kebijakan ini tidak disetel di perangkat terkelola, perangkat tidak dapat menjalankan virtual machine. Perangkat yang tidak terkelola dapat menjalankan virtual machine.</translation> <translation id="9007632512838819703">Kebijakan ini tidak digunakan lagi. Sebagai gantinya, gunakan <ph name="SPELLCHECK_LANGUAGE_BLOCKLIST_POLICY_NAME" />. Menonaktifkan secara paksa fitur pemeriksa ejaan bahasa. Bahasa yang tidak dikenal dalam daftar tersebut akan diabaikan. @@ -9476,6 +9635,9 @@ <translation id="9098409326885953506">Deteksi jendela yang tertutup dan tangguhkan proses menggambarnya</translation> <translation id="9105265795073104888">Hanya bagian dari opsi konfigurasi proxy yang disediakan untuk aplikasi Android. Aplikasi Android dapat memilih untuk menggunakan proxy secara sukarela. Anda tidak dapat memaksakan aplikasi Android agar menggunakan proxy.</translation> <translation id="9106865192244721694">Izinkan WebUSB di situs ini</translation> +<translation id="9107635531763682565">Jika kebijakan disetel ke 1, situs akan dapat menampilkan notifikasi desktop. Jika kebijakan disetel ke 2, situs tidak akan dapat menampilkan notifikasi desktop. + +Jika kebijakan tidak disetel, <ph name="ASK_NOTIFICATIONS_POLICY_NAME" /> akan berlaku, tetapi pengguna dapat mengubah setelan ini.</translation> <translation id="9110251436602897914">Laporkan informasi tentang periferal yang dicolokkan ke perangkat</translation> <translation id="9111850884577810507">Kolom ini harus cocok dengan salah satu string yang mewakili printer <ph name="PRODUCT_NAME" /> yang didukung. String ini akan digunakan untuk mengidentifikasi dan menginstal PPD yang sesuai untuk printer. Informasi selengkapnya dapat ditemukan di https://support.google.com/chrome?p=noncloudprint.</translation> <translation id="9112727953998243860">File konfigurasi untuk printer perusahaan</translation> @@ -9592,6 +9754,9 @@ <translation id="9191821120522935133">Memungkinkan pengaktifan throttling iframe lintas origin yang tidak terlihat</translation> <translation id="9192220384862917760">Aktifkan mode tirai untuk host akses jarak jauh</translation> <translation id="9195766455191826480">Jangan laporkan status keamanan</translation> +<translation id="9197238499850071076">Menentukan apakah perangkat harus di-rollback ke versi yang disetel oleh <ph name="DEVICE_TARGET_VERSION_PREFIX_POLICY_NAME" /> jika telah menjalankan versi yang lebih baru. + +Nilai defaultnya adalah RollbackDisabled.</translation> <translation id="9197740283131855199">Persentase yang digunakan untuk menskalakan penundaan layar redup jika pengguna aktif setelah peredupan</translation> <translation id="9200828125069750521">Parameter untuk URL gambar yang menggunakan POST</translation> <translation id="9204863016826119209">Kunci perusahaan dapat digunakan oleh aplikasi Android yang diinstal dan dicantumkan dalam kebijakan ini.</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index a33b883..58a781ef 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -942,6 +942,11 @@ <translation id="1861206724856734193">データ漏洩防止ルールのリストを設定します。</translation> <translation id="1862267110714201519">ゴースト ウィンドウ機能を無効にする</translation> <translation id="1865417998205858223">キーの権限</translation> +<translation id="1865867000796030567">このポリシーを有効に設定した場合、遅延なしで自動開始されるキオスクアプリの <ph name="REQUIRED_PLATFORM_VERSION" /> マニフェスト キーの値が、自動更新対象バージョンの接頭辞として使用されます。 + +このポリシーを無効に設定するか未設定のままにした場合、<ph name="REQUIRED_PLATFORM_VERSION" /> マニフェスト キーは無視され、自動更新は通常どおりに進められます。 + +警告: デバイスがソフトウェアのアップデートと重要なセキュリティ修正を取得できなくなる可能性があるため、<ph name="PRODUCT_OS_NAME" /> バージョンの制御をキオスクアプリに委任することはやめてください。<ph name="PRODUCT_OS_NAME" /> バージョンの制御を委任すると、ユーザーが危険にさらされる恐れがあります。</translation> <translation id="186719019195685253">AC 電源での実行時、アイドル時間に到達したときに行う操作</translation> <translation id="1869688072690234823">このポリシー設定では、使用を許可する WebAuthn 要素を管理します。 @@ -1183,6 +1188,11 @@ このポリシーを設定しないか空白のリストに設定した場合、管理対象デバイスでロックのクイック解除モードは使用できません。 このポリシーはサポートが終了しています。代わりに <ph name="QUICK_UNLOCK_MODE_ALLOW_LIST_POLICY_NAME" /> を使用してください。</translation> +<translation id="2035995535603698706">このポリシーを有効に設定した場合、ページ上のサードパーティの画像による認証プロンプトの表示が許可されます。 + +このポリシーを無効に設定するか未設定のままにした場合、サードパーティの画像による認証プロンプトの表示は許可されません。 + +通常、このポリシーはフィッシング対策のため無効になっています。</translation> <translation id="2036522553891755455">このポリシーを有効に設定した場合、共有の検出(<ph name="PRODUCT_NAME" /> のネットワーク ファイル共有の機能)では、<ph name="NETBIOS_PROTOCOL" /> を使用してネットワーク上の共有を検出します。このポリシーを無効に設定した場合、共有の検出処理でこのプロトコルは使用されません。 このポリシーを未設定のままにした場合、デフォルトの動作は管理対象ユーザーに対して無効になり、それ以外のユーザーに対しては有効になります。</translation> @@ -1341,6 +1351,19 @@ <translation id="2174946221763588594">ユーザーがアクセスしたサイトで <ph name="WEBXR_API_NAME" /> を使用した没入的な拡張現実セッションの作成を許可するかどうかを構成します。このポリシーを設定しない場合または有効にした場合、<ph name="WEBXR_API_NAME" /> では、<ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> モードでのセッション作成が許可され、ユーザーは拡張現実を体験できるようになります。このポリシーを無効にした場合、<ph name="WEBXR_API_NAME" /> では、<ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> モードでのセッション作成リクエストが拒否されます。既存の <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> セッションは終了されません(存在する場合)。<ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> セッションの詳細については、<ph name="WEBXR_AR_MODULE_API_NAME" /> 仕様をご覧ください。</translation> <translation id="2175353308236295184">一連の Key-Value ペアを指定したアプリ固有の JSON 設定オブジェクトです(例: '"managedConfiguration": { "key1": value1, "key2": value2 })。キーはアプリのマニフェストで定義されます。</translation> <translation id="2176115444876446233">ユーザーにシステム全体のパフォーマンス トレースの収集を許可しない</translation> +<translation id="2177382213857119200"><ph name="PRODUCT_NAME" /> のセーフ ブラウジング機能を有効にするかどうかと、有効にする場合に使用するモードを管理できます。 + + このポリシーを「NoProtection」(値 0)に設定した場合、セーフ ブラウジングは常に無効になります。 + + このポリシーを「StandardProtection」(値 1、デフォルト値)に設定した場合、セーフ ブラウジングは常に標準モードで有効になります。 + + このポリシーを「EnhancedProtection」(値 2)に設定した場合、セーフ ブラウジングは常に強化モードで有効になります。強化モードではセキュリティが強化されますが、より多くの閲覧情報を Google に提供する必要があります。 + + このポリシーを必須として設定した場合、ユーザーは <ph name="PRODUCT_NAME" /> のセーフ ブラウジング設定を変更したりオーバーライドしたりすることはできません。 + + このポリシーを未設定のままにした場合、セーフ ブラウジングは標準保護モードで有効になりますが、ユーザーはこの設定を変更できます。 + + セーフ ブラウジングについて詳しくは、https://support.google.com/chrome?p=safe_browsing_preferences をご覧ください。</translation> <translation id="2177696016354404697">プライバシー画面を常に無効にする</translation> <translation id="2178899310296064282">YouTube で制限付きモード「中」以上を強制的に適用する</translation> <translation id="2180958780733364832">ヘッドレス モードの使用を管理する</translation> @@ -1919,6 +1942,11 @@ このポリシーを false に設定した場合は、PDF ビューアで PDF に注釈を追加できません。</translation> <translation id="2769952903507981510">リモート アクセス ホストの必須のドメイン名を設定する</translation> +<translation id="2770376586681635746">ユーザーが Kerberos アカウントを追加できるかどうかを制御します。 + +このポリシーを有効に設定するか未設定のままにした場合、ユーザーは Kerberos 設定ページの Kerberos アカウント設定で Kerberos アカウントを追加できます。ユーザーは追加したアカウントを完全に管理でき、変更や削除も行えます。 + +このポリシーが無効に設定されている場合、ユーザーは Kerberos アカウントを追加できません。アカウントは「Kerberos アカウントを設定する」ポリシーからのみ追加できます。アカウントをロックするにはこの方法が便利です。</translation> <translation id="2772231477628401250">更新版のダウンロードに HTTP を使用する</translation> <translation id="2772955711376920612">このポリシーを有効に設定して、<ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> と <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> を設定した場合、デバイスが対応していれば電力ピークシフトが有効になります。電力ピークシフトの電力管理ポリシーは、ピーク使用時に交流電流の使用量を最小限に抑える省電力ポリシーです。各平日に、電力ピークシフト モードの開始時刻と終了時刻を設定できます。バッテリー残量が指定したしきい値を上回っている限り、この時間帯は、交流電流が接続されている場合でもデバイスの実行にはバッテリーが使用されます。指定した終了時刻を過ぎると、電源に接続されている場合、デバイスの実行には交流電流が使用されますが、バッテリーは充電されません。指定した開始時刻を過ぎると、デバイスは再び、交流電流を使って通常どおりに動作し、バッテリーが充電されます。 @@ -3608,6 +3636,9 @@ このポリシーを未設定のままにした場合、システムの DNS 解決は、システム設定と機能フラグに応じて、ネットワーク サービス内、ネットワーク サービス外、または部分的にそのどちらかで実行されます。</translation> <translation id="4239720644496144453">キャッシュは Android アプリには使用されません。複数のユーザーが同じ Android アプリをインストールする場合、アプリはユーザーごとに新しくダウンロードされます。</translation> <translation id="424318624725112807">ログイン画面でテキスト カーソルによるハイライト表示を有効にする</translation> +<translation id="4245159233848584683">このポリシーを有効に設定するか未設定のままにした場合、デバイスのローカル アカウントが遅延なしで自動ログインするように設定されていれば、デバイスがオフラインのときに <ph name="PRODUCT_OS_NAME" /> でネットワーク設定メッセージが表示されます。 + +このポリシーを無効に設定した場合は、代わりにエラー メッセージが表示されます。</translation> <translation id="4248277954659222481">メディアの自動再生を許可する URL パターンのリストを指定する</translation> <translation id="4250680216510889253">いいえ</translation> <translation id="4252522848899331223">セーフ ブラウジングの警告の無視をユーザーに許可する</translation> @@ -3745,6 +3776,11 @@ <translation id="4410236409016356088">ネットワークの帯域幅制限を有効にする</translation> <translation id="4411734231900934213">お子様と保護者のデバイス間で許容される時計の時間差(秒)です。</translation> <translation id="441217499641439905">モバイル接続時に <ph name="PRODUCT_OS_NAME" /> ファイルアプリで Google ドライブを無効にする</translation> +<translation id="4412885120239670573">このポリシーを有効に設定した場合、<ph name="PRODUCT_NAME" /> で内部 PDF ビューアがオフになります。この場合、PDF ファイルはダウンロードしたファイルと同じように扱われ、ユーザーはデフォルトのアプリで開くことができます。 + +このポリシーを無効に設定した場合、ユーザーが PDF プラグインをオフにしない限り、PDF ファイルは PDF プラグインで開かれます。 + +このポリシーを設定した場合、ユーザーは <ph name="PRODUCT_NAME" /> でこの設定を変更できません。このポリシーを未設定のままにした場合、ユーザーは PDF を別のアプリで開くかどうかを選択できます。</translation> <translation id="4413453659814156568">JIT(Just In Time)コンパイラを有効にした JavaScript の実行を許可するサイトの URL パターンのリストを設定できます。 有効なサイトの URL パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。このポリシーの値に「<ph name="WILDCARD_VALUE" />」は使用できません。 @@ -3852,6 +3888,7 @@ <translation id="4482784169143060077">自動の HTTPS アップグレードを有効にする</translation> <translation id="4483120730995943109">タイムアウトを 0 ミリ秒に設定した JavaScript setTimeout() に 1 ミリ秒のタイムアウトを含めない。</translation> <translation id="4483649828988077221">自動更新を無効にする</translation> +<translation id="4483738129334574255">登録されている <ph name="PRODUCT_OS_NAME" /> デバイスでは恐竜のイースター エッグゲームを無効にし、他の環境では有効にする</translation> <translation id="4484515651939984695">アクセスコードまたは QR コードで選択したキャスト デバイスを <ph name="PRODUCT_NAME" /> メニューのキャスト デバイスのリストに表示しておく期間(秒単位)を指定します。</translation> <translation id="4485425108474077672">新しいタブページ URL を設定する</translation> <translation id="4490420545181481759">X.509 証明書では、拡張機能に名前などの制約が証明書のエンコードされている場合があります。RFC 5280 では、これらの制約をトラスト アンカー証明書に適用するかどうかは任意となっています。<ph name="PRODUCT_NAME" /> 112 以降では、プラットフォームの証明書ストアから読み込まれた証明書にこれらの制約が適用されるようになります。 @@ -4148,6 +4185,7 @@ <ph name="MAC_OS_NAME" /> の場合、Chrome ウェブストア以外から取得されたアプリと拡張機能を自動インストールできるのは、MDM を介して管理されるインスタンス、MCX を介してドメインに追加されたインスタンス、または <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" /> に登録されているインスタンスのみです。</translation> <translation id="4742973303930120836">背景のグラフィックの印刷モードを制限する</translation> +<translation id="4744467872051608680">M119 以降、このポリシーを false に設定するか未設定のままにした場合、WebSQL は無効になりますが、Chrome フラグ「web-sql-access」を使用して有効にできます。このポリシーを true に設定した場合、WebSQL アクセスが有効になります。</translation> <translation id="4745232963710538589">分析情報の拡張機能を有効にすると使用状況の指標が報告されます</translation> <translation id="4749670563834935149">ログイン画面とロック画面で <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> を有効にする URL のリストを指定します。 @@ -4668,6 +4706,9 @@ 有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。 このポリシーでは、オリジンのみが照合されるため、URL パターンのパスは無視されます。</translation> <translation id="5318185076587284965">リモート アクセス ホストで中継サーバーを使用できるようにする</translation> +<translation id="5321624917465764266">このポリシーを有効に設定するか未設定のままにした場合、閲覧とダウンロードの履歴が Chrome で削除できるようになり、ユーザーはこの設定を変更できません。 + +このポリシーを無効に設定した場合、閲覧とダウンロードの履歴は削除できません。なお、このポリシーを無効にした場合も、閲覧とダウンロードの履歴が保持される保証はありません。ユーザーが履歴データベースのファイルを直接編集または削除できる可能性もあります。また、ブラウザ自体で履歴の有効期限が切れたりすべての履歴アイテムがアーカイブされたりする場合もあります。</translation> <translation id="5323200200131319468">ログイン画面で音声フィードバックを有効にする</translation> <translation id="5323271643727095577">beforeunload イベントで event.preventDefault() が呼び出されたときにキャンセル ダイアログを表示しない。beforeunload イベントで beforeunload event.returnValue が空の文字列のときにキャンセル ダイアログを表示する。</translation> <translation id="5323355956693037267">ログイン画面で画面キーボードを有効にする</translation> @@ -4886,6 +4927,9 @@ <translation id="5535256585099022933">再起動の時間間隔を設定する</translation> <translation id="553806128266843748">ネットワーク制限を有効にするかどうかを示すブール値のフラグです。</translation> <translation id="5540885720415375851">ローカル デバイスの検出を許可する</translation> +<translation id="5542235730745104308">このポリシーを True に設定した場合、<ph name="PRODUCT_NAME" /> では組み込まれている別のエラーページ(「ページが見つかりません」など)が使用されます。このポリシーを False に設定した場合、<ph name="PRODUCT_NAME" /> では別のエラーページは使用されません。 + +このポリシーを設定した場合、ユーザーはこの設定を変更できません。設定しなかった場合、ポリシーは有効になりますが、ユーザーはこの設定を変更できます。</translation> <translation id="554903022911579950">Kerberos</translation> <translation id="555022085242359084">ログイン画面でハイ コントラストを有効にする</translation> <translation id="555077880566103058">すべてのサイトで <ph name="FLASH_PLUGIN_NAME" /> プラグインの自動実行を許可する</translation> @@ -5379,6 +5423,7 @@ <translation id="6042407236638640864"><ph name="CACHE_CONTROL_NO_STORE_NAME" /> ヘッダーを含むページのバックフォワード キャッシュへの保存を許可する</translation> <translation id="604243460476563291">企業の管理者がリモート サポート接続でファイルを転送できないようにする</translation> <translation id="6042629184389251062">URL キーによる指標の収集を許可しない</translation> +<translation id="6045733613334942660">スキャナ ドライバ</translation> <translation id="6046615715547751255">詳細なレポート コントロールを許可しない</translation> <translation id="6048199181629830227">電力のピークシフト管理を有効にする</translation> <translation id="6048690591359317353">ユーザーによる手動での VPN の接続解除や変更を許可しない</translation> @@ -5608,6 +5653,9 @@ <translation id="625580680776945310">高効率モードを有効にする。</translation> <translation id="6258658183356534534">User-Agent Client Hints の GREASE 更新機能を管理します。</translation> <translation id="6261643884958898336">マシン識別情報に関するレポートを作成</translation> +<translation id="6264247808139384018">このポリシーを有効に設定するか未設定のままにした場合、パスワード認証を行うユーザーは画面をロックできます。 + +このポリシーを無効に設定した場合、ユーザーは画面をロックできません(ユーザー セッションからのログアウトのみ可能です)。</translation> <translation id="6265892395051519509">センサーへのアクセスを許可するサイトを指定します</translation> <translation id="6266043141694454734">サーバー証明書の確認に Chrome Root Store と組み込みの証明書確認機能を使用するかどうかを指定する</translation> <translation id="6267130578410325007">このポリシーでは、オリジンキー エージェント クラスタリングをデフォルトで許可します。 @@ -5818,6 +5866,9 @@ <translation id="6412352702230183710">システムレベルのネイティブ メッセージング ホストのみを許可</translation> <translation id="6416506846917150119">ユーザーの入力時に物理キーボードの予測入力を無効にする</translation> <translation id="6417265370957905582">Google アシスタント</translation> +<translation id="6421254653839955267">このポリシーを有効に設定した場合、CNAME 検索はスキップされます。Kerberos SPN の生成時には、入力されたサーバー名が使用されます。 + +このポリシーを無効に設定するか未設定のままにした場合、Kerberos SPN の生成時には、CNAME 検索によりサーバーの標準名が決まります。</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6424486395812679373">すべてのダウンロード ファイルに対してセーフ ブラウジング チェックを行う</translation> <translation id="6433697627431665375"><ph name="PRODUCT_NAME" /> データをバックアップに含めることを許可しない</translation> @@ -5955,6 +6006,11 @@ このポリシーの値はミリ秒単位とし、アイドル待ちの時間より短い時間を指定できます。</translation> <translation id="6497085755801788141">組み込みの証明書確認機能を使用する</translation> +<translation id="6504720469162323184">このポリシーでは、ユーザー操作が行われなくなってから <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> ポリシーで指定されたデバイスのローカル アカウントに自動ログインするまでの時間をミリ秒単位で指定できます。 + +このポリシーを未設定のままにした場合、タイムアウトは 0 ミリ秒に設定されます。 + +<ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> ポリシーが設定されていない場合、このポリシーは無視されます。</translation> <translation id="65055701428353978">このポリシーでは、影響のある拡張機能ごとに、標準の https://<extension id>.chromiumapp.org/ のリダイレクト URL に加えて、<ph name="IDENTITY_API_NAME" /> API(<ph name="IDENTITY_API_URL" />)で拡張機能が使用できる OAuth リダイレクト URL のリストを指定できます。 このポリシーを未設定のままにするか、URL のリストを空にした場合、すべてのアプリまたは拡張機能で、<ph name="IDENTITY_API_NAME" /> API を使用する際に標準のリダイレクト URL のみが使用されます。</translation> @@ -6047,6 +6103,7 @@ このポリシーよりも EnabledPlugins と DisabledPluginsExceptions が優先されます。 このポリシーを設定しない場合、ユーザーはシステムにインストールされたどのプラグインも使用できます(互換性のないハードコードされたプラグイン、古いプラグイン、危険なプラグインは除く)。</translation> +<translation id="6571055160227165318">Chrome フラグにより WebSQL を有効化できるようにする。</translation> <translation id="6574903167639386816">ユーザー セッションの終了時にディスク上のプロファイル データを消去する</translation> <translation id="6575944031719151455">このポリシーでは、ログイン画面に表示するデバイスのローカル アカウントのリストを指定できます。識別子を指定して、デバイスのローカル アカウントを区別します。 @@ -6159,6 +6216,11 @@ このポリシーを無効に設定するか未設定のままにした場合、印刷コマンドを実行すると印刷プレビュー画面が表示されます。</translation> <translation id="6655274714135630366">ディスク イメージの 16 進数でエンコードされた SHA-256 ハッシュ。</translation> +<translation id="6655844456903132379">このポリシーを有効に設定した場合、HTTP 認証で KDC ポリシーによる承認が適用されます。つまり、KDC によりサービス チケットで <ph name="OK_AS_DELEGATE" /> が設定されている場合、<ph name="PRODUCT_NAME" /> はアクセス先のサービスにユーザー認証情報を委任します。RFC 5896 の説明(https://tools.ietf.org/html/rfc5896.html)をご覧ください。サービスは <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> でも許可されている必要があります。 + +このポリシーを無効に設定するか未設定のままにした場合、KDC ポリシーはサポートされているプラットフォームで無視され、<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> のみが適用されます。 + +<ph name="MS_WIN_NAME" /> では、KDC ポリシーが常に適用されます。</translation> <translation id="6658245400435704251">最初にアップデートがサーバーにプッシュされた時刻から、デバイスによるアップデートのダウンロードをランダムに遅延できる最大時間を秒数で指定します。デバイスは、この時間の一部を実際の経過時間として、残りの時間をアップデート チェックとして待機できます。どのような場合でも、係数にはある一定の時間の上限があるため、アップデートのダウンロードを永遠に待機してデバイスが停止し続けることはありません。</translation> <translation id="6659537776197644458">パスワード同期の認証フローをトリガーしない</translation> <translation id="6661178198729301029">管理対象プロファイルのクラウド レポートを有効にする</translation> @@ -6655,6 +6717,11 @@ このポリシーを False に設定した場合、この機能は無効になります。</translation> <translation id="7123271473727774529">色補正のユーザー補助機能を有効にする</translation> <translation id="7126716959063786004">タスク マネージャでプロセスを終了できるようにする</translation> +<translation id="7126787606641224668">Kerberos 認証ダイアログで「パスワードを保存する」機能が有効かどうかを制御します。パスワードはディスク上で暗号化して保存され、ユーザー セッション中に Kerberos システム デーモンからのみアクセスできます。 + +このポリシーが有効に設定されているか未設定の場合、ユーザーは再入力の手間を省くために Kerberos パスワードを保存するかどうかを指定できます。Kerberos チケットは、追加の認証(2 段階認証プロセス)が必要な場合以外は自動的に取得されます。 + +このポリシーが無効に設定されている場合、パスワードは保存されず、以前に保存されたパスワードもすべて削除されます。ユーザーは、Kerberos システムで認証が必要となるたびにパスワードを入力しなければなりません。この場合、パスワードの確認は、サーバーの設定に応じて通常 8 時間~数か月ごとに行われます。</translation> <translation id="7126928806195745404">JavaScript 設定</translation> <translation id="7127980134843952133">ダウンロード履歴</translation> <translation id="7128513247945602297">HTTPS サイトで混合コンテンツの自動アップグレードを有効にする</translation> @@ -6713,6 +6780,9 @@ <translation id="7157329428182136164">3D グラフィックス API のサポートを有効にする</translation> <translation id="7158358621906236999">デフォルトのセンサー設定</translation> <translation id="7161568070244869726">AppCache を強制的に有効にする</translation> +<translation id="7165879643294314958">このポリシーを有効に設定するか未設定のままにした場合、デバイスのローカル アカウントは遅延なしで自動ログインするように設定されます。ただし、<ph name="PRODUCT_OS_NAME" /> では、自動ログインせずにログイン画面を表示するキーボード ショートカットの Ctrl+Alt+S キーが優先されます。 + +このポリシーを無効に設定した場合、遅延なしの自動ログインがユーザーに強制的に適用されます(設定されている場合)。</translation> <translation id="7165882688932913315">このポリシーでは、ユーザーの近くの検出可能なデバイスや、ユーザーに登録されているクラウド デバイスを表示するローカル検出 UI(<ph name="CHROME_DEVICES_LINK" />)の制御可能な機能へのアクセスを管理します。<ph name="PRODUCT_OS_NAME" /> 以外のすべてのオペレーティング システムでは、ローカル検出 UI を使用して、パソコンに接続された従来のプリンタを <ph name="CLOUD_PRINT_NAME" /> に追加することも可能です。 このポリシーを有効に設定するか未設定のままにした場合は、ローカル デバイスの検出が許可されます。 @@ -6813,6 +6883,11 @@ <translation id="7269263983506766969">音声処理でデフォルトの優先度を使用する</translation> <translation id="7270001383428188269">このクライアント証明書の識別子です。</translation> <translation id="7271085005502526897">初回実行時にデフォルトのブラウザからホームページをインポートする</translation> +<translation id="7272892848025145170">Kerberos 機能が有効かどうかを制御します。Kerberos は、ウェブアプリやファイル共有の認証に使用できる認証プロトコルです。 + +このポリシーを有効に設定した場合、Kerberos 機能は有効になります。このとき、Kerberos アカウントは「Kerberos アカウントを設定する」ポリシーまたは Kerberos 設定ページの Kerberos アカウント設定から追加できます。 + +このポリシーを無効に設定するか未設定のままにした場合、Kerberos アカウント設定は無効になります。このとき、Kerberos アカウントは追加できず、Kerberos 認証は使用できません。既存の Kerberos アカウントと保存したパスワードもすべて削除されます。</translation> <translation id="7273785848231509306">ユーザー名と写真を表示しない</translation> <translation id="7274077256421167535">USB 電力共有を有効にする</translation> <translation id="7275334191706090484">管理対象のブックマーク</translation> @@ -7069,6 +7144,7 @@ このポリシーが未設定の場合、デフォルトで、企業の管理対象ユーザーは <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />、管理対象外のユーザーは <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> に設定されます。 今後、<ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" /> 値を使用して、<ph name="PRODUCT_OS_NAME" /> で <ph name="LACROS_NAME" /> を唯一の使用可能なブラウザとして設定できるようになる予定です。</translation> +<translation id="751071954873065775">事前ダウンロードが必要な DLC(ダウンロード可能なコンテンツ)を選択する</translation> <translation id="7512065400265675158"><ph name="USER_AGENT_HEADER_NAME" /> HTTP リクエスト ヘッダーは、今後、含められる情報の削減が予定されています。このポリシーでは、テストを行って互換性を確保できるように、この削減をすべてのウェブサイトに対して有効にすることができます。オリジン トライアルやフィールド トライアルによる削減の有効化を許可しないよう設定することもできます。 <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> とそのスケジュールについて詳しくは、こちらをご覧ください。 @@ -7424,6 +7500,9 @@ このポリシーを設定しない場合、ハイ コントラストは初期設定ではログイン画面で無効ですが、ユーザーはいつでも有効にできます。</translation> <translation id="7864539943188674973">Bluetooth を無効にする</translation> <translation id="7869986671709030417">背景のグラフィックのデフォルト印刷モード</translation> +<translation id="7872692545596413465">このポリシーを有効に設定して、非標準ポート(80 と 443 以外のポート)を入力した場合、生成された Kerberos SPN にそのポートが追加されます。 + +このポリシーを無効に設定するか未設定のままにした場合、生成された Kerberos SPN にポートは追加されません。</translation> <translation id="7877924399554599110">ユーザーのクラウド ポリシーをマシンレベルのポリシーに統合できる</translation> <translation id="7881421274383404138">このポリシーでは、企業プリンタを設定します。フォーマットは <ph name="PRINTERS_POLICY_NAME" /> ディクショナリと一致させ、許可リストまたは拒否リストに登録するプリンタごとに「<ph name="ID_FIELD" />」または「<ph name="GUID_FIELD" />」フィールドを追加で指定する必要があります。ファイルのサイズは 5 MB 以下とし、JSON 形式にします。5 MB は、約 21,000 台のプリンタを指定してエンコードしたファイルに相当します。ダウンロードの整合性の確認には暗号化ハッシュが使用されます。このファイルはダウンロードされた後、キャッシュされ、URL またはハッシュに変更があった場合は再度ダウンロードされます。<ph name="PRODUCT_OS_NAME" /> ではプリンタ設定ファイルがダウンロードされ、<ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />、<ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" />、<ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" /> に沿ってプリンタが利用可能になります。 @@ -7476,6 +7555,11 @@ このエンタープライズ ポリシーにより、管理者は、ユーザーが追加のスロットリングを有効にできるかどうかを制御できます。このポリシーを無効に設定した場合は、スロットリングを有効にできません。このポリシーを有効に設定するか未設定のままにした場合は、ユーザーがスロットリングを有効にすることや、Chrome のバリエーションを介して有効にすることができます。</translation> <translation id="793188693675675950">初回実行時のホームページのインポートを無効にする</translation> +<translation id="7932017046032784156">このポリシーを有効に設定した場合、Cast ツールバー アイコンがツールバーまたはオーバーフロー メニューに表示され、ユーザーはこのアイコンを削除できません。 + +このポリシーを無効に設定するか未設定のままにした場合、ユーザーはコンテキスト メニューを使ってこのアイコンを固定したり削除したりできます。 + +<ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> ポリシーが無効に設定されている場合は、このポリシーの値は適用されず、ツールバー アイコンは表示されません。</translation> <translation id="7933141401888114454">監視対象ユーザーを作成できるようにする</translation> <translation id="793473937901685727">ARC アプリで証明書を使用できるかどうかを設定します</translation> <translation id="7936302526928951356">ユーザー エージェント文字列のメジャー バージョンを固定しない。</translation> @@ -8195,6 +8279,9 @@ <translation id="8584279193368801689">PIN 印刷モードを制限します。ポリシーが未設定の場合は、制限なしとして扱われます。このモードを使用できない場合、このポリシーは無視されます。なお、PIN 印刷機能は、IPPS、HTTPS、USB、IPP-over-USB のいずれかのプロトコルを使用するプリンタに対してのみ有効にできます。</translation> <translation id="8587229956764455752">新しいユーザー アカウントの作成を許可する</translation> <translation id="8589285015138337712">ユーザーにシステム ショートカットのカスタマイズを許可しない</translation> +<translation id="8589346048177748110">このポリシーを True に設定した場合、ユーザーが恐竜ゲームをプレイすることを許可します。このポリシーを False に設定した場合、ユーザーはデバイスがオフラインのときに恐竜のイースター エッグゲームをプレイできません。 + +このポリシーを未設定のままにした場合、ユーザーは登録されている <ph name="PRODUCT_OS_NAME" /> ではゲームをプレイできませんが、他の環境ではプレイできます。</translation> <translation id="8591713876665299827">このポリシーはサポートが終了しており、<ph name="PRODUCT_OS_NAME" /> バージョン 85 で削除されます。代わりに <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> を使用してください。 AC 電源での使用中、ユーザー入力が行われなくなってからアイドル時の操作を行うまでの時間を指定します。 @@ -8494,6 +8581,9 @@ 無効に設定した場合、どのウェブページでも <ph name="SEARCH_SIDE_PANEL_FEATURE_NAME" /> を使用できません。</translation> <translation id="8860894781631833477"><ph name="PRODUCT_OS_NAME" /> のリリース チャンネルの設定をユーザーに許可する</translation> +<translation id="8862086508140571198">このポリシーでは、DLC(ダウンロード可能なコンテンツ)のリストをできるだけ早くダウンロードするよう設定できます。ダウンロードした DLC は、デバイス上のすべてのユーザーが利用できます。 + +これは、DLC を必要とする機能がデバイスのユーザーによって使用される可能性が高いことを管理者が知っている場合に便利です。</translation> <translation id="8864975621965365890">サイトが <ph name="PRODUCT_FRAME_NAME" /> によってレンダリングされるときに表示されるサポート終了メッセージを抑制します。</translation> <translation id="8865404058177794289">RSA 鍵用途の確認にデフォルト設定を使用する</translation> <translation id="8866430022832109569">アプリ広告枠レポート</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 0bc765d..c956faee 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -965,6 +965,11 @@ <translation id="1861206724856734193">Hiermee stel je een lijst in met regels ter voorkoming van datalekken.</translation> <translation id="1862267110714201519">De functie voor ghostvenster uitzetten.</translation> <translation id="1865417998205858223">Rechten voor sleutels</translation> +<translation id="1865867000796030567">Als je het beleid toepast, wordt de waarde van de manifestsleutel <ph name="REQUIRED_PLATFORM_VERSION" /> voor de automatisch gelanceerde kiosk-app zonder vertraging gebruikt als voorvoegsel voor de doelversie van de automatische update. + +Als je het beleid niet toepast of niet instelt, wordt de manifestsleutel <ph name="REQUIRED_PLATFORM_VERSION" /> genegeerd en verloopt de automatische update zoals gebruikelijk. + +Waarschuwing: Delegeer het beheer van de <ph name="PRODUCT_OS_NAME" />-versie niet aan een kiosk-app, omdat deze misschien voorkomt dat het apparaat software-updates en essentiële beveiligingsoplossingen ontvangt. Als je het beheer van de <ph name="PRODUCT_OS_NAME" />-versie delegeert, kan dit een risico opleveren voor gebruikers.</translation> <translation id="186719019195685253">Actie die moet worden ondernomen wanneer de vertraging voor inactief wordt bereikt bij gebruik op netspanning</translation> <translation id="1869688072690234823">Als je het beleid instelt, bepaal je welke WebAuthn-factoren kunnen worden gebruikt. @@ -1212,6 +1217,11 @@ Als je het beleid niet instelt of instelt op een lege lijst, zijn er geen standen voor snel ontgrendelen beschikbaar voor beheerde apparaten. Dit beleid is verouderd. Gebruik in plaats daarvan <ph name="QUICK_UNLOCK_MODE_ALLOW_LIST_POLICY_NAME" />.</translation> +<translation id="2035995535603698706">Als je het beleid toepast, kunnen afbeeldingen van derden op een pagina een verificatieprompt tonen. + +Als je het beleid niet toepast of niet instelt, kunnen afbeeldingen van derden geen verificatieprompt tonen. + +Dit beleid wordt meestal niet toegepast als beveiliging tegen phishing.</translation> <translation id="2036522553891755455">Als je het beleid toepast, wordt voor het ontdekken van fileshares (de functie Network File Shares van <ph name="PRODUCT_NAME" />) <ph name="NETBIOS_PROTOCOL" /> gebruikt om fileshares in het netwerk te ontdekken. Als je het beleid niet toepast, wordt dit protocol niet gebruikt om fileshares te ontdekken. Als je dit beleid niet instelt, staat dit gedrag standaard uit voor beheerde gebruikers en aan voor andere gebruikers.</translation> @@ -1379,6 +1389,19 @@ Bekijk de <ph name="WEBXR_AR_MODULE_API_NAME" />-specificatie voor meer informatie over <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />-sessies.</translation> <translation id="2175353308236295184">App-specifiek json-configuratieobject met een reeks sleutel-waardeparen, bijvoorbeeld '"managedConfiguration": { "key1": value1, "key2": value2 }'. De sleutels worden gedefinieerd in het app-manifest.</translation> <translation id="2176115444876446233">Voorkomen dat gebruikers een prestatietracering voor het hele systeem verzamelen.</translation> +<translation id="2177382213857119200">Hiermee kun je bepalen of de Safe Browsing-functie van <ph name="PRODUCT_NAME" /> moet aanstaan en in welke modus de functie actief moet zijn. + + Als je dit beleid instelt op NoProtection (waarde 0), is Safe Browsing nooit actief. + + Als je dit beleid instelt op StandardProtection (waarde 1, de standaardinstelling), is Safe Browsing altijd actief in de standaardmodus. + + Als je dit beleid instelt op EnhancedProtection (waarde 2), is Safe Browsing altijd actief in de uitgebreide modus. Deze modus biedt betere beveiliging, maar vereist dat er meer browsegegevens worden gedeeld met Google. + + Als je dit beleid instelt als verplicht, kunnen gebruikers de instelling voor Safe Browsing in <ph name="PRODUCT_NAME" /> niet wijzigen of overschrijven. + + Als je dit beleid niet instelt, staat Safe Browsing aan voor de standaard beveiligingsmodus, maar kunnen gebruikers deze instelling wijzigen. + + Zie https://support.google.com/chrome?p=safe_browsing_preferences voor meer informatie over Safe Browsing.</translation> <translation id="2177696016354404697">Het privacyscherm altijd uitzetten</translation> <translation id="2178899310296064282">Minimaal de gemiddelde 'Beperkte modus' op YouTube afdwingen</translation> <translation id="2180958780733364832">Gebruik van de stand zonder interface beheer</translation> @@ -2016,6 +2039,11 @@ Als dit beleid is ingesteld op false, kunnen met de pdf-viewer geen annotaties in pdf's worden gemaakt.</translation> <translation id="2769952903507981510">De vereiste domeinnaam configureren voor hosts voor externe toegang</translation> +<translation id="2770376586681635746">Bepaalt of gebruikers Kerberos-accounts mogen toevoegen. + +Als je dit beleid toepast of niet instelt, mogen gebruikers Kerberos-accounts toevoegen via de instellingen voor Kerberos-accounts op de pagina Kerberos-instellingen. Gebruikers hebben het volledige beheer over accounts die ze hebben toegevoegd en kunnen deze aanpassen of verwijderen. + +Als je dit beleid niet toepast, mogen gebruikers geen Kerberos-accounts toevoegen. De accounts kunnen alleen via het beleid Kerberos-accounts configureren worden toegevoegd. Dit is een effectieve manier om accounts te vergrendelen.</translation> <translation id="2772231477628401250">HTTP gebruiken voor downloads van updates</translation> <translation id="2772955711376920612">Als je dit beleid toepast en <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> en <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> instelt, blijft stroom voor piekuren aan (als het apparaat hiervoor geschikt is). Het beleid voor stroombeheer voor piekuren is een energiebesparingsbeleid waarmee het gebruik van wisselstroom op piekuren wordt geminimaliseerd. Voor elke dag van de week kun je een begin- en eindtijd instellen voor stroom voor piekuren. Zolang de batterij op deze momenten boven de ingestelde drempelwaarde blijft, blijft het apparaat op de batterij draaien (zelfs als het is aangesloten op wisselstroom). Na de ingestelde eindtijd gebruikt het apparaat wisselstroom (als het daarop is aangesloten) maar wordt de batterij niet opgeladen. Het apparaat keert terug naar de normale werking waarbij wisselstroom wordt gebruikt en de batterij wordt opgeladen na de opgegeven begintijd voor opladen. @@ -3344,6 +3372,7 @@ <translation id="3870300103958000506">Advertenties zijn op alle sites toegestaan als je <ph name="ADS_SETTINGS_FOR_INTRUSIVE_ADS_SITES_POLICY_NAME" /> instelt op 1 of niet instelt, tenzij <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> is ingesteld op False. Als je het beleid instelt op 2, worden advertenties geblokkeerd op alle sites met opdringerige advertenties.</translation> +<translation id="3876564097829884243">De functie EphemeralNetworkPolicies aanzetten.</translation> <translation id="3877517141460819966">Geïntegreerde modus voor authenticatie met twee factoren</translation> <translation id="3877908683993837673">Dit beleid beheert welke softwarestack wordt gebruikt voor communicatie met de DNS-server: de DNS-client van het besturingssysteem of de ingebouwde DNS-client van <ph name="PRODUCT_NAME" />. Dit beleid heeft geen invloed op welke DNS-servers worden gebruikt: als het besturingssysteem bijvoorbeeld is ingesteld voor gebruik van een zakelijke DNS-server, wordt diezelfde server gebruikt door de ingebouwde DNS-client. Ook wordt met dit beleid niet beheerd of DNS-over-HTTPS wordt gebruikt: <ph name="PRODUCT_NAME" /> gebruikt altijd de ingebouwde resolver voor DNS-over-HTTPS-verzoeken. Zie het <ph name="DNS_OVER_HTTPS_MODE_POLICY_NAME" />-beleid voor informatie over het beheer van DNS-over-HTTPS. @@ -3731,6 +3760,9 @@ Als je dit beleid niet instelt, kan de DNS-omzetting van het systeem worden uitgevoerd binnen de netwerkservice, buiten de netwerkservice of gedeeltelijk binnen en gedeeltelijk buiten, afhankelijk van de systeemconfiguratie en functievlaggen.</translation> <translation id="4239720644496144453">Het cachegeheugen wordt niet gebruikt voor Android-apps. Als meerdere gebruikers dezelfde Android-app installeren, wordt deze voor elke gebruiker opnieuw gedownload.</translation> <translation id="424318624725112807">Inlastekenmarkering op het inlogscherm aanzetten</translation> +<translation id="4245159233848584683">Als je het beleid toepast of niet instelt, toont <ph name="PRODUCT_OS_NAME" /> een netwerkconfiguratieprompt als een apparaat offline is en een lokaal account op het apparaat is ingesteld voor automatisch inloggen zonder vertraging. + +Als je het beleid niet toepast, wordt in plaats daarvan een foutmelding getoond.</translation> <translation id="4248277954659222481">Automatisch afspelen van media toestaan op een toelatingslijst met URL-patronen</translation> <translation id="4250680216510889253">Nee</translation> <translation id="4252522848899331223">Gebruiker toestaan Safe Browsing-waarschuwingen over te slaan</translation> @@ -3881,6 +3913,11 @@ <translation id="4410236409016356088">Netwerkbandbreedte beperken</translation> <translation id="4411734231900934213">Het toegestane verschil tussen de klok op het apparaat van het kind en het apparaat van de ouder (in seconden).</translation> <translation id="441217499641439905">Google Drive in de app Bestanden van <ph name="PRODUCT_OS_NAME" /> uitzetten bij mobiele verbindingen</translation> +<translation id="4412885120239670573">Als je het beleid toepast, wordt de interne pdf-viewer in <ph name="PRODUCT_NAME" /> uitgezet, worden pdf-bestanden als downloads behandeld en kunnen gebruikers pdf's openen met de standaard-app. + +Als je het beleid niet toepast, worden pdf-bestanden geopend, tenzij gebruikers de pdf-plug-in uitzetten. + +Als je het beleid instelt, kunnen gebruikers dit niet wijzigen in <ph name="PRODUCT_NAME" />. Als je het beleid niet instelt, kunnen gebruikers kiezen of ze pdf-bestanden extern willen openen.</translation> <translation id="4413453659814156568">Hiermee kun je een lijst met URL-patronen opgeven van sites die JavaScript mogen uitvoeren met de JIT-compiler (Just In Time) aangezet. Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige site-URL-patronen. <ph name="WILDCARD_VALUE" /> is geen geaccepteerde waarde voor dit beleid. @@ -3987,6 +4024,7 @@ <translation id="4482784169143060077">Automatische HTTPS-upgrades aanzetten</translation> <translation id="4483120730995943109">JavaScript-functie setTimeout() met een time-out van 0 ms wordt niet vastgezet op 1 ms.</translation> <translation id="4483649828988077221">Automatisch updaten uitzetten</translation> +<translation id="4483738129334574255">Easter egg-dinosaurusgame uitzetten op ingeschreven <ph name="PRODUCT_OS_NAME" />-apparaten, aanzetten onder andere omstandigheden</translation> <translation id="4484515651939984695">Hiermee geef je op hoelang (in seconden) een cast-apparaat dat via een toegangscode of QR-code is geselecteerd, in de lijst met cast-apparaten van het <ph name="PRODUCT_NAME" />-menu blijft staan.</translation> <translation id="4485425108474077672">De URL van de pagina 'Nieuw tabblad' configureren</translation> <translation id="4490420545181481759">X.509-certificaten kunnen beperkingen, zoals naambeperkingen, coderen in extensies in het certificaat. RFC 5280 bepaalt dat het afdwingen van dergelijke beperkingen voor vertrouwensankercertificaten optioneel is. Vanaf <ph name="PRODUCT_NAME" /> 112 worden dergelijke beperkingen afgedwongen in certificaten die worden geladen vanuit de certificaatopslag van het platform. @@ -4286,6 +4324,7 @@ In <ph name="MAC_OS_NAME" /> kunnen instanties, apps en extensies van buiten de Chrome Web Store alleen afgedwongen worden geïnstalleerd als de instantie wordt beheerd via MDM, via MCX aan een domein is gekoppeld of is ingeschreven voor <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />.</translation> <translation id="4742973303930120836">De modus voor afdrukken met achtergrondbeelden beperken</translation> +<translation id="4744467872051608680">Vanaf M119 geldt dat als je dit beleid instelt op False of niet instelt, WebSQL wordt uitgezet, maar kan worden aangezet via de Chrome-flag web-sql-access. Als je het beleid instelt op True, wordt WebSQL-toegang aangezet.</translation> <translation id="4745232963710538589">Extensie voor inzichten aanzetten om gebruiksstatistieken te rapporteren</translation> <translation id="4749670563834935149">Zet <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> aan voor een lijst met URL's op het inlog- en vergrendelscherm. @@ -4694,6 +4733,14 @@ Zie <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> en <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" /> als geen specifiek beleid voorrang krijgt. De URL-patronen die in deze 3 beleidsregels worden vermeld, mogen niet met elkaar conflicteren. Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige <ph name="URL_LABEL" />-patronen. <ph name="WILDCARD_VALUE" /> is geen geaccepteerde waarde voor dit beleid.</translation> +<translation id="5174547204575752627">Dit beleid beheert de recente refactor voor VideoDecoder-API's in PPAPI-plug-in. + +De migratie heeft alleen invloed op interne implementatiegegevens en verandert niets aan het gedrag. Dit beleid kan worden gebruikt als PPAPI-apps niet werken zoals verwacht. + +Als je het beleid toepast of niet instelt, bepaalt de browser welke implementatie wordt gebruikt. +Als je het beleid niet toepast, gebruikt de browser de oude implementatie totdat het beleid is verlopen. + +OPMERKING: Wijzigingen in dit beleid worden alleen weergegeven in onlangs gestarte weergaveprocessen terwijl de browser actief is.</translation> <translation id="5177260184597743704">Configuratiebeleid voor de Chrome Enterprise Connector OnSecurityEvent</translation> <translation id="5178479074002209469">Een Booleaanse markering die aangeeft of onbeheerde gebruikerssessies meldingen moeten krijgen en gedwongen moeten worden uitgelogd als er een update vereist is volgens dit beleid.</translation> <translation id="5179853299156742425">De URL waarop de bureautemplate kan worden gedownload.</translation> @@ -4711,6 +4758,7 @@ <translation id="519247340330463721">Beleid met betrekking tot Safe Browsing configureren.</translation> <translation id="5194683382395300627">Toestaan dat <ph name="ASSISTANT_PRODUCT_NAME" /> wordt gebruikt op internet, bijvoorbeeld om wachtwoorden automatisch te wijzigen</translation> <translation id="5196630732055960309">De File Handling API toestaan voor deze web-apps</translation> +<translation id="5205352023880027050">De functie EphemeralNetworkPolicies niet aanzetten.</translation> <translation id="5206454085187851382">Als <ph name="PRINTERS_ALLOWLIST" /> wordt gekozen voor <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, kun je door <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> in te stellen aangeven welke printers gebruikers kunnen gebruiken. Alleen printers waarvan de ID's overeenkomen met de waarden in dit beleid, zijn beschikbaar voor de gebruiker. De ID's moeten overeenkomen met het veld <ph name="ID_FIELD" /> of <ph name="GUID_FIELD" /> in het bestand dat is opgegeven in <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation> <translation id="5207543664699568887">Bepaalt of <ph name="PRODUCT_NAME" /> in Linux systeemmeldingen gebruikt. @@ -4862,6 +4910,9 @@ Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige <ph name="URL_LABEL" />-patronen. Dit beleid zoekt alleen overeenkomsten op basis van de herkomst, dus elk pad in het URL-patroon wordt genegeerd.</translation> <translation id="5318185076587284965">Relayservers laten gebruiken door de host voor externe toegang</translation> +<translation id="5321624917465764266">Als je het beleid toepast of niet instelt, kunnen de browser- en downloadgeschiedenis in Chrome worden verwijderd. Gebruikers kunnen deze instelling niet wijzigen. + +Als je dit beleid niet toepast, kunnen de browser- en downloadgeschiedenis niet worden verwijderd. Ook als je dit beleid niet toepast, kan niet worden gegarandeerd dat de browser- en downloadgeschiedenis behouden blijven. Gebruikers kunnen de databasebestanden van de geschiedenis rechtstreeks bewerken of verwijderen en de browser kan sommige of alle geschiedenisitems op elk moment laten verlopen of archiveren.</translation> <translation id="5323200200131319468">Gesproken feedback op het inlogscherm aanzetten</translation> <translation id="5323271643727095577">Geen annuleringsdialoogvenster tonen als event.preventDefault() wordt aangeroepen voor beforeunload-gebeurtenis. Annuleringsdialoogvenster tonen als event.returnValue de lege tekenreeks voor de beforeunload-gebeurtenis is.</translation> <translation id="5323355956693037267">Schermtoetsenbord op het inlogscherm aanzetten</translation> @@ -5103,6 +5154,9 @@ <translation id="5535256585099022933">Het tijdsinterval voor herstarten instellen</translation> <translation id="553806128266843748">Een Booleaanse markering die aangeeft of throttling aanstaat.</translation> <translation id="5540885720415375851">Toestaan dat lokale apparaten worden gevonden</translation> +<translation id="5542235730745104308">Als je het beleid instelt op True, gebruikt <ph name="PRODUCT_NAME" /> alternatieve foutpagina's die zijn ingebouwd (zoals Pagina niet gevonden). Als je het beleid instelt op False, gebruikt <ph name="PRODUCT_NAME" /> nooit alternatieve foutpagina's. + +Als je het beleid instelt, kunnen gebruikers het niet wijzigen. Als je het beleid niet instelt, wordt het toegepast maar kunnen gebruikers deze instelling wijzigen.</translation> <translation id="5544059132156503357">Als je het beleid instelt, geef je aan welke typen versleuteling zijn toegestaan wanneer Kerberos-tickets van een <ph name="MS_AD_NAME" />-server worden aangevraagd. Als je het beleid instelt op: @@ -5226,6 +5280,31 @@ <translation id="5622924058222112599">Standaard CECPQ2-uitrolproces aanzetten</translation> <translation id="5623304306796942802">Prompt als meerdere certificaten overeenkomen</translation> <translation id="5625771176514429288">Chrome-apps kunnen op deze platforms worden uitgevoerd.</translation> +<translation id="5627094573311711592">Hiermee stel je een lijst in met regels voor gegevensbeheer om datalekken te voorkomen. Datalekken kunnen onder meer optreden als je gegevens kopieert en plakt, bestanden toevoegt aan webpagina's, afdrukt en downloadt. + +Elke regel bestaat uit het volgende: +- Property's van de bron van een actie. Een regel wordt alleen geactiveerd als een gebruikersactie overeenkomt met alle velden die in het veld <ph name="DATA_CONTROLS_SOURCES" /> zijn ingevuld. Voor subvelden van een lijst hoeft er maar één item overeen te komen. Zo hoeft er maar één URL-patroon overeen te komen om de regel te activeren. + - Property's van de bestemming van een actie. Een regel wordt alleen geactiveerd als een gebruikersactie overeenkomt met alle velden die in het veld <ph name="DATA_CONTROLS_DESTINATIONS" /> zijn ingevuld. Voor subvelden van een lijst hoeft er maar één item overeen te komen. Zo hoeft er maar één URL-patroon overeen te komen om de regel te activeren. + - Een lijst met beperkingen die op de gegevens van de bronnen moeten worden toegepast. + + Regels kunnen om deze redenen worden toegevoegd: +- Bepalen welke klembordgegevens mogen worden gedeeld tussen de bronnen en de bestemmingen. + - Bepalen of er via de bronnen mag worden afgedrukt. + - Bestanden beheren die worden toegevoegd aan een van de bestemmingen. + - Bestanden beheren die via een van de bronnen worden gedownload. + + Als het beleid <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> is ingesteld op True, worden geactiveerde regels gemeld aan de beheerder. + Het beperkingsniveau kan worden ingesteld op ALLOW, BLOCK, WARN of REPORT. + - Als het beperkingsniveau is ingesteld op ALLOW, is de actie toegestaan. Hiermee worden ook beperkingen overschreven die door andere regels zijn toegepast. + - Als het beperkingsniveau is ingesteld op BLOCK, is de actie niet toegestaan. + - Als het beperkingsniveau is ingesteld op WARN, krijgt de gebruiker een waarschuwing en kan die ervoor kiezen door te gaan met de actie of deze te annuleren. + - Als het beperkingsniveau is ingesteld op REPORT, wordt de gebruikersactie niet onderbroken maar wordt er een melding gestuurd als het beleid <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> wordt toegepast. + + Opmerkingen: +- Gebruik een notatie voor de URL-patronen volgens deze indeling ( https://support.google.com/chrome/a?p=url_blocklist_filter_format). +- Zie ook het beleid <ph name="DATA_LEAK_PREVENTION_RULES_LIST" /> voor regels om datalekken te voorkomen die specifiek zijn voor <ph name="PRODUCT_OS_NAME" />. + + Als je het beleid niet instelt, worden er geen beperkingen toegepast.</translation> <translation id="5630352020869108293">De laatste sessie herstellen</translation> <translation id="5633871703004128675">Toegankelijkheidsfunctie voor markering van het caret-teken aanzetten</translation> <translation id="5634032995857968056">De sandbox voor de app-container van het weergaveprogramma aanzetten</translation> @@ -5852,6 +5931,9 @@ <translation id="625580680776945310">De modus voor hoge efficiëntie wordt aangezet.</translation> <translation id="6258658183356534534">De GREASE-updatefunctie voor User-Agent Client Hints beheren.</translation> <translation id="6261643884958898336">ID-gegevens van machine rapporteren</translation> +<translation id="6264247808139384018">Als je het beleid toepast of niet instelt, kunnen gebruikers die een wachtwoord gebruiken voor verificatie het scherm vergrendelen. + +Als je het beleid niet toepast, kunnen gebruikers het scherm niet vergrendelen. (Ze kunnen alleen uitloggen van de gebruikerssessie.)</translation> <translation id="6265892395051519509">Toegang tot sensoren op deze sites toestaan</translation> <translation id="6266043141694454734">Hiermee wordt bepaald of de Chrome Root Store en de ingebouwde certificaatverificatie worden gebruikt om servercertificaten te verifiëren</translation> <translation id="6267130578410325007">Dit beleid staat origin-keyed agentclustering standaard toe. @@ -5909,6 +5991,7 @@ <translation id="6299554629216555326">Instellingen voor vensterbeheer</translation> <translation id="6302021021024941085">Kiosk-tools voor probleemoplossing uitzetten.</translation> <translation id="6303118494824248488">URL van de schijfimage die moet worden gedownload.</translation> +<translation id="6303278429164386663">Bepaalt of de functie EphemeralNetworkPolicies wordt aangezet</translation> <translation id="6305373713165475629">Als je dit beleid instelt, wordt de standaard kleurinstelling voor afdrukken overschreven. Als deze instelling niet beschikbaar is, wordt dit beleid genegeerd.</translation> <translation id="6308109234708949641">Met dit beleid kunnen gebruikers van Family Link gebruikmaken van de functie Screencast om schermopnamen te maken, hiervan transcripties te maken en ze te uploaden naar Drive. Dit beleid is niet van toepassing voor andere gebruikerstypen. @@ -6083,6 +6166,9 @@ <translation id="6412352702230183710">Alleen hosts voor native berichten op systeemniveau toestaan</translation> <translation id="6416506846917150119">Voorspellend schrijven voor fysiek toetsenbord als gebruikers typen uitzetten</translation> <translation id="6417265370957905582">Google Assistent</translation> +<translation id="6421254653839955267">Als je het beleid toepast, wordt CNAME-lookup overgeslagen. De servernaam wordt gebruikt zoals deze is ingevoerd tijdens het maken van de Kerberos SPN. + +Als je het beleid niet toepast of niet instelt, bepaalt CNAME-lookup de canonieke naam van de server tijdens het maken van de Kerberos SPN.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6424486395812679373">Safe Browsing-checks uitvoeren op alle gedownloade bestanden</translation> <translation id="6433697627431665375">Voorkomen dat <ph name="PRODUCT_NAME" />-gegevens in back-ups worden opgenomen</translation> @@ -6220,6 +6306,11 @@ De beleidswaarde moet worden gespecificeerd in milliseconden. De opgegeven waarden moeten kleiner zijn dan de inactieve vertraging.</translation> <translation id="6497085755801788141">De ingebouwde certificaatverificatie gebruiken</translation> +<translation id="6504720469162323184">Als je het beleid instelt, geef je de hoeveelheid tijd in milliseconden zonder gebruikersactiviteit aan voordat er automatisch wordt ingelogd op het lokale account op het apparaat dat wordt gespecificeerd door het beleid <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" />. + +Als je het beleid niet instelt, betekent dit dat 0 milliseconden wordt gebruikt voor de time-out. + +Als je het beleid <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> niet instelt, heeft dit beleid geen effect.</translation> <translation id="65055701428353978">Als je dit beleid instelt, specificeer je voor elke getroffen extensie een lijst met OAuth-omleidingen die naast de standaard omleiding https://<extension id>.chromiumapp.org/ kunnen worden gebruikt door extensies met de <ph name="IDENTITY_API_NAME" />-API (<ph name="IDENTITY_API_URL" />). Als je het beleid niet instelt of als je een lege lijst met URL's invoert, mogen alle apps of extensies alleen de standaard omleiding gebruiken als ze de <ph name="IDENTITY_API_NAME" />-API gebruiken.</translation> @@ -6319,6 +6410,7 @@ Dit beleid kan worden overschreven door EnabledPlugins en DisabledPluginsExceptions. Als dit beleid niet is ingesteld, kan de gebruiker elke op het systeem geïnstalleerde plug-in gebruiken, behalve hardgecodeerde ongeschikte, verouderde of gevaarlijke plug-ins.</translation> +<translation id="6571055160227165318">Toestaan dat WebSQL wordt aangezet door Chrome-flag.</translation> <translation id="6574903167639386816">Profielgegevens op schijf wissen als gebruikerssessie eindigt</translation> <translation id="6575403002861093126">Als je dit beleid instelt, geef je aan hoeveel uur het Group Policy Object (GPO) in het cachegeheugen wordt bewaard. Dit is de maximale periode dat GPO's kunnen worden hergebruikt tot ze opnieuw worden gedownload. Het systeem gebruikt de in het cachegeheugen opgeslagen GPO's opnieuw in plaats van die opnieuw te downloaden bij het ophalen van elk beleid, zolang de versie van de GPO's niet is gewijzigd. @@ -6447,6 +6539,11 @@ Als je het beleid niet toepast of niet instelt, wordt het afdrukvoorbeeldscherm geactiveerd door afdrukopdrachten.</translation> <translation id="6655274714135630366">Hexadecimale gecodeerde SHA-256-hash van de schijfimage.</translation> +<translation id="6655844456903132379">Als je het beleid toepast, respecteert HTTP-verificatie goedkeuring door het KDC-beleid. Met andere woorden: <ph name="PRODUCT_NAME" /> delegeert inloggegevens van gebruikers alleen aan de te gebruiken service als het KDC <ph name="OK_AS_DELEGATE" /> instelt op een serviceticket. Zie RFC 5896 (https://tools.ietf.org/html/rfc5896.html). De service moet ook worden toegestaan door <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />. + +Als je het beleid niet toepast of niet instelt, wordt het KDC-beleid genegeerd op ondersteunde platforms en wordt alleen <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> gerespecteerd. + +Op <ph name="MS_WIN_NAME" /> wordt het KDC-beleid altijd gerespecteerd.</translation> <translation id="6658245400435704251">Bepaalt het maximaal aantal seconden dat een apparaat willekeurig de download van een update mag uitstellen vanaf het moment dat de update voor het eerst naar de server werd gepusht. Het apparaat kan een deel van deze tijd wachten in termen van kloktijd en het resterende deel in termen van het aantal updatecontroles. De maximale spreiding is in elk geval begrensd door een constante periode zodat een apparaat nooit vastloopt tijdens het wachten tot een update kan worden gedownload.</translation> <translation id="6659537776197644458">Geen verificatieprocessen voor wachtwoordsynchronisatie activeren</translation> <translation id="6661178198729301029">Cloudrapportage voor beheerde profielen aanzetten</translation> @@ -6696,6 +6793,7 @@ Als het beleid is ingesteld op False of niet is ingesteld, is de indeling niet beschikbaar. Hiervoor moet opnieuw worden opgestart.</translation> <translation id="685769593149966548">Strenge 'Beperkte modus' voor YouTube afdwingen</translation> <translation id="686079137349561371">Microsoft Windows 7 of later</translation> +<translation id="6866755486434471318">Toestaan dat <ph name="PEPPER_NAME" /> gedeelde afbeeldingen gebruikt voor videodecodering.</translation> <translation id="6881447940489194100">Hexadecimale gecodeerde SHA-256-hash van de gegevens.</translation> <translation id="68818134518270542">Als je het beleid instelt, geef je de apps op die gebruikers beschikbaar kunnen maken als notitie-app op het vergrendelscherm van <ph name="PRODUCT_OS_NAME" />. @@ -6980,6 +7078,11 @@ Als je dit beleid instelt op False, wordt de functionaliteit uitgezet.</translation> <translation id="7123271473727774529">De toegankelijkheidsfunctie voor kleurcorrectie aanzetten</translation> <translation id="7126716959063786004">Beëindiging van processen in Taakbeheer aanzetten</translation> +<translation id="7126787606641224668">Bepaalt of de functie Wachtwoord onthouden aanstaat in het dialoogvenster voor Kerberos-verificatie. Wachtwoorden worden versleuteld opgeslagen op een schijf, alleen toegankelijk voor de systeemdaemon van Kerberos en tijdens een gebruikerssessie. + +Als je dit beleid toepast of niet instelt, kunnen gebruikers besluiten of Kerberos-wachtwoorden worden onthouden, zodat deze niet opnieuw hoeven worden ingevoerd. Kerberos-tickets worden automatisch opgehaald tenzij aanvullende verificatie vereist is (verificatie in 2 stappen). + +Als je dit beleid niet toepast, worden wachtwoorden nooit onthouden en worden alle eerder opgeslagen wachtwoorden verwijderd. Gebruikers moeten elke keer dat ze zich moeten laten verifiëren bij het Kerberos-systeem, hun wachtwoord invoeren. Afhankelijk van de serverinstelling gebeurt dit normaal elke 8 uur tot een aantal maanden.</translation> <translation id="7126928806195745404">Instellingen voor JavaScript</translation> <translation id="7127980134843952133">Downloadgeschiedenis</translation> <translation id="7128513247945602297">Automatisch upgraden van gemengde content aanzetten op HTTPS-sites</translation> @@ -7043,9 +7146,16 @@ Als dit beleid niet is ingesteld, kan de browser DNS-over-HTTPS-verzoeken versturen naar een resolver die is gekoppeld aan de geconfigureerde systeemresolver van de gebruiker.</translation> <translation id="7152640356717355643">Rapportage voor netwerkinterface van apparaat aanzetten</translation> +<translation id="7153786895642570081">Met dit beleid bepaal je of de functie EphemeralNetworkPolicies wordt aangezet. +Als je dit beleid instelt op True, worden de DeviceOpenNetworkConfiguration-vermeldingen RecommendedValuesAreEphemeral en UserCreatedNetworkConfigurationsAreEphemeral gerespecteerd. +Als je dit beleid niet instelt of instelt op False, wordt het genoemde netwerkbeleid alleen gerespecteerd als de functie EphemeralNetworkPolicies aanstaat. +Dit beleid wordt verwijderd als de functie EphemeralNetworkPolicies standaard aanstaat.</translation> <translation id="7157329428182136164">Ondersteuning voor API's voor 3D-afbeeldingen aanzetten</translation> <translation id="7158358621906236999">Standaardinstelling voor sensoren</translation> <translation id="7161568070244869726">Afdwingen dat AppCache wordt aangezet</translation> +<translation id="7165879643294314958">Als je het beleid toepast of niet instelt, wordt een lokaal account op het apparaat ingesteld voor automatisch inloggen zonder vertraging. <ph name="PRODUCT_OS_NAME" /> respecteert de sneltoets Ctrl+Alt+S waarmee het automatisch inloggen wordt omzeild en het inlogscherm wordt getoond. + +Als je het beleid niet toepast, kunnen gebruikers automatisch inloggen zonder vertraging (indien ingesteld) niet omzeilen.</translation> <translation id="7165882688932913315">Dit beleid beheert de toegang tot bedienbare functies in de UI voor lokale vindbaarheid (<ph name="CHROME_DEVICES_LINK" />) waarin vindbare apparaten in de buurt van de gebruiker en door de gebruiker geregistreerde cloudapparaten worden getoond. Op alle besturingssystemen (met uitzondering van <ph name="PRODUCT_OS_NAME" />) kunnen gebruikers via de UI voor lokale vindbaarheid ook klassieke printers die aan hun computers zijn gekoppeld, toevoegen aan <ph name="CLOUD_PRINT_NAME" />. Als je het beleid toepast of niet instelt, zijn lokale apparaten vindbaar. @@ -7162,6 +7272,11 @@ <translation id="7269263983506766969">Standaardprioriteit gebruiken voor audioproces</translation> <translation id="7270001383428188269">De ID voor dit clientcertificaat.</translation> <translation id="7271085005502526897">Homepage importeren uit standaardbrowser bij eerste uitvoering</translation> +<translation id="7272892848025145170">Bepaalt of de Kerberos-functionaliteit aanstaat. Kerberos is een verificatieprotocol dat kan worden gebruikt om web-apps en gedeelde bestanden te verifiëren. + +Als je dit beleid toepast, wordt de Kerberos-functionaliteit aangezet. Kerberos-accounts kunnen worden toegevoegd via zowel het beleid Kerberos-accounts configureren als de instellingen voor Kerberos-accounts op de pagina Kerberos-instellingen. + +Als je dit beleid niet toepast of niet instelt, staan de instellingen voor Kerberos-accounts uit. Er kunnen geen Kerberos-accounts worden toegevoegd en Kerberos-verificatie kan niet worden gebruikt. Alle bestaande Kerberos-accounts worden verwijderd en alle opgeslagen wachtwoorden worden verwijderd.</translation> <translation id="7273785848231509306">Nooit namen en foto's van gebruikers laten zien</translation> <translation id="7274077256421167535">Energie delen via USB</translation> <translation id="7275334191706090484">Beheerde bookmarks</translation> @@ -7824,6 +7939,9 @@ Als dit beleid niet is ingesteld, staat hoog contrast in eerste instantie uit op het inlogscherm. De gebruiker kan deze functie op elk gewenst moment aanzetten.</translation> <translation id="7864539943188674973">Bluetooth uitzetten</translation> <translation id="7869986671709030417">Standaardmodus voor afdrukken met achtergrondbeelden</translation> +<translation id="7872692545596413465">Als je het beleid toepast en een niet-standaard poort invoert (dat wil zeggen, een andere poort dan 80 of 443), wordt deze poort opgenomen in de gemaakte Kerberos-SPN. + +Als je het beleid niet toepast of niet instelt, bevat de gemaakte Kerberos-SPN geen poort.</translation> <translation id="7877924399554599110">Hiermee kun je aanzetten dat cloudbeleidsregels voor gebruikers worden samengevoegd in beleidsregels op machineniveau</translation> <translation id="7881421274383404138">Met dit beleid worden bedrijfsprinters ingesteld. De indeling komt overeen met de dictionary <ph name="PRINTERS_POLICY_NAME" />, waarbij voor elke printer ook een veld <ph name="ID_FIELD" /> of <ph name="GUID_FIELD" /> verplicht is voor de toelatingslijst of weigeringslijst. Bestanden moeten een json-indeling hebben en mogen maximaal 5 MB zijn. In een bestand van 5 MB kunnen ongeveer 21.000 printers staan. De cryptografische hash wordt gebruikt om de integriteit van de download te verifiëren. Het bestand wordt gedownload, gecachet en opnieuw gedownload als de URL of de hash wordt gewijzigd. <ph name="PRODUCT_OS_NAME" /> downloadt het bestand voor printerconfiguraties en maakt printers beschikbaar in overeenstemming met <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> en <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" />. @@ -7876,6 +7994,11 @@ Met dit bedrijfsbeleid kunnen beheerders bepalen of hun gebruikers de extra throttling wel of niet kunnen aanzetten. Als je het beleid niet toepast, kan de throttling niet worden aangezet. Als het beleid wordt toegepast of niet wordt ingesteld, kan de gebruiker throttling toestaan of kan de functie worden aangezet via Chrome-varianten.</translation> <translation id="793188693675675950">Import van homepage bij eerste uitvoering uitzetten</translation> +<translation id="7932017046032784156">Als je het beleid toepast, wordt het Cast-icoon getoond op de werkbalk of in het overloopmenu en kunnen gebruikers het icoon niet verwijderen. + +Als je het beleid niet toepast of niet instelt, kunnen gebruikers het icoon vastzetten of verwijderen via het contextmenu. + +Als je het beleid <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> niet toepast, heeft de waarde van dit beleid geen effect en wordt het werkbalkicoon niet getoond.</translation> <translation id="7933141401888114454">Aanmaak van bewaakte gebruikers aanzetten</translation> <translation id="793473937901685727">Certificaatbeschikbaarheid instellen voor ARC-apps</translation> <translation id="7936302526928951356">De tekenreeks voor User-agent zet de hoofdversie niet vast.</translation> @@ -8631,6 +8754,9 @@ <translation id="8584279193368801689">Beperkt de modus voor afdrukken met pincode. Als het beleid niet is ingesteld, gelden er geen beperkingen. Als de modus niet beschikbaar is, wordt dit beleid genegeerd. Houd er rekening mee dat de functie voor afdrukken met pincode alleen werkt met printers die het protocol IPPS, HTTPS, USB of IPP-over-USB gebruiken.</translation> <translation id="8587229956764455752">Het maken van nieuwe gebruikersaccounts toestaan</translation> <translation id="8589285015138337712">Niet toestaan dat de gebruiker systeemsneltoetsen aanpast</translation> +<translation id="8589346048177748110">Als je het beleid instelt op True, kunnen gebruikers de dinosaurusgame spelen. Als je het beleid instelt op False, kunnen gebruikers de easter egg-dinosaurusgame niet spelen als het apparaat offline is. + +Als je het beleid niet instelt, kunnen gebruikers de game niet spelen op ingeschreven <ph name="PRODUCT_OS_NAME" />-apparaten, maar wel onder andere omstandigheden.</translation> <translation id="8591713876665299827">Dit beleid is beëindigd en wordt verwijderd in <ph name="PRODUCT_OS_NAME" />-versie 85. Gebruik in plaats daarvan <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Specificeert de tijdsduur zonder gebruikersinvoer waarna de actie voor inactiviteit wordt uitgevoerd als er op netstroom wordt gewerkt. @@ -8797,6 +8923,7 @@ Als je het beleid instelt, kunnen gebruikers deze functie niet wijzigen. Als je het niet instelt, kunnen ze de instelling wel wijzigen.</translation> <translation id="8707790573162457301">Automatische schijfopruiming uitvoeren tijdens inloggen</translation> <translation id="8713535263782304771">Safe Browsing uitzetten</translation> +<translation id="8714556680280715750">Een URL die gebruikers kunnen bezoeken voor meer informatie. Als je dit beleid niet instelt, bevat het installatieprogramma geen URL met meer informatie. Indien aanwezig moet dit het https-schema gebruiken.</translation> <translation id="8715181294371649277">Realtime downloadbeveiliging van Safe Browsing toestaan</translation> <translation id="8715885991031124968">JavaScript-dialoogvensters toestaan als deze worden geactiveerd vanaf een subframe met een andere oorsprong.</translation> <translation id="8720547069538712402">Toestaan dat gebruikers de spellingcontrole aan- of uitzetten</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 1771c57..fde7ea20 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -977,6 +977,11 @@ <translation id="1861206724856734193">Define uma lista de regras para prevenção contra vazamento de dados.</translation> <translation id="1862267110714201519">Desativar o recurso de janela fantasma.</translation> <translation id="1865417998205858223">Principais permissões</translation> +<translation id="1865867000796030567">Ativar a política faz com que o valor da chave de manifesto <ph name="REQUIRED_PLATFORM_VERSION" /> do aplicativo de quiosque iniciado automaticamente sem atraso seja usado como o prefixo da versão de destino atualizada automaticamente. + +Desativar a política ou deixá-la sem definição faz com que a chave de manifesto <ph name="REQUIRED_PLATFORM_VERSION" /> seja ignorada e a atualização automática continue normalmente. + +Alerta: não delegue o controle da versão do <ph name="PRODUCT_OS_NAME" /> para um aplicativo de quiosque, porque isso pode impedir que o dispositivo receba atualizações de software e correções de segurança críticas. Delegar o controle da versão do <ph name="PRODUCT_OS_NAME" /> pode colocar os usuários em risco.</translation> <translation id="186719019195685253">Ação a ser executada quando o tempo de inatividade for atingido durante operação com alimentação CA</translation> <translation id="1869688072690234823">Se a política for definida, ela vai controlar quais fatores de WebAuthn podem ser usados. @@ -1225,6 +1230,11 @@ Se a política não for definida ou se ela for definida como uma lista vazia, nenhum modo de desbloqueio rápido estará disponível nos dispositivos gerenciados. Esta política está obsoleta. Use a <ph name="QUICK_UNLOCK_MODE_ALLOW_LIST_POLICY_NAME" />.</translation> +<translation id="2035995535603698706">Se a política for ativada, imagens de terceiros em uma página poderão aparecer em um prompt de autenticação. + +Se a política for desativada ou não for definida, imagens de terceiros não poderão aparecer em um prompt de autenticação. + +Normalmente, essa política fica desativada como defesa contra phishing.</translation> <translation id="2036522553891755455">Se a política for definida como "Ativada", a detecção de compartilhamento de arquivos de rede do <ph name="PRODUCT_NAME" /> usará o <ph name="NETBIOS_PROTOCOL" /> para detectar compartilhamentos na rede. Se a política for definida como "Desativada", a detecção de compartilhamentos não usará esse protocolo. Se a política não for definida, o comportamento ficará desativado por padrão para usuários gerenciados e ativado para outros usuários.</translation> @@ -1394,6 +1404,19 @@ Para saber mais sobre sessões <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, consulte a especificação <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation> <translation id="2175353308236295184">Objeto de configuração JSON específico do app com um conjunto de pares de chave-valor, por exemplo, '"managedConfiguration": { "key1": value1, "key2": value2 }'. As chaves são definidas no manifesto do app.</translation> <translation id="2176115444876446233">Impede que os usuários coletem o rastreamento de desempenho do sistema.</translation> +<translation id="2177382213857119200">Permite que você controle se o recurso Navegação segura do <ph name="PRODUCT_NAME" /> está ativado e em que modo ele opera. + + Se esta política for definida como "NoProtection" (valor 0), a Navegação segura nunca estará ativa. + + Se a política for definida como "StandardProtection" (valor 1, que é o padrão), a Navegação segura sempre estará ativa no modo padrão. + + Se a política for definida como "EnhancedProtection" (valor 2), a Navegação segura sempre estará ativa no modo avançado, que oferece maior segurança, mas requer o compartilhamento de mais informações de navegação com o Google. + + Se você definir esta política como obrigatória, os usuários não poderão mudar ou substituir a configuração da Navegação segura no <ph name="PRODUCT_NAME" />. + + Se esta política não for definida, a Navegação segura vai operar no modo "Proteção padrão", mas os usuários poderão mudar a configuração. + + Consulte https://support.google.com/chrome?p=safe_browsing_preferences para mais informações sobre a Navegação segura.</translation> <translation id="2177696016354404697">Sempre desativar a tela de privacidade</translation> <translation id="2178899310296064282">Aplicar pelo menos o Modo restrito moderado no YouTube</translation> <translation id="2180958780733364832">Controlar o uso do modo headless</translation> @@ -2054,6 +2077,11 @@ Quando esta política é definida como falsa, o visualizador de PDF não pode fazer anotações em PDFs.</translation> <translation id="2769952903507981510">Configurar o nome de domínio obrigatório para hosts de acesso remoto</translation> +<translation id="2770376586681635746">Controla se os usuários podem adicionar contas do Kerberos. + +Se esta política for ativada ou não for definida, os usuários poderão adicionar contas do Kerberos pela página de configurações de contas dele. Os usuários terão controle total das contas que adicionaram e poderão modificá-las ou removê-las. + +Se esta política for desativada, os usuários não poderão adicionar contas do Kerberos. As contas só poderão ser adicionadas pela política "Configurar contas do Kerberos". Essa é uma maneira eficiente de bloquear contas.</translation> <translation id="2772231477628401250">Usar o HTTP para atualizar os downloads</translation> <translation id="2772955711376920612">Se a política for definida como "Ativada" e <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> e <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> forem definidas, a economia de energia no período de pico permanecerá ativa, caso ela seja compatível com o dispositivo. A política de gerenciamento de energia no período de pico gera economia pela redução do uso de corrente alternada quando há alto consumo. É possível definir um horário de início e término do modo de economia de energia no período de pico para cada dia da semana. Durante esses períodos, o dispositivo funcionará usando a bateria mesmo se estiver conectado à corrente alternada, desde que a bateria se mantenha acima do limite especificado. Depois do horário de término especificado, o dispositivo funcionará usando energia de corrente alternada (se conectado), mas a bateria não será carregada. O dispositivo voltará a funcionar normalmente, usando corrente alternada e recarregando a bateria depois do horário de início de carregamento especificado. @@ -3833,6 +3861,9 @@ Se a política for deixada sem definição, a resolução de DNS poderá ser executada no serviço de rede, fora dele ou parcialmente dentro e parcialmente fora, dependendo da configuração do sistema e das flags de recursos.</translation> <translation id="4239720644496144453">O cache não é usado para apps Android. Se vários usuários instalarem o mesmo app Android, o download dele será feito novamente para cada usuário.</translation> <translation id="424318624725112807">Ativar o destaque do cursor de texto na tela de login</translation> +<translation id="4245159233848584683">Ativar a política ou deixá-la sem definição faz com que o <ph name="PRODUCT_OS_NAME" /> mostre uma solicitação de configuração da rede quando um dispositivo ficar off-line, se uma conta local do dispositivo estiver definida para login automático sem atraso. + +A desativação da política faz com que uma mensagem de erro apareça.</translation> <translation id="4248277954659222481">Permitir reprodução automática de mídia em uma lista de permissões de padrões de URL</translation> <translation id="4250680216510889253">Não</translation> <translation id="4252522848899331223">Permitir que o usuário ignore o aviso do recurso Navegação segura</translation> @@ -3983,6 +4014,11 @@ <translation id="4410236409016356088">Ativar o acelerador de largura de banda da rede</translation> <translation id="4411734231900934213">A diferença permitida entre o relógio dos dispositivos do familiar responsável e da criança (em segundos).</translation> <translation id="441217499641439905">Desativar o Google Drive em conexões celulares no app Arquivos do <ph name="PRODUCT_OS_NAME" /></translation> +<translation id="4412885120239670573">Se a política for ativada, o visualizador de PDF interno será desativado no <ph name="PRODUCT_NAME" />, os arquivos PDF serão tratados como downloads e os usuários poderão abrir PDFs com o aplicativo padrão. + +Se ela for desativada, os arquivos PDF serão abertos no plug-in, a menos que ele seja desativado pelos usuários. + +Se você definir a política, os usuários não poderão mudá-la no <ph name="PRODUCT_NAME" />. Se ela não for definida, os usuários poderão escolher se os PDFs serão ou não abertos externamente.</translation> <translation id="4413453659814156568">Permite definir uma lista de padrões de URL que especificam sites com permissão para executar o JavaScript com o compilador JIT (Just In Time) ativado. Para ver informações detalhadas sobre padrões de URL válidos, consulte https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. O valor <ph name="WILDCARD_VALUE" /> não é aceito para esta política. @@ -4090,6 +4126,7 @@ <translation id="4482784169143060077">Ativar upgrades automáticos do HTTPS</translation> <translation id="4483120730995943109">A função setTimeout() do JavaScript com um tempo limite de 0 ms não vai ser limitada a 1 ms.</translation> <translation id="4483649828988077221">Desativar a atualização automática</translation> +<translation id="4483738129334574255">Desativar o jogo easter egg de dinossauro nos dispositivos <ph name="PRODUCT_OS_NAME" /> registrados e ativar em outras circunstâncias</translation> <translation id="4484515651939984695">Especificar por quanto tempo (em segundos) um dispositivo de transmissão selecionado com um código de acesso ou QR permanece na lista aparelhos desse tipo no menu do <ph name="PRODUCT_NAME" />.</translation> <translation id="4485425108474077672">Configurar o URL da página "Nova guia"</translation> <translation id="4490420545181481759">Os certificados X.509 podem codificar restrições, como as de nome, @@ -4426,6 +4463,7 @@ Em instâncias do <ph name="MAC_OS_NAME" />, apps e extensões de fora da Chrome Web Store só poderão ter a instalação forçada se a instância for gerenciada por MDM, associada a um domínio via MCX ou registrada em <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />.</translation> <translation id="4742973303930120836">Restringir modo de impressão de gráficos de segundo plano</translation> +<translation id="4744467872051608680">Na versão M119, se a política for definida como falsa ou deixada sem definição, o WebSQL será desativado, mas poderá ser ativado com a sinalização do Chrome "web-sql-access". Se ela for definida como verdadeira, o acesso ao WebSQL será ativado.</translation> <translation id="4745232963710538589">Ativar extensão de insights para relatar métricas de uso</translation> <translation id="4749670563834935149">Ative o <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> para criar uma lista de URLs nas telas de login e de bloqueio. @@ -5013,6 +5051,9 @@ Para informações detalhadas sobre padrões de <ph name="URL_LABEL" /> válidos, consulte https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. A política só faz a correspondência com base na origem, então os caminhos no padrão do URL serão ignorados.</translation> <translation id="5318185076587284965">Ativar o uso de servidores relay pelo host de acesso remoto</translation> +<translation id="5321624917465764266">Se a política for ativada ou não for definida, o histórico de navegação e de downloads poderão ser excluídos no Chrome e os usuários não poderão mudar essa configuração. + +Se a política for desativada, o histórico de navegação e o de downloads não poderão ser excluídos. Mesmo que a política esteja desativada, não há garantia de que o histórico de navegação e o de downloads serão preservados. Os usuários poderão editar ou excluir os arquivos de banco de dados de histórico diretamente, e o próprio navegador poderá expirar ou arquivar todo ou qualquer item de histórico a qualquer momento.</translation> <translation id="5323200200131319468">Ativar a resposta falada na tela de login.</translation> <translation id="5323271643727095577">Não mostrar a caixa de diálogo de cancelamento quando event.preventDefault() for chamado para o evento beforeunload. Mostrar a caixa de diálogo de cancelamento quando beforeunload event.returnValue for a string vazia para o evento beforeunload.</translation> <translation id="5323355956693037267">Ativar o teclado na tela de login</translation> @@ -5253,6 +5294,9 @@ <translation id="5535256585099022933">Configurar o intervalo de tempo para reinicialização</translation> <translation id="553806128266843748">Uma sinalização booleana indicando se a limitação está ativada.</translation> <translation id="5540885720415375851">Permitir a detecção de dispositivos locais</translation> +<translation id="5542235730745104308">Se a política for definida como verdadeira, o <ph name="PRODUCT_NAME" /> vai usar páginas de erro alternativas integradas no navegador, como "Página não encontrada". Se a política for definida como falsa, o <ph name="PRODUCT_NAME" /> nunca vai usar páginas de erro alternativas. + +Se você definir a política, os usuários não poderão mudá-la. Se ela não for definida, ficará ativa, mas os usuários poderão mudá-la.</translation> <translation id="5544059132156503357">A definição da política designa quais tipos de criptografia têm permissão ao solicitar tickets do Kerberos de um servidor do <ph name="MS_AD_NAME" />. Se a política for definida como: @@ -6021,6 +6065,9 @@ <translation id="625580680776945310">O modo de alta eficiência vai ser ativado.</translation> <translation id="6258658183356534534">Controlar o recurso de atualização do User-Agent Client Hints GREASE.</translation> <translation id="6261643884958898336">Reportar informações de identificação da máquina</translation> +<translation id="6264247808139384018">Se a política for ativada ou não for definida, os usuários que autenticam com uma senha poderão bloquear a tela. + +Se a política for desativada, os usuários não poderão bloquear a tela. Eles só poderão sair da sessão do usuário.</translation> <translation id="6265892395051519509">Permite acesso a sensores nesses sites</translation> <translation id="6266043141694454734">Determina se a Chrome Root Store e o verificador de certificados integrado vão ser usados para verificar os certificados do servidor</translation> <translation id="6267130578410325007">Esta política permite por padrão o clustering do agente com origin-key. @@ -6293,6 +6340,9 @@ <translation id="6412352702230183710">Permitir apenas hosts de mensagens nativas no nível do sistema</translation> <translation id="6416506846917150119">Desativar a escrita preditiva do teclado físico quando os usuários digitarem</translation> <translation id="6417265370957905582">Google Assistente</translation> +<translation id="6421254653839955267">Ativar a política faz com que a pesquisa CNAME seja ignorada. O nome do servidor é usado conforme inserido ao gerar o SPN do Kerberos. + +Desativar a política ou deixá-la sem definição faz com que a pesquisa CNAME determine o nome canônico do servidor ao gerar o SPN do Kerberos.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6424486395812679373">Realizar as verificações do "Navegação segura" em todos os arquivos transferidos por download</translation> <translation id="6433697627431665375">Evitar que os dados do <ph name="PRODUCT_NAME" /> sejam incluídos em backups</translation> @@ -6435,6 +6485,11 @@ O valor da política precisa ser especificado em milissegundos. Os valores são ajustados para serem menores que o intervalo de inatividade.</translation> <translation id="6497085755801788141">Usar o verificador de certificados integrado</translation> +<translation id="6504720469162323184">A definição da política determina o tempo (em milissegundos) sem atividade do usuário até o login automático na conta local do dispositivo especificada pela <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" />. + +Se a política não for definida, o tempo limite de 0 milissegundos será usado. + +Se a <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> não for definida, esta política não terá efeito.</translation> <translation id="65055701428353978">A definição desta política especifica, para cada extensão afetada, uma lista de URLs de redirecionamento OAuth que podem ser usados por extensões com a API <ph name="IDENTITY_API_NAME" /> (<ph name="IDENTITY_API_URL" />), @@ -6538,6 +6593,7 @@ Observe que a política pode ser substituída por EnabledPlugins e DisabledPluginsExceptions. Quando esta política não for definida, o usuário poderá usar qualquer plug-in instalado no sistema, a não ser plug-ins codificados incompatíveis, obsoletos ou perigosos.</translation> +<translation id="6571055160227165318">Permita que o WebSQL seja ativado por uma sinalização do Chrome.</translation> <translation id="6574903167639386816">Remover os dados do perfil no disco quando a sessão do usuário terminar</translation> <translation id="6575403002861093126">A definição da política especifica, em horas, o ciclo de vida em cache do Objeto de Política de Grupo (GPO, na sigla em inglês), que é o período máximo de reutilização dos GPOs antes do download deles ser feito novamente. Em vez de fazer o download novamente a cada busca da política, o sistema reutiliza os GPOs armazenados em cache enquanto as versões deles não são modificadas. @@ -6665,6 +6721,11 @@ Se a política for definida como "Desativada" ou for deixada sem definição, os comandos de impressão acionarão a tela de visualização de impressão.</translation> <translation id="6655274714135630366">Hash SHA-256 codificado em hexadecimal da imagem do disco.</translation> +<translation id="6655844456903132379">Ativar a política faz com que a autenticação HTTP respeite a aprovação pela política de KDC. Em outras palavras, o <ph name="PRODUCT_NAME" /> delegará credenciais de usuário para o serviço acessado se o KDC definir <ph name="OK_AS_DELEGATE" /> em um ticket de serviço. Consulte RFC 5896 (https://tools.ietf.org/html/rfc5896.html, link em inglês). O serviço também precisa ter a permissão de <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />. + +Desativar a política ou deixá-la sem definição faz com que a política de KDC seja ignorada nas plataformas com suporte, e somente <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> será respeitada. + +No <ph name="MS_WIN_NAME" />, a política de KDC sempre é respeitada.</translation> <translation id="6658245400435704251">Especifica o número de segundos que um dispositivo pode chegar a atrasar aleatoriamente o download de uma atualização a partir do momento em que a atualização foi lançada no servidor. O dispositivo pode esperar uma parte desse intervalo de tempo em tempo cronológico e o restante contado em número de verificações de atualizações. Em todo caso, a dispersão tem como limite máximo uma quantidade constante de tempo para que o dispositivo nunca fique parado indefinidamente esperando para fazer o download de uma atualização.</translation> <translation id="6659537776197644458">Não acionar fluxos de autenticação para a sincronização de senhas</translation> <translation id="6661178198729301029">Ativar os relatórios de nuvem do perfil gerenciado</translation> @@ -7226,6 +7287,11 @@ Se a política for definida como falsa, essa função será desativada.</translation> <translation id="7123271473727774529">Ativar o recurso de acessibilidade de correção de cor</translation> <translation id="7126716959063786004">Permitir processos de finalização no gerenciador de tarefas</translation> +<translation id="7126787606641224668">Controla se o recurso "Lembrar senha" está ativado na caixa de diálogo de autenticação do Kerberos. As senhas são armazenadas de maneira criptografada no disco. Elas só podem ser acessadas pelo daemon do sistema Kerberos e durante uma sessão do usuário. + +Se esta política for ativada ou não estiver definida, o usuário vai poder decidir se as senhas do Kerberos serão memorizadas para que ele não precise digitá-las novamente. Os tíquetes do Kerberos serão buscados automaticamente, a não ser que uma autenticação extra seja necessária (autenticação de dois fatores). + +Se esta política for desativada, as senhas nunca serão lembradas e todas as senhas armazenadas anteriormente serão removidas. O usuário vai precisar inserir a senha sempre que tiver que fazer autenticação no sistema Kerberos. Dependendo das configurações do servidor, isso vai acontecer no mínimo a cada oito horas, mas é possível definir até intervalos de meses.</translation> <translation id="7126928806195745404">Configurações de JavaScript</translation> <translation id="7127980134843952133">Histórico de downloads</translation> <translation id="7128513247945602297">Ativar o upgrade automático de conteúdo misto em sites HTTPS</translation> @@ -7293,6 +7359,9 @@ <translation id="7157329428182136164">Ativar suporte a APIs de gráficos 3D</translation> <translation id="7158358621906236999">Configuração padrão de sensores</translation> <translation id="7161568070244869726">Forçar a ativação do AppCache</translation> +<translation id="7165879643294314958">Ativar a política ou deixá-la sem definição faz com que uma conta local do dispositivo seja configurada para login automático sem atraso. O <ph name="PRODUCT_OS_NAME" /> aplica o atalho de teclado Ctrl+Alt+S para ignorar o login automático e mostrar a tela de login. + +Desativar a política faz com que os usuários não possam ignorar o login automático sem atraso (se configurado).</translation> <translation id="7165882688932913315">Esta política controla o acesso a recursos controláveis na interface de detecção local (<ph name="CHROME_DEVICES_LINK" />), que mostra dispositivos detectáveis próximos do usuário, assim como dispositivos na nuvem registrados neles. Em todos os sistemas operacionais, exceto no <ph name="PRODUCT_OS_NAME" />, a interface de detecção local também permite que os usuários adicionem ao <ph name="CLOUD_PRINT_NAME" /> impressoras clássicas conectadas aos computadores deles. Se a política for definida como "Ativada" ou não for definida, a detecção de dispositivos locais será permitida. @@ -7408,6 +7477,11 @@ <translation id="7269263983506766969">Usar a prioridade padrão para o processo de áudio</translation> <translation id="7270001383428188269">Identificador para este certificado do cliente.</translation> <translation id="7271085005502526897">Importar homepage do navegador padrão na primeira execução</translation> +<translation id="7272892848025145170">Controla se a funcionalidade do Kerberos está ativada. O Kerberos é um protocolo de autenticação que pode ser usado para autenticar apps da Web e compartilhamentos de arquivos. + +Se esta política for ativada, a funcionalidade do Kerberos também será. As contas do Kerberos podem ser adicionadas pela política "Configurar contas do Kerberos" ou pela página de configurações de contas dele. + +Se esta política for desativada ou não for definida, as configurações de contas do Kerberos serão desativadas. Não será possível adicionar nenhuma conta do Kerberos nem usar a autenticação dele. Todas as contas existentes do Kerberos e todas as senhas armazenadas serão excluídas.</translation> <translation id="7273785848231509306">Nunca mostrar nomes e fotos de usuários</translation> <translation id="7274077256421167535">Ativar compartilhamento de energia via USB</translation> <translation id="7275334191706090484">Favoritos gerenciados</translation> @@ -8083,6 +8157,9 @@ Se esta política não for definida, o alto contraste ficará inicialmente desativado na tela de login, mas poderá ser ativado pelo usuário a qualquer momento.</translation> <translation id="7864539943188674973">Desativar bluetooth</translation> <translation id="7869986671709030417">Modo de impressão de gráficos em segundo plano padrão</translation> +<translation id="7872692545596413465">Ativar a política e inserir uma porta não padrão (ou seja, uma porta diferente de 80 ou 443) a inclui no SPN do Kerberos gerado. + +Desativar a política ou deixá-la sem definição faz com que o SPN do Kerberos gerado não inclua uma porta.</translation> <translation id="7877924399554599110">Ativa a unificação das políticas de nuvem de usuários com políticas no nível da máquina</translation> <translation id="7881421274383404138">A definição desta política configura impressoras corporativas. O formato dela corresponde ao dicionário <ph name="PRINTERS_POLICY_NAME" />, com campos extras <ph name="ID_FIELD" /> ou <ph name="GUID_FIELD" /> obrigatórios para cada impressora para inclusão na lista de bloqueio ou de permissão. O arquivo não pode exceder 5 MB e precisa estar no formato JSON. Um arquivo contendo 21.000 impressoras é codificado como um arquivo de 5 MB. O hash criptográfico ajuda a verificar a integridade do download. O download do arquivo é feito com armazenamento em cache e é refeito quando o URL ou o hash mudam. O <ph name="PRODUCT_OS_NAME" /> faz o download do arquivo para as configurações de impressora e disponibiliza as impressoras de acordo com <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> e <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" />. @@ -8135,6 +8212,11 @@ Esta política corporativa permite que os administradores controlem se os usuários podem ou não ativar outras limitações. Quando a política está desativada, ela impede a limitação. Quando está ativada ou é deixada sem definição, o usuário pode escolher usar a limitação ou ela pode ser ativada pelas variações do Chrome.</translation> <translation id="793188693675675950">Desativar a importação da página inicial na primeira execução</translation> +<translation id="7932017046032784156">Se a política for ativada, o ícone da barra de ferramentas do Google Cast vai aparecer na barra de ferramentas ou no menu flutuante e não poderá ser removido pelo usuário. + +Se a política for desativada ou não for definida, o usuário poderá fixar ou remover o ícone com o menu contextual. + +Se a política <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> for definida como desativada, o valor desta política não terá efeito e o ícone da barra de ferramentas não vai aparecer.</translation> <translation id="7933141401888114454">Ativar a criação de usuários supervisionados</translation> <translation id="793473937901685727">Definir a disponibilidade do certificado para apps ARC</translation> <translation id="7936302526928951356">A string do user agent não vai congelar a versão principal.</translation> @@ -8915,6 +8997,9 @@ <translation id="8584279193368801689">Restringe o modo de impressão com PIN. Se a política não for definida, não haverá restrição. Se o modo não estiver disponível, a política será ignorada. O recurso de impressão com PIN está disponível somente para impressoras que usam um dos protocolos IPPS, HTTPS, USB ou IPP-over-USB.</translation> <translation id="8587229956764455752">Permite a criação de novas contas de usuários</translation> <translation id="8589285015138337712">Não permitir que o usuário personalize os atalhos do sistema</translation> +<translation id="8589346048177748110">Se a política for definida como verdadeira, os usuários poderão acessar o jogo do dinossauro. Se ela for definida como falsa, os usuários não terão acesso ao jogo quando o dispositivo estiver off-line. + +Não definir a política significa que os usuários não poderão jogar no <ph name="PRODUCT_OS_NAME" /> registrado, mas poderão fazer isso em outras circunstâncias.</translation> <translation id="8591713876665299827">Esta política está obsoleta e será removida na versão 85 do <ph name="PRODUCT_OS_NAME" />. Por isso, passe a usar <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Especifica o tempo sem entrada do usuário para que a ação de inatividade seja tomada quando o dispositivo estiver funcionando com energia CA.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 596b1a40..f084779 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -964,6 +964,11 @@ <translation id="1861206724856734193">Установка списка правил для предотвращения утечки данных</translation> <translation id="1862267110714201519">Отключить окна в режиме конфиденциальности</translation> <translation id="1865417998205858223">Позволяет разрешать или запрещать использование ключей</translation> +<translation id="1865867000796030567">Если правило включено, то система будет обновлена до версии, указанной в префиксе ключа манифеста <ph name="REQUIRED_PLATFORM_VERSION" /> киоск-приложения, которое запускается без задержки автоматически. + +Если правило отключено или не настроено, то ключ манифеста <ph name="REQUIRED_PLATFORM_VERSION" /> игнорируется, а автоматическое обновление системы выполняется в обычном режиме. + +Внимание! Не передавайте управление версией <ph name="PRODUCT_OS_NAME" /> киоск-приложению, поскольку оно может заблокировать обновление ПО и системы безопасности устройства. Передавать управление версией <ph name="PRODUCT_OS_NAME" /> не рекомендуется, поскольку при этом вы подвергаете пользователей риску.</translation> <translation id="186719019195685253">Действие в случае превышения времени бездействия при работе от сети.</translation> <translation id="1869688072690234823">Правило позволяет указать, какие способы аутентификации WebAuthn можно использовать на управляемых устройствах. @@ -1212,6 +1217,11 @@ Если правило не настроено или указан пустой список, ни один способ быстрой разблокировки не будет использоваться на устройстве. Это правило больше не поддерживается. Используйте вместо него правило <ph name="QUICK_UNLOCK_MODE_ALLOW_LIST_POLICY_NAME" />.</translation> +<translation id="2035995535603698706">Если правило включено, в сторонних изображениях на страницах может показываться окно аутентификации. + +Если правило отключено или не настроено, показывать окно аутентификации в сторонних изображениях запрещено. + +Обычно это правило отключают в целях защиты от фишинга.</translation> <translation id="2036522553891755455">Включенное правило определяет, будет ли функция обнаружения общих папок в <ph name="PRODUCT_NAME" /> использовать протокол <ph name="NETBIOS_PROTOCOL" /> для обнаружения папок в сети. Если правило отключено, этот протокол использоваться не будет. Если правило не задано, оно будет по умолчанию считаться выключенным для профилей, управляемых администратором, и включенным для остальных.</translation> @@ -1379,6 +1389,19 @@ Более подробная информация о сеансах в режиме <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> доступна в спецификации <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation> <translation id="2175353308236295184">Объект конфигурации JSON для конкретного приложения. Содержит пары "ключ – значение", например "managedConfiguration": { "key1": value1, "key2": value2 }. Ключи определены в манифесте приложения.</translation> <translation id="2176115444876446233">Запретить пользователям сбор данных отслеживания производительности на уровне системы</translation> +<translation id="2177382213857119200">Позволяет управлять настройками Безопасного просмотра в <ph name="PRODUCT_NAME" /> и выбирать режим защиты. + + Если установлен параметр NoProtection (значение "0"), Безопасный просмотр всегда отключен. + + Если указан параметр StandardProtection (значение "1", которое используется по умолчанию), Безопасный просмотр всегда включен в режиме стандартной защиты. + + Если выбран параметр EnhancedProtection (значение "2"), Безопасный просмотр всегда включен в режиме улучшенной защиты, но при этом в Google передается больше данных о работе в браузере. + + Если правило настроено как обязательное, пользователи не могут менять или переопределять настройки Безопасного просмотра в <ph name="PRODUCT_NAME" />. + + Если правило не настроено, Безопасный просмотр работает в режиме стандартной защиты, но пользователи могут изменить этот параметр. + + Подробнее о Безопасном просмотре: https://support.google.com/chrome?p=safe_browsing_preferences.</translation> <translation id="2177696016354404697">Всегда отключать экран конфиденциальности</translation> <translation id="2178899310296064282">Включить принудительное использование Умеренного безопасного режима в YouTube</translation> <translation id="2180958780733364832">Управление использованием режима консольного браузера</translation> @@ -2018,6 +2041,11 @@ Если указано значение False, добавлять заметки в PDF-файлы в средстве просмотра PDF нельзя.</translation> <translation id="2769952903507981510">Настройка имени домена для хостов удаленного доступа</translation> +<translation id="2770376586681635746">Определяет, могут ли пользователи добавлять аккаунты Kerberos. + +Если правило не настроено или включено, пользователи могут добавлять аккаунты на странице настроек Kerberos. Пользователи полностью контролируют добавленные аккаунты, могут изменять их и удалять. + +Если правило отключено, пользователи не могут добавлять аккаунты Kerberos. Делать это можно только с помощью правила "Настроить аккаунты Kerberos". Это правило – эффективный способ блокировки аккаунтов.</translation> <translation id="2772231477628401250">Использовать HTTP при скачивании обновлений</translation> <translation id="2772955711376920612">Если настроены <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" />, <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> и это правило, режим пиковой нагрузки будет всегда включен на устройствах, где он поддерживается. Режим пиковой нагрузки позволяет экономить энергию, минимизируя использование переменного тока в период высокой нагрузки на электрическую сеть. Для каждого буднего дня можно указать время, в которое режим пиковой нагрузки будет включаться и отключаться. Пока заряд батареи выше заданного порогового значения, устройство будет использовать энергию аккумулятора, даже если работает от сети переменного тока. Когда наступит указанное время отключения режима, устройство начнет использовать энергию переменного тока, если оно подключено к электрической сети, но батарея заряжаться не будет. В указанное время начала зарядки устройство вернется к штатному режиму работы (использование сети переменного тока одновременно с зарядом батареи). @@ -3733,6 +3761,9 @@ Если правило не настроено, DNS-преобразование может выполняться как в сетевом процессе, так и вне его или частично в нем и частично вне этого процесса – в зависимости от конфигурации системы и флагов функций.</translation> <translation id="4239720644496144453">Кеш для приложений Android не используется. Если несколько пользователей устанавливают одно и то же приложение Android, для каждого из них оно скачивается заново.</translation> <translation id="424318624725112807">Включить подсветку текстового курсора на экране входа</translation> +<translation id="4245159233848584683">Если правило включено или не настроено, а вход в локальный аккаунт на устройстве должен выполняться автоматически без задержки, то при отсутствии подключения к интернету <ph name="PRODUCT_OS_NAME" /> показывает запрос на настройку сети. + +Если правило отключено, показывается сообщение об ошибке.</translation> <translation id="4248277954659222481">Разрешить автоматически воспроизводить видео на страницах из белого списка шаблонов URL</translation> <translation id="4250680216510889253">Нет</translation> <translation id="4252522848899331223">Разрешить игнорировать предупреждения от сервиса "Безопасный просмотр"</translation> @@ -3883,6 +3914,11 @@ <translation id="4410236409016356088">Разрешить регулировать пропускную способность сети</translation> <translation id="4411734231900934213">Допустимая разница времени на устройствах ребенка и родителя (в секундах).</translation> <translation id="441217499641439905">Отключить Google Диск в приложении "Файлы" <ph name="PRODUCT_OS_NAME" /> при передаче данных по мобильной сети</translation> +<translation id="4412885120239670573">Если правило включено, встроенное средство просмотра PDF-файлов в <ph name="PRODUCT_NAME" /> отключается, они начинают обрабатываться как скачанный контент, а пользователю разрешается открывать их в приложении по умолчанию для данного типа файлов. + +Если правило отключено, для просмотра PDF-файлов используется плагин PDF (если он не отключен пользователем). + +Если правило настроено, пользователь не может изменить его в <ph name="PRODUCT_NAME" />. Если правило не настроено, пользователь может самостоятельно выбирать, как открывать PDF-файлы.</translation> <translation id="4413453659814156568">Позволяет задать список шаблонов URL для указания сайтов, которым разрешено запускать код JavaScript с включенным JIT-компилятором. Подробнее о допустимых шаблонах URL: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Подстановочный знак <ph name="WILDCARD_VALUE" /> для этого правила не поддерживается. @@ -3990,6 +4026,7 @@ <translation id="4482784169143060077">Включить принудительное использование протокола HTTPS в автоматическом режиме</translation> <translation id="4483120730995943109">Если для функции JavaScript setTimeout() задано время ожидания 0 мс, оно не будет увеличено до 1 мс</translation> <translation id="4483649828988077221">Отключить автоматическое обновление</translation> +<translation id="4483738129334574255">Отключить игру с динозавром на зарегистрированных устройствах <ph name="PRODUCT_OS_NAME" />, но включить при других обстоятельствах</translation> <translation id="4484515651939984695">Указывает, сколько секунд устройство для трансляции, выбранное с помощью кода доступа или QR-кода, будет отображаться в списке меню <ph name="PRODUCT_NAME" /></translation> <translation id="4485425108474077672">Настройка URL страницы быстрого доступа</translation> <translation id="4490420545181481759">В расширениях сертификатов X.509 могут быть закодированы ограничения, например на имена. В стандарте RFC 5280 указано, что необязательно принудительно применять такие ограничения к сертификатам якорей доверия. Начиная с <ph name="PRODUCT_NAME" /> версии 112, такие ограничения в сертификатах, загруженных из хранилища платформы, будут использоваться принудительно. @@ -4287,6 +4324,7 @@ Приложения и расширения не из интернет-магазина Chrome можно устанавливать принудительно только на устройствах с <ph name="MAC_OS_NAME" />, которые контролируются с помощью ПО для управления мобильными устройствами, добавлены в домен через MCX или зарегистрированы в программе "<ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />".</translation> <translation id="4742973303930120836">Ограничить режим печати фоновых цветов и изображений</translation> +<translation id="4744467872051608680">Начиная с версии M119, если это правило не настроено или для него указано значение False, технология WebSQL отключена, но ее можно включить с помощью экспериментального параметра Chrome web-sql-access. Если установлено значение True, доступ к WebSQL разрешен.</translation> <translation id="4745232963710538589">Включить расширение статистики и разрешить сообщать о показателях</translation> <translation id="4749670563834935149">Включить <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> для списка URL на экране входа и заблокированном экране. @@ -4866,6 +4904,9 @@ Подробнее о допустимых шаблонах <ph name="URL_LABEL" />: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Это правило работает только с адресами сайтов-источников, поэтому пути в шаблонах URL не учитываются.</translation> <translation id="5318185076587284965">Разрешить использование серверов ретрансляции хостами удаленного доступа</translation> +<translation id="5321624917465764266">Если правило включено или не настроено, то в Chrome можно удалить историю браузера и список скачанных файлов. Пользователи не могут изменить этот параметр. + +Если правило отключено, историю браузера и список скачанных файлов удалить нельзя. Даже если это правило отключено, история браузера и список скачанных файлов могут не сохраниться. Пользователи могут самостоятельно изменить или удалить файлы истории, браузер может устареть, а элементы истории могут быть перемещены в архив в любое время.</translation> <translation id="5323200200131319468">Включить озвучивание текста на экране входа</translation> <translation id="5323271643727095577">Не показывать диалоговое окно для отмены при вызове функции event.preventDefault() для события beforeunload. Показывать диалоговое окно для отмены, когда в значении event.returnValue для события beforeunload указана пустая строка.</translation> <translation id="5323355956693037267">Включить экранную клавиатуру на экране входа</translation> @@ -5105,6 +5146,9 @@ <translation id="5535256585099022933">Установить временной интервал для перезапуска</translation> <translation id="553806128266843748">Логический флаг, который указывает, включены ли ограничения скорости обмена данными.</translation> <translation id="5540885720415375851">Разрешить локальный поиск устройств</translation> +<translation id="5542235730745104308">Если для правила задано значение True, используются встроенные в <ph name="PRODUCT_NAME" /> дополнительные страницы с сообщениями об ошибках (такие как "Страница не найдена"). Если указано значение False, в <ph name="PRODUCT_NAME" /> такие страницы никогда не используются. + +Если правило настроено, пользователи не могут изменить его. Если правило не настроено, оно действует, но пользователи могут его изменить.</translation> <translation id="5544059132156503357">Правило позволяет указать, какой тип шифрования применять при запросе билетов Kerberos с сервера "<ph name="MS_AD_NAME" />". Укажите для правила одно из следующих значений: @@ -5867,6 +5911,9 @@ <translation id="625580680776945310">Режим высокой эффективности будет включен</translation> <translation id="6258658183356534534">Управление обновлением алгоритма GREASE в подсказках агента пользователя клиента</translation> <translation id="6261643884958898336">Сообщать данные, идентифицирующие компьютер</translation> +<translation id="6264247808139384018">Если правило включено или не настроено, пользователи, выполнившие вход с помощью пароля, могут заблокировать экран. + +При выключенном правиле этого сделать нельзя. Можно только выйти из аккаунта.</translation> <translation id="6265892395051519509">Разрешение указанным сайтам доступа к датчикам</translation> <translation id="6266043141694454734">Определяет, будут ли Chrome Root Store и встроенный инструмент верификации использоваться для проверки сертификатов сервера</translation> <translation id="6267130578410325007">Это правило по умолчанию разрешает кластеризацию агента с ключом источника. @@ -6111,6 +6158,9 @@ <translation id="6412352702230183710">Разрешить хосты обмена сообщениями с оригинальными приложениями только на уровне системы</translation> <translation id="6416506846917150119">Отключить подсказки при вводе текста с помощью физической клавиатуры</translation> <translation id="6417265370957905582">Google Ассистент</translation> +<translation id="6421254653839955267">Если правило включено, поиск записи CNAME не выполняется. При создании идентификатора SPN протокола Kerberos имя сервера используется в том виде, в котором оно было указано. + +Если правило не настроено или отключено, то при создании идентификатора SPN протокола Kerberos каноническое имя сервера определяется через поиск записи CNAME.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6424486395812679373">Проверять все скачиваемые файлы с помощью Безопасного просмотра</translation> <translation id="6433697627431665375">Запретить включать данные <ph name="PRODUCT_NAME" /> в резервные копии</translation> @@ -6248,6 +6298,11 @@ Значение указывается в миллисекундах и должно быть меньше времени задержки до перехода в режим бездействия.</translation> <translation id="6497085755801788141">Использовать встроенный инструмент верификации</translation> +<translation id="6504720469162323184">Это правило задает период бездействия в миллисекундах перед тем, как будет выполнен автоматический вход в локальный аккаунт на устройстве, указанный в правиле <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" />. + +Если правило не настроено, продолжительность бездействия считается равной нулю. + +Оно не действует, если не настроено правило <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" />.</translation> <translation id="65055701428353978">Настройка этого правила подразумевает, что для каждого затронутого расширения будет указан список URL переадресации, относящихся к протоколу OAuth, которые могут использоваться этими расширениями при работе с API <ph name="IDENTITY_API_NAME" /> (<ph name="IDENTITY_API_URL" />) в дополнение к стандартному URL переадресации (https://<extension id>.chromiumapp.org/). Если правило не настроено или указан пустой список URL, то все приложения или расширения могут использовать только стандартный URL переадресации при работе с API <ph name="IDENTITY_API_NAME" />.</translation> @@ -6347,6 +6402,7 @@ Примечание. Настройки этого правила могут быть переопределены при помощи EnabledPlugins и DisabledPluginsExceptions. Если правило не настроено, пользователям разрешается использовать любые установленные в системе плагины, за исключением несовместимых (хотя и заданных в коде), а также устаревших и вредоносных.</translation> +<translation id="6571055160227165318">Разрешить включать WebSQL с помощью экспериментального параметра Chrome</translation> <translation id="6574903167639386816">Удалять данные профиля из локального хранилища после завершения сеанса пользователя</translation> <translation id="6575403002861093126">Это правило определяет максимальное количество часов использования кешированных объектов групповой политики до их повторного скачивания. Вместо того чтобы скачивать объекты групповой политики при каждом получении правила, система может повторно использовать кешированные объекты, если их версия не меняется. @@ -6475,6 +6531,11 @@ Если правило отключено или не настроено, при запросе печати будет открываться окно предварительного просмотра.</translation> <translation id="6655274714135630366">Хеш SHA-256 в шестнадцатеричной кодировке для образа диска.</translation> +<translation id="6655844456903132379">Если правило включено, то при HTTP-аутентификации учитывается подтверждение от KDC. То есть <ph name="PRODUCT_NAME" /> передает учетные данные в сервис, если KDC добавляет сигнал <ph name="OK_AS_DELEGATE" /> в мандат сервиса. Подробные сведения вы найдете на странице https://tools.ietf.org/html/rfc5896.html. Сервис также должен быть разрешен в правиле <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />. + +Если правило отключено или не настроено, политика KDC игнорируется на поддерживаемых платформах и применяется только правило <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" />. + +В <ph name="MS_WIN_NAME" /> политика KDC учитывается всегда.</translation> <translation id="6658245400435704251">Время (в секундах), которое может пройти от появления обновления на сервере до его скачивания на устройство. Это время определяется как длительностью самого скачивания, так и частотой проверок на наличие обновлений. Задается максимальное время задержки, по истечении которого автообновление точно будет выполнено.</translation> <translation id="6659537776197644458">Не запускать аутентификацию при синхронизации паролей</translation> <translation id="6661178198729301029">Отправлять отчеты управляемого профиля в консоль администратора</translation> @@ -7010,6 +7071,11 @@ Если задано значение False, это правило отключено.</translation> <translation id="7123271473727774529">Включить специальную возможность коррекции цвета</translation> <translation id="7126716959063786004">Разрешить завершение процессов в диспетчере задач</translation> +<translation id="7126787606641224668">Определяет, включена ли функция "Запомнить пароль" в диалоговом окне аутентификации с помощью Kerberos. Пароли хранятся в зашифрованном виде на диске, и доступ к ним есть только у системного демона Kerberos во время сеанса пользователя. + +Если правило включено или не настроено, пользователи могут сами решать, нужно ли сохранять пароли Kerberos, чтобы их не приходилось вводить повторно. Билеты Kerberos выдаются автоматически. Исключение составляют случаи, когда требуется дополнительная (двухэтапная) аутентификация. + +Если правило отключено, пароли никогда не запоминаются, а уже сохраненные – удаляются. Пользователи должны вводить пароли каждый раз, когда им нужно выполнить аутентификацию в системе Kerberos. Периодичность зависит от настроек сервера и составляет обычно от восьми часов до нескольких месяцев.</translation> <translation id="7126928806195745404">Настройки JavaScript</translation> <translation id="7127980134843952133">История скачиваний</translation> <translation id="7128513247945602297">Включить автоматическое обновление смешанного контента на сайтах с HTTPS</translation> @@ -7077,6 +7143,9 @@ <translation id="7157329428182136164">Включить поддержку API для 3D-графики</translation> <translation id="7158358621906236999">Действующая по умолчанию настройка доступа к датчикам</translation> <translation id="7161568070244869726">Включить обязательное использование AppCache</translation> +<translation id="7165879643294314958">Если правило включено или не настроено, то вход в локальный аккаунт устройства выполняется автоматически без задержки. Нажав сочетание клавиш Ctrl + Alt + S в <ph name="PRODUCT_OS_NAME" />, пользователь может отменить автоматический вход и открыть экран для входа в аккаунт вручную. + +Если правило отключено, пользователь не может отменить автоматический вход в аккаунт без задержки (если он настроен).</translation> <translation id="7165882688932913315">Это правило контролирует доступ к управляемым функциям интерфейса локального поиска (<ph name="CHROME_DEVICES_LINK" />), где показываются видимые устройства, находящиеся рядом с пользователем, а также связанные с ними облачные устройства. Во всех операционных системах, кроме <ph name="PRODUCT_OS_NAME" />, интерфейс локального поиска также позволяет пользователям добавлять подключенные к их компьютерам классические принтеры в <ph name="CLOUD_PRINT_NAME" />. Если правило включено или не настроено, локальный поиск устройств разрешен. @@ -7193,6 +7262,11 @@ <translation id="7269263983506766969">Выполнять обработку аудио с приоритетом по умолчанию</translation> <translation id="7270001383428188269">Идентификатор для сертификата клиента.</translation> <translation id="7271085005502526897">Импорт сведений о домашней странице из браузера, используемого по умолчанию, при первом запуске</translation> +<translation id="7272892848025145170">Определяет, включен ли протокол Kerberos. Kerberos – это протокол, который можно использовать для аутентификации в веб-приложениях и общих папках. + +Если правило включено, протокол Kerberos активирован. Аккаунты Kerberos можно добавлять с помощью правила "Настроить аккаунты Kerberos" или на странице настроек Kerberos. + +Если правило не настроено или отключено, настройки аккаунтов Kerberos недоступны. Тогда добавлять такие аккаунты нельзя и аутентификация с помощью этого протокола не используется. Все созданные аккаунты Kerberos и сохраненные пароли удаляются.</translation> <translation id="7273785848231509306">Никогда не показывать имена и фотографии пользователей</translation> <translation id="7274077256421167535">Включить подачу энергии через USB</translation> <translation id="7275334191706090484">Управляемые закладки</translation> @@ -7857,6 +7931,9 @@ Если не настроить это правило, изначально режим высокой контрастности на экране входа будет отключен, но пользователь сможет включить его в любой момент.</translation> <translation id="7864539943188674973">Отключить Bluetooth</translation> <translation id="7869986671709030417">Режим печати фоновых цветов и изображений по умолчанию</translation> +<translation id="7872692545596413465">Если правило включено и указан нестандартный порт (любой, кроме 80 или 443), он будет включен в создаваемый идентификатор SPN протокола Kerberos. + +Если правило отключено или не настроено, то этот порт в идентификатор не добавляется.</translation> <translation id="7877924399554599110">Разрешить объединять правила облачных сервисов на уровне пользователей с правилами на уровне устройств</translation> <translation id="7881421274383404138">Устанавливает конфигурацию корпоративных принтеров. Поддерживаемый формат файла тот же, что и для словаря <ph name="PRINTERS_POLICY_NAME" />, но с дополнительными полями <ph name="ID_FIELD" /> и <ph name="GUID_FIELD" />. Заполните их для каждого принтера, чтобы внести его в список разрешенных или заблокированных. Поддерживаемый формат файла конфигурации – JSON. Его размер не должен превышать 5 МБ. В файле такого объема можно указать около 21 000 принтеров. Для проверки целостности скачанного файла используется хеш-сумма. Файл скачивается и кешируется. В случае изменения URL или хеша файл скачивается повторно. <ph name="PRODUCT_OS_NAME" /> скачивает файл конфигурации и открывает доступ к принтерам согласно правилам <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> и <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" />. @@ -7909,6 +7986,11 @@ С помощью этого правила Chrome Enterprise администраторы могут запрещать и разрешать пользователям включать дополнительное ограничение ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes. Если правило отключено, то ограничение включить нельзя. Если правило включено или не настроено, пользователи могут включить ограничение. Это также можно сделать с помощью модификаций Chrome.</translation> <translation id="793188693675675950">Запретить импорт адреса домашней страницы при первом запуске</translation> +<translation id="7932017046032784156">Если правило включено, на панели инструментов или в дополнительном меню показывается значок трансляции, и пользователи не могут его убрать. + +Если правило отключено или не настроено, пользователи могут закреплять или удалять значок командами его контекстного меню. + +Если отключено правило <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" />, то правило ShowCastIconInToolbar не действует и значок на панели инструментов не показывается.</translation> <translation id="7933141401888114454">Включает поддержку контролируемых профилей</translation> <translation id="793473937901685727">Настроить доступ к сертификатам для приложений ARC</translation> <translation id="7936302526928951356">Не фиксировать номер основной версии в строке агента пользователя</translation> @@ -8684,6 +8766,9 @@ <translation id="8584279193368801689">Ограничивает режим печати с вводом PIN-кода. Если правило не задано, ограничение не действует. Если этот режим недоступен, правило будет игнорироваться. Режим печати с вводом PIN-кода доступен только для принтеров, использующих протоколы IPPS, HTTPS, USB или IPP через USB.</translation> <translation id="8587229956764455752">Разрешить создание новых аккаунтов пользователей</translation> <translation id="8589285015138337712">Запретить пользователю настраивать системные сочетания клавиш</translation> +<translation id="8589346048177748110">Если для правила задано значение True, пользователи могут запускать игру с динозавром. Если указано значение False, при отсутствии подключения к интернету игра с динозавром недоступна. + +Если правило не настроено, игра недоступна на зарегистрированных устройствах <ph name="PRODUCT_OS_NAME" />, однако при других обстоятельствах пользователи могут играть в нее.</translation> <translation id="8591713876665299827">Правило больше не поддерживается и будет удалено из <ph name="PRODUCT_OS_NAME" /> 85. Вместо него используйте следующее: <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Определяет время бездействия при работе от сети электропитания, после которого будет выполнен переход в режим бездействия.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index df8e48e2..2d2afce8 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -962,6 +962,11 @@ <translation id="1861206724856734193">ตั้งค่ารายการกฎการป้องกันข้อมูลรั่วไหล</translation> <translation id="1862267110714201519">ปิดใช้ฟีเจอร์หน้าต่างเรียกดูแบบส่วนตัว</translation> <translation id="1865417998205858223">สิทธิ์ของคีย์</translation> +<translation id="1865867000796030567">การตั้งค่านโยบายเป็น "เปิดใช้" หมายความว่าค่าของคีย์ไฟล์ Manifest <ph name="REQUIRED_PLATFORM_VERSION" /> ของแอปคีออสก์ที่เปิดใช้งานอัตโนมัติด้วยความล่าช้าเป็น 0 จะใช้เป็นคำนำหน้าเวอร์ชันเป้าหมายการอัปเดตอัตโนมัติ + +การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าหมายความว่าระบบจะไม่สนใจคีย์ไฟล์ Manifest <ph name="REQUIRED_PLATFORM_VERSION" /> และการอัปเดตอัตโนมัติจะดำเนินการไปตามปกติ + +คำเตือน: อย่ามอบสิทธิ์ควบคุมเวอร์ชันของ <ph name="PRODUCT_OS_NAME" /> กับแอปคีออสก์ เพราะอาจขัดขวางไม่ให้อุปกรณ์ได้รับการอัปเดตซอฟต์แวร์และการแก้ไขด้านความปลอดภัยที่สำคัญ การมอบสิทธิ์ควบคุมเวอร์ชันของ <ph name="PRODUCT_OS_NAME" /> อาจทำให้ผู้ใช้ตกอยู่ในความเสี่ยง</translation> <translation id="186719019195685253">การกระทำที่จะดำเนินการเมื่อไม่มีการใช้งานจนถึงการหน่วงเวลาที่กำหนด ขณะที่ใช้พลังงานจากไฟฟ้า AC</translation> <translation id="1869688072690234823">การตั้งค่านโยบายจะควบคุมปัจจัยของ WebAuthn ที่สามารถใช้ได้ @@ -1210,6 +1215,11 @@ หากไม่ได้ตั้งค่านโยบายหรือตั้งค่าเป็นรายการที่ว่างเปล่า อุปกรณ์ที่มีการจัดการจะใช้โหมดปลดล็อกด่วนใดๆ ไม่ได้เลย นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้ <ph name="QUICK_UNLOCK_MODE_ALLOW_LIST_POLICY_NAME" /> แทน</translation> +<translation id="2035995535603698706">การตั้งค่านโยบายเป็น "เปิดใช้" จะอนุญาตให้รูปภาพของบุคคลที่สามในหน้าเว็บแสดงพรอมต์การตรวจสอบสิทธิ์ + +การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้รูปภาพของบุคคลที่สามแสดงพรอมต์การตรวจสอบสิทธิ์ไม่ได้ + +โดยทั่วไปแล้วจะ "ปิดใช้" นโยบายนี้เพื่อป้องกันฟิชชิง</translation> <translation id="2036522553891755455">การตั้งค่านโยบายเป็น "เปิดใช้" จะทำให้การสำรวจพื้นที่แชร์ (ฟีเจอร์พื้นที่แชร์ไฟล์ของเครือข่ายสำหรับ <ph name="PRODUCT_NAME" />) ใช้ <ph name="NETBIOS_PROTOCOL" /> เพื่อสำรวจพื้นที่แชร์ในเครือข่าย การตั้งค่านโยบายเป็น "ปิดใช้" จะทำให้การสำรวจพื้นที่แชร์ไม่ใช้โปรโตคอลนี้ในการสำรวจพื้นที่แชร์ การไม่ตั้งค่านโยบายจะทำให้ลักษณะการทำงานตามค่าเริ่มต้นเป็น "ปิด" สำหรับผู้ใช้ที่มีการจัดการและเป็น "เปิด" สำหรับผู้ใช้อื่นๆ</translation> @@ -1377,6 +1387,19 @@ ดูรายละเอียดเพิ่มเติมเกี่ยวกับเซสชัน <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> ได้ในข้อมูลจำเพาะ <ph name="WEBXR_AR_MODULE_API_NAME" /></translation> <translation id="2175353308236295184">ออบเจ็กต์การกำหนดค่า JSON ที่เจาะจงแอปที่มีชุดคู่คีย์-ค่า เช่น '"managedConfiguration": { "key1": value1, "key2": value2 }' คีย์จะกำหนดไว้ในไฟล์ Manifest ของแอป</translation> <translation id="2176115444876446233">ป้องกันไม่ให้ผู้ใช้รวบรวมการติดตามประสิทธิภาพทั้งระบบ</translation> +<translation id="2177382213857119200">ให้คุณควบคุมว่าจะเปิดหรือปิดใช้ฟีเจอร์ Google Safe Browsing ของ <ph name="PRODUCT_NAME" /> และกำหนดโหมดการทำงานของฟีเจอร์นี้ + + หากตั้งค่านโยบายนี้เป็น "NoProtection" (ค่า 0) Google Safe Browsing จะไม่ทำงานเลย + + หากตั้งค่านโยบายนี้เป็น "StandardProtection" (ค่า 1 ซึ่งเป็นค่าเริ่มต้น) Google Safe Browsing จะทำงานในโหมดมาตรฐานเสมอ + + หากตั้งค่านโยบายนี้เป็น "EnhancedProtection" (ค่า 2) Google Safe Browsing จะทำงานในโหมดเพิ่มประสิทธิภาพเสมอ ซึ่งรักษาความปลอดภัยได้ดีขึ้นแต่ต้องมีการแชร์ข้อมูลการท่องเว็บกับ Google มากขึ้น + + หากตั้งค่านโยบายนี้เป็นแบบบังคับ ผู้ใช้จะเปลี่ยนหรือลบล้างการตั้งค่า Google Safe Browsing ใน <ph name="PRODUCT_NAME" /> ไม่ได้ + + หากไม่ได้ตั้งค่านโยบายนี้ Google Safe Browsing จะทำงานในโหมดการปกป้องแบบมาตรฐาน แต่ผู้ใช้จะเปลี่ยนการตั้งค่านี้ได้ + + ดูข้อมูลเพิ่มเติมเกี่ยวกับ Google Safe Browsing ได้ที่ https://support.google.com/chrome?p=safe_browsing_preferences</translation> <translation id="2177696016354404697">ปิดใช้หน้าจอความเป็นส่วนตัวเสมอ</translation> <translation id="2178899310296064282">บังคับใช้โหมดที่จำกัดปานกลางใน YouTube เป็นอย่างน้อย</translation> <translation id="2180958780733364832">ควบคุมการใช้โหมดไม่มีส่วนหัว</translation> @@ -2015,6 +2038,11 @@ เมื่อตั้งค่านโยบายนี้เป็น "เท็จ" โปรแกรมอ่าน PDF จะใส่คำอธิบายประกอบใน PDF ไม่ได้</translation> <translation id="2769952903507981510">กำหนดค่าชื่อโดเมนที่จำเป็นสำหรับโฮสต์การเข้าถึงระยะไกล</translation> +<translation id="2770376586681635746">ควบคุมว่าผู้ใช้จะเพิ่มบัญชี Kerberos ได้หรือไม่ + +หากเปิดใช้นโยบายนี้หรือไม่ได้ตั้งค่า ผู้ใช้จะเพิ่มบัญชี Kerberos ได้ผ่านการตั้งค่าบัญชี Kerberos ในหน้าการตั้งค่า Kerberos ผู้ใช้จะควบคุมบัญชีที่ตนเพิ่มไว้ได้โดยสมบูรณ์และจะแก้ไขหรือนำบัญชีออกได้ด้วย + +หากปิดใช้นโยบายนี้ ผู้ใช้จะเพิ่มบัญชี Kerberos ไม่ได้ ผู้ใช้จะเพิ่มบัญชีได้ผ่านนโยบาย "กำหนดค่าบัญชี Kerberos" เท่านั้น นี่เป็นวิธีล็อกบัญชีที่มีประสิทธิภาพ</translation> <translation id="2772231477628401250">ใช้ HTTP เพื่อการดาวน์โหลดอัปเดต</translation> <translation id="2772955711376920612">การตั้งค่านโยบายเป็น "เปิดใช้" และการตั้งค่า <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> กับ <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> จะเปิดการใช้ไฟจากแบตเตอรี่ต่อไป (หากอุปกรณ์รองรับ) นโยบายการจัดการการใช้ไฟจากแบตเตอรี่เป็นนโยบายการประหยัดพลังงานที่ลดการใช้ไฟฟ้ากระแสสลับในช่วงที่มีการใช้งานสูงสุด คุณกำหนดเวลาเริ่มเปิดและปิดใช้โหมดการใช้ไฟจากแบตเตอรี่ในแต่ละวันได้ ในช่วงเวลาดังกล่าว อุปกรณ์จะทำงานโดยใช้พลังงานจากแบตเตอรี่ (แม้ว่าจะยังมีไฟฟ้ากระแสสลับอยู่) ตราบใดที่ระดับแบตเตอรี่อยู่เหนือเกณฑ์ที่ระบุ หลังเวลาสิ้นสุดที่ระบุ อุปกรณ์จะทำงานโดยใช้พลังงานจากไฟฟ้ากระแสสลับ (หากมีอยู่) แต่จะไม่ชาร์จแบตเตอรี่ แล้วจะกลับมาทำงานตามปกติอีกครั้งโดยใช้ไฟฟ้ากระแสสลับและชาร์จแบตเตอรี่ใหม่หลังจากเวลาเริ่มต้นการชาร์จที่ระบุ @@ -3733,6 +3761,9 @@ หากไม่ได้ตั้งค่านโยบายนี้ การแปลง DNS ของระบบอาจทำงานในบริการเครือข่าย นอกบริการเครือข่าย หรือทั้งในและนอกบริการเครือข่าย โดยขึ้นอยู่กับการกำหนดค่าของระบบและแฟล็กฟีเจอร์</translation> <translation id="4239720644496144453">ไม่มีการใช้แคชสำหรับแอป Android หากมีผู้ใช้หลายคนติดตั้งแอป Android เดียวกัน จะมีการดาวน์โหลดแอปใหม่สำหรับผู้ใช้แต่ละราย</translation> <translation id="424318624725112807">เปิดใช้ฟีเจอร์การไฮไลต์เคอร์เซอร์ข้อความในหน้าจอการเข้าสู่ระบบ</translation> +<translation id="4245159233848584683">การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าหมายความว่าเมื่ออุปกรณ์ออฟไลน์ หากบัญชีในอุปกรณ์มีการตั้งค่าเป็นลงชื่อเข้าใช้โดยอัตโนมัติด้วยความล่าช้าเป็น 0 <ph name="PRODUCT_OS_NAME" /> จะแสดงข้อความแจ้งการกำหนดค่าเครือข่าย + +การตั้งค่านโยบายเป็น "ปิดใช้" จะมีข้อความแสดงข้อผิดพลาดขึ้นมาแทน</translation> <translation id="4248277954659222481">อนุญาตการเล่นสื่ออัตโนมัติในรายการรูปแบบ URL ที่อนุญาต</translation> <translation id="4250680216510889253">ไม่มี</translation> <translation id="4252522848899331223">อนุญาตให้ผู้ใช้ข้ามคำเตือนของ Google Safe Browsing</translation> @@ -3881,6 +3912,11 @@ <translation id="4410236409016356088">เปิดใช้การควบคุมปริมาณแบนด์วิดท์ของเครือข่าย</translation> <translation id="4411734231900934213">ความต่างที่อนุญาตระหว่างนาฬิกาในอุปกรณ์ของบุตรหลานกับของผู้ปกครอง (เป็นวินาที)</translation> <translation id="441217499641439905">ปิดใช้ Google ไดรฟ์ผ่านการเชื่อมต่อเครือข่ายมือถือในแอป "Files" ของ <ph name="PRODUCT_OS_NAME" /></translation> +<translation id="4412885120239670573">การตั้งค่านโยบายเป็น "เปิดใช้" จะปิดโปรแกรมอ่าน PDF ภายในของ <ph name="PRODUCT_NAME" /> รวมถึงถือว่าไฟล์ PDF เป็นไฟล์ที่ดาวน์โหลดมา และอนุญาตให้ผู้ใช้เปิด PDF ด้วยแอปพลิเคชันเริ่มต้น + +การตั้งค่านโยบายเป็น "ปิดใช้" หมายความว่าหากผู้ใช้ไม่ได้ปิดปลั๊กอิน PDF ก็จะมีการเปิดไฟล์ PDF + +หากคุณตั้งค่านโยบายไว้ ผู้ใช้จะเปลี่ยนการตั้งค่าดังกล่าวใน <ph name="PRODUCT_NAME" /> ไม่ได้ หากไม่ได้ตั้งค่า ผู้ใช้เลือกได้ว่าจะเปิด PDF ภายนอกหรือไม่</translation> <translation id="4413453659814156568">ให้คุณกำหนดรายการรูปแบบ URL ของเว็บไซต์ซึ่งระบุเว็บไซต์ที่ได้รับอนุญาตให้เรียกใช้ JavaScript ที่เปิดใช้คอมไพเลอร์ JIT (Just In Time) ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ URL ที่ถูกต้องของเว็บไซต์ได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns <ph name="WILDCARD_VALUE" /> ไม่ใช่ค่าที่ยอมรับสำหรับนโยบายนี้ @@ -3988,6 +4024,7 @@ <translation id="4482784169143060077">เปิดใช้การอัปเกรด HTTPS อัตโนมัติ</translation> <translation id="4483120730995943109">JavaScript setTimeout() ที่มีระยะหมดเวลาเป็น 0 มิลลิวินาทีจะไม่ถูกปรับเป็น 1 มิลลิวินาที</translation> <translation id="4483649828988077221">ปิดใช้การอัปเดตอัตโนมัติ</translation> +<translation id="4483738129334574255">ปิดใช้เกมไดโนเสาร์ที่เป็น Easter Egg ในอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> ที่ลงทะเบียนไว้ และเปิดใช้ในสถานการณ์อื่น</translation> <translation id="4484515651939984695">ระบุระยะเวลา (เป็นวินาที) ซึ่งอุปกรณ์แคสต์ที่เลือกไว้ด้วยรหัสการเข้าถึงหรือคิวอาร์โค้ดจะคงอยู่ในรายชื่ออุปกรณ์แคสต์ในเมนูของ <ph name="PRODUCT_NAME" /></translation> <translation id="4485425108474077672">กำหนดค่า URL หน้าแท็บใหม่</translation> <translation id="4490420545181481759">ใบรับรอง X.509 อาจเข้ารหัสข้อจํากัด เช่น ข้อจํากัดชื่อ (Name Constraints) ในส่วนขยายในใบรับรอง RFC 5280 ระบุว่าการบังคับใช้ข้อจํากัดดังกล่าวกับใบรับรองของ Trust Anchor นั้นจะทำหรือไม่ทำก็ได้ ตั้งแต่ <ph name="PRODUCT_NAME" /> 112 เป็นต้นไป ระบบจะบังคับใช้ข้อจํากัดดังกล่าวในใบรับรองที่โหลดจากที่เก็บใบรับรองของแพลตฟอร์ม @@ -4295,6 +4332,7 @@ ในอินสแตนซ์ <ph name="MAC_OS_NAME" /> จะบังคับติดตั้งแอปและส่วนขยายที่ไม่ได้มาจาก Chrome เว็บสโตร์ได้เฉพาะในกรณีที่อินสแตนซ์นั้นจัดการผ่าน MDM, เข้าร่วมโดเมนผ่าน MCX หรือลงทะเบียนใน <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" /></translation> <translation id="4742973303930120836">จำกัดโหมดการพิมพ์กราฟิกพื้นหลัง</translation> +<translation id="4744467872051608680">ตั้งแต่เวอร์ชัน M119 เป็นต้นไป หากตั้งค่านโยบายนี้เป็น "เท็จ" หรือไม่ได้ตั้งค่าไว้ ระบบจะปิดใช้ WebSQL แต่สามารถเปิดใช้ผ่าน Chrome Flag "web-sql-access" ได้ หากตั้งค่านโยบายเป็น "จริง" ระบบจะเปิดใช้การเข้าถึง WebSQL</translation> <translation id="4745232963710538589">เปิดใช้ส่วนขยายข้อมูลเชิงลึกสำหรับการรายงานเมตริกการใช้งาน</translation> <translation id="4749670563834935149">เปิดใช้ <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> สำหรับรายการ URL ในหน้าจอการเข้าสู่ระบบและหน้าจอล็อก @@ -4871,6 +4909,9 @@ ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns นโยบายนี้จะจับคู่โดยอิงตามต้นทางเท่านั้น ระบบจึงไม่สนใจเส้นทางใดก็ตามในรูปแบบ URL</translation> <translation id="5318185076587284965">เปิดใช้รีเลย์เซิร์ฟเวอร์โดยโฮสต์การเข้าถึงระยะไกล</translation> +<translation id="5321624917465764266">การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าหมายความว่าจะลบประวัติการท่องเว็บและประวัติการดาวน์โหลดใน Chrome ได้ และผู้ใช้จะเปลี่ยนการตั้งค่านี้ไม่ได้ + +การตั้งค่านโยบายเป็น "ปิดใช้" หมายความว่าจะลบประวัติการท่องเว็บและประวัติการดาวน์โหลดไม่ได้ ทั้งนี้ การปิดใช้นโยบายนี้ไม่ได้เป็นการรับประกันว่าระบบจะเก็บรักษาประวัติการท่องเว็บและประวัติการดาวน์โหลดไว้ ผู้ใช้อาจแก้ไขหรือลบไฟล์ฐานข้อมูลประวัติได้โดยตรง และเบราว์เซอร์อาจหมดอายุหรือเก็บถาวรรายการประวัติทั้งหมดหรือบางส่วนเมื่อใดก็ได้</translation> <translation id="5323200200131319468">เปิดใช้ฟีเจอร์อธิบายและอ่านออกเสียงในหน้าจอการเข้าสู่ระบบ</translation> <translation id="5323271643727095577">ไม่ต้องแสดงกล่องโต้ตอบการยกเลิกเมื่อมีการเรียกใช้ event.preventDefault() สำหรับเหตุการณ์ beforeunload แสดงกล่องโต้ตอบการยกเลิกเมื่อ beforeunload event.returnValue เป็นสตริงว่างเปล่าสำหรับเหตุการณ์ beforeunload</translation> <translation id="5323355956693037267">เปิดใช้แป้นพิมพ์บนหน้าจอในหน้าจอการเข้าสู่ระบบ</translation> @@ -5109,6 +5150,9 @@ <translation id="5535256585099022933">กำหนดระยะเวลาสำหรับการเปิดอีกครั้ง</translation> <translation id="553806128266843748">ธงบูลีนที่ระบุว่ามีการเปิดใช้การควบคุมหรือไม่</translation> <translation id="5540885720415375851">อนุญาตให้มีการค้นหาอุปกรณ์ในเครือข่ายเดียวกัน</translation> +<translation id="5542235730745104308">การตั้งค่านโยบายเป็น "จริง" หมายความว่า <ph name="PRODUCT_NAME" /> จะใช้หน้าแสดงข้อผิดพลาดทางเลือกซึ่งมีอยู่ในเบราว์เซอร์ (เช่น "ไม่พบหน้าเว็บ") การตั้งค่านโยบายเป็น "เท็จ" หมายความว่า <ph name="PRODUCT_NAME" /> จะไม่ใช้หน้าแสดงข้อผิดพลาดทางเลือกเลย + +หากคุณตั้งค่านโยบายไว้ ผู้ใช้จะเปลี่ยนไม่ได้ หากไม่ได้ตั้งค่า นโยบายจะเปิดอยู่ แต่ผู้ใช้เปลี่ยนการตั้งค่านี้ได้</translation> <translation id="5544059132156503357">การตั้งค่านโยบายจะกำหนดประเภทการเข้ารหัสที่ได้รับอนุญาตเมื่อขอตั๋ว Kerberos จากเซิร์ฟเวอร์ <ph name="MS_AD_NAME" /> การตั้งค่านโยบายเป็น @@ -5860,6 +5904,9 @@ <translation id="625580680776945310">ระบบจะเปิดใช้โหมดประสิทธิภาพสูง</translation> <translation id="6258658183356534534">ควบคุมฟีเจอร์ User-Agent Client Hints GREASE Update</translation> <translation id="6261643884958898336">รายงานข้อมูลการระบุเครื่อง</translation> +<translation id="6264247808139384018">การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ตั้งค่าจะทำให้ผู้ใช้ที่ตรวจสอบสิทธิ์ด้วยรหัสผ่านล็อกหน้าจอได้ + +การตั้งค่านโยบายเป็น "ปิดใช้" จะทำให้ผู้ใช้ล็อกหน้าจอไม่ได้ (จะออกจากระบบเซสชันผู้ใช้ได้เท่านั้น)</translation> <translation id="6265892395051519509">อนุญาตให้เข้าถึงเซ็นเซอร์ในเว็บไซต์เหล่านี้</translation> <translation id="6266043141694454734">กำหนดว่าจะใช้ Chrome Root Store และตัวตรวจสอบใบรับรองในตัวเพื่อยืนยันใบรับรองเซิร์ฟเวอร์หรือไม่</translation> <translation id="6267130578410325007">นโยบายนี้อนุญาตการสร้างคลัสเตอร์ Agent ที่ผูกกับต้นทางโดยค่าเริ่มต้น @@ -6091,6 +6138,9 @@ <translation id="6412352702230183710">อนุญาตเฉพาะโฮสต์การรับส่งข้อความดั้งเดิมระดับระบบ</translation> <translation id="6416506846917150119">ปิดใช้ฟีเจอร์การเขียนแบบช่วยคาดเดาบนแป้นพิมพ์จริงเมื่อผู้ใช้พิมพ์</translation> <translation id="6417265370957905582">Google Assistant</translation> +<translation id="6421254653839955267">การตั้งค่านโยบายเป็น "เปิดใช้" จะข้ามการค้นหา CNAME ระบบจะใช้ชื่อเซิร์ฟเวอร์ตามที่ป้อนเมื่อสร้าง Kerberos SPN + +การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าหมายความว่าการค้นหา CNAME จะกำหนดชื่อ Canonical ของเซิร์ฟเวอร์เมื่อสร้าง Kerberos SPN</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6424486395812679373">เริ่มการตรวจสอบของ Google Safe Browsing ในไฟล์ที่ดาวน์โหลดทั้งหมด</translation> <translation id="6433697627431665375">ป้องกันไม่ให้รวมข้อมูลจาก <ph name="PRODUCT_NAME" /> ไว้ในการสำรองข้อมูล</translation> @@ -6226,6 +6276,11 @@ ควรระบุค่าของนโยบายเป็นมิลลิวินาที ค่าจะถูกบีบให้น้อยกว่าระยะหน่วงเวลาของการไม่มีความเคลื่อนไหว</translation> <translation id="6497085755801788141">ใช้ตัวตรวจสอบใบรับรองในตัว</translation> +<translation id="6504720469162323184">การตั้งค่านโยบายจะระบุระยะเวลาเป็นมิลลิวินาทีที่ไม่มีกิจกรรมของผู้ใช้ก่อนการลงชื่อเข้าใช้บัญชีในอุปกรณ์ที่ระบุโดยนโยบาย <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> โดยอัตโนมัติ + +การไม่ได้ตั้งค่านโยบายหมายความว่าระยะหมดเวลาคือ 0 มิลลิวินาที + +หากไม่ได้ตั้งค่านโยบาย <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> ไว้ นโยบายนี้จะไม่มีผล</translation> <translation id="65055701428353978">การตั้งค่านโยบายนี้จะระบุรายการ URL เปลี่ยนเส้นทาง OAuth ซึ่งส่วนขยายที่มี <ph name="IDENTITY_API_NAME" /> API (<ph name="IDENTITY_API_URL" />) สามารถใช้งานได้นอกเหนือจาก URL เปลี่ยนเส้นทาง https://<extension id>.chromiumapp.org/ มาตรฐาน สําหรับส่วนขยายแต่ละรายการที่ได้รับผลกระทบ การไม่ตั้งค่านโยบายหรือไม่ระบุรายการ URL จะทําให้แอปหรือส่วนขยายทั้งหมดใช้ได้เฉพาะ URL เปลี่ยนเส้นทางมาตรฐานเมื่อใช้ <ph name="IDENTITY_API_NAME" /> API</translation> @@ -6325,6 +6380,7 @@ โปรดทราบว่า EnabledPlugins และ DisabledPluginsExceptions ลบล้างนโยบายนี้ได้ หากไม่ได้ตั้งค่านโยบายนี้ ผู้ใช้จะใช้ปลั๊กอินใดก็ตามที่ติดตั้งไว้ในระบบได้ ยกเว้นปลั๊กอินที่มีฮาร์ดโค้ดที่เข้ากันไม่ได้ ล้าสมัย หรือเป็นอันตราย</translation> +<translation id="6571055160227165318">อนุญาตให้ Chrome Flag เปิดใช้ WebSQL ได้</translation> <translation id="6574903167639386816">ล้างข้อมูลโปรไฟล์ในดิสก์เมื่อเซสชันของผู้ใช้สิ้นสุดลง</translation> <translation id="6575403002861093126">การตั้งค่านโยบายจะระบุอายุการใช้งาน (เป็นจำนวนชั่วโมง) ของแคช Group Policy Object (GPO) ซึ่งเป็นระยะเวลาสูงสุดที่สามารถใช้ GPO ซ้ำได้ก่อนที่จะดาวน์โหลดอีกครั้ง ระบบจะใช้ GPO ที่แคชไว้ ตราบใดที่ยังเป็นเวอร์ชันเดิม แทนการดาวน์โหลด GPO ซ้ำในการดึงข้อมูลนโยบายแต่ละครั้ง @@ -6453,6 +6509,11 @@ หากตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ตั้งค่า คำสั่งพิมพ์จะทำให้หน้าจอการแสดงตัวอย่างก่อนพิมพ์เปิดขึ้นมา</translation> <translation id="6655274714135630366">แฮช SHA-256 ที่เข้ารหัสเลขฐานสิบหกของอิมเมจดิสก์</translation> +<translation id="6655844456903132379">การตั้งค่านโยบายเป็น "เปิดใช้" หมายความว่าการตรวจสอบสิทธิ์ HTTP จะยึดตามการอนุมัติโดยนโยบาย KDC กล่าวคือ <ph name="PRODUCT_NAME" /> จะมอบสิทธิ์ใช้ข้อมูลเข้าสู่ระบบของผู้ใช้ให้แก่บริการที่กำลังเข้าถึงในกรณีที่ KDC ตั้งค่า <ph name="OK_AS_DELEGATE" /> ในตั๋วบริการ ดู RFC 5896 (https://tools.ietf.org/html/rfc5896.html) บริการควรได้รับอนุญาตจาก <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> ด้วย + +การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าหมายความว่าระบบจะไม่สนใจนโยบาย KDC ในแพลตฟอร์มที่รองรับ และจะดำเนินการตาม <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> เท่านั้น + +ใน <ph name="MS_WIN_NAME" /> ระบบจะดำเนินการตามนโยบาย KDC เสมอ</translation> <translation id="6658245400435704251">ระบุจำนวนวินาทีสูงสุดที่อุปกรณ์อาจสุ่มหน่วงเวลาการดาวโหลดการอัปเดตนับตั้งแต่ที่มีการส่งการอัปเดตไปยังเซิร์ฟเวอร์ อุปกรณ์อาจใช้เวลาส่วนหนึ่งรอขณะที่คอมพิวเตอร์เริ่มทำงานจนกระทั่งเสร็จสิ้นและใช้เวลาส่วนที่เหลือสำหรับการตรวจสอบการอัปเดตจำนวนหนึ่ง ไม่ว่าในกรณีใด การกระจายจะเข้าใกล้ขอบเขตบนของระยะเวลาคงที่ อุปกรณ์จึงไม่ต้องค้างรอการดาวน์โหลดการอัปเดตอย่างไม่สิ้นสุด</translation> <translation id="6659537776197644458">อย่าเรียกใช้โฟลว์การตรวจสอบสิทธิ์สำหรับการซิงค์รหัสผ่าน</translation> <translation id="6661178198729301029">เปิดใช้การรายงานในระบบคลาวด์ของโปรไฟล์ที่มีการจัดการ</translation> @@ -6990,6 +7051,11 @@ การตั้งค่านโยบายเป็น "เท็จ" จะปิดใช้ฟังก์ชันการทำงานนี้</translation> <translation id="7123271473727774529">เปิดใช้ฟีเจอร์การช่วยเหลือพิเศษสำหรับการแก้สี</translation> <translation id="7126716959063786004">เปิดใช้การหยุดกระบวนการในตัวจัดการงาน</translation> +<translation id="7126787606641224668">ควบคุมว่าจะเปิดใช้ฟีเจอร์ "จำรหัสผ่าน" ในกล่องโต้ตอบการตรวจสอบสิทธิ์ Kerberos หรือไม่ จะมีการเข้ารหัสและจัดเก็บรหัสผ่านในดิสก์ ซึ่งจะเข้าถึงได้โดย Daemon ของระบบ Kerberos และระหว่างเซสชันของผู้ใช้เท่านั้น + +หากเปิดใช้นโยบายนี้หรือไม่ได้ตั้งค่า ผู้ใช้จะเลือกได้ว่าจะให้ระบบจำรหัสผ่าน Kerberos หรือไม่ เพื่อที่จะไม่ต้องป้อนรหัสผ่านอีกครั้ง ระบบจะดึงข้อมูลตั๋ว Kerberos โดยอัตโนมัติ เว้นแต่จะต้องตรวจสอบสิทธิ์เพิ่มเติม (การตรวจสอบสิทธิ์แบบ 2 ปัจจัย) + +หากปิดใช้นโยบายนี้ ระบบจะไม่จำรหัสผ่านและจะนำรหัสผ่านที่จัดเก็บไว้ก่อนหน้านี้ออกทั้งหมด ผู้ใช้จะต้องป้อนรหัสผ่านทุกครั้งที่จำเป็นต้องตรวจสอบสิทธิ์กับระบบ Kerberos การตรวจสอบสิทธิ์มักจะเกิดขึ้นตั้งแต่ทุกๆ 8 ชั่วโมงไปจนถึงหลายเดือน ขึ้นอยู่กับการตั้งค่าของเซิร์ฟเวอร์</translation> <translation id="7126928806195745404">การตั้งค่า JavaScript</translation> <translation id="7127980134843952133">ประวัติการดาวน์โหลด</translation> <translation id="7128513247945602297">เปิดใช้การอัปเกรดเนื้อหาผสมโดยอัตโนมัติในเว็บไซต์ HTTPS</translation> @@ -7056,6 +7122,9 @@ <translation id="7157329428182136164">เปิดใช้การรองรับ API ของกราฟิก 3 มิติ</translation> <translation id="7158358621906236999">การตั้งค่าเซ็นเซอร์เริ่มต้น</translation> <translation id="7161568070244869726">บังคับเปิดใช้ AppCache</translation> +<translation id="7165879643294314958">การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าหมายความว่าระบบจะตั้งค่าบัญชีในอุปกรณ์ให้ลงชื่อเข้าใช้โดยอัตโนมัติด้วยความล่าช้าเป็น 0 <ph name="PRODUCT_OS_NAME" /> จะดำเนินการตามแป้นพิมพ์ลัด Ctrl+Alt+S เพื่อข้ามการลงชื่อเข้าใช้โดยอัตโนมัติ และจะแสดงหน้าจอลงชื่อเข้าใช้ + +การตั้งค่านโยบายเป็น "ปิดใช้" หมายความว่าผู้ใช้จะข้ามการลงชื่อเข้าใช้โดยอัตโนมัติด้วยความล่าช้าเป็น 0 ไม่ได้ (หากกำหนดค่าไว้)</translation> <translation id="7165882688932913315">นโยบายนี้ควบคุมการเข้าถึงฟีเจอร์ที่ควบคุมได้ใน UI การค้นหาภายใน (<ph name="CHROME_DEVICES_LINK" />) ซึ่งแสดงอุปกรณ์ที่ค้นพบได้ใกล้ตัวผู้ใช้ ตลอดจนอุปกรณ์ระบบคลาวด์ที่ลงทะเบียนไว้กับอุปกรณ์ดังกล่าวด้วย ในทุกระบบปฏิบัติการยกเว้น <ph name="PRODUCT_OS_NAME" /> UI การค้นหาภายในยังอนุญาตให้ผู้ใช้เพิ่มเครื่องพิมพ์แบบคลาสสิกที่เชื่อมต่ออยู่กับคอมพิวเตอร์ไปยัง <ph name="CLOUD_PRINT_NAME" /> ด้วย การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าจะอนุญาตให้มีการค้นหาอุปกรณ์ในเครือข่ายเดียวกัน @@ -7172,6 +7241,11 @@ <translation id="7269263983506766969">ใช้ลำดับความสำคัญเริ่มต้นกับกระบวนการของเสียง</translation> <translation id="7270001383428188269">ตัวระบุสำหรับใบรับรองไคลเอ็นต์นี้</translation> <translation id="7271085005502526897">การนำเข้าหน้าแรกจากเบราว์เซอร์เริ่มต้นในการเรียกใช้งานครั้งแรก</translation> +<translation id="7272892848025145170">ควบคุมว่าจะเปิดใช้ฟังก์ชันการทำงานของ Kerberos หรือไม่ Kerberos เป็นโปรโตคอลการตรวจสอบสิทธิ์ที่ใช้เพื่อตรวจสอบสิทธิ์เว็บแอปและพื้นที่แชร์ไฟล์ได้ + +หากเปิดใช้นโยบายนี้ ระบบจะเปิดใช้ฟังก์ชันการทำงานของ Kerberos คุณเพิ่มบัญชี Kerberos ได้ผ่านนโยบาย "กำหนดค่าบัญชี Kerberos" หรือผ่านการตั้งค่าบัญชี Kerberos ในหน้าการตั้งค่า Kerberos + +หากปิดใช้นโยบายนี้หรือไม่ได้ตั้งค่า ระบบจะปิดใช้การตั้งค่าบัญชี Kerberos คุณจะเพิ่มบัญชี Kerberos ไม่ได้และจะใช้การตรวจสอบสิทธิ์ของ Kerberos ไม่ได้ บัญชี Kerberos ที่มีอยู่ทั้งหมดจะถูกลบ รวมถึงรหัสผ่านที่จัดเก็บไว้ทั้งหมดด้วย</translation> <translation id="7273785848231509306">ไม่ต้องแสดงชื่อและรูปภาพผู้ใช้</translation> <translation id="7274077256421167535">เปิดใช้การแชร์พลังงานผ่าน USB</translation> <translation id="7275334191706090484">บุ๊กมาร์กที่มีการจัดการ</translation> @@ -7831,6 +7905,9 @@ หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะปิดใช้โหมดคอนทราสต์สูงในหน้าจอการเข้าสู่ระบบในขั้นต้น แต่ผู้ใช้จะเปิดใช้ได้ทุกเมื่อ</translation> <translation id="7864539943188674973">ปิดใช้งานบลูทูธ</translation> <translation id="7869986671709030417">กำหนดค่าเริ่มต้นของโหมดการพิมพ์กราฟิกพื้นหลัง</translation> +<translation id="7872692545596413465">การตั้งค่านโยบายเป็น "เปิดใช้" และการป้อนพอร์ตที่ไม่ใช่มาตรฐาน (กล่าวคือ พอร์ตอื่นใดที่ไม่ใช่ 80 หรือ 443) จะรวมพอร์ตนั้นใน Kerberos SPN ที่สร้างขึ้นมา + +การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าหมายความว่าจะไม่มีการรวมพอร์ตใน Kerberos SPN ที่สร้างขึ้นมา</translation> <translation id="7877924399554599110">เปิดใช้การรวมนโยบายในระดับผู้ใช้บนระบบคลาวด์เข้ากับนโยบายระดับแมชชีน</translation> <translation id="7881421274383404138">การตั้งค่านโยบายนี้เป็นการกำหนดค่าเครื่องพิมพ์องค์กร รูปแบบการตั้งค่าเหมือนกับพจนานุกรม <ph name="PRINTERS_POLICY_NAME" /> แต่มีช่อง <ph name="ID_FIELD" /> หรือ <ph name="GUID_FIELD" /> ที่จำเป็นต้องกรอกเพิ่มเข้ามาสำหรับเครื่องพิมพ์แต่ละเครื่องเพื่อใช้ระบุว่าอยู่ในรายการที่อนุญาตหรือไม่อนุญาต ไฟล์ต้องมีขนาดไม่เกิน 5 MB และอยู่ในรูปแบบ JSON ไฟล์ที่ระบุเครื่องพิมพ์ประมาณ 21,000 เครื่องเข้ารหัสเป็นไฟล์ขนาด 5 MB ได้ 1 ไฟล์ แฮชแบบเข้ารหัสช่วยยืนยันความสมบูรณ์ของการดาวน์โหลด ไฟล์จะมีการดาวน์โหลด แคช และดาวน์โหลดอีกครั้งเมื่อ URL หรือแฮชมีการเปลี่ยนแปลง <ph name="PRODUCT_OS_NAME" /> จะดาวน์โหลดไฟล์ดังกล่าวเพื่อการกำหนดค่าเครื่องพิมพ์และทำให้เครื่องพิมพ์พร้อมใช้งานพร้อมด้วย <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> และ <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" /> @@ -7883,6 +7960,11 @@ นโยบายระดับองค์กรนี้มีไว้เพื่อให้ผู้ดูแลระบบควบคุมว่าจะให้ผู้ใช้เปิดการควบคุมเพิ่มเติมได้หรือไม่ เมื่อตั้งค่านโยบายนี้เป็น "ปิดใช้" จะป้องกันไม่ให้สามารถเปิดใช้การควบคุม เมื่อตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่า ผู้ใช้จะเลือกใช้การควบคุมได้ หรืออาจมีการเปิดใช้การควบคุมผ่าน Chrome เวอร์ชันต่างๆ</translation> <translation id="793188693675675950">ปิดใช้การนำเข้าหน้าแรกเมื่อเรียกใช้ครั้งแรก</translation> +<translation id="7932017046032784156">การตั้งค่านโยบายเป็น "เปิดใช้" จะแสดงไอคอน "แคสต์" ในแถบเครื่องมือหรือในเมนูรายการเพิ่มเติม และผู้ใช้จะนำออกไม่ได้ + +การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้ผู้ใช้ปักหมุดหรือนำไอคอนออกได้ผ่านทางเมนูตามบริบทของไอคอนนั้นๆ + +หากตั้งค่านโยบาย <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> เป็น "ปิดใช้" ค่าของนโยบายนี้ก็จะไม่มีผล และไอคอนแถบเครื่องมือจะไม่แสดงขึ้นมา</translation> <translation id="7933141401888114454">เปิดใช้งานการสร้างผู้ใช้ภายใต้การควบคุมดูแล</translation> <translation id="793473937901685727">ตั้งค่าความพร้อมใช้งานของใบรับรองสำหรับแอป ARC</translation> <translation id="7936302526928951356">สตริง User-Agent จะไม่หยุดเวอร์ชันหลัก</translation> @@ -8638,6 +8720,9 @@ <translation id="8584279193368801689">จำกัดโหมดการพิมพ์ด้วย PIN ระบบจะถือว่าไม่มีข้อจำกัดหากไม่ได้ตั้งค่านโยบาย หากโหมดนี้ไม่พร้อมใช้งาน ระบบจะไม่สนใจนโยบายนี้ โปรดทราบว่าฟีเจอร์การพิมพ์ด้วย PIN จะใช้ได้กับเครื่องพิมพ์ที่ใช้โปรโตคอล IPPS, HTTPS, USB หรือ IPP-over-USB เท่านั้น</translation> <translation id="8587229956764455752">อนุญาตให้สร้างบัญชีผู้ใช้ใหม่</translation> <translation id="8589285015138337712">ไม่อนุญาตให้ผู้ใช้ปรับแต่งแป้นพิมพ์ลัดของระบบ</translation> +<translation id="8589346048177748110">การตั้งค่านโยบายเป็น "จริง" อนุญาตให้ผู้ใช้เล่นเกมไดโนเสาร์ การตั้งค่านโยบายเป็น "เท็จ" หมายความว่าผู้ใช้จะเล่นเกมไดโนเสาร์ที่เป็น Easter Egg ขณะที่อุปกรณ์ออฟไลน์อยู่ไม่ได้ + +การไม่ตั้งค่านโยบายนี้หมายความว่าผู้ใช้จะเล่นเกมดังกล่าวใน <ph name="PRODUCT_OS_NAME" /> ที่ลงทะเบียนไว้ไม่ได้ แต่จะเล่นในที่อื่นๆ ได้</translation> <translation id="8591713876665299827">โปรดทราบว่าจะมีการเลิกใช้งานและนำนโยบายนี้ออกใน <ph name="PRODUCT_OS_NAME" /> เวอร์ชัน 85 โปรดใช้ <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> แทน ระบุระยะเวลาก่อนตอบสนองการไม่มีความเคลื่อนไหวหลังจากไม่มีการป้อนข้อมูลจากผู้ใช้ ขณะทำงานโดยเสียบปลั๊ก
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 72e28eb..596fcd9 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -966,6 +966,11 @@ <translation id="1861206724856734193">Veri sızıntısı önleme kuralları listesini ayarlar.</translation> <translation id="1862267110714201519">Hayalet pencere özelliğini devre dışı bırak.</translation> <translation id="1865417998205858223">Temel İzinler</translation> +<translation id="1865867000796030567">Politika, Etkin değerine ayarlanırsa sıfır gecikmeyle otomatik başlatılan kiosk uygulamasının <ph name="REQUIRED_PLATFORM_VERSION" /> manifest anahtarının değeri, otomatik güncelleme hedef sürümü öneki olarak kullanılır. + +Politika, Devre Dışı değerine ayarlanır veya ayarlanmadan bırakılırsa <ph name="REQUIRED_PLATFORM_VERSION" /> manifest anahtarı yok sayılır ve otomatik güncelleme normal şekilde devam eder. + +Uyarı: Cihazın yazılım güncellemelerini ve kritik güvenlik düzeltmelerini almasını engelleyebileceği için <ph name="PRODUCT_OS_NAME" /> sürümünün kontrol yetkisini bir kiosk uygulamasına vermeyin. <ph name="PRODUCT_OS_NAME" /> sürümünün kontrol yetkisini vermek kullanıcılar için risk oluşturabilir.</translation> <translation id="186719019195685253">Cihaz AC güçle çalışırken boşta kalma süresine ulaşıldığında yapılacak işlem</translation> <translation id="1869688072690234823">Bu politika hangi WebAuthn faktörlerinin kullanılabileceğini kontrol eder. @@ -1214,6 +1219,11 @@ Politika ayarlanmaz veya boş listeye ayarlanırsa yönetilen cihazlarda hızlı kilit açma modları kullanılamaz. Bu politika kullanımdan kaldırıldı, lütfen bunun yerine <ph name="QUICK_UNLOCK_MODE_ALLOW_LIST_POLICY_NAME" /> politikasını kullanın</translation> +<translation id="2035995535603698706">Politikanın Etkin değerine ayarlanması, sayfadaki üçüncü taraf görsellerinin bir kimlik doğrulama istemi göstermesini sağlar. + +Politika, Devre Dışı değerine ayarlanır veya ayarlanmadan bırakılırsa üçüncü taraf görsellerinin, kimlik doğrulama istemi göstermesi engellenir. + +Genellikle bu politika kimlik avına karşı bir savunma olarak Devre Dışıdır.</translation> <translation id="2036522553891755455">Politika, Etkin değerine ayarlanırsa paylaşım keşfi (<ph name="PRODUCT_NAME" /> için Ağ Üzerinde Dosya Paylaşımı özelliği), ağdaki paylaşımları keşfetmek için <ph name="NETBIOS_PROTOCOL" /> politikasını kullanır. Politika, Devre Dışı değerine ayarlanırsa paylaşım keşfi, paylaşımları keşfetmek için bu protokolü kullanmaz. Politika ayarlanmadan bırakılırsa paylaşım keşfi, varsayılan olarak yönetilen kullanıcılar için devre dışı bırakılır, diğer kullanıcılar için etkinleştirilir.</translation> @@ -1381,6 +1391,19 @@ <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> oturumlarıyla ilgili daha fazla bilgi için lütfen <ph name="WEBXR_AR_MODULE_API_NAME" /> API'sinin teknik özelliklerine bakın.</translation> <translation id="2175353308236295184">Bir anahtar/değer çifti grubuna sahip uygulamaya özel JSON yapılandırma nesnesi, ör. '"managedConfiguration": { "key1": value1, "key2": value2 }'. Anahtarlar, uygulama manifest dosyasında tanımlanır.</translation> <translation id="2176115444876446233">Kullanıcıların sistem genelinde performans izleme verilerini toplamasını engeller.</translation> +<translation id="2177382213857119200"><ph name="PRODUCT_NAME" /> Güvenli Tarama özelliğinin etkin olup olmadığını ve hangi modda çalıştığını kontrol etmenize olanak tanır. + + Bu politika "NoProtection" (0 değeri) olarak ayarlanırsa Güvenli Tarama hiçbir zaman etkin olmaz. + + Bu politika "StandardProtection" (varsayılan değer olan 1 değeri) olarak ayarlanırsa Güvenli Tarama standart modda her zaman etkin olur. + + Bu politika "EnhancedProtection" (2 değeri) olarak ayarlanırsa Güvenli Tarama gelişmiş modda her zaman etkin olur. Bu mod daha yüksek güvenlik sağlar, ancak Google ile daha fazla tarama bilgisi paylaşmayı gerektirir. + + Bu politikayı zorunlu olarak ayarlarsanız kullanıcılar <ph name="PRODUCT_NAME" /> içindeki Güvenli Tarama ayarını değiştiremez veya geçersiz kılamaz. + + Bu politika ayarlanmadan bırakılırsa Güvenli Tarama, Standart Koruma modunda çalışır, ancak kullanıcılar bu ayarı değiştirebilir. + + Güvenli Tarama hakkında daha fazla bilgi için https://support.google.com/chrome?p=safe_browsing_preferences adresine göz atın.</translation> <translation id="2177696016354404697">Gizlilik ekranını her zaman devre dışı bırak</translation> <translation id="2178899310296064282">YouTube'da en azından Orta Düzey Kısıtlı Mod'u zorunlu kıl</translation> <translation id="2180958780733364832">Gözetimsiz Mod'un kullanımını kontrol et</translation> @@ -2028,6 +2051,11 @@ Bu politika yanlış değerine ayarlandığında PDF görüntüleyici PDF'lere not ekleyemez.</translation> <translation id="2769952903507981510">Uzaktan erişim ana makineleri için gerekli alan adını yapılandır</translation> +<translation id="2770376586681635746">Kullanıcının Kerberos hesapları ekleyip ekleyemeyeceğini kontrol eder. + +Bu politika etkinleştirilir veya ayarlanmazsa kullanıcılar, Kerberos ayarlar sayfasındaki Kerberos Hesapları ayarlarıyla Kerberos hesapları ekleyebilirler. Ekledikleri hesaplar üzerindeki tüm kontrol kullanıcılarda olup hesapları değiştirebilir veya silebilirler. + +Politika devre dışı bırakılırsa kullanıcılar Kerberos hesabı ekleyemez. Hesaplar ancak "Kerberos hesaplarını yapılandırma" politikası aracılığıyla eklenebilir. Bu, hesapları kilitlemek için etkili bir yoldur.</translation> <translation id="2772231477628401250">Güncelleme indirmeleri için HTTP kullan</translation> <translation id="2772955711376920612">Politika, Etkin değerine ayarlanır ve <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> ile <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> ayarlanırsa desteklenen cihazlarda yoğun saatler için güç yönetimi açık kalır. Yoğun saatler için güç yönetimi politikası, kullanımın en yüksek olduğu zamanlarda alternatif akım kullanımını minimuma indiren bir güç tasarrufu politikasıdır. Hafta içi her gün, yoğun saatler için güç yönetimi modunun başlangıç ve bitiş saati ayarlanabilir. Bu saatler sırasında alternatif akım takılı olsa bile, pil belirtilen eşiğin üstünde kaldığı sürece cihaz pille çalışır. Bitiş zamanından sonra cihaz, takılıysa alternatif akımı kullanarak çalışır, ancak pil şarj olmaz. Cihaz, belirtilen şarj başlangıç zamanından sonra alternatif akımı kullanarak ve pili şarj ederek tekrar normal şekilde çalışır. @@ -3794,6 +3822,9 @@ Bu politika ayarlanmazsa sistem DNS çözümlemesi, sistem yapılandırmasına ve özellik bayraklarına bağlı olarak ağ hizmetinin içinde veya dışında ya da kısmen içinde kısmen dışında çalışabilir.</translation> <translation id="4239720644496144453">Önbellek, Android uygulamaları için kullanılmaz. Birden fazla kullanıcı aynı Android uygulamasını yüklerse bu uygulama her kullanıcı için yeniden indirilir.</translation> <translation id="424318624725112807">Giriş ekranında metin vurgu kutusunu etkinleştir</translation> +<translation id="4245159233848584683">Politika, Devre Dışı değerine ayarlanır veya ayarlanmadan bırakılırsa bir cihaz çevrimdışıyken cihaz yerel hesabı sıfır gecikmeyle otomatik oturum açmaya ayarlıysa <ph name="PRODUCT_OS_NAME" /> bir ağ yapılandırma istemi gösterir. + +Politika, Devre Dışı değerine ayarlanırsa bunun yerine bir hata mesajı gösterilir.</translation> <translation id="4248277954659222481">URL kalıpları izin verilenler listesinde medyanın otomatik olarak oynatılmasına izin ver</translation> <translation id="4250680216510889253">Hayır</translation> <translation id="4252522848899331223">Kullanıcının Güvenli Tarama uyarısını atlamasına izin ver</translation> @@ -3944,6 +3975,11 @@ <translation id="4410236409016356088">Ağ bant genişliğini daraltmayı etkinleştir</translation> <translation id="4411734231900934213">Çocuğun ve ebeveynin cihazlarındaki saatler arasında olmasına izin verilen fark (saniye olarak).</translation> <translation id="441217499641439905"><ph name="PRODUCT_OS_NAME" />, Dosyalar uygulamasında hücresel bağlantılar üzerinden Google Drive erişimini devre dışı bırak</translation> +<translation id="4412885120239670573">Politika, Etkin değerine ayarlanırsa <ph name="PRODUCT_NAME" /> içinde dahili PDF görüntüleyicisi kapatılır, PDF dosyaları indirme olarak ele alınır ve kullanıcının PDF'leri varsayılan uygulamayla açmasına izin verilir. + +Politika, Devre Dışı değerine ayarlanırsa PDF eklentisi, kullanıcılar tarafından kapatılmadığı sürece PDF dosyalarını açar. + +Bu politikayı ayarlarsanız kullanıcılar <ph name="PRODUCT_NAME" /> ürününde bunu değiştiremezler. Politika ayarlanmadan bırakılırsa kullanıcılar PDF dosyalarının haricen açılıp açılmayacağını seçebilir.</translation> <translation id="4413453659814156568">JIT (Just In Time) derleyicisi etkinken JavaScript çalıştırmasına izin verilen sitelerin belirtildiği bir site URL kalıpları listesini ayarlamanıza olanak tanır. Geçerli site URL kalıpları hakkında ayrıntılı bilgi için https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns adresine bakabilirsiniz. <ph name="WILDCARD_VALUE" />, bu politikada kabul edilen bir değer değildir. @@ -4050,6 +4086,7 @@ <translation id="4482784169143060077">Otomatik HTTPS yükseltmelerini etkinleştir</translation> <translation id="4483120730995943109">0 ms'lik bir zaman aşımına sahip JavaScript setTimeout(), 1 ms'ye sabitlenmez.</translation> <translation id="4483649828988077221">Otomatik Güncelleme'yi devre dışı bırak</translation> +<translation id="4483738129334574255">Kayıtlı <ph name="PRODUCT_OS_NAME" /> cihazlarda dinozor paskalya yumurtası oyununu devre dışı bırak, diğer durumlarda etkinleştir</translation> <translation id="4484515651939984695">Erişim kodu veya QR koduyla seçilen bir yayın cihazının, <ph name="PRODUCT_NAME" /> menüsündeki yayın cihazları listesinde kaç saniye duracağını belirtir.</translation> <translation id="4485425108474077672">Yeni Sekme sayfasının URL'sini yapılandır</translation> <translation id="4490420545181481759">X.509 sertifikaları, sertifikadaki uzantılara Ad Kısıtlamaları gibi kısıtlamalar kodlayabilir. RFC 5280, güven bağlantısı sertifikalarına bu tür kısıtlamaların uygulanmasının isteğe bağlı olduğunu belirtir. <ph name="PRODUCT_NAME" /> 112 sürümünden itibaren, platform sertifika deposundan yüklenen sertifikalardaki bu tür kısıtlamalar uygulanacaktır. @@ -4360,6 +4397,7 @@ <ph name="MAC_OS_NAME" /> örneklerinde, Chrome Web Mağazası dışından uygulamalar ve uzantılar, örnek yalnızca MDM ile çalışıyorsa, MCX aracılığıyla bir alan adına katılmışsa veya <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" /> öğesine kaydolmuşsa zorunlu olarak yüklenebilir.</translation> <translation id="4742973303930120836">Arka plan grafikleri yazdırma modunu kısıtla</translation> +<translation id="4744467872051608680">Bu politika, M119 sürümünden itibaren yanlış değerine ayarlanır veya ayarlanmadan bırakılırsa WebSQL devre dışı bırakılır, ancak "web-sql-access" Chrome flag'i ile etkinleştirilebilir. Politika, Doğru değerine ayarlanırsa WebSQL erişimi etkinleştirilir.</translation> <translation id="4745232963710538589">Kullanım metriklerini raporlamak için analizler uzantısını etkinleştir</translation> <translation id="4749670563834935149">Giriş ve kilit ekranında URL listesi için <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> politikasını etkinleştirin. @@ -4946,6 +4984,9 @@ Geçerli <ph name="URL_LABEL" /> kalıpları hakkında ayrıntılı bilgi için https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns adresine bakabilirsiniz. Bu politika, yalnızca kaynağa göre eşleşir. Dolayısıyla, URL kalıbındaki yollar yoksayılır.</translation> <translation id="5318185076587284965">Uzaktan erişen ana makine tarafından geçiş sunucuları kullanılmasını etkinleştir</translation> +<translation id="5321624917465764266">Politika, Etkin değerine ayarlanır veya ayarlanmadan bırakılırsa tarayıcı geçmişi ve indirme geçmişi Chrome'da silinebilir ve kullanıcılar bu ayarı değiştiremezler. + +Politika, Devre Dışı değerine ayarlanırsa tarayıcı geçmişi ve indirme geçmişi silinemez. Bu politika devre dışı bırakılsa bile tarama ve indirme geçmişinin saklanacağı garanti edilmez. Kullanıcılar geçmiş veritabanındaki dosyaları doğrudan düzenleyebilir veya silebilirler. Ayrıca tarayıcının kendisinin süresi dolabilir veya geçmiş öğelerinin herhangi birini veya tümünü her an arşive alabilir.</translation> <translation id="5323200200131319468">Giriş ekranında sözlü geri bildirimi etkinleştir</translation> <translation id="5323271643727095577">beforeunload etkinliği için event.preventDefault() çağrıldığında iptal iletişim kutusunu gösterme beforeunload event.returnValue, beforeunload etkinliği için boş dize olduğunda iptal iletişim kutusunu göster.</translation> <translation id="5323355956693037267">Giriş ekranında dokunmatik klavyeyi etkinleştir</translation> @@ -5186,6 +5227,9 @@ <translation id="5535256585099022933">Yeniden başlatma zaman aralığını ayarla</translation> <translation id="553806128266843748">Veri akışı kısıtlamanın etkinleştirilip etkinleştirilmediğini gösteren bir boole flag'i.</translation> <translation id="5540885720415375851">Yerel cihaz bulmaya izin ver</translation> +<translation id="5542235730745104308">Politika, Doğru değerine ayarlandığında <ph name="PRODUCT_NAME" /> tarayıcıya gömülü alternatif hata sayfalarını kullanır (ör. "sayfa bulunamadı"). Politika, Yanlış değerine ayarlanırsa <ph name="PRODUCT_NAME" /> alternatif hata sayfalarını kullanmaz. + +Bu politikayı ayarlarsanız kullanıcılar değiştiremez. Ayarlanmazsa politika açık kalır fakat kullanıcılar bu ayarı değiştirebilir.</translation> <translation id="5544059132156503357">Politikanın ayarlanması, <ph name="MS_AD_NAME" /> sunucusundan Kerberos biletleri istenirken izin verilen şifreleme türlerini belirler. Bu politika: @@ -5700,6 +5744,7 @@ <translation id="6042407236638640864"><ph name="CACHE_CONTROL_NO_STORE_NAME" /> başlığı içeren sayfaların geri-ileri önbelleğe girmesine izin ver</translation> <translation id="604243460476563291">Kurumsal yöneticilerden gelen uzaktan destek bağlantılarında dosya aktarımını devre dışı bırak</translation> <translation id="6042629184389251062">URL içeren veya URL'lerle ilişkili metrik toplamaya izin verilmez</translation> +<translation id="6045733613334942660">Tarayıcı sürücüleri</translation> <translation id="6046615715547751255">Ayrıntılı raporlama kontrollerine izin verme</translation> <translation id="6048199181629830227">Güç tüketimi en üst düzeydeyken pil kullanımına geçme güç yönetimini etkinleştir</translation> <translation id="6048690591359317353">Kullanıcının manuel olarak VPN bağlantısını kesmesine veya VPN'yi yapılandırmasına izin verme</translation> @@ -5939,6 +5984,9 @@ <translation id="625580680776945310">Yüksek Verimlilik Modu etkinleştirilir.</translation> <translation id="6258658183356534534">Kullanıcı aracısı istemci ipuçları GREASE güncelleme özelliğini kontrol et.</translation> <translation id="6261643884958898336">Makine Kimlik bilgilerini bildir</translation> +<translation id="6264247808139384018">Politika, Etkin değerine ayarlanır veya ayarlanmadan bırakılırsa şifreyle kimlik doğrulayan kullanıcılar ekranı kilitleyebilir. + +Politika, Devre Dışı değerine ayarlanırsa kullanıcılar ekranı kilitleyemez. (Yalnızca kullanıcı oturumundan çıkış yapabilirler.)</translation> <translation id="6265892395051519509">Bu sitelerde sensörlere erişime izin ver</translation> <translation id="6266043141694454734">Sunucu sertifikalarını doğrulamak için Chrome Root Store ve yerleşik sertifika doğrulayıcının kullanılıp kullanılmayacağını belirler</translation> <translation id="6267130578410325007">Bu politika varsayılan olarak kaynak içeren veya kaynaklarla ilişkili aracı kümelemeye izin verir. @@ -6185,6 +6233,9 @@ <translation id="6412352702230183710">Yalnızca sistem düzeyinde yerel mesajlaşma ana makinelerine izin ver</translation> <translation id="6416506846917150119">Kullanıcılar yazarken fiziksel klavyede tahmine dayalı yazma özelliğini devre dışı bırak</translation> <translation id="6417265370957905582">Google Asistan</translation> +<translation id="6421254653839955267">Politika, Etkin değerine ayarlanırsa CNAME araması atlanır. Kerberos SPN oluşturulurken sunucu adı girildiği şekliyle kullanılır. + +Politika, Devre Dışı değerine ayarlanır veya ayarlanmadan bırakılırsa CNAME araması, Kerberos SPN'i oluşturulurken sunucunun standart adını belirler.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6424486395812679373">İndirilen tüm dosyalarda Güvenli Tarama kontrolleri gerçekleştir</translation> <translation id="6433697627431665375"><ph name="PRODUCT_NAME" /> verilerinin yedeklere dahil edilmesini engelle</translation> @@ -6323,6 +6374,11 @@ Politika değeri milisaniye olarak belirtilmelidir. Değerler boşta kalma gecikmesinden küçük olacak şekilde bir aralığa sıkıştırılır.</translation> <translation id="6497085755801788141">Yerleşik sertifika doğrulayıcıyı kullan</translation> +<translation id="6504720469162323184">Politikanın ayarlanması, <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> politikası tarafından belirtilen cihaz yerel hesabında otomatik oturum açılmadan önce kullanıcı etkinliği olmadan geçen süreyi milisaniye cinsinden belirler. + +Politika ayarlanmadan bırakılırsa zaman aşımı olarak 0 milisaniye kullanılır. + +<ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> politikası ayarlanmazsa bu politikanın hiçbir etkisi olmaz.</translation> <translation id="65055701428353978">Bu politika ayarlanırsa, etkilenen her uzantı için standart https://<extension id>.chromiumapp.org/ yönlendirme URL'sine ek olarak <ph name="IDENTITY_API_NAME" /> API (<ph name="IDENTITY_API_URL" />) ile kullanılabilen OAuth yönlendirme URL'lerinin listesi belirtilir. Politika ayarlanmadan bırakılırsa ya da boş bir URL listesi sağlanırsa tüm uygulamalar veya uzantılar <ph name="IDENTITY_API_NAME" /> API'yi kullanırken yalnızca standart yönlendirme URL'sini kullanabilir.</translation> @@ -6422,6 +6478,7 @@ Bu politikanın, EnabledPlugins ve DisabledPluginsExceptions politikaları tarafından geçersiz kılınabileceğini unutmayın. Bu politika ayarlanmadan bırakılırsa kullanıcı, sabit kodlu, uyumsuz, eski veya tehlikeli eklentiler hariç sistemde yüklü herhangi bir eklentiyi kullanabilir.</translation> +<translation id="6571055160227165318">WebSQL'nin, Chrome flag'i tarafından etkinleştirilmesine izin ver.</translation> <translation id="6574903167639386816">Kullanıcı oturumu sona erdiğinde diskteki profil verilerini temizle</translation> <translation id="6575403002861093126">Politikanın ayarlanması, Grup Politika Nesnesi (GPO) önbellek ömrünü saat cinsinden belirtir. Önbellek ömrü, GPO'ların tekrar indirilene kadar yeniden kullanılabileceği maksimum süredir. Sistem, her politika getirildiğinde GPO'ları tekrar indirmek yerine, önbelleğe alınmış GPO'ları sürümleri aynı kaldığı sürece yeniden kullanabilir. @@ -6550,6 +6607,11 @@ Politika, Devre Dışı değerine ayarlanır veya ayarlanmadan bırakılırsa yazdırma komutları, baskı önizleme ekranını tetikler.</translation> <translation id="6655274714135630366">Disk görüntüsünün on altılı kodlanmış SHA-256 karması.</translation> +<translation id="6655844456903132379">Politika, Etkin değerine ayarlanırsa HTTP kimlik doğrulaması, KDC politikasının onayını dikkate alır. Yani, KDC hizmet biletini <ph name="OK_AS_DELEGATE" /> olarak ayarlarsa <ph name="PRODUCT_NAME" />, kullanıcı kimlik bilgileri için erişilen hizmeti yetkilendirir. RFC 5896 belgesine bakın ( https://tools.ietf.org/html/rfc5896.html ). Hizmete <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> tarafından da izin verilmelidir. + +Politika, Devre Dışı değerine ayarlanır veya ayarlanmadan bırakılırsa KDC politikası, desteklenen platformlarda yok sayılır ve yalnızca <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> politikası dikkate alınır. + +<ph name="MS_WIN_NAME" /> ürününde KDC politikası her zaman dikkate alınır.</translation> <translation id="6658245400435704251">Bir güncelleme sunucuya ilk gönderildiği andan itibaren bir cihazın rastgele şekilde güncelleme yüklemesini geciktirebileceği süreyi saniye olarak belirtir. Cihaz bu sürenin bir kısmında gerçek zaman olarak, geri kalan kısmında ise güncelleme denetlemelerinin sayısınca bekleyebilir. Cihazın bir güncellemeyi sürekli bekler durumda kalmaması için, dağılım her durumda üst sınır olarak sabit bir süre ile kısıtlıdır.</translation> <translation id="6659537776197644458">Şifre senkronizasyonu için kimlik doğrulama akışlarını tetikleme</translation> <translation id="6661178198729301029">Yönetilen profil bulut raporlamasını etkinleştir</translation> @@ -7094,6 +7156,11 @@ Politika, Yanlış değerine ayarlandığında bu işlev devre dışı kalır.</translation> <translation id="7123271473727774529">Renk düzeltme erişilebilirlik özelliğini etkinleştir</translation> <translation id="7126716959063786004">Görev Yöneticisi'ndeki işlemlerin sona erdirilebilmesini etkinleştir</translation> +<translation id="7126787606641224668">Kerberos kimlik doğrulama iletişim kutusunda "Şifreyi hatırla" özelliğinin etkinleştirilip etkinleştirilmediğini kontrol eder. Şifreler diskte şifrelenmiş olarak saklanır ve yalnızca Kerberos sistemi arka alan programı tarafından ve bir kullanıcı oturumu sırasında erişilebilir. + +Bu politika etkinleştirilir veya ayarlanırsa kullanıcılar, tekrar girmeleri gerekmesin diye Kerberos şifrelerinin hatırlanıp hatırlanmayacağına karar verebilirler. Ek bir kimlik doğrulama işlemi (iki faktörlü kimlik doğrulama) gerekmedikçe Kerberos biletleri otomatik olarak getirilir. + +Bu politika devre dışı bırakılırsa şifreler hiçbir zaman hatırlanmaz ve daha önce saklanan tüm şifreler silinir. Kullanıcılar, Kerberos sisteminde kimlik doğrulamaları gerektiğinde her zaman şifrelerini girmelidirler. Sunucu ayarlarına bağlı olarak, bu genellikle her 8 saatte bir ile birkaç ayda bir arasında olur.</translation> <translation id="7126928806195745404">JavaScript ayarları</translation> <translation id="7127980134843952133">İndirme geçmişi</translation> <translation id="7128513247945602297">HTTPS sitelerinde karma içerik otomatik yükseltmesini etkinleştir</translation> @@ -7160,6 +7227,9 @@ <translation id="7157329428182136164">3D grafik API'leri için desteği etkinleştir</translation> <translation id="7158358621906236999">Varsayılan sensörler ayarı</translation> <translation id="7161568070244869726">AppCache özelliğini etkinleştirmeye zorla</translation> +<translation id="7165879643294314958">Politika, Etkin değerine ayarlanır veya ayarlanmadan bırakılırsa cihaz yerel hesabı sıfır gecikmeyle otomatik oturum açmaya ayarlanır. <ph name="PRODUCT_OS_NAME" />, otomatik oturum açmayı atlayıp oturum açma ekranını göstermek için Ctrl+Alt+S klavye kısayolunu kullanır. + +Politika, Devre Dışı değerine ayarlanırsa kullanıcılar sıfır gecikmeyle otomatik oturum açmayı (yapılandırılmışsa) atlayamaz.</translation> <translation id="7165882688932913315">Bu politika, kullanıcının etrafındaki bulunabilir cihazların yanı sıra kendisine kayıtlı bulut cihazları gösteren yerel keşif kullanıcı arayüzündeki (<ph name="CHROME_DEVICES_LINK" />) kontrol edilebilir özelliklere erişimi denetler. <ph name="PRODUCT_OS_NAME" /> hariç tüm işletim sistemlerinde yerel keşif kullanıcı arayüzü, kullanıcıların, bilgisayarlarına bağlı klasik yazıcıları <ph name="CLOUD_PRINT_NAME" /> hizmetine eklemelerine izin verir. Politika, Etkin değerine ayarlanır veya ayarlanmadan bırakılırsa yerel cihaz bulmaya izin verilir. @@ -7276,6 +7346,11 @@ <translation id="7269263983506766969">Ses işlemi için varsayılan önceliği kullan</translation> <translation id="7270001383428188269">Bu istemci sertifikasının tanımlayıcısı.</translation> <translation id="7271085005502526897">İlk çalıştırmada ana sayfayı varsayılan tarayıcıdan içe aktar</translation> +<translation id="7272892848025145170">Kerberos işlevinin etkinleştirilip etkinleştirilmediğini kontrol eder. Kerberos, web uygulamaları ve dosya paylaşımlarıyla kimlik doğrulamak için kullanılabilecek bir kimlik doğrulama protokolüdür. + +Politika etkinleştirilirse Kerberos işlevi etkinleştirilir. Kerberos hesapları, "Kerberos hesaplarını yapılandır" politikası aracılığıyla veya Kerberos ayarları sayfasındaki Kerberos Hesapları ayarı aracılığıyla eklenebilir. + +Bu politika devre dışı bırakılır veya ayarlanmazsa Kerberos Hesapları ayarları devre dışı bırakılır. Kerberos hesabı eklenemez ve Kerberos kimlik doğrulama protokolü kullanılamaz. Mevcut tüm Kerberos hesapları kaldırılır, saklanan tüm şifreler silinir.</translation> <translation id="7273785848231509306">Kullanıcı adlarını ve fotoğrafları hiçbir zaman gösterme</translation> <translation id="7274077256421167535">USB güç paylaşımını etkinleştir</translation> <translation id="7275334191706090484">Yönetilen Yer İşaretleri</translation> @@ -7551,6 +7626,7 @@ Politika ayarlanmadan bırakılırsa varsayılan değer, kuruluş tarafından yönetilen kullanıcılar için <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />, yönetilmeyen kullanıcılar için de <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> olur. İleride <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" /> değeri kullanılarak <ph name="LACROS_NAME" /> tarayıcının <ph name="PRODUCT_OS_NAME" /> ile kullanılabilen tek tarayıcı olması sağlanabilecektir.</translation> +<translation id="751071954873065775">Önceden indirilmesi gereken DLC'leri (İndirilebilir İçerik) seç</translation> <translation id="7512065400265675158"><ph name="USER_AGENT_HEADER_NAME" /> HTTP istek başlığı kısaltılacak. Bu politika, testi ve uyumluluk sağlanmasını kolaylaştırmak amacıyla kısaltma özelliğini tüm web siteleri için etkinleştirebilir ya da özelliği etkinleştirmek üzere kaynak denemelerini veya alan denemelerini devre dışı bırakabilir. <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> ve zaman çizelgesi hakkında daha fazla bilgiyi şu adreste bulabilirsiniz: @@ -7942,6 +8018,9 @@ Bu politika ayarlanmadan bırakılırsa giriş ekranında yüksek kontrast başlangıçta devre dışı bırakılır, ancak kullanıcılar istedikleri zaman etkinleştirebilirler.</translation> <translation id="7864539943188674973">Bluetooth'u devre dışı bırak</translation> <translation id="7869986671709030417">Varsayılan arka plan grafikleri yazdırma modu</translation> +<translation id="7872692545596413465">Politika, Etkin değerine ayarlanır ve standart olmayan bir bağlantı noktası girilirse (yani 80 veya 443'ten başka bir bağlantı noktası) politika, oluşturulan Kerberos SPN'ine dahil edilir. + +Politika, Devre Dışı değerine ayarlanır veya ayarlanmadan bırakılırsa oluşturulan Kerberos SPN'ine bağlantı noktası dahil edilmez.</translation> <translation id="7877924399554599110">Kullanıcı bulut politikalarının, makine düzeyinde politikalarla birleştirilmesini sağlar</translation> <translation id="7881421274383404138">Bu politika ayarlanırsa kurumsal yazıcılar yapılandırılır. Biçimi, <ph name="PRINTERS_POLICY_NAME" /> sözlüğü ile aynı olmakla birlikte izin verilenler veya engellenenler listelerine eklenecek her yazıcı için gerekli ek <ph name="ID_FIELD" /> veya <ph name="GUID_FIELD" /> alanlarını içerir. Dosya biçimi JSON olup boyutu 5 MB'tan büyük olamaz. Yaklaşık 21.000 yazıcı içeren bir dosya, 5 MB boyutunda olur. Şifreleme karma değeri, indirmenin bütünlüğünü doğrulamaya yardımcı olur. URL veya karma değer değiştiğinde dosya indirilir, önbelleğe alınır ve yeniden indirilir. <ph name="PRODUCT_OS_NAME" />, yazıcı yapılandırmalarına ait dosyayı indirerek <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> ve <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" /> ile birlikte yazıcıları kullanılabilir hale getirir. @@ -7994,6 +8073,11 @@ Bu kurumsal politika ile yöneticiler, kullanıcılarının ek kısıtlamayı etkinleştirip etkinleştiremeyeceğini kontrol edebilir. Politika devre dışı değerine ayarlandığında kısıtlamayı etkinleştirme işlemi engellenir. Politika, etkin değerine ayarlandığında veya ayarlanmadan bırakıldığında kısıtlama, kullanıcı tarafından ya da Chrome varyasyonları aracılığıyla etkinleştirilebilir.</translation> <translation id="793188693675675950">İlk çalıştırmada ana sayfanın içe aktarılmasını devre dışı bırak</translation> +<translation id="7932017046032784156">Politika, Etkin değerine ayarlanırsa Cast araç çubuğu simgesi, araç çubuğunda veya taşma menüsünde görüntülenir ve kullanıcılar tarafından kaldırılamaz. + +Politika, Devre Dışı değerine ayarlanır veya ayarlanmadan bırakılırsa kullanıcılar simgeyi içerik menüsünden sabitleyebilir veya kaldırabilir. + +<ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> politikası Devre Dışı değerine ayarlanırsa bu politikanın değerinin geçerliliği kalmaz ve araç çubuğu simgesi görünmez.</translation> <translation id="7933141401888114454">Denetlenen kullanıcılar oluşturmayı etkinleştir</translation> <translation id="793473937901685727">ARC uygulamaları için sertifika kullanılabilirliğini ayarla</translation> <translation id="7936302526928951356">User-Agent dizesi, ana sürümü dondurmaz.</translation> @@ -8764,6 +8848,9 @@ <translation id="8584279193368801689">PIN ile yazdırma modunu kısıtlar. Politika ayarlanmazsa herhangi bir kısıtlama uygulanmaz. Mod kullanılamıyorsa bu politika yok sayılır. PIN yazdırma özelliğinin yalnızca IPPS, HTTPS, USB veya USB üzerinden IPP protokollerinden bir tanesini kullanan yazıcılar için geçerli olduğunu unutmayın.</translation> <translation id="8587229956764455752">Yeni kullanıcı hesapları oluşturulmasına izin ver</translation> <translation id="8589285015138337712">Kullanıcının sistem kısayollarını özelleştirmesine izin verme</translation> +<translation id="8589346048177748110">Politikanın Doğru değerine ayarlanması, kullanıcıların dinozor oyunu oynamalarına izin verir. Politikanın Yanlış değerine ayarlanması, kullanıcıların cihaz internete bağlı değilken paskalya yumurtası oyununu oynayamayacakları anlamına gelir. + +Poltikanının ayarlanmadan bırakılması, kullanıcıların oyunu kayıtlı <ph name="PRODUCT_OS_NAME" /> ürününde oynayamayacakları, ancak diğer durumlarda oynayabilecekleri anlamına gelir.</translation> <translation id="8591713876665299827">Bu politikanın artık kullanılmadığını ve <ph name="PRODUCT_OS_NAME" /> sürüm 85'te kaldırılacağını unutmayın. Lütfen bunun yerine <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> politikasını kullanın. AC güçle çalışırken, boşta kalma işleminin uygulanmasından önce kullanıcı girişi olmadan geçecek süreyi belirtir. @@ -9078,6 +9165,9 @@ Devre Dışı seçeneğine ayarlanırsa <ph name="SEARCH_SIDE_PANEL_FEATURE_NAME" />, hiçbir web sayfasında kullanılamaz.</translation> <translation id="8860894781631833477">Kullanıcılar <ph name="PRODUCT_OS_NAME" /> sürüm kanalını yapılandırabilir</translation> +<translation id="8862086508140571198">Bu politika, mümkün olan en kısa sürede indirilecek DLC (İndirilebilir İçerik) listesinin ayarlanmasına olanak tanır. İndirilen DLC'ler sonrasında cihazdaki tüm kullanıcılar tarafından kullanılabilir. + +Yöneticinin, DLC'nin mevcut olması gereken özelliklerin, cihaz kullanıcıları tarafından kullanılma ihtimali olduğunu bildiği durumlarda bu politika faydalı olur.</translation> <translation id="8864975621965365890">Bir site <ph name="PRODUCT_FRAME_NAME" /> tarafından oluşturulduğunda görülen reddetme sorusunu engeller.</translation> <translation id="8865404058177794289">RSA anahtarı kullanma kontrolü için varsayılan ayarı kullan</translation> <translation id="8866430022832109569">Uygulama envanteri ile ilgili raporlama</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index f10b0c5..0f81be3 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -975,6 +975,11 @@ <translation id="1861206724856734193">Đặt danh sách các quy tắc ngăn rò rỉ dữ liệu.</translation> <translation id="1862267110714201519">Tắt tính năng cửa sổ ảo.</translation> <translation id="1865417998205858223">Quyền khóa</translation> +<translation id="1865867000796030567">Nếu bạn đặt chính sách này thành Enabled (Bật), thì giá trị của khoá tệp kê khai <ph name="REQUIRED_PLATFORM_VERSION" /> của ứng dụng kiosk tự động chạy với độ trễ bằng 0 sẽ được dùng làm tiền tố của phiên bản đích tự động cập nhật. + +Nếu bạn đặt thành Disabled (Tắt) hoặc không đặt chính sách này, thì khoá tệp kê khai <ph name="REQUIRED_PLATFORM_VERSION" /> sẽ bị bỏ qua và quá trình tự động cập nhật sẽ tiếp tục như bình thường. + +Cảnh báo: Không được uỷ quyền kiểm soát phiên bản <ph name="PRODUCT_OS_NAME" /> cho ứng dụng kiosk vì điều này có thể khiến thiết bị không nhận được các bản cập nhật phần mềm cũng như bản vá bảo mật quan trọng. Việc uỷ quyền kiểm soát phiên bản <ph name="PRODUCT_OS_NAME" /> có thể khiến người dùng gặp rủi ro.</translation> <translation id="186719019195685253">Tác vụ sẽ thực hiện khi đạt độ trễ không hoạt động trong khi chạy bằng nguồn AC</translation> <translation id="1869688072690234823">Việc đặt chính sách này sẽ kiểm soát yếu tố WebAuthn nào có thể được sử dụng. @@ -1221,6 +1226,11 @@ Nếu bạn không đặt hoặc đặt chính sách này thành danh sách trống, thì người dùng sẽ không thể sử dụng chế độ mở khóa nhanh nào cho các thiết bị được quản lý. Chính sách này không còn dùng nữa, vui lòng sử dụng <ph name="QUICK_UNLOCK_MODE_ALLOW_LIST_POLICY_NAME" /></translation> +<translation id="2035995535603698706">Nếu bạn đặt chính sách này thành Enabled (Bật), hình ảnh của bên thứ ba trên một trang sẽ được phép hiển thị lời nhắc xác thực. + +Nếu bạn không đặt hoặc đặt chính sách này thành Disabled (Tắt), thì hình ảnh của bên thứ ba sẽ không thể hiển thị lời nhắc xác thực. + +Thông thường, chính sách này bị Disabled (Tắt) để chống lừa đảo.</translation> <translation id="2036522553891755455">Nếu bạn đặt chính sách này thành Bật, tính năng khám phá lượt chia sẻ (tính năng Chia sẻ tệp trong mạng của <ph name="PRODUCT_NAME" />) sẽ sử dụng <ph name="NETBIOS_PROTOCOL" /> để khám phá các lượt chia sẻ trên mạng. Nếu bạn đặt chính sách thành Tắt, tính năng khám phá lượt chia sẻ sẽ không sử dụng giao thức này để khám phá các lượt chia sẻ. Nếu bạn không đặt chính sách này, chế độ mặc định sẽ là tắt đối với người dùng được quản lý và bật đối với người dùng khác.</translation> @@ -1390,6 +1400,19 @@ Để biết thêm thông tin chi tiết về các phiên <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, vui lòng xem thông số kỹ thuật của <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation> <translation id="2175353308236295184">Đối tượng cấu hình JSON dành riêng cho ứng dụng có một tập hợp gồm các cặp khóa-giá trị, chẳng hạn như '"managedConfiguration": { "key1": value1, "key2": value2 }'. Các khóa được định nghĩa trong tệp kê khai ứng dụng.</translation> <translation id="2176115444876446233">Ngăn người dùng thu thập dữ liệu theo dõi hoạt động trên toàn hệ thống.</translation> +<translation id="2177382213857119200">Cho phép bạn kiểm soát xem có bật tính năng Duyệt web an toàn của <ph name="PRODUCT_NAME" /> không và tính năng này sẽ hoạt động ở chế độ nào. + + Nếu bạn đặt chính sách này thành "NoProtection" (giá trị 0), thì tính năng Duyệt web an toàn sẽ không bao giờ hoạt động. + + Nếu bạn đặt chính sách này thành "StandardProtection" (giá trị 1, giá trị mặc định), thì tính năng Duyệt web an toàn sẽ luôn hoạt động ở chế độ chuẩn. + + Nếu bạn đặt chính sách này thành "EnhancedProtection" (giá trị 2), thì tính năng Duyệt web an toàn sẽ luôn hoạt động ở chế độ nâng cao. Chế độ này bảo mật tốt hơn nhưng người dùng sẽ phải chia sẻ thêm thông tin duyệt web với Google. + + Nếu bạn đặt chính sách này thành bắt buộc, thì người dùng sẽ không thể thay đổi hoặc ghi đè chế độ cài đặt Duyệt web an toàn trong <ph name="PRODUCT_NAME" />. + + Nếu bạn không đặt chính sách này, thì tính năng Duyệt web an toàn sẽ hoạt động ở chế độ Bảo vệ tiêu chuẩn nhưng người dùng có thể thay đổi chế độ cài đặt này. + + Để biết thêm thông tin về tính năng Duyệt web an toàn, hãy truy cập vào https://support.google.com/chrome?p=safe_browsing_preferences.</translation> <translation id="2177696016354404697">Luôn tắt màn hình bảo vệ quyền riêng tư</translation> <translation id="2178899310296064282">Buộc sử dụng ít nhất Chế độ hạn chế trung bình trên YouTube</translation> <translation id="2180958780733364832">Kiểm soát việc sử dụng Chế độ không có giao diện người dùng</translation> @@ -2028,6 +2051,11 @@ Khi bạn đặt chính sách này thành tắt, trình xem PDF sẽ không thể chú thích trong tệp PDF.</translation> <translation id="2769952903507981510">Định cấu hình tên miền bắt buộc cho máy chủ truy cập từ xa</translation> +<translation id="2770376586681635746">Kiểm soát việc người dùng có thể thêm tài khoản Kerberos hay không. + +Nếu bạn bật hoặc không đặt chính sách này, thì người dùng có thể thêm tài khoản Kerberos thông qua phần Cài đặt tài khoản Kerberos trên trang Cài đặt Kerberos. Người dùng có toàn quyền kiểm soát các tài khoản mà họ thêm, cũng như có thể sửa đổi hoặc xoá các tài khoản này. + +Nếu bạn tắt chính sách này, người dùng sẽ không thể thêm tài khoản Kerberos. Người dùng chỉ có thể thêm tài khoản thông qua chính sách "Định cấu hình các tài khoản Kerberos". Đây là một cách hiệu quả để khoá các tài khoản.</translation> <translation id="2772231477628401250">Sử dụng HTTP cho các lượt tải bản cập nhật xuống</translation> <translation id="2772955711376920612">Nếu bạn bật chính sách này, đồng thời đặt <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> và <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" />, thì hệ thống sẽ luôn bật chế độ chuyển đổi nguồn điện vào giờ cao điểm nếu được hỗ trợ trên thiết bị. Chính sách quản lý nguồn điện khi chuyển đổi vào giờ cao điểm là một chính sách tiết kiệm điện năng giúp giảm thiểu việc sử dụng dòng điện xoay chiều trong những thời điểm có mức sử dụng cao điểm. Bạn có thể đặt thời gian bắt đầu và thời gian kết thúc để chạy trong chế độ chuyển đổi nguồn điện vào giờ cao điểm cho từng ngày trong tuần. Thiết bị sẽ chạy bằng pin (ngay cả khi được kết nối với dòng điện xoay chiều) trong những thời điểm này miễn là pin ở trên ngưỡng được chỉ định. Sau thời gian kết thúc chỉ định, thiết bị sẽ chạy bằng dòng điện xoay chiều (nếu được kết nối) nhưng sẽ không sạc pin. Thiết bị sẽ hoạt động bình thường trở lại bằng dòng điện xoay chiều và sạc lại pin sau thời gian bắt đầu sạc được chỉ định. @@ -3786,6 +3814,9 @@ Nếu bạn không đặt chính sách này, thì quá trình phân giải DNS của hệ thống có thể chạy trong dịch vụ mạng, ngoài dịch vụ mạng hoặc có một phần chạy trong và một phần chạy ngoài, tuỳ vào cấu hình hệ thống và cờ tính năng.</translation> <translation id="4239720644496144453">Bộ nhớ đệm không được sử dụng cho các ứng dụng Android. Nếu nhiều người dùng cài đặt cùng một ứng dụng Android thì ứng dụng sẽ được tải xuống lại cho từng người dùng.</translation> <translation id="424318624725112807">Bật tính năng làm nổi bật dấu chèn trên màn hình đăng nhập</translation> +<translation id="4245159233848584683">Nếu bạn đặt thành Enabled (Bật) hoặc không đặt chính sách này, thì <ph name="PRODUCT_OS_NAME" /> sẽ hiển thị lời nhắc định cấu hình mạng, trong trường hợp thiết bị không kết nối mạng cũng như đã thiết lập phiên tự động đăng nhập có độ trễ bằng 0 cho một tài khoản trên thiết bị. + +Nếu bạn đặt chính sách này thành Disabled (Tắt), một thông báo lỗi sẽ xuất hiện thay thế cho lời nhắc.</translation> <translation id="4248277954659222481">Cho phép tự động phát nội dung nghe nhìn thuộc danh sách các mẫu URL được phép</translation> <translation id="4250680216510889253">Không</translation> <translation id="4252522848899331223">Cho phép người dùng bỏ qua cảnh báo Duyệt web an toàn</translation> @@ -3936,6 +3967,11 @@ <translation id="4410236409016356088">Cho phép điều chỉnh băng thông mạng</translation> <translation id="4411734231900934213">Mức chênh lệch được phép giữa đồng hồ trên thiết bị của con và thiết bị của cha mẹ (tính bằng giây).</translation> <translation id="441217499641439905">Tắt Google Drive qua các kết nối di động trong ứng dụng Tệp dành cho <ph name="PRODUCT_OS_NAME" /></translation> +<translation id="4412885120239670573">Nếu bạn đặt chính sách này thành Enabled (Bật), thì trình xem PDF nội bộ trong <ph name="PRODUCT_NAME" /> sẽ tắt, tệp PDF sẽ được xem là tệp tải xuống và người dùng sẽ mở tệp PDF bằng ứng dụng mặc định. + +Khi bạn đặt chính sách này thành Disabled (Tắt), các tệp PDF sẽ được mở trừ phi người dùng tắt trình bổ trợ PDF. + +Nếu bạn đặt chính sách này, người dùng sẽ không thể thay đổi lựa chọn của bạn trong <ph name="PRODUCT_NAME" />. Nếu bạn không đặt chính sách này, người dùng có thể chọn có mở tệp PDF bằng trình xem bên ngoài hay không.</translation> <translation id="4413453659814156568">Cho phép bạn thiết lập một danh sách mẫu URL trang web để chỉ định các trang web được phép chạy JavaScript bật trình biên dịch JIT (Just In Time). Để biết thông tin chi tiết về các mẫu URL trang web hợp lệ, vui lòng truy cập https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Chúng tôi không chấp nhận giá trị <ph name="WILDCARD_VALUE" /> đối với chính sách này. @@ -4042,6 +4078,7 @@ <translation id="4482784169143060077">Bật các bản nâng cấp HTTPS tự động</translation> <translation id="4483120730995943109">Hàm JavaScript setTimeout() có thời gian chờ 0 ms sẽ không được làm tròn thành 1 ms.</translation> <translation id="4483649828988077221">Tắt tính năng tự động cập nhật</translation> +<translation id="4483738129334574255">Tắt trò chơi khủng long (trò chơi ẩn) trên các thiết bị <ph name="PRODUCT_OS_NAME" /> đã đăng ký và bật trò chơi này trong các trường hợp khác</translation> <translation id="4484515651939984695">Chỉ định thời gian (tính bằng giây) mà một thiết bị truyền được chọn có mã truy cập hoặc mã QR xuất hiện trong danh sách thiết bị truyền của trình đơn <ph name="PRODUCT_NAME" />.</translation> <translation id="4485425108474077672">Định cấu hình URL trang Thẻ mới</translation> <translation id="4490420545181481759">Chứng chỉ X.509 có thể mã hoá các quy tắc ràng buộc, chẳng hạn như Quy tắc ràng buộc tên, @@ -4373,6 +4410,7 @@ Trên các phiên bản <ph name="MAC_OS_NAME" />, bạn chỉ có thể buộc cài đặt các ứng dụng và tiện ích từ bên ngoài Cửa hàng Chrome trực tuyến nếu phiên bản đó được quản lý qua MDM (Quản lý thiết bị di động), đã liên kết với một miền qua MCX hoặc đã đăng ký <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />.</translation> <translation id="4742973303930120836">Hạn chế chế độ in đồ họa nền</translation> +<translation id="4744467872051608680">Kể từ M119, nếu bạn không đặt hoặc đặt chính sách này thành false thì WebSQL sẽ tắt, nhưng bạn có thể bật thông qua cờ Chrome "web-sql-access". Nếu bạn đặt chính sách này thành true, thì quyền truy cập vào WebSQL sẽ bật.</translation> <translation id="4745232963710538589">Bật tiện ích thông tin chi tiết để báo cáo các chỉ số về việc sử dụng</translation> <translation id="4749670563834935149">Bật <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> cho một danh sách URL trên màn hình đăng nhập và màn hình khoá. @@ -4963,6 +5001,9 @@ Để biết thông tin chi tiết về các mẫu <ph name="URL_LABEL" /> hợp lệ, vui lòng xem tại https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Chính sách này chỉ đối chiếu dựa trên nguồn gốc, nên mọi đường dẫn trong mẫu URL sẽ bị bỏ qua.</translation> <translation id="5318185076587284965">Cho phép máy chủ truy cập từ xa sử dụng máy chủ chuyển tiếp</translation> +<translation id="5321624917465764266">Khi bạn đặt thành Enabled (Bật) hoặc không đặt chính sách này, người dùng có thể xoá nhật ký duyệt web và nhật ký tải xuống trong Chrome, đồng thời không thể thay đổi chế độ cài đặt này. + +Khi bạn đặt chính sách này thành Disabled (Tắt), người dùng sẽ không thể xoá nhật ký duyệt web và nhật ký tải xuống. Ngay cả khi chính sách này bị tắt, không có gì đảm bảo rằng nhật ký duyệt web và nhật ký tải xuống sẽ được giữ lại. Người dùng có thể trực tiếp chỉnh sửa hoặc xoá các tệp cơ sở dữ liệu nhật ký. Ngoài ra, trình duyệt có thể tự hết hạn hoặc lưu trữ tất cả hay một số mục bất kỳ trong nhật ký tại bất kỳ thời điểm nào.</translation> <translation id="5323200200131319468">Bật tính năng phản hồi bằng giọng nói trên màn hình đăng nhập</translation> <translation id="5323271643727095577">Không hiện hộp thoại huỷ khi có lệnh gọi event.preventDefault() cho sự kiện beforeunload. Hiện hộp thoại huỷ khi event.returnValue cho sự kiện beforeunload là chuỗi trống.</translation> <translation id="5323355956693037267">Bật bàn phím ảo trên màn hình đăng nhập</translation> @@ -5204,6 +5245,9 @@ <translation id="5535256585099022933">Đặt khoảng thời gian chạy lại</translation> <translation id="553806128266843748">Một cờ boolean cho biết liệu tùy chọn điều tiết có được bật hay không.</translation> <translation id="5540885720415375851">Cho phép tìm thiết bị cục bộ</translation> +<translation id="5542235730745104308">Nếu bạn đặt chính sách này thành True, thì <ph name="PRODUCT_NAME" /> sẽ sử dụng các trang thông báo lỗi thay thế tích hợp (chẳng hạn như "không tìm thấy trang"). Nếu bạn đặt chính sách này thành False, thì <ph name="PRODUCT_NAME" /> sẽ không bao giờ sử dụng các trang thông báo lỗi thay thế. + +Nếu bạn đặt chính sách này, người dùng sẽ không thay đổi được lựa chọn đó. Nếu bạn không đặt chính sách này, thì chính sách sẽ bật nhưng người dùng có thể thay đổi chế độ cài đặt này.</translation> <translation id="5544059132156503357">Nếu bạn đặt chính sách này, hệ thống sẽ chỉ định các loại mã hoá được phép khi yêu cầu phiếu Kerberos từ một máy chủ <ph name="MS_AD_NAME" />. Nếu bạn đặt chính sách này thành: @@ -5975,6 +6019,9 @@ <translation id="625580680776945310">Chế độ hiệu quả cao sẽ được bật.</translation> <translation id="6258658183356534534">Kiểm soát tính năng Cập nhật thuật toán GREASE trong User-Agent Client Hints.</translation> <translation id="6261643884958898336">Báo cáo thông tin nhận dạng máy</translation> +<translation id="6264247808139384018">Nếu bạn đặt thành Enabled (Bật) hoặc không đặt chính sách này, những người dùng xác thực bằng mật khẩu có thể khoá màn hình. + +Nếu bạn đặt chính sách này thành Disabled (Tắt), người dùng sẽ không thể khoá màn hình. (Họ chỉ có thể đăng xuất khỏi phiên hoạt động của người dùng).</translation> <translation id="6265892395051519509">Cho phép sử dụng cảm biến trên các trang web này</translation> <translation id="6266043141694454734">Xác định xem Chrome Root Store và trình xác minh chứng chỉ tích hợp có dùng để xác minh chứng chỉ máy chủ hay không</translation> <translation id="6267130578410325007">Theo mặc định, chính sách này cho phép phân nhóm tác nhân theo khoá nguồn gốc. @@ -6223,6 +6270,9 @@ <translation id="6412352702230183710">Chỉ cho phép các máy chủ nhắn tin gốc ở cấp hệ thống</translation> <translation id="6416506846917150119">Tắt tính năng gợi ý khi viết bằng bàn phím vật lý khi người dùng đánh máy</translation> <translation id="6417265370957905582">Trợ lý Google</translation> +<translation id="6421254653839955267">Nếu bạn đặt chính sách này thành Enabled (Bật), hệ thống sẽ bỏ qua quá trình tra cứu CNAME. Khi đó, tên máy chủ bạn đã nhập khi tạo SPN Kerberos sẽ được sử dụng. + +Nếu bạn đặt thành Disabled (Tắt) hoặc không đặt chính sách này, thì quá trình tra cứu CNAME sẽ xác định tên chuẩn của máy chủ khi tạo SPN Kerberos.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6424486395812679373">Thực hiện quá trình kiểm tra của tính năng Duyệt web an toàn đối với tất cả tệp tải xuống</translation> <translation id="6433697627431665375">Không cho phép đưa dữ liệu của <ph name="PRODUCT_NAME" /> vào bản sao lưu</translation> @@ -6365,6 +6415,11 @@ Bạn phải chỉ định giá trị của chính sách bằng mili giây. Các giá trị được giới hạn ở mức nhỏ hơn thời gian chờ khi ở chế độ tạm vắng.</translation> <translation id="6497085755801788141">Sử dụng trình xác minh chứng chỉ tích hợp sẵn</translation> +<translation id="6504720469162323184">Nếu bạn đặt chính sách này, hệ thống sẽ xác định khoảng thời gian (tính bằng mili giây) không có hoạt động của người dùng trước khi tự động đăng nhập vào tài khoản trên thiết bị được chỉ định theo chính sách <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" />. + +Nếu bạn không đặt chính sách này, thời gian chờ sẽ là 0 mili giây. + +Nếu bạn không đặt chính sách <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" />, chính sách này sẽ không có hiệu lực.</translation> <translation id="65055701428353978">Đặt chính sách này để chỉ định một danh sách URL chuyển hướng OAuth cho mỗi tiện ích chịu ảnh hưởng. Các tiện ích có API <ph name="IDENTITY_API_NAME" /> (<ph name="IDENTITY_API_URL" />) có thể sử dụng danh sách URL này, bên cạnh URL chuyển hướng chuẩn https://<mã nhận dạng tiện ích>.chromiumapp.org/. Nếu bạn không đặt chính sách này hoặc cung cấp một danh sách URL trống, thì tất cả ứng dụng hoặc tiện ích chỉ có thể sử dụng URL chuyển hướng chuẩn khi sử dụng API <ph name="IDENTITY_API_NAME" />.</translation> @@ -6464,6 +6519,7 @@ Xin lưu ý rằng EnabledPlugins và DisabledPluginsExceptions có thể ghi đè chính sách này. Nếu bạn không đặt chính sách này, thì người dùng có thể sử dụng bất kỳ plugin nào được cài đặt trên hệ thống, ngoại trừ các plugin không tương thích, lỗi thời hoặc nguy hiểm đã được mã hóa cứng.</translation> +<translation id="6571055160227165318">Cho phép bật WebSQL qua cờ Chrome.</translation> <translation id="6574903167639386816">Xoá dữ liệu hồ sơ trên ổ đĩa khi phiên người dùng kết thúc</translation> <translation id="6575403002861093126">Nếu bạn đặt chính sách này, hệ thống sẽ chỉ định thời gian tồn tại (tính theo giờ) của bộ nhớ đệm Đối tượng chính sách nhóm (GPO) – thời lượng tối đa có thể sử dụng lại các GPO trước khi tải các GPO này xuống lần nữa. Thay vì tải các GPO xuống lần nữa trong mỗi lần tìm nạp chính sách, hệ thống có thể sử dụng lại các GPO đã lưu vào bộ nhớ đệm, miễn là phiên bản của các GPO này không thay đổi. @@ -6592,6 +6648,11 @@ Nếu bạn đặt thành Tắt hoặc không đặt chính sách này, thì các lệnh in sẽ kích hoạt màn hình xem trước bản in.</translation> <translation id="6655274714135630366">Hàm băm SHA-256 được mã hoá thập lục phân của hình ảnh đĩa.</translation> +<translation id="6655844456903132379">Nếu bạn đặt chính sách này thành Enabled (Bật), thì quá trình xác thực HTTP sẽ áp dụng kết quả phê duyệt theo chính sách KDC. Nói cách khác, <ph name="PRODUCT_NAME" /> sẽ uỷ quyền thông tin đăng nhập của người dùng cho dịch vụ được truy cập nếu KDC đặt <ph name="OK_AS_DELEGATE" /> trên một vé dịch vụ. Hãy xem RFC 5896 (https://tools.ietf.org/html/rfc5896.html). Dịch vụ này cũng phải được <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> cho phép. + +Nếu bạn đặt thành Disabled (Tắt) hoặc không đặt chính sách này, thì chính sách KDC sẽ bị bỏ qua trên các nền tảng được hỗ trợ và chỉ <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> được áp dụng. + +Chính sách KDC luôn áp dụng trên <ph name="MS_WIN_NAME" />.</translation> <translation id="6658245400435704251">Chỉ định số giây tối đa mà thiết bị có thể ngẫu nhiên trì hoãn việc tải xuống bản cập nhật từ thời điểm bản cập nhật được đưa lên máy chủ lần đầu tiên. Thiết bị có thể đợi một phần số thời gian này là thời gian thực và phần thời gian còn lại là thời gian kiểm tra bản cập nhật. Trong bất kỳ trường hợp nào, việc phân tán bị chặn trên ở lượng thời gian cố định để thiết bị không bao giờ phải chờ mãi để tải xuống bản cập nhật.</translation> <translation id="6659537776197644458">Không kích hoạt quy trình xác thực cho tính năng đồng bộ hóa mật khẩu</translation> <translation id="6661178198729301029">Bật tính năng báo cáo trên đám mây qua hồ sơ được quản lý</translation> @@ -7147,6 +7208,11 @@ Nếu bạn tắt chính sách, thì hệ thống sẽ vô hiệu hóa chức năng này.</translation> <translation id="7123271473727774529">Bật tính năng hỗ trợ tiếp cận chỉnh màu</translation> <translation id="7126716959063786004">Cho phép kết thúc các quá trình trong Trình quản lý tác vụ</translation> +<translation id="7126787606641224668">Kiểm soát việc có bật tính năng "Ghi nhớ mật khẩu" trong hộp thoại xác thực Kerberos hay không. Mật khẩu được lưu trữ dưới dạng mã hoá trên ổ đĩa. Chỉ trình nền hệ thống Kerberos mới có thể truy cập vào những mật khẩu này và sẽ chỉ truy cập được trong phiên hoạt động của người dùng. + +Nếu bạn bật hoặc chưa đặt chính sách này, thì người dùng có thể quyết định việc hệ thống có ghi nhớ mật khẩu Kerberos để không phải nhập lại hay không. Hệ thống sẽ tự động tìm nạp các vé Kerberos trừ phi cần có bước xác thực bổ sung (xác thực hai yếu tố). + +Nếu bạn tắt chính sách này, thì hệ thống sẽ không bao giờ ghi nhớ mật khẩu và mọi mật khẩu đã lưu trữ trước đây đều bị xoá. Người dùng phải nhập mật khẩu của mình mỗi khi cần xác thực với hệ thống Kerberos. Tuỳ thuộc vào các chế độ cài đặt của máy chủ, điều này thường diễn ra từ 8 giờ một lần đến vài tháng một lần.</translation> <translation id="7126928806195745404">Cài đặt JavaScript</translation> <translation id="7127980134843952133">Dữ liệu về các tệp đã tải xuống</translation> <translation id="7128513247945602297">Bật tính năng tự động nâng cấp nội dung hỗn hợp trên các trang web HTTPS</translation> @@ -7213,6 +7279,9 @@ <translation id="7157329428182136164">Bật tính năng hỗ trợ cho API đồ họa 3D</translation> <translation id="7158358621906236999">Tùy chọn cài đặt mặc định của cảm biến</translation> <translation id="7161568070244869726">Buộc bật Bộ nhớ đệm của ứng dụng</translation> +<translation id="7165879643294314958">Nếu bạn đặt thành Enabled (Bật) hoặc không đặt chính sách này, thì hệ thống sẽ thiết lập phiên tự động đăng nhập có độ trễ bằng 0 cho một tài khoản trên thiết bị. <ph name="PRODUCT_OS_NAME" /> dùng phím tắt Ctrl+Alt+S để bỏ qua việc tự động đăng nhập và hiển thị màn hình đăng nhập. + +Nếu bạn đặt chính sách này thành Disabled (Tắt), người dùng sẽ không thể bỏ qua phiên tự động đăng nhập có độ trễ bằng 0 (nếu đã định cấu hình).</translation> <translation id="7165882688932913315">Chính sách này kiểm soát quyền truy cập vào các tính năng có thể kiểm soát trong giao diện người dùng tìm thiết bị cục bộ (<ph name="CHROME_DEVICES_LINK" />). Giao diện này sẽ hiển thị các thiết bị có thể tìm ở gần người dùng, cũng như các thiết bị trên đám mây được đăng ký với những thiết bị đó. Trên tất cả hệ điều hành ngoại trừ <ph name="PRODUCT_OS_NAME" />, giao diện người dùng tìm thiết bị cục bộ cũng cho phép người dùng thêm các máy in cũ đã kết nối với máy tính của họ với <ph name="CLOUD_PRINT_NAME" />. Nếu bạn đặt chính sách này thành Bật hoặc không đặt chính sách này, thì hệ thống sẽ cho phép tìm thiết bị cục bộ. @@ -7329,6 +7398,11 @@ <translation id="7269263983506766969">Dùng mức ưu tiên mặc định cho tiến trình âm thanh</translation> <translation id="7270001383428188269">Giá trị nhận dạng của chứng chỉ máy khách này.</translation> <translation id="7271085005502526897">Nhập trang chủ từ trình duyệt mặc định trong lần chạy đầu tiên</translation> +<translation id="7272892848025145170">Kiểm soát việc có bật chức năng Kerberos hay không. Kerberos là một giao thức xác thực có thể dùng để xác thực các ứng dụng web và mục chia sẻ tệp. + +Nếu bạn bật chính sách này, chức năng Kerberos sẽ bật. Người dùng có thể thêm tài khoản Kerberos thông qua chính sách "Định cấu hình các tài khoản Kerberos" hoặc thông qua phần Cài đặt tài khoản Kerberos trên trang Cài đặt Kerberos. + +Nếu bạn tắt hoặc không đặt chính sách này, thì các chế độ cài đặt của Tài khoản Kerberos sẽ tắt. Người dùng không thể thêm tài khoản Kerberos và sử dụng tính năng xác thực Kerberos. Tất cả tài khoản Kerberos hiện có và mọi mật khẩu đã lưu trữ sẽ bị xoá.</translation> <translation id="7273785848231509306">Không bao giờ hiển thị ảnh và tên người dùng</translation> <translation id="7274077256421167535">Bật tính năng sạc pin qua USB</translation> <translation id="7275334191706090484">Dấu trang được quản lý</translation> @@ -7996,6 +8070,9 @@ Nếu bạn không đặt chính sách này, thì ban đầu, chế độ tương phản cao sẽ tắt trên màn hình đăng nhập nhưng người dùng có thể bật bất cứ lúc nào.</translation> <translation id="7864539943188674973">Tắt bluetooth</translation> <translation id="7869986671709030417">Chế độ in đồ họa nền mặc định</translation> +<translation id="7872692545596413465">Nếu bạn đặt chính sách này thành Enabled (Bật) và nhập một cổng không theo chuẩn (nói cách khác, một cổng không phải là 80 hoặc 443), thì hệ thống sẽ đưa cổng đó vào SPN Kerberos được tạo. + +Nếu bạn đặt thành Disabled (Tắt) hoặc không đặt chính sách này, thì SPN Kerberos được tạo sẽ không bao gồm cổng.</translation> <translation id="7877924399554599110">Cho phép hợp nhất các chính sách đám mây ở cấp người dùng với các chính sách ở cấp máy</translation> <translation id="7881421274383404138">Việc đặt chính sách này sẽ định cấu hình các máy in của doanh nghiệp. Định dạng của chính sách khớp với định dạng của từ điển <ph name="PRINTERS_POLICY_NAME" />, có thêm một trường <ph name="ID_FIELD" /> hoặc <ph name="GUID_FIELD" /> bắt buộc cho từng máy in để đưa vào danh sách cho phép hoặc danh sách từ chối. Kích thước tệp không được vượt quá 5 MB và phải ở định dạng JSON. Một tệp có khoảng 21.000 máy in sẽ mã hóa dưới dạng tệp 5 MB. Hàm băm mật mã giúp xác minh tính toàn vẹn của tệp tải xuống. Tệp này được tải xuống, lưu vào bộ nhớ đệm và tải lại xuống khi URL hoặc hàm băm thay đổi. <ph name="PRODUCT_OS_NAME" /> tải tệp này xuống để định cấu hình máy in và cung cấp các máy in theo đúng <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" />, và <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" />. @@ -8048,6 +8125,11 @@ Chính sách doanh nghiệp này được đưa ra để cho phép quản trị viên kiểm soát việc người dùng của họ có thể bật tính năng điều tiết bổ sung hay không. Khi bạn đặt chính sách này thành tắt, người dùng sẽ không thể bật tính năng điều tiết. Khi bạn đặt chính sách này thành bật hoặc không đặt, người dùng có thể chọn sử dụng tính năng điều tiết hoặc có thể bật tính năng này thông qua các biến thể của Chrome.</translation> <translation id="793188693675675950">Tắt chính sách nhập trang chủ trong lần chạy đầu tiên</translation> +<translation id="7932017046032784156">Nếu bạn đặt chính sách này thành Enabled (Bật), thì biểu tượng thanh công cụ Cast sẽ hiển thị trên thanh công cụ hoặc trình đơn mục bổ sung và người dùng sẽ không thể gỡ bỏ biểu tượng này. + +Nếu bạn đặt chính sách này thành Disabled (Tắt) hoặc không đặt chính sách này, thì người dùng có thể ghim hoặc gỡ bỏ biểu tượng này thông qua trình đơn theo bối cảnh của biểu tượng. + +Nếu bạn đặt chính sách <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> thành Disabled (Tắt), thì giá trị của chính sách này sẽ không có hiệu lực và biểu tượng thanh công cụ sẽ không xuất hiện.</translation> <translation id="7933141401888114454">Cho phép tạo người dùng được giám sát</translation> <translation id="793473937901685727">Đặt mức độ khả dụng của chứng chỉ cho ứng dụng ARC</translation> <translation id="7936302526928951356">Chuỗi User-Agent sẽ không làm phiên bản lớn dừng lại.</translation> @@ -8817,6 +8899,9 @@ <translation id="8584279193368801689">Hạn chế chế độ in mã PIN. Khi bạn không đặt chính sách này, thì tức là không có hạn chế. Nếu không có chế độ này thì chính sách này sẽ bị bỏ qua. Xin lưu ý rằng tính năng in mã PIN chỉ được bật cho những máy in sử dụng một trong các giao thức IPPS, HTTPS, USB hoặc IPP qua USB.</translation> <translation id="8587229956764455752">Cho phép tạo tài khoản người dùng mới</translation> <translation id="8589285015138337712">Không cho phép người dùng tuỳ chỉnh phím tắt hệ thống</translation> +<translation id="8589346048177748110">Nếu bạn đặt chính sách này thành True, thì người dùng có thể chơi trò chơi khủng long. Nếu bạn đặt chính sách này thành False, thì người dùng không thể chơi trò chơi khủng long (trò chơi ẩn) khi thiết bị không có kết nối mạng. + +Nếu bạn không đặt chính sách này, thì người dùng không thể chơi trò chơi đó trên <ph name="PRODUCT_OS_NAME" /> đã đăng ký nhưng vẫn có thể chơi trong những trường hợp khác.</translation> <translation id="8591713876665299827">Lưu ý rằng chúng tôi không dùng chính sách này nữa và sẽ xóa khỏi <ph name="PRODUCT_OS_NAME" /> phiên bản 85. Thay vào đó, vui lòng sử dụng <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Chỉ định khoảng thời gian kể từ lần cuối cùng người dùng nhập cho đến thời điểm thực hiện hành động ở chế độ tạm vắng đó khi chạy bằng nguồn điện xoay chiều.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index 9c431dcab..22b502cf 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -958,6 +958,11 @@ <translation id="1861206724856734193">设置一系列规则,防止数据泄露。</translation> <translation id="1862267110714201519">停用“ghost 窗口”功能。</translation> <translation id="1865417998205858223">密钥使用权限</translation> +<translation id="1865867000796030567">如果此政策已启用,那么零延迟、自动启动的自助服务终端应用的 <ph name="REQUIRED_PLATFORM_VERSION" /> 清单键值便会被用作自动更新目标版本前缀。 + +如果此政策已停用或未设置,<ph name="REQUIRED_PLATFORM_VERSION" /> 清单键便会被忽略,并且系统会按照常规流程进行自动更新。 + +警告:不得将 <ph name="PRODUCT_OS_NAME" /> 的版本控制权委派给自助服务终端应用,否则这可能会阻止设备获取软件更新和重要的安全修复。委派 <ph name="PRODUCT_OS_NAME" /> 版本控制权可能会将用户置于风险之中。</translation> <translation id="186719019195685253">当闲置延迟时间已过且使用交流电源供电时执行的操作</translation> <translation id="1869688072690234823">通过设置此政策,您可以控制使用哪些 WebAuthn 因素。若要: @@ -1204,6 +1209,11 @@ 如果此政策未设置或设为一个空列表,用户将无法在受管理的设备上使用任何快速解锁模式。 此政策已被弃用,请改用 <ph name="QUICK_UNLOCK_MODE_ALLOW_LIST_POLICY_NAME" /></translation> +<translation id="2035995535603698706">如果已启用此政策,系统会允许网页上的第三方图片显示身份验证提示。 + +如果已停用或未设置此政策,第三方图片将无法显示身份验证提示。 + +通常,为防御钓鱼式攻击,此政策将被停用。</translation> <translation id="2036522553891755455">如果此政策已启用,共享文件发现功能(<ph name="PRODUCT_NAME" />的网络文件共享功能)会使用 <ph name="NETBIOS_PROTOCOL" />来搜寻网络上的共享文件。如果此政策已停用,共享文件发现功能将不会使用此协议来搜寻共享文件。 如果您未设置此政策,系统的默认行为就会是:为受管用户停用此政策,并为其他用户启用此政策。</translation> @@ -1370,6 +1380,19 @@ 如需详细了解<ph name="WEBXR_AR_SESSION_ENUM_VALUE" />会话,请查看 <ph name="WEBXR_AR_MODULE_API_NAME" />规范。</translation> <translation id="2175353308236295184">包含一系列键值对的应用专属 JSON 配置对象,例如“"managedConfiguration": { "key1": value1, "key2": value2 }”。这些键是在应用清单中定义的。</translation> <translation id="2176115444876446233">阻止用户收集系统级性能跟踪记录。</translation> +<translation id="2177382213857119200">让您能够控制是否开启 <ph name="PRODUCT_NAME" /> 的“安全浏览”功能以及要在哪种模式下运行此功能。 + + 如果此政策设为“NoProtection”(值为 0),“安全浏览”功能会一直处于关闭状态。 + + 如果此政策设为“StandardProtection”(值为 1,即默认值),“安全浏览”功能会一直处于开启状态且会在标准模式下运行。 + + 如果此政策设为“EnhancedProtection”(值为 2),“安全浏览”功能会一直处于开启状态且会在增强模式下运行。这种模式可提高安全性,但需与 Google 分享更多浏览信息。 + + 如果您将此政策设为强制性要求,用户便无法更改或覆盖 <ph name="PRODUCT_NAME" /> 中的“安全浏览”设置。 + + 如果未设置此政策,“安全浏览”功能将会在标准保护模式下运行,但用户可以自行更改此设置。 + + 如需详细了解“安全浏览”功能,请访问 https://support.google.com/chrome?p=safe_browsing_preferences。</translation> <translation id="2177696016354404697">始终停用隐私保护屏幕</translation> <translation id="2178899310296064282">至少强制启用 YouTube“适中”受限模式</translation> <translation id="2180958780733364832">控制对无头模式的使用权限</translation> @@ -2008,6 +2031,11 @@ 如果此政策设为 false,PDF 查看器将无法在 PDF 文件中添加注释。</translation> <translation id="2769952903507981510">为远程访问主机配置所需的域名</translation> +<translation id="2770376586681635746">控制用户是否可以添加 Kerberos 账号。 + +如果此政策已启用或未设置,用户将可以通过 Kerberos 设置页中的“Kerberos 账号”设置来添加 Kerberos 账号。用户对自己添加的账号拥有完全控制权,可以修改或移除这些账号。 + +如果此政策已停用,用户将无法添加 Kerberos 账号。此时,只能通过“配置 Kerberos 账号”政策添加 Kerberos 账号。这一方式可以有效地锁定账号。</translation> <translation id="2772231477628401250">使用 HTTP 下载更新</translation> <translation id="2772955711376920612">如果此政策已启用,且 <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME" /> 和 <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME" /> 均已设置,“用电高峰期切换电源”功能会保持开启状态(如果相应设备支持的话)。“用电高峰期切换电源”电源管理政策是一种节电政策,可在用电高峰期间尽可能少用交流电。您可分别为每个工作日设置“用电高峰期切换电源”模式的运行开始时间和结束时间。在您所设定的时段内,只要电池电量高于指定阈值,即使连接了交流电,设备也会仅使用电池来维持运行。待指定的结束时间过后,设备会使用交流电(如果已连接)来维持运行,但不会为电池充电。待指定的充电开始时间过后,设备会恢复正常运行方式,使用交流电来维持运行并为电池充电。 @@ -3722,6 +3750,9 @@ 如果此政策未设置,系统 DNS 解析可能在网络服务中运行,也可能在网络服务外运行,或部分在网络服务中、部分在网络服务外运行,具体取决于系统配置和功能标志。</translation> <translation id="4239720644496144453">缓存不适用于 Android 应用。如果多个用户都想安装同一款 Android 应用,系统便会分别为每个用户重新下载相应的 Android 应用。</translation> <translation id="424318624725112807">允许在登录屏幕上使用插入符号突出显示</translation> +<translation id="4245159233848584683">如果此政策已启用或未设置,当设备离线时,如果系统已设置设备本地账号以实现零延迟的自动登录,<ph name="PRODUCT_OS_NAME" /> 会显示网络配置提示。 + +如果此政策已停用,系统则会显示错误消息。</translation> <translation id="4248277954659222481">允许符合网址格式许可名单中所列格式的网页自动播放媒体内容</translation> <translation id="4250680216510889253">否</translation> <translation id="4252522848899331223">允许用户绕过安全浏览警告</translation> @@ -3872,6 +3903,11 @@ <translation id="4410236409016356088">启用网络带宽限制功能</translation> <translation id="4411734231900934213">孩子设备上的时钟和家长设备上的时钟可以相差多少(以秒为单位)。</translation> <translation id="441217499641439905">在 <ph name="PRODUCT_OS_NAME" />的“文件”应用中,不允许通过移动网络连接到 Google 云端硬盘</translation> +<translation id="4412885120239670573">如果此政策已启用,系统会在 <ph name="PRODUCT_NAME" /> 中停用内部 PDF 查看器,将 PDF 文件视为下载项,并允许用户使用默认应用打开 PDF 文件。 + +如果此政策已停用,则意味着系统会使用 PDF 插件打开 PDF 文件,除非用户已关闭该插件。 + +如果您已设置此政策,用户将无法在 <ph name="PRODUCT_NAME" /> 中更改相关设置。如果您未设置此政策,用户便可选择是否要在外部打开 PDF。</translation> <translation id="4413453659814156568">让您能够设置一系列网站网址格式,从而指定允许哪些网站在运行 JavaScript 时启用 JIT(即时)编译器。 如需详细了解有效网站网址格式,请访问 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。<ph name="WILDCARD_VALUE" /> 不是此政策可接受的值。 @@ -3979,6 +4015,7 @@ <translation id="4482784169143060077">启用自动 HTTPS 升级</translation> <translation id="4483120730995943109">超时设置为 0 毫秒的 JavaScript setTimeout() 将不会延迟到 1 毫秒。</translation> <translation id="4483649828988077221">停用自动更新功能</translation> +<translation id="4483738129334574255">在已注册的 <ph name="PRODUCT_OS_NAME" /> 设备上停用恐龙复活节彩蛋游戏(在其他情况下启用)</translation> <translation id="4484515651939984695">指定使用访问代码或二维码选择的投放设备会在 <ph name="PRODUCT_NAME" /> 菜单的投放设备列表中保留多长时间(以秒为单位)。</translation> <translation id="4485425108474077672">配置“打开新的标签页”页面网址</translation> <translation id="4490420545181481759">X.509 证书可能会对证书扩展项中的限制条件(例如名称限制条件)进行编码。RFC 5280 规定,对信任锚证书强制执行此类限制条件是一项可选操作。从 <ph name="PRODUCT_NAME" /> 112 版开始,系统将对从平台证书存储区加载的证书强制执行此类限制条件。 @@ -4278,6 +4315,7 @@ 只有当 <ph name="MAC_OS_NAME" /> 实例是通过 MDM 进行管理、已通过 MCX 加入网域或已注册 <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />时,才能在该实例上强制安装并非来自 Chrome 应用商店的应用和扩展程序。</translation> <translation id="4742973303930120836">限制背景图片打印模式</translation> +<translation id="4744467872051608680">自 M119 起,如果此政策设为 false 或未设置,系统会停用 WebSQL,但用户可以通过 Chrome flag“web-sql-access”来启用 WebSQL。如果此政策设为 true,系统会启用 WebSQL 访问权限。</translation> <translation id="4745232963710538589">启用数据洞见扩展程序以报告使用情况指标</translation> <translation id="4749670563834935149">旨在以列表形式为登录界面和锁定的屏幕上的一系列网址启用 <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" />。 @@ -4854,6 +4892,9 @@ 如需详细了解有效的<ph name="URL_LABEL" />格式,请访问 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。此政策只能根据来源进行匹配,因此网址格式中的任何路径都会被忽略。</translation> <translation id="5318185076587284965">允许远程访问主机使用中继服务器</translation> +<translation id="5321624917465764266">如果此政策已启用或未设置,系统将可以删除 Chrome 中的浏览器历史记录和下载记录,并且用户无法更改此设置。 + +如果此政策已停用,系统将无法删除浏览器历史记录和下载记录。即使此政策停用,浏览和下载记录也不一定会保留。用户可能能够直接修改或删除历史记录数据库文件,而且浏览器本身也可能会随时将任意或所有历史记录项设为失效或进行归档。</translation> <translation id="5323200200131319468">在登录屏幕上启用语音反馈</translation> <translation id="5323271643727095577">针对 beforeunload 事件调用 event.preventDefault() 时不显示取消对话框。当 beforeunload 事件的 event.returnValue 是空字符串时,显示取消对话框。</translation> <translation id="5323355956693037267">为登录屏幕启用屏幕键盘</translation> @@ -5092,6 +5133,9 @@ <translation id="5535256585099022933">设置重新启动时间间隔</translation> <translation id="553806128266843748">一个布尔值标记,用于表明是否启用节流功能。</translation> <translation id="5540885720415375851">允许使用“本地设备发现”功能</translation> +<translation id="5542235730745104308">如果此政策设为 True,<ph name="PRODUCT_NAME" /> 会使用内置的备用错误页面(例如“找不到网页”)。如果此政策设为 False,<ph name="PRODUCT_NAME" /> 将一律不使用备用错误页面。 + +如果您设置了此政策,用户便无法更改相关设置。如果您未设置此政策,系统会开启它,但用户可以更改此设置。</translation> <translation id="5544059132156503357">通过设置此政策,您可以指定能使用哪些加密类型向 <ph name="MS_AD_NAME" /> 服务器请求 Kerberos 票据。 如果此政策设为: @@ -5842,6 +5886,9 @@ <translation id="625580680776945310">将启用高效模式。</translation> <translation id="6258658183356534534">控制 User-Agent Client Hints GREASE Update 功能。</translation> <translation id="6261643884958898336">报告机器标识信息</translation> +<translation id="6264247808139384018">如果此政策已启用或未设置,使用密码验证身份的用户便可以锁定屏幕。 + +如果此政策已停用,用户将无法锁定屏幕(只能退出用户会话)。</translation> <translation id="6265892395051519509">允许在这些网站上使用传感器</translation> <translation id="6266043141694454734">确定是否使用 Chrome 根存储区和内置的证书验证程序来验证服务器证书</translation> <translation id="6267130578410325007">此政策默认允许使用以源为键的代理集群。 @@ -6074,6 +6121,9 @@ <translation id="6412352702230183710">仅允许使用系统级原生消息传递主机</translation> <translation id="6416506846917150119">在用户输入内容时停用实体键盘预测性撰写功能</translation> <translation id="6417265370957905582">Google 助理</translation> +<translation id="6421254653839955267">如果此政策已启用,系统便会跳过 CNAME 查找步骤。当生成 Kerberos SPN 时,系统会使用输入的服务器名称。 + +如果此政策已停用或未设置,当生成 Kerberos SPN 时,服务器的规范名称将由 CNAME 查找来决定。</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6424486395812679373">对所有下载的文件执行安全浏览检查</translation> <translation id="6433697627431665375">阻止 <ph name="PRODUCT_NAME" /> 数据包含在备份中</translation> @@ -6210,6 +6260,11 @@ 指定的政策值应以毫秒为单位,且必须小于闲置延迟时间。</translation> <translation id="6497085755801788141">使用内置证书验证程序</translation> +<translation id="6504720469162323184">通过设置此政策,您可以规定用户停止活动多久(毫秒)后系统才自动登录由 <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> 政策指定的设备本地账号。 + +如果您不设置此政策,则超时时间为 0 毫秒。 + +如果 <ph name="DEVICE_LOCAL_ACCOUNT_AUTO_LOGIN_ID_POLICY_NAME" /> 政策未设置,此政策将不会产生任何效力。</translation> <translation id="65055701428353978">通过设置此政策,您可为每个受影响的扩展程序指定一个 OAuth 重定向网址列表。当相应扩展程序使用 <ph name="IDENTITY_API_NAME" /> API (<ph name="IDENTITY_API_URL" />) 时,除了可搭配使用标准 https://<扩展程序 id>.chromiumapp.org/ 重定向网址,还可搭配使用该列表中的网址。 如果您未设置此政策或提供空的网址列表,则所有应用或扩展程序在使用 <ph name="IDENTITY_API_NAME" /> API 时只能使用标准重定向网址。</translation> @@ -6309,6 +6364,7 @@ 请注意,此政策可被 EnabledPlugins 和 DisabledPluginsExceptions 覆盖。 如果未设置此政策,则用户可以使用系统中安装的任何插件,经过硬编码且不兼容、已过期或危险的插件除外。</translation> +<translation id="6571055160227165318">允许通过 Chrome flag 启用 WebSQL。</translation> <translation id="6574903167639386816">当用户会话结束时清除磁盘上的个人资料数据</translation> <translation id="6575403002861093126">通过设置此政策,您可以指定群组政策对象 (GPO) 缓存期限(以小时为单位),即 GPO 在不必重新下载的情况下可被重复使用的时长上限。只要 GPO 的版本未变,系统便会重复使用已缓存的 GPO,而不是在每次提取政策时都重新下载 GPO。 @@ -6437,6 +6493,11 @@ 如果此政策已停用或未设置,打印命令将触发打印预览屏幕。</translation> <translation id="6655274714135630366">磁盘映像的十六进制编码 SHA-256 哈希。</translation> +<translation id="6655844456903132379">如果此政策已启用,HTTP 身份验证机制会遵循 KDC 政策的审批结果。换言之,如果 KDC 政策在服务工单上设置了 <ph name="OK_AS_DELEGATE" />,<ph name="PRODUCT_NAME" /> 便会向正在访问的服务委派用户凭据。请参阅 RFC 5896 ( https://tools.ietf.org/html/rfc5896.html )。<ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> 也应允许使用该服务。 + +如果此政策已停用或未设置,那么在支持的平台上,只会遵循 <ph name="AUTH_NEGOTIATE_DELEGATE_ALLOWLIST_POLICY_NAME" /> 政策,KDC 政策会被忽略。 + +在 <ph name="MS_WIN_NAME" /> 上,始终都会遵循 KDC 政策。</translation> <translation id="6658245400435704251">指定一个时间(以秒为单位),即从更新首次推送到服务器起设备随机延迟更新下载的最大时间。设备的这一等待时间一部分会按照实际时间计算,而剩下的部分则取决于更新检查的次数。在任何情况下,分配的时间上限都是固定的,因此设备绝不会一直等待下载某个更新。</translation> <translation id="6659537776197644458">不为密码同步触发身份验证流程</translation> <translation id="6661178198729301029">为受管理个人资料启用云报告功能</translation> @@ -6974,6 +7035,11 @@ 如果此政策设为 False,系统将停用该功能。</translation> <translation id="7123271473727774529">启用色彩校正无障碍功能</translation> <translation id="7126716959063786004">允许在任务管理器中结束进程</translation> +<translation id="7126787606641224668">控制“记住密码”功能在 Kerberos 身份验证对话框中是否处于启用状态。密码会以加密方式存储在磁盘上,只可在用户会话期间由 Kerberos 系统守护程序访问。 + +如果已启用或未设置此政策,用户可以决定是否记住 Kerberos 密码,记住密码后就不需要重新输入密码。除非需要进行额外的身份验证(双重身份验证),否则系统会自动获取 Kerberos 票据。 + +如果停用了此政策,系统永远不会记住密码,并会移除之前存储的所有密码。每当需要向 Kerberos 系统验证身份时,用户都必须输入密码。这种情况通常每 8 小时到数月时间就会发生一次,具体取决于服务器设置。</translation> <translation id="7126928806195745404">JavaScript 设置</translation> <translation id="7127980134843952133">下载记录</translation> <translation id="7128513247945602297">允许 HTTPS 网站上的混合内容自动升级</translation> @@ -7040,6 +7106,9 @@ <translation id="7157329428182136164">启用对 3D 图形 API 的支持</translation> <translation id="7158358621906236999">默认传感器设置</translation> <translation id="7161568070244869726">强制启用 AppCache</translation> +<translation id="7165879643294314958">如果此政策已启用或未设置,系统将设置设备本地账号以实现零延迟的自动登录。<ph name="PRODUCT_OS_NAME" /> 支持利用键盘快捷键 Ctrl + Alt + S 绕过自动登录并显示登录屏幕。 + +如果此政策已停用,用户将无法绕过零延迟的自动登录(若已配置)。</translation> <translation id="7165882688932913315">此政策用于控制对本地设备发现界面 (<ph name="CHROME_DEVICES_LINK" />) 中的可控制功能的访问权限,该界面会显示可在用户附近发现的设备以及已注册到这些设备的云端设备。在除 <ph name="PRODUCT_OS_NAME" />之外的所有其他操作系统中,本地设备发现界面还允许用户将与其计算机相连的传统打印机添加到 <ph name="CLOUD_PRINT_NAME" />。 如果此政策已启用或未设置,系统会允许使用“本地设备发现”功能。 @@ -7155,6 +7224,11 @@ <translation id="7269263983506766969">对音频进程使用默认优先级</translation> <translation id="7270001383428188269">此客户端证书的标识符。</translation> <translation id="7271085005502526897">首次运行时,从默认浏览器导入主页</translation> +<translation id="7272892848025145170">控制是否启用 Kerberos 功能。Kerberos 是一种身份验证协议,可用于向 Web 应用及文件共享功能验证身份。 + +如果此政策已启用,Kerberos 功能会处于启用状态。您可以通过“配置 Kerberos 账号”政策或通过 Kerberos 设置页中的“Kerberos 账号”设置来添加 Kerberos 账号。 + +如果此政策已停用或未设置,Kerberos 账号设置会处于停用状态。此时,您无法添加任何 Kerberos 账号,也无法使用 Kerberos 身份验证功能。系统会删除所有现有 Kerberos 账号以及所有已存储的密码。</translation> <translation id="7273785848231509306">从不显示用户名和照片</translation> <translation id="7274077256421167535">启用 USB 电源共享</translation> <translation id="7275334191706090484">受管理的书签</translation> @@ -7814,6 +7888,9 @@ 如果您未设置此政策,高对比度模式在登录屏幕上最初会处于停用状态,但用户可随时启用它。</translation> <translation id="7864539943188674973">停用蓝牙</translation> <translation id="7869986671709030417">默认背景图片打印模式</translation> +<translation id="7872692545596413465">如果您启用了此政策并输入了非标准端口(换言之,80 或 443 以外的端口),系统便会将此端口包含在生成的 Kerberos SPN 中。 + +如果此政策已停用或未设置,生成的 Kerberos SPN 便不会包含端口。</translation> <translation id="7877924399554599110">允许将用户级云政策合并到计算机级政策中</translation> <translation id="7881421274383404138">通过设置此政策,您可以配置企业打印机。其格式与 <ph name="PRINTERS_POLICY_NAME" /> 字典一样,不过每台打印机都还对应一个额外的必填字段<ph name="ID_FIELD" />或<ph name="GUID_FIELD" />,以用于将相应打印机加入许可名单/拒绝名单。该文件不得超过 5MB,且必须采用 JSON 格式。一个包含大约 21000 台打印机的文件在编码后的大小是 5MB。相应的加密哈希值可帮助您验证下载内容的完整性。系统会下载、缓存该文件。当相应网址或哈希值发生变化时,系统会重新下载该文件。<ph name="PRODUCT_OS_NAME" />会下载该文件以获取打印机配置,并会根据 <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />、<ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> 和 <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME" /> 向用户提供可用的打印机。 @@ -7866,6 +7943,11 @@ 这项企业政策允许管理员控制用户能否启用额外的节流功能。如果停用此政策,系统会阻止启用节流功能。如果启用或未设置此政策,用户可以选择启用节流功能,或通过 Chrome 变体启用该功能。</translation> <translation id="793188693675675950">禁止在首次运行时导入主页</translation> +<translation id="7932017046032784156">如果此政策已启用,系统会在工具栏或溢出菜单中显示 Cast 工具栏图标,而且用户无法移除该图标。 + +如果此政策已停用或未设置,用户便可通过该图标的上下文菜单来固定或移除该图标。 + +如果 <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> 政策设为停用,此政策的值不会产生任何效力,所以 Cast 工具栏图标不会显示。</translation> <translation id="7933141401888114454">允许创建受监管用户</translation> <translation id="793473937901685727">为 ARC 应用设置证书可用性</translation> <translation id="7936302526928951356">User-Agent 字符串不会冻结主要版本。</translation> @@ -8612,6 +8694,9 @@ <translation id="8584279193368801689">限制 PIN 码打印模式。如果此政策未设置,则会被视为无限制。如果所设的模式不适用,系统会忽略此政策。请注意,PIN 码打印功能仅针对使用 IPPS、HTTPS、USB 或 IPP-over-USB 协议之一的打印机启用。</translation> <translation id="8587229956764455752">允许创建新的用户账号</translation> <translation id="8589285015138337712">禁止用户自定义系统快捷方式</translation> +<translation id="8589346048177748110">如果此政策设为 True,用户可以玩恐龙游戏。如果此政策设为 False,用户无法在设备处于离线状态时玩恐龙复活节彩蛋游戏。 + +如果此政策未设置,用户无法在已注册的 <ph name="PRODUCT_OS_NAME" /> 上玩恐龙游戏,但可在其他环境下玩这款游戏。</translation> <translation id="8591713876665299827">请注意,此政策已被弃用,并将在 <ph name="PRODUCT_OS_NAME" />版本 85 中移除。请改用 <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />。 指定当使用交流电源供电时系统应在设备闲置多久后采取闲置操作。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 16f8307..721a02a2 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -5509,6 +5509,7 @@ <translation id="6042407236638640864">允許將含有 <ph name="CACHE_CONTROL_NO_STORE_NAME" /> 標頭的網頁儲存在往返快取中</translation> <translation id="604243460476563291">不允許企業管理員在遠端支援連線時傳輸檔案</translation> <translation id="6042629184389251062">不允許輸入網址指標收集功能</translation> +<translation id="6045733613334942660">掃描器驅動程式</translation> <translation id="6046615715547751255">禁止使用精細回報控制項</translation> <translation id="6048199181629830227">開啟用電尖峰轉移電源管理功能</translation> <translation id="6048690591359317353">不允許使用者手動中斷連線或修改 VPN</translation> @@ -7313,6 +7314,7 @@ 如果不設定這項政策,受企業管理使用者的預設值為 <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />;其他未受管理使用者的預設值則為 <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" />。 日後也可以使用 <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" /> 一值,將 <ph name="LACROS_NAME" /> 設為 <ph name="PRODUCT_OS_NAME" /> 中唯一可用的瀏覽器。</translation> +<translation id="751071954873065775">選取要預先下載的可下載內容 (DLC)</translation> <translation id="7512065400265675158">已排定縮減「<ph name="USER_AGENT_HEADER_NAME" />」要求標頭。為了方便測試及提高相容性,這項政策可以為所有網站啟用縮減功能,或停用來源試用或實際測試設定以啟用這項功能。 如要進一步瞭解「<ph name="USER_AGENT_REDUCTION_FEATURE_NAME" />」和其時間軸,請閱讀這篇文章: @@ -8760,6 +8762,9 @@ 如果設為停用,將無法在任何網頁上使用 <ph name="SEARCH_SIDE_PANEL_FEATURE_NAME" />。</translation> <translation id="8860894781631833477">使用者可能可以設定 <ph name="PRODUCT_OS_NAME" /> 發布版本</translation> +<translation id="8862086508140571198">這項政策允許設定要盡快下載的可下載內容 (DLC) 清單。下載之後,裝置的所有使用者都使用 DLC。 + +如果系統管理員知道裝置使用者可能會使用需要 DLC 的功能,這項政策就非常實用。</translation> <translation id="8864975621965365890">瀏覽使用 <ph name="PRODUCT_FRAME_NAME" />轉譯的網站時,隱藏停止支援提示。</translation> <translation id="8865404058177794289">使用 RSA 金鑰用途檢查的預設設定</translation> <translation id="8866430022832109569">應用程式廣告空間報表</translation>
diff --git a/components/policy/resources/templates/policy_definitions/Extensions/ExtensionSettings.yaml b/components/policy/resources/templates/policy_definitions/Extensions/ExtensionSettings.yaml index 27564f0..3dd3ec1 100644 --- a/components/policy/resources/templates/policy_definitions/Extensions/ExtensionSettings.yaml +++ b/components/policy/resources/templates/policy_definitions/Extensions/ExtensionSettings.yaml
@@ -28,6 +28,7 @@ installation_mode: allowed minimum_version_required: 1.0.1 toolbar_pin: force_pinned + file_url_navigation_allowed: true bcdefghijklmnopabcdefghijklmnopa: allowed_permissions: - downloads @@ -76,6 +77,8 @@ type: string blocked_permissions: $ref: ListOfPermissions + file_url_navigation_allowed: + type: boolean installation_mode: enum: - blocked
diff --git a/components/policy/resources/templates/policy_definitions/Printing/PrintPdfAsImageDefault.yaml b/components/policy/resources/templates/policy_definitions/Printing/PrintPdfAsImageDefault.yaml index 51d9317..9990897 100644 --- a/components/policy/resources/templates/policy_definitions/Printing/PrintPdfAsImageDefault.yaml +++ b/components/policy/resources/templates/policy_definitions/Printing/PrintPdfAsImageDefault.yaml
@@ -10,8 +10,6 @@ For <ph name="MS_WIN_NAME">Microsoft® Windows®</ph> or <ph name="MAC_OS_NAME">macOS</ph> this policy only has an effect if <ph name="PRINT_PDF_AS_IMAGE_AVAILABILITY_POLICY_NAME">PrintPdfAsImageAvailability</ph> is also enabled. example_value: true features: - can_be_mandatory: false - can_be_recommended: true dynamic_refresh: true per_profile: true future_on:
diff --git a/components/policy/test/data/policy_test_cases.json b/components/policy/test/data/policy_test_cases.json index e1203371..4673da4 100644 --- a/components/policy/test/data/policy_test_cases.json +++ b/components/policy/test/data/policy_test_cases.json
@@ -3975,7 +3975,8 @@ "blocked_permissions": [ "history" ], - "toolbar_pin": "force_pinned" + "toolbar_pin": "force_pinned", + "file_url_navigation_allowed": true }, "bcdefghijklmnopabcdefghijklmnopa": { "installation_mode": "force_installed",
diff --git a/components/policy/test_support/fake_dmserver.cc b/components/policy/test_support/fake_dmserver.cc index 4a52c68..633ffa2 100644 --- a/components/policy/test_support/fake_dmserver.cc +++ b/components/policy/test_support/fake_dmserver.cc
@@ -69,11 +69,11 @@ static remote_commands::WaitRemoteCommandResultResponse BuildWaitRemoteCommandResultResponse(const em::RemoteCommandResult& result) { remote_commands::WaitRemoteCommandResultResponse resp; - em::RemoteCommandResult* rcResult = resp.mutable_result(); - rcResult->set_result(result.result()); - rcResult->set_command_id(result.command_id()); - rcResult->set_timestamp(result.timestamp()); - rcResult->set_payload(result.payload()); + em::RemoteCommandResult* remote_command_result = resp.mutable_result(); + remote_command_result->set_result(result.result()); + remote_command_result->set_command_id(result.command_id()); + remote_command_result->set_timestamp(result.timestamp()); + remote_command_result->set_payload(result.payload()); return resp; } @@ -152,44 +152,50 @@ } } +enum class RemoteCommandsWaitType { kAcknowledged, kResultAvailable }; + class RemoteCommandsWaitOperation : public policy::RemoteCommandsState::Observer { public: + // Callback for a RemoteCommandsWaitOperation. + // `wait_operation` will refer to the RemoteCommandsWaitOperation object that + // invoked the callback. If `success` is true, the `RemoteCommandsWaitType` + // has happened, otherwise the wait timed out. + using RemoteCommandsWaitCallback = + base::OnceCallback<void(RemoteCommandsWaitOperation* wait_operation, + bool success)>; + RemoteCommandsWaitOperation( - policy::RemoteCommandsState*, - remote_commands::RemoteCommandsServiceHandler::WaitRemoteCommandResult:: - Reactor*, - base::OnceCallback<void(RemoteCommandsWaitOperation*)>); + policy::RemoteCommandsState* remote_commands_state, + RemoteCommandsWaitType wait_type, + RemoteCommandsWaitOperation::RemoteCommandsWaitCallback wait_callback); ~RemoteCommandsWaitOperation() override; void OnRemoteCommandResultAvailable(int64_t command_id) override; + void OnRemoteCommandAcked(int64_t command_id) override; void OnTimeout(); private: const raw_ptr<policy::RemoteCommandsState> remote_commands_state_; - const raw_ptr<remote_commands::RemoteCommandsServiceHandler:: - WaitRemoteCommandResult::Reactor> - reactor_; + const RemoteCommandsWaitType wait_type_; + RemoteCommandsWaitCallback wait_callback_; base::ScopedObservation<policy::RemoteCommandsState, policy::RemoteCommandsState::Observer> state_observation_{this}; // Timer that fires to prevent indefinite wait if the remote command result // takes too long. base::OneShotTimer result_timeout_timer_; - // Callback to erase the wait operation. - base::OnceCallback<void(RemoteCommandsWaitOperation*)> erase_cb_; base::WeakPtrFactory<RemoteCommandsWaitOperation> weak_ptr_factory_{this}; }; RemoteCommandsWaitOperation::RemoteCommandsWaitOperation( policy::RemoteCommandsState* remote_commands_state, - remote_commands::RemoteCommandsServiceHandler::WaitRemoteCommandResult:: - Reactor* reactor, - base::OnceCallback<void(RemoteCommandsWaitOperation*)> erase_cb) + RemoteCommandsWaitType wait_type, + RemoteCommandsWaitOperation::RemoteCommandsWaitCallback wait_callback) : remote_commands_state_(remote_commands_state), - reactor_(reactor), - erase_cb_(std::move(erase_cb)) { + wait_type_(wait_type), + wait_callback_(std::move(wait_callback)) { state_observation_.Observe(remote_commands_state); // Start a timer for 10 seconds to wait for the remote command result. result_timeout_timer_.Start( @@ -202,27 +208,33 @@ void RemoteCommandsWaitOperation::OnRemoteCommandResultAvailable( int64_t command_id) { - em::RemoteCommandResult result; + if (wait_type_ != RemoteCommandsWaitType::kResultAvailable) { + return; + } const bool result_available = - remote_commands_state_->GetRemoteCommandResult(command_id, &result); + remote_commands_state_->IsRemoteCommandResultAvailable(command_id); // The result must be available now. CHECK(result_available); - remote_commands::WaitRemoteCommandResultResponse resp; - em::RemoteCommandResult* rcResult = resp.mutable_result(); - rcResult->set_result(result.result()); - rcResult->set_command_id(result.command_id()); - rcResult->set_timestamp(result.timestamp()); - rcResult->set_payload(result.payload()); - reactor_->Write(std::move(resp)); - // Erase the wait operation from the set and delete its pointer. - std::move(erase_cb_).Run(this); + // Invoke the wait callback OnWaitRemoteCommandResultDone to write the result + // to the reactor. + std::move(wait_callback_).Run(this, result_available); +} + +void RemoteCommandsWaitOperation::OnRemoteCommandAcked(int64_t command_id) { + if (wait_type_ != RemoteCommandsWaitType::kAcknowledged) { + return; + } + const bool command_acked = + remote_commands_state_->IsRemoteCommandAcked(command_id); + // The command must be acknowledged now. + CHECK(command_acked); + // Invoke the wait callback OnWaitRemoteCommandAckDone to write the ack to the + // reactor. + std::move(wait_callback_).Run(this, command_acked); } void RemoteCommandsWaitOperation::OnTimeout() { - reactor_->Write(grpc::Status( - grpc::StatusCode::CANCELLED, - "Timeout waiting for remote command result took more than 10 seconds")); - std::move(erase_cb_).Run(this); + std::move(wait_callback_).Run(this, false); } FakeDMServer::FakeDMServer(const std::string& policy_blob_path, @@ -268,6 +280,12 @@ base::SingleThreadTaskRunner::GetCurrentDefault(), base::BindRepeating(&FakeDMServer::HandleWaitRemoteCommandResult, weak_ptr_factory_.GetWeakPtr()))); + grpc_server_->SetHandler< + remote_commands::RemoteCommandsServiceHandler::WaitRemoteCommandAcked>( + base::BindPostTask( + base::SingleThreadTaskRunner::GetCurrentDefault(), + base::BindRepeating(&FakeDMServer::HandleWaitRemoteCommandAcked, + weak_ptr_factory_.GetWeakPtr()))); auto status = grpc_server_->Start(grpc_unix_socket_uri_); // Browser runtime must crash if the runtime service failed to start to avoid // the process to dangle without any proper connection to the Cast Core. @@ -281,9 +299,35 @@ reactor) { DCHECK_CALLED_ON_VALID_SEQUENCE(fake_dmserver_main_sequence_checker_); LOG(INFO) << "Processing SendRemoteCommand grpc request."; - remote_commands_state()->AddPendingRemoteCommand(request.remote_command()); + int64_t command_id = remote_commands_state()->AddPendingRemoteCommand( + request.remote_command()); remote_commands::SendRemoteCommandResponse resp; - resp.set_command_id(request.remote_command().command_id()); + resp.set_command_id(command_id); + reactor->Write(std::move(resp)); +} + +void FakeDMServer::OnWaitRemoteCommandResultDone( + remote_commands::RemoteCommandsServiceHandler::WaitRemoteCommandResult:: + Reactor* reactor, + int64_t command_id, + RemoteCommandsWaitOperation* wait_operation, + bool wait_success) { + DCHECK_CALLED_ON_VALID_SEQUENCE(fake_dmserver_main_sequence_checker_); + auto it = waiters_.find(wait_operation); + CHECK(it != waiters_.end()); + waiters_.erase(it); + + if (!wait_success) { + reactor->Write(grpc::Status( + grpc::StatusCode::CANCELLED, + "Timeout waiting for remote command result took more than 10 seconds")); + return; + } + em::RemoteCommandResult result; + bool result_available = + remote_commands_state()->GetRemoteCommandResult(command_id, &result); + CHECK(result_available); + auto resp = BuildWaitRemoteCommandResultResponse(result); reactor->Write(std::move(resp)); } @@ -302,9 +346,10 @@ // Insert the wait operation into the set and bind the erase function to // erase it if the result is available. waiters_.insert(std::make_unique<RemoteCommandsWaitOperation>( - remote_commands_state(), reactor, - base::BindOnce(&FakeDMServer::EraseWaitOperation, - weak_ptr_factory_.GetWeakPtr()))); + remote_commands_state(), RemoteCommandsWaitType::kResultAvailable, + base::BindOnce(&FakeDMServer::OnWaitRemoteCommandResultDone, + weak_ptr_factory_.GetWeakPtr(), + base::Unretained(reactor), command_id))); return; } LOG(INFO) << "Remote command result is available. Resolving the grpc call."; @@ -312,6 +357,55 @@ reactor->Write(std::move(resp)); } +void FakeDMServer::OnWaitRemoteCommandAckDone( + remote_commands::RemoteCommandsServiceHandler::WaitRemoteCommandAcked:: + Reactor* reactor, + int64_t command_id, + RemoteCommandsWaitOperation* wait_operation, + bool wait_success) { + DCHECK_CALLED_ON_VALID_SEQUENCE(fake_dmserver_main_sequence_checker_); + auto it = waiters_.find(wait_operation); + CHECK(it != waiters_.end()); + waiters_.erase(it); + + if (!wait_success) { + reactor->Write(grpc::Status( + grpc::StatusCode::CANCELLED, + "Timeout waiting for remote command result took more than 10 seconds")); + return; + } + bool command_acked = + remote_commands_state()->IsRemoteCommandAcked(command_id); + CHECK(command_acked); + reactor->Write(grpc::Status(grpc::StatusCode::OK, + "The remote command was acknowledged")); +} + +void FakeDMServer::HandleWaitRemoteCommandAcked( + remote_commands::WaitRemoteCommandAckedRequest request, + remote_commands::RemoteCommandsServiceHandler::WaitRemoteCommandAcked:: + Reactor* reactor) { + DCHECK_CALLED_ON_VALID_SEQUENCE(fake_dmserver_main_sequence_checker_); + LOG(INFO) << "Processing WaitRemoteCommandAcked grpc request."; + int64_t command_id = request.command_id(); + bool command_acked = + remote_commands_state()->IsRemoteCommandAcked(command_id); + if (!command_acked) { + LOG(INFO) << "Remote command isn't acknowledged yet."; + // Insert the wait operation into the set and bind the erase function to + // erase it if the command is acknowledged. + waiters_.insert(std::make_unique<RemoteCommandsWaitOperation>( + remote_commands_state(), RemoteCommandsWaitType::kAcknowledged, + base::BindOnce(&FakeDMServer::OnWaitRemoteCommandAckDone, + weak_ptr_factory_.GetWeakPtr(), + base::Unretained(reactor), command_id))); + return; + } + LOG(INFO) << "Remote command is acknowledged. Resolving the grpc call."; + reactor->Write(grpc::Status(grpc::StatusCode::OK, + "The remote command was acknowledged")); +} + bool FakeDMServer::StartFakeServer() { DCHECK_CALLED_ON_VALID_SEQUENCE(fake_dmserver_main_sequence_checker_); LOG(INFO) << "Starting the FakeDMServer with args policy_blob_path="
diff --git a/components/policy/test_support/fake_dmserver.h b/components/policy/test_support/fake_dmserver.h index 8dc9a26..932e287a 100644 --- a/components/policy/test_support/fake_dmserver.h +++ b/components/policy/test_support/fake_dmserver.h
@@ -184,6 +184,23 @@ // Triggers Shutting down the fake_dmserver_main and the grpc server. void TriggerShutdown(); + // Writes the remote command result to the reactor, it will be triggered + // from RemoteCommandsWaitOperation::OnRemoteCommandResultAvailable. + void OnWaitRemoteCommandResultDone( + remote_commands::RemoteCommandsServiceHandler::WaitRemoteCommandResult:: + Reactor*, + int64_t, + RemoteCommandsWaitOperation*, + bool); + // Writes the ack to the reactor, it will be triggered + // from RemoteCommandsWaitOperation::OnRemoteCommandAcked. + void OnWaitRemoteCommandAckDone( + remote_commands::RemoteCommandsServiceHandler::WaitRemoteCommandAcked:: + Reactor*, + int64_t, + RemoteCommandsWaitOperation*, + bool); + // Handles the RemoteCommandsService gRPC request SendRemoteCommand. void HandleSendRemoteCommand( remote_commands::SendRemoteCommandRequest request, @@ -197,6 +214,13 @@ remote_commands::WaitRemoteCommandResultRequest request, remote_commands::RemoteCommandsServiceHandler::WaitRemoteCommandResult:: Reactor* reactor); + // Handles the RemoteCommandsService gRPC request WaitRemoteCommandAcked. If + // the result isn't available withing 10 seconds, the grpc call will be + // cancelled. + void HandleWaitRemoteCommandAcked( + remote_commands::WaitRemoteCommandAckedRequest request, + remote_commands::RemoteCommandsServiceHandler::WaitRemoteCommandAcked:: + Reactor* reactor); // Erase the wait operation from the waiters_ set. void EraseWaitOperation(RemoteCommandsWaitOperation*);
diff --git a/components/policy/test_support/remote_commands_result_waiter.cc b/components/policy/test_support/remote_commands_result_waiter.cc index 89bbedb..7115a575 100644 --- a/components/policy/test_support/remote_commands_result_waiter.cc +++ b/components/policy/test_support/remote_commands_result_waiter.cc
@@ -23,29 +23,52 @@ remote_commands_state_->RemoveObserver(this); } -void RemoteCommandsResultWaiter::Wait() { +void RemoteCommandsResultWaiter::WaitForResult() { em::RemoteCommandResult result; if (remote_commands_state_->GetRemoteCommandResult(command_id_, &result)) { // No need to wait, result is already available. return; } - run_loop_.Run(); + result_run_loop_.Run(); +} + +void RemoteCommandsResultWaiter::WaitForAck() { + em::RemoteCommandResult result; + if (remote_commands_state_->IsRemoteCommandAcked(command_id_)) { + // No need to wait, the remote command was acknowledged. + return; + } + ack_run_loop_.Run(); } em::RemoteCommandResult RemoteCommandsResultWaiter::WaitAndGetResult() { - Wait(); + WaitForResult(); em::RemoteCommandResult result; const bool result_available = remote_commands_state_->GetRemoteCommandResult(command_id_, &result); - // The result must be available now that the `run_loop_` has quit. + // The result must be available now that the `result_run_loop_` has quit. CHECK(result_available); return result; } +void RemoteCommandsResultWaiter::WaitAndGetAck() { + WaitForAck(); + const bool result_available = + remote_commands_state_->IsRemoteCommandAcked(command_id_); + // The ack must be available now that the `ack_run_loop_` has quit. + CHECK(result_available); +} + void RemoteCommandsResultWaiter::OnRemoteCommandResultAvailable( int64_t command_id) { if (command_id_ == command_id) { - run_loop_.Quit(); + result_run_loop_.Quit(); + } +} + +void RemoteCommandsResultWaiter::OnRemoteCommandAcked(int64_t command_id) { + if (command_id_ == command_id) { + ack_run_loop_.Quit(); } }
diff --git a/components/policy/test_support/remote_commands_result_waiter.h b/components/policy/test_support/remote_commands_result_waiter.h index 546d4e6..ed230ff3 100644 --- a/components/policy/test_support/remote_commands_result_waiter.h +++ b/components/policy/test_support/remote_commands_result_waiter.h
@@ -22,16 +22,19 @@ ~RemoteCommandsResultWaiter() override; - void Wait(); - enterprise_management::RemoteCommandResult WaitAndGetResult(); + void WaitAndGetAck(); private: void OnRemoteCommandResultAvailable(int64_t command_id) override; + void OnRemoteCommandAcked(int64_t command_id) override; + + void WaitForResult(); + void WaitForAck(); const raw_ptr<RemoteCommandsState> remote_commands_state_; const int64_t command_id_; - base::RunLoop run_loop_; + base::RunLoop result_run_loop_, ack_run_loop_; }; } // namespace policy
diff --git a/components/policy/test_support/remote_commands_service.proto b/components/policy/test_support/remote_commands_service.proto index 21a2397b..3ce0344f 100644 --- a/components/policy/test_support/remote_commands_service.proto +++ b/components/policy/test_support/remote_commands_service.proto
@@ -29,6 +29,13 @@ optional enterprise_management.RemoteCommandResult result = 1; } +message WaitRemoteCommandAckedRequest { + // A command_id that has been previously returned by SendRemoteCommand. + optional int64 command_id = 1; +} + +message WaitRemoteCommandAckedResponse {} + // RemoteCommands provides functions to send remote commands and get the // results. service RemoteCommandsService { @@ -40,4 +47,9 @@ // is available. rpc WaitRemoteCommandResult(WaitRemoteCommandResultRequest) returns (WaitRemoteCommandResultResponse) {} + // Gets the command id as argument, and returns when the remote command is + // acknowledged. "acknowledge" means that the client has sent a message + // confirming that the fake DMServer has received the remote command. + rpc WaitRemoteCommandAcked(WaitRemoteCommandAckedRequest) + returns (WaitRemoteCommandAckedResponse) {} }
diff --git a/components/policy/test_support/remote_commands_state.cc b/components/policy/test_support/remote_commands_state.cc index 34f9bae..b070ab9 100644 --- a/components/policy/test_support/remote_commands_state.cc +++ b/components/policy/test_support/remote_commands_state.cc
@@ -4,12 +4,16 @@ #include "components/policy/test_support/remote_commands_state.h" +#include "base/logging.h" #include "components/policy/proto/device_management_backend.pb.h" namespace em = enterprise_management; namespace policy { +const int64_t kInitId = 0; +const int kCommandIdMaxDistance = 100; + RemoteCommandsState::RemoteCommandsState() : observer_list_( base::MakeRefCounted<base::ObserverListThreadSafe<Observer>>()) { @@ -31,12 +35,19 @@ base::AutoLock lock(lock_); command_results_.clear(); pending_commands_.clear(); + current_id_ = kInitId; + g_last_acked_id_ = kInitId; } -void RemoteCommandsState::AddPendingRemoteCommand( +int64_t RemoteCommandsState::AddPendingRemoteCommand( const em::RemoteCommand& command) { base::AutoLock lock(lock_); - pending_commands_.push_back(command); + ++current_id_; + // Copy the incoming command to be able to set a `command_id`. + enterprise_management::RemoteCommand command_copy = command; + command_copy.set_command_id(current_id_); + pending_commands_.push_back(command_copy); + return current_id_; } void RemoteCommandsState::AddRemoteCommandResult( @@ -48,6 +59,25 @@ result.command_id()); } +void RemoteCommandsState::AddRemoteCommandAcked(const int64_t command_id) { + base::AutoLock lock(lock_); + if ((command_id > g_last_acked_id_) && + (command_id - g_last_acked_id_ < kCommandIdMaxDistance)) { + for (int64_t i = g_last_acked_id_ + 1; i <= command_id; i++) { + observer_list_->Notify( + FROM_HERE, &RemoteCommandsState::Observer::OnRemoteCommandAcked, i); + } + } else { + LOG(WARNING) << "The number of commands to be acked is too large. Only " + "acknowledging command id: " + << command_id; + observer_list_->Notify(FROM_HERE, + &RemoteCommandsState::Observer::OnRemoteCommandAcked, + command_id); + } + g_last_acked_id_ = std::max(g_last_acked_id_, command_id); +} + std::vector<em::RemoteCommand> RemoteCommandsState::ExtractPendingRemoteCommands() { base::AutoLock lock(lock_); @@ -78,4 +108,18 @@ return true; } +bool RemoteCommandsState::IsRemoteCommandAcked(int64_t id) { + base::AutoLock lock(lock_); + if (id <= g_last_acked_id_) { + return true; + } + return false; +} + +void RemoteCommandsState::SetCurrentIdForTesting(int64_t id) { + base::AutoLock lock(lock_); + current_id_ = id; + g_last_acked_id_ = id; +} + } // namespace policy
diff --git a/components/policy/test_support/remote_commands_state.h b/components/policy/test_support/remote_commands_state.h index 6a0c7512..15c53c0 100644 --- a/components/policy/test_support/remote_commands_state.h +++ b/components/policy/test_support/remote_commands_state.h
@@ -25,6 +25,8 @@ public: // Called when a remote command result is available. virtual void OnRemoteCommandResultAvailable(int64_t command_id) = 0; + // Called when a remote command is acknowledged. + virtual void OnRemoteCommandAcked(int64_t command_id) = 0; protected: virtual ~Observer() = default; @@ -43,14 +45,22 @@ void ResetState(); // Adds a remote command to the queue of pending remote commands. - // Expected to be called by tests to set up the environment - void AddPendingRemoteCommand(const em::RemoteCommand& command); + // Expected to be called by tests to set up the environment. + // The command ids are incrementally increasing by 1. + // This function assigns a `command_id` and discards any `command_id` that is + // present in the passed `command`. If a specific `command_id` is required + // then use `SetCurrentIdForTesting()` to set the initial id. Returns the + // assigned `command_id`. + int64_t AddPendingRemoteCommand(const em::RemoteCommand& command); // Stores an execution result of a remote command. // Intended to store command results when the server receives them from the // client. void AddRemoteCommandResult(const em::RemoteCommandResult& result); + // Adds the id to the list of aknowledged remote commands. + void AddRemoteCommandAcked(const int64_t command_id); + // Returns all pending remote commands and deletes them from the state. std::vector<em::RemoteCommand> ExtractPendingRemoteCommands(); @@ -63,6 +73,17 @@ // Returns true if the remote command result is available. bool IsRemoteCommandResultAvailable(int64_t id); + // Returns true if the remote command is acknowledged. + bool IsRemoteCommandAcked(int64_t id); + + // Sets the initial command id with the given id, the next commands ids will + // be incrementally increasing by 1. + // Note fake_dmserver's implementation of "acknowledging" remote commands + // relies on the id strictly increasing, if this is called with an id which is + // lower than a previously issued remote command, fake_dmserver will miss some + // ack messages. + void SetCurrentIdForTesting(int64_t id); + private: base::Lock lock_; @@ -70,6 +91,13 @@ base::flat_map<int64_t, em::RemoteCommandResult> command_results_ GUARDED_BY(lock_); + // Stores an id assigned to the last added remote command. + int64_t current_id_ GUARDED_BY(lock_); + + // The last acknowledged command id, which implicitly ack all remote commands + // that were sent before this one. + int64_t g_last_acked_id_ GUARDED_BY(lock_); + // Queue of pending remote commands. std::vector<em::RemoteCommand> pending_commands_ GUARDED_BY(lock_);
diff --git a/components/policy/test_support/remote_commands_state_unittest.cc b/components/policy/test_support/remote_commands_state_unittest.cc index 281e88d..033c7dc1 100644 --- a/components/policy/test_support/remote_commands_state_unittest.cc +++ b/components/policy/test_support/remote_commands_state_unittest.cc
@@ -30,6 +30,22 @@ em::RemoteCommand::DEVICE_REMOTE_POWERWASH); } +TEST(RemoteCommandsStateTest, IsRemoteCommandAcked) { + const int64_t command_id = 1; + RemoteCommandsState state; + + state.AddRemoteCommandAcked(command_id); + + EXPECT_TRUE(state.IsRemoteCommandAcked(command_id)); +} + +TEST(RemoteCommandsStateTest, IsRemoteCommandNotAcked) { + const int64_t command_id = 1; + RemoteCommandsState state; + + EXPECT_FALSE(state.IsRemoteCommandAcked(command_id)); +} + TEST(RemoteCommandsStateTest, GetUnavailableCommandResult) { RemoteCommandsState state;
diff --git a/components/policy/test_support/request_handler_for_remote_commands.cc b/components/policy/test_support/request_handler_for_remote_commands.cc index 151c439..2c81628 100644 --- a/components/policy/test_support/request_handler_for_remote_commands.cc +++ b/components/policy/test_support/request_handler_for_remote_commands.cc
@@ -48,6 +48,11 @@ const em::DeviceRemoteCommandRequest remote_command_request = device_management_request.remote_command_request(); + if (remote_command_request.has_last_command_unique_id()) { + state->AddRemoteCommandAcked( + remote_command_request.last_command_unique_id()); + } + for (auto result : remote_command_request.command_results()) { LOG(INFO) << "remote command result: " << result.command_id() << " " << result.result();
diff --git a/components/privacy_sandbox/privacy_sandbox_features.cc b/components/privacy_sandbox/privacy_sandbox_features.cc index 72e891d95..d646393 100644 --- a/components/privacy_sandbox/privacy_sandbox_features.cc +++ b/components/privacy_sandbox/privacy_sandbox_features.cc
@@ -6,6 +6,11 @@ namespace privacy_sandbox { +// Show the Tracking Protection onboarding flow if not already onboarded. +BASE_FEATURE(kPrivacySandboxSuppressDialogOnNonNormalBrowsers, + "PrivacySandboxSuppressDialogOnNonNormalBrowsers", + base::FEATURE_ENABLED_BY_DEFAULT); + BASE_FEATURE(kPrivacySandboxSettings4, "PrivacySandboxSettings4", base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/components/privacy_sandbox/privacy_sandbox_features.h b/components/privacy_sandbox/privacy_sandbox_features.h index f5da73b..162489d 100644 --- a/components/privacy_sandbox/privacy_sandbox_features.h +++ b/components/privacy_sandbox/privacy_sandbox_features.h
@@ -11,6 +11,11 @@ namespace privacy_sandbox { +// When true, do not show any privacySandbox dialog when the browser isn't a +// normal browser. +COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) +BASE_DECLARE_FEATURE(kPrivacySandboxSuppressDialogOnNonNormalBrowsers); + // Enables the fourth release of the Privacy Sandbox settings. COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) BASE_DECLARE_FEATURE(kPrivacySandboxSettings4);
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/BUILD.gn b/components/safe_browsing/core/browser/hashprefix_realtime/BUILD.gn index 195f198..c35575e 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/BUILD.gn +++ b/components/safe_browsing/core/browser/hashprefix_realtime/BUILD.gn
@@ -59,6 +59,7 @@ "//components/safe_browsing/core/common", "//components/safe_browsing/core/common:safe_browsing_prefs", "//components/safe_browsing/core/common/proto:safebrowsingv5_proto", + "//components/variations/service", "//services/network/public/cpp", ] }
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils.cc b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils.cc index 8a15056..2882822 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils.cc +++ b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils.cc
@@ -13,6 +13,7 @@ #include "components/safe_browsing/core/common/features.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/safe_browsing/core/common/utils.h" +#include "components/variations/service/variations_service.h" namespace safe_browsing::hash_realtime_utils { // Used by tests so that more than just GOOGLE_CHROME_BRANDING bots are capable @@ -78,9 +79,22 @@ return HasGoogleChromeBranding() && base::FeatureList::IsEnabled(kHashPrefixRealTimeLookups); } +bool IsHashRealTimeLookupEligibleInSessionAndLocation( + absl::optional<std::string> stored_permanent_country) { + return IsHashRealTimeLookupEligibleInSession() && + (!stored_permanent_country.has_value() || + !base::Contains(GetExcludedCountries(), + stored_permanent_country.value())); +} +absl::optional<std::string> GetCountryCode( + variations::VariationsService* variations_service) { + return variations_service ? variations_service->GetStoredPermanentCountry() + : absl::optional<std::string>(); +} HashRealTimeSelection DetermineHashRealTimeSelection( bool is_off_the_record, PrefService* prefs, + absl::optional<std::string> stored_permanent_country, bool log_usage_histograms) { // All prefs used in this method must match the ones returned by // |GetHashRealTimeSelectionConfiguringPrefs| so that consumers listening for @@ -89,8 +103,9 @@ std::string failed_requirement_histogram_suffix; bool passes_requirement; } requirements[] = { - {"IneligibleForSession", - hash_realtime_utils::IsHashRealTimeLookupEligibleInSession()}, + {"IneligibleForSessionOrLocation", + hash_realtime_utils::IsHashRealTimeLookupEligibleInSessionAndLocation( + stored_permanent_country)}, {"OffTheRecord", !is_off_the_record}, {"NotStandardProtection", safe_browsing::GetSafeBrowsingState(*prefs) == SafeBrowsingState::STANDARD_PROTECTION},
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils.h b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils.h index 8bb14a4..bdc5bb04 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils.h +++ b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils.h
@@ -11,6 +11,10 @@ class PrefService; +namespace variations { +class VariationsService; +} + // These are utils for hash-prefix real-time lookups. namespace safe_browsing::hash_realtime_utils { constexpr size_t kHashPrefixLength = 4; // bytes @@ -62,22 +66,44 @@ // Returns the 4-byte prefix of the requested 32-byte full hash. std::string GetHashPrefix(const std::string& full_hash); -// Specifies whether hash-prefix real-time lookups are possible for the -// browser session. This function should never take in parameters. +// Specifies whether hash-prefix real-time lookups are possible for the browser +// session. For cases when the user's location should not influence the logic, +// This should be used over |IsHashRealTimeLookupEligibleInSessionAndLocation|, +// for example for determining the settings UI description of Standard Safe +// Browsing. bool IsHashRealTimeLookupEligibleInSession(); +// Based on the user's browser session and location, specifies whether +// hash-prefix real-time lookups are eligible. Outside of tests, +// |stored_permanent_country| should be determined with the helper function +// |hash_realtime_utils::GetCountryCode|. If it's passed in as absl::nullopt, +// the location is considered eligible. +bool IsHashRealTimeLookupEligibleInSessionAndLocation( + absl::optional<std::string> stored_permanent_country); + +// Returns the stored permanent country. If |variations_service| is null, +// returns absl::nullopt. This should be used only as a helper to determine the +// country code to pass into |IsHashRealTimeLookupEligibleInSessionAndLocation| +// and |DetermineHashRealTimeSelection|. This is separated out into a function +// to simplify tests. +absl::optional<std::string> GetCountryCode( + variations::VariationsService* variations_service); + // Based on the user's settings and session, determines which hash-prefix // real-time lookup should be used, if any. If |log_usage_histograms| is true, // this will log metrics related to whether hash real-time lookups were -// available or why not. +// available or why not. Outside of tests, |stored_permanent_country| should be +// determined with the helper function |hash_realtime_utils::GetCountryCode|. +// If it's passed in as absl::nullopt, the location is considered eligible. HashRealTimeSelection DetermineHashRealTimeSelection( bool is_off_the_record, PrefService* prefs, + absl::optional<std::string> stored_permanent_country, bool log_usage_histograms = false); -// A helper for consumers that want to recompute DetermineHashRealTimeSelection -// when there are pref changes. This returns all prefs that modify the outcome -// of that method. +// A helper for consumers that want to recompute +// |DetermineHashRealTimeSelection| when there are pref changes. This returns +// all prefs that modify the outcome of that method. std::vector<const char*> GetHashRealTimeSelectionConfiguringPrefs(); } // namespace safe_browsing::hash_realtime_utils
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils_unittest.cc b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils_unittest.cc index c83ff687..8ab16b0 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils_unittest.cc +++ b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_utils_unittest.cc
@@ -140,6 +140,47 @@ EXPECT_FALSE(hash_realtime_utils::IsHashRealTimeLookupEligibleInSession()); } #endif + +TEST(HashRealTimeUtilsTest, + TestIsHashRealTimeLookupEligibleInSessionAndLocation) { + struct TestCase { + bool is_feature_on = true; + bool has_google_chrome_branding = true; + absl::optional<std::string> stored_permanent_country = absl::nullopt; + bool expected_eligibility; + } test_cases[] = { + // Lookups eligible when no country is provided. + {.expected_eligibility = true}, + // Lookups eligible for US. + {.stored_permanent_country = "us", .expected_eligibility = true}, + // Lookups ineligible for CN. + {.stored_permanent_country = "cn", .expected_eligibility = false}, + // Lookups ineligible when the feature is disabled. + {.is_feature_on = false, .expected_eligibility = false}, +#if !BUILDFLAG(GOOGLE_CHROME_BRANDING) + // Lookups ineligible because it's not a branded build. + {.has_google_chrome_branding = false, .expected_eligibility = false}, +#endif + }; + + for (const auto& test_case : test_cases) { + hash_realtime_utils::GoogleChromeBrandingPretenderForTesting apply_branding; + base::test::ScopedFeatureList scoped_feature_list; + if (test_case.is_feature_on) { + scoped_feature_list.InitAndEnableFeature(kHashPrefixRealTimeLookups); + } else { + scoped_feature_list.InitAndDisableFeature(kHashPrefixRealTimeLookups); + } + if (!test_case.has_google_chrome_branding) { + apply_branding.StopApplyingBranding(); + } + EXPECT_EQ( + hash_realtime_utils::IsHashRealTimeLookupEligibleInSessionAndLocation( + test_case.stored_permanent_country), + test_case.expected_eligibility); + } +} + TEST(HashRealTimeUtilsTest, TestDetermineHashRealTimeSelection) { hash_realtime_utils::HashRealTimeSelection enabled_selection = #if BUILDFLAG(IS_ANDROID) @@ -153,10 +194,11 @@ bool is_off_the_record = false; bool is_feature_on = true; bool has_google_chrome_branding = true; + absl::optional<std::string> stored_permanent_country = absl::nullopt; absl::optional<bool> lookups_allowed_by_policy = absl::nullopt; hash_realtime_utils::HashRealTimeSelection expected_selection; bool expected_log_usage_histograms = true; - bool expected_ineligible_for_session_log = false; + bool expected_ineligible_for_session_or_location_log = false; bool expected_off_the_record_log = false; bool expected_not_standard_protection_log = false; bool expected_not_allowed_by_policy_log = false; @@ -173,13 +215,19 @@ // Lookups disabled because the feature is disabled. {.is_feature_on = false, .expected_selection = hash_realtime_utils::HashRealTimeSelection::kNone, - .expected_ineligible_for_session_log = true}, + .expected_ineligible_for_session_or_location_log = true}, #if !BUILDFLAG(GOOGLE_CHROME_BRANDING) // Lookups disabled because it's not a branded build. {.has_google_chrome_branding = false, .expected_selection = hash_realtime_utils::HashRealTimeSelection::kNone, - .expected_ineligible_for_session_log = true}, + .expected_ineligible_for_session_or_location_log = true}, #endif + // Lookups allowed for US. + {.stored_permanent_country = "us", .expected_selection = enabled_selection}, + // Lookups disabled for CN. + {.stored_permanent_country = "cn", + .expected_selection = hash_realtime_utils::HashRealTimeSelection::kNone, + .expected_ineligible_for_session_or_location_log = true}, // Lookups allowed because policy allows them and nothing else prevents // them. {.lookups_allowed_by_policy = true, @@ -190,41 +238,41 @@ .expected_not_allowed_by_policy_log = true}, }; - auto check_usage_histograms = - [](const base::HistogramTester& histogram_tester, - const TestCase& test_case) { - histogram_tester.ExpectUniqueSample( - /*name=*/"SafeBrowsing.HPRT.Ineligible.IneligibleForSession", - /*sample=*/test_case.expected_ineligible_for_session_log, - /*expected_bucket_count=*/1); - histogram_tester.ExpectUniqueSample( - /*name=*/"SafeBrowsing.HPRT.Ineligible.OffTheRecord", - /*sample=*/test_case.expected_off_the_record_log, - /*expected_bucket_count=*/1); - histogram_tester.ExpectUniqueSample( - /*name=*/"SafeBrowsing.HPRT.Ineligible.NotStandardProtection", - /*sample=*/test_case.expected_not_standard_protection_log, - /*expected_bucket_count=*/1); - histogram_tester.ExpectUniqueSample( - /*name=*/"SafeBrowsing.HPRT.Ineligible.NotAllowedByPolicy", - /*sample=*/test_case.expected_not_allowed_by_policy_log, - /*expected_bucket_count=*/1); - }; - auto check_no_usage_histograms = - [](const base::HistogramTester& histogram_tester) { - histogram_tester.ExpectTotalCount( - /*name=*/"SafeBrowsing.HPRT.Ineligible.IneligibleForSession", - /*expected_count=*/0); - histogram_tester.ExpectTotalCount( - /*name=*/"SafeBrowsing.HPRT.Ineligible.OffTheRecord", - /*expected_count=*/0); - histogram_tester.ExpectTotalCount( - /*name=*/"SafeBrowsing.HPRT.Ineligible.NotStandardProtection", - /*expected_count=*/0); - histogram_tester.ExpectTotalCount( - /*name=*/"SafeBrowsing.HPRT.Ineligible.NotAllowedByPolicy", - /*expected_count=*/0); - }; + auto check_usage_histograms = [](const base::HistogramTester& + histogram_tester, + const TestCase& test_case) { + histogram_tester.ExpectUniqueSample( + /*name=*/"SafeBrowsing.HPRT.Ineligible.IneligibleForSessionOrLocation", + /*sample=*/test_case.expected_ineligible_for_session_or_location_log, + /*expected_bucket_count=*/1); + histogram_tester.ExpectUniqueSample( + /*name=*/"SafeBrowsing.HPRT.Ineligible.OffTheRecord", + /*sample=*/test_case.expected_off_the_record_log, + /*expected_bucket_count=*/1); + histogram_tester.ExpectUniqueSample( + /*name=*/"SafeBrowsing.HPRT.Ineligible.NotStandardProtection", + /*sample=*/test_case.expected_not_standard_protection_log, + /*expected_bucket_count=*/1); + histogram_tester.ExpectUniqueSample( + /*name=*/"SafeBrowsing.HPRT.Ineligible.NotAllowedByPolicy", + /*sample=*/test_case.expected_not_allowed_by_policy_log, + /*expected_bucket_count=*/1); + }; + auto check_no_usage_histograms = [](const base::HistogramTester& + histogram_tester) { + histogram_tester.ExpectTotalCount( + /*name=*/"SafeBrowsing.HPRT.Ineligible.IneligibleForSessionOrLocation", + /*expected_count=*/0); + histogram_tester.ExpectTotalCount( + /*name=*/"SafeBrowsing.HPRT.Ineligible.OffTheRecord", + /*expected_count=*/0); + histogram_tester.ExpectTotalCount( + /*name=*/"SafeBrowsing.HPRT.Ineligible.NotStandardProtection", + /*expected_count=*/0); + histogram_tester.ExpectTotalCount( + /*name=*/"SafeBrowsing.HPRT.Ineligible.NotAllowedByPolicy", + /*expected_count=*/0); + }; for (const auto& test_case : test_cases) { hash_realtime_utils::GoogleChromeBrandingPretenderForTesting apply_branding; @@ -247,13 +295,15 @@ } // Confirm result is correct and no histograms are logged. EXPECT_EQ(hash_realtime_utils::DetermineHashRealTimeSelection( - test_case.is_off_the_record, &prefs), + test_case.is_off_the_record, &prefs, + test_case.stored_permanent_country), test_case.expected_selection); check_no_usage_histograms(histogram_tester); // Confirm result is still correct and relevant histograms are logged. EXPECT_EQ( hash_realtime_utils::DetermineHashRealTimeSelection( - test_case.is_off_the_record, &prefs, /*log_usage_histograms=*/true), + test_case.is_off_the_record, &prefs, + test_case.stored_permanent_country, /*log_usage_histograms=*/true), test_case.expected_selection); if (test_case.expected_log_usage_histograms) { check_usage_histograms(histogram_tester, test_case);
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc index f92ca0f..3abd1c0 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc +++ b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc
@@ -113,8 +113,13 @@ bool IsEnabled(PrefService* pref_service) { safe_browsing::SafeBrowsingState state = safe_browsing::GetSafeBrowsingState(*pref_service); + // If this class has been created, it is already known that the session is not + // off-the-record and that the user's location is eligible, so + // |is_off_the_record| is passed through as false and + // |stored_permanent_country| as nullopt. return safe_browsing::hash_realtime_utils::DetermineHashRealTimeSelection( - /*is_off_the_record=*/false, pref_service) == + /*is_off_the_record=*/false, pref_service, + /*stored_permanent_country=*/absl::nullopt) == safe_browsing::hash_realtime_utils::HashRealTimeSelection:: kHashRealTimeService || // The service is enabled when enhanced protection and
diff --git a/components/signin/internal/identity_manager/token_binding_helper.cc b/components/signin/internal/identity_manager/token_binding_helper.cc index 46a2cfd..f84cf6ac 100644 --- a/components/signin/internal/identity_manager/token_binding_helper.cc +++ b/components/signin/internal/identity_manager/token_binding_helper.cc
@@ -16,6 +16,7 @@ #include "components/unexportable_keys/service_error.h" #include "components/unexportable_keys/unexportable_key_loader.h" #include "components/unexportable_keys/unexportable_key_service.h" +#include "crypto/signature_verifier.h" #include "google_apis/gaia/core_account_id.h" #include "google_apis/gaia/gaia_urls.h" #include "url/gurl.h" @@ -29,6 +30,7 @@ std::string CreateAssertionToken( const std::string& header_and_payload, + crypto::SignatureVerifier::SignatureAlgorithm algorithm, unexportable_keys::ServiceErrorOr<std::vector<uint8_t>> signature) { if (!signature.has_value()) { // TODO(alexilin): Record a histogram. @@ -36,7 +38,8 @@ } return signin::AppendSignatureToHeaderAndPayload(header_and_payload, - *signature); + algorithm, *signature) + .value_or(std::string()); } } // namespace @@ -126,9 +129,11 @@ return; } + crypto::SignatureVerifier::SignatureAlgorithm algorithm = + *unexportable_key_service_->GetAlgorithm(*binding_key); absl::optional<std::string> header_and_payload = signin::CreateKeyAssertionHeaderAndPayload( - *unexportable_key_service_->GetAlgorithm(*binding_key), + algorithm, *unexportable_key_service_->GetSubjectPublicKeyInfo(*binding_key), GaiaUrls::GetInstance()->oauth2_chrome_client_id(), challenge, destination_url, kTokenBindingNamespace); @@ -142,6 +147,6 @@ unexportable_key_service_->SignSlowlyAsync( *binding_key, base::as_bytes(base::make_span(*header_and_payload)), kTokenBindingPriority, - base::BindOnce(&CreateAssertionToken, *header_and_payload) + base::BindOnce(&CreateAssertionToken, *header_and_payload, algorithm) .Then(std::move(callback))); }
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountRenameChecker.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountRenameChecker.java index af47d249..7858a73 100644 --- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountRenameChecker.java +++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountRenameChecker.java
@@ -4,7 +4,6 @@ package org.chromium.components.signin; -import android.accounts.Account; import android.content.Context; import androidx.annotation.Nullable; @@ -19,6 +18,7 @@ import org.chromium.base.Log; import org.chromium.base.Promise; import org.chromium.base.task.AsyncTask; +import org.chromium.components.signin.base.CoreAccountInfo; import java.io.IOException; import java.util.List; @@ -97,12 +97,12 @@ * that exists in the given list of accounts; otherwise a {@link Promise} of null. */ public Promise<String> getNewNameOfRenamedAccountAsync( - String oldAccountEmail, List<Account> accounts) { + String oldAccountEmail, List<CoreAccountInfo> coreAccountInfos) { final Promise<String> newNamePromise = new Promise<>(); new AsyncTask<String>() { @Override protected String doInBackground() { - return getNewNameOfRenamedAccount(oldAccountEmail, accounts); + return getNewNameOfRenamedAccount(oldAccountEmail, coreAccountInfos); } @Override @@ -115,10 +115,11 @@ @WorkerThread private @Nullable String getNewNameOfRenamedAccount( - String oldAccountEmail, List<Account> accounts) { + String oldAccountEmail, List<CoreAccountInfo> coreAccountInfos) { String newAccountEmail = mDelegate.getNewNameOfRenamedAccount(oldAccountEmail); while (newAccountEmail != null) { - if (AccountUtils.findAccountByName(accounts, newAccountEmail) != null) { + if (AccountUtils.findCoreAccountInfoByEmail(coreAccountInfos, newAccountEmail) + != null) { break; } // When the new name does not exist in the list, continue to search if it is
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountUtils.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountUtils.java index b0113c22..68301fc 100644 --- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountUtils.java +++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountUtils.java
@@ -35,10 +35,11 @@ private AccountUtils() {} /** - * Creates an Account object for the given {@param name}. - * Use {@link CoreAccountInfo} objects instead of {@link Account}. + * Creates an Account object for the given {@param name}. Only used in places where we need to + * talk to Android which is very rare. Non-signin code should not use this method and should + * use {@link CoreAccountInfo} instead. + * TODO(crbug.com/1450614): Rename this method to createAccountFromEmail. */ - @Deprecated public static Account createAccountFromName(String name) { return new Account(name, GOOGLE_ACCOUNT_TYPE); }
diff --git a/components/signin/public/android/junit/src/org/chromium/components/signin/AccountRenameCheckerTest.java b/components/signin/public/android/junit/src/org/chromium/components/signin/AccountRenameCheckerTest.java index 4c53807..768abab 100644 --- a/components/signin/public/android/junit/src/org/chromium/components/signin/AccountRenameCheckerTest.java +++ b/components/signin/public/android/junit/src/org/chromium/components/signin/AccountRenameCheckerTest.java
@@ -4,7 +4,6 @@ package org.chromium.components.signin; -import android.accounts.Account; import android.content.Context; import androidx.annotation.Nullable; @@ -23,6 +22,7 @@ import org.chromium.base.task.test.CustomShadowAsyncTask; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.components.signin.base.CoreAccountInfo; import java.util.ArrayList; import java.util.Collections; @@ -138,12 +138,12 @@ private @Nullable String getNewNameOfRenamedAccount( String oldAccountEmail, List<String> accountEmails) { - final List<Account> accounts = new ArrayList<>(); + final List<CoreAccountInfo> coreAccountInfos = new ArrayList<>(); for (String email : accountEmails) { - accounts.add(AccountUtils.createAccountFromName(email)); + coreAccountInfos.add(CoreAccountInfo.createFromEmailAndGaiaId(email, "notUsedGaiaId")); } final AtomicReference<String> newAccountName = new AtomicReference<>(); - mChecker.getNewNameOfRenamedAccountAsync(oldAccountEmail, accounts) + mChecker.getNewNameOfRenamedAccountAsync(oldAccountEmail, coreAccountInfos) .then(newAccountName::set); return newAccountName.get(); }
diff --git a/components/signin/public/base/BUILD.gn b/components/signin/public/base/BUILD.gn index 8477a2cb..e2b70ff 100644 --- a/components/signin/public/base/BUILD.gn +++ b/components/signin/public/base/BUILD.gn
@@ -50,6 +50,7 @@ deps = [ "//build:chromeos_buildflags", "//components/prefs", + "//third_party/boringssl", "//third_party/icu:icui18n", "//third_party/re2", ]
diff --git a/components/signin/public/base/DEPS b/components/signin/public/base/DEPS index bf5f166..cd62c8cf 100644 --- a/components/signin/public/base/DEPS +++ b/components/signin/public/base/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+third_party/boringssl/src/include", "+third_party/re2/src/re2/re2.h", "+components/account_manager_core/account.h", ]
diff --git a/components/signin/public/base/session_binding_test_utils.cc b/components/signin/public/base/session_binding_test_utils.cc index c4e394a..be3f41a 100644 --- a/components/signin/public/base/session_binding_test_utils.cc +++ b/components/signin/public/base/session_binding_test_utils.cc
@@ -10,9 +10,41 @@ #include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "crypto/signature_verifier.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/boringssl/src/include/openssl/bn.h" +#include "third_party/boringssl/src/include/openssl/bytestring.h" +#include "third_party/boringssl/src/include/openssl/ecdsa.h" +#include "third_party/boringssl/src/include/openssl/mem.h" namespace signin { +namespace { +absl::optional<std::vector<uint8_t>> ConvertRawSignatureToDER( + base::span<const uint8_t> raw_signature) { + const size_t kMaxBytesPerBN = 32; + if (raw_signature.size() != 2 * kMaxBytesPerBN) { + return absl::nullopt; + } + base::span<const uint8_t> r_bytes = raw_signature.first(kMaxBytesPerBN); + base::span<const uint8_t> s_bytes = raw_signature.subspan(kMaxBytesPerBN); + + bssl::UniquePtr<ECDSA_SIG> ecdsa_sig(ECDSA_SIG_new()); + if (!ecdsa_sig || !BN_bin2bn(r_bytes.data(), r_bytes.size(), ecdsa_sig->r) || + !BN_bin2bn(s_bytes.data(), s_bytes.size(), ecdsa_sig->s)) { + return absl::nullopt; + } + + uint8_t* signature_bytes; + size_t signature_len; + if (!ECDSA_SIG_to_bytes(&signature_bytes, &signature_len, ecdsa_sig.get())) { + return absl::nullopt; + } + // Frees memory allocated by `ECDSA_SIG_to_bytes()`. + bssl::UniquePtr<uint8_t> delete_signature(signature_bytes); + return std::vector<uint8_t>(signature_bytes, signature_bytes + signature_len); +} +} // namespace + bool VerifyJwtSignature(base::StringPiece jwt, crypto::SignatureVerifier::SignatureAlgorithm algorithm, base::span<const uint8_t> public_key) { @@ -21,16 +53,24 @@ if (parts.size() != 3U) { return false; } - std::string signature; + std::string signature_str; if (!base::Base64UrlDecode(parts[2], base::Base64UrlDecodePolicy::DISALLOW_PADDING, - &signature)) { + &signature_str)) { return false; } + std::vector<uint8_t> signature(signature_str.begin(), signature_str.end()); + if (algorithm == crypto::SignatureVerifier::ECDSA_SHA256) { + absl::optional<std::vector<uint8_t>> der_signature = + ConvertRawSignatureToDER(base::as_bytes(base::make_span(signature))); + if (!der_signature) { + return false; + } + signature = std::move(der_signature).value(); + } crypto::SignatureVerifier verifier; - if (!verifier.VerifyInit( - algorithm, base::as_bytes(base::make_span(signature)), public_key)) { + if (!verifier.VerifyInit(algorithm, signature, public_key)) { return false; } verifier.VerifyUpdate(
diff --git a/components/signin/public/base/session_binding_utils.cc b/components/signin/public/base/session_binding_utils.cc index 057a293..e8d491981 100644 --- a/components/signin/public/base/session_binding_utils.cc +++ b/components/signin/public/base/session_binding_utils.cc
@@ -15,6 +15,8 @@ #include "crypto/sha2.h" #include "crypto/signature_verifier.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/boringssl/src/include/openssl/bn.h" +#include "third_party/boringssl/src/include/openssl/ecdsa.h" #include "url/gurl.h" namespace signin { @@ -92,6 +94,30 @@ Base64UrlEncode(*payload_serialized)}); } +absl::optional<std::vector<uint8_t>> ConvertDERSignatureToRaw( + base::span<const uint8_t> der_signature) { + bssl::UniquePtr<ECDSA_SIG> ecdsa_sig( + ECDSA_SIG_from_bytes(der_signature.data(), der_signature.size())); + if (!ecdsa_sig) { + DVLOG(1) << "Failed to create ECDSA_SIG"; + return {}; + } + + // TODO(b/301888680): this implicitly depends on a curve used by + // `crypto::UnexportableKey`. Make this dependency more explicit. + const size_t kMaxBytesPerBN = 32; + std::vector<uint8_t> jwt_signature(2 * kMaxBytesPerBN); + + if (!BN_bn2bin_padded(&jwt_signature[0], kMaxBytesPerBN, ecdsa_sig->r) || + !BN_bn2bin_padded(&jwt_signature[kMaxBytesPerBN], kMaxBytesPerBN, + ecdsa_sig->s)) { + DVLOG(1) << "Failed to serialize R and S to " << kMaxBytesPerBN << " bytes"; + return {}; + } + + return jwt_signature; +} + } // namespace absl::optional<std::string> @@ -162,9 +188,19 @@ algorithm, "DEVICE_BOUND_SESSION_CREDENTIALS_ASSERTION", payload); } -std::string AppendSignatureToHeaderAndPayload( +absl::optional<std::string> AppendSignatureToHeaderAndPayload( base::StringPiece header_and_payload, + crypto::SignatureVerifier::SignatureAlgorithm algorithm, base::span<const uint8_t> signature) { + absl::optional<std::vector<uint8_t>> signature_holder; + if (algorithm == crypto::SignatureVerifier::ECDSA_SHA256) { + signature_holder = ConvertDERSignatureToRaw(signature); + if (!signature_holder.has_value()) { + return absl::nullopt; + } + signature = base::make_span(*signature_holder); + } + return base::StrCat({header_and_payload, ".", Base64UrlEncode(signature)}); }
diff --git a/components/signin/public/base/session_binding_utils.h b/components/signin/public/base/session_binding_utils.h index c8032fcb..ae24d70 100644 --- a/components/signin/public/base/session_binding_utils.h +++ b/components/signin/public/base/session_binding_utils.h
@@ -47,9 +47,11 @@ const GURL& destination_url, base::StringPiece name_space); -// Appends `signature` to provided `header_and_payload` to form a complete JWT. -std::string AppendSignatureToHeaderAndPayload( +// Appends `signature` generated by `algorithm` to provided `header_and_payload` +// to form a complete JWT. +absl::optional<std::string> AppendSignatureToHeaderAndPayload( base::StringPiece header_and_payload, + crypto::SignatureVerifier::SignatureAlgorithm algorithm, base::span<const uint8_t> signature); } // namespace signin
diff --git a/components/signin/public/base/session_binding_utils_unittest.cc b/components/signin/public/base/session_binding_utils_unittest.cc index 8e0984f..11002c1 100644 --- a/components/signin/public/base/session_binding_utils_unittest.cc +++ b/components/signin/public/base/session_binding_utils_unittest.cc
@@ -161,9 +161,19 @@ } TEST(SessionBindingUtilsTest, AppendSignatureToHeaderAndPayload) { - std::string result = AppendSignatureToHeaderAndPayload( - "abc.efg", std::vector<uint8_t>({1, 2, 3})); + absl::optional<std::string> result = AppendSignatureToHeaderAndPayload( + "abc.efg", + crypto::SignatureVerifier::SignatureAlgorithm::RSA_PKCS1_SHA256, + std::vector<uint8_t>({1, 2, 3})); EXPECT_EQ(result, "abc.efg.AQID"); } +TEST(SessionBindingUtilsTest, + AppendSignatureToHeaderAndPayloadInvalidECDSASignature) { + absl::optional<std::string> result = AppendSignatureToHeaderAndPayload( + "abc.efg", crypto::SignatureVerifier::SignatureAlgorithm::ECDSA_SHA256, + std::vector<uint8_t>({1, 2, 3})); + EXPECT_EQ(result, absl::nullopt); +} + } // namespace signin
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index 40ff9de..0099001 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Kantoormeubels</translation> <translation id="5513528801833998679">Gebruik toestelaanmelding</translation> <translation id="5515388687005870733">55x85 mm</translation> -<translation id="5516095341424241911">Gebruik Google se sekuriteittegnologie om jou betaalinligting veilig te hou</translation> <translation id="5518670652865028077">Kuns en vermaak</translation> <translation id="5519516356611866228">Met jou veranderinge</translation> <translation id="5519696598216267194">Papier (vooraf gepons)</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index 6aa2ff7..e960f70 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">የቢሮ ዕቃዎች</translation> <translation id="5513528801833998679">የመሣሪያ በመለያ መግባትን ተጠቀም</translation> <translation id="5515388687005870733">55 x 85 ሚሜ</translation> -<translation id="5516095341424241911">የክፍያ መረጃዎን ደህንነት ጠብቆ ለማቆየት የGoogleን የደህንነት ቴክኖሎጂ በመጠቀም ላይ</translation> <translation id="5518670652865028077">ስነ ጥበቦች እና መዝናኛ</translation> <translation id="5519516356611866228">ከእርስዎ ለውጦች ጋር</translation> <translation id="5519696598216267194">ወረቀት (ቀድሞ የተመታ)</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index a9ad8ee..756f00e 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -2184,7 +2184,6 @@ <translation id="5512812358367123529">أثاث مكتبي</translation> <translation id="5513528801833998679">استخدام طريقة فتح الجهاز</translation> <translation id="5515388687005870733">55 × 85 ملم</translation> -<translation id="5516095341424241911">حافِظ على أمان معلومات الدفع الخاصة بك باستخدام تكنولوجيا الأمان من Google.</translation> <translation id="5518670652865028077">فنون وترفيه</translation> <translation id="5519516356611866228">مع التغييرات التي أجريتها</translation> <translation id="5519696598216267194">ورق (مثقوب مسبقًا)</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index f475910c..5ff378f0 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -2176,7 +2176,6 @@ <translation id="5512812358367123529">কাৰ্যালয়ৰ আচবাব</translation> <translation id="5513528801833998679">ডিভাইচত ছাইন ইন কৰাটো ব্যৱহাৰ কৰক</translation> <translation id="5515388687005870733">৫৫ x ৮৫ মি.মি.</translation> -<translation id="5516095341424241911">আপোনাৰ পৰিশোধৰ তথ্য সুৰক্ষিত কৰি ৰাখিবলৈ Googleৰ সুৰক্ষা সম্পর্কীয় প্ৰযুক্তিবিদ্যা ব্যৱহাৰ কৰি থকা হৈছে</translation> <translation id="5518670652865028077">কলা আৰু মনোৰঞ্জন</translation> <translation id="5519516356611866228">আপুনি কৰা সালসলনিসমূহৰ সৈতে</translation> <translation id="5519696598216267194">কাগজ (আগতে পাঞ্চ কৰা)</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index 3ee53ac..0ee8161 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -2176,7 +2176,6 @@ <translation id="5512812358367123529">Ofis mebelləri</translation> <translation id="5513528801833998679">Cihaz girişindən istifadə edin</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Ödəniş məlumatının təhlükəsizliyi üçün Google təhlükəsizlik texnologiyasından istifadə edilir</translation> <translation id="5518670652865028077">İncəsənət və əyləncə</translation> <translation id="5519516356611866228">Dəyişikliklərlə</translation> <translation id="5519696598216267194">Kağız (ön dəlikli)</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index 809cf64..6ecae43 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">Офісная мэбля</translation> <translation id="5513528801833998679">Ажыццявіць уваход з прылады</translation> <translation id="5515388687005870733">55 x 85 мм</translation> -<translation id="5516095341424241911">Тэхналогіі бяспекі Google абараняюць вашу плацежную інфармацыю</translation> <translation id="5518670652865028077">Мастацтва і забавы</translation> <translation id="5519516356611866228">З унесенымі вамі змяненнямі</translation> <translation id="5519696598216267194">Папера з перфарацыяй</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 365ece46..d05951d 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Офис обзавеждане</translation> <translation id="5513528801833998679">Използване на опцията за вход в устройството</translation> <translation id="5515388687005870733">55 x 85 мм</translation> -<translation id="5516095341424241911">За защита на данните ви за плащане се използва технологията на Google за сигурност</translation> <translation id="5518670652865028077">Изкуство и развлечения</translation> <translation id="5519516356611866228">С промените ви</translation> <translation id="5519696598216267194">Хартия (перфорирана)</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 6998ab8..8ee964a 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -2181,7 +2181,6 @@ <translation id="5512812358367123529">অফিসের আসবাবপত্র</translation> <translation id="5513528801833998679">'ডিভাইস সাইন-ইন' পদ্ধতি ব্যবহার করুন</translation> <translation id="5515388687005870733">৫৫ x ৮৫ মিমি</translation> -<translation id="5516095341424241911">আপনার পেমেন্ট সংক্রান্ত তথ্য Google-এর সুরক্ষা প্রযুক্তি ব্যবহার করে নিরাপদে রাখা হয়েছে</translation> <translation id="5518670652865028077">আর্ট এবং বিনোদন</translation> <translation id="5519516356611866228">আপনার করা এডিট সমেত</translation> <translation id="5519696598216267194">পেপার (প্রিপাঞ্চড)</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index 37677413..0bbbf39 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Uredski namještaj</translation> <translation id="5513528801833998679">Koristi prijavu na uređaj</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Korištenje Googleove sigurnosne tehnologije za zaštitu vaših podataka o plaćanju</translation> <translation id="5518670652865028077">Umjetnost i zabava</translation> <translation id="5519516356611866228">S vašim promjenama</translation> <translation id="5519696598216267194">Papir (unaprijed perforirani)</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index e3ec7728..a3f0d03c 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Mobiliari d’oficina</translation> <translation id="5513528801833998679">Utilitza l'inici de sessió del dispositiu</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Amb la tecnologia de seguretat de Google per protegir la teva informació de pagament</translation> <translation id="5518670652865028077">Art i entreteniment</translation> <translation id="5519516356611866228">Amb els meus canvis</translation> <translation id="5519696598216267194">Paper (perforat)</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 9fe4c32a..1c76c48 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -2176,7 +2176,6 @@ <translation id="5512812358367123529">Kancelářský nábytek</translation> <translation id="5513528801833998679">Použít přihlášení v zařízení</translation> <translation id="5515388687005870733">55 × 85 mm</translation> -<translation id="5516095341424241911">Používání bezpečnostní technologie Google k zabezpečení vašich platebních údajů</translation> <translation id="5518670652865028077">Umění a zábava</translation> <translation id="5519516356611866228">S vašimi změnami</translation> <translation id="5519696598216267194">Papír (předděrovaný)</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index 8facc00..8dba28e8 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">Dodrefn Swyddfa</translation> <translation id="5513528801833998679">Defnyddio mewngofnodi dyfais</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Yn defnyddio technoleg diogelwch Google i gadw'ch gwybodaeth talu yn ddiogel</translation> <translation id="5518670652865028077">Y celfyddydau ac adloniant</translation> <translation id="5519516356611866228">Gyda'ch newidiadau</translation> <translation id="5519696598216267194">Papur (Rhagdyllwyd)</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index cf45f9e..eb1fcb0a 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Kontormøbler</translation> <translation id="5513528801833998679">Brug login på enheden</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Brug Googles sikkerhedsteknologi til at beskytte dine betalingsoplysninger</translation> <translation id="5518670652865028077">Kunst og underholdning</translation> <translation id="5519516356611866228">Med dine ændringer</translation> <translation id="5519696598216267194">Papir (hullet)</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 1fb886d8a..4fab658 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -2167,7 +2167,6 @@ <translation id="5512812358367123529">Büromöbel</translation> <translation id="5513528801833998679">Geräteanmeldung verwenden</translation> <translation id="5515388687005870733">55 × 85 mm</translation> -<translation id="5516095341424241911">Die Sicherheitstechnologie von Google schützt deine Zahlungsinformationen</translation> <translation id="5518670652865028077">Kunst und Unterhaltung</translation> <translation id="5519516356611866228">Mit meinen Änderungen</translation> <translation id="5519696598216267194">Papier (vorgestanzt)</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index f55918a..d9797a8 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -2181,7 +2181,6 @@ <translation id="5512812358367123529">Έπιπλα γραφείου</translation> <translation id="5513528801833998679">Χρήση σύνδεσης συσκευής</translation> <translation id="5515388687005870733">55 x 85 χιλ.</translation> -<translation id="5516095341424241911">Χρησιμοποιήστε την τεχνολογία ασφάλειας της Google για την προστασία των στοιχείων πληρωμής σας</translation> <translation id="5518670652865028077">Τέχνες και ψυχαγωγία</translation> <translation id="5519516356611866228">Με τις αλλαγές σας</translation> <translation id="5519696598216267194">Χαρτί (Με τρύπες)</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index b74e7b2..97f71711 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Office Furniture</translation> <translation id="5513528801833998679">Use device sign-in</translation> <translation id="5515388687005870733">55 mm x 85 mm</translation> -<translation id="5516095341424241911">Using Google’s security technology to keep your payment info secure</translation> <translation id="5518670652865028077">Arts and entertainment</translation> <translation id="5519516356611866228">With your changes</translation> <translation id="5519696598216267194">Paper (prepunched)</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 89d4168c8..a99fc9eb 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -2181,7 +2181,6 @@ <translation id="5512812358367123529">Muebles de oficina</translation> <translation id="5513528801833998679">Usar el acceso del dispositivo</translation> <translation id="5515388687005870733">55 × 85 mm</translation> -<translation id="5516095341424241911">Uso de la tecnología de seguridad de Google para proteger tu información de pago</translation> <translation id="5518670652865028077">Arte y entretenimiento</translation> <translation id="5519516356611866228">Con tus cambios</translation> <translation id="5519696598216267194">Papel (perforado)</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index a99a600..8490bc0 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Mobiliario de oficina</translation> <translation id="5513528801833998679">Usar el inicio de sesión del dispositivo</translation> <translation id="5515388687005870733">55x85 mm</translation> -<translation id="5516095341424241911">Usando tecnología de seguridad de Google para mantener la información de tu pago segura.</translation> <translation id="5518670652865028077">Arte y entretenimiento</translation> <translation id="5519516356611866228">Con tus cambios</translation> <translation id="5519696598216267194">Papel (perforado)</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 87ce5af..e44067b 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Kontorimööbel</translation> <translation id="5513528801833998679">Kasuta seadmesse sisselogimist</translation> <translation id="5515388687005870733">55 × 85 mm</translation> -<translation id="5516095341424241911">Google'i turvatehnoloogia kasutamine aitab tagada teie makseteabe turvalisuse</translation> <translation id="5518670652865028077">Kunst ja meelelahutus</translation> <translation id="5519516356611866228">Koos teie tehtud muudatustega</translation> <translation id="5519696598216267194">Paber (augustatud)</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 0d94f71..da581c6 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -2174,7 +2174,6 @@ <translation id="5512812358367123529">Bulegoko altzariak</translation> <translation id="5513528801833998679">Erabili gailuko saio-hasiera</translation> <translation id="5515388687005870733">55 × 85 mm</translation> -<translation id="5516095341424241911">Google-ren segurtasun-teknologia erabiltzen zure ordainketa-informazioa babesteko</translation> <translation id="5518670652865028077">Artea eta aisia</translation> <translation id="5519516356611866228">Aldaketekin</translation> <translation id="5519696598216267194">Papera (trokelatua)</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index b1fccee..7d2913f 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">مبلمان اداری</translation> <translation id="5513528801833998679">استفاده از ورود به سیستم دستگاه</translation> <translation id="5515388687005870733">۸۵ × ۵۵ اینچ</translation> -<translation id="5516095341424241911">برای حفظ امنیت اطلاعات پرداخت شما از فناوری امنیتی Google استفاده میشود</translation> <translation id="5518670652865028077">هنر و سرگرمی</translation> <translation id="5519516356611866228">با تغییرات اعمالشده</translation> <translation id="5519696598216267194">کاغذ (ازپیش پانچشده)</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 8ecf622b..860a4bb5 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -2181,7 +2181,6 @@ <translation id="5512812358367123529">Toimistokalusteet</translation> <translation id="5513528801833998679">Käytä laitteen sisäänkirjautumista</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Pidämme maksutiedot turvassa Googlen suojausteknologian avulla</translation> <translation id="5518670652865028077">Taide ja viihde</translation> <translation id="5519516356611866228">Muutosten kanssa</translation> <translation id="5519696598216267194">Paperi (rei'itetty)</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 6b29a5d..0e6a0f23 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Kasangkapang Pang-opisina</translation> <translation id="5513528801833998679">Gamitin ang pag-sign in sa device</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Gumagamit ng teknolohiya sa seguridad ng Google para panatilihing secure ang iyong impormasyon sa pagbabayad</translation> <translation id="5518670652865028077">Sining at entertainment</translation> <translation id="5519516356611866228">Kasama ang iyong mga pagbabago</translation> <translation id="5519696598216267194">Papel (Naka-prepunch)</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 094fd6ad..adb1c4c5 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -2174,7 +2174,6 @@ <translation id="5512812358367123529">Mobilier de bureau</translation> <translation id="5513528801833998679">Utiliser la connexion à l'appareil</translation> <translation id="5515388687005870733">55 mm x 85 mm</translation> -<translation id="5516095341424241911">Utilisation de la technologie de sécurité de Google pour sécuriser vos renseignements de paiement en cours…</translation> <translation id="5518670652865028077">Arts et divertissement</translation> <translation id="5519516356611866228">Avec vos modifications</translation> <translation id="5519696598216267194">Papier (préperforé)</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 4f804d3a..cbbccb2 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Mobilier d'entreprise</translation> <translation id="5513528801833998679">Utiliser la connexion à l'appareil</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Utilisation de la technologie de sécurité Google pour protéger vos informations de paiement…</translation> <translation id="5518670652865028077">Arts et divertissements</translation> <translation id="5519516356611866228">Avec vos modifications</translation> <translation id="5519696598216267194">Papier (perforé)</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 7983d0a..31ff4a3 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Mobiliario de oficina</translation> <translation id="5513528801833998679">Usar inicio de sesión do dispositivo</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Usando tecnoloxía de seguranza de Google para protexer a información de pago</translation> <translation id="5518670652865028077">Arte e entretemento</translation> <translation id="5519516356611866228">Cos teus cambios</translation> <translation id="5519696598216267194">Papel (perforado previamente)</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 6ae47daa..5b626e2 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">ઑફિસ ફર્નિચર</translation> <translation id="5513528801833998679">ડિવાઇસની સાઇન-ઇન પ્રક્રિયાનો ઉપયોગ કરો</translation> <translation id="5515388687005870733">55 x 85 મિમી</translation> -<translation id="5516095341424241911">તમારી ચુકવણીની માહિતી સુરક્ષિત રાખવા માટે Googleની સુરક્ષા ટેક્નોલોજીનો ઉપયોગ</translation> <translation id="5518670652865028077">કળા અને મનોરંજન</translation> <translation id="5519516356611866228">તમારા ફેરફારો સાથે</translation> <translation id="5519696598216267194">પેપર (પહેલેથી પંચ કરેલું)</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 2fe23f9f..a91e4ad2 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -52,8 +52,10 @@ <translation id="1080116354587839789">चौड़ाई में फ़िट करें</translation> <translation id="1081061862829655580">ट्रे 19</translation> <translation id="1089439967362294234">पासवर्ड बदलें</translation> +<translation id="1090629319939036170">वीआर मेन्यू</translation> <translation id="1094777233105318927">आपके ब्राउज़र, ओएस, डिवाइस, इंस्टॉल किए गए सॉफ़्टवेयर, और फ़ाइलों की जानकारी</translation> <translation id="1096545575934602868">इस फ़ाइल में <ph name="MAX_ITEMS_LIMIT" /> से ज़्यादा एंट्री नहीं हो सकती. इसके बाद की सभी एंट्री खारिज हो जाएंगी.</translation> +<translation id="1099928364755383720">अपने-आप 'पिक्चर में पिक्चर' मोड में जाने की सेटिंग</translation> <translation id="1100782917270858593">'Chrome इतिहास' में आपकी गतिविधि फिर से शुरू करने का बटन, अपनी गतिविधि फिर से शुरू करने के लिए, Enter दबाएं. इससे आपको 'Chrome इतिहास' में आपके काम की गतिविधि दिखेगी</translation> <translation id="1101672080107056897">गड़बड़ी पर कार्रवाई</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" /> का हमेशा अनुवाद करें</translation> @@ -477,6 +479,7 @@ <translation id="192095259937375524">'इस टैब को शेयर करें' बटन, लिंक शेयर करके, क्यूआर कोड बनाकर, कास्ट करके, और अन्य विकल्पों की मदद से इस टैब को शेयर करने के लिए इसे चालू करें</translation> <translation id="1924727005275031552">नया</translation> <translation id="1935995810530254458">फिर भी कॉपी करें</translation> +<translation id="1939059826036755332">अपने-आप 'पिक्चर में पिक्चर' मोड में जाने की सेटिंग</translation> <translation id="1939175642807587452">साइट, सूचनाएं भेजने की अनुमति मांग सकती है</translation> <translation id="1940441167050915935">सेव किए गए सुरक्षा कोड मिटाएं</translation> <translation id="1943994668912612445">डिज़ाइन</translation> @@ -509,6 +512,7 @@ <translation id="201174227998721785">Chrome की सेटिंग में अलग-अलग साइटों पर सेव डेटा और अनुमतियों को मैनेज करें</translation> <translation id="2012276282211112603">इस समय दिखाने के लिए कोई विषय नहीं है</translation> <translation id="2018769312928511665">फ़ैब्रिक (ग्लॉसी)</translation> +<translation id="2020779321517562133">कॉपी हटाएं</translation> <translation id="2021333772895814435">इस नीति से, <ph name="ACTION_LIST" /> के सभी डिवाइसों पर सिंक होने की सुविधा अपने-आप बंद हो जाती है.</translation> <translation id="202224654587969958">12 x 19 इंच</translation> <translation id="2022815493835288714">पेमेंट की नई सेटिंग के बारे में सूचना चालू है</translation> @@ -764,6 +768,7 @@ <translation id="2551608178605132291">पता: <ph name="ADDRESS" />.</translation> <translation id="2552246211866555379">हगाकी (पोस्टकार्ड)</translation> <translation id="2552295903035773204">अब से, कार्ड की पुष्टि करने के लिए स्क्रीन लॉक इस्तेमाल करें</translation> +<translation id="2552532158894206888">दाईं ओर मौजूद बटन</translation> <translation id="2553853292994445426">अपने सुरक्षित डीएनएस की सेटिंग की जांच करें. शायद आपने सुरक्षित डीएनएस सर्वर को कॉन्फ़िगर किया होगा, जिससे आप कनेक्ट नहीं हो पा रहे.</translation> <translation id="255497580849974774">अपडेट के दौरान, कृपया अपने डिवाइस को चार्जर से कनेक्ट करके रखें.</translation> <translation id="2556876185419854533">&बदलाव को पहले जैसा करें</translation> @@ -829,6 +834,7 @@ <translation id="2688969097326701645">हां, जारी रखें</translation> <translation id="2691924980723297736">सुरक्षा की चेतावनी</translation> <translation id="2692131511336778528">साइंस फ़िक्शन और फ़ैंटेसी</translation> +<translation id="2699273987028089219">सबमेन्यू उपलब्ध है. ज़्यादा विकल्पों पर जाने के लिए <ph name="SHORTCUT" /> का इस्तेमाल करें.</translation> <translation id="2701514975700770343">उलटा करके रखें</translation> <translation id="2702592986366989640">कम कीमत वाला विकल्प</translation> <translation id="2702801445560668637">रीडिंग लिस्ट</translation> @@ -973,6 +979,7 @@ <translation id="3023165109041533893">साइट की ओर से सुझाए गए विज्ञापन सेटिंग दिखाने का विकल्प चुनने पर, आपके ब्राउज़िंग इतिहास और पहचान को सुरक्षित रखने में मदद मिलती है. साथ ही, इसका इस्तेमाल साइटों पर काम के विज्ञापन दिखाने के लिए किया जाता है. ब्राउज़िंग जारी रखने पर, आपकी विज़िट की गई साइट आपको काम के विज्ञापनों का सुझाव दे सकती है. ये सुझाव, आपकी गतिविधि के आधार पर दिए जाते हैं. सेटिंग में जाकर, इन साइटों की सूची देखी जा सकती है. साथ ही, इस सूची से उन साइटों को ब्लॉक किया जा सकता है जिनके सुझाव आपको नहीं चाहिए.</translation> <translation id="3024663005179499861">गलत नीति प्रकार</translation> <translation id="3029752078111257850">दुनिया भर की खबरें</translation> +<translation id="3030331669969285614">ये फ़्लैग, नुकसान पहुंचा सकने वाले बदलाव को रोकते या उन्हें पहले जैसा करते हैं. साथ ही, ये फ़्लैग सिर्फ़ कुछ समय के लिए उपलब्ध रहते हैं.</translation> <translation id="3036894576201005614">घर की साफ़-सफ़ाई में इस्तेमाल होने वाली चीज़ें</translation> <translation id="3037177537145227281">कीमत ट्रैक की जा रही है</translation> <translation id="3037605927509011580">हे भगवान!</translation> @@ -1252,6 +1259,7 @@ <translation id="3603507503523709">आपके एडमिन ने ऐप्लिकेशन को ब्लॉक कर दिया है</translation> <translation id="3605899229568538311">5 x 5 इंच</translation> <translation id="3608932978122581043">फ़ीड ओरिएंटेशन</translation> +<translation id="3610142117915544498">अगली बार तेज़ी से पैसे चुकाने के लिए, अपने कार्ड की जानकारी, नाम, और बिलिंग पते को Google खाते में सेव करें</translation> <translation id="3611317423880285981">घरेलू सामान</translation> <translation id="3614103345592970299">आकार 2</translation> <translation id="361438452008624280">सूची एंट्री "<ph name="LANGUAGE_ID" />": अनजान या काम नहीं करने वाली भाषा.</translation> @@ -1490,6 +1498,7 @@ <translation id="4111546256784973544">पेंटबॉल</translation> <translation id="4112140312785995938">पीछे जाएं</translation> <translation id="4113354056388982663">Android की परफ़ॉर्मेंस से जुड़ा ज़रूरी अपडेट</translation> +<translation id="4114007503059268298">क्या आपको इस कार्ड की जानकारी अपने Google खाते और इस डिवाइस में सेव करनी है?</translation> <translation id="4114146879518089587">साइट पर जाएं</translation> <translation id="4116663294526079822">इस साइट पर हमेशा अनुमति दें</translation> <translation id="4116701314593212016">JIS B7</translation> @@ -1711,9 +1720,11 @@ <translation id="4526465106919207193">लोग और समाज</translation> <translation id="4530347922939905757">मैसेज</translation> <translation id="4531477351494678589">वर्चुअल कार्ड नंबर:</translation> +<translation id="4535523368173457420">ये सर्च इंजन आपके देश/इलाके में लोकप्रिय हैं और इन्हें किसी खास क्रम में नहीं दिखाया गया है</translation> <translation id="4540780316273593836">कोई गड़बड़ी हुई</translation> <translation id="4541810033354695636">ऑगमेंटेड रिएलिटी (एआर)</translation> <translation id="4542971377163063093">ट्रे 6</translation> +<translation id="4543072026714825470">अगली बार तेज़ी से पैसे चुकाने के लिए, अपने कार्ड की जानकारी और बिलिंग पते को Google खाते में सेव करें</translation> <translation id="4546730006268514143">ट्रांसफ़र करने का समय खत्म हो गया</translation> <translation id="455113658016510503">ए9</translation> <translation id="4556069465387849460">आपने पासवर्ड डालने के लिए, स्क्रीन लॉक का इस्तेमाल किया है</translation> @@ -2178,7 +2189,6 @@ <translation id="5512812358367123529">ऑफ़िस का फ़र्नीचर</translation> <translation id="5513528801833998679">Use device sign-in</translation> <translation id="5515388687005870733">55 x 85 मि॰मी॰</translation> -<translation id="5516095341424241911">अपने पेमेंट की जानकारी को सुरक्षित रखने के लिए, Google की सुरक्षा टेक्नोलॉजी का इस्तेमाल करना</translation> <translation id="5518670652865028077">कला और मनोरंजन</translation> <translation id="5519516356611866228">किए गए बदलावों के साथ दस्तावेज़ डाउनलोड करें</translation> <translation id="5519696598216267194">पेपर (प्रीपंच्ड)</translation> @@ -2472,6 +2482,7 @@ <translation id="6126565365696310362">चाइनीज़ #2 साइज़ का लिफ़ाफ़ा</translation> <translation id="6127379762771434464">आइटम निकाला गया</translation> <translation id="6132161237766805930"><ph name="BEGIN_LINK" />Chrome में गुप्त मोड की सुविधा के बारे में ज़्यादा जानें<ph name="END_LINK" /></translation> +<translation id="6133320744616005677">अनुमति देना जारी रखें</translation> <translation id="6133984428121856852">फ़ाइल एक्सटेंशन खाली है या खराब है.</translation> <translation id="6139975341602920272">17 x 22 इंच</translation> <translation id="6146055958333702838">सभी केबल जांचें और आपके उपयोग किए जा रहे सभी राउटर, मॉडेम या अन्य नेटवर्क @@ -2506,6 +2517,7 @@ <translation id="6217950634729714357">किचन और डाइनिंग फ़र्नीचर</translation> <translation id="6218753634732582820">क्रोमियम से पता निकालें?</translation> <translation id="622039917539443112">पैरलल फ़ोल्ड</translation> +<translation id="6221311046884916259">क्या आपको इस कार्ड की जानकारी अपने Google खाते में सेव करनी है?</translation> <translation id="6221345481584921695">Google सुरक्षित ब्राउज़िंग को <ph name="SITE" /> पर हाल ही में <ph name="BEGIN_LINK" />मैलवेयर का पता चला<ph name="END_LINK" /> है. आमतौर पर सुरक्षित रहने वाली वेबसाइटें कभी-कभी मैलेवयर से संक्रमित हो जाती हैं. नुकसान पहुंचाने वाली सामग्री <ph name="SUBRESOURCE_HOST" /> से आती है, जो कि एक ज्ञात मैलवेयर वितरक है.</translation> <translation id="6221892641068781024">सरल बनाया गया व्यू</translation> <translation id="6222527803348563979">स्टेशनरी</translation> @@ -2810,6 +2822,7 @@ <translation id="6852204201400771460">ऐप्लिकेशन फिर लोड करें?</translation> <translation id="6857776781123259569">पासवर्ड मैनेज करें...</translation> <translation id="6858034839887287663">A2x4</translation> +<translation id="6860888819347870819">'पिक्चर में पिक्चर' मोड में जाने की अनुमति ली जा सकती है</translation> <translation id="6864189428899665393">267 x 389 मि॰मी॰</translation> <translation id="686485648936420384">उपभोक्ता संसाधन</translation> <translation id="6865412394715372076">इस कार्ड की पुष्टि अभी नहीं की जा सकती</translation> @@ -3397,6 +3410,7 @@ <translation id="8003046808285812021">“<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">ब्राउज़र</translation> <translation id="8009225694047762179">पासवर्ड संभालें</translation> +<translation id="8009460986924589054"><ph name="BEGIN_LINK" />अपनी कुकी मिटाकर देखें<ph name="END_LINK" /></translation> <translation id="8009843239480947060">10 x 11 इंच</translation> <translation id="8012116502927253373">{NUM_CARDS,plural, =1{इस कार्ड और इसके बिलिंग पते को सेव किया जाएगा. <ph name="USER_EMAIL" /> में साइन इन रहने पर आप इसका इस्तेमाल कर पाएंगे.}one{ये कार्ड और इनके बिलिंग पते सेव किए जाएंगे. <ph name="USER_EMAIL" /> में साइन इन रहने पर आप उनका इस्तेमाल कर पाएंगे.}other{ये कार्ड और इनके बिलिंग पते सेव किए जाएंगे. <ph name="USER_EMAIL" /> में साइन इन रहने पर आप उनका इस्तेमाल कर पाएंगे.}}</translation> <translation id="8012647001091218357">हम इस समय आपके अभिभावकों तक नहीं पहुंच पा रहे हैं. कृपया फिर से प्रयास करें.</translation> @@ -3466,6 +3480,7 @@ <translation id="8127301229239896662">"<ph name="SOFTWARE_NAME" />" आपके कंप्यूटर या नेटवर्क पर ठीक से इंस्टॉल नहीं हुआ था. अपने आईटी व्यवस्थापक से इस समस्या को ठीक करने के लिए कहें.</translation> <translation id="8131740175452115882">पुष्टि करें</translation> <translation id="8134058435519644366">रिक्रूटमेंट और स्टाफ़िंग</translation> +<translation id="8135546115396015134">बाईं ओर मौजूद बटन</translation> <translation id="8144303576836498784">कोई गड़बड़ी हुई. आपने जो बदलाव किया वह सेव नहीं हुआ</translation> <translation id="8148608574971654810">पीडीएफ़ का वर्शन:</translation> <translation id="8149426793427495338">आपका कंप्यूटर निष्क्रिय हो गया है.</translation> @@ -3690,10 +3705,12 @@ <translation id="8576310925653847813">होम थिएटर सिस्टम</translation> <translation id="8577192028579836704">सभी विकल्प आम तौर पर, <ph name="TYPICAL_PRICE" /></translation> <translation id="8577348305244205642">वर्चुअल कार्ड उपलब्ध नहीं है</translation> +<translation id="8585615573162100611"><ph name="PERMISSION" /> ऐक्सेस करने की अनुमति देना बंद करें</translation> <translation id="8586082901536468629">स्क्वाश और रैकेटबॉल इक्विपमेंट</translation> <translation id="858637041960032120">फ़ोन नंबर जोड़ें </translation> <translation id="8589998999637048520">सबसे अच्छी क्वालिटी</translation> +<translation id="8590264442799989746"><ph name="HOST_NAME" /> और अन्य होस्ट</translation> <translation id="8600271352425265729">सिर्फ़ इस बार अनुमति दें</translation> <translation id="860043288473659153">कार्डधारक का नाम</translation> <translation id="8601027005147870853"><ph name="BEGIN_BOLD" />किस डेटा का इस्तेमाल किया जाता है:<ph name="END_BOLD" /> इस डिवाइस पर, Chrome पर विज़िट की गई किसी साइट पर आपकी गतिविधि का डेटा.</translation> @@ -4015,6 +4032,7 @@ <translation id="984275831282074731">पैसे चुकाने के तरीके</translation> <translation id="985199708454569384"><p>अगर आपके कंप्यूटर या मोबाइल डिवाइस की तारीख और समय गलत है, तो आपको यह गड़बड़ी दिखाई देगी.</p> <p>इस गड़बड़ी को ठीक करने के लिए, अपने डिवाइस की घड़ी खोलें. पक्का करें कि समय और तारीख सही हों.</p></translation> +<translation id="986257639512122511">आपने <ph name="ORIGIN" /> पर <ph name="PERMISSION" /> ऐक्सेस करने की अनुमति दी है</translation> <translation id="987264212798334818">सामान्य</translation> <translation id="988159990683914416">डेवलपर बिल्ड</translation> <translation id="989988560359834682">पते में बदलाव करें</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 3773042..d7de390 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">Uredski namještaj</translation> <translation id="5513528801833998679">Upotrijebi prijavu na uređaj</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Upotreba Googleove sigurnosne tehnologije za zaštitu podataka o plaćanju</translation> <translation id="5518670652865028077">Umjetnost i zabava</translation> <translation id="5519516356611866228">S vašim promjenama</translation> <translation id="5519696598216267194">Papir (perforiran)</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 3d659a46..7d6849b3 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -2178,7 +2178,6 @@ <translation id="5512812358367123529">Irodai bútorok</translation> <translation id="5513528801833998679">Eszközbejelentkezés használata</translation> <translation id="5515388687005870733">55 × 85 mm</translation> -<translation id="5516095341424241911">A Google biztonsági technológiáját használjuk a fizetési adatok biztonságának megőrzése érdekében</translation> <translation id="5518670652865028077">Művészet és szórakoztatás</translation> <translation id="5519516356611866228">Az Ön módosításaival</translation> <translation id="5519696598216267194">Papír (előlyukasztott)</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index 3ea909f..55338fae 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -2191,7 +2191,6 @@ <translation id="5512812358367123529">Գրասենյակային կահույք</translation> <translation id="5513528801833998679">Օգտագործել սարքի մուտքը</translation> <translation id="5515388687005870733">55 x 85 մմ</translation> -<translation id="5516095341424241911">Ձեր վճարային տվյալները պաշտպանելու համար օգտագործվում է Google-ի անվտանգության տեխնոլոգիան</translation> <translation id="5518670652865028077">Արվեստ և զվարճանք</translation> <translation id="5519516356611866228">Ձեր կատարած փոփոխություններով</translation> <translation id="5519696598216267194">Թուղթ (նախապես դակված)</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index c85a579d..f5cc420 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Furnitur Kantor</translation> <translation id="5513528801833998679">Gunakan login di perangkat</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Menggunakan teknologi keamanan Google untuk menjaga info pembayaran Anda tetap aman</translation> <translation id="5518670652865028077">Seni & hiburan</translation> <translation id="5519516356611866228">Dengan perubahan dari Anda</translation> <translation id="5519696598216267194">Kertas (Berlubang)</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index d59a098d..9a7403277 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Skrifstofuhúsgögn</translation> <translation id="5513528801833998679">Nota innskráningu tækis</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Við notum öryggistækni Google til að gæta að öryggi greiðsluupplýsinganna þinna</translation> <translation id="5518670652865028077">Listir og afþreying</translation> <translation id="5519516356611866228">Með breytingunum þínum</translation> <translation id="5519696598216267194">Pappír (forþrykktur)</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 364206b..969c1b5 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -2177,7 +2177,6 @@ <translation id="5512812358367123529">Arredamento per ufficio</translation> <translation id="5513528801833998679">Usa accesso al dispositivo</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Utilizzo della tecnologia di sicurezza di Google per proteggere i tuoi dati di pagamento in corso…</translation> <translation id="5518670652865028077">Arti e intrattenimento</translation> <translation id="5519516356611866228">Con le tue modifiche</translation> <translation id="5519696598216267194">Carta (preforata)</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index e46a65e..a74eb3f6 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -2185,7 +2185,6 @@ <translation id="5512812358367123529">ריהוט משרדי</translation> <translation id="5513528801833998679">שימוש בכניסה לחשבון במכשיר</translation> <translation id="5515388687005870733">55x85 מ"מ</translation> -<translation id="5516095341424241911">טכנולוגיית האבטחה של Google משמשת לשמירה על אבטחת פרטי התשלום</translation> <translation id="5518670652865028077">אומנות ובידור</translation> <translation id="5519516356611866228">עם השינויים שלך</translation> <translation id="5519696598216267194">Paper (Prepunched)</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 7bc82dc..a9b1b88 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">オフィス家具</translation> <translation id="5513528801833998679">デバイスのログイン情報を使用</translation> <translation id="5515388687005870733">55x85 mm</translation> -<translation id="5516095341424241911">お支払い情報は Google のセキュリティ技術で保護されます</translation> <translation id="5518670652865028077">アート、エンターテインメント</translation> <translation id="5519516356611866228">変更後のバージョン</translation> <translation id="5519696598216267194">紙(穴開き)</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index 3b9a4c6..3fafaa8 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">საოფისე ავეჯი</translation> <translation id="5513528801833998679">მოწყობილობის შესვლის მეთოდის გამოყენება</translation> <translation id="5515388687005870733">55 x 85 მმ</translation> -<translation id="5516095341424241911">Google-ის უსაფრთხოების ტექნოლოგიის გამოყენება თქვენი საგადახდო ინფორმაციის დაცულობისთვის</translation> <translation id="5518670652865028077">ხელოვნება და გართობა</translation> <translation id="5519516356611866228">თქვენი ცვლილებებით</translation> <translation id="5519696598216267194">ქაღალდი (პერფორირებული)</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 060e0a7..5f7219b 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">Кеңсе жиһазы</translation> <translation id="5513528801833998679">Құрылғының кіру кілтін пайдалану</translation> <translation id="5515388687005870733">55 x 85 мм</translation> -<translation id="5516095341424241911">Төлем туралы ақпаратты қауіпсіз сақтау үшін Google қауіпсіздік технологиясын пайдаланыңыз.</translation> <translation id="5518670652865028077">Өнер және ойын-сауық</translation> <translation id="5519516356611866228">Өзгертулеріңізбен</translation> <translation id="5519696598216267194">Қағаз (алдын ала тесілген)</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index 5ea31853..65c1c031 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -2184,7 +2184,6 @@ <translation id="5512812358367123529">គ្រឿងសង្ហារិមការិយាល័យ</translation> <translation id="5513528801833998679">ប្រើការចូលឧបករណ៍</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">ប្រើបច្ចេកវិទ្យាសុវត្ថិភាពរបស់ Google ដើម្បីរក្សាព័ត៌មានអំពីការទូទាត់ប្រាក់របស់អ្នកឱ្យមានសុវត្ថិភាព</translation> <translation id="5518670652865028077">សិល្បៈ និងការកម្សាន្ត</translation> <translation id="5519516356611866228">ជាមួយការផ្លាស់ប្ដូររបស់អ្នក</translation> <translation id="5519696598216267194">ក្រដាស (ចោះរន្ធស្រាប់)</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index fc8d7569..fac82adc2 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -2177,7 +2177,6 @@ <translation id="5512812358367123529">ಕಚೇರಿ ಪೀಠೋಪಕರಣ</translation> <translation id="5513528801833998679">ಸಾಧನದ ಸೈನ್-ಇನ್ ಬಳಸಿ</translation> <translation id="5515388687005870733">55 x 85 ಮಿಮೀ</translation> -<translation id="5516095341424241911">ನಿಮ್ಮ ಪಾವತಿ ಮಾಹಿತಿಯನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸಲು Google ನ ಭದ್ರತಾ ತಂತ್ರಜ್ಞಾನವನ್ನು ಬಳಸುತ್ತಿದೆ</translation> <translation id="5518670652865028077">ಕಲೆ ಮತ್ತು ಮನರಂಜನೆ</translation> <translation id="5519516356611866228">ನಿಮ್ಮ ಬದಲಾವಣೆಗಳ ಜೊತೆಗೆ</translation> <translation id="5519696598216267194">ಕಾಗದ (ಪ್ರಿಪಂಚ್ಮಾಡಲಾದ)</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 0aab1302d..c0c1b807 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">사무용 가구</translation> <translation id="5513528801833998679">기기 로그인 사용</translation> <translation id="5515388687005870733">55x85mm</translation> -<translation id="5516095341424241911">Google의 보안 기술을 사용하여 결제 정보를 안전하게 보호하세요</translation> <translation id="5518670652865028077">예술 및 엔터테인먼트</translation> <translation id="5519516356611866228">변경사항 포함</translation> <translation id="5519696598216267194">용지(천공)</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index c94b5c9e..fbb8dd5 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">Кеңсе эмереги</translation> <translation id="5513528801833998679">Түзмөккө кирүү</translation> <translation id="5515388687005870733">55 x 85 мм.</translation> -<translation id="5516095341424241911">Төлөм маалыматын коопсуз кылуу үчүн Google’дун коопсуздукту камсыздоо технологиясы колдонулууда</translation> <translation id="5518670652865028077">Көркөм өнөр жана көңүл ачуу</translation> <translation id="5519516356611866228">Өзгөртүүлөрүңүз бар</translation> <translation id="5519696598216267194">Кагаз (перфорацияланган)</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index 18d3195..e20ba2a2 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">ເຟີນີເຈີຫ້ອງການ</translation> <translation id="5513528801833998679">ໃຊ້ການເຂົ້າສູ່ລະບົບໃນອຸປະກອນ</translation> <translation id="5515388687005870733">55 x 85 ມມ</translation> -<translation id="5516095341424241911">ໃຊ້ເທັກໂນໂລຢີຄວາມປອດໄພຂອງ Google ເພື່ອເກັບຮັກສາຂໍ້ມູນການຈ່າຍເງິນຂອງທ່ານໃຫ້ປອດໄພ</translation> <translation id="5518670652865028077">ສິນລະປະ ແລະ ບັນເທີງ</translation> <translation id="5519516356611866228">ພ້ອມກັບການປ່ຽນແປງຂອງທ່ານ</translation> <translation id="5519696598216267194">ເຈ້ຍ (ເຈາະຮູລ່ວງໜ້າ)</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 88e3671..153de99 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -2181,7 +2181,6 @@ <translation id="5512812358367123529">Biuro baldai</translation> <translation id="5513528801833998679">Naudoti įrenginio prisijungimą</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Mokėjimų informacijos saugos užtikrinimas naudojant „Google“ saugos technologijas</translation> <translation id="5518670652865028077">Menas ir pramogos</translation> <translation id="5519516356611866228">Su jūsų pakeitimais</translation> <translation id="5519696598216267194">Popierius (perforuotas)</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 6c3996e..b6b8af8 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">Biroja mēbeles</translation> <translation id="5513528801833998679">Izmantot pierakstīšanos ierīcē</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Tiek izmantota Google drošības tehnoloģija, lai gādātu par jūsu maksājumu informācijas drošību</translation> <translation id="5518670652865028077">Māksla un izklaide</translation> <translation id="5519516356611866228">Ar jūsu veiktajām izmaiņām</translation> <translation id="5519696598216267194">Papīrs (perforēts)</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 231c801d..310a253 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Канцелариски мебел</translation> <translation id="5513528801833998679">Користете најавување на уредот</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Се користи технологијата за безбедност на Google за заштита на вашите податоци за плаќање</translation> <translation id="5518670652865028077">Уметност и забава</translation> <translation id="5519516356611866228">Со промените</translation> <translation id="5519696598216267194">Хартија (со отвори за поврзување)</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 17470aa..8dcfe555 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">ഓഫീസ് ഫർണിച്ചർ</translation> <translation id="5513528801833998679">ഉപകരണത്തിലെ സൈൻ ഇൻ ചെയ്യൽ ഉപയോഗിക്കുക</translation> <translation id="5515388687005870733">55 x 85 മി.മീ</translation> -<translation id="5516095341424241911">നിങ്ങളുടെ പേയ്മെന്റ് വിവരങ്ങൾ സുരക്ഷിതമായി സൂക്ഷിക്കാൻ Google-ന്റെ സുരക്ഷാ സാങ്കേതികവിദ്യ ഉപയോഗിക്കുന്നു</translation> <translation id="5518670652865028077">കലയും വിനോദവും</translation> <translation id="5519516356611866228">നിങ്ങൾ വരുത്തിയ മാറ്റങ്ങൾ സഹിതം</translation> <translation id="5519696598216267194">പേപ്പർ (പ്രീപഞ്ച് ചെയ്തത്)</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index 94e4a40..3676008 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -2181,7 +2181,6 @@ <translation id="5512812358367123529">Албан тасалгааны тавилга</translation> <translation id="5513528801833998679">Төхөөрөмжийн нэвтрэлт ашиглах</translation> <translation id="5515388687005870733">55 x 85 мм</translation> -<translation id="5516095341424241911">Таны төлбөрийн мэдээллийг аюулгүй байлгахын тулд Google-н аюулгүй байдлын технологийг ашиглаж байна</translation> <translation id="5518670652865028077">Урлаг, энтертэйнмент</translation> <translation id="5519516356611866228">Таны өөрчилснөөр</translation> <translation id="5519696598216267194">Цаас (урьдчилж цоолсон)</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index d1d447b2..23ea7ec 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">ऑफिससाठीचे फर्निचर</translation> <translation id="5513528801833998679">डिव्हाइस साइन-इन वापरा</translation> <translation id="5515388687005870733">५५ x ८५ मिमी</translation> -<translation id="5516095341424241911">तुमची पेमेंटशी संबंधित माहिती सुरक्षित ठेवण्यासाठी Google चे सुरक्षा तंत्रज्ञान वापरणे</translation> <translation id="5518670652865028077">कला आणि मनोरंजन</translation> <translation id="5519516356611866228">तुमच्या बदलांसह</translation> <translation id="5519696598216267194">पेपर (प्रीपंच्ड)</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index ed08678..711e602 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -2181,7 +2181,6 @@ <translation id="5512812358367123529">Perabot Pejabat</translation> <translation id="5513528801833998679">Gunakan log masuk peranti</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Gunakan teknologi keselamatan Google untuk memastikan maklumat pembayaran anda selamat</translation> <translation id="5518670652865028077">Seni & hiburan</translation> <translation id="5519516356611866228">Dengan perubahan anda</translation> <translation id="5519696598216267194">Kertas (Dipratebuk)</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index 7bc0fe8d..2cf5363 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -2181,7 +2181,6 @@ <translation id="5512812358367123529">ရုံးသုံးပရိဘောဂ</translation> <translation id="5513528801833998679">စက်လက်မှတ်ထိုးဝင်ခြင်း သုံးရန်</translation> <translation id="5515388687005870733">၅၅ x ၈၅ မီလီမီတာ</translation> -<translation id="5516095341424241911">သင့်ငွေပေးချေမှုအချက်အလက်များ လုံခြုံစွာထားနိုင်ရန် Google ၏ လုံခြုံရေးနည်းပညာ အသုံးပြုခြင်း</translation> <translation id="5518670652865028077">အနုပညာနှင့် ဖျော်ဖြေရေး</translation> <translation id="5519516356611866228">သင်၏အပြောင်းအလဲများ ပါဝင်သည်</translation> <translation id="5519696598216267194">စာရွက် (အပေါက်ပါ)</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index dd1751d..349e550 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -2178,7 +2178,6 @@ <translation id="5512812358367123529">अफिसमा प्रयोग हुने फर्निचर</translation> <translation id="5513528801833998679">डिभाइसमा साइन इन गर्नुहोस्</translation> <translation id="5515388687005870733">५५ x ८५ मिलिमिटर</translation> -<translation id="5516095341424241911">तपाईंको भुक्तानीसम्बन्धी जानकारी सुरक्षित राख्न Google को सुरक्षा प्रविधि प्रयोग गरिँदै छ</translation> <translation id="5518670652865028077">कला तथा मनोरञ्जन</translation> <translation id="5519516356611866228">तपाईंले गर्नुभएका परिवर्तन लागू गरेर</translation> <translation id="5519696598216267194">पेपर (प्रिपन्च्ड)</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index b12d9fe3..2a358d39 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -2175,7 +2175,6 @@ <translation id="5512812358367123529">Kantoormeubilair</translation> <translation id="5513528801833998679">Inloggen op apparaat gebruiken</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">De beveiligingstechnologie van Google gebruiken om je betalingsgegevens te beveiligen</translation> <translation id="5518670652865028077">Kunst en entertainment</translation> <translation id="5519516356611866228">Met jouw wijzigingen</translation> <translation id="5519696598216267194">Papier (voorgestanst)</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 05700af..d5fc95f 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Kontormøbler</translation> <translation id="5513528801833998679">Bruk enhetspålogging</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Bruker Googles sikkerhetsteknologi for å beskytte betalingsopplysningene dine</translation> <translation id="5518670652865028077">Kunst og underholdning</translation> <translation id="5519516356611866228">Med endringene dine</translation> <translation id="5519696598216267194">Papir (hullpapir)</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 4ed4bc8..4d3ab8e 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -2178,7 +2178,6 @@ <translation id="5512812358367123529">ଅଫିସ ଫର୍ଣ୍ଣିଚର</translation> <translation id="5513528801833998679">ଡିଭାଇସ ସାଇନ-ଇନ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="5515388687005870733">55 x 85 ମିମି</translation> -<translation id="5516095341424241911">ଆପଣଙ୍କ ପେମେଣ୍ଟ ସୂଚନାକୁ ସୁରକ୍ଷିତ ରଖିବା ପାଇଁ Googleର ସୁରକ୍ଷା ଟେକ୍ନୋଲୋଜି ବ୍ୟବହାର କରାଯାଉଛି</translation> <translation id="5518670652865028077">କଳା ଏବଂ ମନୋରଞ୍ଜନ</translation> <translation id="5519516356611866228">ଆପଣଙ୍କ ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ସହିତ</translation> <translation id="5519696598216267194">କାଗଜ (ପ୍ରିପଞ୍ଚଡ)</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index ee7f117..a638bb9 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -2177,7 +2177,6 @@ <translation id="5512812358367123529">ਦਫ਼ਤਰ ਦਾ ਫ਼ਰਨੀਚਰ</translation> <translation id="5513528801833998679">ਡੀਵਾਈਸ ਸਾਈਨ-ਇਨ ਵਰਤੋ</translation> <translation id="5515388687005870733">55 x 85 ਮਿ.ਮੀ.</translation> -<translation id="5516095341424241911">ਤੁਹਾਡੀ ਭੁਗਤਾਨ ਜਾਣਕਾਰੀ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣ ਲਈ Google ਦੀ ਸੁਰੱਖਿਆ ਤਕਨਾਲੋਜੀ ਦੀ ਵਰਤੋਂ ਕਰਨਾ</translation> <translation id="5518670652865028077">ਕਲਾ ਅਤੇ ਮਨੋਰੰਜਨ</translation> <translation id="5519516356611866228">ਤੁਹਾਡੀਆਂ ਤਬਦੀਲੀਆਂ ਨਾਲ</translation> <translation id="5519696598216267194">ਪੇਪਰ (ਪ੍ਰੀਪੰਚਡ)</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 6034d28..ed48a1bb 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Meble biurowe</translation> <translation id="5513528801833998679">Użyj funkcji logowania urządzenia</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Zabezpieczanie danych karty za pomocą technologii zabezpieczeń Google</translation> <translation id="5518670652865028077">Sztuka i rozrywka</translation> <translation id="5519516356611866228">Z Twoimi zmianami</translation> <translation id="5519696598216267194">Papier (dziurkowany)</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index e7bc4dae..827119e 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Móveis para escritório</translation> <translation id="5513528801833998679">Usar o login do dispositivo</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Como usar a tecnologia de segurança do Google para manter suas informações de pagamento seguras</translation> <translation id="5518670652865028077">Artes e entretenimento</translation> <translation id="5519516356611866228">Com suas modificações</translation> <translation id="5519696598216267194">Papel (perfurado)</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index 0e1e81b..759176c 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Mobiliário de escritório</translation> <translation id="5513528801833998679">Usar o início de sessão no dispositivo</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">A usar a tecnologia de segurança da Google para manter as suas informações de pagamento seguras</translation> <translation id="5518670652865028077">Arte e entretenimento</translation> <translation id="5519516356611866228">Com as suas alterações</translation> <translation id="5519696598216267194">Papel (perfurado)</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index de78da8..132cbce 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Mobilă de birou</translation> <translation id="5513528801833998679">Folosește conectarea la dispozitiv</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Folosim tehnologia de securitate Google pentru a-ți menține informațiile de plată în siguranță</translation> <translation id="5518670652865028077">Artă și divertisment</translation> <translation id="5519516356611866228">Cu modificări</translation> <translation id="5519696598216267194">Hârtie (preperforată)</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index ee73a0e..450fe3d 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">Офисная мебель</translation> <translation id="5513528801833998679">Использовать процесс входа на устройстве</translation> <translation id="5515388687005870733">55 x 85 мм</translation> -<translation id="5516095341424241911">Технологии безопасности Google защищают ваши платежные данные</translation> <translation id="5518670652865028077">Искусство и развлечения</translation> <translation id="5519516356611866228">С вашими изменениями</translation> <translation id="5519696598216267194">Бумага (с перфорацией)</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index c6529b0..d7a91f8 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">කාර්යාල ලීබඩු</translation> <translation id="5513528801833998679">උපාංග පුරනය භාවිතා කරන්න</translation> <translation id="5515388687005870733">මිමි 55 x 85</translation> -<translation id="5516095341424241911">ඔබේ ගෙවීම් තොරතුරු සුරක්ෂිතව තබා ගැනීමට Google හි ආරක්ෂක තාක්ෂණය භාවිත කිරීම</translation> <translation id="5518670652865028077">කලා සහ විනෝදාස්වාදය</translation> <translation id="5519516356611866228">ඔබගේ වෙනස් කිරීම් සමග</translation> <translation id="5519696598216267194">කඩදාසි (පෙර සිදුරු කරන ලද)</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 9861831..8aa9c95 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -2176,7 +2176,6 @@ <translation id="5512812358367123529">Kancelársky nábytok</translation> <translation id="5513528801833998679">Použiť prihlásenie pomocou zariadenia</translation> <translation id="5515388687005870733">55 × 85 mm</translation> -<translation id="5516095341424241911">Zabezpečte si platobné údaje pomocou technológií zabezpečenia od Googlu</translation> <translation id="5518670652865028077">Umenie a zábava</translation> <translation id="5519516356611866228">So zmenami</translation> <translation id="5519696598216267194">Papier (preddierkovaný)</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 94dd58be..8c0d37c 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Pisarniško pohištvo</translation> <translation id="5513528801833998679">Uporaba prijave v napravi</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Uporaba Googlove varnostne tehnologije za zagotavljanje varnosti vaših podatkov za plačilo</translation> <translation id="5518670652865028077">Umetnost in zabava</translation> <translation id="5519516356611866228">Z vašimi spremembami</translation> <translation id="5519696598216267194">Paper (Prepunched)</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index 584eb6c..ccd4287 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Mobilie zyre</translation> <translation id="5513528801833998679">Përdor identifikimin në pajisje</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Po përdoret teknologjia e sigurisë e Google për t'i mbajtur të sigurta informacionet e tua të pagesës</translation> <translation id="5518670652865028077">Artet dhe zbavitja</translation> <translation id="5519516356611866228">Me ndryshimet e tua</translation> <translation id="5519696598216267194">Letër (me shpim paraprake)</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index ef831ce..6b28d47 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Kancelarijski nameštaj</translation> <translation id="5513528801833998679">Koristite prijavljivanje na uređaju</translation> <translation id="5515388687005870733">55×85 mm</translation> -<translation id="5516095341424241911">Koristite Google bezbednosnu tehnologiju da biste zaštitili informacije o plaćanju</translation> <translation id="5518670652865028077">Umetnost i zabava</translation> <translation id="5519516356611866228">Sa promenama</translation> <translation id="5519696598216267194">Papir (pripremljen)</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 323d90a..8f210f5 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Канцеларијски намештај</translation> <translation id="5513528801833998679">Користите пријављивање на уређају</translation> <translation id="5515388687005870733">55×85 mm</translation> -<translation id="5516095341424241911">Користите Google безбедносну технологију да бисте заштитили информације о плаћању</translation> <translation id="5518670652865028077">Уметност и забава</translation> <translation id="5519516356611866228">Са променама</translation> <translation id="5519696598216267194">Папир (припремљен)</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index 8fde8c656..ad027a9 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Kontorsmöbler</translation> <translation id="5513528801833998679">Använd enhetsinloggning</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Skydda dina betalningsuppgifter med hjälp av Googles säkerhetsteknik</translation> <translation id="5518670652865028077">Konst och underhållning</translation> <translation id="5519516356611866228">Med dina ändringar</translation> <translation id="5519696598216267194">Papper (perforerat)</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 47ca864..5bd7f42c 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Samani za Ofisi</translation> <translation id="5513528801833998679">Ingia kwa kutumia kifaa</translation> <translation id="5515388687005870733">Milimita 55 x 85</translation> -<translation id="5516095341424241911">Kutumia teknolojia ya usalama ya Google kulinda maelezo yako ya malipo</translation> <translation id="5518670652865028077">Sanaa na burudani</translation> <translation id="5519516356611866228">Ikiwa na mabadiliko uliyoyafanya</translation> <translation id="5519696598216267194">Karatasi (Iliyotobolewa Mashimo)</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index b8ac4e2d..8372906 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -2176,7 +2176,6 @@ <translation id="5512812358367123529">அலுவலக ஃபர்னிச்சர்</translation> <translation id="5513528801833998679">சாதன உள்நுழைவு முறையைப் பயன்படுத்து</translation> <translation id="5515388687005870733">55 x 85 மிமீ</translation> -<translation id="5516095341424241911">உங்கள் பேமெண்ட் தகவல்களைப் பாதுகாப்பாக வைத்திருக்க Googleளின் பாதுகாப்புத் தொழில்நுட்பத்தைப் பயன்படுத்துகிறது</translation> <translation id="5518670652865028077">கலை & பொழுதுபோக்கு</translation> <translation id="5519516356611866228">நான் செய்த மாற்றங்களுடன் பதிவிறக்கு</translation> <translation id="5519696598216267194">பஞ்ச் செய்யப்பட்ட காகிதம்</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index adb9058..f06469a3 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -2182,7 +2182,6 @@ <translation id="5512812358367123529">కార్యాలయ ఫర్నిచర్</translation> <translation id="5513528801833998679">పరికర సైన్ ఇన్ను ఉపయోగించండి</translation> <translation id="5515388687005870733">55 x 85 మి.మీ.</translation> -<translation id="5516095341424241911">మీ పేమెంట్ సమాచారాన్ని సురక్షితంగా ఉంచడానికి Googleకు చెందిన సెక్యూరిటీ టెక్నాలజీని ఉపయోగించడం</translation> <translation id="5518670652865028077">కళలు & వినోదం</translation> <translation id="5519516356611866228">మీరు చేసిన మార్పులతో డౌన్లోడ్ చేసుకోండి</translation> <translation id="5519696598216267194">పేపర్ (ప్రీపంచ్డ్)</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 8b501d0..a338151e 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">เฟอร์นิเจอร์สำนักงาน</translation> <translation id="5513528801833998679">ใช้การลงชื่อเข้าใช้อุปกรณ์</translation> <translation id="5515388687005870733">55 x 85 มม.</translation> -<translation id="5516095341424241911">ใช้เทคโนโลยีการรักษาความปลอดภัยของ Google เพื่อรักษาข้อมูลการชําระเงินของคุณให้ปลอดภัย</translation> <translation id="5518670652865028077">ศิลปะและความบันเทิง</translation> <translation id="5519516356611866228">แบบมีการเปลี่ยนแปลงที่ทำ</translation> <translation id="5519696598216267194">กระดาษ (เจาะล่วงหน้า)</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index cee3de3a..b22420b 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Ofis Mobilyaları</translation> <translation id="5513528801833998679">Cihazda oturum açmayı kullanın</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Ödeme bilgilerinizi güvende tutmak için Google'ın güvenlik teknolojisi kullanılıyor</translation> <translation id="5518670652865028077">Sanat ve eğlence</translation> <translation id="5519516356611866228">Yaptığınız değişiklikler dahil</translation> <translation id="5519696598216267194">Kağıt (Önceden Delinmiş)</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index 51dff6f..b1325df 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Офісні меблі</translation> <translation id="5513528801833998679">Здійснити вхід на пристрої</translation> <translation id="5515388687005870733">55 x 85 мм</translation> -<translation id="5516095341424241911">Для захисту вашої платіжної інформації використовуються технології безпеки Google</translation> <translation id="5518670652865028077">Мистецтво та розваги</translation> <translation id="5519516356611866228">Зі змінами</translation> <translation id="5519696598216267194">Папір (перфорований)</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 941f476..1a8cbbd 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -2182,7 +2182,6 @@ <translation id="5512812358367123529">دفتر کا فرنیچر</translation> <translation id="5513528801833998679">آلہ سائن ان استعمال کریں</translation> <translation id="5515388687005870733">55 x 85 ملی میٹر</translation> -<translation id="5516095341424241911">آپ کی ادائیگی کی معلومات کو محفوظ رکھنے کے لیے Google کی سیکیورٹی ٹیکنالوجی کا استعمال کرنا</translation> <translation id="5518670652865028077">آرٹس اور تفریح</translation> <translation id="5519516356611866228">آپ کی تبدیلیوں کے ساتھ</translation> <translation id="5519696598216267194">کاغذ (پری پنچڈ)</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index 02b13dc..8725ac4f0 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -2175,7 +2175,6 @@ <translation id="5512812358367123529">Ofis mebellari</translation> <translation id="5513528801833998679">Qurilmaga kirish</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Toʻlov maʼlumotlarini xavfsiz saqlash uchun Google xavfsizlik texnologiyasidan foydalaning</translation> <translation id="5518670652865028077">Madaniy hordiq</translation> <translation id="5519516356611866228">Tahriringiz saqlangan</translation> <translation id="5519696598216267194">Qogʻoz (teshilgan)</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 79c1ebf..31608e6e 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -2180,7 +2180,6 @@ <translation id="5512812358367123529">Đồ đạc văn phòng</translation> <translation id="5513528801833998679">Sử dụng tính năng đăng nhập trên thiết bị</translation> <translation id="5515388687005870733">55 x 85 mm</translation> -<translation id="5516095341424241911">Công nghệ bảo mật của Google đang được sử dụng để đảm bảo an toàn cho thông tin thanh toán của bạn</translation> <translation id="5518670652865028077">Nghệ thuật và giải trí</translation> <translation id="5519516356611866228">Bao gồm các thay đổi của bạn</translation> <translation id="5519696598216267194">Giấy (Đục lỗ sẵn)</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 3d6fe181..b35de30 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -2170,7 +2170,6 @@ <translation id="5512812358367123529">办公家具</translation> <translation id="5513528801833998679">使用设备登录方式</translation> <translation id="5515388687005870733">55 x 85 毫米</translation> -<translation id="5516095341424241911">使用 Google 的安全技术确保您的付款信息安全</translation> <translation id="5518670652865028077">艺术与娱乐</translation> <translation id="5519516356611866228">含您所做更改</translation> <translation id="5519696598216267194">纸(预打孔纸)</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 20b736ab..2f4bacd 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">辦公室傢私</translation> <translation id="5513528801833998679">使用裝置登入</translation> <translation id="5515388687005870733">55 x 85 毫米</translation> -<translation id="5516095341424241911">使用 Google 的安全技術,確保付款資料安全無虞</translation> <translation id="5518670652865028077">藝術和娛樂</translation> <translation id="5519516356611866228">包括您所作的變更</translation> <translation id="5519696598216267194">紙 (打孔紙)</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 626b360d..8e77528 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -2179,7 +2179,6 @@ <translation id="5512812358367123529">辦公家具</translation> <translation id="5513528801833998679">使用裝置登入功能</translation> <translation id="5515388687005870733">55 x 85 公釐</translation> -<translation id="5516095341424241911">使用 Google 的安全防護技術,確保付款資訊安全無虞</translation> <translation id="5518670652865028077">藝術與娛樂</translation> <translation id="5519516356611866228">包含你所做的變更</translation> <translation id="5519696598216267194">紙 (打孔紙)</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index f878611..522d6318 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -2177,7 +2177,6 @@ <translation id="5512812358367123529">Ifenisha Yasehhovisi</translation> <translation id="5513528801833998679">Sebenzisa ukungena ngemvume kwedivayisi</translation> <translation id="5515388687005870733">U-55 x 85 mm</translation> -<translation id="5516095341424241911">Ukusebenzisa ubuchwepheshe bokuphepha be-Google ukuze ugcine inkokhelo yakho iphephile</translation> <translation id="5518670652865028077">Ubuciko nokuzijabulisa</translation> <translation id="5519516356611866228">Kanye nezinguquko zakho</translation> <translation id="5519696598216267194">Iphepha (i-Prepunched)</translation>
diff --git a/components/sync/engine/sync_protocol_error.cc b/components/sync/engine/sync_protocol_error.cc index 4dc9d69f..aa76215 100644 --- a/components/sync/engine/sync_protocol_error.cc +++ b/components/sync/engine/sync_protocol_error.cc
@@ -19,7 +19,6 @@ ENUM_CASE(SYNC_SUCCESS); ENUM_CASE(NOT_MY_BIRTHDAY); ENUM_CASE(THROTTLED); - ENUM_CASE(CLEAR_PENDING); ENUM_CASE(TRANSIENT_ERROR); ENUM_CASE(MIGRATION_DONE); ENUM_CASE(DISABLED_BY_ADMIN);
diff --git a/components/sync/engine/sync_protocol_error.h b/components/sync/engine/sync_protocol_error.h index 423dab8..2e6002d 100644 --- a/components/sync/engine/sync_protocol_error.h +++ b/components/sync/engine/sync_protocol_error.h
@@ -21,9 +21,6 @@ // Server is busy. Try later. THROTTLED, - // Clear user data is being currently executed by the server. - CLEAR_PENDING, - // Server cannot service the request now. TRANSIENT_ERROR,
diff --git a/components/sync/engine/sync_scheduler_impl.cc b/components/sync/engine/sync_scheduler_impl.cc index 1d7f68d..3e28d80 100644 --- a/components/sync/engine/sync_scheduler_impl.cc +++ b/components/sync/engine/sync_scheduler_impl.cc
@@ -59,7 +59,6 @@ return false; case NOT_MY_BIRTHDAY: case CLIENT_DATA_OBSOLETE: - case CLEAR_PENDING: case DISABLED_BY_ADMIN: case ENCRYPTION_OBSOLETE: // If we send terminate sync early then |sync_cycle_ended| notification
diff --git a/components/sync/engine/syncer.cc b/components/sync/engine/syncer.cc index 3c8a7593b..382a33e0 100644 --- a/components/sync/engine/syncer.cc +++ b/components/sync/engine/syncer.cc
@@ -41,8 +41,6 @@ return SyncerErrorValueForUma::kServerReturnNotMyBirthday; case THROTTLED: return SyncerErrorValueForUma::kServerReturnThrottled; - case CLEAR_PENDING: - return SyncerErrorValueForUma::kServerReturnClearPending; case TRANSIENT_ERROR: return SyncerErrorValueForUma::kServerReturnTransientError; case MIGRATION_DONE:
diff --git a/components/sync/engine/syncer.h b/components/sync/engine/syncer.h index 32a2000..e0f1563 100644 --- a/components/sync/engine/syncer.h +++ b/components/sync/engine/syncer.h
@@ -40,7 +40,7 @@ kServerReturnThrottled = 8, kServerReturnTransientError = 9, kServerReturnMigrationDone = 10, - kServerReturnClearPending = 11, + // Deprecated: kServerReturnClearPending = 11, kServerReturnNotMyBirthday = 12, kServerReturnConflict = 13, kServerResponseValidationFailed = 14,
diff --git a/components/sync/engine/syncer_proto_util.cc b/components/sync/engine/syncer_proto_util.cc index 00aaf76..913b875e 100644 --- a/components/sync/engine/syncer_proto_util.cc +++ b/components/sync/engine/syncer_proto_util.cc
@@ -66,8 +66,6 @@ return NOT_MY_BIRTHDAY; case sync_pb::SyncEnums::THROTTLED: return THROTTLED; - case sync_pb::SyncEnums::CLEAR_PENDING: - return CLEAR_PENDING; case sync_pb::SyncEnums::TRANSIENT_ERROR: return TRANSIENT_ERROR; case sync_pb::SyncEnums::MIGRATION_DONE: @@ -128,8 +126,7 @@ const sync_pb::SyncEnums::ErrorType& error_type) { SyncProtocolError error; error.error_type = PBErrorTypeToSyncProtocolErrorType(error_type); - if (error_type == sync_pb::SyncEnums::CLEAR_PENDING || - error_type == sync_pb::SyncEnums::NOT_MY_BIRTHDAY || + if (error_type == sync_pb::SyncEnums::NOT_MY_BIRTHDAY || error_type == sync_pb::SyncEnums::ENCRYPTION_OBSOLETE) { error.action = DISABLE_SYNC_ON_CLIENT; } else if (error_type == sync_pb::SyncEnums::CLIENT_DATA_OBSOLETE) { @@ -346,7 +343,6 @@ should_report_success = true; break; case TRANSIENT_ERROR: - case CLEAR_PENDING: case NOT_MY_BIRTHDAY: case DISABLED_BY_ADMIN: case CLIENT_DATA_OBSOLETE:
diff --git a/components/sync/protocol/proto_enum_conversions.cc b/components/sync/protocol/proto_enum_conversions.cc index f701b2f..1490503 100644 --- a/components/sync/protocol/proto_enum_conversions.cc +++ b/components/sync/protocol/proto_enum_conversions.cc
@@ -368,7 +368,6 @@ ENUM_CASE(sync_pb::SyncEnums, SUCCESS); ENUM_CASE(sync_pb::SyncEnums, NOT_MY_BIRTHDAY); ENUM_CASE(sync_pb::SyncEnums, THROTTLED); - ENUM_CASE(sync_pb::SyncEnums, CLEAR_PENDING); ENUM_CASE(sync_pb::SyncEnums, TRANSIENT_ERROR); ENUM_CASE(sync_pb::SyncEnums, MIGRATION_DONE); ENUM_CASE(sync_pb::SyncEnums, DISABLED_BY_ADMIN);
diff --git a/components/sync/protocol/sync_enums.proto b/components/sync/protocol/sync_enums.proto index d6d0b52..ae3a701 100644 --- a/components/sync/protocol/sync_enums.proto +++ b/components/sync/protocol/sync_enums.proto
@@ -98,9 +98,7 @@ // DEPRECATED_AUTH_EXPIRED = 4; // DEPRECATED_USER_NOT_ACTIVATED = 5; // DEPRECATED_AUTH_INVALID = 6; - // A clear of the user data is pending (e.g. initiated by privacy request). - // The client should come back later. - CLEAR_PENDING = 7; + // DEPRECATED_CLEAR_PENDING = 7; // A transient error occurred (e.g. a backend timeout). The client should // try again later. TRANSIENT_ERROR = 8;
diff --git a/components/sync_preferences/dual_layer_user_pref_store.cc b/components/sync_preferences/dual_layer_user_pref_store.cc index b354cf6..8cc888a9 100644 --- a/components/sync_preferences/dual_layer_user_pref_store.cc +++ b/components/sync_preferences/dual_layer_user_pref_store.cc
@@ -599,12 +599,13 @@ const std::string& pref_name, base::Value value, uint32_t flags) const { - DCHECK(ShouldSetValueInAccountStore(pref_name)); + CHECK(ShouldSetValueInAccountStore(pref_name)); // Note: There is no "standard" unmerging logic for list or scalar prefs. // TODO(crbug.com/1416479): Allow support for custom unmerge logic. - if (pref_model_associator_client_->IsMergeableDictionaryPreference( - pref_name)) { + if (pref_model_associator_client_->GetSyncablePrefsDatabase() + .GetSyncablePrefMetadata(pref_name) + ->merge_behavior() == MergeBehavior::kMergeableDict) { // Per crbug.com/1430854, it is possible for the value to not be of dict // type. However, in this case, whatever is the type of `value` it's bound // to be correct, as UnmergeValue() is called by setters which in turn are
diff --git a/components/sync_preferences/dual_layer_user_pref_store_unittest.cc b/components/sync_preferences/dual_layer_user_pref_store_unittest.cc index f36b3ee..a827a389 100644 --- a/components/sync_preferences/dual_layer_user_pref_store_unittest.cc +++ b/components/sync_preferences/dual_layer_user_pref_store_unittest.cc
@@ -131,15 +131,6 @@ : syncable_prefs_database_(kSyncablePrefsDatabase) {} // PrefModelAssociatorClient implementation. - bool IsMergeableListPreference(const std::string& pref_name) const override { - return false; - } - - bool IsMergeableDictionaryPreference( - const std::string& pref_name) const override { - return false; - } - base::Value MaybeMergePreferenceValues( const std::string& pref_name, const base::Value& local_value, @@ -1196,15 +1187,6 @@ : syncable_prefs_database_(kSyncablePrefsDatabase) {} // PrefModelAssociatorClient implementation. - bool IsMergeableListPreference(const std::string& pref_name) const override { - return pref_name == kMergeableListPref; - } - - bool IsMergeableDictionaryPreference( - const std::string& pref_name) const override { - return pref_name == kMergeableDictPref1 || pref_name == kMergeableDictPref2; - } - base::Value MaybeMergePreferenceValues( const std::string& pref_name, const base::Value& local_value,
diff --git a/components/sync_preferences/pref_model_associator.cc b/components/sync_preferences/pref_model_associator.cc index b11a238..1fd6115 100644 --- a/components/sync_preferences/pref_model_associator.cc +++ b/components/sync_preferences/pref_model_associator.cc
@@ -401,22 +401,6 @@ << "Preference " << name << " has not been added to syncable prefs allowlist, or has incorrect " "data."; - // TODO(crbug.com/1474375): Remove these DCHECKs when removing - // PrefModelAssociatorClient::IsMergeable*Preference() methods. - DCHECK(!client_ || client_->IsMergeableListPreference(name) == - (client_->GetSyncablePrefsDatabase() - .GetSyncablePrefMetadata(name) - ->merge_behavior() == - MergeBehavior::kMergeableListWithRewriteOnUpdate)) - << "Preference " << name - << " has invalid merge behavior listed in the syncable prefs database."; - DCHECK(!client_ || - client_->IsMergeableDictionaryPreference(name) == - (client_->GetSyncablePrefsDatabase() - .GetSyncablePrefMetadata(name) - ->merge_behavior() == MergeBehavior::kMergeableDict)) - << "Preference " << name - << " has invalid merge behavior listed in the syncable prefs database."; registered_preferences_.insert(name); }
diff --git a/components/sync_preferences/pref_model_associator_client.h b/components/sync_preferences/pref_model_associator_client.h index 739fe0c..b7830c0 100644 --- a/components/sync_preferences/pref_model_associator_client.h +++ b/components/sync_preferences/pref_model_associator_client.h
@@ -24,18 +24,6 @@ PrefModelAssociatorClient& operator=(const PrefModelAssociatorClient&) = delete; - // Returns true if the preference named |pref_name| is a list preference - // whose server value is merged with local value during synchronisation. - // TODO(crbug.com/1485960): Remove this method. - virtual bool IsMergeableListPreference( - const std::string& pref_name) const = 0; - - // Returns true if the preference named |pref_name| is a dictionary preference - // whose server value is merged with local value during synchronisation. - // TODO(crbug.com/1485960): Remove this method. - virtual bool IsMergeableDictionaryPreference( - const std::string& pref_name) const = 0; - // Returns the merged value if the client wants to apply a custom merging // strategy to the preference named |pref_name| with local value |local_value| // and server-provided value |server_value|. Otherwise, returns |nullptr| and
diff --git a/components/sync_preferences/pref_model_associator_unittest.cc b/components/sync_preferences/pref_model_associator_unittest.cc index 00c524d..75327a8 100644 --- a/components/sync_preferences/pref_model_associator_unittest.cc +++ b/components/sync_preferences/pref_model_associator_unittest.cc
@@ -92,15 +92,6 @@ const TestPrefModelAssociatorClient&) = delete; // PrefModelAssociatorClient implementation. - bool IsMergeableListPreference(const std::string& pref_name) const override { - return pref_name == kListPrefName; - } - - bool IsMergeableDictionaryPreference( - const std::string& pref_name) const override { - return pref_name == kDictionaryPrefName; - } - base::Value MaybeMergePreferenceValues( const std::string& pref_name, const base::Value& local_value,
diff --git a/components/sync_preferences/pref_service_syncable_unittest.cc b/components/sync_preferences/pref_service_syncable_unittest.cc index cc6dde1d..c92d20b 100644 --- a/components/sync_preferences/pref_service_syncable_unittest.cc +++ b/components/sync_preferences/pref_service_syncable_unittest.cc
@@ -402,15 +402,6 @@ const TestPrefModelAssociatorClient&) = delete; // PrefModelAssociatorClient implementation. - bool IsMergeableListPreference(const std::string& pref_name) const override { - return pref_name == kMergeableListPrefName; - } - - bool IsMergeableDictionaryPreference( - const std::string& pref_name) const override { - return pref_name == kMergeableDictPrefName; - } - base::Value MaybeMergePreferenceValues( const std::string& pref_name, const base::Value& local_value,
diff --git a/components/unexportable_keys/BUILD.gn b/components/unexportable_keys/BUILD.gn index f93d5dd5..1c7b3977 100644 --- a/components/unexportable_keys/BUILD.gn +++ b/components/unexportable_keys/BUILD.gn
@@ -27,6 +27,8 @@ "unexportable_key_tasks.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + public_deps = [ "//base", "//components/keyed_service/core",
diff --git a/components/viz/common/features.cc b/components/viz/common/features.cc index f0e827c..fe5c447 100644 --- a/components/viz/common/features.cc +++ b/components/viz/common/features.cc
@@ -317,7 +317,7 @@ // cases in production. BASE_FEATURE(kInvalidateLocalSurfaceIdPreCommit, "InvalidateLocalSurfaceIdPreCommit", - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_DISABLED_BY_DEFAULT); bool IsDelegatedCompositingEnabled() { return base::FeatureList::IsEnabled(kDelegatedCompositing);
diff --git a/components/viz/service/display/direct_renderer.cc b/components/viz/service/display/direct_renderer.cc index 5e02e28..079eefc0 100644 --- a/components/viz/service/display/direct_renderer.cc +++ b/components/viz/service/display/direct_renderer.cc
@@ -779,15 +779,6 @@ #if BUILDFLAG(IS_WIN) requirements.scanout_dcomp_surface = render_pass->needs_synchronous_dcomp_commit; - - // On Windows, the root render pass can be made transparent due to overlay - // processing promoting a quad as an underlay. If the format we picked does - // not have alpha bits, we ned to change to one that does. - if (requirements.alpha_type != RenderPassAlphaType::kOpaque && - !requirements.format.HasAlpha()) { - requirements.format = - GetColorSpaceSharedImageFormat(requirements.color_space); - } #endif CHECK_EQ(requirements.alpha_type == RenderPassAlphaType::kOpaque, !render_pass->has_transparent_background);
diff --git a/components/viz/service/gl/gpu_service_impl.cc b/components/viz/service/gl/gpu_service_impl.cc index 945e860..cc09a3e4 100644 --- a/components/viz/service/gl/gpu_service_impl.cc +++ b/components/viz/service/gl/gpu_service_impl.cc
@@ -564,9 +564,9 @@ TRACE_ID_LOCAL(this), now); } -void GpuServiceImpl::UpdateGPUInfoGL() { +void GpuServiceImpl::UpdateGPUInfoGL(gl::GLDisplay* display) { DCHECK(main_runner_->BelongsToCurrentThread()); - gpu::CollectGraphicsInfoGL(&gpu_info_, GetContextState()->display()); + gpu::CollectGraphicsInfoGL(&gpu_info_, display); gpu_host_->DidUpdateGPUInfo(gpu_info_); } @@ -1269,7 +1269,7 @@ ui::GpuSwitchingManager::GetInstance()->NotifyGpuSwitched( active_gpu_heuristic); } - GpuServiceImpl::UpdateGPUInfoGL(); + GpuServiceImpl::UpdateGPUInfoGL(GetContextState()->display()); } void GpuServiceImpl::DisplayAdded() { @@ -1371,7 +1371,7 @@ visibility_changed_callback_.Run(false); if (gpu_preferences_.enable_gpu_benchmarking_extension) { ++gpu_info_.visibility_callback_call_count; - UpdateGPUInfoGL(); + UpdateGPUInfoGL(GetContextState()->display()); } } } @@ -1393,7 +1393,7 @@ visibility_changed_callback_.Run(true); if (gpu_preferences_.enable_gpu_benchmarking_extension) { ++gpu_info_.visibility_callback_call_count; - UpdateGPUInfoGL(); + UpdateGPUInfoGL(GetContextState()->display()); } } gpu_channel_manager_->OnApplicationForegounded();
diff --git a/components/viz/service/gl/gpu_service_impl.h b/components/viz/service/gl/gpu_service_impl.h index ba3b846..749b916 100644 --- a/components/viz/service/gl/gpu_service_impl.h +++ b/components/viz/service/gl/gpu_service_impl.h
@@ -128,8 +128,8 @@ ~GpuServiceImpl() override; - void UpdateGPUInfo(); - void UpdateGPUInfoGL(); + void UpdateGPUInfo() override; + void UpdateGPUInfoGL(gl::GLDisplay* display) override; void InitializeWithHost( mojo::PendingRemote<mojom::GpuHost> gpu_host,
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_hi.xtb b/components/webapps/browser/android/translations/android_webapps_strings_hi.xtb index 58753423..9ebd0be 100644 --- a/components/webapps/browser/android/translations/android_webapps_strings_hi.xtb +++ b/components/webapps/browser/android/translations/android_webapps_strings_hi.xtb
@@ -1,7 +1,11 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hi"> +<translation id="1213425325105380833">इस खाते से जुड़े डिवाइसों पर, हाल ही में इस्तेमाल किए गए वेब ऐप्लिकेशन वापस लाएं</translation> +<translation id="2065911435109240297">अपने वेब ऐप्लिकेशन वापस लाएं</translation> +<translation id="2111649875343992405">देखें कि किन वेब ऐप्लिकेशन को वापस लाना है</translation> <translation id="2139186145475833000">होम स्क्रीन में जोड़ें</translation> +<translation id="2172982519592313442">वेब ऐप्लिकेशन देखें</translation> <translation id="2478076885740497414">ऐप्स इंस्टॉल करें</translation> <translation id="3789841737615482174">इंस्टॉल करें</translation> <translation id="3910402514791813257">इंस्टॉल नहीं किया जा सका</translation> @@ -10,5 +14,7 @@ <translation id="5250483651202458397">स्क्रीनशॉट. बंद करने के लिए इस पर टैप करें.</translation> <translation id="6990079615885386641">Google Play Store से ऐप्लिकेशन डाउनलोड करें: <ph name="APP_ACTION" /></translation> <translation id="7333031090786104871">पिछली साइट अब भी जोड़ी जा रही है</translation> +<translation id="7672888405515738928">वे वेब ऐप्लिकेशन चुनें जिन्हें आपको इस डिवाइस पर वापस लाना है. यहां ऐप्लिकेशन आपके Chrome इतिहास के आधार पर दिखाए जाते हैं.</translation> +<translation id="8163051092261298861">वेब ऐप्लिकेशन को डिवाइस पर वापस लाएं</translation> <translation id="962979164594783469">यह ऐप्लिकेशन इंस्टॉल करें</translation> </translationbundle> \ No newline at end of file
diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc index a90c1721..965b07b 100644 --- a/content/app/content_main_runner_impl.cc +++ b/content/app/content_main_runner_impl.cc
@@ -418,6 +418,7 @@ // files. base::SysInfo::AmountOfPhysicalMemory(); base::SysInfo::NumberOfProcessors(); + base::SysInfo::NumberOfEfficientProcessors(); // Pre-acquire resources needed by BoringSSL. See // https://boringssl.googlesource.com/boringssl/+/HEAD/SANDBOXING.md
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 72e86e01..ea65b52 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -1092,8 +1092,6 @@ "indexed_db/indexed_db_database_callbacks.h", "indexed_db/indexed_db_database_error.cc", "indexed_db/indexed_db_database_error.h", - "indexed_db/indexed_db_dispatcher_host.cc", - "indexed_db/indexed_db_dispatcher_host.h", "indexed_db/indexed_db_external_object.cc", "indexed_db/indexed_db_external_object.h", "indexed_db/indexed_db_external_object_storage.cc",
diff --git a/content/browser/OWNERS b/content/browser/OWNERS index 129ed64..41b8826 100644 --- a/content/browser/OWNERS +++ b/content/browser/OWNERS
@@ -66,3 +66,6 @@ # (BrowserThread, BrowserMainLoop, BrowserMainRunner, etc.) per-file browser_main*=gab@chromium.org per-file browser_thread*=gab@chromium.org + +# Performance metrics. +per-file largest_contentful_paint*=file://components/page_load_metrics/OWNERS \ No newline at end of file
diff --git a/content/browser/aggregation_service/aggregation_service_features.cc b/content/browser/aggregation_service/aggregation_service_features.cc index 939764b..223bf3d2 100644 --- a/content/browser/aggregation_service/aggregation_service_features.cc +++ b/content/browser/aggregation_service/aggregation_service_features.cc
@@ -18,6 +18,6 @@ BASE_FEATURE(kPrivacySandboxAggregationServiceReportPadding, "PrivacySandboxAggregationServiceReportPadding", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); } // namespace content
diff --git a/content/browser/cookie_deprecation_label/cookie_deprecation_label_browsertest.cc b/content/browser/cookie_deprecation_label/cookie_deprecation_label_browsertest.cc index 3ae08ef8..41855da 100644 --- a/content/browser/cookie_deprecation_label/cookie_deprecation_label_browsertest.cc +++ b/content/browser/cookie_deprecation_label/cookie_deprecation_label_browsertest.cc
@@ -529,7 +529,7 @@ } IN_PROC_BROWSER_TEST_F(CookieDeprecationLabelEnabledBrowserTest, - Incognito_EmptyLabelReturned) { + OffTheRecord_EmptyLabelReturned) { auto https_server = CreateTestServer(EmbeddedTestServer::TYPE_HTTPS); ASSERT_TRUE(https_server->Start()); @@ -601,13 +601,13 @@ response_a_b->Done(); } -class CookieDeprecationLabelIncognitoEnabledBrowserTest +class CookieDeprecationLabelOffTheRecordEnabledBrowserTest : public CookieDeprecationLabelBrowserTestBase { public: - CookieDeprecationLabelIncognitoEnabledBrowserTest() { + CookieDeprecationLabelOffTheRecordEnabledBrowserTest() { scoped_feature_list_.InitAndEnableFeatureWithParameters( features::kCookieDeprecationFacilitatedTesting, - {{"label", "label_test"}, {"enable_incognito", "true"}}); + {{"label", "label_test"}, {"enable_otr_profiles", "true"}}); } private: @@ -615,10 +615,11 @@ }; // Ensure that cookie deprecation labels are present in incognito mode if the -// "enable_incognito" feature parameter is true. See also the -// CookieDeprecationLabelEnabledBrowserTest.Incognito_EmptyLabelReturned test. -IN_PROC_BROWSER_TEST_F(CookieDeprecationLabelIncognitoEnabledBrowserTest, - Incognito_LabelReturned) { +// "enable_otr_profiles" feature parameter is true. See also the +// CookieDeprecationLabelEnabledBrowserTest.OffTheRecord_EmptyLabelReturned +// test. +IN_PROC_BROWSER_TEST_F(CookieDeprecationLabelOffTheRecordEnabledBrowserTest, + OffTheRecord_LabelReturned) { auto https_server = CreateTestServer(EmbeddedTestServer::TYPE_HTTPS); ASSERT_TRUE(https_server->Start());
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc index 70fe8cb0..17ec302 100644 --- a/content/browser/gpu/gpu_internals_ui.cc +++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -139,7 +139,6 @@ base::Value::List GetBasicGpuInfo(const gpu::GPUInfo& gpu_info, const gpu::GpuFeatureInfo& gpu_feature_info, const gfx::GpuExtraInfo& gpu_extra_info) { - const gpu::GPUDevice& active_gpu = gpu_info.active_gpu(); base::Value::List basic_info; basic_info.Append(display::BuildGpuInfoEntry( "Initialization time", @@ -152,13 +151,6 @@ basic_info.Append( display::BuildGpuInfoEntry("Sandboxed", base::Value(gpu_info.sandboxed))); basic_info.Append( - display::BuildGpuInfoEntry("GPU0", GPUDeviceToString(gpu_info.gpu))); - for (size_t i = 0; i < gpu_info.secondary_gpus.size(); ++i) { - basic_info.Append(display::BuildGpuInfoEntry( - base::StringPrintf("GPU%d", static_cast<int>(i + 1)), - GPUDeviceToString(gpu_info.secondary_gpus[i]))); - } - basic_info.Append( display::BuildGpuInfoEntry("Optimus", base::Value(gpu_info.optimus))); basic_info.Append(display::BuildGpuInfoEntry( "AMD switchable", base::Value(gpu_info.amd_switchable))); @@ -211,42 +203,16 @@ gpu::VulkanVersionToString(gpu_info.vulkan_version))); #endif - basic_info.Append(display::BuildGpuInfoEntry( - "GPU CUDA compute capability major version", - base::Value(active_gpu.cuda_compute_capability_major))); - basic_info.Append(display::BuildGpuInfoEntry( - "Pixel shader version", active_gpu.pixel_shader_version)); - basic_info.Append(display::BuildGpuInfoEntry( - "Vertex shader version", active_gpu.vertex_shader_version)); - basic_info.Append(display::BuildGpuInfoEntry("Max. MSAA samples", - active_gpu.max_msaa_samples)); basic_info.Append(display::BuildGpuInfoEntry("Machine model name", gpu_info.machine_model_name)); basic_info.Append(display::BuildGpuInfoEntry("Machine model version", gpu_info.machine_model_version)); basic_info.Append(display::BuildGpuInfoEntry( "GL implementation parts", gpu_info.gl_implementation_parts.ToString())); - basic_info.Append( - display::BuildGpuInfoEntry("Display type", active_gpu.display_type)); - basic_info.Append( - display::BuildGpuInfoEntry("GL_VENDOR", active_gpu.gl_vendor)); - basic_info.Append( - display::BuildGpuInfoEntry("GL_RENDERER", active_gpu.gl_renderer)); - basic_info.Append( - display::BuildGpuInfoEntry("GL_VERSION", active_gpu.gl_version)); - basic_info.Append( - display::BuildGpuInfoEntry("GL_EXTENSIONS", active_gpu.gl_extensions)); basic_info.Append(display::BuildGpuInfoEntry( "Disabled Extensions", gpu_feature_info.disabled_extensions)); basic_info.Append(display::BuildGpuInfoEntry( "Disabled WebGL Extensions", gpu_feature_info.disabled_webgl_extensions)); - basic_info.Append(display::BuildGpuInfoEntry("Window system binding vendor", - active_gpu.gl_ws_vendor)); - basic_info.Append(display::BuildGpuInfoEntry("Window system binding version", - active_gpu.gl_ws_version)); - basic_info.Append(display::BuildGpuInfoEntry( - "Window system binding extensions", active_gpu.gl_ws_extensions)); - { base::Value::List gpu_extra_info_values = display::Screen::GetScreen()->GetGpuExtraInfo(gpu_extra_info); @@ -260,27 +226,6 @@ } } - std::string direct_rendering_version; - if (active_gpu.direct_rendering_version == "1") { - direct_rendering_version = "indirect"; - } else if (active_gpu.direct_rendering_version == "2") { - direct_rendering_version = "direct but version unknown"; - } else if (base::StartsWith(active_gpu.direct_rendering_version, "2.", - base::CompareCase::INSENSITIVE_ASCII)) { - direct_rendering_version = active_gpu.direct_rendering_version; - base::ReplaceFirstSubstringAfterOffset(&direct_rendering_version, 0, "2.", - "DRI"); - } else { - direct_rendering_version = "unknown"; - } - basic_info.Append(display::BuildGpuInfoEntry("Direct rendering version", - direct_rendering_version)); - - std::string reset_strategy = - base::StringPrintf("0x%04x", active_gpu.gl_reset_notification_strategy); - basic_info.Append(display::BuildGpuInfoEntry("Reset notification strategy", - reset_strategy)); - basic_info.Append(display::BuildGpuInfoEntry( "GPU process crash count", base::Value(GpuProcessHost::GetGpuCrashCount()))); @@ -303,6 +248,58 @@ return basic_info; } +base::Value::List GetDeviceInfo(const gpu::GPUDevice& gpu_device, + std::string gpu_device_name) { + base::Value::List device_info; + device_info.Append(display::BuildGpuInfoEntry(gpu_device_name, + GPUDeviceToString(gpu_device))); + device_info.Append(display::BuildGpuInfoEntry( + "GPU CUDA compute capability major version", + base::Value(gpu_device.cuda_compute_capability_major))); + device_info.Append(display::BuildGpuInfoEntry( + "Pixel shader version", gpu_device.pixel_shader_version)); + device_info.Append(display::BuildGpuInfoEntry( + "Vertex shader version", gpu_device.vertex_shader_version)); + device_info.Append(display::BuildGpuInfoEntry("Max. MSAA samples", + gpu_device.max_msaa_samples)); + device_info.Append( + display::BuildGpuInfoEntry("Display type", gpu_device.display_type)); + device_info.Append( + display::BuildGpuInfoEntry("GL_VENDOR", gpu_device.gl_vendor)); + device_info.Append( + display::BuildGpuInfoEntry("GL_RENDERER", gpu_device.gl_renderer)); + device_info.Append( + display::BuildGpuInfoEntry("GL_VERSION", gpu_device.gl_version)); + device_info.Append( + display::BuildGpuInfoEntry("GL_EXTENSIONS", gpu_device.gl_extensions)); + device_info.Append(display::BuildGpuInfoEntry("Window system binding vendor", + gpu_device.gl_ws_vendor)); + device_info.Append(display::BuildGpuInfoEntry("Window system binding version", + gpu_device.gl_ws_version)); + device_info.Append(display::BuildGpuInfoEntry( + "Window system binding extensions", gpu_device.gl_ws_extensions)); + std::string direct_rendering_version; + if (gpu_device.direct_rendering_version == "1") { + direct_rendering_version = "indirect"; + } else if (gpu_device.direct_rendering_version == "2") { + direct_rendering_version = "direct but version unknown"; + } else if (base::StartsWith(gpu_device.direct_rendering_version, "2.", + base::CompareCase::INSENSITIVE_ASCII)) { + direct_rendering_version = gpu_device.direct_rendering_version; + base::ReplaceFirstSubstringAfterOffset(&direct_rendering_version, 0, "2.", + "DRI"); + } else { + direct_rendering_version = "unknown"; + } + device_info.Append(display::BuildGpuInfoEntry("Direct rendering version", + direct_rendering_version)); + std::string reset_strategy = + base::StringPrintf("0x%04x", gpu_device.gl_reset_notification_strategy); + device_info.Append(display::BuildGpuInfoEntry("Reset notification strategy", + reset_strategy)); + return device_info; +} + base::Value::Dict GetGpuInfo() { base::Value::Dict info; @@ -314,6 +311,14 @@ base::Value::List basic_info = GetBasicGpuInfo(gpu_info, gpu_feature_info, gpu_extra_info); info.Set("basicInfo", std::move(basic_info)); + base::Value::List device_info; + device_info.Append(GetDeviceInfo(gpu_info.gpu, "GPU 0")); + int i = 1; + for (const gpu::GPUDevice& device : gpu_info.secondary_gpus) { + device_info.Append( + GetDeviceInfo(device, base::StringPrintf("GPU %d", i++))); + } + info.Set("devices", std::move(device_info)); #if BUILDFLAG(IS_WIN) base::Value::List dx_info;
diff --git a/content/browser/indexed_db/indexed_db_context_impl.cc b/content/browser/indexed_db/indexed_db_context_impl.cc index 247dd91b..1616224 100644 --- a/content/browser/indexed_db/indexed_db_context_impl.cc +++ b/content/browser/indexed_db/indexed_db_context_impl.cc
@@ -46,7 +46,6 @@ #include "content/browser/indexed_db/indexed_db_class_factory.h" #include "content/browser/indexed_db/indexed_db_connection.h" #include "content/browser/indexed_db/indexed_db_database.h" -#include "content/browser/indexed_db/indexed_db_dispatcher_host.h" #include "content/browser/indexed_db/indexed_db_factory.h" #include "content/browser/indexed_db/indexed_db_leveldb_operations.h" #include "content/browser/indexed_db/indexed_db_quota_client.h" @@ -122,7 +121,6 @@ // BLOCK_SHUTDOWN to support clearing session-only storage. base::TaskShutdownBehavior::BLOCK_SHUTDOWN}))), io_task_runner_(std::move(io_task_runner)), - dispatcher_host_(this), base_data_path_(base_data_path.empty() ? base::FilePath() : base_data_path), force_keep_session_state_(false), @@ -217,10 +215,8 @@ if (bucket_info.has_value()) { bucket = bucket_info.value(); } - dispatcher_host_.AddReceiver( - IndexedDBDispatcherHost::ReceiverContext( - bucket, std::move(client_state_checker_remote)), - std::move(receiver)); + GetIDBFactory()->AddReceiver(bucket, std::move(client_state_checker_remote), + std::move(receiver)); } void IndexedDBContextImpl::GetUsage(GetUsageCallback usage_callback) { @@ -896,7 +892,7 @@ return paths; } -const base::FilePath IndexedDBContextImpl::GetDataPath( +base::FilePath IndexedDBContextImpl::GetDataPath( const storage::BucketLocator& bucket_locator) const { if (is_incognito()) { return base::FilePath();
diff --git a/content/browser/indexed_db/indexed_db_context_impl.h b/content/browser/indexed_db/indexed_db_context_impl.h index 489c2b18..e0012d652 100644 --- a/content/browser/indexed_db/indexed_db_context_impl.h +++ b/content/browser/indexed_db/indexed_db_context_impl.h
@@ -27,7 +27,6 @@ #include "components/services/storage/public/mojom/quota_client.mojom.h" #include "components/services/storage/public/mojom/storage_policy_update.mojom.h" #include "content/browser/indexed_db/indexed_db_backing_store.h" -#include "content/browser/indexed_db/indexed_db_dispatcher_host.h" #include "content/common/content_export.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -193,7 +192,7 @@ std::vector<base::FilePath> GetStoragePaths( const storage::BucketLocator& bucket_locator) const; - const base::FilePath GetDataPath( + base::FilePath GetDataPath( const storage::BucketLocator& bucket_locator) const; const base::FilePath GetFirstPartyDataPathForTesting() const; @@ -224,6 +223,8 @@ private: friend class base::RefCountedThreadSafe<IndexedDBContextImpl>; + friend class IndexedDBTest; + friend class IndexedDBFactoryTest; class IndexedDBGetUsageAndQuotaCallback; @@ -304,7 +305,6 @@ const scoped_refptr<base::SequencedTaskRunner> idb_task_runner_; const scoped_refptr<base::TaskRunner> io_task_runner_; - IndexedDBDispatcherHost dispatcher_host_; // Bound and accessed on the `idb_task_runner_`. mojo::Remote<storage::mojom::BlobStorageContext> blob_storage_context_;
diff --git a/content/browser/indexed_db/indexed_db_context_unittest.cc b/content/browser/indexed_db/indexed_db_context_unittest.cc index 8366163..c496533c 100644 --- a/content/browser/indexed_db/indexed_db_context_unittest.cc +++ b/content/browser/indexed_db/indexed_db_context_unittest.cc
@@ -124,29 +124,13 @@ base::test::TestFuture<std::vector<blink::mojom::IDBNameAndVersionPtr>, blink::mojom::IDBErrorPtr> info_future; - - auto example_bucket_info = storage::BucketInfo(); - example_bucket_info.storage_key = example_storage_key_; - example_bucket_info.name = storage::kDefaultBucketName; - auto example_bucket_locator = example_bucket_info.ToBucketLocator(); - - indexed_db_context_->GetIDBFactory()->GetDatabaseInfo( - example_bucket_info, - indexed_db_context_->GetDataPath(example_bucket_locator), - info_future.GetCallback()); + example_remote->GetDatabaseInfo(info_future.GetCallback()); ASSERT_TRUE(info_future.Wait()); base::test::TestFuture<std::vector<blink::mojom::IDBNameAndVersionPtr>, blink::mojom::IDBErrorPtr> info_future2; - auto google_bucket_info = storage::BucketInfo(); - google_bucket_info.storage_key = google_storage_key_; - google_bucket_info.name = storage::kDefaultBucketName; - auto google_bucket_locator = google_bucket_info.ToBucketLocator(); - indexed_db_context_->GetIDBFactory()->GetDatabaseInfo( - google_bucket_info, - indexed_db_context_->GetDataPath(google_bucket_locator), - info_future2.GetCallback()); + google_remote->GetDatabaseInfo(info_future2.GetCallback()); ASSERT_TRUE(info_future2.Wait()); // Check default bucket exists for https://example.com.
diff --git a/content/browser/indexed_db/indexed_db_dispatcher_host.cc b/content/browser/indexed_db/indexed_db_dispatcher_host.cc deleted file mode 100644 index 8d357db..0000000 --- a/content/browser/indexed_db/indexed_db_dispatcher_host.cc +++ /dev/null
@@ -1,152 +0,0 @@ -// Copyright 2012 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/indexed_db/indexed_db_dispatcher_host.h" - -#include <utility> - -#include "base/files/file_path.h" -#include "base/functional/bind.h" -#include "content/browser/indexed_db/indexed_db_context_impl.h" -#include "content/browser/indexed_db/indexed_db_database_callbacks.h" -#include "content/browser/indexed_db/indexed_db_factory.h" -#include "content/browser/indexed_db/indexed_db_factory_client.h" -#include "content/browser/indexed_db/indexed_db_pending_connection.h" -#include "content/browser/indexed_db/transaction_impl.h" - -namespace content { - -IndexedDBDispatcherHost::IndexedDBDispatcherHost( - IndexedDBContextImpl* indexed_db_context) - : indexed_db_context_(indexed_db_context) { - DETACH_FROM_SEQUENCE(sequence_checker_); - DCHECK(indexed_db_context_); -} - -IndexedDBDispatcherHost::~IndexedDBDispatcherHost() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); -} - -IndexedDBDispatcherHost::ReceiverContext::ReceiverContext() = default; -IndexedDBDispatcherHost::ReceiverContext::ReceiverContext( - absl::optional<storage::BucketInfo> bucket, - mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> - client_state_checker_remote) - : bucket(bucket), - client_state_checker( - base::MakeRefCounted<IndexedDBClientStateCheckerWrapper>( - std::move(client_state_checker_remote))) {} - -IndexedDBDispatcherHost::ReceiverContext::ReceiverContext( - IndexedDBDispatcherHost::ReceiverContext&&) noexcept = default; - -IndexedDBDispatcherHost::ReceiverContext::~ReceiverContext() = default; - -void IndexedDBDispatcherHost::AddReceiver( - IndexedDBDispatcherHost::ReceiverContext context, - mojo::PendingReceiver<blink::mojom::IDBFactory> pending_receiver) { - DCHECK(IDBTaskRunner()->RunsTasksInCurrentSequence()); - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - receivers_.Add(this, std::move(pending_receiver), std::move(context)); -} - -void IndexedDBDispatcherHost::GetDatabaseInfo( - GetDatabaseInfoCallback callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - const absl::optional<storage::BucketInfo>& bucket = - receivers_.current_context().bucket; - - // Return error if failed to retrieve bucket from the QuotaManager. - if (!bucket) { - std::move(callback).Run( - {}, blink::mojom::IDBError::New( - blink::mojom::IDBException::kUnknownError, u"Internal error.")); - return; - } - - base::FilePath indexed_db_path = - indexed_db_context_->GetDataPath(bucket->ToBucketLocator()); - indexed_db_context_->GetIDBFactory()->GetDatabaseInfo( - *bucket, indexed_db_path, std::move(callback)); -} - -void IndexedDBDispatcherHost::Open( - mojo::PendingAssociatedRemote<blink::mojom::IDBFactoryClient> - pending_factory_client, - mojo::PendingAssociatedRemote<blink::mojom::IDBDatabaseCallbacks> - database_callbacks_remote, - const std::u16string& name, - int64_t version, - mojo::PendingAssociatedReceiver<blink::mojom::IDBTransaction> - transaction_receiver, - int64_t transaction_id) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - const absl::optional<storage::BucketInfo>& bucket = - receivers_.current_context().bucket; - - // Return error if failed to retrieve bucket from the QuotaManager. - if (!bucket) { - IndexedDBFactoryClient(std::move(pending_factory_client), IDBTaskRunner()) - .OnError(IndexedDBDatabaseError( - blink::mojom::IDBException::kUnknownError, u"Internal error.")); - return; - } - - auto callbacks = std::make_unique<IndexedDBFactoryClient>( - std::move(pending_factory_client), IDBTaskRunner()); - auto database_callbacks = base::MakeRefCounted<IndexedDBDatabaseCallbacks>( - indexed_db_context_, std::move(database_callbacks_remote), - IDBTaskRunner()); - - storage::BucketLocator bucket_locator = bucket->ToBucketLocator(); - base::FilePath indexed_db_path = - indexed_db_context_->GetDataPath(bucket_locator); - - auto create_transaction_callback = base::BindOnce( - &TransactionImpl::CreateAndBind, std::move(transaction_receiver)); - std::unique_ptr<IndexedDBPendingConnection> connection = - std::make_unique<IndexedDBPendingConnection>( - std::move(callbacks), std::move(database_callbacks), transaction_id, - version, std::move(create_transaction_callback)); - - // TODO(dgrogan): Don't let a non-existing database be opened (and therefore - // created) if this origin is already over quota. - indexed_db_context_->GetIDBFactory()->Open( - name, std::move(connection), *bucket, indexed_db_path, - receivers_.current_context().client_state_checker); -} - -void IndexedDBDispatcherHost::DeleteDatabase( - mojo::PendingAssociatedRemote<blink::mojom::IDBFactoryClient> - pending_factory_client, - const std::u16string& name, - bool force_close) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - const absl::optional<storage::BucketInfo>& bucket = - receivers_.current_context().bucket; - - // Return error if failed to retrieve bucket from the QuotaManager. - if (!bucket) { - IndexedDBFactoryClient(std::move(pending_factory_client), IDBTaskRunner()) - .OnError(IndexedDBDatabaseError( - blink::mojom::IDBException::kUnknownError, u"Internal error.")); - return; - } - - auto factory_client = std::make_unique<IndexedDBFactoryClient>( - std::move(pending_factory_client), IDBTaskRunner()); - base::FilePath indexed_db_path = - indexed_db_context_->GetDataPath(bucket->ToBucketLocator()); - indexed_db_context_->GetIDBFactory()->DeleteDatabase( - name, std::move(factory_client), *bucket, indexed_db_path, force_close); -} - -base::SequencedTaskRunner* IndexedDBDispatcherHost::IDBTaskRunner() const { - return indexed_db_context_->IDBTaskRunner().get(); -} - -} // namespace content
diff --git a/content/browser/indexed_db/indexed_db_dispatcher_host.h b/content/browser/indexed_db/indexed_db_dispatcher_host.h deleted file mode 100644 index efb96b9f..0000000 --- a/content/browser/indexed_db/indexed_db_dispatcher_host.h +++ /dev/null
@@ -1,120 +0,0 @@ -// Copyright 2012 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_DISPATCHER_HOST_H_ -#define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_DISPATCHER_HOST_H_ - -#include <stdint.h> - -#include <map> -#include <memory> -#include <string> -#include <utility> -#include <vector> - -#include "base/memory/raw_ptr_exclusion.h" -#include "base/sequence_checker.h" -#include "components/services/storage/privileged/mojom/indexed_db_client_state_checker.mojom.h" -#include "components/services/storage/public/cpp/buckets/bucket_info.h" -#include "components/services/storage/public/cpp/buckets/bucket_locator.h" -#include "content/browser/indexed_db/indexed_db_client_state_checker_wrapper.h" -#include "content/common/content_export.h" -#include "mojo/public/cpp/bindings/pending_associated_receiver.h" -#include "mojo/public/cpp/bindings/pending_associated_remote.h" -#include "mojo/public/cpp/bindings/receiver_set.h" -#include "mojo/public/cpp/bindings/unique_associated_receiver_set.h" -#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h" - -namespace base { -class SequencedTaskRunner; -} // namespace base - -namespace content { -class IndexedDBContextImpl; - -// All calls but the constructor (including destruction) must -// happen on the IDB sequenced task runner. -class CONTENT_EXPORT IndexedDBDispatcherHost : public blink::mojom::IDBFactory { - public: - // The data structure that stores everything bound to the receiver. This will - // be stored together with the receiver in the `mojo::ReceiverSet`. - struct ReceiverContext { - ReceiverContext(); - ReceiverContext(absl::optional<storage::BucketInfo> bucket, - mojo::PendingAssociatedRemote< - storage::mojom::IndexedDBClientStateChecker> - client_state_checker_remote); - - ~ReceiverContext(); - - ReceiverContext(const ReceiverContext&) = delete; - ReceiverContext(ReceiverContext&&) noexcept; - ReceiverContext& operator=(const ReceiverContext&) = delete; - ReceiverContext& operator=(ReceiverContext&&) = delete; - - // The `bucket` might be null if `QuotaDatabase::GetDatabase()` fails - // during the IndexedDB binding. - absl::optional<storage::BucketInfo> bucket; - // This is needed when the checker needs to be copied to other holder, e.g. - // `IndexedDBConnection`s that are opened through this dispatcher. - scoped_refptr<IndexedDBClientStateCheckerWrapper> client_state_checker; - }; - - explicit IndexedDBDispatcherHost(IndexedDBContextImpl* indexed_db_context); - - IndexedDBDispatcherHost(const IndexedDBDispatcherHost&) = delete; - IndexedDBDispatcherHost& operator=(const IndexedDBDispatcherHost&) = delete; - - ~IndexedDBDispatcherHost() override; - - void AddReceiver( - ReceiverContext context, - mojo::PendingReceiver<blink::mojom::IDBFactory> pending_receiver); - - // A shortcut for accessing our context. - IndexedDBContextImpl* context() const { return indexed_db_context_; } - - // Must be called on the IDB sequence. - base::WeakPtr<IndexedDBDispatcherHost> AsWeakPtr() { - return weak_factory_.GetWeakPtr(); - } - - private: - friend class IndexedDBDispatcherHostTest; - - // blink::mojom::IDBFactory implementation: - void GetDatabaseInfo(GetDatabaseInfoCallback callback) override; - void Open(mojo::PendingAssociatedRemote<blink::mojom::IDBFactoryClient> - factory_client, - mojo::PendingAssociatedRemote<blink::mojom::IDBDatabaseCallbacks> - database_callbacks_remote, - const std::u16string& name, - int64_t version, - mojo::PendingAssociatedReceiver<blink::mojom::IDBTransaction> - transaction_receiver, - int64_t transaction_id) override; - void DeleteDatabase(mojo::PendingAssociatedRemote< - blink::mojom::IDBFactoryClient> factory_client, - const std::u16string& name, - bool force_close) override; - - base::SequencedTaskRunner* IDBTaskRunner() const; - - // IndexedDBDispatcherHost is owned by IndexedDBContextImpl. - // This field is not a raw_ptr<> because templates made it difficult for the - // rewriter to see that |.get()| needs to be appended. - RAW_PTR_EXCLUSION IndexedDBContextImpl* indexed_db_context_; - - mojo::ReceiverSet<blink::mojom::IDBFactory, - IndexedDBDispatcherHost::ReceiverContext> - receivers_; - - SEQUENCE_CHECKER(sequence_checker_); - - base::WeakPtrFactory<IndexedDBDispatcherHost> weak_factory_{this}; -}; - -} // namespace content - -#endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_DISPATCHER_HOST_H_
diff --git a/content/browser/indexed_db/indexed_db_dispatcher_host_unittest.cc b/content/browser/indexed_db/indexed_db_dispatcher_host_unittest.cc index c084c7b..43ea01e5 100644 --- a/content/browser/indexed_db/indexed_db_dispatcher_host_unittest.cc +++ b/content/browser/indexed_db/indexed_db_dispatcher_host_unittest.cc
@@ -2,7 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/indexed_db/indexed_db_dispatcher_host.h" +// TODO(crbug.com/843764): `IndexedDBDispatcherHost` has been removed, but +// surprisingly this file did not actually rely on it. These tests, many of +// which are disabled, should be cleaned up and merged into other unit tests, +// such as `IndexedDBTest`. + +// #include "content/browser/indexed_db/indexed_db_dispatcher_host.h" #include <tuple>
diff --git a/content/browser/indexed_db/indexed_db_factory.cc b/content/browser/indexed_db/indexed_db_factory.cc index 7e85ad7..02ff0e2b 100644 --- a/content/browser/indexed_db/indexed_db_factory.cc +++ b/content/browser/indexed_db/indexed_db_factory.cc
@@ -49,13 +49,17 @@ #include "content/browser/indexed_db/indexed_db_connection.h" #include "content/browser/indexed_db/indexed_db_context_impl.h" #include "content/browser/indexed_db/indexed_db_data_format_version.h" +#include "content/browser/indexed_db/indexed_db_database_callbacks.h" #include "content/browser/indexed_db/indexed_db_database_error.h" +#include "content/browser/indexed_db/indexed_db_factory_client.h" #include "content/browser/indexed_db/indexed_db_leveldb_operations.h" +#include "content/browser/indexed_db/indexed_db_pending_connection.h" #include "content/browser/indexed_db/indexed_db_pre_close_task_queue.h" #include "content/browser/indexed_db/indexed_db_reporting.h" #include "content/browser/indexed_db/indexed_db_task_helper.h" #include "content/browser/indexed_db/indexed_db_tombstone_sweeper.h" #include "content/browser/indexed_db/indexed_db_transaction.h" +#include "content/browser/indexed_db/transaction_impl.h" #include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h" #include "third_party/leveldatabase/env_chromium.h" @@ -190,12 +194,35 @@ this); } -void IndexedDBFactory::GetDatabaseInfo( - const storage::BucketInfo& bucket, - const base::FilePath& data_directory, - blink::mojom::IDBFactory::GetDatabaseInfoCallback callback) { +void IndexedDBFactory::AddReceiver( + absl::optional<storage::BucketInfo> bucket, + mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> + client_state_checker_remote, + mojo::PendingReceiver<blink::mojom::IDBFactory> pending_receiver) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + receivers_.Add( + this, std::move(pending_receiver), + ReceiverContext(bucket, std::move(client_state_checker_remote))); +} + +void IndexedDBFactory::GetDatabaseInfo(GetDatabaseInfoCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); TRACE_EVENT0("IndexedDB", "IndexedDBFactory::GetDatabaseInfo"); + + const absl::optional<storage::BucketInfo>& bucket = + receivers_.current_context().bucket; + + // Return error if failed to retrieve bucket from the QuotaManager. + if (!bucket) { + std::move(callback).Run( + {}, blink::mojom::IDBError::New( + blink::mojom::IDBException::kUnknownError, u"Internal error.")); + return; + } + + const storage::BucketLocator bucket_locator = bucket->ToBucketLocator(); + const base::FilePath data_directory = context_->GetDataPath(bucket_locator); + IndexedDBBucketContextHandle bucket_context_handle; leveldb::Status s; IndexedDBDatabaseError error; @@ -203,9 +230,8 @@ // Note: Any data loss information here is not piped up to the renderer, and // will be lost. std::tie(bucket_context_handle, s, error, std::ignore, std::ignore) = - GetOrCreateBucketContext(bucket, data_directory, + GetOrCreateBucketContext(*bucket, data_directory, /*create_if_missing=*/false); - const storage::BucketLocator bucket_locator = bucket.ToBucketLocator(); if (!bucket_context_handle.IsHeld() || !bucket_context_handle.bucket_context()) { if (s.IsNotFound()) { @@ -238,21 +264,55 @@ } void IndexedDBFactory::Open( + mojo::PendingAssociatedRemote<blink::mojom::IDBFactoryClient> + pending_factory_client, + mojo::PendingAssociatedRemote<blink::mojom::IDBDatabaseCallbacks> + database_callbacks_remote, const std::u16string& name, - std::unique_ptr<IndexedDBPendingConnection> connection, - const storage::BucketInfo& bucket, - const base::FilePath& data_directory, - scoped_refptr<IndexedDBClientStateCheckerWrapper> client_state_checker) { + int64_t version, + mojo::PendingAssociatedReceiver<blink::mojom::IDBTransaction> + transaction_receiver, + int64_t transaction_id) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); TRACE_EVENT0("IndexedDB", "IndexedDBFactory::Open"); - const storage::BucketLocator bucket_locator = bucket.ToBucketLocator(); + + const absl::optional<storage::BucketInfo>& bucket = + receivers_.current_context().bucket; + + // Return error if failed to retrieve bucket from the QuotaManager. + if (!bucket) { + IndexedDBFactoryClient(std::move(pending_factory_client), + context_->IDBTaskRunner()) + .OnError(IndexedDBDatabaseError( + blink::mojom::IDBException::kUnknownError, u"Internal error.")); + return; + } + + // TODO(dgrogan): Don't let a non-existing database be opened (and therefore + // created) if this origin is already over quota. + + auto callbacks = std::make_unique<IndexedDBFactoryClient>( + std::move(pending_factory_client), context_->IDBTaskRunner()); + auto database_callbacks = base::MakeRefCounted<IndexedDBDatabaseCallbacks>( + context_.get(), std::move(database_callbacks_remote), + context_->IDBTaskRunner().get()); + + const storage::BucketLocator bucket_locator = bucket->ToBucketLocator(); + const base::FilePath data_directory = context_->GetDataPath(bucket_locator); + + auto create_transaction_callback = base::BindOnce( + &TransactionImpl::CreateAndBind, std::move(transaction_receiver)); + auto connection = std::make_unique<IndexedDBPendingConnection>( + std::move(callbacks), std::move(database_callbacks), transaction_id, + version, std::move(create_transaction_callback)); + IndexedDBDatabase::Identifier unique_identifier(bucket_locator, name); IndexedDBBucketContextHandle bucket_context_handle; leveldb::Status s; IndexedDBDatabaseError error; std::tie(bucket_context_handle, s, error, connection->data_loss_info, connection->was_cold_open) = - GetOrCreateBucketContext(bucket, data_directory, + GetOrCreateBucketContext(*bucket, data_directory, /*create_if_missing=*/true); if (!bucket_context_handle.IsHeld() || !bucket_context_handle.bucket_context()) { @@ -264,8 +324,9 @@ } auto it = bucket_context_handle->databases().find(name); if (it != bucket_context_handle->databases().end()) { - it->second->ScheduleOpenConnection(std::move(connection), - std::move(client_state_checker)); + it->second->ScheduleOpenConnection( + std::move(connection), + receivers_.current_context().client_state_checker); return; } auto database = std::make_unique<IndexedDBDatabase>( @@ -275,19 +336,34 @@ // CreateDatabaseDeleteClosure can be called synchronously. auto* database_ptr = database.get(); bucket_context_handle->AddDatabase(name, std::move(database)); - database_ptr->ScheduleOpenConnection(std::move(connection), - std::move(client_state_checker)); + database_ptr->ScheduleOpenConnection( + std::move(connection), receivers_.current_context().client_state_checker); } void IndexedDBFactory::DeleteDatabase( + mojo::PendingAssociatedRemote<blink::mojom::IDBFactoryClient> + pending_factory_client, const std::u16string& name, - std::unique_ptr<IndexedDBFactoryClient> factory_client, - const storage::BucketInfo& bucket, - const base::FilePath& data_directory, bool force_close) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); TRACE_EVENT0("IndexedDB", "IndexedDBFactory::DeleteDatabase"); - const storage::BucketLocator bucket_locator = bucket.ToBucketLocator(); + + const absl::optional<storage::BucketInfo>& bucket = + receivers_.current_context().bucket; + + // Return error if failed to retrieve bucket from the QuotaManager. + if (!bucket) { + IndexedDBFactoryClient(std::move(pending_factory_client), + context_->IDBTaskRunner()) + .OnError(IndexedDBDatabaseError( + blink::mojom::IDBException::kUnknownError, u"Internal error.")); + return; + } + + auto factory_client = std::make_unique<IndexedDBFactoryClient>( + std::move(pending_factory_client), context_->IDBTaskRunner()); + + const storage::BucketLocator bucket_locator = bucket->ToBucketLocator(); IndexedDBDatabase::Identifier unique_identifier(bucket_locator, name); IndexedDBBucketContextHandle bucket_context_handle; leveldb::Status s; @@ -295,7 +371,7 @@ // Note: Any data loss information here is not piped up to the renderer, and // will be lost. std::tie(bucket_context_handle, s, error, std::ignore, std::ignore) = - GetOrCreateBucketContext(bucket, data_directory, + GetOrCreateBucketContext(*bucket, context_->GetDataPath(bucket_locator), /*create_if_missing=*/true); if (!bucket_context_handle.IsHeld() || !bucket_context_handle.bucket_context()) { @@ -377,7 +453,7 @@ const IndexedDBDatabaseError& error) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(context_); - base::FilePath path_base = context_->GetDataPath(bucket_locator); + const base::FilePath path_base = context_->GetDataPath(bucket_locator); // The message may contain the database path, which may be considered // sensitive data, and those strings are passed to the extension, so strip it. @@ -626,8 +702,7 @@ // TODO(dmurph) Have these factories be given in the constructor, or as // arguments to this method. DefaultLevelDBScopesFactory scopes_factory; - std::unique_ptr<PartitionedLockManager> lock_manager = - std::make_unique<PartitionedLockManager>(); + auto lock_manager = std::make_unique<PartitionedLockManager>(); IndexedDBDataLossInfo data_loss_info; std::unique_ptr<IndexedDBBackingStore> backing_store; bool disk_full = false; @@ -1012,12 +1087,6 @@ return base::Contains(it->second->databases(), name); } -bool IndexedDBFactory::IsBackingStoreOpen( - const storage::BucketLocator& bucket_locator) const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return base::Contains(bucket_contexts_, bucket_locator.id); -} - bool IndexedDBFactory::OnMemoryDump( const base::trace_event::MemoryDumpArgs& args, base::trace_event::ProcessMemoryDump* pmd) { @@ -1050,4 +1119,17 @@ call_on_database_deleted_for_testing_ = std::move(callback); } +IndexedDBFactory::ReceiverContext::ReceiverContext( + absl::optional<storage::BucketInfo> bucket, + mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> + client_state_checker_remote) + : bucket(bucket), + client_state_checker( + base::MakeRefCounted<IndexedDBClientStateCheckerWrapper>( + std::move(client_state_checker_remote))) {} + +IndexedDBFactory::ReceiverContext::ReceiverContext( + IndexedDBFactory::ReceiverContext&&) noexcept = default; +IndexedDBFactory::ReceiverContext::~ReceiverContext() = default; + } // namespace content
diff --git a/content/browser/indexed_db/indexed_db_factory.h b/content/browser/indexed_db/indexed_db_factory.h index c57dec52..4a0bc0b 100644 --- a/content/browser/indexed_db/indexed_db_factory.h +++ b/content/browser/indexed_db/indexed_db_factory.h
@@ -24,6 +24,7 @@ #include "base/time/time.h" #include "base/trace_event/memory_dump_provider.h" #include "components/services/storage/indexed_db/scopes/leveldb_scopes_factory.h" +#include "components/services/storage/privileged/mojom/indexed_db_client_state_checker.mojom.h" #include "components/services/storage/public/cpp/buckets/bucket_id.h" #include "components/services/storage/public/cpp/buckets/bucket_info.h" #include "components/services/storage/public/cpp/buckets/bucket_locator.h" @@ -52,7 +53,9 @@ class IndexedDBDatabase; class TransactionalLevelDBDatabase; -class CONTENT_EXPORT IndexedDBFactory : base::trace_event::MemoryDumpProvider { +class CONTENT_EXPORT IndexedDBFactory + : public blink::mojom::IDBFactory, + public base::trace_event::MemoryDumpProvider { public: IndexedDBFactory(IndexedDBContextImpl* context, base::Clock* clock); @@ -62,21 +65,27 @@ ~IndexedDBFactory() override; - void GetDatabaseInfo( - const storage::BucketInfo& bucket, - const base::FilePath& data_directory, - blink::mojom::IDBFactory::GetDatabaseInfoCallback callback); - void Open( - const std::u16string& name, - std::unique_ptr<IndexedDBPendingConnection> connection, - const storage::BucketInfo& bucket, - const base::FilePath& data_directory, - scoped_refptr<IndexedDBClientStateCheckerWrapper> client_state_checker); - void DeleteDatabase(const std::u16string& name, - std::unique_ptr<IndexedDBFactoryClient> factory_client, - const storage::BucketInfo& bucket, - const base::FilePath& data_directory, - bool force_close); + void AddReceiver( + absl::optional<storage::BucketInfo> bucket, + mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> + client_state_checker_remote, + mojo::PendingReceiver<blink::mojom::IDBFactory> pending_receiver); + + // blink::mojom::IDBFactory implementation: + void GetDatabaseInfo(GetDatabaseInfoCallback callback) override; + void Open(mojo::PendingAssociatedRemote<blink::mojom::IDBFactoryClient> + factory_client, + mojo::PendingAssociatedRemote<blink::mojom::IDBDatabaseCallbacks> + database_callbacks_remote, + const std::u16string& name, + int64_t version, + mojo::PendingAssociatedReceiver<blink::mojom::IDBTransaction> + transaction_receiver, + int64_t transaction_id) override; + void DeleteDatabase(mojo::PendingAssociatedRemote< + blink::mojom::IDBFactoryClient> factory_client, + const std::u16string& name, + bool force_close) override; void HandleBackingStoreFailure(const storage::BucketLocator& bucket_locator); void HandleBackingStoreCorruption(storage::BucketLocator bucket_locator, @@ -161,6 +170,29 @@ FRIEND_TEST_ALL_PREFIXES(IndexedDBTest, ForceCloseOpenDatabasesOnCommitFailureThirdParty); + // The data structure that stores everything bound to the receiver. This will + // be stored together with the receiver in the `mojo::ReceiverSet`. + struct ReceiverContext { + ReceiverContext(absl::optional<storage::BucketInfo> bucket, + mojo::PendingAssociatedRemote< + storage::mojom::IndexedDBClientStateChecker> + client_state_checker_remote); + + ~ReceiverContext(); + + ReceiverContext(const ReceiverContext&) = delete; + ReceiverContext(ReceiverContext&&) noexcept; + ReceiverContext& operator=(const ReceiverContext&) = delete; + ReceiverContext& operator=(ReceiverContext&&) = delete; + + // The `bucket` might be null if `QuotaDatabase::GetDatabase()` fails + // during the IndexedDB binding. + absl::optional<storage::BucketInfo> bucket; + // This is needed when the checker needs to be copied to another holder, + // e.g. `IndexedDBConnection`s that are opened through this dispatcher. + scoped_refptr<IndexedDBClientStateCheckerWrapper> client_state_checker; + }; + // `path_base` is the directory that will contain the database directory, the // blob directory, and any data loss info. `database_path` is the directory // for the leveldb database, and `blob_path` is the directory to store blob @@ -196,7 +228,6 @@ // Testing helpers, so unit tests don't need to grovel through internal state. bool IsDatabaseOpen(const storage::BucketLocator& bucket_locator, const std::u16string& name) const; - bool IsBackingStoreOpen(const storage::BucketLocator& bucket_locator) const; bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args, base::trace_event::ProcessMemoryDump* pmd) override; @@ -216,6 +247,8 @@ OnDatabaseDeletedCallback call_on_database_deleted_for_testing_; + mojo::ReceiverSet<blink::mojom::IDBFactory, ReceiverContext> receivers_; + // Weak pointers from this factory are used to bind the // RunTaskForBucket() function, which deletes the // IndexedDBBucketContext object. This allows those weak pointers to be
diff --git a/content/browser/indexed_db/indexed_db_factory_unittest.cc b/content/browser/indexed_db/indexed_db_factory_unittest.cc index 24894e5..ad94577f 100644 --- a/content/browser/indexed_db/indexed_db_factory_unittest.cc +++ b/content/browser/indexed_db/indexed_db_factory_unittest.cc
@@ -17,6 +17,7 @@ #include "base/task/sequenced_task_runner.h" #include "base/task/single_thread_task_runner.h" #include "base/test/bind.h" +#include "base/test/gmock_callback_support.h" #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_clock.h" #include "base/test/task_environment.h" @@ -40,6 +41,8 @@ #include "content/browser/indexed_db/indexed_db_transaction.h" #include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h" #include "content/browser/indexed_db/mock_indexed_db_factory_client.h" +#include "content/browser/indexed_db/mock_mojo_indexed_db_database_callbacks.h" +#include "content/browser/indexed_db/mock_mojo_indexed_db_factory_client.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "net/base/features.h" #include "storage/browser/test/mock_quota_manager_proxy.h" @@ -51,10 +54,19 @@ #include "url/origin.h" using blink::IndexedDBDatabaseMetadata; +using testing::_; using url::Origin; namespace content { +namespace { + +ACTION_TEMPLATE(MoveArgPointee, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_1_VALUE_PARAMS(out)) { + *out = std::move(*::testing::get<k>(args)); +} + storage::BucketInfo ToBucketInfo(const storage::BucketLocator& bucket_locator) { storage::BucketInfo bucket_info; bucket_info.id = bucket_locator.id; @@ -63,6 +75,8 @@ return bucket_info; } +} // namespace + class IndexedDBFactoryTest : public testing::Test { public: IndexedDBFactoryTest() @@ -111,6 +125,8 @@ } IndexedDBClassFactory::Get()->SetLevelDBFactoryForTesting(nullptr); quota_manager_.reset(); + // Wait for mojo pipes to flush or there may be leaks. + task_environment_->RunUntilIdle(); } void SetUpContext() { @@ -144,53 +160,6 @@ IndexedDBClassFactory::Get()->SetLevelDBFactoryForTesting(factory); } - // Runs through the upgrade flow to create a basic database connection. There - // is no actual data in the database. - std::tuple<std::unique_ptr<IndexedDBConnection>, - scoped_refptr<MockIndexedDBDatabaseCallbacks>> - CreateConnectionForDatabase(const storage::BucketLocator& bucket_locator, - const std::u16string& name) { - auto db_callbacks = base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); - const int64_t transaction_id = 1; - - mock_factory_client_ = std::make_unique<MockIndexedDBFactoryClient>(); - auto connection = std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*mock_factory_client_), - db_callbacks, transaction_id, IndexedDBDatabaseMetadata::NO_VERSION, - base::DoNothing()); - - // Do the first half of the upgrade, and request the upgrade from renderer. - { - base::RunLoop loop; - mock_factory_client_->CallOnUpgradeNeeded( - base::BindLambdaForTesting([&]() { loop.Quit(); })); - factory()->Open(name, std::move(connection), ToBucketInfo(bucket_locator), - context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - loop.Run(); - } - - EXPECT_TRUE(mock_factory_client_->upgrade_called()); - EXPECT_TRUE(mock_factory_client_->connection()); - EXPECT_TRUE(mock_factory_client_->connection()->database()); - if (!mock_factory_client_->connection()) { - return {nullptr, nullptr}; - } - - // Finish the upgrade by committing the transaction. - { - base::RunLoop loop; - mock_factory_client_->CallOnDBSuccess( - base::BindLambdaForTesting([&]() { loop.Quit(); })); - mock_factory_client_->connection() - ->transactions() - .find(transaction_id) - ->second->SetCommitFlag(); - loop.Run(); - } - return {mock_factory_client_->TakeConnection(), db_callbacks}; - } - void RunPostedTasks() { base::RunLoop loop; base::SequencedTaskRunner::GetCurrentDefault()->PostTask( @@ -215,6 +184,15 @@ return future.Take().value(); } + void BindIndexedDBFactory( + mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> + checker_remote, + mojo::PendingReceiver<blink::mojom::IDBFactory> receiver, + storage::QuotaErrorOr<storage::BucketInfo> bucket_info) { + context()->BindIndexedDBImpl(std::move(checker_remote), std::move(receiver), + bucket_info); + } + protected: IndexedDBContextImpl* context() const { return context_.get(); } @@ -231,7 +209,6 @@ storage::MockQuotaManager* quota_manager() { return quota_manager_.get(); } - protected: std::unique_ptr<base::test::TaskEnvironment> task_environment_; base::ScopedTempDir temp_dir_; @@ -720,52 +697,6 @@ EXPECT_TRUE(s.IsIOError()); } -TEST_F(IndexedDBFactoryTest, ContextDestructionClosesConnections) { - SetUpContext(); - const blink::StorageKey storage_key = - blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); - auto bucket_locator = storage::BucketLocator(); - bucket_locator.storage_key = storage_key; - - auto callbacks = std::make_unique<MockIndexedDBFactoryClient>(); - auto db_callbacks = base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); - - const int64_t transaction_id = 1; - auto connection = std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*callbacks), db_callbacks, - transaction_id, IndexedDBDatabaseMetadata::DEFAULT_VERSION, - base::DoNothing()); - factory()->Open(u"db", std::move(connection), ToBucketInfo(bucket_locator), - context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - RunPostedTasks(); - - // Now simulate shutdown, which should clear all factories. - factory()->ContextDestroyed(); - EXPECT_TRUE(db_callbacks->forced_close_called()); -} - -TEST_F(IndexedDBFactoryTest, ContextDestructionClosesHandles) { - SetUpContext(); - const blink::StorageKey storage_key = - blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); - auto bucket_locator = storage::BucketLocator(); - bucket_locator.storage_key = storage_key; - IndexedDBBucketContextHandle bucket_context_handle; - leveldb::Status s; - - std::tie(bucket_context_handle, s, std::ignore, std::ignore, std::ignore) = - factory()->GetOrCreateBucketContext( - ToBucketInfo(bucket_locator), context()->GetDataPath(bucket_locator), - /*create_if_missing=*/true); - EXPECT_TRUE(bucket_context_handle.IsHeld()) << s.ToString(); - - // Now simulate shutdown, which should clear all factories. - factory()->ContextDestroyed(); - EXPECT_FALSE(StorageBucketFromHandle(bucket_context_handle)); - EXPECT_FALSE(factory()->GetBucketContext(bucket_locator.id)); -} - TEST_F(IndexedDBFactoryTest, FactoryForceClose) { SetUpContext(); const blink::StorageKey storage_key = @@ -789,200 +720,82 @@ EXPECT_FALSE(factory()->GetBucketContext(bucket_locator.id)); } -TEST_F(IndexedDBFactoryTest, ConnectionForceClose) { +// Tests that the backing store is closed when the connection is closed during +// upgrade. +TEST_F(IndexedDBFactoryTest, ConnectionCloseDuringUpgrade) { SetUpContext(); + const blink::StorageKey storage_key = blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); auto bucket_locator = storage::BucketLocator(); bucket_locator.storage_key = storage_key; - auto callbacks = std::make_unique<MockIndexedDBFactoryClient>(); - auto db_callbacks = base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); + // Bind the IDBFactory. + mojo::Remote<blink::mojom::IDBFactory> factory_remote; + mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> + checker_remote; + BindIndexedDBFactory(std::move(checker_remote), + factory_remote.BindNewPipeAndPassReceiver(), + ToBucketInfo(bucket_locator)); - const int64_t transaction_id = 1; - auto connection = std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*callbacks), db_callbacks, - transaction_id, IndexedDBDatabaseMetadata::DEFAULT_VERSION, - base::DoNothing()); - factory()->Open(u"db", std::move(connection), ToBucketInfo(bucket_locator), - context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - EXPECT_FALSE(callbacks->connection()); - RunPostedTasks(); - EXPECT_TRUE(callbacks->connection()); + // Now create a database and thus the backing store. + MockMojoIndexedDBFactoryClient client; + MockMojoIndexedDBDatabaseCallbacks database_callbacks; + base::RunLoop run_loop; + mojo::PendingAssociatedRemote<blink::mojom::IDBDatabase> pending_database; + EXPECT_CALL(client, MockedUpgradeNeeded) + .WillOnce( + testing::DoAll(MoveArgPointee<0>(&pending_database), + ::base::test::RunClosure(run_loop.QuitClosure()))); + mojo::AssociatedRemote<blink::mojom::IDBTransaction> transaction_remote; + factory_remote->Open(client.CreateInterfacePtrAndBind(), + database_callbacks.CreateInterfacePtrAndBind(), u"db", + /*version=*/1, + transaction_remote.BindNewEndpointAndPassReceiver(), + /*transaction_id=*/1); + run_loop.Run(); EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)); EXPECT_FALSE(factory()->GetBucketContext(bucket_locator.id)->IsClosing()); - callbacks->connection()->CloseAndReportForceClose(); - - EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)); - EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)->IsClosing()); - - EXPECT_TRUE(db_callbacks->forced_close_called()); -} - -TEST_F(IndexedDBFactoryTest, DatabaseForceCloseDuringUpgrade) { - SetUpContext(); - const blink::StorageKey storage_key = - blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); - auto bucket_locator = storage::BucketLocator(); - bucket_locator.storage_key = storage_key; - - auto db_callbacks = base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); - - const int64_t transaction_id = 1; - mock_factory_client_ = std::make_unique<MockIndexedDBFactoryClient>(); - auto connection = std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*mock_factory_client_), db_callbacks, - transaction_id, IndexedDBDatabaseMetadata::NO_VERSION, base::DoNothing()); - - // Do the first half of the upgrade, and request the upgrade from renderer. - { - base::RunLoop loop; - mock_factory_client_->CallOnUpgradeNeeded( - base::BindLambdaForTesting([&]() { loop.Quit(); })); - factory()->Open(u"db", std::move(connection), ToBucketInfo(bucket_locator), - context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - loop.Run(); - } - - EXPECT_TRUE(mock_factory_client_->upgrade_called()); - ASSERT_TRUE(mock_factory_client_->connection()); - ASSERT_TRUE(mock_factory_client_->connection()->database()); - - mock_factory_client_->connection()->database()->ForceCloseAndRunTasks(); - - EXPECT_TRUE(db_callbacks->forced_close_called()); - // Since there are no more references the factory should be closing. - EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)); - EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)->IsClosing()); -} - -TEST_F(IndexedDBFactoryTest, ConnectionCloseDuringUpgrade) { - SetUpContext(); - const blink::StorageKey storage_key = - blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); - auto bucket_locator = storage::BucketLocator(); - bucket_locator.storage_key = storage_key; - - auto db_callbacks = base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); - - const int64_t transaction_id = 1; - mock_factory_client_ = std::make_unique<MockIndexedDBFactoryClient>(); - auto connection = std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*mock_factory_client_), db_callbacks, - transaction_id, IndexedDBDatabaseMetadata::NO_VERSION, base::DoNothing()); - - // Do the first half of the upgrade, and request the upgrade from renderer. - { - base::RunLoop loop; - mock_factory_client_->CallOnUpgradeNeeded( - base::BindLambdaForTesting([&]() { loop.Quit(); })); - factory()->Open(u"db", std::move(connection), ToBucketInfo(bucket_locator), - context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - loop.Run(); - } - - EXPECT_TRUE(mock_factory_client_->upgrade_called()); - ASSERT_TRUE(mock_factory_client_->connection()); - - // Close the connection. - mock_factory_client_->connection()->AbortTransactionsAndClose( - IndexedDBConnection::CloseErrorHandling::kAbortAllReturnLastError); - - // Since there are no more references the factory should be closing. - EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)); - EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)->IsClosing()); -} - -TEST_F(IndexedDBFactoryTest, DatabaseForceCloseWithFullConnection) { - SetUpContext(); - const blink::StorageKey storage_key = - blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); - auto bucket_locator = storage::BucketLocator(); - bucket_locator.storage_key = storage_key; - - std::unique_ptr<IndexedDBConnection> connection; - scoped_refptr<MockIndexedDBDatabaseCallbacks> db_callbacks; - std::tie(connection, db_callbacks) = - CreateConnectionForDatabase(bucket_locator, u"db"); - - // Force close the database. - connection->database()->ForceCloseAndRunTasks(); - - EXPECT_TRUE(db_callbacks->forced_close_called()); - // Since there are no more references the factory should be closing. - EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)); + // Drop the connection. + pending_database.reset(); + factory_remote.FlushForTesting(); EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)->IsClosing()); } TEST_F(IndexedDBFactoryTest, DeleteDatabase) { SetUpContext(); - - auto callbacks = std::make_unique<MockIndexedDBFactoryClient>( - /*expect_connection=*/false); - const blink::StorageKey storage_key = blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); auto bucket_locator = storage::BucketLocator(); bucket_locator.storage_key = storage_key; - factory()->DeleteDatabase(u"db", std::move(callbacks), - ToBucketInfo(bucket_locator), - context()->GetDataPath(bucket_locator), - /*force_close=*/false); + // Bind the IDBFactory. + mojo::Remote<blink::mojom::IDBFactory> factory_remote; + mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> + checker_remote; + BindIndexedDBFactory(std::move(checker_remote), + factory_remote.BindNewPipeAndPassReceiver(), + ToBucketInfo(bucket_locator)); + + // Delete db. + MockMojoIndexedDBFactoryClient client; + MockMojoIndexedDBDatabaseCallbacks database_callbacks; + base::RunLoop run_loop; + EXPECT_CALL(client, DeleteSuccess) + .WillOnce( + testing::DoAll(::base::test::RunClosure(run_loop.QuitClosure()))); + mojo::AssociatedRemote<blink::mojom::IDBTransaction> transaction_remote; + factory_remote->DeleteDatabase(client.CreateInterfacePtrAndBind(), u"db", + /*force_close=*/false); + run_loop.Run(); // Since there are no more references the factory should be closing. EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)); EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)->IsClosing()); } -TEST_F(IndexedDBFactoryTest, DeleteDatabaseWithForceClose) { - SetUpContext(); - - const blink::StorageKey storage_key = - blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); - auto bucket_info = storage::BucketInfo(); - bucket_info.storage_key = storage_key; - bucket_info.name = storage::kDefaultBucketName; - auto bucket_locator = bucket_info.ToBucketLocator(); - const std::u16string name = u"db"; - - std::unique_ptr<IndexedDBConnection> connection; - scoped_refptr<MockIndexedDBDatabaseCallbacks> db_callbacks; - std::tie(connection, db_callbacks) = - CreateConnectionForDatabase(bucket_locator, name); - - base::RunLoop run_loop; - factory()->CallOnDatabaseDeletedForTesting(base::BindLambdaForTesting( - [&bucket_locator, - &run_loop](const storage::BucketLocator& deleted_bucket_locator) { - if (deleted_bucket_locator == bucket_locator) - run_loop.Quit(); - })); - - auto callbacks = std::make_unique<MockIndexedDBFactoryClient>( - /*expect_connection=*/false); - - factory()->DeleteDatabase(name, std::move(callbacks), bucket_info, - context()->GetDataPath(bucket_locator), - /*force_close=*/true); - - // Force close means the connection has been force closed, but the factory - // isn't force closed, and instead is going through it's shutdown sequence. - EXPECT_FALSE(connection->IsConnected()); - EXPECT_TRUE(db_callbacks->forced_close_called()); - EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)); - EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)->IsClosing()); - - // Wait until the DB is deleted before tearing down since these concurrent - // operations may conflict. - run_loop.Run(); -} - TEST_F(IndexedDBFactoryTest, GetDatabaseNames_NoFactory) { SetUpContext(); @@ -991,70 +804,56 @@ auto bucket_locator = storage::BucketLocator(); bucket_locator.storage_key = storage_key; - base::test::TestFuture<std::vector<blink::mojom::IDBNameAndVersionPtr>, - blink::mojom::IDBErrorPtr> - info_future; - factory()->GetDatabaseInfo(ToBucketInfo(bucket_locator), - context()->GetDataPath(bucket_locator), - info_future.GetCallback()); - ASSERT_TRUE(info_future.Wait()); + // Bind the IDBFactory. + mojo::Remote<blink::mojom::IDBFactory> factory_remote; + mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> + checker_remote; + BindIndexedDBFactory(std::move(checker_remote), + factory_remote.BindNewPipeAndPassReceiver(), + ToBucketInfo(bucket_locator)); - // Don't create a factory if one doesn't exist. - EXPECT_FALSE(factory()->GetBucketContext(bucket_locator.id)); -} + // Don't create a backing store if one doesn't exist. + { + base::test::TestFuture<std::vector<blink::mojom::IDBNameAndVersionPtr>, + blink::mojom::IDBErrorPtr> + info_future; + factory_remote->GetDatabaseInfo(info_future.GetCallback()); + ASSERT_TRUE(info_future.Wait()); + EXPECT_FALSE(factory()->GetBucketContext(bucket_locator.id)); + } -TEST_F(IndexedDBFactoryTest, GetDatabaseNames_ExistingFactory) { - SetUpContext(); + // Now create a database and thus the backing store. + MockMojoIndexedDBFactoryClient client; + MockMojoIndexedDBDatabaseCallbacks database_callbacks; + base::RunLoop run_loop; + // It's necessary to hang onto the database connection or the connection + // will shut itself down and the backing store will close on its own. + mojo::PendingAssociatedRemote<blink::mojom::IDBDatabase> pending_database; + EXPECT_CALL(client, MockedOpenSuccess) + .WillOnce( + testing::DoAll(MoveArgPointee<0>(&pending_database), + ::base::test::RunClosure(run_loop.QuitClosure()))); + mojo::AssociatedRemote<blink::mojom::IDBTransaction> transaction_remote; + factory_remote->Open(client.CreateInterfacePtrAndBind(), + database_callbacks.CreateInterfacePtrAndBind(), u"db", + /*version=*/0, + transaction_remote.BindNewEndpointAndPassReceiver(), + /*transaction_id=*/1); + run_loop.Run(); - const blink::StorageKey storage_key = - blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); - auto bucket_locator = storage::BucketLocator(); - bucket_locator.storage_key = storage_key; - IndexedDBBucketContextHandle bucket_context_handle; - leveldb::Status s; - - std::tie(bucket_context_handle, s, std::ignore, std::ignore, std::ignore) = - factory()->GetOrCreateBucketContext( - ToBucketInfo(bucket_locator), context()->GetDataPath(bucket_locator), - /*create_if_missing=*/true); - EXPECT_TRUE(bucket_context_handle.IsHeld()) << s.ToString(); - - base::test::TestFuture<std::vector<blink::mojom::IDBNameAndVersionPtr>, - blink::mojom::IDBErrorPtr> - info_future; - factory()->GetDatabaseInfo(ToBucketInfo(bucket_locator), - context()->GetDataPath(bucket_locator), - info_future.GetCallback()); - ASSERT_TRUE(info_future.Wait()); - - EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)); // GetDatabaseInfo didn't create the factory, so it shouldn't close it. - EXPECT_FALSE(factory()->GetBucketContext(bucket_locator.id)->IsClosing()); + { + base::test::TestFuture<std::vector<blink::mojom::IDBNameAndVersionPtr>, + blink::mojom::IDBErrorPtr> + info_future; + factory_remote->GetDatabaseInfo(info_future.GetCallback()); + ASSERT_TRUE(info_future.Wait()); + + EXPECT_TRUE(factory()->GetBucketContext(bucket_locator.id)); + EXPECT_FALSE(factory()->GetBucketContext(bucket_locator.id)->IsClosing()); + } } -class LookingForQuotaErrorMockFactoryClient : public IndexedDBFactoryClient { - public: - LookingForQuotaErrorMockFactoryClient() - : IndexedDBFactoryClient(mojo::NullAssociatedRemote(), - base::SequencedTaskRunner::GetCurrentDefault()) { - } - ~LookingForQuotaErrorMockFactoryClient() override = default; - - LookingForQuotaErrorMockFactoryClient( - const LookingForQuotaErrorMockFactoryClient&) = delete; - LookingForQuotaErrorMockFactoryClient& operator=( - const LookingForQuotaErrorMockFactoryClient&) = delete; - - void OnError(const IndexedDBDatabaseError& error) override { - error_called_ = true; - EXPECT_EQ(blink::mojom::IDBException::kQuotaError, error.code()); - } - bool error_called() const { return error_called_; } - - private: - bool error_called_ = false; -}; - TEST_F(IndexedDBFactoryTest, QuotaErrorOnDiskFull) { FakeLevelDBFactory fake_ldb_factory({}, "indexed-db"); fake_ldb_factory.EnqueueNextOpenLevelDBStateResult( @@ -1062,26 +861,32 @@ SetUpContextWithFactories(&fake_ldb_factory, base::DefaultClock::GetInstance()); - auto factory_client = - std::make_unique<LookingForQuotaErrorMockFactoryClient>(); - auto dummy_database_callbacks = - base::MakeRefCounted<IndexedDBDatabaseCallbacks>( - nullptr, mojo::NullAssociatedRemote(), - context()->IDBTaskRunner().get()); + // Bind the IDBFactory. const blink::StorageKey storage_key = blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); auto bucket_locator = storage::BucketLocator(); bucket_locator.storage_key = storage_key; - const std::u16string name(u"name"); - auto connection = std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*factory_client), - dummy_database_callbacks, - /*transaction_id=*/1, /*version=*/1, base::DoNothing()); - factory()->Open(name, std::move(connection), ToBucketInfo(bucket_locator), - context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - EXPECT_TRUE(factory_client->error_called()); - base::RunLoop().RunUntilIdle(); + mojo::Remote<blink::mojom::IDBFactory> factory_remote; + mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> + checker_remote; + BindIndexedDBFactory(std::move(checker_remote), + factory_remote.BindNewPipeAndPassReceiver(), + ToBucketInfo(bucket_locator)); + + // Expect an error when opening. + MockMojoIndexedDBFactoryClient client; + MockMojoIndexedDBDatabaseCallbacks database_callbacks; + base::RunLoop run_loop; + EXPECT_CALL(client, Error) + .WillOnce( + testing::DoAll(::base::test::RunClosure(run_loop.QuitClosure()))); + mojo::AssociatedRemote<blink::mojom::IDBTransaction> transaction_remote; + factory_remote->Open(client.CreateInterfacePtrAndBind(), + database_callbacks.CreateInterfacePtrAndBind(), u"db", + /*version=*/1, + transaction_remote.BindNewEndpointAndPassReceiver(), + /*transaction_id=*/1); + run_loop.Run(); ASSERT_EQ(1U, quota_manager()->write_error_tracker().size()); EXPECT_EQ(storage_key, quota_manager()->write_error_tracker().begin()->first); @@ -1110,23 +915,6 @@ EXPECT_EQ(1, quota_manager()->write_error_tracker().begin()->second); } -class ErrorCallbacks : public MockIndexedDBFactoryClient { - public: - ErrorCallbacks() : MockIndexedDBFactoryClient(false) {} - ~ErrorCallbacks() override = default; - - ErrorCallbacks(const ErrorCallbacks&) = delete; - ErrorCallbacks& operator=(const ErrorCallbacks&) = delete; - - void OnError(const IndexedDBDatabaseError& error) override { - saw_error_ = true; - } - bool saw_error() const { return saw_error_; } - - private: - bool saw_error_ = false; -}; - TEST_F(IndexedDBFactoryTest, DatabaseFailedOpen) { SetUpContext(); const blink::StorageKey storage_key = @@ -1134,166 +922,123 @@ auto bucket_locator = storage::BucketLocator(); bucket_locator.storage_key = storage_key; const std::u16string db_name(u"db"); - const int64_t transaction_id = 1; - auto db_callbacks = base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); - auto failed_open_callbacks = std::make_unique<ErrorCallbacks>(); - auto db_callbacks2 = base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); + // Bind the IDBFactory. + mojo::Remote<blink::mojom::IDBFactory> factory_remote; + mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> + checker_remote; + BindIndexedDBFactory(std::move(checker_remote), + factory_remote.BindNewPipeAndPassReceiver(), + ToBucketInfo(bucket_locator)); // Open at version 2. { const int64_t db_version = 2; - - mock_factory_client_ = std::make_unique<MockIndexedDBFactoryClient>(); - auto connection = std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*mock_factory_client_), - db_callbacks, transaction_id, db_version, base::DoNothing()); - { - base::RunLoop loop; - mock_factory_client_->CallOnUpgradeNeeded( - base::BindLambdaForTesting([&]() { loop.Quit(); })); - factory()->Open(db_name, std::move(connection), - ToBucketInfo(bucket_locator), - context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - loop.Run(); - } - EXPECT_TRUE(mock_factory_client_->upgrade_called()); - EXPECT_TRUE(factory()->IsDatabaseOpen(bucket_locator, db_name)); - } - - // Finish connecting, then close the connection. - { - base::RunLoop loop; - mock_factory_client_->CallOnDBSuccess( - base::BindLambdaForTesting([&]() { loop.Quit(); })); - EXPECT_TRUE(mock_factory_client_->connection()); - mock_factory_client_->connection() - ->GetTransaction(transaction_id) - ->SetCommitFlag(); - loop.Run(); - mock_factory_client_->connection()->AbortTransactionsAndClose( - IndexedDBConnection::CloseErrorHandling::kAbortAllReturnLastError); - RunPostedTasks(); - EXPECT_FALSE(factory()->IsDatabaseOpen(bucket_locator, db_name)); + MockMojoIndexedDBFactoryClient client; + MockMojoIndexedDBDatabaseCallbacks database_callbacks; + base::RunLoop run_loop; + EXPECT_CALL(client, MockedUpgradeNeeded) + .WillOnce( + testing::DoAll(::base::test::RunClosure(run_loop.QuitClosure()))); + mojo::AssociatedRemote<blink::mojom::IDBTransaction> transaction_remote; + factory_remote->Open(client.CreateInterfacePtrAndBind(), + database_callbacks.CreateInterfacePtrAndBind(), + db_name, db_version, + transaction_remote.BindNewEndpointAndPassReceiver(), + /*transaction_id=*/1); + run_loop.Run(); } // Open at version < 2, which will fail. { const int64_t db_version = 1; - auto connection = std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*failed_open_callbacks), - db_callbacks2, transaction_id, db_version, base::DoNothing()); - factory()->Open( - db_name, std::move(connection), ToBucketInfo(bucket_locator), - context()->GetDataPath(bucket_locator), CreateTestClientStateWrapper()); - EXPECT_TRUE(factory()->IsDatabaseOpen(bucket_locator, db_name)); - RunPostedTasks(); - EXPECT_TRUE(failed_open_callbacks->saw_error()); + base::RunLoop run_loop; + MockMojoIndexedDBFactoryClient client; + MockMojoIndexedDBDatabaseCallbacks database_callbacks; + EXPECT_CALL(client, Error) + .WillOnce(::base::test::RunClosure(run_loop.QuitClosure())); + mojo::AssociatedRemote<blink::mojom::IDBTransaction> transaction_remote; + factory_remote->Open(client.CreateInterfacePtrAndBind(), + database_callbacks.CreateInterfacePtrAndBind(), + db_name, db_version, + transaction_remote.BindNewEndpointAndPassReceiver(), + /*transaction_id=*/2); + run_loop.Run(); EXPECT_FALSE(factory()->IsDatabaseOpen(bucket_locator, db_name)); } } -namespace { - -class DataLossCallbacks final : public MockIndexedDBFactoryClient { - public: - ~DataLossCallbacks() final = default; - - blink::mojom::IDBDataLoss data_loss() const { return data_loss_; } - - void OnError(const IndexedDBDatabaseError& error) final { - ADD_FAILURE() << "Unexpected IDB error: " << error.message(); - } - void OnUpgradeNeeded(int64_t old_version, - std::unique_ptr<IndexedDBConnection> connection, - const IndexedDBDatabaseMetadata& metadata, - const IndexedDBDataLossInfo& data_loss) final { - data_loss_ = data_loss.status; - MockIndexedDBFactoryClient::OnUpgradeNeeded( - old_version, std::move(connection), metadata, data_loss); - } - - private: - blink::mojom::IDBDataLoss data_loss_ = blink::mojom::IDBDataLoss::None; -}; - -TEST_F(IndexedDBFactoryTest, DataFormatVersion) { +// Test for `IndexedDBDataFormatVersion`. +TEST_F(IndexedDBFactoryTest, DataLoss) { SetUpContext(); - auto try_open = [this](const storage::BucketLocator& bucket_locator, - const IndexedDBDataFormatVersion& version) { + const blink::StorageKey storage_key = + blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); + auto bucket_locator = storage::BucketLocator(); + bucket_locator.storage_key = storage_key; + const std::u16string db_name(u"test_db"); + + // Bind the IDBFactory. + mojo::Remote<blink::mojom::IDBFactory> factory_remote; + mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> + checker_remote; + BindIndexedDBFactory(std::move(checker_remote), + factory_remote.BindNewPipeAndPassReceiver(), + ToBucketInfo(bucket_locator)); + + // Set a data format version and create a new database. No data loss. + { base::AutoReset<IndexedDBDataFormatVersion> override_version( - &IndexedDBDataFormatVersion::GetMutableCurrentForTesting(), version); + &IndexedDBDataFormatVersion::GetMutableCurrentForTesting(), + IndexedDBDataFormatVersion(3, 4)); + MockMojoIndexedDBFactoryClient client; + MockMojoIndexedDBDatabaseCallbacks database_callbacks; + base::RunLoop run_loop; + EXPECT_CALL(client, MockedUpgradeNeeded( + _, _, blink::mojom::IDBDataLoss::None, _, _)) + .WillOnce( + testing::DoAll(::base::test::RunClosure(run_loop.QuitClosure()))); + mojo::AssociatedRemote<blink::mojom::IDBTransaction> transaction_remote; + factory_remote->Open(client.CreateInterfacePtrAndBind(), + database_callbacks.CreateInterfacePtrAndBind(), + db_name, /*version=*/1, + transaction_remote.BindNewEndpointAndPassReceiver(), + /*transaction_id=*/1); + run_loop.Run(); - const int64_t transaction_id = 1; - auto callbacks = std::make_unique<DataLossCallbacks>(); - auto db_callbacks = base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); - auto pending_connection = std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*callbacks), db_callbacks, - transaction_id, - /*version=*/1, base::DoNothing()); + // This step is necessary to make sure the backing store is closed so that + // the second `Open` will initialize it with the new (older) data format + // version. Without this step, the same `IndexedDBBackingStore` is reused + // because it's kept around for 2 seconds after the last connection is + // dropped. + base::RunLoop run_loop2; + context_->ForceClose( + bucket_locator.id, + storage::mojom::ForceCloseReason::FORCE_CLOSE_BACKING_STORE_FAILURE, + run_loop2.QuitClosure()); + run_loop2.Run(); + } - { - base::RunLoop loop; - bool upgraded = false; - // The database might already exist. Wait until either a success or an - // ugprade request. - callbacks->CallOnUpgradeNeeded(base::BindLambdaForTesting([&]() { - upgraded = true; - loop.Quit(); - })); - callbacks->CallOnDBSuccess( - base::BindLambdaForTesting([&]() { loop.Quit(); })); - - this->factory()->Open(u"test_db", std::move(pending_connection), - ToBucketInfo(bucket_locator), - context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - loop.Run(); - - // If an upgrade was requested, then commit the upgrade transaction. - if (upgraded) { - EXPECT_TRUE(callbacks->upgrade_called()); - EXPECT_TRUE(callbacks->connection()); - EXPECT_TRUE(callbacks->connection()->database()); - // Finish the upgrade by committing the transaction. - auto* connection = callbacks->connection(); - { - base::RunLoop inner_loop; - callbacks->CallOnDBSuccess( - base::BindLambdaForTesting([&]() { inner_loop.Quit(); })); - connection->GetTransaction(transaction_id)->SetCommitFlag(); - inner_loop.Run(); - } - } - } - RunPostedTasks(); - factory()->ForceClose(bucket_locator.id, false); - RunPostedTasks(); - return callbacks->data_loss(); - }; - - static const struct { - const char* origin; - IndexedDBDataFormatVersion open_version_1; - IndexedDBDataFormatVersion open_version_2; - blink::mojom::IDBDataLoss expected_data_loss; - } kTestCases[] = {{"http://blink-downgrade.com/", - {3, 4}, - {3, 3}, - blink::mojom::IDBDataLoss::Total}}; - for (const auto& test : kTestCases) { - SCOPED_TRACE(test.origin); - const blink::StorageKey storage_key = - blink::StorageKey::CreateFromStringForTesting(test.origin); - auto bucket_locator = storage::BucketLocator(); - bucket_locator.storage_key = storage_key; - ASSERT_EQ(blink::mojom::IDBDataLoss::None, - try_open(bucket_locator, test.open_version_1)); - EXPECT_EQ(test.expected_data_loss, - try_open(bucket_locator, test.open_version_2)); + // Set an older data format version and try to reopen said database. Expect + // total data loss. + { + base::AutoReset<IndexedDBDataFormatVersion> override_version( + &IndexedDBDataFormatVersion::GetMutableCurrentForTesting(), + IndexedDBDataFormatVersion(3, 3)); + base::RunLoop run_loop; + MockMojoIndexedDBFactoryClient client; + MockMojoIndexedDBDatabaseCallbacks database_callbacks; + EXPECT_CALL(client, MockedUpgradeNeeded( + _, _, blink::mojom::IDBDataLoss::Total, _, _)) + .WillOnce( + testing::DoAll(::base::test::RunClosure(run_loop.QuitClosure()))); + mojo::AssociatedRemote<blink::mojom::IDBTransaction> transaction_remote; + factory_remote->Open(client.CreateInterfacePtrAndBind(), + database_callbacks.CreateInterfacePtrAndBind(), + db_name, /*version=*/1, + transaction_remote.BindNewEndpointAndPassReceiver(), + /*transaction_id=*/2); + run_loop.Run(); } } -} // namespace } // namespace content
diff --git a/content/browser/indexed_db/indexed_db_unittest.cc b/content/browser/indexed_db/indexed_db_unittest.cc index 798809c..88a23ec 100644 --- a/content/browser/indexed_db/indexed_db_unittest.cc +++ b/content/browser/indexed_db/indexed_db_unittest.cc
@@ -15,6 +15,7 @@ #include "base/task/sequenced_task_runner.h" #include "base/task/single_thread_task_runner.h" #include "base/test/bind.h" +#include "base/test/gmock_callback_support.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/test/test_future.h" @@ -32,6 +33,7 @@ #include "content/browser/indexed_db/indexed_db_leveldb_coding.h" #include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h" #include "content/browser/indexed_db/mock_indexed_db_factory_client.h" +#include "content/browser/indexed_db/mock_mojo_indexed_db_database_callbacks.h" #include "content/browser/indexed_db/mock_mojo_indexed_db_factory_client.h" #include "mojo/public/cpp/bindings/pending_associated_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -50,6 +52,12 @@ namespace content { namespace { +ACTION_TEMPLATE(MoveArgPointee, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_1_VALUE_PARAMS(out)) { + *out = std::move(*::testing::get<k>(args)); +} + base::FilePath CreateAndReturnTempDir(base::ScopedTempDir* temp_dir) { CHECK(temp_dir->CreateUniqueTempDir()); return temp_dir->GetPath(); @@ -87,8 +95,12 @@ } // namespace -class IndexedDBTest : public testing::Test, - public testing::WithParamInterface<bool> { +class IndexedDBTest + : public testing::Test, + // The first boolean toggles the Storage Partitioning feature. The second + // boolean controls the type of StorageKey to run the test on (first or + // third party). + public testing::WithParamInterface<std::tuple<bool, bool>> { public: blink::StorageKey kNormalFirstPartyStorageKey; storage::BucketLocator kNormalFirstPartyBucketLocator; @@ -246,6 +258,9 @@ } } + // Wait for mojo pipes to flush or there may be leaks. + task_environment_.RunUntilIdle(); + if (temp_dir_.IsValid()) ASSERT_TRUE(temp_dir_.Delete()); } @@ -257,7 +272,9 @@ return path_future.Take(); } - bool IsThirdPartyStoragePartitioningEnabled() { return GetParam(); } + bool IsThirdPartyStoragePartitioningEnabled() { + return std::get<0>(GetParam()); + } scoped_refptr<IndexedDBClientStateCheckerWrapper> CreateTestClientStateWrapper() { @@ -273,6 +290,71 @@ return success.Get(); } + void BindIndexedDBFactory( + mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> + checker_remote, + mojo::PendingReceiver<blink::mojom::IDBFactory> receiver, + storage::QuotaErrorOr<storage::BucketInfo> bucket_info) { + context()->BindIndexedDBImpl(std::move(checker_remote), std::move(receiver), + bucket_info); + } + + blink::StorageKey GetTestStorageKey() { + const bool first_party = std::get<1>(GetParam()); + return first_party + ? blink::StorageKey::CreateFromStringForTesting("http://test/") + : blink::StorageKey::Create( + url::Origin::Create(GURL("http://test/")), + net::SchemefulSite(GURL("http://rando/")), + blink::mojom::AncestorChainBit::kCrossSite); + } + + // Opens a database connection, runs `action`, and verifies that the + // connection was forced closed. + void VerifyForcedClosedCalled(base::OnceClosure action, + storage::BucketInfo* out_info = nullptr) { + storage::BucketInfo bucket_info = InitBucket(GetTestStorageKey()); + if (out_info) { + *out_info = bucket_info; + } + storage::BucketLocator bucket_locator = bucket_info.ToBucketLocator(); + base::FilePath test_path = GetFilePathForTesting(bucket_locator); + + // Bind the IDBFactory. + mojo::PendingAssociatedRemote<storage::mojom::IndexedDBClientStateChecker> + checker_remote; + BindIndexedDBFactory(std::move(checker_remote), + factory_remote_.BindNewPipeAndPassReceiver(), + bucket_info); + + // Open new connection/database, wait for success. + MockMojoIndexedDBFactoryClient client; + MockMojoIndexedDBDatabaseCallbacks database_callbacks; + base::RunLoop run_loop; + // It's necessary to hang onto the database connection or the connection + // will shut itself down and there will be no `ForcedClosed()`. + mojo::PendingAssociatedRemote<blink::mojom::IDBDatabase> pending_database; + EXPECT_CALL(client, MockedOpenSuccess) + .WillOnce( + testing::DoAll(MoveArgPointee<0>(&pending_database), + ::base::test::RunClosure(run_loop.QuitClosure()))); + mojo::AssociatedRemote<blink::mojom::IDBTransaction> transaction_remote; + factory_remote_->Open(client.CreateInterfacePtrAndBind(), + database_callbacks.CreateInterfacePtrAndBind(), + u"opendb", /*version=*/0, + transaction_remote.BindNewEndpointAndPassReceiver(), + /*host_transaction_id=*/0); + run_loop.Run(); + EXPECT_TRUE(base::DirectoryExists(test_path)); + + // Expect that deleting the data force closes the open database connection. + base::RunLoop run_loop2; + EXPECT_CALL(database_callbacks, ForcedClose()) + .WillOnce(::base::test::RunClosure(run_loop2.QuitClosure())); + std::move(action).Run(); + run_loop2.Run(); + } + protected: IndexedDBContextImpl* context() const { return context_.get(); } base::test::ScopedFeatureList scoped_feature_list_; @@ -283,12 +365,15 @@ scoped_refptr<storage::MockQuotaManager> quota_manager_; scoped_refptr<storage::MockQuotaManagerProxy> quota_manager_proxy_; scoped_refptr<IndexedDBContextImpl> context_; + mojo::Remote<blink::mojom::IDBFactory> factory_remote_; }; INSTANTIATE_TEST_SUITE_P( /* no prefix */, IndexedDBTest, - testing::Bool()); + // See class comment for meaning of params. Tests in this suite don't use + // the second param. + testing::Combine(testing::Bool(), testing::Values(true))); TEST_P(IndexedDBTest, ClearSessionOnlyDatabases) { base::FilePath normal_path_first_party; @@ -422,150 +507,80 @@ EXPECT_TRUE(base::DirectoryExists(session_only_path_third_party)); } -class ForceCloseFactoryClient : public IndexedDBFactoryClient { - public: - ForceCloseFactoryClient(scoped_refptr<IndexedDBContextImpl> idb_context, - const storage::BucketInfo& bucket_info) - : IndexedDBFactoryClient(mojo::NullAssociatedRemote(), - idb_context->IDBTaskRunner()), - idb_context_(idb_context), - bucket_locator_(bucket_info.ToBucketLocator()) {} - ~ForceCloseFactoryClient() override = default; +// Tests that parameterize whether they act on first or third party storage key +// buckets. +using IndexedDBTestFirstOrThirdParty = IndexedDBTest; - ForceCloseFactoryClient(const ForceCloseFactoryClient&) = delete; - ForceCloseFactoryClient& operator=(const ForceCloseFactoryClient&) = delete; +INSTANTIATE_TEST_SUITE_P( + /* no prefix */, + IndexedDBTestFirstOrThirdParty, + // See base class comment for meaning of params. Tests in this suite operate + // against both first and third party storage keys. + testing::Combine(testing::Bool(), testing::Bool())); - void OnOpenSuccess(std::unique_ptr<IndexedDBConnection> connection, - const IndexedDBDatabaseMetadata& metadata) override { - connection_ = std::move(connection); - } - - IndexedDBConnection* connection() { return connection_.get(); } - - private: - scoped_refptr<IndexedDBContextImpl> idb_context_; - storage::BucketLocator bucket_locator_; - std::unique_ptr<IndexedDBConnection> connection_; -}; - -TEST_P(IndexedDBTest, ForceCloseOpenDatabasesOnDeleteFirstParty) { - const blink::StorageKey kTestStorageKey = - blink::StorageKey::CreateFromStringForTesting("http://test/"); - storage::BucketInfo bucket_info = InitBucket(kTestStorageKey); - storage::BucketLocator bucket_locator = bucket_info.ToBucketLocator(); - - auto open_db_callbacks = - base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); - auto closed_db_callbacks = - base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); - auto open_db_factory_client = - std::make_unique<ForceCloseFactoryClient>(context(), bucket_info); - auto closed_db_factory_client = - std::make_unique<ForceCloseFactoryClient>(context(), bucket_info); - base::FilePath test_path = GetFilePathForTesting(bucket_locator); - - const int64_t host_transaction_id = 0; - const int64_t version = 0; - - IndexedDBFactory* factory = context()->GetIDBFactory(); - - factory->Open( - u"opendb", - std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*open_db_factory_client), - open_db_callbacks, host_transaction_id, version, base::DoNothing()), - bucket_info, context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - EXPECT_TRUE(base::DirectoryExists(test_path)); - - factory->Open( - u"closeddb", - std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*closed_db_factory_client), - closed_db_callbacks, host_transaction_id, version, base::DoNothing()), - bucket_info, context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - RunPostedTasks(); - ASSERT_TRUE(closed_db_factory_client->connection()); - closed_db_factory_client->connection()->AbortTransactionsAndClose( - IndexedDBConnection::CloseErrorHandling::kAbortAllReturnLastError); - RunPostedTasks(); - - context()->ForceClose( - bucket_locator.id, - storage::mojom::ForceCloseReason::FORCE_CLOSE_DELETE_ORIGIN, - base::DoNothing()); - EXPECT_TRUE(open_db_callbacks->forced_close_called()); - EXPECT_FALSE(closed_db_callbacks->forced_close_called()); - - RunPostedTasks(); - - EXPECT_TRUE(DeleteForStorageKeySync(kTestStorageKey)); +// Verifies that the IDB connection is force closed and the directory is deleted +// when the bucket is deleted. +TEST_P(IndexedDBTestFirstOrThirdParty, ForceCloseOpenDatabasesOnDelete) { + storage::BucketInfo bucket_info; + VerifyForcedClosedCalled( + base::BindOnce( + base::IgnoreResult(&IndexedDBTest::DeleteForStorageKeySync), + base::Unretained(this), GetTestStorageKey()), + &bucket_info); + // Additionally, the directory should be deleted. + base::FilePath test_path = + GetFilePathForTesting(bucket_info.ToBucketLocator()); EXPECT_FALSE(base::DirectoryExists(test_path)); } -TEST_P(IndexedDBTest, ForceCloseOpenDatabasesOnDeleteThirdParty) { - const blink::StorageKey kTestStorageKey = - blink::StorageKey::Create(url::Origin::Create(GURL("http://test/")), - net::SchemefulSite(GURL("http://rando/")), - blink::mojom::AncestorChainBit::kCrossSite); - storage::BucketInfo bucket_info = InitBucket(kTestStorageKey); - storage::BucketLocator bucket_locator = bucket_info.ToBucketLocator(); - - auto open_db_callbacks = - base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); - auto closed_db_callbacks = - base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); - auto open_db_factory_client = - std::make_unique<ForceCloseFactoryClient>(context(), bucket_info); - auto closed_db_factory_client = - std::make_unique<ForceCloseFactoryClient>(context(), bucket_info); - base::FilePath test_path = GetFilePathForTesting(bucket_locator); - - const int64_t host_transaction_id = 0; - const int64_t version = 0; - - IndexedDBFactory* factory = context()->GetIDBFactory(); - - factory->Open( - u"opendb", - std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*open_db_factory_client), - open_db_callbacks, host_transaction_id, version, base::DoNothing()), - bucket_info, context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - EXPECT_TRUE(base::DirectoryExists(test_path)); - - factory->Open( - u"closeddb", - std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*closed_db_factory_client), - closed_db_callbacks, host_transaction_id, version, base::DoNothing()), - bucket_info, context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - RunPostedTasks(); - ASSERT_TRUE(closed_db_factory_client->connection()); - closed_db_factory_client->connection()->AbortTransactionsAndClose( - IndexedDBConnection::CloseErrorHandling::kAbortAllReturnLastError); - RunPostedTasks(); - - context()->ForceClose( - bucket_locator.id, - storage::mojom::ForceCloseReason::FORCE_CLOSE_DELETE_ORIGIN, - base::DoNothing()); - EXPECT_TRUE(open_db_callbacks->forced_close_called()); - EXPECT_FALSE(closed_db_callbacks->forced_close_called()); - - RunPostedTasks(); - - EXPECT_TRUE(DeleteForStorageKeySync(kTestStorageKey)); - - EXPECT_FALSE(base::DirectoryExists(test_path)); +// Verifies that the IDB connection is force closed when the backing store has +// an error. +TEST_P(IndexedDBTestFirstOrThirdParty, ForceCloseOpenDatabasesOnCommitFailure) { + storage::BucketInfo bucket_info; + VerifyForcedClosedCalled( + base::BindOnce( + [](IndexedDBFactory* factory, storage::BucketInfo* bucket_info) { + factory->HandleBackingStoreFailure(bucket_info->ToBucketLocator()); + }, + context()->GetIDBFactory(), &bucket_info), + &bucket_info); } -TEST_P(IndexedDBTest, DeleteFailsIfDirectoryLockedFirstParty) { - const blink::StorageKey kTestStorageKey = - blink::StorageKey::CreateFromStringForTesting("http://test/"); +// Verifies that the IDB connection is force closed when the database is deleted +// via the mojo API. +TEST_P(IndexedDBTestFirstOrThirdParty, + ForceCloseOpenDatabasesOnDeleteDatabase) { + storage::BucketInfo bucket_info; + VerifyForcedClosedCalled( + base::BindOnce( + [](mojo::Remote<blink::mojom::IDBFactory>* factory_remote) { + MockMojoIndexedDBFactoryClient delete_client; + (*factory_remote) + ->DeleteDatabase(delete_client.CreateInterfacePtrAndBind(), + u"opendb", + /*force_close=*/true); + }, + &this->factory_remote_), + &bucket_info); + base::FilePath test_path = + GetFilePathForTesting(bucket_info.ToBucketLocator()); + EXPECT_TRUE(base::DirectoryExists(test_path)); +} + +// Verifies that the IDB connection is force closed when the context is +// destroyed. +TEST_P(IndexedDBTestFirstOrThirdParty, + ForceCloseOpenDatabasesOnContextDestroyed) { + storage::BucketInfo bucket_info; + VerifyForcedClosedCalled( + base::BindOnce(&IndexedDBFactory::ContextDestroyed, + base::Unretained(context()->GetIDBFactory())), + &bucket_info); + EXPECT_FALSE(context()->GetIDBFactory()->GetBucketContext(bucket_info.id)); +} + +TEST_P(IndexedDBTestFirstOrThirdParty, DeleteFailsIfDirectoryLocked) { + const blink::StorageKey kTestStorageKey = GetTestStorageKey(); storage::BucketInfo bucket_info = InitBucket(kTestStorageKey); storage::BucketLocator bucket_locator = bucket_info.ToBucketLocator(); @@ -586,105 +601,6 @@ EXPECT_TRUE(base::DirectoryExists(test_path)); } -TEST_P(IndexedDBTest, DeleteFailsIfDirectoryLockedThirdParty) { - const blink::StorageKey kTestStorageKey = - blink::StorageKey::Create(url::Origin::Create(GURL("http://test/")), - net::SchemefulSite(GURL("http://rando/")), - blink::mojom::AncestorChainBit::kCrossSite); - storage::BucketInfo bucket_info = InitBucket(kTestStorageKey); - storage::BucketLocator bucket_locator = bucket_info.ToBucketLocator(); - - base::FilePath test_path = GetFilePathForTesting(bucket_locator); - ASSERT_TRUE(base::CreateDirectory(test_path)); - - auto lock = LockForTesting(test_path); - ASSERT_TRUE(lock); - - base::test::TestFuture<bool> success_future; - context()->IDBTaskRunner()->PostTask( - FROM_HERE, base::BindLambdaForTesting([&]() { - context()->DeleteForStorageKey(kTestStorageKey, - success_future.GetCallback()); - })); - EXPECT_FALSE(success_future.Get()); - - EXPECT_TRUE(base::DirectoryExists(test_path)); -} - -TEST_P(IndexedDBTest, ForceCloseOpenDatabasesOnCommitFailureFirstParty) { - const blink::StorageKey kTestStorageKey = - blink::StorageKey::CreateFromStringForTesting("http://test/"); - auto bucket_info = storage::BucketInfo(); - bucket_info.id = storage::BucketId::FromUnsafeValue(5); - bucket_info.storage_key = kTestStorageKey; - bucket_info.name = storage::kDefaultBucketName; - auto bucket_locator = bucket_info.ToBucketLocator(); - - auto* factory = static_cast<IndexedDBFactory*>(context()->GetIDBFactory()); - - const int64_t transaction_id = 1; - - auto callbacks = std::make_unique<MockIndexedDBFactoryClient>(); - auto db_callbacks = base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); - auto connection = std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*callbacks), db_callbacks, - transaction_id, IndexedDBDatabaseMetadata::DEFAULT_VERSION, - base::DoNothing()); - factory->Open(u"db", std::move(connection), bucket_info, - context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - RunPostedTasks(); - - ASSERT_TRUE(callbacks->connection()); - - EXPECT_TRUE(factory->IsBackingStoreOpen(bucket_locator)); - - // Simulate the write failure. - leveldb::Status status = leveldb::Status::IOError("Simulated failure"); - factory->HandleBackingStoreFailure(bucket_locator); - - EXPECT_TRUE(db_callbacks->forced_close_called()); - EXPECT_FALSE(factory->IsBackingStoreOpen(bucket_locator)); -} - -TEST_P(IndexedDBTest, ForceCloseOpenDatabasesOnCommitFailureThirdParty) { - const blink::StorageKey kTestStorageKey = - blink::StorageKey::Create(url::Origin::Create(GURL("http://test/")), - net::SchemefulSite(GURL("http://rando/")), - blink::mojom::AncestorChainBit::kCrossSite); - auto bucket_info = storage::BucketInfo(); - bucket_info.id = storage::BucketId::FromUnsafeValue(5); - bucket_info.storage_key = kTestStorageKey; - bucket_info.name = storage::kDefaultBucketName; - auto bucket_locator = bucket_info.ToBucketLocator(); - - auto* factory = static_cast<IndexedDBFactory*>(context()->GetIDBFactory()); - - const int64_t transaction_id = 1; - - auto callbacks = std::make_unique<MockIndexedDBFactoryClient>(); - auto db_callbacks = base::MakeRefCounted<MockIndexedDBDatabaseCallbacks>(); - auto connection = std::make_unique<IndexedDBPendingConnection>( - std::make_unique<ThunkFactoryClient>(*callbacks), db_callbacks, - transaction_id, IndexedDBDatabaseMetadata::DEFAULT_VERSION, - base::DoNothing()); - factory->Open(u"db", std::move(connection), bucket_info, - context()->GetDataPath(bucket_locator), - CreateTestClientStateWrapper()); - RunPostedTasks(); - - ASSERT_TRUE(callbacks->connection()); - - EXPECT_TRUE(factory->IsBackingStoreOpen(bucket_locator)); - - // Simulate the write failure. - leveldb::Status status = leveldb::Status::IOError("Simulated failure"); - factory->HandleBackingStoreFailure(bucket_locator); - - EXPECT_TRUE(db_callbacks->forced_close_called()); - EXPECT_FALSE(factory->IsBackingStoreOpen(bucket_locator)); -} - TEST(PartitionedLockManager, TestRangeDifferences) { PartitionedLockId lock_id_db1; PartitionedLockId lock_id_db2;
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc index 0d565e9a..7596d679 100644 --- a/content/browser/interest_group/interest_group_browsertest.cc +++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -18297,6 +18297,32 @@ https_server_->GetURL(kTestOrigin, "/echoall?report_bidder"))); } +// Test to make sure that Promises configuration fields that are checked early +// on don't actually end up running their handlers if a later config check +// fails. +IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, + RunAdAuctionPromiseSideEffects) { + ASSERT_TRUE(NavigateToURL(shell(), https_server_->GetURL("a.test", "/echo"))); + WebContentsConsoleObserver console_observer(shell()->web_contents()); + console_observer.SetPattern("*I am a*"); + EXPECT_EQ( + "TypeError: Failed to execute 'runAdAuction' on 'Navigator': " + "sellerCurrency 'currency is checked late' for AuctionAdConfig with " + "seller 'https://test.com' must be a 3-letter uppercase currency code.", + RunAuctionAndWait(R"({ + seller: 'https://test.com', + decisionLogicURL: 'https://test.com', + sellerCurrency: 'currency is checked late', + ignored: setTimeout(() => {console.log('I am a timer'); }, 1), + perBuyerTimeouts: { 'https://test.com': { + valueOf: () => { console.log('I am a side effect!') } + } + } + })")); + EXPECT_TRUE(console_observer.Wait()); + EXPECT_EQ("I am a timer", console_observer.GetMessageAt(0)); +} + } // namespace } // namespace content
diff --git a/content/browser/private_aggregation/private_aggregation_features.cc b/content/browser/private_aggregation/private_aggregation_features.cc index d630134..29f652dc 100644 --- a/content/browser/private_aggregation/private_aggregation_features.cc +++ b/content/browser/private_aggregation/private_aggregation_features.cc
@@ -10,6 +10,6 @@ BASE_FEATURE(kPrivateAggregationApiBundledEnhancements, "PrivateAggregationApiBundledEnhancements", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); } // namespace content
diff --git a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc index a540acf..8804b50 100644 --- a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc +++ b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
@@ -7628,16 +7628,12 @@ // visual glitches. // // TODO(https://crbug.com/1472026): Investigate and re-enable. -#if BUILDFLAG(IS_WIN) -#define MAYBE_NewContentTimeoutIsSetWhenLeavingBFCacheWithViewTransition \ - DISABLED_NewContentTimeoutIsSetWhenLeavingBFCacheWithViewTransition -#else -#define MAYBE_NewContentTimeoutIsSetWhenLeavingBFCacheWithViewTransition \ - NewContentTimeoutIsSetWhenLeavingBFCacheWithViewTransition -#endif +// +// TODO(https://crbug.com/1487799): Disabled globally as the killswitch has been +// flipped. Re-enable once the proper fix for VT+BFCache has landed. IN_PROC_BROWSER_TEST_F( RenderFrameHostImplBrowserTestWithBFCacheAndViewTransition, - MAYBE_NewContentTimeoutIsSetWhenLeavingBFCacheWithViewTransition) { + DISABLED_NewContentTimeoutIsSetWhenLeavingBFCacheWithViewTransition) { // "red_jank_second_pageshow.html" janks the renderer on the second pageshow // event. const GURL url_red(embedded_test_server()->GetURL(
diff --git a/content/browser/resources/gpu/browser_bridge.ts b/content/browser/resources/gpu/browser_bridge.ts index ec2e8ea9..e790bd6 100644 --- a/content/browser/resources/gpu/browser_bridge.ts +++ b/content/browser/resources/gpu/browser_bridge.ts
@@ -43,6 +43,7 @@ compositorInfo: any[]; dawnInfo?: string[]; devicePerfInfo: any[]; + devices: any[]; diagnostics?: any[]; displayInfo: any[]; featureStatus: FeatureStatus;
diff --git a/content/browser/resources/gpu/info_view.ts b/content/browser/resources/gpu/info_view.ts index 68b8b8e9..9af2ea0 100644 --- a/content/browser/resources/gpu/info_view.ts +++ b/content/browser/resources/gpu/info_view.ts
@@ -315,6 +315,7 @@ dawnInfo: ['DAWN Info', 'ul'], clientInfo: ['Version Information', 'div'], basicInfo: ['Driver Information', 'div'], + devices: ['Device Information', 'div'], compositorInfo: ['Compositor Information', 'div'], gpuMemoryBufferInfo: ['GpuMemoryBuffers Status', 'div'], displayInfo: ['Display(s) Information', 'div'], @@ -572,6 +573,11 @@ } this.setTable_(sections.basicInfo, gpuInfo.basicInfo); + sections.devices.list.textContent = ''; + gpuInfo.devices.forEach(entry => { + sections.devices.list.appendChild(createInfoTable(entry)); + sections.devices.list.appendChild(createElem('br')); + }); this.setTable_(sections.compositorInfo, gpuInfo.compositorInfo); this.setTable_(sections.gpuMemoryBufferInfo, gpuInfo.gpuMemoryBufferInfo); this.setTable_(sections.displayInfo, gpuInfo.displayInfo);
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc index d8d68ec1..36e307e 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.cc +++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -997,6 +997,19 @@ return version.worker_host()->remote_interfaces(); } +blink::AssociatedInterfaceProvider& +ServiceWorkerContextWrapper::GetRemoteAssociatedInterfaces( + int64_t service_worker_version_id) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + CHECK(IsLiveRunningServiceWorker(service_worker_version_id)); + + // This function should only be called on live running service workers + // so it should be safe to dereference the returned pointer without + // checking it first. + auto& version = *context()->GetLiveVersion(service_worker_version_id); + return *version.associated_interface_provider(); +} + scoped_refptr<ServiceWorkerRegistration> ServiceWorkerContextWrapper::GetLiveRegistration(int64_t registration_id) { DCHECK_CURRENTLY_ON(BrowserThread::UI);
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h index 052be93c..807ffc3 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.h +++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -225,6 +225,8 @@ bool IsLiveRunningServiceWorker(int64_t service_worker_version_id) override; service_manager::InterfaceProvider& GetRemoteInterfaces( int64_t service_worker_version_id) override; + blink::AssociatedInterfaceProvider& GetRemoteAssociatedInterfaces( + int64_t service_worker_version_id) override; scoped_refptr<ServiceWorkerRegistration> GetLiveRegistration( int64_t registration_id);
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc index 3d6c0ea7..5202b07 100644 --- a/content/browser/storage_partition_impl.cc +++ b/content/browser/storage_partition_impl.cc
@@ -1452,12 +1452,12 @@ std::make_unique<BluetoothAllowedDevicesMap>(); // Must be initialized before the `url_loader_factory_getter_`. - // Cookie deprecation traffic labels should not be sent in incognito mode, - // unless the "enable_incognito" feature parameter is true. + // Cookie deprecation traffic labels should not be sent for off-the-record + // profiles, unless the "enable_otr_profiles" feature parameter is true. if (base::FeatureList::IsEnabled( features::kCookieDeprecationFacilitatedTesting) && (!is_in_memory() || - features::kCookieDeprecationFacilitatedTestingEnableIncognito.Get())) { + features::kCookieDeprecationFacilitatedTestingEnableOTRProfiles.Get())) { cookie_deprecation_label_manager_ = std::make_unique<CookieDeprecationLabelManagerImpl>(browser_context_); }
diff --git a/content/browser/webid/fake_identity_request_dialog_controller.cc b/content/browser/webid/fake_identity_request_dialog_controller.cc index e3f5836..90a14882 100644 --- a/content/browser/webid/fake_identity_request_dialog_controller.cc +++ b/content/browser/webid/fake_identity_request_dialog_controller.cc
@@ -88,7 +88,10 @@ const IdentityProviderMetadata& idp_metadata, const absl::optional<TokenError>& error, DismissCallback dismiss_callback, - MoreDetailsCallback more_details_callback) {} + MoreDetailsCallback more_details_callback) { + DCHECK(dismiss_callback); + std::move(dismiss_callback).Run(DismissReason::kOther); +} std::string FakeIdentityRequestDialogController::GetTitle() const { return title_;
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index 04363ef6..731941d 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -63,6 +63,7 @@ using CompleteRequestWithErrorCallback = base::OnceCallback<void(blink::mojom::FederatedAuthRequestResult, absl::optional<content::FedCmRequestIdTokenStatus>, + absl::optional<TokenError> token_error, bool)>; namespace content { @@ -395,6 +396,7 @@ if (iframe_origin.opaque()) { std::move(callback).Run(FederatedAuthRequestResult::kError, /*token_status=*/absl::nullopt, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/false); } } @@ -476,6 +478,7 @@ DCHECK(!logout_callback_); CompleteRequestWithError(FederatedAuthRequestResult::kError, TokenStatus::kUnhandledRequest, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/false); } // Calls |FederatedAuthUserInfoRequest|'s destructor to complete the user @@ -547,7 +550,7 @@ void FederatedAuthRequestImpl::CompleteWalletRequest(std::string response) { if (!wallet_provider_) { std::move(wallet_request_callback_) - .Run(RequestTokenStatus::kError, absl::nullopt, "", + .Run(RequestTokenStatus::kError, absl::nullopt, "", /*error=*/nullptr, /*is_account_auto_selected=*/false); return; } @@ -555,10 +558,11 @@ if (!response.empty()) { std::move(wallet_request_callback_) .Run(RequestTokenStatus::kSuccess, absl::nullopt, response, + /*error=*/nullptr, /*is_account_auto_selected=*/false); } else { std::move(wallet_request_callback_) - .Run(RequestTokenStatus::kError, absl::nullopt, "", + .Run(RequestTokenStatus::kError, absl::nullopt, "", /*error=*/nullptr, /*is_account_auto_selected=*/false); } } @@ -633,6 +637,7 @@ idp_get_params_ptrs[0]->providers.size() > 1u; if (is_multi_idp_input && !IsFedCmMultipleIdentityProvidersEnabled()) { std::move(callback).Run(RequestTokenStatus::kError, absl::nullopt, "", + /*error=*/nullptr, /*is_account_auto_selected=*/false); return; } @@ -643,6 +648,7 @@ // TODO(https://crbug.com/1416939): Support calling the MDocs API with the // Multi IdP API support. std::move(callback).Run(RequestTokenStatus::kError, absl::nullopt, "", + /*error=*/nullptr, /*is_account_auto_selected=*/false); return; } @@ -652,7 +658,7 @@ // TODO(https://crbug.com/1416939): Reconcile with federated identity // requests. std::move(callback).Run(RequestTokenStatus::kErrorTooManyRequests, - absl::nullopt, "", + absl::nullopt, "", /*error=*/nullptr, /*is_account_auto_selected=*/false); return; } @@ -665,7 +671,7 @@ } if (!wallet_provider_) { std::move(wallet_request_callback_) - .Run(RequestTokenStatus::kError, absl::nullopt, "", + .Run(RequestTokenStatus::kError, absl::nullopt, "", /*error=*/nullptr, /*is_account_auto_selected=*/false); return; } @@ -712,7 +718,7 @@ blink::mojom::FederatedAuthRequestResult::kErrorTooManyRequests); std::move(callback).Run(RequestTokenStatus::kErrorTooManyRequests, - absl::nullopt, "", + absl::nullopt, "", /*error=*/nullptr, /*is_account_auto_selected=*/false); return; } @@ -767,6 +773,7 @@ if (error_token_status) { CompleteRequestWithError(request_result, *error_token_status, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/true); return; } @@ -788,6 +795,7 @@ if (!is_unique_idp) { CompleteRequestWithError(FederatedAuthRequestResult::kError, /*token_status=*/absl::nullopt, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/false); return; } @@ -797,6 +805,7 @@ if (!network::IsOriginPotentiallyTrustworthy(idp_origin)) { CompleteRequestWithError(FederatedAuthRequestResult::kError, TokenStatus::kIdpNotPotentiallyTrustworthy, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/false); return; } @@ -814,6 +823,7 @@ FedCmIdpSigninStatusMode::ENABLED) { CompleteRequestWithError(FederatedAuthRequestResult::kError, TokenStatus::kNotSignedInWithIdp, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/true); return; } @@ -823,6 +833,7 @@ CompleteRequestWithError( FederatedAuthRequestResult::kErrorSilentMediationFailure, TokenStatus::kSilentMediationFailure, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/false); return; } @@ -891,6 +902,7 @@ CompleteRequestWithError(FederatedAuthRequestResult::kErrorCanceled, TokenStatus::kAborted, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/false); } @@ -1203,7 +1215,9 @@ if (fetch_data_.pending_idps.empty() && !fetch_data_.did_succeed_for_at_least_one_idp) { - CompleteRequestWithError(result, token_status, should_delay_callback); + CompleteRequestWithError(result, token_status, + /*token_error=*/absl::nullopt, + should_delay_callback); return; } @@ -1249,6 +1263,7 @@ CompleteRequestWithError( FederatedAuthRequestResult::kErrorRpPageNotVisible, TokenStatus::kRpPageNotVisible, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/true); return; } @@ -1335,6 +1350,7 @@ CompleteRequestWithError( FederatedAuthRequestResult::kErrorSilentMediationFailure, TokenStatus::kSilentMediationFailure, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/false); return; } @@ -1430,6 +1446,7 @@ if (!IsFrameVisible(render_frame_host().GetMainFrame())) { CompleteRequestWithError(FederatedAuthRequestResult::kErrorRpPageNotVisible, TokenStatus::kRpPageNotVisible, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/true); return; } @@ -1445,6 +1462,7 @@ CompleteRequestWithError( FederatedAuthRequestResult::kErrorSilentMediationFailure, TokenStatus::kSilentMediationFailure, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/false); return; } @@ -1672,6 +1690,7 @@ CompleteRequestWithError( FederatedAuthRequestResult::kErrorDisabledInSettings, TokenStatus::kDisabledInSettings, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/true); return; } @@ -1716,16 +1735,17 @@ blink::mojom::FederatedAuthRequestResult result, absl::optional<TokenStatus> token_status, IdentityRequestDialogController::DismissReason dismiss_reason) { - CompleteRequestWithError(result, token_status, + CompleteRequestWithError(result, token_status, /*token_error=*/absl::nullopt, /*should_delay_callback=*/false); } void FederatedAuthRequestImpl::OnDismissErrorDialog( blink::mojom::FederatedAuthRequestResult result, absl::optional<TokenStatus> token_status, + absl::optional<TokenError> token_error, IdentityRequestDialogController::DismissReason dismiss_reason) { // TODO(crbug.com/1478837): Record metrics for error UI - CompleteRequestWithError(result, token_status, + CompleteRequestWithError(result, token_status, token_error, /*should_delay_callback=*/false); } @@ -1763,6 +1783,7 @@ : FederatedAuthRequestResult::kError, should_embargo ? TokenStatus::kShouldEmbargo : TokenStatus::kNotSelectAccount, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/false); } @@ -1811,6 +1832,7 @@ CompleteRequestWithError( FederatedAuthRequestResult::kErrorFetchingIdTokenInvalidResponse, TokenStatus::kIdTokenInvalidResponse, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/true); return; } @@ -1829,21 +1851,21 @@ GetEmbeddingOrigin(), origin(), base::BindOnce(&FederatedAuthRequestImpl::CompleteRequestWithError, weak_ptr_factory_.GetWeakPtr())); + absl::optional<TokenError> token_error = + error ? absl::make_optional<TokenError>(error->code, error->url) + : absl::nullopt; // TODO(crbug.com/1485710): Refactor IdentityCredentialTokenError request_dialog_controller_->ShowErrorDialog( GetTopFrameOriginForDisplay(GetEmbeddingOrigin()), iframe_for_display, FormatOriginForDisplay(url::Origin::Create(idp_config_url)), idp_infos_[idp_config_url]->rp_context, - idp_infos_[idp_config_url]->metadata, - error - ? absl::make_optional<TokenError>(TokenError{error->code, error->url}) - : absl::nullopt, + idp_infos_[idp_config_url]->metadata, token_error, base::BindOnce( &FederatedAuthRequestImpl::OnDismissErrorDialog, weak_ptr_factory_.GetWeakPtr(), FederatedAuthRequestResult::kErrorFetchingIdTokenInvalidResponse, - TokenStatus::kIdTokenInvalidResponse), + TokenStatus::kIdTokenInvalidResponse, token_error), error && !error->url.is_empty() ? base::BindOnce(&FederatedAuthRequestImpl::ShowModalDialog, weak_ptr_factory_.GetWeakPtr(), error->url) @@ -1896,6 +1918,7 @@ CompleteRequestWithError( FederatedAuthRequestResult::kErrorFetchingIdTokenHttpNotFound, TokenStatus::kIdTokenHttpNotFound, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/true); return; } @@ -1904,6 +1927,7 @@ CompleteRequestWithError( FederatedAuthRequestResult::kErrorFetchingIdTokenNoResponse, TokenStatus::kIdTokenNoResponse, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/true); return; } @@ -1912,6 +1936,7 @@ CompleteRequestWithError( FederatedAuthRequestResult::kErrorFetchingIdTokenInvalidResponse, TokenStatus::kIdTokenInvalidResponse, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/true); return; } @@ -1920,6 +1945,7 @@ CompleteRequestWithError( FederatedAuthRequestResult::kErrorFetchingIdTokenInvalidContentType, TokenStatus::kIdTokenInvalidContentType, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/true); return; } @@ -1979,7 +2005,8 @@ } CompleteRequest(FederatedAuthRequestResult::kSuccess, - TokenStatus::kSuccess, idp->config_url, token, + TokenStatus::kSuccess, /*token_error=*/absl::nullopt, + idp->config_url, token, /*should_delay_callback=*/false); return; } @@ -2023,8 +2050,9 @@ void FederatedAuthRequestImpl::CompleteRequestWithError( blink::mojom::FederatedAuthRequestResult result, absl::optional<TokenStatus> token_status, + absl::optional<TokenError> token_error, bool should_delay_callback) { - CompleteRequest(result, token_status, + CompleteRequest(result, token_status, token_error, /*selected_idp_config_url=*/absl::nullopt, /*token=*/"", should_delay_callback); } @@ -2032,6 +2060,7 @@ void FederatedAuthRequestImpl::CompleteRequest( blink::mojom::FederatedAuthRequestResult result, absl::optional<TokenStatus> token_status, + absl::optional<TokenError> token_error, const absl::optional<GURL>& selected_idp_config_url, const std::string& id_token, bool should_delay_callback) { @@ -2061,7 +2090,8 @@ request_dialog_controller_->ShowIdpSigninFailureDialog(base::BindOnce( &FederatedAuthRequestImpl::CompleteRequest, weak_ptr_factory_.GetWeakPtr(), result, std::move(token_status), - selected_idp_config_url, id_token, should_delay_callback)); + std::move(token_error), selected_idp_config_url, id_token, + should_delay_callback)); return; } @@ -2093,10 +2123,16 @@ GetPageData(&render_frame_host())->SetPendingWebIdentityRequest(nullptr); errors_logged_to_console_ = false; + blink::mojom::TokenErrorPtr error; + if (token_error) { + error = blink::mojom::TokenError::New(); + error->code = token_error->code; + error->url = token_error->url.spec(); + } RequestTokenStatus status = FederatedAuthRequestResultToRequestTokenStatus(result); std::move(auth_request_token_callback_) - .Run(status, selected_idp_config_url, id_token, + .Run(status, selected_idp_config_url, id_token, std::move(error), is_account_auto_selected); auth_request_token_callback_.Reset(); } else { @@ -2302,7 +2338,8 @@ // TODO(crbug.com/1429083): handle the multi-idp case when there are // more than one config_urls hanging. CompleteRequest(FederatedAuthRequestResult::kSuccess, TokenStatus::kSuccess, - absl::nullopt, token, + /*token_error=*/absl::nullopt, + /*selected_idp_config_url=*/absl::nullopt, token, /*should_delay_callback=*/false); // TODO(crbug.com/1429083): handle the corner cases where CompleteRequest // can't actually fulfill the request. @@ -2313,7 +2350,9 @@ if (auth_request_token_callback_) { DCHECK(!logout_callback_); DCHECK(errors_logged_to_console_); - CompleteRequestWithError(FederatedAuthRequestResult::kError, absl::nullopt, + CompleteRequestWithError(FederatedAuthRequestResult::kError, + /*token_status=*/absl::nullopt, + /*token_error=*/absl::nullopt, /*should_delay_callback=*/false); } }
diff --git a/content/browser/webid/federated_auth_request_impl.h b/content/browser/webid/federated_auth_request_impl.h index dc46cfb..68a547d 100644 --- a/content/browser/webid/federated_auth_request_impl.h +++ b/content/browser/webid/federated_auth_request_impl.h
@@ -249,6 +249,7 @@ void OnDismissErrorDialog( blink::mojom::FederatedAuthRequestResult result, absl::optional<content::FedCmRequestIdTokenStatus> token_status, + absl::optional<TokenError> token_error, IdentityRequestDialogController::DismissReason dismiss_reason); void OnDialogDismissed( IdentityRequestDialogController::DismissReason dismiss_reason); @@ -268,6 +269,7 @@ void CompleteRequestWithError( blink::mojom::FederatedAuthRequestResult result, absl::optional<content::FedCmRequestIdTokenStatus> token_status, + absl::optional<TokenError> token_error, bool should_delay_callback); // Completes request. Displays a dialog if there is an error and the error is @@ -275,6 +277,7 @@ void CompleteRequest( blink::mojom::FederatedAuthRequestResult result, absl::optional<content::FedCmRequestIdTokenStatus> token_status, + absl::optional<TokenError> token_error, const absl::optional<GURL>& selected_idp_config_url, const std::string& token, bool should_delay_callback);
diff --git a/content/browser/webid/test/federated_auth_request_request_token_callback_helper.cc b/content/browser/webid/test/federated_auth_request_request_token_callback_helper.cc index ef2343f3..576051c 100644 --- a/content/browser/webid/test/federated_auth_request_request_token_callback_helper.cc +++ b/content/browser/webid/test/federated_auth_request_request_token_callback_helper.cc
@@ -22,6 +22,7 @@ status_.reset(); selected_idp_config_url_.reset(); token_.reset(); + error_.reset(); was_called_ = false; wait_for_callback_loop_.Quit(); } @@ -30,11 +31,13 @@ blink::mojom::RequestTokenStatus status, const absl::optional<GURL>& selected_idp_config_url, const absl::optional<std::string>& token, + blink::mojom::TokenErrorPtr error, bool is_account_auto_selected) { CHECK(!was_called_); status_ = status; selected_idp_config_url_ = selected_idp_config_url; token_ = token; + error_ = std::move(error); is_account_auto_selected_ = is_account_auto_selected; was_called_ = true; wait_for_callback_loop_.Quit();
diff --git a/content/browser/webid/test/federated_auth_request_request_token_callback_helper.h b/content/browser/webid/test/federated_auth_request_request_token_callback_helper.h index 141086fd..2fd50165 100644 --- a/content/browser/webid/test/federated_auth_request_request_token_callback_helper.h +++ b/content/browser/webid/test/federated_auth_request_request_token_callback_helper.h
@@ -63,6 +63,7 @@ void ReceiverMethod(blink::mojom::RequestTokenStatus status, const absl::optional<GURL>& selected_idp_config_url, const absl::optional<std::string>& token, + blink::mojom::TokenErrorPtr error, bool is_account_auto_selected); void Quit(); @@ -72,6 +73,7 @@ absl::optional<blink::mojom::RequestTokenStatus> status_; absl::optional<GURL> selected_idp_config_url_; absl::optional<std::string> token_; + blink::mojom::TokenErrorPtr error_; bool is_account_auto_selected_{false}; };
diff --git a/content/browser/webid/webid_browsertest.cc b/content/browser/webid/webid_browsertest.cc index 2de4221b..2fcfd67e 100644 --- a/content/browser/webid/webid_browsertest.cc +++ b/content/browser/webid/webid_browsertest.cc
@@ -922,4 +922,42 @@ EXPECT_EQ(token, EvalJs(shell(), "result")); } +class WebIdErrorBrowserTest : public WebIdBrowserTest { + public: + void SetUpCommandLine(base::CommandLine* command_line) override { + std::vector<base::test::FeatureRef> features; + features.push_back(features::kFedCmError); + scoped_feature_list_.InitWithFeatures(features, {}); + + command_line->AppendSwitch(switches::kIgnoreCertificateErrors); + } +}; + +// Verify that an IdentityCredentialError exception is returned. +IN_PROC_BROWSER_TEST_F(WebIdErrorBrowserTest, IdentityCredentialError) { + IdpTestServer::ConfigDetails config_details = BuildValidConfigDetails(); + + // Points the id assertion endpoint to a servlet. + config_details.id_assertion_endpoint_url = "/error/id_assertion_endpoint.php"; + + // Add a servlet to serve a response for the id assertion endpoint. + config_details.servlets["/error/id_assertion_endpoint.php"] = + base::BindRepeating([](const HttpRequest& request) + -> std::unique_ptr<HttpResponse> { + auto response = std::make_unique<BasicHttpResponse>(); + response->set_code(net::HTTP_OK); + response->set_content_type("text/json"); + response->set_content( + R"({"error": {"code": "invalid_request", "url": "https://idp.com/error"}})"); + return response; + }); + + idp_server()->SetConfigResponseDetails(config_details); + + std::string expected_error = + "a JavaScript error: \"IdentityCredentialError: Error " + "retrieving a token.\"\n"; + EXPECT_EQ(expected_error, EvalJs(shell(), GetBasicRequestString()).error); +} + } // namespace content
diff --git a/content/public/browser/service_worker_context.h b/content/public/browser/service_worker_context.h index dc8fcd9..df5bcac 100644 --- a/content/public/browser/service_worker_context.h +++ b/content/public/browser/service_worker_context.h
@@ -28,6 +28,7 @@ } namespace blink { +class AssociatedInterfaceProvider; class StorageKey; } // namespace blink @@ -287,6 +288,13 @@ virtual service_manager::InterfaceProvider& GetRemoteInterfaces( int64_t service_worker_version_id) = 0; + // Returns the AssociatedInterfaceProvider for the worker specified by + // `service_worker_version_id`. The caller can use InterfaceProvider to bind + // interfaces exposed by the Service Worker. CHECKs if + // `IsLiveRunningServiceWorker()` returns false. + virtual blink::AssociatedInterfaceProvider& GetRemoteAssociatedInterfaces( + int64_t service_worker_version_id) = 0; + protected: ServiceWorkerContext() {} virtual ~ServiceWorkerContext() {}
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 478c9ae..0422c44 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -174,13 +174,10 @@ "CookieDeprecationFacilitatedTesting", base::FEATURE_DISABLED_BY_DEFAULT); -// Set whether to enable cookie deprecation API in incognito mode. -// -// TODO(linnan): Consider renaming to "enable_otr_profiles" to include -// guest profiles as well. +// Set whether to enable cookie deprecation API for off-the-record profiles. const base::FeatureParam<bool> - kCookieDeprecationFacilitatedTestingEnableIncognito{ - &kCookieDeprecationFacilitatedTesting, "enable_incognito", false}; + kCookieDeprecationFacilitatedTestingEnableOTRProfiles{ + &kCookieDeprecationFacilitatedTesting, "enable_otr_profiles", false}; // Enables Blink cooperative scheduling. BASE_FEATURE(kCooperativeScheduling,
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index df616bb..ffc5424d 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -51,7 +51,7 @@ CONTENT_EXPORT BASE_DECLARE_FEATURE(kCompositeBGColorAnimation); CONTENT_EXPORT BASE_DECLARE_FEATURE(kCookieDeprecationFacilitatedTesting); CONTENT_EXPORT extern const base::FeatureParam<bool> - kCookieDeprecationFacilitatedTestingEnableIncognito; + kCookieDeprecationFacilitatedTestingEnableOTRProfiles; CONTENT_EXPORT BASE_DECLARE_FEATURE(kCooperativeScheduling); CONTENT_EXPORT BASE_DECLARE_FEATURE(kCrashReporting); CONTENT_EXPORT BASE_DECLARE_FEATURE(kDevicePosture);
diff --git a/content/public/test/fake_service_worker_context.cc b/content/public/test/fake_service_worker_context.cc index 0f4dcb8..b63d04ae 100644 --- a/content/public/test/fake_service_worker_context.cc +++ b/content/public/test/fake_service_worker_context.cc
@@ -12,6 +12,7 @@ #include "base/notreached.h" #include "base/task/single_thread_task_runner.h" #include "content/public/browser/service_worker_context_observer.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/messaging/transferable_message.h" #include "third_party/blink/public/common/storage_key/storage_key.h" @@ -119,10 +120,13 @@ service_manager::InterfaceProvider& FakeServiceWorkerContext::GetRemoteInterfaces( int64_t service_worker_version_id) { - NOTREACHED(); - static service_manager::InterfaceProvider interface_provider( - base::SingleThreadTaskRunner::GetCurrentDefault()); - return interface_provider; + NOTREACHED_NORETURN(); +} + +blink::AssociatedInterfaceProvider& +FakeServiceWorkerContext::GetRemoteAssociatedInterfaces( + int64_t service_worker_version_id) { + NOTREACHED_NORETURN(); } void FakeServiceWorkerContext::StartServiceWorkerForNavigationHint(
diff --git a/content/public/test/fake_service_worker_context.h b/content/public/test/fake_service_worker_context.h index 65e8edf..9b79d6d0 100644 --- a/content/public/test/fake_service_worker_context.h +++ b/content/public/test/fake_service_worker_context.h
@@ -84,6 +84,8 @@ bool IsLiveRunningServiceWorker(int64_t service_worker_version_id) override; service_manager::InterfaceProvider& GetRemoteInterfaces( int64_t service_worker_version_id) override; + blink::AssociatedInterfaceProvider& GetRemoteAssociatedInterfaces( + int64_t service_worker_version_id) override; void StartServiceWorkerAndDispatchMessage( const GURL& scope, const blink::StorageKey& key,
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc index 9f46efd..cddb519 100644 --- a/content/renderer/renderer_blink_platform_impl.cc +++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -96,7 +96,6 @@ #include "third_party/blink/public/platform/url_conversion.h" #include "third_party/blink/public/platform/web_audio_latency_hint.h" #include "third_party/blink/public/platform/web_audio_sink_descriptor.h" -#include "third_party/blink/public/platform/web_code_cache_loader.h" #include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/public/platform/web_theme_engine.h" #include "third_party/blink/public/platform/web_url.h"
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_1.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_1.json index 5b624e0..e9d89c1 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_1.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_1.json
@@ -1,8 +1,8 @@ { "aggregation_service_payloads": [ { - "debug_cleartext_payload": "omRkYXRhgaJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAWlvcGVyYXRpb25paGlzdG9ncmFt", + "debug_cleartext_payload": "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt", "key_id": "example_id", - "payload": "+3Q4+JVUsuSEaoct8xQpBqBFZGtfWQvsTTq142kGIRfO99j+JHuI87CLyPKguIEdC7fWjQ75d4HmQ9D/WXzVSMNPbXNjY67MMnkwN8/a0rISl8YGVyLyvmGtnJ36zmJvMMMHZmFVNp2LP9o1LbFo" + "payload": "fWpWg8lf2AoAZLlp/564iWn+HnKYdKnjXY3Fl7I90yuo9uFArZsMudxNxHbaonIUnu/SmpWUHykFwL+mRSwzhKPvIM1NBcDoKG/05HPhrYuoKX4Ktis9obwcl409Vx1ZIcRqJA8lINdxYuDOEty5KtzDmUX8KDbPEpu+wh4YIhG4uEzRt1zZ7GV0dtb4KbtrrLcvATFAqVPAO0zc9Wi3K1YxgjKJrqXY+C89PABiu8mN8hmQc8OnhGu7cCmLy6hpL+ydeOgoJPB2KrnoPv/U7Hw9ylL1e1ukFDMMyhyr50rTcC7Up3S4K92DrJa1S5BBNF5zMcQ+zwx9Srd6pDd0M61feWxJU5NKo6ZRAaa2QCkqd6sSMXOgY52SZQlwCtByfTlhgo8CX1LGwVQmMm2TNnItySI7WXar857In6NzHACMHKOYEOvURihv6kvEewnCijPwVJx/3yEMLEHhERRner7juG6V8zBC88NcPh5Gj4UQT5MwJegl38xc6L7Jl2KgjUyEBOip2M+kVG80EWbOUKXCDpO1mQ0beJQ15zQE5uvcr30Hu/jyW0dewFUhPAKf568DLy7O2sx6qESLA5NwpRXd62b2E+bndAGuHuajMWrTLtlQNsfrEFblVwEud5znxO43iaG0mSxzJrBUTmDg0Su8dULVOwrZU/3BVJHum8LoEFWppxIsXQSH6JrsO0RkGmlQ3cfy3LuYjOJZlCsbTTfa1HzMKeK0gKhjJkzrN4JRl7mzTVq+PBqdI2A39EjxgxMWu7ZWNJjZ7dlfWgU7HbEd+5TDWpJG6vYYa2DK/K4fQGTJ1cbFZVzIiq/sewUEXHjXsAqoWfockNyRxBbJPHxe4+dfYK9HmAJSC5xrutnDyETU7SH4Ne7SMDv4I3nV84qehoxjzIkBS+bUegindDuG1mSA6oiDwneQDxJ0VfrJmm2eHiin26a78WFqTZ8BhSCd43oFn1WdqJ7mazIaOduiC9OaFqDRErJpiP/EQZN+jK8ybwNRrTlXhqIMjBv1EARlA5tNv+/sxXM8vCyFWao8hgRUrTxCRxfO" } ], "shared_info": "{\"api\":\"attribution-reporting\",\"attribution_destination\":\"https://conversion.test\",\"debug_mode\":\"enabled\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486400\",\"source_registration_time\":\"1234483200\",\"version\":\"0.1\"}", "source_debug_key": "123",
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_1_cleartext_payloads.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_1_cleartext_payloads.json index bc85911f..7bf83a4 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_1_cleartext_payloads.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_1_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgaJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAWlvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_2.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_2.json index a1dbb336..e2a324c0 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_2.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_2.json
@@ -1,7 +1,7 @@ { "aggregation_service_payloads": [ { "key_id": "example_id", - "payload": "dCYizN7JKoWWZDpuozgMKeByzoe/IpsVMhelP8l2pmad+TDXg2ozkr7wTGtrnzzV9QO6IpC1HD1fE4zmVK887kGj3yKKFDffRtB61g5DwMwW9ZrBJYvYP5doz4JV/R5QKwpgM5gmvAEa+PXT1R7h" + "payload": "KgkvFUBIbPQYX8T7U/dOqtKtcYVvsO2xRLv4eYt8D2/gWMRXSNYNBsLqwErzkLyr7JOjpafQeNOkuncyOOGg19vmS8JVc/5LalFjKoJAu1byBNDKy6jbisPw9yMFe52ctaJ4i2l3mUBMGROH/V/FYe3ZPdnoXvZL23eb3Eg2ii4g6FiXJAE3oxSRGxgUK3XlwYH1ATPVwSjc9rQPJ88H3GiuJVqTIc+Q/psiBddkC6fSG00UahI42sRV4l0iuf9R9EnChwy1FcFHCzRq4T8t66jhFSxP1kUHwSQMR2toy4g7FZm49F8JBFgxTdUey7fJ1fM/PSyCWu4gP1aY9R/kwh74Yp8tMp/zOGpQUG7UHJHXNmzhpJ+mNaZP0ryb8GuMrMxOsWJ/5N8ajGbFCu8ILOWVkC4eDoCQgfwQRYQKrxMaUlDfqrOrNJNjYvSRTbujtTeAYJCgB94T//3J6G3TCe+/Xx/II6ZOzC6aNylnfPQ0T25mKimuh8Mr5cT2YuXAB1ZL9hXOHJB7xeUAmdFigknwnMubaJsrXRX3L8vadctcg8UfX4a3IXg+0L0WwC5GjHtkA5f6qi2fcV+22XyNVi0ioYl5WQLMQ8rwc0MYtJbHdR/oGncnMwTemAdJrNFvXYIBbz2jtJ5OKhSzxMB3i4dLfNzudWJBBnt1Nwz2SC6eRSkwI+GtJgLa6bslE2B8K7qmz7lP5svxznSbcNzaCrS1CR26GvHSt/bSYPv/MYaTEl2fEsx/dAnkR9N/jquiC2VB79N3vHdCnR0UbhAkBcdHV0ukSbLARhShEEhIuEVLY6L9Ho74AbnCVVU5r9HmNGBrb1DEyecomcYPC3V7Pi05P8cjnQi6Dt+/LuxPXEgZMNxqZ8ZtgT4yqK7dT9+kdgQBoLisRikarJG1yEObpnPdPTAeI04EX10PdXU097DJuynJ9POadvhP3cBMSoMpQc1Kjcb6RaXjjpqNMV/dJGInMLca9STi8aI0cIzXFhUTXWK6sMSSudU+pKZdQ9bmReB4ah5mAjhVyxppasRDpiTw7pWo4BzsFwbH" } ], "shared_info": "{\"api\":\"attribution-reporting\",\"attribution_destination\":\"https://conversion.test\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486400\",\"source_registration_time\":\"1234483200\",\"version\":\"0.1\"}" }
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_2_cleartext_payloads.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_2_cleartext_payloads.json index bc85911f..7bf83a4 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_2_cleartext_payloads.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_2_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgaJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAWlvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_3.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_3.json index 678955e..8990606 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_3.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_3.json
@@ -1,8 +1,8 @@ { "aggregation_service_payloads": [ { - "debug_cleartext_payload": "omRkYXRhgqJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA2lvcGVyYXRpb25paGlzdG9ncmFt", + "debug_cleartext_payload": "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA6JldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt", "key_id": "example_id", - "payload": "YgUBhtua0jsHvbFxd8ROeg97SI5Qelu4ykXRBIdoUSW2SH7ES5Dq4VrlFJL28J2Ly0tzlbMfzvdKqTLcEATjUaWaQ9Ncg8HQ8tnoghdxzql5vS/MTwbgiY/TDqi3EgbOIiCd//7pnH5dAD+WIgpstlZZUBiJQKlu5C0YDSWOuoLwK+VTs+Tc9SYFq4zdJSGVA7tA" + "payload": "IN55GIz1NtrebRzCSuFesnpsiPnrMq9gd983wKW4m1R66J94fAL3XMjd856WpKnVnpcQXDG8OU2Bus9aq0wuYq5sOOpovlK2bo67P+aAEhGCnRnzhZ5R3T9bP69lDruPDMBwb/QXV55uGa4lSvt7rVscfAA6XaC4z6Y5juWpdP1ieqKvxkaAHX7Akp/s7wSqDk7kTVIvXb/z4d0TCW8schjRbcD27ScVsoerLjHeqfJDGZVtDh2vqn0unp+hdTsLkcKzhNbnxxng41Cqu20/JrD+HsQ4F+gZUpbcUUNDpDUXVPFsC9mpl/HRQ0hcmcA+TUsJ8gzvqrmBlxjOlZUOTPnXTmDhz47XTKtBGiisLFwZLZpblu/v6hjS7uz+QgPtFu+oL8c642uiXxlGMVUr8/nzOqBGymaV8lcvImVrUQbGd3fzzB335kuOVTg6wxIPpO4x6TNwVYAA3TbejiBhaY3vrf2Tfa/Zf8pklxe18SnjJ04QSnBeNZebs52XKPU9QZsj3I84sYaOJk9xUtBbMEoLyphR/zFxcm+JaV4DMK3foEer8pr0SxQ14ZkVQNYOusGyItp08WW/voW7Oib1R9BCFIAuViwZy3EWBcGeKQ9iG+ulYIZb1nH7bPINhvAnojf4RKipsDJdCCmAMoNVmvFyH/eGFmR0b7Z6Moy/ufFIvq0FU6AhYX0k9nEdID3G+A+rdGzul9ARFlIad7N1zp0wJp9/gYfPn2zdzFFpDw1/i6f3UN+qGmskSvX1Cc8f9W8LSbY8U6gzWE9V0FoNB/ZSmsFv0La/n6RjSlj1KbDs/cRFIO46FHvb8PsHj2CAHAQm4mog1C7BJXrDmBlckxyMG8aWeBOAN6pR7xRevZyVQqO6/nHcCF06G+X0EyTRFbQ84V7Xk76+mEgJMaC+Xt2VTE3noPeU4+kXWnd1cw/Wjhpf06R6p30c7c46SkFnlQgA7SgSWQjOMrjqbvQDJ5tn7oenloW8UG5DpD2Dcf2jsUmaafQiSNzhLLvYd0VU56KuOKyRLuuL3o+FBGkUy9RGKTGensXMlQhY" } ], "shared_info": "{\"api\":\"attribution-reporting\",\"attribution_destination\":\"https://conversion.test\",\"debug_mode\":\"enabled\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486500\",\"source_registration_time\":\"1234483200\",\"version\":\"0.1\"}", "source_debug_key": "123",
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_3_cleartext_payloads.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_3_cleartext_payloads.json index c3578b044..69c8b88 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_3_cleartext_payloads.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_3_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgqJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA2lvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA6JldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_4.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_4.json index ecaf02f..23cfdee 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_4.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_4.json
@@ -1,7 +1,7 @@ { "aggregation_service_payloads": [ { "key_id": "example_id", - "payload": "LiavspqLWGHPnexW5xtuLXVMb2oNNBrrhULpOrBR4TGKnKCxL9qdKTyqzSJlkztvG8lDG2eQnxMwRl0lwKu4T157wwYHLpt0VxWBArFUeNh18QP5WihW7z3+UYkNQN3PJ7ddwoDe60X5UiQ6fxdUKT7F0mOIb/bAjKYKvUd8QukUBCvxTLdGmrWj22+OR239nRAO" + "payload": "Wyln0B1iq+MFr1c7nfZk+Ld/V3+NS+i/LQsfc/fWpFwWvC+VIpV8oZixL2437WX9dpqlf3pDCuug517u38kgnm08pLREujyenwmJlZvl1gzWcQlmq7zK9zc/gPvGp37dQquV3WtQSBq6o47Rcsc9nixqK1G+MrJbwLuEp4OD1htQtA5oh3lg5QnyMJHI/SZi9ybn43UROw16fNxUG4Kb2wa2RndjNLIW/OiKIXachyP2qgZ7CRM/6m9vWPK2OpRRtAewoySNftHb9dEUPnP5l7hBSd1oU/2cOOh3pc9xok0NvLtOXQBZ4D0Bem/50/736QoZCmts7n/3kfhUvAHh1SjLZoCY1QIAwwpzB2TiwCkUIzo3irM3Aqz/z5CN5HtmK5ijM6AXmF3CjgQG2Ev1nK+oDKmXT3tywZsbAdMJ1dNoNqndnS9rpKItsmLTlqTcWoRH/n8U8saG31u3miIzMCSeF552+F7VFnoBYknIrJtG74uihZnI1J/T12QN6hNy6uiYfTxEgFQq2jx1+7T4tyZruV8f6roAd6F2minzT/7e/9m5DT2OFwYrq1syI4KkRqYTGTfsGjGT2fX9EsQm2zm4z+S+ZwrJLvz+ecCdf+xOnifDvhtKVyAU51iCTB3ENE1slA3GIBcmLffrSU+Q4ctzFm7arOOfF8KhrrrRodASivzaqOw/xC1svolwYpv4epnU3IGq0FPbBKdrbHphxue0EP2v4Te8Vy4E2jNxDCVlW3WZ6ThCzo2Ooi2sVcTVhbWIeaUB9h7GRmMIzZoksLnWeXnNU0M8FGeOTif2OnALkP4G+AmwnLSa/JkqUozxfp1zyDKwQyAfmyGihrB9W/3kbiIGWWE2wjTGE06r7WR0+J2+VYckuTEMivQcTfu4vcrDVXW4N32D1tvaZjOnhhmqWXT0XTiAxSrmbfd5BqlcUP1Rj4L3/2Np0mNfPp0xXAyKocQECiNjzsYGUC222tIARPiNBlk6lPXurNOmvtEq3zdT5I40sKSt4qMhwIbh9C0d7mVY9LFHJRxuNH35kqsDNZHM5MiJrz0A" } ], "shared_info": "{\"api\":\"attribution-reporting\",\"attribution_destination\":\"https://conversion.test\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486500\",\"source_registration_time\":\"1234483200\",\"version\":\"0.1\"}" }
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_4_cleartext_payloads.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_4_cleartext_payloads.json index c3578b044..69c8b88 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_4_cleartext_payloads.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_4_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgqJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA2lvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA6JldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_5.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_5.json index bb2c1923..8b8cc661 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_5.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_5.json
@@ -1,8 +1,8 @@ { "aggregation_service_payloads": [ { - "debug_cleartext_payload": "omRkYXRhgaJldmFsdWVEAAAD6GZidWNrZXRQ/////////////////////2lvcGVyYXRpb25paGlzdG9ncmFt", + "debug_cleartext_payload": "omRkYXRhlKJldmFsdWVEAAAD6GZidWNrZXRQ/////////////////////6JldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt", "key_id": "example_id", - "payload": "s6tBRv9QuDDKxi4/yT2/JGys+gxnzqVic33u8ungNBo03u/kQhhZd4tGiOubxUHQwliP+PPiSymQwapcWuDvPM2+ajGXY/sY6fQXuMg0KIuYUOkguNPM5ZwcIxCiCJ2Brbv8MtGy2ZuCHQ176xPh" + "payload": "7+sSdnUs2HROcHnG4UoiC7m86JzIIXVe57ymYuWadix//+TyBGilyKsbPnZE2gCbq5jNTa8uAZPHdN3485VoDv2g5vEZYJJBofdz3c+5SonoFjgFITvhKi+QCBRHww89U4UGE0I008j3lmA0dozEbqlk6JfOava0biWX6s0dRv9zTV5CYxM5PP7DcjVRkaWt5HaSvXVTiYPJTUidHl5ggUDecTpRBA4QiJJqvdzd3ZjZe8ur15LI+BV0CU/cjPYf46M4BTrJmZ+Lk74GPSfxNSlB1tGjfCdlIl0C1NHWywAKM/VjXh1ageFXIEUJ8075r6ZQokK9AGk1hxZR7VcOFmlj2qfaiPdc9rPBmRpzhD1Ql5zgrDBQsK/k0oLGKB/+m1pAY21zKEVtridMianV9zu6kPvnCuY+yddwKjukGciCPztaahDQAvhrKd6qtQle6Oy5tFaQhoDhFRiq/x0/t925gVs6wrnbuwyQdqKqbv3KdTFoRWRYGCcGNjeETI+1C6yDwkVMmpii4ID3S3umTDd5bcEhRyXzPNK25AfDqz9kWMAvT1xX1jMWPS/Vsv1en/iJmyhtZsQH+YPgL78Ed8LRj79kKFLbo+Gxhvy3n9Mw0an4hl87flWS06MyByb3pmZEYjAiIxTjtTqh8VxP1R+FhktByRWMMwSiHvYdoA7C2I2IixJ77QIWnLE6Q1ViX5RuL+VY6TFikFdpFVHkzLpdzj8yGSVw5sWnLDf6ODUL1huRVzSJxqvwSiq10L0i1bumRt34esBy5SPgDl0okvQAnQZvpeoJ2PsxuVTRRCyFC7EWiKaMhFoDxNZp+xnCOb3S1XKiuycHC3ep84ggLKtZlzRDTebwDx/AwqTai77K9zYLFyvLq18zf0irAvpXoJFC7lqSbs2G7pntl5UqJ3jhhGJM5ezka8qSjRLbAghEiK0ndjrnareAIL8e8PWKBVpkK+YAW3qyKGp9PLhbxShLfgGu7qB8kI+sez80yp5OTrWs2rMLvjuHoFF9ays8HtipC7FM+AQX5UNo6P+tcuFSzaSftTpZQIIt" } ], "shared_info": "{\"api\":\"attribution-reporting\",\"attribution_destination\":\"https://conversion.test\",\"debug_mode\":\"enabled\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486600\",\"source_registration_time\":\"1234483200\",\"version\":\"0.1\"}", "source_debug_key": "123",
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_5_cleartext_payloads.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_5_cleartext_payloads.json index 26be6de..1746e84 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_5_cleartext_payloads.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_5_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgaJldmFsdWVEAAAD6GZidWNrZXRQ/////////////////////2lvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAD6GZidWNrZXRQ/////////////////////6JldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_6.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_6.json index 01127d90..e774a920 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_6.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_6.json
@@ -1,7 +1,7 @@ { "aggregation_service_payloads": [ { "key_id": "example_id", - "payload": "IQuLGiKuR9tcUrq3nWuJ7Qy6VrtQSKNDUgflzyuIkT1R6kagnjxsYVMhrw3j9euUQaSlK9jYfg070Z+GMIGYjRwsVUGnCbmTROH30zrB1ar2hupppnvl0Hz2Xkbv9ZjoVCmuV97RuQP506JqYyj7" + "payload": "F8uZu/YBLODVe39vICj1Jm/vjMN9Zn6WX71mFyA4nk0dyVY7Aha5/fZYUn4TWJRRkU+YVBL7Q3s5uGPrAEr5a5DQE7Kh7jhhOUxVYwgToQUpF5T7nxXrl13wiixD7gN2QuEwI0pCOuQ7PwmNKTF51uwWwJ9KtunJowQOsDTN8JYUJ9VpvURQShYJn2BO9D/mdBWw82NxhZbifA5LtcmZk9ydcjask5bAHH8WRvrWObllkaHX23MLn7Zw6E45rj8U/TD/8+5MvcMYSuDYGscCSVgfrujnVSHvLHTtY0hl2vhUhBv02j9RNqT0rLmy1o6ScXNQ4veI/aOmV7t0C2GY6DX8Yo5UwT5yyuMlvzrJJK1Sp0C7cXB6wZVcB2h3uX3L7i0Bu5d+vFxfObr1E4eHKb3qtgBZ6KC22cFq/Xa12pb0JrRhEhk/mcY6iNED+M2+t5CXSUkHZbJCs7Onx332nldfG6sBJDSJ0PGD+ZyShBIpeQVxMqjc5pimUT71tKagJAvjZdKvdgU/uzbQUiy3In0YWU0dMR9nKkKnJSfhek6SQxY3tlpQicgyl7iQj39CFKZa6FSQ/QHhzJyyi6RJNfPj1hycF3ZoW5pZT5tfUt3qa4J2cl7SAGr8LGHa96Q1g1ZEqp5xDJe/KrI9aWSjJeV9w5RucQ01yv8FfMLVQDb/Nqfo9YVU7Yc1S3l1Hu0io/QS7GCjy0p4p7zulEBbwFfDi5CBY3fx5latUsISpz/VyWheWaYvf4QhRCntBfH3eQDyE/R8CyL39YgLKo3tPpDkxREoyhfDb59UvOQvcDVLkeTiUU71kIrCX1fQUOoDKi3kRC+LO6miCrBnC3j+v9j4h5sODKqZR2xqiJFRxm4PfNp+mxh00hr5w/zH4ko0lbgxoVtqxYaUIa/s27ZGu8neCjyCr2ZelRLfIY9H3PwJLYRbxlHa1C0RTmCZr4lQvSw9ZnGew21+ifPqH+Uf4NMz94M0b8GFTiYtT+INPYqXoIoysB2FWZhKTjP69vthH7BxXYI9ZRCNmOaZe1NibyXEbluGD4cwE6Bg" } ], "shared_info": "{\"api\":\"attribution-reporting\",\"attribution_destination\":\"https://conversion.test\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486600\",\"source_registration_time\":\"1234483200\",\"version\":\"0.1\"}" }
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_6_cleartext_payloads.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_6_cleartext_payloads.json index 26be6de..1746e84 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_6_cleartext_payloads.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_6_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgaJldmFsdWVEAAAD6GZidWNrZXRQ/////////////////////2lvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAD6GZidWNrZXRQ/////////////////////6JldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_7.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_7.json index c3dc1b6..bac79516 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_7.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_7.json
@@ -1,7 +1,7 @@ { "aggregation_service_payloads": [ { "key_id": "example_id", - "payload": "SvUh5rKuEK4zZNUSnqIXBn3nigH+Z/BaXBeTd183CUM610v/snRxfhD2z9D2Mr3JNUR0x/LY72IkyECYz0tOFYCZox5noRZSMPUZYxqrbL2okUn8KxYEzaHe3h2GdWshjj6wlUznydE3RrqLZlyw" + "payload": "hR9Peif1FVr1+QSK6lK5LxAGuJDIOoArZwo8nkcc7UcfLZf0BOy9tUS4A2smDniFyM/3EhZN+3oZQJjDNmiurcDy459pVma3SDFIyLfUbY+m7ekkupW7l34L2pxvE3fo65YvyJ4ypU26Lizw7yauYQOss/vW0hi410FKQG1wrr7dGCioosMPVJT6wiAFqUEwAfiy+7cr4ed+Mv+YWD6HCmtL+/Zszl93CDNjNJXifQapyD6qVpwSatmcgWVkSuUrgbfPqOiyZvUiUy4aLmYFo8vNHhQUFZYqWh0HiiiHeFbrr9re5y6Tb5pRSLTGkPF5+DHYZgtdsiepWPQ4MIIfLgzrp7l/3bDEjHCYm902mIA1LzhXLNb0VGv+0Z2PhZ+hBTfkejMyyeApfCPcZGimXlaoEG8eNgwPoJDWNriJZJQvta1zl2Xhow8opaFjtl991dcscN+AFE/Z+cYJbYYSTh91/+CONxT7kK3KlTdfc1bnep+3YnzMIdg4tnwQ+gukU/Gd7BrC/pA+g7y5ucQkmnwHrV8j3gKB5dkeYyPF5wpSG5sXLS/Q6DoduwTRMjPYr0rMa00kqyTl0IKjG77z18oZ9lGXGAd8LMTRaP4VTWr4Gn7nNyzmG1xqUQkx3Cj4eQIzC+/fM05nXbNmomKf+07OClrXdHYwiYd9fRTwJqzt4H1gZ3cfK+BNh7wQd5WHmGGeg2JVsofmK3RecM2V0QMO/Py0JGSY+lmRRxhHqLdhaDjWzG3GNTgYkWTQGD3nRAFbKJKObe4pYUnl6D68ogG0IKiJkddvEUImMFrvoafSxLraEVTOz0jyLDp4SIvbAT1qQpvPEYbqq2w7C5TBuGCiRWEASPaVsVeOkUgsx/8/b9C0SH/ikfUWQkPbX/4vXQl8YBGfetn0eowKlxd+Hr4cAd6isl9DTOrU5A/Y3GYhqDnZRAIz42Q0v/i5hQ+HoDBt0OVkcnH0Hq5bbE/NG1lM+FJrUTYgOF5i6VYDeszyQvkcC+aQN2XADikzOwavykg1mX1iIW/9Y67+ls5HX8zdAVJw30IwK12X" } ], "shared_info": "{\"api\":\"attribution-reporting\",\"attribution_destination\":\"https://conversion.test\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486400\",\"source_registration_time\":\"0\",\"version\":\"0.1\"}" }
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_7_cleartext_payloads.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_7_cleartext_payloads.json index 5d14ebb..4df1a92f 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_7_cleartext_payloads.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_7_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgaJldmFsdWVEAAAAAWZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAWZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_8.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_8.json index 056ad87d..5a54bf04 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_8.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_8.json
@@ -2,7 +2,7 @@ "aggregation_service_payloads": [ { "key_id": "example_id", - "payload": "G2hpq0MdCwCGaN5P4iXLqcl2CoTulrNYDna4tNG6cTldnxSML/YMfliAUhRNHzADUWI+fpiQCF5qefdc/ZkRy0kMpmc4zuu20R40jE+Kv5XVn/cz6soPYt7IwovidPvm56N1LolaLMD2IMQa8nuX" + "payload": "tMmqsJU1UTaGzNSGdBjRosqjtb7anEOmmjQAqdSZ5UrmRClaxgsYYbrfWgg9pzZtJGPSAUgNGaiaUGJviyr9a5MSxuZMVidKy0u9FB7s6oMGvg8ZyD9O/fIMvtwbGg6PdKYvIo3hvghrXePMBQxXivVpWr/4zX2AGP5dWWGnJdM4RP3qah1INdmSjC2j6rufOqX2fh+X3ZNKOpoL4zP+bwJV/diw4UJQkUcl7a02T049tNNQ75NFfn8+NXYcNsCm8QJ5ZBxURF4jHsaHDAsBzoBu+kFxw6+2gCXp8PWaRVn3wrjSXjs1y/NLCqgpUchpVLVW31ORp9zJLvp+FK8bYe7pPIY+0usk4nLea3ou0Vj9lM5kMNU/bvQdLPBrt3L6Gm+gY+132ZZWKJv+GKzTIWupGYc6+1IX1nayll97DJKYvABuGol5fdz4dQkViZG5RDkPXrIl4yaZLu01NWiyHpEMH/lUvuefsgZ8nd3PzM9VCGcIX8I6lhlmbcDr5U/IQKuJ2joXcihJaLuyIGypkGIF4jPaKhuEhe1BSX5b3B/ufgLtqDAqtbwbkZ9J2PhyN6WosKTXDfbUSqUQhhGMPzOeMHgQeazzYIomqg9oZATV2EiDF7Ykp5/OIhsJOD4uB46KtiSZ57pHaeB+m5GXctgghXIxbl2aFvsk30lziVmcb6oczrtA29/H9DV1JDV8YZKL9U4N2ramopFb/tgQPA6Ke57c0I2lSH4Wed9wlVc57uLzLIC0zDAFYlLCnvM64e0E49vTlvyUEOIu1QMbdqS7W81pDTyc6bHXMY58ynTQh647mczv4n7d5rDC6MT2F00eAoNgccbNILEl41VCn1UHU0AA0YgNrqYHcHsWG73QiCUqApxUW2sYqFyPqxCJMlIixxtcMI14UN5CeGjsmvemapsVquuMj4toFC5cxx4ooKrtigc6wq6+azT+blFxwEdeRBgpu0LPkH8xyx4BCLf+GeVRF/nf5uoUTXUkMOfcUemmwmpI8ra/ef6FNHfgpR7KD76/j3/0w0jmF8+0dWs4ipSnubN93vwo" } ], "shared_info": "{\"api\":\"attribution-reporting\",\"attribution_destination\":\"https://conversion.test\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486400\",\"source_registration_time\":\"0\",\"version\":\"0.1\"}"
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_8_cleartext_payloads.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_8_cleartext_payloads.json index 71f73e4b..8d917f6 100644 --- a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_8_cleartext_payloads.json +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_8_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_1.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_1.json index 1f2ab8a..8ce97b3 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_1.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_1.json
@@ -1,9 +1,9 @@ { "aggregation_service_payloads": [ { - "debug_cleartext_payload": "omRkYXRhgaJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAWlvcGVyYXRpb25paGlzdG9ncmFt", + "debug_cleartext_payload": "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt", "key_id": "example_id", - "payload": "CshrMlKt5qi4LljJMFTO8L5vfsduXqdoIwwByyjETxwfeefmN5kJQ/ohJ5onjKYEO/RkrJtlMTWuUS1Argbhv9HzRRysKoEnwwW5oDnRi/Mc5QKD5BsKHir0v1awW91x0hEuPk5cNx9Qqv3t2HmU" + "payload": "8mS2TnPQHk3PfrkQtbABXpernpTcW5B8+TpksvTasEWrOoeYeXyH049iAivwR6Ug7cJGIcRoCpDzXV3LfFTzYOIw8rVwcL/VJk/M+Y9k+JDC3U/9r3eV01R9u37VlKFlmitT3pFFbnoZ/fAiZZ7LR54IVanRJQC+yNb7kVgNovt5K8e0zufkJ8CzFAPDHIiMyvukXPHgw07ft1GxQydZiE5AKNqEknISJM5MGw+QxxGuxPUpXGsJz94j1o15t+Dc5Hoqrjalk/0yjkB5mVxJ8NO37dHikoBTyGHBd4Y/INkuIkhxXfZ4PPfz28Rb74RwuFQjKR0PssgsCTEBeHTXebQf0vHJE29GQBWBLbITZaGQ2KQxRIjEBZ9NTgzpYFhcEwfhtEUv3e5MAyC/cHYFs2Egl/eKF5rYubNYLO0tkPg8s7ppSU+QJA6n3dembpYPiciu0b7TcjEc9Fi+6c1l8a0tKKca+7Fr6abpOvTuqaVnYvJoGkCRr6ZQjKS/Flzfiq1Er1FDy65UxpN3o7dyaX0tSlStN/mjb6it9vj1RdyouHn5OVaCXkgHA8bo/2V7YaqBpr/RNE/uGkHnoKbEUdKeQ7eNbhnebk0Z1mgO21bx+YTwiShRDLXOCYT/A5/u1ttp1TMR+MN4DMSkjeaFWG0VifICJUMbVjQgnFCtt6ZLAFgMiVfo1A+4SDJgYXqyVGVoK7FjSwCs48qpyA74sxG6oGniOYmwto4Imu8oV69b/o5SYhX9xgP2HtXCNEtfg7WngQCa4IzNvT0t4Yp8UWGvpUgbyFdq8dNRz+ZNz6mLO/Iu3LveUWtCHnUpEItgwOknOz8h2Hih+y2sgsVNpSPLWIbBSJQx0eo1FgbSLiJXjtMj7DhuyRGPR6tbqLfp++SNVNSqereLA9SLcY15eaC0gH2sb9t5Zpejh3QET8zDwNe7I2NW2vhZmkmOeAxfwQTlx8Sv2XGPpq2+mJC3bViaDKC4hclhy1IOpkkAJBmaHOcQlFTUJPHO6rffzX874sKVFtWqdAbAZy5m5kWuSC6XApX5Efg1NmrH" } ], "debug_key": "123",
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_1_cleartext_payloads.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_1_cleartext_payloads.json index bc85911f..7bf83a4 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_1_cleartext_payloads.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_1_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgaJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAWlvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_2.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_2.json index a0664c3ad..f15a851 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_2.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_2.json
@@ -2,7 +2,7 @@ "aggregation_service_payloads": [ { "key_id": "example_id", - "payload": "80hdtgdoBc0ZtAX0ASe/SY50cPImwXjAFLA34f5uAyt9xQksAq1zOgneWeof4mzCCL5BABhCpnTXYBRE90q1FKdI9xUIKj2oXqWJ9mm3PRTM6IajiF2Tpq8XGARpN7i48Bcz0xpYcS/9elUoYJie" + "payload": "985neFLbqDdw4xmuFer+3sbOfUKnrNrwbT4QLNaIhysOxMiE/GFdhrF9poCDLd7ctYDAoG2MuQoog9AH59jOfO6ULyf6cEKf/h8sN4mcTdEIxP6xhkl9u9Xmk6PX+x8ZsSq/QHGxnsuv0pHHWQFf1x/naTfF41UO4aDdxNbORqfPkUsmkK2AipGKFjvlzYBWitAaHI4/ey1BRrTWlcWuXHmSJgmi3dchyDkmOMLP5+DAJk0yXK/ZE/fNqftxgf67XvlT7gnNbUol/O2DF06LAjW+RglKW1skh30PBruuJ8lE8BwjCwt/adQWKkbO5HjOh4lT20KVcp4ZLzjtZYD/zG4fzgSJxuTUV8c4ZFKjMUkhaSy5CJrU4rAoH0JdORFGPl14/RetbV6a8NuRLi9O0FLCwyFkP81FuDkl+Q8wRbgG/1VLQ20gkJcpu9rqrYfu42o7R64jm0ihFVCpvdzjBUGpHQ0l17muineG2+vaCpVG8Q8idgwAE88X1hIGS2QumD5jUXLsWAxGsSHxf+k+FbwpM1Ww/96rZkPQzz5AZ6CUF3zdQUjQehsbdYJrJGNLQ1k/jykYGNcOPSc7KzpZgOkrgXSv4k7CIkyaX8w7b9qGoDCqRaL9P+pyxjpvix7DtsydCj1cp27Ra8Q674TptxImnmmw/tnhYZMePvyb77I4JB4H0ZgVgJrQgcx3Tbaht/DQF7hzmAICYysNeR1CzyDl14NXKmwxbWDo7qc6jRYVHUdUbxeESQkOfjaqs0RUJCgsmIVGPh9GwVi4jpavTsNQMDJ7SwUW3njTYCyraX8lNsHj6fcNqQJzQAcKg7wusLmmL8hc2M7JjdIX61FRynmCLqox6mynxbipoSHjWtC65Iee8sQCzgf5bAhmVM/J4PhMvFk9D0S2bFD+V3hMY1M+CVJ5K6chWz8klJu4dzFHQZAi013q4iBQiCHEfRRyQt9Z18gFLbLiWHDCSo2bHPWT1L4TACH1krEhUjY/F1VMLX1IRV2HoDXFtKVo6+sviDPqTtmaRm/IDLIoW5SBFwkcxJDhPMz+24m+" } ], "shared_info": "{\"api\":\"protected-audience\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486400\",\"version\":\"0.1\"}"
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_2_cleartext_payloads.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_2_cleartext_payloads.json index bc85911f..7bf83a4 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_2_cleartext_payloads.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_2_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgaJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAWlvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_3.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_3.json index ab9b7fb..ade7cca 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_3.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_3.json
@@ -1,8 +1,8 @@ { "aggregation_service_payloads": [ { - "debug_cleartext_payload": "omRkYXRhgqJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA2lvcGVyYXRpb25paGlzdG9ncmFt", + "debug_cleartext_payload": "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA6JldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt", "key_id": "example_id", - "payload": "CW59aBHtPq2IxSpPrZgjBEBr2r3vCHu2nbncyPH5fV4sBzPt2O0vE8Xp//Edt9pAnblEke+AicrvDew1oIgIo5p+L/HOysmE0J/o5/cN3fGqmgU0cEzXCc7JKbxFFiFxb9TSTBE6LG1XdTcS2Tggk9on8jdA37+AChmKLyrawwM7Andk0NvkPLTWDo3/vst1Sx84" + "payload": "zT49Hx0xv15nkCBtjnqE6OKxp11cJZIvTZTtje5FjSFYWZ5Ntrtfr/8MF7jttKfWp8bP4uX8lH425t2Dso1ai125sif1VdYPh+RxRGbPATHDfJhlR4UOCMAKM9NVVpE6huHCGkjKhVrShrKxyhXAvAGUFvexeJWneukGgUk0owjh47vO9AXCUQ4/pmOhIQENPvimJ6wWWbYsrNnp+Vpy/VFgwLjqVKAiB8NOQ30IyxDHLAHeQ6OBoTp7o6sSDtQ3YqbWe8HlHrzXGVqi/9pFKEaeB/HexoIiZZSZwkrtRP8kRw07mSopXWweNwKT+VSTSx6FDzJuO1ZwL3VuzulTvMwS/+c4nj97y8NHiHQ6TN/pl/u/Sue5PG/3Dnwgl7vfKe5Vl8UIBYLpPssc1UIxAngV6zEatYyOrI+Mf5uVVr/G3qDsf12HAf5SUOhIVUHQAOqc77s9fYwywvwk2jh0RYoRsKvNsZsT+ZyFNUyxMQAHsa60A4QAMdbD/slrqAmLfF7KqZo3sl8ZdbLegHl92p/zZL7lfB0N3vY28ax/XEcY5r1hrCSD7odrkNDwLG0JU2hVbFRN9HIcdIR66r3N+Cb8TY2RvxcopQbjh0U1l7SXuRkDVR+Hu0GrB12JCPG9EQb9mtLBgDo/rN4DbO1Di8k+mctJATpOlEr6ZbyqEHkO0GpPFPQ7ySTMzHlrdeJITlyyMiTIqdj2ZV65w2av6ClmHy5JVAXB1v9DnOxb+oQmDFgShZmnKGjD1IGBfPXmT0gG6FxygZKf5JBqk5vOMv6DaEJR/Z4lv3cVJcQyDB9WHDSUnYGr41gLI+Dacs6kmS9CCJBxMVFWIwMhOo1cxxyEl4B8RZBNln5kJHp3dLxWWQVrkr5GELNLrNouuUNWyEHaD3vEQP2LtS5n/N6M1Y5Kr8beXIGYqFtUP41sIb8VJ+1hYvWyW+1x/F6EHk8dwNRK4yTMF7qnmvH3Mv66BL3424aGz8IMqsHt1X6t0ABK73q1y0at6/WPwm30IPyXclxOyWI/x9QDl+1bHmpP0jVeMQ3uWb1whPrT" } ], "debug_key": "123", "shared_info": "{\"api\":\"shared-storage\",\"debug_mode\":\"enabled\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486400\",\"version\":\"0.1\"}"
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_3_cleartext_payloads.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_3_cleartext_payloads.json index c3578b044..69c8b88 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_3_cleartext_payloads.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_3_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgqJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA2lvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA6JldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_4.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_4.json index 042ee4a9..64806f2 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_4.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_4.json
@@ -1,7 +1,7 @@ { "aggregation_service_payloads": [ { "key_id": "example_id", - "payload": "a/f5FMs1EkNE7aU3uwL1KZcDHW0PpSas7zyxWtObqjtknIaRQ2PTYxP49h35xRjZRVSMIAb7H24Up0TCjqiijNUeNv80MkuRux913826V/sbsjJJrwVA0hNugKnxuzRC3+H5H6a2OI8/LdKrygLxgDLkjEWSWfC6k87PGPRQPY6ojGMyWPMm1REbURRIuNAd8TqN" + "payload": "ihN0q9jGIe7Lcc1cGjyd4bOTrtu4TW3LDOYedqTHkydYVkDvDSHgDt6065vQEoHLTD4gJ87gcdxM9chPI0Rrb0jlpHMVSR9zvxNsHjV+nhlIGXdh5Im3IZl689+joiEu0CUTTkQsKyaR1+FX1jO7BM+IjOrLIosPhlVIIo5dYyObAS9OGbF6ZsKWmf25T5KwHHJ7OJPCg12fCE9ll117FJzBOsdsQFPB/8hSTwgbcNPSrvUvD4+cOijLfKaKb/GET5D8qOqUsU3L0Q3WmmXK809ye5J3qaEYAlIllw/p7yLEfHdGI1EG1akU1obiYRoEqFtmDPB24kt3zSiHUX14rS9C4dmPfojNtNg9p94W4T3l6rHVAfjFnOiGtmdvdqrQ8swlH+MruBXYKVds7UzvgrB4klrXb/hDWoqQNgTxjm3hPosu8Jel4EFKmAlsb5fvKAbs6SotvoINvX7LWKnNWCzLUmbY76EHBybgyorIMV0Wos6fntC3H9BrQCqbD1WW7FD8TzMYxpiYPeaj8qsKyoZloDZPFCUsNQT+OOPlwExa99p7kBCvuhOMjLpu9mkv+ymhEPpk2Bgg84kQcVQ9ipMXYV7Ru6Jc3hRgM5hhm+VENm6PPmwGnGSHmVbpXUbS3FIYZ4w1gvJKeBx1ZY5QjcJ5cOqvXQSCjMvVQygh7IGnUoJxJSOaqOeGQHKo9Vl+Inj9s7lOwtAlH68b90+x3x4TEJxjA8FNltnkBXveaBJL2R0BfHIXmBeOIhE/e+/LK6VJfU4A6OYnWYaQxhUfbxv0t3M7UiSRrWVO886Vab/qdZFHIrBzPRrNmZw48wuVRTsfZTFI627mBZOJOD77gVpIEyMn96x/qDS/Rrk5g6KbQbSYWi4VBeePfI3ZhVZtQhvyQsw7WuIMqCWLYvOUQrh51c8Tdmfd8XaKxFf9EPI6Aiyr/hqfsNbedQv5UzhLqu75GNNkh+s8s6EjkgvlCMWGv3jJuMTazvi0/vHvrMAQjd4hGjGbeWhVXb4OMNQvB38tFIegCop1d+EERWMBUQbH3fRjyKZhZGl9" } ], "shared_info": "{\"api\":\"shared-storage\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486400\",\"version\":\"0.1\"}" }
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_4_cleartext_payloads.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_4_cleartext_payloads.json index c3578b044..69c8b88 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_4_cleartext_payloads.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_4_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgqJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA2lvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA6JldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_5.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_5.json index 04de674a..d97a59fe 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_5.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_5.json
@@ -1,9 +1,9 @@ { "aggregation_service_payloads": [ { - "debug_cleartext_payload": "omRkYXRhgaJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAWlvcGVyYXRpb25paGlzdG9ncmFt", + "debug_cleartext_payload": "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt", "key_id": "example_id", - "payload": "sJx01QvqJkpGVbphrC+OucTkOrO4k7iZXXd+RCWwpADK1HwyvucIPJjERqQJzR+uIeWXNMl/pViPKIM8W09ecs0Hw9POeeIVY4U/fNCWpFDl5BBr47eBOnNPeuG/eQNHtzS/RhKbCHBLm6QontSv" + "payload": "E4MJeK58Ad0rT06ysyalq3JcI1R0kSzZCWZkRy/+LEh+bG2V0VcwGQa9LUMFrZCea3dyGumEEocw7DMv/zvMxxaEuvdlmO3GuD9/uit5g/bhbI/IPc6ppYYyuJL2xQ82SSBCIkLCGiLEnBmhNDGDjaT0b8VONcWT9Fxuph53HhGsBjkCc3ee766MW18xTbLdlzuIXYEQQRrstikPb8FjkxPPQCsgCExJ+jhR88yKhGpUa8J4mhHleGUU3XwDKyg3pKLi4a8KxxpWNnk/8DNKXwAeISqH/XujTrcaK8JPcgQ1AGo8pbr/v583i6QNCCmW4bF8BHBLUHkBkrJ0QAbl19F3S2kJx+Qqwn34Z7JGmpb53T1CtDEH+Jz3n0tgB6LEXjLX7BlAxUGbRP3LCvblFejBs7jaDVWfaJb635/x5ASvLrY5dJzSCAxFpJLZvp0Ib53yvksXdXoNCujoqhX+MR29AVEglYPF2krAh3HOU/G/EzA8waoZmmuD7ZzPwXFXnVQ3/IAlDJG8Gov03W717KZDB4pkdz6gy1ljlA/i3ef4fiLmu+1AOy/2zKm4m1Nzoe0sSHRKoV9AYW7hTUmtlFATxxI4pDzS36nMT7JHh9QyqEsC3Bd0Ekdp+FX960y/EGiaf2ycd+y2WRnw98GgAAF250gkvL42DSkGIwNVHLLZzR0I3l8WMY1z5rwhNVKL1OvPJg/Xqtdimvb2oO1+h1Y0gm/hBxBOCc5f542W0vFoPv51AUYl2h7a8YUoR6w8rTFZ5xwePm3K6OIS2vwDIhRqGuD2gf7IfmXo89KN9c83xNoPK6kcjcS+tXaUPtO5pIMF0iCoXwvUaNF1U/4FLLqce1yhKYCjxMzvp9g+vpI+BVAy2R3NsSC9hm561fY8mstbo2D7T5ssJPwVuCPXDdjJO3E7n00pAom4Zk8/aHGx+FRYEEaITbVo09geXlTycPqZlm1sh5ACaiAoBr7G+fdkunE54P0vxVytks+FDi6U3d8kZgYGXqjgH3iQy4VLq4ekul+xoAnYMFtwXS7i6LxcCNyuuJ9g7pFZ" } ], "debug_key": "123",
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_5_cleartext_payloads.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_5_cleartext_payloads.json index bc85911f..7bf83a4 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_5_cleartext_payloads.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_5_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgaJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAWlvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_6.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_6.json index 2514d6d5..c0243dde 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_6.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_6.json
@@ -2,7 +2,7 @@ "aggregation_service_payloads": [ { "key_id": "example_id", - "payload": "vc3z+BWEMwcQ+DYITl0b4a1u+pZwk9nKlWM9lDRjEH4wJB/kOecjWq0buTgh7I3RrTQ2nt3EX7qDdT2Pn9y5nffPLPj5VfrQmhQReXEaXgJ9iuIi/OeENgt2JxDom98V5IYzpQVTx+cer2+3jEPn" + "payload": "GgKKOf+uc71bEOk3SSkHeMuJ8dYxQekNcnFtA9WYyA+Vnact6J6uuzLPUGEomZxfVVv6eKUo2C3K6AWPBnRZgMiN76t+fljSmon2mhnp1h0GsUKrqmTB6/xQeti48Cj+rHmT/pNnoF/EYmENwpSi2GAbCn9ZYxnVWAhr2aJ13W9+gPtt4kGVrMifEkpIVMu0ajXLJIqkym0nh92Fo/OIIJEuDX9LA8w6ZQyG7pQHLnjl9+GEfyT4eJmTy1gbLP+DLdi2B4ICAvY4d53mb1cc4Q7I2Ye0hWJEtUToro9MXL8+Lt/dIr6n1o4oBtqdoPqutNTL7XVybseyoTidJVjricAPkcn2d07CogW6QfQh5fM/TsWnk+Oir851Vku93WV17zrTsZXbDYjiuTccdB0WpfgievaJR1ps8MauNHVV90nAHuszNEjGLTA06xuacEJUhrWAhAcPGSzvxJAU4raFOGKNbg6oFXnEVN7XENtyCg65dzhTf8qoHqgM0KTjAkw1ntYE7Pv2b0BwmWWzmJtTeHZ83Hj24XP659qQVP8R8ggXE5Zqwff1/QvQt78bqRyx8J3Jtra+DgkMtRKI3tjPlQ0zUkrLEeQCRiCOhKZKWomRHj/mz/W/A/V8ChlvnFQfo8EZ2BZvWhopf2/qd+suUQ0JiEkhcC6eaD5wUqDCzN9BKhYqyVnfSwUvGo7TGw/70plMb77bncQCUnW6yeBLAX3xZxGn9ve6oEYbcmzZmr1NgwLaH62DvyETGJvEvy7/pPAWmBMdiMPB8z7SjV5Pd1C2CdSHWQfTqCaZaO6Eqn8jWAcrfZrrkU3UBHlS7PrXElQkg4hmfuRfkLWv8F4Rlh+ycj9msW30vWVLyKGL01ZC9O8TIGgACrYC+nQ2GoGJ0fr8TicCZ0XhB7O7Jre1Z1jN8ajftwEMqkupVn7jRxmXpl1KCGOvG7IG6pNvunAVVQg99vByo2U8epdOlux3U52ZtVvy6nkxZqufQsja8NoOJMwurkhFt5eNuom2VF63FsAuulk5NOyq4rRISqNTVTZ2KncKIgCXzaDm" } ], "shared_info": "{\"api\":\"protected-audience\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486400\",\"version\":\"0.1\"}"
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_6_cleartext_payloads.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_6_cleartext_payloads.json index bc85911f..7bf83a4 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_6_cleartext_payloads.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_6_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgaJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAWlvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_7.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_7.json index c626ef3b..aaf834e 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_7.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_7.json
@@ -2,7 +2,7 @@ "aggregation_service_payloads": [ { "key_id": "example_id", - "payload": "EPyP/5TdrLzCncYsaJ0qqXHI1v5sNKVn6mmK6eG9CA1bgmllEuhp50eqcTDjKAyrVNpy3yLZX748VWE5H95goEnoTIWoawmnD8cV4rN1IgMygTBjGJIeuujVZDixfpVdoF9DZtH/YVCJnJaXgu83" + "payload": "ckn3w25EkkMR3lGKvMObKPzBkPkmRhRJxjpKp8SvrUx/6mOZqZBP1+m0vPr/ceNgnG7+TpWnj1QY771O+yyVLBwU7ux7tpY9GvG2DatoEMzWy8aKDyvUzpJXAsy50muFiRGUmnftekspYtY7l9S9ROQRu1a/4W61RYP0f2hFJLyfpDweeVdOcIUGrzQdrn7aTjev5eS3vH+DC4d52TZ6fVUTi8eKqmZht61bs3FnjRh/4p8r9m6+Gvvdf1eDceXRYj54/yd0FD3KEUCcrp3jkCa1i9Q7WJ7Dfr3nvW08GVY3Rp9acFzo+jliE8B9u1Xq9dxGzsWgukwBVtHnQtrLs+ev3KN696+sLd5IEByVsahWY17wfhf9N2thrsv6ZR5g6pKqGmUtp88atjW5WzemE9YeSaJC7pbTI7t1XNhJzkyMAhrArO0IBEdlz3N2qug1i5SKtv9kihQc6JotKKS6rGEPFVgmaq7oZAofsxKAM7fYuGoluAsZtyElV7PXGYtQmtfTxgMlzV9VM0P7JaBpdKfbar10fFfKvh8UEaGwCrOkkjUa4LkNwfB4gzjpbkekz9HV5XtljpOMVVglHTTFbmPrzDVq1H43W8H15SmStfZ0lDbjONLjfAlYNkT39nKxg4GW57JMPFM/4T3fhV2xAwS6IPz8iPK23vehmhZ41JCEqmy5UuJRfYgTvLKxAZChJU64JNUho7VidFkza3OtDUWLN3/TLD3uXqoAZkZBVw9N3H5ACOpfbeWzwkjeO9W3sY60EWNN3evyf3h9IOAvNwSo15ngcdiLNBWFoJgjjbg7MIX1Fc+RNjTNYSA+gYI9bWIyCWpWrg/JO5JOAgqso1dx4bYkrSUm2e9PckOi77f1E5tX7eLYD+Uvsh8DT2kpCuPujFZ8QkM4kTSRuxCVr2u2nwFU7PY0nSnbY2zF0A0eHX+mpd4BEYVsTagIiZPvBDyP8apXxifRIF5pT7Ut5/1WUFNvjR8bvAXogLg/WabLW6pqKvWTmU6M4ydApc+N/vl5qLL9cfN8EQvjO4EJWQ/zUjkDa0muL0SB" } ], "shared_info": "{\"api\":\"shared-storage\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486400\",\"version\":\"0.1\"}"
diff --git a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_7_cleartext_payloads.json b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_7_cleartext_payloads.json index 71f73e4b..8d917f6 100644 --- a/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_7_cleartext_payloads.json +++ b/content/test/data/private_aggregation/aggregatable_report_goldens/latest/report_7_cleartext_payloads.json
@@ -1,3 +1,3 @@ [ - "omRkYXRhgaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" + "omRkYXRhlKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt" ] \ No newline at end of file
diff --git a/docs/git_submodules.md b/docs/git_submodules.md index 46b0bcc..157fb630 100644 --- a/docs/git_submodules.md +++ b/docs/git_submodules.md
@@ -8,9 +8,6 @@ submodules. While we do our best to hide complexities of submodules, some will be exposed. -IMPORTANT NOTE: Due to a bug in fsmonitor, we encourage you to disable it until -the underlying bug is fixed. More details in https://crbug.com/1475405. - [TOC] ## A quick introduction to Git submoduldes
diff --git a/docs/ios/build_instructions.md b/docs/ios/build_instructions.md index ac89e1e..65dc7d2 100644 --- a/docs/ios/build_instructions.md +++ b/docs/ios/build_instructions.md
@@ -499,7 +499,8 @@ You can significantly speed up git by using [fsmonitor.](https://github.blog/2022-06-29-improve-git-monorepo-performance-with-a-file-system-monitor/) You should enable fsmonitor in large repos, such as Chromium and v8. Enabling -it globally will launch many processes and probably isn't worthwhile. The +it globally will launch many processes and probably isn't worthwhile. Be sure +you have at least version 2.43 (fsmonitor on the Mac is broken before then). The command to enable fsmonitor in the current repo is: ```shell
diff --git a/docs/mac_build_instructions.md b/docs/mac_build_instructions.md index 1fc6734..d0171df 100644 --- a/docs/mac_build_instructions.md +++ b/docs/mac_build_instructions.md
@@ -346,13 +346,10 @@ You can significantly speed up git by using [fsmonitor.](https://github.blog/2022-06-29-improve-git-monorepo-performance-with-a-file-system-monitor/) You should enable fsmonitor in large repos, such as Chromium and v8. Enabling -it globally will launch many processes and probably isn't worthwhile. The +it globally will launch many processes and probably isn't worthwhile. Be sure +you have at least version 2.43 (fsmonitor on the Mac is broken before then). The command to enable fsmonitor in the current repo is: -> WARNING: There is a major issue with fsmonitor resulting in git diff-index -> returning wrong results. Skip enabling this until -[crbug.com/1475405](https://crbug.com/1475405) is fixed. - ```shell $ git config core.fsmonitor true ```
diff --git a/docs/website b/docs/website index 0e7a3e5..98972e0 160000 --- a/docs/website +++ b/docs/website
@@ -1 +1 @@ -Subproject commit 0e7a3e5c351b8bf18e104a1f246e6c0f76474779 +Subproject commit 98972e05cf600ceefe641ac5d83b661e2792fcb4
diff --git a/extensions/browser/service_worker/service_worker_host.cc b/extensions/browser/service_worker/service_worker_host.cc index e55b7a3..1ec5d291 100644 --- a/extensions/browser/service_worker/service_worker_host.cc +++ b/extensions/browser/service_worker/service_worker_host.cc
@@ -13,10 +13,13 @@ #include "extensions/browser/event_router.h" #include "extensions/browser/extension_function_dispatcher.h" #include "extensions/browser/extension_registry.h" +#include "extensions/browser/extension_util.h" #include "extensions/browser/process_map.h" #include "extensions/browser/service_worker_task_queue.h" #include "extensions/common/constants.h" #include "extensions/common/mojom/frame.mojom.h" +#include "extensions/common/permissions/permissions_data.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" namespace extensions { @@ -28,8 +31,8 @@ content::RenderProcessHost* render_process_host) : render_process_host_(render_process_host) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - dispatcher_ = - std::make_unique<ExtensionFunctionDispatcher>(GetBrowserContext()); + content::BrowserContext* browser_context = GetBrowserContext(); + dispatcher_ = std::make_unique<ExtensionFunctionDispatcher>(browser_context); } ServiceWorkerHost::~ServiceWorkerHost() = default; @@ -54,7 +57,14 @@ } service_worker_host->receiver_.Bind(std::move(receiver)); - service_worker_host->receiver_.reset_on_disconnect(); + service_worker_host->receiver_.set_disconnect_handler( + base::BindOnce(&ServiceWorkerHost::RemoteDisconnected, + base::Unretained(service_worker_host))); +} + +void ServiceWorkerHost::RemoteDisconnected() { + receiver_.reset(); + permissions_observer_.Reset(); } void ServiceWorkerHost::DidInitializeServiceWorkerContext( @@ -85,6 +95,9 @@ // running in a given process. return; } + service_worker_version_id_ = service_worker_version_id; + extension_id_ = extension_id; + permissions_observer_.Observe(PermissionsManager::Get(browser_context)); ServiceWorkerTaskQueue::Get(browser_context) ->DidInitializeServiceWorkerContext(render_process_id, extension_id, @@ -144,7 +157,9 @@ } CHECK(service_worker_scope.SchemeIs(kExtensionScheme) && extension_id == service_worker_scope.host_piece()); - + CHECK(!extension_id.empty()); + CHECK_NE(blink::mojom::kInvalidServiceWorkerVersionId, + service_worker_version_id); ServiceWorkerTaskQueue::Get(browser_context) ->DidStopServiceWorkerContext( render_process_id, extension_id, activation_token, @@ -174,4 +189,37 @@ return render_process_host_->GetBrowserContext(); } +mojom::ServiceWorker* ServiceWorkerHost::GetServiceWorker() { + if (!remote_.is_bound()) { + content::ServiceWorkerContext* context = + util::GetServiceWorkerContextForExtensionId(extension_id_, + GetBrowserContext()); + CHECK(context); + context->GetRemoteAssociatedInterfaces(service_worker_version_id_) + .GetInterface(&remote_); + } + return remote_.get(); +} + +void ServiceWorkerHost::OnExtensionPermissionsUpdated( + const Extension& extension, + const PermissionSet& permissions, + PermissionsManager::UpdateReason reason) { + if (extension.id() != extension_id_) { + return; + } + content::ServiceWorkerContext* context = + util::GetServiceWorkerContextForExtensionId(extension_id_, + GetBrowserContext()); + CHECK(context); + if (!context->IsLiveRunningServiceWorker(service_worker_version_id_)) { + return; + } + + const PermissionsData* permissions_data = extension.permissions_data(); + GetServiceWorker()->UpdatePermissions( + std::move(*permissions_data->active_permissions().Clone()), + std::move(*permissions_data->withheld_permissions().Clone())); +} + } // namespace extensions
diff --git a/extensions/browser/service_worker/service_worker_host.h b/extensions/browser/service_worker/service_worker_host.h index ad8ef36c..edbd3d8 100644 --- a/extensions/browser/service_worker/service_worker_host.h +++ b/extensions/browser/service_worker/service_worker_host.h
@@ -9,11 +9,16 @@ #include <unordered_set> #include "base/memory/raw_ptr.h" +#include "base/scoped_observation.h" #include "base/supports_user_data.h" #include "content/public/browser/browser_thread.h" +#include "extensions/browser/permissions_manager.h" #include "extensions/common/extension_id.h" +#include "extensions/common/mojom/service_worker.mojom.h" #include "extensions/common/mojom/service_worker_host.mojom.h" #include "mojo/public/cpp/bindings/associated_receiver.h" +#include "mojo/public/cpp/bindings/associated_remote.h" +#include "third_party/blink/public/mojom/service_worker/service_worker_database.mojom.h" class GURL; @@ -33,7 +38,8 @@ // This class is the host of service worker execution context for extension // in the renderer process. Lives on the UI thread. class ServiceWorkerHost : public base::SupportsUserData::Data, - public mojom::ServiceWorkerHost { + public mojom::ServiceWorkerHost, + public PermissionsManager::Observer { public: explicit ServiceWorkerHost(content::RenderProcessHost* render_process_host); ServiceWorkerHost(const ServiceWorkerHost&) = delete; @@ -66,11 +72,21 @@ void RequestWorker(mojom::RequestParamsPtr params) override; void WorkerResponseAck(const base::Uuid& request_uuid) override; + // PermissionManager::Observer overrides. + void OnExtensionPermissionsUpdated( + const Extension& extension, + const PermissionSet& permissions, + PermissionsManager::UpdateReason reason) override; + private: // Returns the browser context associated with the render process this // `ServiceWorkerHost` belongs to. content::BrowserContext* GetBrowserContext(); + mojom::ServiceWorker* GetServiceWorker(); + + void RemoteDisconnected(); + // This is safe because ServiceWorkerHost is tied to the life time of // RenderProcessHost. const raw_ptr<content::RenderProcessHost> render_process_host_; @@ -78,6 +94,13 @@ std::unique_ptr<ExtensionFunctionDispatcher> dispatcher_; mojo::AssociatedReceiver<mojom::ServiceWorkerHost> receiver_{this}; + mojo::AssociatedRemote<mojom::ServiceWorker> remote_; + int64_t service_worker_version_id_ = + blink::mojom::kInvalidServiceWorkerVersionId; + ExtensionId extension_id_; + + base::ScopedObservation<PermissionsManager, PermissionsManager::Observer> + permissions_observer_{this}; }; } // namespace extensions
diff --git a/extensions/common/BUILD.gn b/extensions/common/BUILD.gn index d99f23b7..fc38afb 100644 --- a/extensions/common/BUILD.gn +++ b/extensions/common/BUILD.gn
@@ -89,6 +89,7 @@ "mojom/renderer.mojom", "mojom/renderer_host.mojom", "mojom/run_location.mojom", + "mojom/service_worker.mojom", "mojom/service_worker_host.mojom", "mojom/stack_frame.mojom", "mojom/url_pattern_set.mojom",
diff --git a/extensions/common/mojom/service_worker.mojom b/extensions/common/mojom/service_worker.mojom new file mode 100644 index 0000000..ce95a51 --- /dev/null +++ b/extensions/common/mojom/service_worker.mojom
@@ -0,0 +1,15 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module extensions.mojom; + +import "extensions/common/mojom/permission_set.mojom"; + +// An interface for an extension Service Worker. Implemented +// in the renderer. +interface ServiceWorker { + // Tells the worker to update an extension's permission set. + UpdatePermissions(PermissionSet active_permissions, + PermissionSet withheld_permissions); +};
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc index 04773097..1185cdc2 100644 --- a/extensions/renderer/dispatcher.cc +++ b/extensions/renderer/dispatcher.cc
@@ -86,6 +86,7 @@ #include "extensions/renderer/script_context.h" #include "extensions/renderer/script_context_set.h" #include "extensions/renderer/script_injection_manager.h" +#include "extensions/renderer/service_worker_data.h" #include "extensions/renderer/service_worker_natives.h" #include "extensions/renderer/set_icon_natives.h" #include "extensions/renderer/shared_l10n_map.h" @@ -532,7 +533,8 @@ // won't work before that event has fired? return; } - + const int thread_id = content::WorkerThread::GetCurrentId(); + CHECK_NE(thread_id, kMainThreadId); // Only the script specific in the manifest's background data gets bindings. // // TODO(crbug/961821): We may want to give other service workers registered @@ -556,9 +558,8 @@ *RendererExtensionRegistry::Get()->GetWorkerActivationToken( extension->id()); worker_dispatcher->AddWorkerData( - service_worker_version_id, worker_activation_token, context, - CreateBindingsSystem(std::move(ipc_sender))); - worker_thread_util::SetWorkerContextProxy(context_proxy); + context_proxy, service_worker_version_id, worker_activation_token, + context, CreateBindingsSystem(std::move(ipc_sender))); // TODO(lazyboy): Make sure accessing |source_map_| in worker thread is // safe. @@ -579,7 +580,7 @@ // necessary for Extension SW. RequireGuestViewModules(context); - worker_dispatcher->DidInitializeContext(service_worker_version_id); + WorkerThreadDispatcher::GetServiceWorkerData()->Init(); } g_worker_script_context_set.Get().Insert(base::WrapUnique(context)); @@ -661,9 +662,13 @@ script_url)) return; - DCHECK(worker_thread_util::IsWorkerThread()); - WorkerThreadDispatcher::Get()->DidStartContext(service_worker_scope, - service_worker_version_id); + const int thread_id = content::WorkerThread::GetCurrentId(); + CHECK_NE(thread_id, kMainThreadId); + auto* service_worker_data = WorkerThreadDispatcher::GetServiceWorkerData(); + service_worker_data->GetServiceWorkerHost()->DidStartServiceWorkerContext( + service_worker_data->context()->GetExtensionID(), + service_worker_data->activation_sequence(), service_worker_scope, + service_worker_version_id, thread_id); } void Dispatcher::WillDestroyServiceWorkerContextOnWorkerThread( @@ -674,25 +679,30 @@ // Note that using ExtensionAPIEnabledForServiceWorkerScript() won't work here // as RendererExtensionRegistry might have already unloaded this extension. // Use the existence of ServiceWorkerData as the source of truth instead. - if (!WorkerThreadDispatcher::GetServiceWorkerData()) { - // If extension APIs in service workers aren't enabled, we just need to - // remove the context. - g_worker_script_context_set.Get().Remove(v8_context, script_url); - } else { + if (auto* service_worker_data = + WorkerThreadDispatcher::GetServiceWorkerData()) { + const int thread_id = content::WorkerThread::GetCurrentId(); + CHECK_NE(thread_id, kMainThreadId); + // TODO(lazyboy/devlin): Should this cleanup happen in a worker class, like // WorkerThreadDispatcher? If so, we should move the initialization as well. - ScriptContext* script_context = WorkerThreadDispatcher::GetScriptContext(); + ScriptContext* script_context = service_worker_data->context(); NativeExtensionBindingsSystem* worker_bindings_system = WorkerThreadDispatcher::GetBindingsSystem(); worker_bindings_system->WillReleaseScriptContext(script_context); - WorkerThreadDispatcher::Get()->DidStopContext(service_worker_scope, - service_worker_version_id); + service_worker_data->GetServiceWorkerHost()->DidStopServiceWorkerContext( + script_context->GetExtensionID(), + service_worker_data->activation_sequence(), service_worker_scope, + service_worker_version_id, thread_id); // Note: we have to remove the context (and thus perform invalidation on // the native handlers) prior to removing the worker data, which destroys // the associated bindings system. g_worker_script_context_set.Get().Remove(v8_context, script_url); WorkerThreadDispatcher::Get()->RemoveWorkerData(service_worker_version_id); - worker_thread_util::SetWorkerContextProxy(nullptr); + } else { + // If extension APIs in service workers aren't enabled, we just need to + // remove the context. + g_worker_script_context_set.Get().Remove(v8_context, script_url); } std::string extension_id =
diff --git a/extensions/renderer/ipc_message_sender.cc b/extensions/renderer/ipc_message_sender.cc index 1e1d5e31..f71dadc9 100644 --- a/extensions/renderer/ipc_message_sender.cc +++ b/extensions/renderer/ipc_message_sender.cc
@@ -27,6 +27,7 @@ #include "extensions/renderer/extensions_renderer_client.h" #include "extensions/renderer/native_extension_bindings_system.h" #include "extensions/renderer/script_context.h" +#include "extensions/renderer/service_worker_data.h" #include "extensions/renderer/trace_util.h" #include "extensions/renderer/worker_thread_dispatcher.h" #include "ipc/ipc_sync_channel.h" @@ -345,7 +346,9 @@ params->worker_thread_id = worker_thread_id; params->service_worker_version_id = service_worker_version_id_; - dispatcher_->RequestWorker(std::move(params)); + WorkerThreadDispatcher::GetServiceWorkerData() + ->GetServiceWorkerHost() + ->RequestWorker(std::move(params)); } void SendResponseAckIPC(ScriptContext* context, @@ -354,7 +357,9 @@ CHECK(context->IsForServiceWorker()); CHECK_NE(kMainThreadId, content::WorkerThread::GetCurrentId()); - dispatcher_->SendResponseAck(request_uuid); + WorkerThreadDispatcher::GetServiceWorkerData() + ->GetServiceWorkerHost() + ->WorkerResponseAck(request_uuid); } void SendAddUnfilteredEventListenerIPC( @@ -365,10 +370,14 @@ DCHECK_NE(blink::mojom::kInvalidServiceWorkerVersionId, context->service_worker_version_id()); - dispatcher_->SendAddEventListener( - context->GetExtensionID(), context->service_worker_scope(), event_name, - context->service_worker_version_id(), - content::WorkerThread::GetCurrentId()); + WorkerThreadDispatcher::GetServiceWorkerData() + ->GetEventRouter() + ->AddListenerForServiceWorker( + context->GetExtensionID(), event_name, + mojom::ServiceWorkerContext::New( + context->service_worker_scope(), + context->service_worker_version_id(), + content::WorkerThread::GetCurrentId())); } void SendRemoveUnfilteredEventListenerIPC( @@ -379,10 +388,14 @@ DCHECK_NE(blink::mojom::kInvalidServiceWorkerVersionId, context->service_worker_version_id()); - dispatcher_->SendRemoveEventListener( - context->GetExtensionID(), context->service_worker_scope(), event_name, - context->service_worker_version_id(), - content::WorkerThread::GetCurrentId()); + WorkerThreadDispatcher::GetServiceWorkerData() + ->GetEventRouter() + ->RemoveListenerForServiceWorker( + context->GetExtensionID(), event_name, + mojom::ServiceWorkerContext::New( + context->service_worker_scope(), + context->service_worker_version_id(), + content::WorkerThread::GetCurrentId())); } void SendAddUnfilteredLazyEventListenerIPC( @@ -391,8 +404,11 @@ DCHECK(context->IsForServiceWorker()); DCHECK_NE(kMainThreadId, content::WorkerThread::GetCurrentId()); - dispatcher_->SendAddEventLazyListener( - context->GetExtensionID(), context->service_worker_scope(), event_name); + WorkerThreadDispatcher::GetServiceWorkerData() + ->GetEventRouter() + ->AddLazyListenerForServiceWorker(context->GetExtensionID(), + context->service_worker_scope(), + event_name); } void SendRemoveUnfilteredLazyEventListenerIPC( @@ -401,8 +417,11 @@ DCHECK(context->IsForServiceWorker()); DCHECK_NE(kMainThreadId, content::WorkerThread::GetCurrentId()); - dispatcher_->SendRemoveEventLazyListener( - context->GetExtensionID(), context->service_worker_scope(), event_name); + WorkerThreadDispatcher::GetServiceWorkerData() + ->GetEventRouter() + ->RemoveLazyListenerForServiceWorker(context->GetExtensionID(), + context->service_worker_scope(), + event_name); } void SendAddFilteredEventListenerIPC(ScriptContext* context, @@ -414,10 +433,15 @@ DCHECK_NE(blink::mojom::kInvalidServiceWorkerVersionId, context->service_worker_version_id()); - dispatcher_->SendAddEventFilteredListener( - context->GetExtensionID(), context->service_worker_scope(), event_name, - context->service_worker_version_id(), - content::WorkerThread::GetCurrentId(), filter.Clone(), is_lazy); + WorkerThreadDispatcher::GetServiceWorkerData() + ->GetEventRouter() + ->AddFilteredListenerForServiceWorker( + context->GetExtensionID(), event_name, + mojom::ServiceWorkerContext::New( + context->service_worker_scope(), + context->service_worker_version_id(), + content::WorkerThread::GetCurrentId()), + filter.Clone(), is_lazy); } void SendRemoveFilteredEventListenerIPC(ScriptContext* context, @@ -429,11 +453,15 @@ DCHECK_NE(blink::mojom::kInvalidServiceWorkerVersionId, context->service_worker_version_id()); - dispatcher_->SendRemoveEventFilteredListener( - context->GetExtensionID(), context->service_worker_scope(), event_name, - context->service_worker_version_id(), - content::WorkerThread::GetCurrentId(), filter.Clone(), - remove_lazy_listener); + WorkerThreadDispatcher::GetServiceWorkerData() + ->GetEventRouter() + ->RemoveFilteredListenerForServiceWorker( + context->GetExtensionID(), event_name, + mojom::ServiceWorkerContext::New( + context->service_worker_scope(), + context->service_worker_version_id(), + content::WorkerThread::GetCurrentId()), + filter.Clone(), remove_lazy_listener); } void SendBindAutomationIPC( @@ -441,7 +469,9 @@ mojo::PendingAssociatedRemote<ax::mojom::Automation> pending_remote) override { CHECK(context->IsForServiceWorker()); - dispatcher_->SendBindAutomation(std::move(pending_remote)); + WorkerThreadDispatcher::GetServiceWorkerData() + ->GetAutomationRegistry() + ->BindAutomation(std::move(pending_remote)); } void SendOpenMessageChannel(ScriptContext* script_context,
diff --git a/extensions/renderer/service_worker_data.cc b/extensions/renderer/service_worker_data.cc index 9846d910..54ae974f 100644 --- a/extensions/renderer/service_worker_data.cc +++ b/extensions/renderer/service_worker_data.cc
@@ -4,21 +4,114 @@ #include "extensions/renderer/service_worker_data.h" +#include "extensions/common/extension.h" +#include "extensions/common/extension_messages.h" +#include "extensions/common/permissions/permissions_data.h" +#include "extensions/renderer/dispatcher.h" +#include "extensions/renderer/extension_interaction_provider.h" #include "extensions/renderer/native_extension_bindings_system.h" +#include "extensions/renderer/renderer_extension_registry.h" +#include "extensions/renderer/worker_script_context_set.h" +#include "extensions/renderer/worker_thread_dispatcher.h" +#include "extensions/renderer/worker_thread_util.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" namespace extensions { ServiceWorkerData::ServiceWorkerData( + blink::WebServiceWorkerContextProxy* proxy, int64_t service_worker_version_id, base::UnguessableToken activation_sequence, ScriptContext* context, std::unique_ptr<NativeExtensionBindingsSystem> bindings_system) - : service_worker_version_id_(service_worker_version_id), + : proxy_(proxy), + service_worker_version_id_(service_worker_version_id), activation_sequence_(std::move(activation_sequence)), context_(context), v8_schema_registry_(new V8SchemaRegistry), - bindings_system_(std::move(bindings_system)) {} + bindings_system_(std::move(bindings_system)) { + proxy_->GetAssociatedInterfaceRegistry().AddInterface<mojom::ServiceWorker>( + base::BindRepeating(&ServiceWorkerData::OnServiceWorkerRequest, + weak_ptr_factory_.GetWeakPtr())); +} ServiceWorkerData::~ServiceWorkerData() = default; +void ServiceWorkerData::OnServiceWorkerRequest( + mojo::PendingAssociatedReceiver<mojom::ServiceWorker> receiver) { + receiver_.reset(); + receiver_.Bind(std::move(receiver)); +} + +void ServiceWorkerData::UpdatePermissions(PermissionSet active_permissions, + PermissionSet withheld_permissions) { + DCHECK(worker_thread_util::IsWorkerThread()); + + const ExtensionId& extension_id = context_->GetExtensionID(); + const Extension* extension = + RendererExtensionRegistry::Get()->GetByID(extension_id); + if (!extension) { + return; + } + extension->permissions_data()->SetPermissions( + std::make_unique<const PermissionSet>(std::move(active_permissions)), + std::make_unique<const PermissionSet>(std::move(withheld_permissions))); + + bindings_system_->UpdateBindings(extension_id, /*permissions_changed=*/true, + Dispatcher::GetWorkerScriptContextSet()); +} + +mojom::ServiceWorkerHost* ServiceWorkerData::GetServiceWorkerHost() { + if (!service_worker_host_.is_bound()) { + proxy_->GetRemoteAssociatedInterface( + service_worker_host_.BindNewEndpointAndPassReceiver()); + } + return service_worker_host_.get(); +} + +mojom::EventRouter* ServiceWorkerData::GetEventRouter() { + if (!event_router_remote_.is_bound()) { + proxy_->GetRemoteAssociatedInterface( + event_router_remote_.BindNewEndpointAndPassReceiver()); + } + return event_router_remote_.get(); +} + +mojom::RendererAutomationRegistry* ServiceWorkerData::GetAutomationRegistry() { + if (!renderer_automation_registry_remote_.is_bound()) { + proxy_->GetRemoteAssociatedInterface( + renderer_automation_registry_remote_.BindNewEndpointAndPassReceiver()); + } + return renderer_automation_registry_remote_.get(); +} + +void ServiceWorkerData::Init() { + const int thread_id = content::WorkerThread::GetCurrentId(); + GetServiceWorkerHost()->DidInitializeServiceWorkerContext( + context_->GetExtensionID(), service_worker_version_id_, thread_id, + event_dispatcher_receiver_.BindNewEndpointAndPassRemote()); +} + +void ServiceWorkerData::DispatchEvent(mojom::DispatchEventParamsPtr params, + base::Value::List event_args) { + ScriptContext* script_context = context(); + // Note |scoped_extension_interaction| requires a HandleScope. + v8::Isolate* isolate = script_context->isolate(); + v8::HandleScope handle_scope(isolate); + std::unique_ptr<InteractionProvider::Scope> scoped_extension_interaction; + if (params->is_user_gesture) { + scoped_extension_interaction = + ExtensionInteractionProvider::Scope::ForWorker( + script_context->v8_context()); + } + + bindings_system()->DispatchEventInContext(params->event_name, event_args, + std::move(params->filtering_info), + context()); + const int worker_thread_id = content::WorkerThread::GetCurrentId(); + WorkerThreadDispatcher::Get()->Send(new ExtensionHostMsg_EventAckWorker( + context()->GetExtensionID(), service_worker_version_id(), + worker_thread_id, params->event_id)); +} + } // namespace extensions
diff --git a/extensions/renderer/service_worker_data.h b/extensions/renderer/service_worker_data.h index c09bfc5c..ddc578d 100644 --- a/extensions/renderer/service_worker_data.h +++ b/extensions/renderer/service_worker_data.h
@@ -7,8 +7,17 @@ #include <memory> +#include "base/memory/weak_ptr.h" #include "base/unguessable_token.h" +#include "extensions/common/mojom/automation_registry.mojom.h" +#include "extensions/common/mojom/event_dispatcher.mojom.h" +#include "extensions/common/mojom/event_router.mojom.h" +#include "extensions/common/mojom/service_worker.mojom.h" +#include "extensions/common/mojom/service_worker_host.mojom.h" #include "extensions/renderer/v8_schema_registry.h" +#include "mojo/public/cpp/bindings/associated_receiver.h" +#include "mojo/public/cpp/bindings/associated_remote.h" +#include "third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h" namespace extensions { class NativeExtensionBindingsSystem; @@ -16,9 +25,11 @@ // Per ServiceWorker data in worker thread. // TODO(lazyboy): Also put worker ScriptContexts in this. -class ServiceWorkerData { +class ServiceWorkerData : public mojom::EventDispatcher, + public mojom::ServiceWorker { public: ServiceWorkerData( + blink::WebServiceWorkerContextProxy* proxy, int64_t service_worker_version_id, base::UnguessableToken activation_sequence, ScriptContext* context, @@ -27,7 +38,9 @@ ServiceWorkerData(const ServiceWorkerData&) = delete; ServiceWorkerData& operator=(const ServiceWorkerData&) = delete; - ~ServiceWorkerData(); + ~ServiceWorkerData() override; + + void Init(); V8SchemaRegistry* v8_schema_registry() { return v8_schema_registry_.get(); } NativeExtensionBindingsSystem* bindings_system() { @@ -41,13 +54,42 @@ } ScriptContext* context() const { return context_; } + blink::WebServiceWorkerContextProxy* worker_context_proxy() const { + return proxy_; + } + + mojom::ServiceWorkerHost* GetServiceWorkerHost(); + mojom::EventRouter* GetEventRouter(); + mojom::RendererAutomationRegistry* GetAutomationRegistry(); + + // mojom::ServiceWorker overrides: + void UpdatePermissions(PermissionSet active_permissions, + PermissionSet withheld_permissions) override; + + // mojom::EventDispatcher overrides: + void DispatchEvent(mojom::DispatchEventParamsPtr params, + base::Value::List event_args) override; + private: + void OnServiceWorkerRequest( + mojo::PendingAssociatedReceiver<mojom::ServiceWorker> receiver); + + blink::WebServiceWorkerContextProxy* proxy_; const int64_t service_worker_version_id_; const base::UnguessableToken activation_sequence_; - ScriptContext* const context_ = nullptr; + ScriptContext* const context_; + mojo::AssociatedReceiver<mojom::ServiceWorker> receiver_{this}; std::unique_ptr<V8SchemaRegistry> v8_schema_registry_; std::unique_ptr<NativeExtensionBindingsSystem> bindings_system_; + mojo::AssociatedRemote<mojom::ServiceWorkerHost> service_worker_host_; + mojo::AssociatedReceiver<mojom::EventDispatcher> event_dispatcher_receiver_{ + this}; + mojo::AssociatedRemote<mojom::EventRouter> event_router_remote_; + mojo::AssociatedRemote<mojom::RendererAutomationRegistry> + renderer_automation_registry_remote_; + + base::WeakPtrFactory<ServiceWorkerData> weak_ptr_factory_{this}; }; } // namespace extensions
diff --git a/extensions/renderer/worker_thread_dispatcher.cc b/extensions/renderer/worker_thread_dispatcher.cc index 1c9f8527..d4e2d5c 100644 --- a/extensions/renderer/worker_thread_dispatcher.cc +++ b/extensions/renderer/worker_thread_dispatcher.cc
@@ -43,95 +43,6 @@ return data; } -void BindAutomationOnIO( - mojo::PendingAssociatedRemote<ax::mojom::Automation> pending_remote) { - auto* dispatcher = WorkerThreadDispatcher::Get(); - dispatcher->GetAutomationRegistryOnIO()->BindAutomation( - std::move(pending_remote)); -} - -// Calls mojom::EventRouter::AddListenerForServiceWorker(). It should be called -// on the IO thread. -void AddEventListenerOnIO(const std::string& extension_id, - const GURL& scope, - const std::string& event_name, - int64_t service_worker_version_id, - int worker_thread_id) { - auto* dispatcher = WorkerThreadDispatcher::Get(); - dispatcher->GetEventRouterOnIO()->AddListenerForServiceWorker( - extension_id, event_name, - mojom::ServiceWorkerContext::New(scope, service_worker_version_id, - worker_thread_id)); -} - -// Calls mojom::EventRouter::RemoveListenerForServiceWorker(). It should be -// called on the IO thread. -void RemoveEventListenerOnIO(const std::string& extension_id, - const GURL& scope, - const std::string& event_name, - int64_t service_worker_version_id, - int worker_thread_id) { - auto* dispatcher = WorkerThreadDispatcher::Get(); - dispatcher->GetEventRouterOnIO()->RemoveListenerForServiceWorker( - extension_id, event_name, - mojom::ServiceWorkerContext::New(scope, service_worker_version_id, - worker_thread_id)); -} - -// Calls mojom::EventRouter::AddLazyListenerForServiceWorker(). It should be -// called on the IO thread. -void AddEventLazyListenerOnIO(const std::string& extension_id, - const GURL& scope, - const std::string& event_name) { - auto* dispatcher = WorkerThreadDispatcher::Get(); - dispatcher->GetEventRouterOnIO()->AddLazyListenerForServiceWorker( - extension_id, scope, event_name); -} - -// Calls mojom::EventRouter::RemoveLazyListenerForServiceWorker(). It should be -// called on the IO thread. -void RemoveEventLazyListenerOnIO(const std::string& extension_id, - const GURL& scope, - const std::string& event_name) { - auto* dispatcher = WorkerThreadDispatcher::Get(); - dispatcher->GetEventRouterOnIO()->RemoveLazyListenerForServiceWorker( - extension_id, scope, event_name); -} - -// Calls mojom::EventRouter::AddFilteredListenerForServiceWorker(). It should be -// called on the IO thread. -void AddEventFilteredListenerOnIO(const std::string& extension_id, - const GURL& scope, - const std::string& event_name, - int64_t service_worker_version_id, - int worker_thread_id, - base::Value::Dict filter, - bool add_lazy_listener) { - auto* dispatcher = WorkerThreadDispatcher::Get(); - dispatcher->GetEventRouterOnIO()->AddFilteredListenerForServiceWorker( - extension_id, event_name, - mojom::ServiceWorkerContext::New(scope, service_worker_version_id, - worker_thread_id), - std::move(filter), add_lazy_listener); -} - -// Calls mojom::EventRouter::RemoveFilteredListenerForServiceWorker(). It should -// be called on the IO thread. -void RemoveEventFilteredListenerOnIO(const std::string& extension_id, - const GURL& scope, - const std::string& event_name, - int64_t service_worker_version_id, - int worker_thread_id, - base::Value::Dict filter, - bool remove_lazy_listener) { - auto* dispatcher = WorkerThreadDispatcher::Get(); - dispatcher->GetEventRouterOnIO()->RemoveFilteredListenerForServiceWorker( - extension_id, event_name, - mojom::ServiceWorkerContext::New(scope, service_worker_version_id, - worker_thread_id), - std::move(filter), remove_lazy_listener); -} - } // namespace WorkerThreadDispatcher::WorkerThreadDispatcher() = default; @@ -203,14 +114,6 @@ Dispatcher::GetWorkerScriptContextSet()); } -// static -void WorkerThreadDispatcher::DispatchEventOnWorkerThread( - mojom::DispatchEventParamsPtr params, - base::Value::List event_args) { - auto* dispatcher = WorkerThreadDispatcher::Get(); - dispatcher->DispatchEventHelper(std::move(params), std::move(event_args)); -} - bool WorkerThreadDispatcher::OnControlMessageReceived( const IPC::Message& message) { if (!HandlesMessageOnWorkerThread(message)) { @@ -253,85 +156,6 @@ return success; } -void WorkerThreadDispatcher::SendAddEventListener( - const std::string& extension_id, - const GURL& scope, - const std::string& event_name, - int64_t service_worker_version_id, - int worker_thread_id) { - io_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&AddEventListenerOnIO, extension_id, scope, event_name, - service_worker_version_id, worker_thread_id)); -} - -void WorkerThreadDispatcher::SendAddEventLazyListener( - const std::string& extension_id, - const GURL& scope, - const std::string& event_name) { - io_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&AddEventLazyListenerOnIO, extension_id, scope, - event_name)); -} - -void WorkerThreadDispatcher::SendAddEventFilteredListener( - const std::string& extension_id, - const GURL& scope, - const std::string& event_name, - int64_t service_worker_version_id, - int worker_thread_id, - base::Value::Dict filter, - bool add_lazy_listener) { - io_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&AddEventFilteredListenerOnIO, extension_id, scope, - event_name, service_worker_version_id, worker_thread_id, - std::move(filter), add_lazy_listener)); -} - -void WorkerThreadDispatcher::SendBindAutomation( - mojo::PendingAssociatedRemote<ax::mojom::Automation> pending_remote) { - io_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&BindAutomationOnIO, std::move(pending_remote))); -} - -void WorkerThreadDispatcher::SendRemoveEventListener( - const std::string& extension_id, - const GURL& scope, - const std::string& event_name, - int64_t service_worker_version_id, - int worker_thread_id) { - io_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&RemoveEventListenerOnIO, extension_id, scope, event_name, - service_worker_version_id, worker_thread_id)); -} - -void WorkerThreadDispatcher::SendRemoveEventLazyListener( - const std::string& extension_id, - const GURL& scope, - const std::string& event_name) { - io_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&RemoveEventLazyListenerOnIO, extension_id, - scope, event_name)); -} - -void WorkerThreadDispatcher::SendRemoveEventFilteredListener( - const std::string& extension_id, - const GURL& scope, - const std::string& event_name, - int64_t service_worker_version_id, - int worker_thread_id, - base::Value::Dict filter, - bool remove_lazy_listener) { - io_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&RemoveEventFilteredListenerOnIO, extension_id, scope, - event_name, service_worker_version_id, worker_thread_id, - std::move(filter), remove_lazy_listener)); -} - void WorkerThreadDispatcher::OnMessageReceivedOnWorkerThread( int worker_thread_id, const IPC::Message& message) { @@ -377,42 +201,6 @@ return message_filter_->Send(message); } -mojom::EventRouter* WorkerThreadDispatcher::GetEventRouterOnIO() { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - if (!event_router_remote_) { - mojo::PendingAssociatedRemote<mojom::EventRouter> - pending_event_router_remote; - message_filter_->GetRemoteAssociatedInterface(&pending_event_router_remote); - event_router_remote_.Bind(std::move(pending_event_router_remote)); - } - return event_router_remote_.get(); -} - -mojom::ServiceWorkerHost* WorkerThreadDispatcher::GetServiceWorkerHostOnIO() { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - if (!service_worker_host_) { - mojo::PendingAssociatedRemote<mojom::ServiceWorkerHost> - pending_service_worker_host; - message_filter_->GetRemoteAssociatedInterface(&pending_service_worker_host); - service_worker_host_.Bind(std::move(pending_service_worker_host)); - } - return service_worker_host_.get(); -} - -mojom::RendererAutomationRegistry* -WorkerThreadDispatcher::GetAutomationRegistryOnIO() { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - if (!renderer_automation_registry_remote_) { - mojo::PendingAssociatedRemote<mojom::RendererAutomationRegistry> - pending_renderer_automation_registry_remote; - message_filter_->GetRemoteAssociatedInterface( - &pending_renderer_automation_registry_remote); - renderer_automation_registry_remote_.Bind( - std::move(pending_renderer_automation_registry_remote)); - } - return renderer_automation_registry_remote_.get(); -} - void WorkerThreadDispatcher::OnResponseWorker( int worker_thread_id, int request_id, @@ -424,48 +212,6 @@ std::move(response.extra_data)); } -void WorkerThreadDispatcher::DispatchEventHelper( - mojom::DispatchEventParamsPtr params, - base::Value::List event_args) { - DCHECK_EQ(params->worker_thread_id, content::WorkerThread::GetCurrentId()); - - // If the worker state was already destroyed via - // Dispatcher::WillDestroyServiceWorkerContextOnWorkerThread, then - // drop this mojo event. See https://crbug.com/1008143 for details. - if (!service_worker_data) { - return; - } - - ScriptContext* script_context = service_worker_data->context(); - // Note |scoped_extension_interaction| requires a HandleScope. - v8::Isolate* isolate = script_context->isolate(); - v8::HandleScope handle_scope(isolate); - std::unique_ptr<InteractionProvider::Scope> scoped_extension_interaction; - if (params->is_user_gesture) { - scoped_extension_interaction = - ExtensionInteractionProvider::Scope::ForWorker( - script_context->v8_context()); - } - - service_worker_data->bindings_system()->DispatchEventInContext( - params->event_name, event_args, std::move(params->filtering_info), - service_worker_data->context()); - const int worker_thread_id = content::WorkerThread::GetCurrentId(); - Send(new ExtensionHostMsg_EventAckWorker( - service_worker_data->context()->GetExtensionID(), - service_worker_data->service_worker_version_id(), worker_thread_id, - params->event_id)); -} - -void WorkerThreadDispatcher::DispatchEvent(mojom::DispatchEventParamsPtr params, - base::Value::List event_args) { - DCHECK(!worker_thread_util::IsWorkerThread()); - const int worker_thread_id = params->worker_thread_id; - PostTaskToWorkerThread( - worker_thread_id, - base::BindOnce(&WorkerThreadDispatcher::DispatchEventOnWorkerThread, - std::move(params), std::move(event_args))); -} void WorkerThreadDispatcher::OnDispatchOnConnect( int worker_thread_id, const ExtensionMsg_OnConnectData& connect_data) { @@ -514,13 +260,14 @@ } void WorkerThreadDispatcher::AddWorkerData( + blink::WebServiceWorkerContextProxy* proxy, int64_t service_worker_version_id, base::UnguessableToken activation_sequence, ScriptContext* script_context, std::unique_ptr<NativeExtensionBindingsSystem> bindings_system) { if (!service_worker_data) { service_worker_data = new ServiceWorkerData( - service_worker_version_id, std::move(activation_sequence), + proxy, service_worker_version_id, std::move(activation_sequence), script_context, std::move(bindings_system)); } @@ -533,91 +280,6 @@ } } -void WorkerThreadDispatcher::DidInitializeContext( - int64_t service_worker_version_id) { - DCHECK_EQ(service_worker_version_id, - service_worker_data->service_worker_version_id()); - const int thread_id = content::WorkerThread::GetCurrentId(); - DCHECK_NE(thread_id, kMainThreadId); - PostTaskToIOThread(base::BindOnce( - [](const ExtensionId& extension_id, int64_t service_worker_version_id, - int thread_id) { - WorkerThreadDispatcher::Get() - ->GetServiceWorkerHostOnIO() - ->DidInitializeServiceWorkerContext( - extension_id, service_worker_version_id, thread_id, - WorkerThreadDispatcher::Get()->BindEventDispatcher(thread_id)); - }, - service_worker_data->context()->GetExtensionID(), - service_worker_version_id, thread_id)); -} - -void WorkerThreadDispatcher::DidStartContext( - const GURL& service_worker_scope, - int64_t service_worker_version_id) { - DCHECK_EQ(service_worker_version_id, - service_worker_data->service_worker_version_id()); - const int thread_id = content::WorkerThread::GetCurrentId(); - DCHECK_NE(thread_id, kMainThreadId); - PostTaskToIOThread(base::BindOnce( - [](const ExtensionId& extension_id, - const base::UnguessableToken& activation_token, - const GURL& service_worker_scope, int64_t service_worker_version_id, - int thread_id) { - WorkerThreadDispatcher::Get() - ->GetServiceWorkerHostOnIO() - ->DidStartServiceWorkerContext( - extension_id, activation_token, service_worker_scope, - service_worker_version_id, thread_id); - }, - service_worker_data->context()->GetExtensionID(), - service_worker_data->activation_sequence(), service_worker_scope, - service_worker_version_id, thread_id)); -} - -void WorkerThreadDispatcher::DidStopContext(const GURL& service_worker_scope, - int64_t service_worker_version_id) { - const int thread_id = content::WorkerThread::GetCurrentId(); - DCHECK_NE(thread_id, kMainThreadId); - DCHECK_EQ(service_worker_version_id, - service_worker_data->service_worker_version_id()); - PostTaskToIOThread(base::BindOnce( - [](const ExtensionId& extension_id, - const base::UnguessableToken& activation_token, - const GURL& service_worker_scope, int64_t service_worker_version_id, - int thread_id) { - WorkerThreadDispatcher::Get() - ->GetServiceWorkerHostOnIO() - ->DidStopServiceWorkerContext(extension_id, activation_token, - service_worker_scope, - service_worker_version_id, thread_id); - WorkerThreadDispatcher::Get()->UnbindEventDispatcher(thread_id); - }, - service_worker_data->context()->GetExtensionID(), - service_worker_data->activation_sequence(), service_worker_scope, - service_worker_version_id, thread_id)); -} - -void WorkerThreadDispatcher::RequestWorker(mojom::RequestParamsPtr params) { - PostTaskToIOThread(base::BindOnce( - [](mojom::RequestParamsPtr params) { - auto* dispatcher = WorkerThreadDispatcher::Get(); - dispatcher->GetServiceWorkerHostOnIO()->RequestWorker( - std::move(params)); - }, - std::move(params))); -} - -void WorkerThreadDispatcher::SendResponseAck(const base::Uuid& request_uuid) { - PostTaskToIOThread(base::BindOnce( - [](const base::Uuid& request_uuid) { - WorkerThreadDispatcher::Get() - ->GetServiceWorkerHostOnIO() - ->WorkerResponseAck(request_uuid); - }, - request_uuid)); -} - void WorkerThreadDispatcher::RemoveWorkerData( int64_t service_worker_version_id) { if (service_worker_data) { @@ -634,25 +296,4 @@ } } -mojo::PendingAssociatedRemote<mojom::EventDispatcher> -WorkerThreadDispatcher::BindEventDispatcher(int worker_thread_id) { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - mojo::PendingAssociatedRemote<mojom::EventDispatcher> remote; - mojo::ReceiverId receiver_id = - event_dispatchers_.Add(this, remote.InitWithNewEndpointAndPassReceiver()); - event_dispatcher_ids_.insert({worker_thread_id, receiver_id}); - return remote; -} - -void WorkerThreadDispatcher::UnbindEventDispatcher(int worker_thread_id) { - DCHECK(io_task_runner_->BelongsToCurrentThread()); - auto it = event_dispatcher_ids_.find(worker_thread_id); - if (it == event_dispatcher_ids_.end()) { - return; - } - mojo::ReceiverId receiver_id = it->second; - event_dispatchers_.Remove(receiver_id); - event_dispatcher_ids_.erase(receiver_id); -} - } // namespace extensions
diff --git a/extensions/renderer/worker_thread_dispatcher.h b/extensions/renderer/worker_thread_dispatcher.h index 890fb506..3a4eae15 100644 --- a/extensions/renderer/worker_thread_dispatcher.h +++ b/extensions/renderer/worker_thread_dispatcher.h
@@ -16,19 +16,16 @@ #include "content/public/renderer/worker_thread.h" #include "extensions/common/extension_id.h" #include "extensions/common/extension_messages.h" -#include "extensions/common/mojom/automation_registry.mojom.h" -#include "extensions/common/mojom/event_dispatcher.mojom.h" -#include "extensions/common/mojom/event_router.mojom.h" -#include "extensions/common/mojom/service_worker_host.mojom.h" #include "ipc/ipc_sync_message_filter.h" -#include "mojo/public/cpp/bindings/associated_receiver_set.h" -#include "mojo/public/cpp/bindings/associated_remote.h" #include "services/accessibility/public/mojom/automation.mojom.h" namespace base { class SingleThreadTaskRunner; class UnguessableToken; -class Uuid; +} // namespace base + +namespace blink { +class WebServiceWorkerContextProxy; } namespace content { @@ -55,8 +52,7 @@ // worker thread (this TODO formerly referred to content::ThreadSafeSender // which no longer exists). class WorkerThreadDispatcher : public content::RenderThreadObserver, - public IPC::Sender, - public mojom::EventDispatcher { + public IPC::Sender { public: WorkerThreadDispatcher(); @@ -78,25 +74,13 @@ bool Send(IPC::Message* message) override; void AddWorkerData( + blink::WebServiceWorkerContextProxy* proxy, int64_t service_worker_version_id, base::UnguessableToken activation_sequence, ScriptContext* script_context, std::unique_ptr<NativeExtensionBindingsSystem> bindings_system); void RemoveWorkerData(int64_t service_worker_version_id); - // Called when a service worker context was initialized. - void DidInitializeContext(int64_t service_worker_version_id); - - // Called when a service worker context started running. - void DidStartContext(const GURL& service_worker_scope, - int64_t service_worker_version_id); - // Called when a service worker context was destroyed. - void DidStopContext(const GURL& service_worker_scope, - int64_t service_worker_version_id); - - void RequestWorker(mojom::RequestParamsPtr params); - void SendResponseAck(const base::Uuid& request_uuid); - // content::RenderThreadObserver: bool OnControlMessageReceived(const IPC::Message& message) override; @@ -130,11 +114,6 @@ base::Value::Dict filter, bool add_lazy_listener); - // Uses the RendererAutomationRegistry to connect the Automation remote. Uses - // the IO thread to bind the RendererAutomationRegistryRemote, if needed. - void SendBindAutomation( - mojo::PendingAssociatedRemote<ax::mojom::Automation> pending_remote); - // Posts mojom::EventRouter::RemoveListenerForServiceWorker to the IO thread // to call it with GetEventRouterOnIO(). void SendRemoveEventListener(const std::string& extension_id, @@ -158,30 +137,10 @@ int worker_thread_id, base::Value::Dict filter, bool remove_lazy_listener); - - // NOTE: This must be called on the IO thread because it can call - // SyncMessageFilter::GetRemoteAssociatedInterface() which must be called on - // the IO thread. - // TODO(https://crbug.com/1364183): Obtain these interfaces at the worker - // thread once `AssociatedInterfaceRegistry` for ServiceWorker is added. - mojom::EventRouter* GetEventRouterOnIO(); - mojom::ServiceWorkerHost* GetServiceWorkerHostOnIO(); - mojom::RendererAutomationRegistry* GetAutomationRegistryOnIO(); - - mojo::PendingAssociatedRemote<mojom::EventDispatcher> BindEventDispatcher( - int worker_thread_id); - void UnbindEventDispatcher(int worker_thread_id); - - // Mojo interface implementation, called from the main thread. - void DispatchEvent(mojom::DispatchEventParamsPtr params, - base::Value::List event_args) override; - private: static bool HandlesMessageOnWorkerThread(const IPC::Message& message); static void ForwardIPC(int worker_thread_id, const IPC::Message& message); static void UpdateBindingsOnWorkerThread(const ExtensionId& extension_id); - static void DispatchEventOnWorkerThread(mojom::DispatchEventParamsPtr params, - base::Value::List event_args); void OnMessageReceivedOnWorkerThread(int worker_thread_id, const IPC::Message& message); @@ -205,9 +164,6 @@ const PortId& port_id, const std::string& error_message); - void DispatchEventHelper(mojom::DispatchEventParamsPtr params, - base::Value::List event_args); - // IPC sender. Belongs to the render thread, but thread safe. scoped_refptr<IPC::SyncMessageFilter> message_filter_; @@ -215,15 +171,6 @@ IDToTaskRunnerMap task_runner_map_; base::Lock task_runner_map_lock_; scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; - mojo::AssociatedRemote<mojom::EventRouter> event_router_remote_; - mojo::AssociatedRemote<mojom::ServiceWorkerHost> service_worker_host_; - mojo::AssociatedRemote<mojom::RendererAutomationRegistry> - renderer_automation_registry_remote_; - - // The set of receivers for mojom::EventDispatcher. `event_dispatcher_ids` - // keeps track which receiver is associated to the worker thread. - mojo::AssociatedReceiverSet<mojom::EventDispatcher> event_dispatchers_; - std::map<int /*worker_thread_id*/, mojo::ReceiverId> event_dispatcher_ids_; }; } // namespace extensions
diff --git a/extensions/renderer/worker_thread_util.cc b/extensions/renderer/worker_thread_util.cc index a7a58fe4..c29e0d8 100644 --- a/extensions/renderer/worker_thread_util.cc +++ b/extensions/renderer/worker_thread_util.cc
@@ -6,29 +6,21 @@ #include "content/public/renderer/worker_thread.h" #include "extensions/common/constants.h" -#include "third_party/abseil-cpp/absl/base/attributes.h" +#include "extensions/renderer/service_worker_data.h" +#include "extensions/renderer/worker_thread_dispatcher.h" #include "third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h" namespace extensions { namespace worker_thread_util { -namespace { -ABSL_CONST_INIT thread_local blink::WebServiceWorkerContextProxy* - worker_context_proxy = nullptr; -} - bool IsWorkerThread() { return content::WorkerThread::GetCurrentId() != kMainThreadId; } -void SetWorkerContextProxy(blink::WebServiceWorkerContextProxy* context_proxy) { - worker_context_proxy = context_proxy; -} - bool HasWorkerContextProxyInteraction() { DCHECK(IsWorkerThread()); - return worker_context_proxy && - worker_context_proxy->IsWindowInteractionAllowed(); + ServiceWorkerData* data = WorkerThreadDispatcher::GetServiceWorkerData(); + return data && data->worker_context_proxy()->IsWindowInteractionAllowed(); } } // namespace worker_thread_util
diff --git a/extensions/renderer/worker_thread_util.h b/extensions/renderer/worker_thread_util.h index 802d08a..ed0a08db 100644 --- a/extensions/renderer/worker_thread_util.h +++ b/extensions/renderer/worker_thread_util.h
@@ -5,21 +5,12 @@ #ifndef EXTENSIONS_RENDERER_WORKER_THREAD_UTIL_H_ #define EXTENSIONS_RENDERER_WORKER_THREAD_UTIL_H_ -namespace blink { -class WebServiceWorkerContextProxy; -} - namespace extensions { namespace worker_thread_util { // Returns true if the current thread is a worker thread. bool IsWorkerThread(); -// Stores the proxy of Service Worker's global scope for current worker thread. -// -// Valid only on worker thread. -void SetWorkerContextProxy(blink::WebServiceWorkerContextProxy* proxy); - // Returns true if the current Service Worker global scope has an active // interaction. //
diff --git a/extensions/shell/app/shell_main_delegate.cc b/extensions/shell/app/shell_main_delegate.cc index b7f421f..237eafe 100644 --- a/extensions/shell/app/shell_main_delegate.cc +++ b/extensions/shell/app/shell_main_delegate.cc
@@ -42,6 +42,7 @@ #if BUILDFLAG(IS_WIN) #include "base/base_paths_win.h" +#include "base/process/process_info.h" #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) #include "base/nix/xdg_util.h" #elif BUILDFLAG(IS_MAC) @@ -79,17 +80,24 @@ } void InitLogging() { + uint32_t logging_dest = logging::LOG_TO_ALL; base::FilePath log_path; if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kLogFile)) { log_path = base::CommandLine::ForCurrentProcess()->GetSwitchValuePath( switches::kLogFile); +#if BUILDFLAG(IS_WIN) + } else if (base::IsCurrentProcessInAppContainer()) { + // Sandboxed appcontainer processes are unable to resolve the default log + // file path without asserting. + logging_dest = (logging_dest & ~logging::LOG_TO_FILE); +#endif } else { log_path = GetDataPath().Append(FILE_PATH_LITERAL("app_shell.log")); } // Set up log initialization settings. logging::LoggingSettings settings; - settings.logging_dest = logging::LOG_TO_ALL; + settings.logging_dest = logging_dest; settings.log_file_path = log_path.value().c_str(); // Replace the old log file if this is the first process.
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_shared_image.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_shared_image.txt index 9f49e32d..e232090 100644 --- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_shared_image.txt +++ b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_shared_image.txt
@@ -24,6 +24,30 @@ The command + GLuint glTexImage2DSharedImageCHROMIUM (GLunit texture, const GLbyte *mailbox) + + takes two arguments: + + texture - A client-side texture. + mailbox - the mailbox referring to the SharedImage to assign to the + first level of the texture. + + This function maps `texture` to the texture object of the SharedImage + represented by the mailbox and ensures that if `texture` is bound to a + target, the service-side texture gets bound to that target. + + On success, this function extends the lifetime of the SharedImage + referenced by mailbox by taking a ref. The texture object is deleted and + the ref released once the calling context deletes the texture name + associated with the texture object, and detaches it from all framebuffer + objects as well as texture unit bindings. + + INVALID_OPERATION is generated if <mailbox> is not associated with a + texture object. In this case `texture` becomes unbound. It is + treated in the same way as a new texture name returned by GenTextures. + + The command + GLuint glCreateAndTexStorage2DSharedImageCHROMIUM (const GLbyte *mailbox) takes one argument: @@ -113,3 +137,4 @@ 2018-10-31 Added Begin/End calls. 2020-06-21 Added mode SHARED_IMAGE_ACCESS_MODE_OVERLAY_CHROMIUM. 2023-01-18 Removed mode SHARED_IMAGE_ACCESS_MODE_OVERLAY_CHROMIUM. + 2023-09-28 Added glTexImage2DSharedImageCHROMIUM().
diff --git a/gpu/GLES2/gl2chromium_autogen.h b/gpu/GLES2/gl2chromium_autogen.h index 8039194..f8110b26 100644 --- a/gpu/GLES2/gl2chromium_autogen.h +++ b/gpu/GLES2/gl2chromium_autogen.h
@@ -364,6 +364,8 @@ #define glFramebufferTextureMultiviewOVR \ GLES2_GET_FUN(FramebufferTextureMultiviewOVR) #define glMaxShaderCompilerThreadsKHR GLES2_GET_FUN(MaxShaderCompilerThreadsKHR) +#define glTexImage2DSharedImageCHROMIUM \ + GLES2_GET_FUN(TexImage2DSharedImageCHROMIUM) #define glCreateAndTexStorage2DSharedImageCHROMIUM \ GLES2_GET_FUN(CreateAndTexStorage2DSharedImageCHROMIUM) #define glBeginSharedImageAccessDirectCHROMIUM \
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index 75f3851027..98a7e3b4 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -4022,6 +4022,14 @@ 'extension': 'KHRParallelShaderCompile', 'extension_flag': 'khr_parallel_shader_compile', }, + 'TexImage2DSharedImageCHROMIUM': { + 'decoder_func': 'DoTexImage2DSharedImageCHROMIUM', + 'type': 'PUT', + 'extension': "CHROMIUM_shared_image", + 'count': 16, # GL_MAILBOX_SIZE_CHROMIUM + 'unit_test': False, + 'trace_level': 2, + }, 'CreateAndTexStorage2DSharedImageCHROMIUM': { 'type': 'NoCommand', 'extension': "CHROMIUM_shared_image",
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h index 1f6ab68..3225edbf 100644 --- a/gpu/command_buffer/client/gles2_c_lib_autogen.h +++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -1642,6 +1642,10 @@ void GL_APIENTRY GLES2MaxShaderCompilerThreadsKHR(GLuint count) { gles2::GetGLContext()->MaxShaderCompilerThreadsKHR(count); } +void GL_APIENTRY GLES2TexImage2DSharedImageCHROMIUM(GLuint texture, + const GLbyte* mailbox) { + gles2::GetGLContext()->TexImage2DSharedImageCHROMIUM(texture, mailbox); +} GLuint GL_APIENTRY GLES2CreateAndTexStorage2DSharedImageCHROMIUM(const GLbyte* mailbox) { return gles2::GetGLContext()->CreateAndTexStorage2DSharedImageCHROMIUM( @@ -3172,6 +3176,10 @@ reinterpret_cast<GLES2FunctionPointer>(glMaxShaderCompilerThreadsKHR), }, { + "glTexImage2DSharedImageCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glTexImage2DSharedImageCHROMIUM), + }, + { "glCreateAndTexStorage2DSharedImageCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( glCreateAndTexStorage2DSharedImageCHROMIUM),
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h index b29f689..0d77fb57 100644 --- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h +++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -3136,6 +3136,18 @@ } } +void TexImage2DSharedImageCHROMIUMImmediate(GLuint texture, + const GLbyte* mailbox) { + const uint32_t size = + gles2::cmds::TexImage2DSharedImageCHROMIUMImmediate::ComputeSize(); + gles2::cmds::TexImage2DSharedImageCHROMIUMImmediate* c = + GetImmediateCmdSpaceTotalSize< + gles2::cmds::TexImage2DSharedImageCHROMIUMImmediate>(size); + if (c) { + c->Init(texture, mailbox); + } +} + void CreateAndTexStorage2DSharedImageINTERNALImmediate(GLuint texture, const GLbyte* mailbox) { const uint32_t size = gles2::cmds::
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h index 76a2f86..8cf5856 100644 --- a/gpu/command_buffer/client/gles2_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -1155,6 +1155,9 @@ void MaxShaderCompilerThreadsKHR(GLuint count) override; +void TexImage2DSharedImageCHROMIUM(GLuint texture, + const GLbyte* mailbox) override; + GLuint CreateAndTexStorage2DSharedImageCHROMIUM(const GLbyte* mailbox) override; void BeginSharedImageAccessDirectCHROMIUM(GLuint texture, GLenum mode) override;
diff --git a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h index 8a0802c..fded1b1 100644 --- a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
@@ -3486,6 +3486,20 @@ CheckGLError(); } +void GLES2Implementation::TexImage2DSharedImageCHROMIUM(GLuint texture, + const GLbyte* mailbox) { + GPU_CLIENT_SINGLE_THREAD_CHECK(); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexImage2DSharedImageCHROMIUM(" + << texture << ", " << static_cast<const void*>(mailbox) + << ")"); + uint32_t count = 16; + for (uint32_t ii = 0; ii < count; ++ii) { + GPU_CLIENT_LOG("value[" << ii << "]: " << mailbox[ii]); + } + helper_->TexImage2DSharedImageCHROMIUMImmediate(texture, mailbox); + CheckGLError(); +} + void GLES2Implementation::BeginSharedImageAccessDirectCHROMIUM(GLuint texture, GLenum mode) { GPU_CLIENT_SINGLE_THREAD_CHECK();
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h index 15bdb2f9..b84ba28b 100644 --- a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
@@ -2995,6 +2995,22 @@ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } +TEST_F(GLES2ImplementationTest, TexImage2DSharedImageCHROMIUM) { + GLbyte data[16] = {0}; + struct Cmds { + cmds::TexImage2DSharedImageCHROMIUMImmediate cmd; + GLbyte data[16]; + }; + + for (int jj = 0; jj < 16; ++jj) { + data[jj] = static_cast<GLbyte>(jj); + } + Cmds expected; + expected.cmd.Init(1, &data[0]); + gl_->TexImage2DSharedImageCHROMIUM(1, &data[0]); + EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); +} + TEST_F(GLES2ImplementationTest, EndSharedImageAccessDirectCHROMIUM) { struct Cmds { cmds::EndSharedImageAccessDirectCHROMIUM cmd;
diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h index f795056..a389ea0e 100644 --- a/gpu/command_buffer/client/gles2_interface_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_autogen.h
@@ -855,6 +855,8 @@ GLint baseViewIndex, GLsizei numViews) = 0; virtual void MaxShaderCompilerThreadsKHR(GLuint count) = 0; +virtual void TexImage2DSharedImageCHROMIUM(GLuint texture, + const GLbyte* mailbox) = 0; virtual GLuint CreateAndTexStorage2DSharedImageCHROMIUM( const GLbyte* mailbox) = 0; virtual void BeginSharedImageAccessDirectCHROMIUM(GLuint texture,
diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h index ffc468d..512b8ea 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
@@ -829,6 +829,8 @@ GLint baseViewIndex, GLsizei numViews) override; void MaxShaderCompilerThreadsKHR(GLuint count) override; +void TexImage2DSharedImageCHROMIUM(GLuint texture, + const GLbyte* mailbox) override; GLuint CreateAndTexStorage2DSharedImageCHROMIUM(const GLbyte* mailbox) override; void BeginSharedImageAccessDirectCHROMIUM(GLuint texture, GLenum mode) override; void EndSharedImageAccessDirectCHROMIUM(GLuint texture) override;
diff --git a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h index 13ad9a4..fdbde05 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
@@ -1121,6 +1121,9 @@ GLint /* baseViewIndex */, GLsizei /* numViews */) {} void GLES2InterfaceStub::MaxShaderCompilerThreadsKHR(GLuint /* count */) {} +void GLES2InterfaceStub::TexImage2DSharedImageCHROMIUM( + GLuint /* texture */, + const GLbyte* /* mailbox */) {} GLuint GLES2InterfaceStub::CreateAndTexStorage2DSharedImageCHROMIUM( const GLbyte* /* mailbox */) { return 0;
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h index 11ef4a4..4dfd976 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
@@ -829,6 +829,8 @@ GLint baseViewIndex, GLsizei numViews) override; void MaxShaderCompilerThreadsKHR(GLuint count) override; +void TexImage2DSharedImageCHROMIUM(GLuint texture, + const GLbyte* mailbox) override; GLuint CreateAndTexStorage2DSharedImageCHROMIUM(const GLbyte* mailbox) override; void BeginSharedImageAccessDirectCHROMIUM(GLuint texture, GLenum mode) override; void EndSharedImageAccessDirectCHROMIUM(GLuint texture) override;
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h index 55f1a8c..8c7aade 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
@@ -2384,6 +2384,14 @@ gl_->MaxShaderCompilerThreadsKHR(count); } +void GLES2TraceImplementation::TexImage2DSharedImageCHROMIUM( + GLuint texture, + const GLbyte* mailbox) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::TexImage2DSharedImageCHROMIUM"); + gl_->TexImage2DSharedImageCHROMIUM(texture, mailbox); +} + GLuint GLES2TraceImplementation::CreateAndTexStorage2DSharedImageCHROMIUM( const GLbyte* mailbox) { TRACE_EVENT_BINARY_EFFICIENT0(
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h index c336692..29d6796 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -15456,6 +15456,47 @@ static_assert(offsetof(MaxShaderCompilerThreadsKHR, count) == 4, "offset of MaxShaderCompilerThreadsKHR count should be 4"); +struct TexImage2DSharedImageCHROMIUMImmediate { + typedef TexImage2DSharedImageCHROMIUMImmediate ValueType; + static const CommandId kCmdId = kTexImage2DSharedImageCHROMIUMImmediate; + static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(2); + + static uint32_t ComputeDataSize() { + return static_cast<uint32_t>(sizeof(GLbyte) * 16); + } + + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType) + ComputeDataSize()); + } + + void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); } + + void Init(GLuint _texture, const GLbyte* _mailbox) { + SetHeader(); + texture = _texture; + memcpy(ImmediateDataAddress(this), _mailbox, ComputeDataSize()); + } + + void* Set(void* cmd, GLuint _texture, const GLbyte* _mailbox) { + static_cast<ValueType*>(cmd)->Init(_texture, _mailbox); + const uint32_t size = ComputeSize(); + return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); + } + + gpu::CommandHeader header; + uint32_t texture; +}; + +static_assert(sizeof(TexImage2DSharedImageCHROMIUMImmediate) == 8, + "size of TexImage2DSharedImageCHROMIUMImmediate should be 8"); +static_assert( + offsetof(TexImage2DSharedImageCHROMIUMImmediate, header) == 0, + "offset of TexImage2DSharedImageCHROMIUMImmediate header should be 0"); +static_assert( + offsetof(TexImage2DSharedImageCHROMIUMImmediate, texture) == 4, + "offset of TexImage2DSharedImageCHROMIUMImmediate texture should be 4"); + struct CreateAndTexStorage2DSharedImageINTERNALImmediate { typedef CreateAndTexStorage2DSharedImageINTERNALImmediate ValueType; static const CommandId kCmdId =
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h index adb2f4c..78d78dc 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -5111,6 +5111,39 @@ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } +TEST_F(GLES2FormatTest, TexImage2DSharedImageCHROMIUMImmediate) { + const int kSomeBaseValueToTestWith = 51; + static GLbyte data[] = { + static_cast<GLbyte>(kSomeBaseValueToTestWith + 0), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 1), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 2), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 3), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 4), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 5), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 6), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 7), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 8), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 9), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 10), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 11), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 12), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 13), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 14), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 15), + }; + cmds::TexImage2DSharedImageCHROMIUMImmediate& cmd = + *GetBufferAs<cmds::TexImage2DSharedImageCHROMIUMImmediate>(); + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11), data); + EXPECT_EQ(static_cast<uint32_t>( + cmds::TexImage2DSharedImageCHROMIUMImmediate::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)), + cmd.header.size * 4u); + EXPECT_EQ(static_cast<GLuint>(11), cmd.texture); + CheckBytesWrittenMatchesExpectedSize( + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); +} + TEST_F(GLES2FormatTest, CreateAndTexStorage2DSharedImageINTERNALImmediate) { const int kSomeBaseValueToTestWith = 51; static GLbyte data[] = {
diff --git a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h index 534dff0..5408bba 100644 --- a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
@@ -324,39 +324,40 @@ OP(SetReadbackBufferShadowAllocationINTERNAL) /* 565 */ \ OP(FramebufferTextureMultiviewOVR) /* 566 */ \ OP(MaxShaderCompilerThreadsKHR) /* 567 */ \ - OP(CreateAndTexStorage2DSharedImageINTERNALImmediate) /* 568 */ \ - OP(BeginSharedImageAccessDirectCHROMIUM) /* 569 */ \ - OP(EndSharedImageAccessDirectCHROMIUM) /* 570 */ \ - OP(ConvertRGBAToYUVAMailboxesINTERNALImmediate) /* 571 */ \ - OP(ConvertYUVAMailboxesToRGBINTERNALImmediate) /* 572 */ \ - OP(CopySharedImageINTERNALImmediate) /* 573 */ \ - OP(CopySharedImageToTextureINTERNALImmediate) /* 574 */ \ - OP(ReadbackARGBImagePixelsINTERNAL) /* 575 */ \ - OP(WritePixelsYUVINTERNAL) /* 576 */ \ - OP(EnableiOES) /* 577 */ \ - OP(DisableiOES) /* 578 */ \ - OP(BlendEquationiOES) /* 579 */ \ - OP(BlendEquationSeparateiOES) /* 580 */ \ - OP(BlendFunciOES) /* 581 */ \ - OP(BlendFuncSeparateiOES) /* 582 */ \ - OP(ColorMaskiOES) /* 583 */ \ - OP(IsEnablediOES) /* 584 */ \ - OP(ProvokingVertexANGLE) /* 585 */ \ - OP(FramebufferMemorylessPixelLocalStorageANGLE) /* 586 */ \ - OP(FramebufferTexturePixelLocalStorageANGLE) /* 587 */ \ - OP(FramebufferPixelLocalClearValuefvANGLEImmediate) /* 588 */ \ - OP(FramebufferPixelLocalClearValueivANGLEImmediate) /* 589 */ \ - OP(FramebufferPixelLocalClearValueuivANGLEImmediate) /* 590 */ \ - OP(BeginPixelLocalStorageANGLEImmediate) /* 591 */ \ - OP(EndPixelLocalStorageANGLEImmediate) /* 592 */ \ - OP(PixelLocalStorageBarrierANGLE) /* 593 */ \ - OP(FramebufferPixelLocalStorageInterruptANGLE) /* 594 */ \ - OP(FramebufferPixelLocalStorageRestoreANGLE) /* 595 */ \ - OP(GetFramebufferPixelLocalStorageParameterfvANGLE) /* 596 */ \ - OP(GetFramebufferPixelLocalStorageParameterivANGLE) /* 597 */ \ - OP(ClipControlEXT) /* 598 */ \ - OP(PolygonModeANGLE) /* 599 */ \ - OP(PolygonOffsetClampEXT) /* 600 */ + OP(TexImage2DSharedImageCHROMIUMImmediate) /* 568 */ \ + OP(CreateAndTexStorage2DSharedImageINTERNALImmediate) /* 569 */ \ + OP(BeginSharedImageAccessDirectCHROMIUM) /* 570 */ \ + OP(EndSharedImageAccessDirectCHROMIUM) /* 571 */ \ + OP(ConvertRGBAToYUVAMailboxesINTERNALImmediate) /* 572 */ \ + OP(ConvertYUVAMailboxesToRGBINTERNALImmediate) /* 573 */ \ + OP(CopySharedImageINTERNALImmediate) /* 574 */ \ + OP(CopySharedImageToTextureINTERNALImmediate) /* 575 */ \ + OP(ReadbackARGBImagePixelsINTERNAL) /* 576 */ \ + OP(WritePixelsYUVINTERNAL) /* 577 */ \ + OP(EnableiOES) /* 578 */ \ + OP(DisableiOES) /* 579 */ \ + OP(BlendEquationiOES) /* 580 */ \ + OP(BlendEquationSeparateiOES) /* 581 */ \ + OP(BlendFunciOES) /* 582 */ \ + OP(BlendFuncSeparateiOES) /* 583 */ \ + OP(ColorMaskiOES) /* 584 */ \ + OP(IsEnablediOES) /* 585 */ \ + OP(ProvokingVertexANGLE) /* 586 */ \ + OP(FramebufferMemorylessPixelLocalStorageANGLE) /* 587 */ \ + OP(FramebufferTexturePixelLocalStorageANGLE) /* 588 */ \ + OP(FramebufferPixelLocalClearValuefvANGLEImmediate) /* 589 */ \ + OP(FramebufferPixelLocalClearValueivANGLEImmediate) /* 590 */ \ + OP(FramebufferPixelLocalClearValueuivANGLEImmediate) /* 591 */ \ + OP(BeginPixelLocalStorageANGLEImmediate) /* 592 */ \ + OP(EndPixelLocalStorageANGLEImmediate) /* 593 */ \ + OP(PixelLocalStorageBarrierANGLE) /* 594 */ \ + OP(FramebufferPixelLocalStorageInterruptANGLE) /* 595 */ \ + OP(FramebufferPixelLocalStorageRestoreANGLE) /* 596 */ \ + OP(GetFramebufferPixelLocalStorageParameterfvANGLE) /* 597 */ \ + OP(GetFramebufferPixelLocalStorageParameterivANGLE) /* 598 */ \ + OP(ClipControlEXT) /* 599 */ \ + OP(PolygonModeANGLE) /* 600 */ \ + OP(PolygonOffsetClampEXT) /* 601 */ enum CommandId { kOneBeforeStartPoint =
diff --git a/gpu/command_buffer/gles2_cmd_buffer_functions.txt b/gpu/command_buffer/gles2_cmd_buffer_functions.txt index 22fc9f1..4abacf1 100644 --- a/gpu/command_buffer/gles2_cmd_buffer_functions.txt +++ b/gpu/command_buffer/gles2_cmd_buffer_functions.txt
@@ -374,6 +374,7 @@ GL_APICALL void GL_APIENTRY glMaxShaderCompilerThreadsKHR (GLuint count); // Extension CHROMIUM_shared_image +GL_APICALL void GL_APIENTRY glTexImage2DSharedImageCHROMIUM (GLuint texture, const GLbyte* mailbox); GL_APICALL GLuint GL_APIENTRY glCreateAndTexStorage2DSharedImageCHROMIUM (const GLbyte* mailbox); GL_APICALL void GL_APIENTRY glCreateAndTexStorage2DSharedImageINTERNAL (GLuint texture, const GLbyte* mailbox); GL_APICALL void GL_APIENTRY glBeginSharedImageAccessDirectCHROMIUM (GLuint texture, GLenumSharedImageAccessMode mode);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index c02eaf6..24a67ab 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -1115,6 +1115,8 @@ void DoCreateAndConsumeTextureINTERNAL(GLuint client_id, const volatile GLbyte* key); + void DoTexImage2DSharedImageCHROMIUM(GLuint client_id, + const volatile GLbyte* mailbox); void DoCreateAndTexStorage2DSharedImageINTERNAL( GLuint client_id, const volatile GLbyte* mailbox); @@ -17122,6 +17124,13 @@ texture_ref = texture_manager()->Consume(client_id, texture); } +void GLES2DecoderImpl::DoTexImage2DSharedImageCHROMIUM( + GLuint client_id, + const volatile GLbyte* mailbox_data) { + // TODO(crbug.com/1410164): Implement. + NOTREACHED(); +} + void GLES2DecoderImpl::DoCreateAndTexStorage2DSharedImageINTERNAL( GLuint client_id, const volatile GLbyte* mailbox_data) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h index ce0b197..9fd2982 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -5243,6 +5243,30 @@ return error::kNoError; } +error::Error GLES2DecoderImpl::HandleTexImage2DSharedImageCHROMIUMImmediate( + uint32_t immediate_data_size, + const volatile void* cmd_data) { + const volatile gles2::cmds::TexImage2DSharedImageCHROMIUMImmediate& c = + *static_cast< + const volatile gles2::cmds::TexImage2DSharedImageCHROMIUMImmediate*>( + cmd_data); + GLuint texture = static_cast<GLuint>(c.texture); + uint32_t mailbox_size; + if (!GLES2Util::ComputeDataSize<GLbyte, 16>(1, &mailbox_size)) { + return error::kOutOfBounds; + } + if (mailbox_size > immediate_data_size) { + return error::kOutOfBounds; + } + volatile const GLbyte* mailbox = GetImmediateDataAs<volatile const GLbyte*>( + c, mailbox_size, immediate_data_size); + if (mailbox == nullptr) { + return error::kOutOfBounds; + } + DoTexImage2DSharedImageCHROMIUM(texture, mailbox); + return error::kNoError; +} + error::Error GLES2DecoderImpl::HandleCreateAndTexStorage2DSharedImageINTERNALImmediate( uint32_t immediate_data_size,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h index 869a85d..193a2f5 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h
@@ -1049,6 +1049,8 @@ ServiceDiscardableHandle&& discardable_handle); error::Error DoUnlockDiscardableTextureCHROMIUM(GLuint texture_id); error::Error DoLockDiscardableTextureCHROMIUM(GLuint texture_id); +error::Error DoTexImage2DSharedImageCHROMIUM(GLuint client_id, + const volatile GLbyte* mailbox); error::Error DoCreateAndTexStorage2DSharedImageINTERNAL( GLuint client_id, const volatile GLbyte* mailbox);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc index 4d2a8d7..d1955c5 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
@@ -5156,6 +5156,48 @@ return error::kNoError; } +error::Error GLES2DecoderPassthroughImpl::DoTexImage2DSharedImageCHROMIUM( + GLuint texture_client_id, + const volatile GLbyte* mailbox) { + if (!texture_client_id) { + InsertError(GL_INVALID_OPERATION, "invalid client ID"); + return error::kNoError; + } + + const Mailbox& mb = Mailbox::FromVolatile( + *reinterpret_cast<const volatile Mailbox*>(mailbox)); + auto shared_image = group_->shared_image_representation_factory() + ->ProduceGLTexturePassthrough(mb); + if (shared_image == nullptr) { + InsertError(GL_INVALID_OPERATION, "invalid mailbox name."); + DoGenTextures(1, &texture_client_id); + return error::kNoError; + } + + auto texture = shared_image->GetTexturePassthrough(); + if (texture->target() != GL_TEXTURE_2D) { + InsertError(GL_INVALID_OPERATION, "invalid texture target."); + return error::kNoError; + } + + // Map `client_id` to the SharedImage's texture. + resources_->texture_id_map.RemoveClientID(texture_client_id); + resources_->texture_id_map.SetIDMapping(texture_client_id, + texture->service_id()); + resources_->texture_object_map.RemoveClientID(texture_client_id); + resources_->texture_object_map.SetIDMapping(texture_client_id, texture); + resources_->texture_shared_image_map[texture_client_id] = + PassthroughResources::SharedImageData(this, std::move(shared_image)); + + // If the client has bound `client_texture_id`, the binding was done when + // `client_texture_id` did not necessarily map to `texture->service_id()`. + // Update any such binding so that `texture->service_id()` (which + // `texture_client_id` now maps to) is bound. + UpdateTextureBinding(texture->target(), texture_client_id, nullptr); + + return error::kNoError; +} + error::Error GLES2DecoderPassthroughImpl::DoCreateAndTexStorage2DSharedImageINTERNAL( GLuint texture_client_id,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc index 2f8daaf..f406e66d 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
@@ -4521,6 +4521,34 @@ return error::kNoError; } +error::Error +GLES2DecoderPassthroughImpl::HandleTexImage2DSharedImageCHROMIUMImmediate( + uint32_t immediate_data_size, + const volatile void* cmd_data) { + const volatile gles2::cmds::TexImage2DSharedImageCHROMIUMImmediate& c = + *static_cast< + const volatile gles2::cmds::TexImage2DSharedImageCHROMIUMImmediate*>( + cmd_data); + GLuint texture = static_cast<GLuint>(c.texture); + uint32_t mailbox_size; + if (!GLES2Util::ComputeDataSize<GLbyte, 16>(1, &mailbox_size)) { + return error::kOutOfBounds; + } + if (mailbox_size > immediate_data_size) { + return error::kOutOfBounds; + } + volatile const GLbyte* mailbox = GetImmediateDataAs<volatile const GLbyte*>( + c, mailbox_size, immediate_data_size); + if (mailbox == nullptr) { + return error::kOutOfBounds; + } + error::Error error = DoTexImage2DSharedImageCHROMIUM(texture, mailbox); + if (error != error::kNoError) { + return error; + } + return error::kNoError; +} + error::Error GLES2DecoderPassthroughImpl:: HandleCreateAndTexStorage2DSharedImageINTERNALImmediate( uint32_t immediate_data_size,
diff --git a/gpu/command_buffer/service/shared_context_state.cc b/gpu/command_buffer/service/shared_context_state.cc index fb24062..247a340 100644 --- a/gpu/command_buffer/service/shared_context_state.cc +++ b/gpu/command_buffer/service/shared_context_state.cc
@@ -28,6 +28,7 @@ #include "gpu/vulkan/buildflags.h" #include "skia/buildflags.h" #include "third_party/skia/include/gpu/GrTypes.h" +#include "third_party/skia/include/gpu/ganesh/gl/GrGLDirectContext.h" #include "third_party/skia/include/gpu/graphite/Context.h" #include "third_party/skia/include/gpu/mock/GrMockTypes.h" #include "ui/gl/gl_bindings.h" @@ -369,7 +370,7 @@ DCHECK(owned_gr_context_); } else { owned_gr_context_ = - GrDirectContext::MakeGL(std::move(gr_gl_interface), options); + GrDirectContexts::MakeGL(std::move(gr_gl_interface), options); } gr_context_ = owned_gr_context_.get();
diff --git a/gpu/command_buffer/service/shared_image/dawn_image_representation_unittest_common.cc b/gpu/command_buffer/service/shared_image/dawn_image_representation_unittest_common.cc index b496027..6970f7e 100644 --- a/gpu/command_buffer/service/shared_image/dawn_image_representation_unittest_common.cc +++ b/gpu/command_buffer/service/shared_image/dawn_image_representation_unittest_common.cc
@@ -11,6 +11,28 @@ namespace { constexpr size_t kBufferSizeMinAlignment = 256; +void CopyTexelToBuffer(const wgpu::CommandEncoder& encoder, + const wgpu::Texture& texture, + uint32_t x, + uint32_t y, + const wgpu::Buffer& buffer) { + wgpu::ImageCopyBuffer buffer_copy; + buffer_copy.buffer = buffer; + buffer_copy.layout = + wgpu::TextureDataLayout{.bytesPerRow = kBufferSizeMinAlignment}; + + wgpu::ImageCopyTexture texture_copy; + texture_copy.texture = texture; + texture_copy.mipLevel = 0; + texture_copy.origin = wgpu::Origin3D{.x = x, .y = y, .z = 0}; + + wgpu::Extent3D extend = {1, 1, 1}; + + encoder.CopyTextureToBuffer(&texture_copy, &buffer_copy, &extend); +} + +} // namespace + wgpu::ShaderModule CreateShaderModule(const wgpu::Device& device, const char* source) { wgpu::ShaderModuleWGSLDescriptor wgsl_desc; @@ -84,28 +106,6 @@ return texture.CreateView(&descriptor); } -void CopyTexelToBuffer(const wgpu::CommandEncoder& encoder, - const wgpu::Texture& texture, - uint32_t x, - uint32_t y, - const wgpu::Buffer& buffer) { - wgpu::ImageCopyBuffer buffer_copy; - buffer_copy.buffer = buffer; - buffer_copy.layout = - wgpu::TextureDataLayout{.bytesPerRow = kBufferSizeMinAlignment}; - - wgpu::ImageCopyTexture texture_copy; - texture_copy.texture = texture; - texture_copy.mipLevel = 0; - texture_copy.origin = wgpu::Origin3D{.x = x, .y = y, .z = 0}; - - wgpu::Extent3D extend = {1, 1, 1}; - - encoder.CopyTextureToBuffer(&texture_copy, &buffer_copy, &extend); -} - -} // namespace - void RunDawnVideoSamplingTest( wgpu::Device device, const std::unique_ptr<DawnImageRepresentation>& shared_image,
diff --git a/gpu/command_buffer/service/shared_image/dawn_image_representation_unittest_common.h b/gpu/command_buffer/service/shared_image/dawn_image_representation_unittest_common.h index ec9eea85..de7646e 100644 --- a/gpu/command_buffer/service/shared_image/dawn_image_representation_unittest_common.h +++ b/gpu/command_buffer/service/shared_image/dawn_image_representation_unittest_common.h
@@ -14,6 +14,27 @@ uint8_t expected_y_value, uint8_t expected_u_value, uint8_t expected_v_value); -} +wgpu::ShaderModule CreateShaderModule(const wgpu::Device& device, + const char* source); + +wgpu::RenderPipeline CreateRenderPipeline( + const wgpu::Device& device, + wgpu::ShaderModule vs_module, + wgpu::ShaderModule fs_module, + wgpu::TextureFormat render_pass_color_format); + +wgpu::Buffer CreateBuffer(const wgpu::Device& device, + uint32_t size, + wgpu::BufferUsage usage); + +wgpu::Texture CreateTexture(const wgpu::Device& device, + uint32_t width, + uint32_t height, + wgpu::TextureUsage usage, + wgpu::TextureFormat format); + +wgpu::TextureView CreateTextureView(const wgpu::Texture& texture, + wgpu::TextureAspect aspect); +} // namespace gpu #endif
diff --git a/gpu/command_buffer/service/shared_image/egl_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/egl_image_backing_factory_unittest.cc index c053c19..b494a23 100644 --- a/gpu/command_buffer/service/shared_image/egl_image_backing_factory_unittest.cc +++ b/gpu/command_buffer/service/shared_image/egl_image_backing_factory_unittest.cc
@@ -122,8 +122,9 @@ } void SetUp() override { - if (!IsEglImageSupported()) - return; + if (!IsEglImageSupported()) { + GTEST_SKIP(); + } #if BUILDFLAG(IS_ANDROID) auto* command_line = base::CommandLine::ForCurrentProcess(); @@ -255,9 +256,6 @@ // Intent of this test is to create at thread safe backing and test if all // representations are working. TEST_P(EGLImageBackingFactoryThreadSafeTest, BasicThreadSafe) { - if (!IsEglImageSupported()) - return; - CreateAndValidateSharedImageRepresentations shared_image( backing_factory_.get(), get_format(), /*is_thread_safe=*/true, &mailbox_manager_, shared_image_manager_.get(), @@ -268,9 +266,6 @@ // Intent of this test is to create at thread safe backing with initial pixel // data and test if all representations are working. TEST_P(EGLImageBackingFactoryThreadSafeTest, BasicInitialData) { - if (!IsEglImageSupported()) - return; - CreateAndValidateSharedImageRepresentations shared_image( backing_factory_.get(), get_format(), /*is_thread_safe=*/true, &mailbox_manager_, shared_image_manager_.get(), @@ -283,9 +278,6 @@ // group. One thread will be writing to the backing and other thread will be // reading from it. TEST_P(EGLImageBackingFactoryThreadSafeTest, OneWriterOneReader) { - if (!IsEglImageSupported()) - return; - // Create it on 1st SharedContextState |context_state_|. CreateAndValidateSharedImageRepresentations shared_image( backing_factory_.get(), get_format(), /*is_thread_safe=*/true, @@ -360,10 +352,6 @@ #if BUILDFLAG(USE_DAWN) && BUILDFLAG(DAWN_ENABLE_BACKEND_OPENGLES) // Test to check interaction between Dawn and skia GL representations. TEST_F(EGLImageBackingFactoryThreadSafeTest, Dawn_SkiaGL) { - if (!IsEglImageSupported()) { - return; - } - // Create a Dawm OpenGLES device. dawn::native::Instance instance; instance.DiscoverDefaultPhysicalDevices();
diff --git a/gpu/ipc/service/gles2_command_buffer_stub.cc b/gpu/ipc/service/gles2_command_buffer_stub.cc index c1b54d0..d2de174 100644 --- a/gpu/ipc/service/gles2_command_buffer_stub.cc +++ b/gpu/ipc/service/gles2_command_buffer_stub.cc
@@ -229,6 +229,8 @@ display = keyed_display; } + manager->delegate()->UpdateGPUInfoGL(display); + if (offscreen) { if (!surface_format.IsCompatible(default_surface->GetFormat())) { DVLOG(1) << __FUNCTION__ << ": Hit the OwnOffscreenSurface path";
diff --git a/gpu/ipc/service/gpu_channel_manager_delegate.h b/gpu/ipc/service/gpu_channel_manager_delegate.h index 6612178a..dc7df6b 100644 --- a/gpu/ipc/service/gpu_channel_manager_delegate.h +++ b/gpu/ipc/service/gpu_channel_manager_delegate.h
@@ -80,6 +80,14 @@ // Returns GPU Scheduler virtual gpu::Scheduler* GetGpuScheduler() = 0; + // Tells a delegate to collect GPUInfo and notify all listeners once it has + // been updated. + virtual void UpdateGPUInfo() = 0; + + // Tells a delegate to collect GPUInfo from GL calls on the current context + // and notify all listeners once it has been updated. + virtual void UpdateGPUInfoGL(gl::GLDisplay* display) = 0; + protected: virtual ~GpuChannelManagerDelegate() = default; };
diff --git a/gpu/ipc/service/gpu_channel_test_common.cc b/gpu/ipc/service/gpu_channel_test_common.cc index 960ff8f..5ba13a6f 100644 --- a/gpu/ipc/service/gpu_channel_test_common.cc +++ b/gpu/ipc/service/gpu_channel_test_common.cc
@@ -74,6 +74,9 @@ Scheduler* GetGpuScheduler() override { return scheduler_; } + void UpdateGPUInfo() override {} + void UpdateGPUInfoGL(gl::GLDisplay* display) override {} + private: bool is_exiting_ = false; const raw_ptr<Scheduler> scheduler_;
diff --git a/gpu/skia_bindings/grcontext_for_gles2_interface.cc b/gpu/skia_bindings/grcontext_for_gles2_interface.cc index 97aace23..3b9185c7f 100644 --- a/gpu/skia_bindings/grcontext_for_gles2_interface.cc +++ b/gpu/skia_bindings/grcontext_for_gles2_interface.cc
@@ -17,6 +17,7 @@ #include "gpu/skia_bindings/gles2_implementation_with_grcontext_support.h" #include "third_party/skia/include/gpu/GrContextOptions.h" #include "third_party/skia/include/gpu/GrDirectContext.h" +#include "third_party/skia/include/gpu/ganesh/gl/GrGLDirectContext.h" #include "third_party/skia/include/gpu/gl/GrGLInterface.h" namespace skia_bindings { @@ -40,7 +41,7 @@ options.fSupportBilerpFromGlyphAtlas = support_bilerp_from_flyph_atlas; sk_sp<GrGLInterface> interface( skia_bindings::CreateGLES2InterfaceBindings(gl, context_support)); - gr_context_ = GrDirectContext::MakeGL(std::move(interface), options); + gr_context_ = GrDirectContexts::MakeGL(std::move(interface), options); if (gr_context_) { gr_context_->setResourceCacheLimit(max_resource_cache_bytes); context_support_->SetGrContext(gr_context_.get());
diff --git a/infra/config/generated/luci/luci-notify.cfg b/infra/config/generated/luci/luci-notify.cfg index f7dbaccc..84cd937c 100644 --- a/infra/config/generated/luci/luci-notify.cfg +++ b/infra/config/generated/luci/luci-notify.cfg
@@ -117,25 +117,6 @@ } template: "tree_closure_email_template" } - builders { - bucket: "ci" - name: "Android ASAN (dbg)" - repository: "https://chromium.googlesource.com/chromium/src" - } - tree_closers { - tree_status_host: "chromium-status.appspot.com" - failed_step_regexp: "\\b(bot_update|compile|gclient runhooks|runhooks|update|\\w*nocompile_test)\\b" - } -} -notifiers { - notifications { - on_occurrence: FAILURE - failed_step_regexp: "\\b(bot_update|compile|gclient runhooks|runhooks|update|\\w*nocompile_test)\\b" - email { - rotation_urls: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-build-sheriff" - } - template: "tree_closure_email_template" - } notifications { on_occurrence: FAILURE failed_step_regexp: "\\b(bot_update|compile|gclient runhooks|runhooks|update|\\w*nocompile_test)\\b"
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star index e18c268..ac81c42 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -65,7 +65,8 @@ ), builderless = False, cores = None, - tree_closing = True, + # TODO(crbug.com/1486663): Restore tree-closing when bot is fixed. + # tree_closing = True, console_view_entry = consoles.console_view_entry( category = "builder|arm", short_name = "san",
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn index c480146..afb2435 100644 --- a/ios/chrome/app/BUILD.gn +++ b/ios/chrome/app/BUILD.gn
@@ -212,7 +212,7 @@ "//ios/chrome/browser/passwords:store_factory", "//ios/chrome/browser/shared/coordinator/scene:scene_state_header", "//ios/chrome/browser/shared/model/browser_state", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/common/app_group", "//ios/chrome/common/credential_provider", ] @@ -514,7 +514,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", "//ios/chrome/browser/snapshots", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/appearance", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/download",
diff --git a/ios/chrome/app/credential_provider_migrator_app_agent.mm b/ios/chrome/app/credential_provider_migrator_app_agent.mm index a604002..21740ef 100644 --- a/ios/chrome/app/credential_provider_migrator_app_agent.mm +++ b/ios/chrome/app/credential_provider_migrator_app_agent.mm
@@ -16,7 +16,7 @@ #import "ios/chrome/browser/shared/model/browser/browser_provider.h" #import "ios/chrome/browser/shared/model/browser/browser_provider_interface.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/common/app_group/app_group_constants.h" #import "ios/chrome/common/credential_provider/constants.h"
diff --git a/ios/chrome/app/main_application_delegate.mm b/ios/chrome/app/main_application_delegate.mm index b2820ce..20d9ba4 100644 --- a/ios/chrome/app/main_application_delegate.mm +++ b/ios/chrome/app/main_application_delegate.mm
@@ -86,9 +86,6 @@ [[AppState alloc] initWithStartupInformation:_startupInformation]; _pushNotificationDelegate = [[PushNotificationDelegate alloc] initWithAppState:_appState]; - // TODO:(crbug.com/1487183) Move APNS device registration further down - // startup sequence. - [PushNotificationUtil registerDeviceWithAPNS]; [_mainController setAppState:_appState]; } return self; @@ -370,6 +367,10 @@ } }); + if (_startupInformation.isColdStart) { + [PushNotificationUtil registerDeviceWithAPNS]; + } + [_appState applicationWillEnterForeground:UIApplication.sharedApplication metricsMediator:_metricsMediator memoryHelper:_memoryHelper];
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm index 0aa81d61..4831a86 100644 --- a/ios/chrome/app/main_controller.mm +++ b/ios/chrome/app/main_controller.mm
@@ -110,7 +110,7 @@ #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/snapshots/snapshot_browser_agent.h" #import "ios/chrome/browser/snapshots/snapshot_storage.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/appearance/appearance_customization.h" #import "ios/chrome/browser/ui/first_run/first_run_util.h" #import "ios/chrome/browser/ui/main/browser_view_wrangler.h"
diff --git a/ios/chrome/app/resources/chrome_localize_strings_config.plist b/ios/chrome/app/resources/chrome_localize_strings_config.plist index 3e74899..4910e3e 100644 --- a/ios/chrome/app/resources/chrome_localize_strings_config.plist +++ b/ios/chrome/app/resources/chrome_localize_strings_config.plist
@@ -66,26 +66,32 @@ <key>strings</key> <array> <dict> + <key>output</key> + <string>eoLMs3</string> + <key>input</key> + <string>IDS_IOS_INTENTS_OPEN_LATEST_TAB_TITLE</string> + </dict> + <dict> <key>output</key> <string>QI9R4N</string> <key>input</key> <string>IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_TITLE</string> </dict> <dict> - <key>output</key> + <key>output</key> <string>6yFN6Z</string> <key>input</key> <string>IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_TITLE</string> </dict> <dict> <key>output</key> - <string>lfVwmu</string> + <string>G5abvV</string> <key>input</key> - <string>IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_DESCRIPTION</string> + <string>IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_TITLE</string> </dict> <dict> <key>output</key> - <string>G5abvV</string> + <string>QNOy9O</string> <key>input</key> <string>IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_DESCRIPTION</string> </dict> @@ -93,17 +99,17 @@ <key>output</key> <string>O7udUr</string> <key>input</key> - <string>IDS_IOS_INTENTS_OPEN_LENS_DESCRIPTION</string> + <string>IDS_IOS_INTENTS_OPEN_LENS_TITLE</string> </dict> <dict> <key>output</key> - <string>IBwb6d</string> + <string>M0ARnB</string> <key>input</key> <string>IDS_IOS_INTENTS_OPEN_LENS_DESCRIPTION</string> </dict> <dict> <key>output</key> - <string>pe1BPb</string> + <string>IBwb6d</string> <key>input</key> <string>IDS_IOS_INTENTS_OPEN_LENS_TITLE</string> </dict> @@ -115,7 +121,7 @@ </dict> <dict> <key>output</key> - <string>k6vkhf</string> + <string>Evtnyl</string> <key>input</key> <string>IDS_IOS_INTENTS_OPEN_LATEST_TAB_DESCRIPTION</string> </dict>
diff --git a/ios/chrome/app/spotlight/BUILD.gn b/ios/chrome/app/spotlight/BUILD.gn index 36a043f6..338421e4 100644 --- a/ios/chrome/app/spotlight/BUILD.gn +++ b/ios/chrome/app/spotlight/BUILD.gn
@@ -53,7 +53,7 @@ "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/shared/public/features:system_flags", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/content_suggestions", "//ios/chrome/browser/ui/lens:lens_availability", "//ios/chrome/browser/ui/lens:lens_entrypoint",
diff --git a/ios/chrome/app/spotlight/topsites_spotlight_manager.mm b/ios/chrome/app/spotlight/topsites_spotlight_manager.mm index 34a5ab1..422ac13 100644 --- a/ios/chrome/app/spotlight/topsites_spotlight_manager.mm +++ b/ios/chrome/app/spotlight/topsites_spotlight_manager.mm
@@ -20,8 +20,8 @@ #import "ios/chrome/browser/bookmarks/model/local_or_syncable_bookmark_model_factory.h" #import "ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h" #import "ios/chrome/browser/history/top_sites_factory.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h" class SpotlightTopSitesBridge;
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 76c049a..26cdb459 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -2197,6 +2197,9 @@ <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_UNTRACKED_SUBTITLE" desc="Text for the subtitle string of the infobar that is displayed after a package is untracked."> This package has been successfully untracked. </message> + <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING" desc="Text for the button that allows the user to enable parcel tracking."> + Enable Tracking + </message> <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_PRIMARY_ACTION" desc="Text for the primary action string of the parcel tracking opt-in half-sheet screen."> Always Track Detected Packages </message> @@ -2227,9 +2230,6 @@ <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_PASSWORD" desc="The action button to use the selected credentials to fill the username and password fields on the webpage."> Use Password </message> - <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_THANKS" desc="The action button to dismiss the password bottom sheet and revert to using the keyboard to fill in username and password information on the webpage."> - No Thanks - </message> <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_USERNAME" desc="Text shown for an option in a list of the user's saved passwords, when the user did not save a username along with the password."> No Username •••••••• </message> @@ -2239,15 +2239,15 @@ <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_SHOW_DETAILS" desc="The password bottom sheet's long press menu item to open the password details page, which displays more information, like username, password and associated website."> Show Details </message> + <message name="IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_KEYBOARD" desc="The action button to dismiss the password bottom sheet and revert to using the keyboard to fill in username and password information on the webpage."> + Use Keyboard + </message> <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_CONTINUE" desc="The action button to use the selected credit card to fill the payment fields on the webpage."> Continue </message> <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_MANAGE_PAYMENT_METHODS" desc="The payment bottom sheet's long press menu item to open all payment methods view."> Manage Payment Methods </message> - <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_NO_THANKS" desc="The action button to dismiss the payment bottom sheet and return to the webpage without autofilling a credit card." meaning="A button to cancel the filling of a credit card info and dismiss the payment bottom sheet."> - No Thanks - </message> <message name="IDS_IOS_PAYMENT_BOTTOM_SHEET_SHOW_DETAILS" desc="The payment bottom sheet's long press menu item to open the credit card details view."> Show Details </message> @@ -3138,6 +3138,9 @@ <message name="IDS_IOS_PASSWORD_SHARING_PASSWORD_PICKER_NEXT_BUTTON" desc="Button text for the confirm action in the password picker view in the password sharing flow. [iOS only]"> Next </message> + <message name="IDS_IOS_PASSWORD_SHARING_STATUS_PROGRESS_TITLE" desc="Title text on the sharing status view when it is in progress. [iOS only]"> + Sharing Password + </message> <message name="IDS_IOS_PASSWORD_SHARING_TITLE" desc="Title of the password sharing bottom sheet view. [iOS only]"> Share Password </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING.png.sha1 new file mode 100644 index 0000000..8eb2cfe --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING.png.sha1
@@ -0,0 +1 @@ +d718177ba9eae68d47682fa410192a8fcda37a82 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_THANKS.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_THANKS.png.sha1 deleted file mode 100644 index 2d77e9b..0000000 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_THANKS.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -f5c7adb35bc47cdb8f1f12b49a8fa4ec5760d3ed \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_KEYBOARD.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_KEYBOARD.png.sha1 new file mode 100644 index 0000000..fedefb97 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_KEYBOARD.png.sha1
@@ -0,0 +1 @@ +9e4c3e6f2a397cef3d67606d8fdeeea6d780f8d7 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_STATUS_PROGRESS_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_STATUS_PROGRESS_TITLE.png.sha1 new file mode 100644 index 0000000..89dae91 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_STATUS_PROGRESS_TITLE.png.sha1
@@ -0,0 +1 @@ +25938299f1a085915579d3cb4b059bcb2998376b \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PAYMENT_BOTTOM_SHEET_NO_THANKS.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PAYMENT_BOTTOM_SHEET_NO_THANKS.png.sha1 deleted file mode 100644 index 24618776..0000000 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PAYMENT_BOTTOM_SHEET_NO_THANKS.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -308b916a0ba53e874bbab0b05a55dd43ade64a21 \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb index 5679769..38820b08 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
@@ -4,6 +4,7 @@ <translation id="1046370274005147998">Chromium में बोलकर खोजें.</translation> <translation id="1047130070405668746">Chromium चुनें</translation> <translation id="1091252999271033193">इसका मतलब है कि Chromium हर बार, साइट के मोबाइल वर्शन का अनुरोध करेगा.</translation> +<translation id="1171824629317156389">iOS पर Chromium Settings खोलें. इसके बाद, "Default Browser App" पर टैप करें और Chromium चुनें.</translation> <translation id="1185134272377778587">क्रोमियम के बारे में</translation> <translation id="1257458525759135959">इमेज सेव करने के लिए, सेटिंग पर टैप करके क्रोमियम को अनुमति दें कि वह आपके फ़ोटो सेक्शन में इमेज जोड़ सके.</translation> <translation id="1289216811211435351">Chromium पर स्विच करें</translation> @@ -50,6 +51,7 @@ <translation id="2915596697727466327">आपके पासवर्ड का अधिकृत ऐक्सेस पक्का करने के लिए, क्रोमियम 'फ़ेस आईडी' यानी चेहरा पहचान का इस्तेमाल करता है.</translation> <translation id="2918709798697875261">आपके संगठन के लिए यह ज़रूरी है कि आप Chromium से साइन आउट रहें.</translation> <translation id="2942241131342758843">लिंक खोलने, विजेट से खोजने, और अन्य ऐप्लिकेशन में पासवर्ड ऑटोमैटिक भरने के लिए, Chromium को डिफ़ॉल्ट रूप से इस्तेमाल करें</translation> +<translation id="2945410638638762679">"<ph name="MODULE_NAME" />" को छिपाने पर, Chromium आपके आने वाले पैकेज को ऑटोमैटिक तरीके से ट्रैक नहीं करेगा.</translation> <translation id="2977470724722393594">क्रोमियम अप टू डेट है</translation> <translation id="3102849287235003384">सभी वेबसाइटों पर, अपने Google खाते से साइन आउट करने के लिए, <ph name="BEGIN_LINK" />Chromium से साइन आउट करें<ph name="END_LINK" />.</translation> <translation id="3219277919172823720">Chromium में बोलकर खोजें</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb index 255d1fd..20c8983c 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
@@ -151,6 +151,7 @@ आपका एन्क्रिप्ट किया गया डेटा, सिर्फ़ वही व्यक्ति देख सकता है जिसके पास आपका लंबा पासवर्ड है. Google को लंबा पासवर्ड नहीं भेजा जाता और न ही Google इसे सेव करता है. अगर आपको अपना लंबा पासवर्ड याद नहीं है या यह सेटिंग बदलनी है, तो <ph name="BEGIN_LINK" />अपने खाते में मौजूद Chrome का डेटा मिटाएं<ph name="END_LINK" />.</translation> <translation id="6822673484890854830">Chrome सभी पासवर्ड की जांच नहीं कर सका. कुछ देर बाद कोशिश करें.</translation> +<translation id="6851982868877411675">iOS पर Chrome Settings खोलें. इसके बाद, "Default Browser App" पर टैप करें और Chrome चुनें.</translation> <translation id="6916015246697034114">Chrome में बोलकर खोजें</translation> <translation id="6964931465519938134">अब आप मैसेज, दस्तावेज़ों, और दूसरे ऐप्लिकेशन में मिले लिंक पर टैप करके, किसी भी समय Chrome का इस्तेमाल कर सकते हैं.</translation> <translation id="6975725306479268850">AutoFill के लिए Chrome चुनें</translation> @@ -197,6 +198,7 @@ <translation id="8414886616817913619">आपके संगठन के मुताबिक, यह ज़रूरी है कि Chrome का इस्तेमाल करने के लिए आप साइन इन करें. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="84594714173170813">अपने Google खाते में, Chrome के डेटा का इस्तेमाल जारी रखें</translation> <translation id="8459495907675268833">चयनित डेटा Chrome और समन्वयित डिवाइस से निकाल दिया गया है. हो सकता है कि आपके Google खाते में अन्य प्रकार के ब्राउज़िंग इतिहास जैसे खोज और history.google.com पर अन्य Google सेवाओं की गतिविधि हो.</translation> +<translation id="8473652833918591870">"<ph name="MODULE_NAME" />" को छिपाने पर, Chrome आपके आने वाले पैकेज ऑटोमैटिक तरीके से ट्रैक नहीं करेगा.</translation> <translation id="850555388806794946">Chrome को डिफ़ॉल्ट ब्राउज़र के तौर पर सेट करने के लिए: 1. Settings खोलें 2. डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन पर टैप करें
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index 58e76d2..d985d0a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -6,6 +6,7 @@ <translation id="1016495303386450659">आइटम अपडेट किया गया</translation> <translation id="1025514696883950875">{COUNT,plural, =1{खाते में पासवर्ड सेव करें}one{खाते में पासवर्ड सेव करें}other{खाते में पासवर्ड सेव करें}}</translation> <translation id="1035980983510608210">सभी टैब बंद करने से, पिन करके छोटे किए गए टैब भी बंद हो जाएंगे.</translation> +<translation id="1036017604683756002">यूपीएस</translation> <translation id="1036348656032585052">बंद करें</translation> <translation id="1044891598689252897">साइटें सामान्य रूप से काम करेंगी</translation> <translation id="1049743911850919806">गुप्त</translation> @@ -91,6 +92,7 @@ <translation id="1407135791313364759">सभी बुकमार्क खोलें</translation> <translation id="1408847409015257906">“निजता और सुरक्षा” पर टैप करें.</translation> <translation id="1430915738399379752">प्रिंट करें</translation> +<translation id="143681031165817424">यह पता सिर्फ़ इस डिवाइस पर सेव किया गया है</translation> <translation id="1443958768615272145">ब्राउज़ करना जारी रखें</translation> <translation id="1449835205994625556">पासवर्ड छिपाएं</translation> <translation id="1450170672351507823">सामान्य सुरक्षा की सुविधा चालू है. इससे भी ज़्यादा सुरक्षा के लिए, बेहतर सुरक्षा की सुविधा का इस्तेमाल करें.</translation> @@ -154,6 +156,7 @@ <translation id="1813414402673211292">ब्राउज़िंग डेटा मिटाएं</translation> <translation id="1815941218935345331">पासवर्ड</translation> <translation id="1820259098641718022">रीडिंग लिस्ट में जोड़ा गया</translation> +<translation id="1822994441903263130">FEDEX</translation> <translation id="1829392566394960110">{COUNT,plural, =0{कोई पासवर्ड हैक नहीं हुआ है या चोरी नहीं हुआ है}=1{{COUNT} पासवर्ड या तो हैक हुआ है या चोरी हुआ है}one{{COUNT} पासवर्ड या तो हैक हुआ है या चोरी हुआ है}other{{COUNT} पासवर्ड या तो हैक हुए हैं या चोरी हुए हैं}}</translation> <translation id="1830634592642484976">फ़िलहाल, यह पता Chrome में सेव है. Google के सभी प्रॉडक्ट पर इस्तेमाल करने के लिए, इसे अपने Google खाते, <ph name="USER_EMAIL" /> में सेव करें.</translation> <translation id="1832848789136765277">यह पक्का करने के लिए कि आप हमेशा अपना सिंक किया हुआ डेटा ऐक्सेस कर सकें, अपनी पहचान की पुष्टि करें</translation> @@ -235,6 +238,7 @@ <translation id="2297822946037605517">यह पेज शेयर करें</translation> <translation id="2297989278479054870">साइन आउट करने के बाद, आपके Google खाते में मौजूद बुकमार्क, पासवर्ड वगैरह इस डिवाइस से हटा दिए जाएंगे.</translation> <translation id="2299218006564889602">Google पासवर्ड मैनेजर में सेव होने से पहले, आपके डिवाइस पर पासवर्ड एन्क्रिप्ट (सुरक्षित) कर लिए जाते हैं.</translation> +<translation id="2299515531293777561"><ph name="CARRIER_NAME" /> • #<ph name="PARCEL_IDENTIFIER" /></translation> <translation id="2302742851632557585">वेबसाइट पर पासवर्ड बदलें</translation> <translation id="2316709634732130529">सुझाए गए पासवर्ड का इस्तेमाल करें</translation> <translation id="2320166752086256636">कीबोर्ड छिपाएं</translation> @@ -249,6 +253,8 @@ साइटें, अलग-अलग साइटों पर की गई आपकी ब्राउज़िंग गतिविधि देखने के लिए, कुकी इस्तेमाल नहीं कर सकतीं. जैसे कि दर्शकों की पसंद को ध्यान में रखकर विज्ञापन दिखाने के लिए.</translation> <translation id="2381405137052800939">मूलभूत बातें</translation> <translation id="2386793615875593361">1 चयनित</translation> +<translation id="2390457533592708044">"<ph name="MODULE_NAME" />" छिपाएं</translation> +<translation id="2403129868389095715">आपका पैकेज डिलीवर नहीं किया जा सकता</translation> <translation id="2411749908844615428">{count,plural, =1{सेव किया गया {count} पता, आपके कीबोर्ड के ऊपर उपलब्ध है.}one{सेव किया गया {count} पता, आपके कीबोर्ड के ऊपर उपलब्ध है.}other{सेव किए गए {count} पते, आपके कीबोर्ड के ऊपर उपलब्ध हैं.}}</translation> <translation id="2421004566762153674">तीसरे पक्ष की कुकी ब्लॉक की जा रही हैं</translation> <translation id="2421044535038393232">बदलाव करते रहें</translation> @@ -346,6 +352,7 @@ <translation id="288113003463357084">पता बार को सबसे नीचे ले जाएं</translation> <translation id="2883151425485251736">अपने खाते से छिपाए गए विषयों को देखें और उनमें बदलाव करें</translation> <translation id="288655811176831528">टैब बंद करें</translation> +<translation id="288902476966286676">भेजने वाले के पास वापस भेजें</translation> <translation id="2890171748217283516">जिन साइटों को फ़ॉलो किया जाता है वे आपके Google खाते में सेव हो जाती हैं. उन्हें डिस्कवर की सेटिंग में मैनेज किया जा सकता है.</translation> <translation id="2898963176829412617">नया फ़ोल्डर…</translation> <translation id="2902684821701498619">रीडिंग लिस्ट में जोड़ें</translation> @@ -375,6 +382,7 @@ आपका एन्क्रिप्ट किया गया डेटा, सिर्फ़ वही व्यक्ति देख सकता है जिसके पास आपका लंबा पासवर्ड है. लंबा पासवर्ड Google को नहीं भेजा जाता और न ही Google इसे सेव करता है. अगर आपको अपना लंबा पासवर्ड याद नहीं है या यह सेटिंग बदलनी है, तो <ph name="BEGIN_LINK" />अपने खाते में मौजूद Chrome का डेटा मिटाएं<ph name="END_LINK" />.</translation> <translation id="2989805286512600854">नए टैब में खोलें</translation> <translation id="3010025794097054078">डेटा के गलत इस्तेमाल, असुरक्षित वेबसाइटों वगैरह से सुरक्षित रहें.</translation> +<translation id="3010171936431626919">मुझे इसका तरीका दिखाएं</translation> <translation id="3020183492814296499">शॉर्टकट</translation> <translation id="3037605927509011580">हे भगवान!</translation> <translation id="3039722182465315531">साइन इन न करें</translation> @@ -433,6 +441,7 @@ <translation id="3328801116991980348">साइट जानकारी</translation> <translation id="3340938510625667914">Chrome ऐक्शंस</translation> <translation id="3344485292736684439">{count,plural, =1{आपके खाते, {email} में मौजूद "{title}" में बुकमार्क सेव किया गया}one{आपके खाते, {email} में मौजूद "{title}" में बुकमार्क सेव किया गया}other{आपके खाते, {email} में मौजूद "{title}" में बुकमार्क सेव किए गए}}</translation> +<translation id="3348387552617855658">इस कार्ड से, पैकेज ट्रैक करने के साथ-साथ डिलीवरी से जुड़े अहम अपडेट भी पाए जा सकते हैं.</translation> <translation id="3349676726073650389">आपने जिन साइटों और खोजों को फ़ॉलो किया है उन्हें आपके Google खाते में सेव कर दिया गया है. सेटिंग में जाकर, फ़ॉलो किए जाने वाले आइटम को कभी भी मैनेज किया जा सकता है.</translation> <translation id="3365529507898144230">Photos में सेव करें</translation> <translation id="3371831930909698441">अनुवाद उपलब्ध है. विकल्प, स्क्रीन के निचले हिस्से में मौजूद हैं.</translation> @@ -508,6 +517,7 @@ <translation id="3771033907050503522">गुप्त टैब</translation> <translation id="3775743491439407556">सिंक की सुविधा काम नहीं कर रही है</translation> <translation id="3779810277399252432">कोई इंटरनेट कनेक्शन नहीं.</translation> +<translation id="3787061634640932557">कार्ड की जानकारी में बदलाव करना</translation> <translation id="3789294999358192700">यहां दिया गया तरीका अपनाएं:</translation> <translation id="3789841737615482174">इंस्टॉल करें</translation> <translation id="380329542618494757">नाम</translation> @@ -534,6 +544,7 @@ <translation id="3909222758573607742">खाते में पासवर्ड और अन्य आइटम सेव करें</translation> <translation id="3913386780052199712">आप Chrome में साइन इन हैं</translation> <translation id="3915450441834151894">साइट की जानकारी</translation> +<translation id="3918585468378680136">पैकेज के डिलीवरी स्टेटस का पता लगाया जा रहा है</translation> <translation id="3922310737605261887">कॉपी किया गया टेक्स्ट खोजें</translation> <translation id="3928666092801078803">मेरा डेटा संयोजित करें</translation> <translation id="3929457972718048006">पते</translation> @@ -570,6 +581,7 @@ <translation id="4152011295694446843">आपको अपने बुकमार्क यहां मिलेंगे</translation> <translation id="4168651806173792090"><ph name="LAST_FOUR_DIGITS" /> से खत्म होने वाला <ph name="NETWORK_NAME" /></translation> <translation id="4172051516777682613">हमेशा दिखाएं</translation> +<translation id="417442848889487144">लेबल बनाया गया. तारीख की जानकारी अभी उपलब्ध नहीं है</translation> <translation id="418156467088430727">ऑफ़लाइन वर्शन को नए टैब में देखें</translation> <translation id="4181841719683918333">भाषाएं</translation> <translation id="4187450337729239226">चिपकाएं और खोजें</translation> @@ -679,6 +691,7 @@ <translation id="4803185665210547709">आपका संगठन मैनेज करता है. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="4805759445554688327">कार्ड संख्या अमान्य है</translation> +<translation id="4808646838864186379">आपकी डिलीवरी रद्द की गई</translation> <translation id="4808744395915275922">अपडेट</translation> <translation id="4818522717893377262">भाषा जोड़ें...</translation> <translation id="481968316161811770">कुकी, साइट डेटा</translation> @@ -707,6 +720,7 @@ <translation id="4901778704868714008">सेव करें...</translation> <translation id="4904877109095351937">पढ़ी गईं चिह्नित करें</translation> <translation id="4908869848243824489">Google का 'डिस्कवर'</translation> +<translation id="4913626501929406101">अपने फ़ैमिली ग्रुप के किसी सदस्य के साथ, पासवर्ड की कॉपी सुरक्षित तरीके से शेयर की जा सकती है. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="4916679969857390442">लैंस</translation> <translation id="4918086044614829423">स्वीकार करें</translation> <translation id="4922154083994158612">क्या आपको बेहतर सुरक्षा चाहिए?</translation> @@ -777,6 +791,7 @@ <translation id="5300589172476337783">दिखाएं</translation> <translation id="5317780077021120954">सेव करें</translation> <translation id="5318298563956633672">इस प्रॉडक्ट को पहले से ही ट्रैक किया जा रहा है.</translation> +<translation id="5330747118195256207">इस कार्ड को छिपाने से, आपके आने वाले पैकेज के लिए ऑटो-ट्रैकिंग की सुविधा बंद हो जाएगी</translation> <translation id="5339316356165661760">'सिंक करें' को चालू करें</translation> <translation id="536067926684072644">बुकमार्क दिखाएं</translation> <translation id="5360976571138293719">निजता, सुरक्षा, और डेटा इकट्ठा करने से जुड़ी ज़्यादा सेटिंग के लिए, <ph name="BEGIN_LINK" />Google की सेवाएं<ph name="END_LINK" /> देखें.</translation> @@ -793,9 +808,11 @@ <translation id="5443952882982198570">क्रेडिट कार्ड</translation> <translation id="5444892875087332195">बुकमार्क</translation> <translation id="5457226814769348910">ऑफ़लाइन वर्शन खोलें</translation> +<translation id="5475069061743940393">पैकेज ट्रैकिंग</translation> <translation id="5478327362747197944">किसी वेब पेज पर, तारीख पर क्लिक करके सीधे कैलेंडर इवेंट बनाएं.</translation> <translation id="5489208564673669003">सभी साइटों की कुकी प्रबंधित करने के लिए, <ph name="BEGIN_LINK" />कुकी सेटिंग<ph name="END_LINK" /> देखें.</translation> <translation id="5490005495580364134">सभी कुकी ब्लॉक करें (हम ऐसा करने का सुझाव नहीं देते)</translation> +<translation id="5497202150450073388">डिलीवरी करने की कोशिश की गई. फिर से कोशिश की जाएगी</translation> <translation id="5511959326926949696">आपके ब्राउज़र के लिए कड़ी सुरक्षा के विकल्प. इसका इस्तेमाल सिर्फ़ तब करें, जब लगे कि आपको टारगेट करने के लिए, हद से ज़्यादा जटिल और विकसित सायबर हमला किया जा सकता है.</translation> <translation id="5513681519188741830"><ph name="TIME" /> घंटे पहले</translation> <translation id="5520466080178053306">Password Manager पर टैप करें. इसके बाद, 'जोड़ें' पर टैप करें</translation> @@ -841,6 +858,7 @@ <translation id="5738887413654608789">इससे आप अपने आस-पास की चीज़ों पर आधारित वेब पृष्ठों की खोज कर सकते हैं.</translation> <translation id="5745916533876677730">पिछले टैब पर जाएं</translation> <translation id="574762237186762643">इवेंट</translation> +<translation id="5748177854685749242">पैकेज <ph name="DATE" /> पर पहुंचेगा</translation> <translation id="5755162682436943950">साइन आउट किया गया. यह बटन, साइन इन करने और सिंक की सुविधा चालू करने के लिए, डायलॉग बॉक्स खोलता है.</translation> <translation id="5758631781033351321">आपको अपनी, पढ़ने की चीज़ों की सूची यहां मिलेगी</translation> <translation id="5765456154762864099">मेन्यू → सेटिंग → डिफ़ॉल्ट ब्राउज़र</translation> @@ -896,6 +914,7 @@ <translation id="6027619584715411062">अपने सभी डिवाइसों पर बुकमार्क, पासवर्ड वगैरह का ऐक्सेस पाने के लिए साइन इन करें.</translation> <translation id="6027945736510816438">क्या आपका मतलब <ph name="WEBSITE" /> से है?</translation> <translation id="6032845897905314562">नई सुविधा</translation> +<translation id="6033598293589037429">पिकअप के लिए तैयार है</translation> <translation id="6036215966221662377">ब्राउज़िंग डेटा मिटाएं</translation> <translation id="6036514205982097558">एक ही ब्राउज़र में आपके सभी टैब</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> @@ -943,6 +962,7 @@ <translation id="6254066287920239840">ब्राउज़र के बजाय ऐप्लिकेशन में लिंक खोलें.</translation> <translation id="625491139841322297">{count,plural, =1{टैब की समीक्षा करें}one{टैब की समीक्षा करें}other{सभी टैब की समीक्षा करें}}</translation> <translation id="6255097610484507482">क्रेडिट कार्ड में बदलाव करें</translation> +<translation id="6266039999629596120">ध्यान देने की ज़रूरत है</translation> <translation id="6277426346321820595">'कोई भी सुरक्षा नहीं' मोड</translation> <translation id="6284652193729350524"><ph name="LANGUAGE" /> में अनुवाद करें</translation> <translation id="6289501276895392862"><ph name="CHANNEL_NAME" /> को अनफ़ॉलो किया गया</translation> @@ -1058,6 +1078,7 @@ <translation id="672735642903863329">अपने सभी डिवाइसों पर बुकमार्क, पासवर्ड वगैरह का ऐक्सेस पाएं.</translation> <translation id="6730682669179532099">पासवर्ड निर्यात नहीं कर सकते</translation> <translation id="6732087373923685049">कैमरा</translation> +<translation id="6738233953537186295">अपने पासवर्ड की कॉपी शेयर करें</translation> <translation id="6746338529702829275">अपने खाते का डेटा देखें</translation> <translation id="6748108480210050150">प्रेषक</translation> <translation id="6753469262000681876">लॉकडाउन मोड</translation> @@ -1117,6 +1138,7 @@ <translation id="7062545763355031412">स्वीकार करें और खातों को बदलें</translation> <translation id="7063811929043357292">आपके खाते को आपके माता-पिता/अभिभावक मैनेज करते हैं. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> +<translation id="7064619810277839954">आपको टैब के सुझाव, अपने Google खाते का इस्तेमाल करके दूसरे डिवाइसों पर की गई आपकी ब्राउज़िंग गतिविधि के आधार पर मिलते हैं. हालांकि, इसके लिए यह ज़रूरी है कि आपने डिवाइसों में एक ही Google खाते से साइन इन और सिंक किया हो.</translation> <translation id="7069695992271320873">इस डिवाइस से हटाएं</translation> <translation id="7080806333218412752">जांच करने के लिए, सुरक्षित ब्राउज़िंग की सेवा को यूआरएल भेजता है. नए खतरों का पता लगाने के लिए पेज के नमूने, डाउनलोड, एक्सटेंशन की गतिविधि, और सिस्टम की जानकारी भी भेजता है. आपके साइन इन होने पर, थोड़ी देर के लिए इस डेटा को आपके Google खाते से जोड़ता है. ऐसा सभी Google ऐप्लिकेशन पर आपको सुरक्षित रखने के लिए किया जाता है.</translation> <translation id="7082853213442715471">चालू होने पर, इंटरनेट पर काम करने वाली कुछ टेक्नोलॉजी ब्लॉक हो जाती हैं. इस वजह से, ऐसा हो सकता है कि कुछ वेबसाइटें धीरे-धीरे लोड हों या ठीक से काम न करें.</translation> @@ -1157,6 +1179,7 @@ <translation id="7351537303876921605">संदर्भ मेन्यू में, 'लिंक बनाएं' पर टैप करें</translation> <translation id="7352651011704765696">कुछ गलत हुआ</translation> <translation id="7353432112255316844">अपनी पहचान की पुष्टि करें</translation> +<translation id="7367530036083223701">Password Manager विजेट की मदद से, होम स्क्रीन से अपने पासवर्ड सुरक्षित तरीके से ऐक्सेस करें.</translation> <translation id="7380220816562673297">फ़िलहाल, सिर्फ़ फ़ैमिली ग्रुप के सदस्यों के साथ पासवर्ड शेयर किए जा सकते हैं. Google पर अपने प्रॉडक्ट और ली गई सदस्यताओं का ज़्यादा फ़ायदा पाने के लिए, छह सदस्यों तक का <ph name="BEGIN_LINK" />फ़ैमिली ग्रुप बनाएं<ph name="END_LINK" />.</translation> <translation id="7383797227493018512">पढ़ने की चीज़ों की सूची</translation> <translation id="7398893703713203428">लिंक बनाएं</translation> @@ -1175,6 +1198,7 @@ <translation id="746684838091935575">3. Chrome चुनें</translation> <translation id="7472734401283673885">कंपनी का नाम</translation> <translation id="7473891865547856676">नहीं, रहने दें</translation> +<translation id="7488874549363591659">डिलीवर हो गया</translation> <translation id="7491131399623468277">Settings पर जाएं…</translation> <translation id="7492574581995589075">आपके संगठन ने, आपके Google खाते में Chrome के डेटा को इस्तेमाल और सेव करने की सुविधा बंद कर दी है. नए बुकमार्क, पासवर्ड वगैरह सिर्फ़ इस डिवाइस में सेव किए जाएंगे.</translation> <translation id="750149195207506638">बुकमार्क छिपे हुए हैं</translation> @@ -1358,6 +1382,7 @@ <translation id="8459333855531264009">सुरक्षित नहीं है</translation> <translation id="8487667956631253959">चालू है</translation> <translation id="8487700953926739672">ऑफ़लाइन उपलब्ध है</translation> +<translation id="8487894141648868716">USPS</translation> <translation id="8488923644885757471">नई विंडो</translation> <translation id="8490978609246021741">बदलावों को सेव करें</translation> <translation id="8491300088149538575"><ph name="EMAIL" /> के तौर पर साइन इन किया गया.
diff --git a/ios/chrome/browser/autocomplete/model/BUILD.gn b/ios/chrome/browser/autocomplete/model/BUILD.gn index a4505fb..1e3960a 100644 --- a/ios/chrome/browser/autocomplete/model/BUILD.gn +++ b/ios/chrome/browser/autocomplete/model/BUILD.gn
@@ -49,7 +49,7 @@ "//ios/chrome/browser/shared/model/url:constants", "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/components/webui:url_constants", "//ios/web", "//url",
diff --git a/ios/chrome/browser/autocomplete/model/DEPS b/ios/chrome/browser/autocomplete/model/DEPS index 4fff0d1..0838c175 100644 --- a/ios/chrome/browser/autocomplete/model/DEPS +++ b/ios/chrome/browser/autocomplete/model/DEPS
@@ -5,5 +5,5 @@ "+ios/chrome/browser/history", "+ios/chrome/browser/search_engines", "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", ]
diff --git a/ios/chrome/browser/autocomplete/model/autocomplete_provider_client_impl.mm b/ios/chrome/browser/autocomplete/model/autocomplete_provider_client_impl.mm index b011846..dbb83b0 100644 --- a/ios/chrome/browser/autocomplete/model/autocomplete_provider_client_impl.mm +++ b/ios/chrome/browser/autocomplete/model/autocomplete_provider_client_impl.mm
@@ -41,7 +41,7 @@ #import "ios/chrome/browser/shared/model/url/chrome_url_constants.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/components/webui/web_ui_url_constants.h" #import "services/network/public/cpp/shared_url_loader_factory.h"
diff --git a/ios/chrome/browser/autofill/BUILD.gn b/ios/chrome/browser/autofill/BUILD.gn index b8259fd4..e27b5887 100644 --- a/ios/chrome/browser/autofill/BUILD.gn +++ b/ios/chrome/browser/autofill/BUILD.gn
@@ -65,7 +65,7 @@ "//ios/chrome/browser/shared/ui/util:util_swift", "//ios/chrome/browser/shared/ui/util/image", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/webdata_services/model", "//ios/chrome/common/ui/colors:colors", "//ios/web/common", @@ -193,7 +193,7 @@ "//ios/chrome/browser/shared/model/browser_state:test_support", "//ios/chrome/browser/shared/model/paths", "//ios/chrome/browser/ssl", - "//ios/chrome/browser/sync:sync", + "//ios/chrome/browser/sync/model:model", "//ios/chrome/browser/ui/autofill", "//ios/chrome/browser/ui/autofill/form_input_accessory", "//ios/chrome/browser/ui/settings:test_support",
diff --git a/ios/chrome/browser/autofill/DEPS b/ios/chrome/browser/autofill/DEPS index 1d695ec..bd85f7d 100644 --- a/ios/chrome/browser/autofill/DEPS +++ b/ios/chrome/browser/autofill/DEPS
@@ -1,7 +1,7 @@ include_rules = [ "+ios/chrome/browser/history", "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/webdata_services/model", "+ios/chrome/browser/infobars", ]
diff --git a/ios/chrome/browser/autofill/form_structure_browsertest.mm b/ios/chrome/browser/autofill/form_structure_browsertest.mm index 25533dc26..779a727 100644 --- a/ios/chrome/browser/autofill/form_structure_browsertest.mm +++ b/ios/chrome/browser/autofill/form_structure_browsertest.mm
@@ -40,7 +40,7 @@ #import "ios/chrome/browser/passwords/password_controller.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/shared/model/paths/paths.h" -#import "ios/chrome/browser/sync/ios_user_event_service_factory.h" +#import "ios/chrome/browser/sync/model/ios_user_event_service_factory.h" #import "ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h" #import "ios/chrome/browser/web/chrome_web_client.h" #import "ios/web/public/js_messaging/web_frame.h"
diff --git a/ios/chrome/browser/autofill/personal_data_manager_factory.mm b/ios/chrome/browser/autofill/personal_data_manager_factory.mm index fc22335..dede17f 100644 --- a/ios/chrome/browser/autofill/personal_data_manager_factory.mm +++ b/ios/chrome/browser/autofill/personal_data_manager_factory.mm
@@ -24,7 +24,7 @@ #import "ios/chrome/browser/shared/model/browser_state/browser_state_otr_helper.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/webdata_services/model/web_data_service_factory.h" namespace autofill {
diff --git a/ios/chrome/browser/bring_android_tabs/model/BUILD.gn b/ios/chrome/browser/bring_android_tabs/model/BUILD.gn index 83545f9..9020e66 100644 --- a/ios/chrome/browser/bring_android_tabs/model/BUILD.gn +++ b/ios/chrome/browser/bring_android_tabs/model/BUILD.gn
@@ -26,7 +26,7 @@ "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/shared/public/features:system_flags", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/synced_sessions", "//ios/chrome/browser/url_loading", "//ios/chrome/browser/url_loading:url_loading_params_header", @@ -59,7 +59,7 @@ ":model", "//components/prefs", "//components/segmentation_platform/embedder/default_model", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/synced_sessions", ] } @@ -91,7 +91,7 @@ "//ios/chrome/browser/shared/model/browser/test:test_support", "//ios/chrome/browser/shared/model/browser_state:test_support", "//ios/chrome/browser/shared/model/prefs:pref_names", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/url_loading", "//ios/chrome/browser/url_loading:test_support", "//ios/web/public/test",
diff --git a/ios/chrome/browser/bring_android_tabs/model/DEPS b/ios/chrome/browser/bring_android_tabs/model/DEPS index 9aaf48c..a6693c3 100644 --- a/ios/chrome/browser/bring_android_tabs/model/DEPS +++ b/ios/chrome/browser/bring_android_tabs/model/DEPS
@@ -1,6 +1,6 @@ include_rules = [ "+ios/chrome/browser/first_run", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/synced_sessions", "+ios/chrome/browser/segmentation_platform", "+ios/chrome/browser/url_loading",
diff --git a/ios/chrome/browser/bring_android_tabs/model/bring_android_tabs_to_ios_service_factory.mm b/ios/chrome/browser/bring_android_tabs/model/bring_android_tabs_to_ios_service_factory.mm index ede7d00..e5aeed4 100644 --- a/ios/chrome/browser/bring_android_tabs/model/bring_android_tabs_to_ios_service_factory.mm +++ b/ios/chrome/browser/bring_android_tabs/model/bring_android_tabs_to_ios_service_factory.mm
@@ -15,8 +15,8 @@ #import "ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/prefs/pref_names.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" // static BringAndroidTabsToIOSService*
diff --git a/ios/chrome/browser/bring_android_tabs/model/bring_android_tabs_to_ios_service_unittest.mm b/ios/chrome/browser/bring_android_tabs/model/bring_android_tabs_to_ios_service_unittest.mm index 134fff9..02cb39b 100644 --- a/ios/chrome/browser/bring_android_tabs/model/bring_android_tabs_to_ios_service_unittest.mm +++ b/ios/chrome/browser/bring_android_tabs/model/bring_android_tabs_to_ios_service_unittest.mm
@@ -37,7 +37,7 @@ #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/shared/model/prefs/pref_names.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" #import "ios/chrome/browser/url_loading/fake_url_loading_browser_agent.h" #import "ios/chrome/browser/url_loading/url_loading_notifier_browser_agent.h" #import "ios/web/public/test/web_task_environment.h"
diff --git a/ios/chrome/browser/bring_android_tabs/model/fake_bring_android_tabs_to_ios_service.mm b/ios/chrome/browser/bring_android_tabs/model/fake_bring_android_tabs_to_ios_service.mm index 7f87ce7..e1e7391ed 100644 --- a/ios/chrome/browser/bring_android_tabs/model/fake_bring_android_tabs_to_ios_service.mm +++ b/ios/chrome/browser/bring_android_tabs/model/fake_bring_android_tabs_to_ios_service.mm
@@ -6,8 +6,8 @@ #import "components/prefs/pref_service.h" #import "components/segmentation_platform/embedder/default_model/device_switcher_result_dispatcher.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/synced_sessions/distant_tab.h" #import "ios/chrome/browser/synced_sessions/synced_sessions.h"
diff --git a/ios/chrome/browser/browser_state/model/BUILD.gn b/ios/chrome/browser/browser_state/model/BUILD.gn index 94129a4..6b8c1a2 100644 --- a/ios/chrome/browser/browser_state/model/BUILD.gn +++ b/ios/chrome/browser/browser_state/model/BUILD.gn
@@ -130,9 +130,9 @@ "//ios/chrome/browser/snapshots", "//ios/chrome/browser/supervised_user", "//ios/chrome/browser/supervised_user:sync_settings_factory", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:model_type_store_service_factory", - "//ios/chrome/browser/sync/glue", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:model_type_store_service_factory", + "//ios/chrome/browser/sync/model/glue", "//ios/chrome/browser/tabs_search/model:model_factory", "//ios/chrome/browser/text_selection/model", "//ios/chrome/browser/translate", @@ -165,8 +165,8 @@ "//ios/chrome/browser/net", "//ios/chrome/browser/shared/model/prefs:browser_prefs", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync/glue", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model/glue", ] }
diff --git a/ios/chrome/browser/browser_state/model/DEPS b/ios/chrome/browser/browser_state/model/DEPS index e1549bc..f59331e7 100644 --- a/ios/chrome/browser/browser_state/model/DEPS +++ b/ios/chrome/browser/browser_state/model/DEPS
@@ -1,5 +1,5 @@ include_rules = [ - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/bookmarks/model", "+ios/chrome/browser/net", "+ios/chrome/browser/policy",
diff --git a/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm b/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm index b510d58..940a3ea 100644 --- a/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm +++ b/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm
@@ -81,10 +81,10 @@ #import "ios/chrome/browser/supervised_user/supervised_user_metrics_service_factory.h" #import "ios/chrome/browser/supervised_user/supervised_user_service_factory.h" #import "ios/chrome/browser/supervised_user/supervised_user_settings_service_factory.h" -#import "ios/chrome/browser/sync/ios_user_event_service_factory.h" -#import "ios/chrome/browser/sync/model_type_store_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/ios_user_event_service_factory.h" +#import "ios/chrome/browser/sync/model/model_type_store_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" #import "ios/chrome/browser/tabs_search/model/tabs_search_service_factory.h" #import "ios/chrome/browser/text_selection/model/text_classifier_model_service_factory.h" #import "ios/chrome/browser/translate/translate_ranker_factory.h"
diff --git a/ios/chrome/browser/browsing_data/model/BUILD.gn b/ios/chrome/browser/browsing_data/model/BUILD.gn index e8e9e96..b623096 100644 --- a/ios/chrome/browser/browsing_data/model/BUILD.gn +++ b/ios/chrome/browser/browsing_data/model/BUILD.gn
@@ -72,7 +72,7 @@ "//ios/chrome/browser/shared/model/paths", "//ios/chrome/browser/signin", "//ios/chrome/browser/snapshots", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/translate:translate", "//ios/chrome/browser/web", "//ios/chrome/browser/web/font_size",
diff --git a/ios/chrome/browser/browsing_data/model/DEPS b/ios/chrome/browser/browsing_data/model/DEPS index 57b3436..5183f9b1 100644 --- a/ios/chrome/browser/browsing_data/model/DEPS +++ b/ios/chrome/browser/browsing_data/model/DEPS
@@ -2,7 +2,7 @@ "+ios/chrome/browser/browser_state/model/ios_chrome_io_thread.h", "+ios/chrome/browser/history", "+ios/chrome/browser/passwords", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/webdata_services/model", "+ios/chrome/browser/sessions", "+ios/chrome/browser/autofill",
diff --git a/ios/chrome/browser/browsing_data/model/browsing_data_counter_wrapper.cc b/ios/chrome/browser/browsing_data/model/browsing_data_counter_wrapper.cc index e8630502..db342a60 100644 --- a/ios/chrome/browser/browsing_data/model/browsing_data_counter_wrapper.cc +++ b/ios/chrome/browser/browsing_data/model/browsing_data_counter_wrapper.cc
@@ -23,7 +23,7 @@ #include "ios/chrome/browser/passwords/ios_chrome_account_password_store_factory.h" #include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #include "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/sync/sync_service_factory.h" +#include "ios/chrome/browser/sync/model/sync_service_factory.h" #include "ios/chrome/browser/webdata_services/model/web_data_service_factory.h" namespace {
diff --git a/ios/chrome/browser/commerce/model/BUILD.gn b/ios/chrome/browser/commerce/model/BUILD.gn index bdbff0fd..93006c0 100644 --- a/ios/chrome/browser/commerce/model/BUILD.gn +++ b/ios/chrome/browser/commerce/model/BUILD.gn
@@ -51,7 +51,7 @@ "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/signin:signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/web", "//services/network/public/cpp", ] @@ -101,8 +101,8 @@ "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:signin", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/test:test_support", "//ios/web/public:public", "//ios/web/public/test:test",
diff --git a/ios/chrome/browser/commerce/model/DEPS b/ios/chrome/browser/commerce/model/DEPS index a67036f..bcec776 100644 --- a/ios/chrome/browser/commerce/model/DEPS +++ b/ios/chrome/browser/commerce/model/DEPS
@@ -5,7 +5,7 @@ "+ios/chrome/browser/history", "+ios/chrome/browser/power_bookmarks", "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/optimization_guide", "+ios/chrome/browser/bookmarks/model", "+ios/chrome/browser/feature_engagement",
diff --git a/ios/chrome/browser/commerce/model/shopping_persisted_data_tab_helper_unittest.mm b/ios/chrome/browser/commerce/model/shopping_persisted_data_tab_helper_unittest.mm index 644ade3..c7a0692b 100644 --- a/ios/chrome/browser/commerce/model/shopping_persisted_data_tab_helper_unittest.mm +++ b/ios/chrome/browser/commerce/model/shopping_persisted_data_tab_helper_unittest.mm
@@ -31,8 +31,8 @@ #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #import "ios/web/public/test/fakes/fake_navigation_context.h" #import "ios/web/public/test/fakes/fake_web_state.h"
diff --git a/ios/chrome/browser/commerce/model/shopping_service_factory.mm b/ios/chrome/browser/commerce/model/shopping_service_factory.mm index 91d2307..4f02512 100644 --- a/ios/chrome/browser/commerce/model/shopping_service_factory.mm +++ b/ios/chrome/browser/commerce/model/shopping_service_factory.mm
@@ -22,7 +22,7 @@ #import "ios/chrome/browser/shared/model/browser_state/browser_state_otr_helper.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "services/network/public/cpp/shared_url_loader_factory.h" namespace commerce {
diff --git a/ios/chrome/browser/consent_auditor/model/BUILD.gn b/ios/chrome/browser/consent_auditor/model/BUILD.gn index 46e486f..2598bcb 100644 --- a/ios/chrome/browser/consent_auditor/model/BUILD.gn +++ b/ios/chrome/browser/consent_auditor/model/BUILD.gn
@@ -16,7 +16,7 @@ "//components/version_info", "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/browser_state", - "//ios/chrome/browser/sync:model_type_store_service_factory", + "//ios/chrome/browser/sync/model:model_type_store_service_factory", "//ios/chrome/common", "//ios/web/public", ] @@ -31,7 +31,7 @@ ":model", "//components/consent_auditor:test_support", "//components/keyed_service/core", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model:test_support", "//ios/web/public", ] }
diff --git a/ios/chrome/browser/consent_auditor/model/DEPS b/ios/chrome/browser/consent_auditor/model/DEPS index e40b41c..cfb5392 100644 --- a/ios/chrome/browser/consent_auditor/model/DEPS +++ b/ios/chrome/browser/consent_auditor/model/DEPS
@@ -1,4 +1,4 @@ include_rules = [ "+components/consent_auditor", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", ]
diff --git a/ios/chrome/browser/consent_auditor/model/consent_auditor_factory.mm b/ios/chrome/browser/consent_auditor/model/consent_auditor_factory.mm index ef9a2f73..9bc6ebd 100644 --- a/ios/chrome/browser/consent_auditor/model/consent_auditor_factory.mm +++ b/ios/chrome/browser/consent_auditor/model/consent_auditor_factory.mm
@@ -23,7 +23,7 @@ #import "components/version_info/version_info.h" #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/sync/model_type_store_service_factory.h" +#import "ios/chrome/browser/sync/model/model_type_store_service_factory.h" #import "ios/chrome/common/channel_info.h" #import "ios/web/public/browser_state.h"
diff --git a/ios/chrome/browser/credential_provider/model/BUILD.gn b/ios/chrome/browser/credential_provider/model/BUILD.gn index 741d047..92e8750 100644 --- a/ios/chrome/browser/credential_provider/model/BUILD.gn +++ b/ios/chrome/browser/credential_provider/model/BUILD.gn
@@ -47,7 +47,7 @@ "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/common/app_group", "//ios/chrome/common/credential_provider", "//ios/chrome/common/credential_provider:ui",
diff --git a/ios/chrome/browser/credential_provider/model/DEPS b/ios/chrome/browser/credential_provider/model/DEPS index 660ffd5c..718e8cd 100644 --- a/ios/chrome/browser/credential_provider/model/DEPS +++ b/ios/chrome/browser/credential_provider/model/DEPS
@@ -1,6 +1,6 @@ include_rules = [ "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/favicon", "+ios/chrome/browser/passwords", ]
diff --git a/ios/chrome/browser/credential_provider/model/credential_provider_service_factory.mm b/ios/chrome/browser/credential_provider/model/credential_provider_service_factory.mm index d1bd638..50e54d8 100644 --- a/ios/chrome/browser/credential_provider/model/credential_provider_service_factory.mm +++ b/ios/chrome/browser/credential_provider/model/credential_provider_service_factory.mm
@@ -16,7 +16,7 @@ #import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/common/credential_provider/archivable_credential_store.h" #import "ios/chrome/common/credential_provider/constants.h"
diff --git a/ios/chrome/browser/discover_feed/BUILD.gn b/ios/chrome/browser/discover_feed/BUILD.gn index b5517a9..60574c2 100644 --- a/ios/chrome/browser/discover_feed/BUILD.gn +++ b/ios/chrome/browser/discover_feed/BUILD.gn
@@ -53,7 +53,7 @@ "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/ntp/metrics", "//ios/public/provider/chrome/browser/discover_feed:discover_feed_api", ]
diff --git a/ios/chrome/browser/discover_feed/DEPS b/ios/chrome/browser/discover_feed/DEPS index 7fbc37a..b805503 100644 --- a/ios/chrome/browser/discover_feed/DEPS +++ b/ios/chrome/browser/discover_feed/DEPS
@@ -2,7 +2,7 @@ "+ios/chrome/browser/search_engines", "+ios/chrome/browser/signin", "+ios/chrome/browser/metrics", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", ] specific_include_rules = {
diff --git a/ios/chrome/browser/discover_feed/discover_feed_service_factory.mm b/ios/chrome/browser/discover_feed/discover_feed_service_factory.mm index a12f1a6..a2c6b9e 100644 --- a/ios/chrome/browser/discover_feed/discover_feed_service_factory.mm +++ b/ios/chrome/browser/discover_feed/discover_feed_service_factory.mm
@@ -13,7 +13,7 @@ #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h" #import "ios/public/provider/chrome/browser/discover_feed/discover_feed_api.h"
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index d82a96c..f152e9a 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1671,6 +1671,10 @@ flag_descriptions::kAutofillEnableVirtualCardsDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableVirtualCards)}, + {"ios-incognito-downloads-warning", + flag_descriptions::kIOSIncognitoDownloadsWarningName, + flag_descriptions::kIOSIncognitoDownloadsWarningDescription, + flags_ui::kOsIos, FEATURE_VALUE_TYPE(kIOSIncognitoDownloadsWarning)}, }; bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index 343243d..f7c067a 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -607,6 +607,12 @@ const char kIOSForceTranslateEnabledDescription[] = "Enable the translate feature when language detection failed."; +const char kIOSIncognitoDownloadsWarningName[] = + "Enable Incognito downloads warning on iOS"; +const char kIOSIncognitoDownloadsWarningDescription[] = + "When enabled, users will be warned that downloaded files are saved on the " + "device and might be seen by other users even if they are in Incognito."; + const char kIOSNewPostRestoreExperienceName[] = "New Post Restore Experience"; const char kIOSNewPostRestoreExperienceDescription[] = "When enabled, a prompt will be presented after a device restore to "
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index ec11c4c..0035fe2 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -511,6 +511,10 @@ extern const char kIOSForceTranslateEnabledName[]; extern const char kIOSForceTranslateEnabledDescription[]; +// Title and description for the flag to enable Incognito downloads education. +extern const char kIOSIncognitoDownloadsWarningName[]; +extern const char kIOSIncognitoDownloadsWarningDescription[]; + // Title and description for the flag to enable the new iOS post-restore // sign-in prompt. extern const char kIOSNewPostRestoreExperienceName[];
diff --git a/ios/chrome/browser/history/DEPS b/ios/chrome/browser/history/DEPS index 379fa10..502bc72 100644 --- a/ios/chrome/browser/history/DEPS +++ b/ios/chrome/browser/history/DEPS
@@ -4,5 +4,5 @@ "+ios/chrome/browser/sessions", "+ios/chrome/browser/translate", "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", ]
diff --git a/ios/chrome/browser/history/web_history_service_factory.cc b/ios/chrome/browser/history/web_history_service_factory.cc index 528803372..f36d334 100644 --- a/ios/chrome/browser/history/web_history_service_factory.cc +++ b/ios/chrome/browser/history/web_history_service_factory.cc
@@ -11,7 +11,7 @@ #include "components/sync/service/sync_service.h" #include "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/signin/identity_manager_factory.h" -#include "ios/chrome/browser/sync/sync_service_factory.h" +#include "ios/chrome/browser/sync/model/sync_service_factory.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/sync_error/BUILD.gn b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/sync_error/BUILD.gn index 6462a76..4a0814a 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/sync_error/BUILD.gn +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/sync_error/BUILD.gn
@@ -34,8 +34,8 @@ "//ios/chrome/browser/settings/sync/utils", "//ios/chrome/browser/settings/sync/utils/test", "//ios/chrome/browser/shared/model/browser_state:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/web/public/test", "//ios/web/public/test/fakes", "//testing/gtest",
diff --git a/ios/chrome/browser/main/BUILD.gn b/ios/chrome/browser/main/BUILD.gn index db68c692..72b028d7 100644 --- a/ios/chrome/browser/main/BUILD.gn +++ b/ios/chrome/browser/main/BUILD.gn
@@ -38,7 +38,7 @@ "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/snapshots", - "//ios/chrome/browser/sync:sync_error_browser_agent", + "//ios/chrome/browser/sync/model:sync_error_browser_agent", "//ios/chrome/browser/tab_insertion/model", "//ios/chrome/browser/tabs", "//ios/chrome/browser/tabs:features",
diff --git a/ios/chrome/browser/main/DEPS b/ios/chrome/browser/main/DEPS index 6408866..cc9816a 100644 --- a/ios/chrome/browser/main/DEPS +++ b/ios/chrome/browser/main/DEPS
@@ -23,7 +23,7 @@ "+ios/chrome/browser/sessions/session_restoration_browser_agent.h", "+ios/chrome/browser/sessions/session_service_ios.h", "+ios/chrome/browser/snapshots/snapshot_browser_agent.h", - "+ios/chrome/browser/sync/sync_error_browser_agent.h", + "+ios/chrome/browser/sync/model/sync_error_browser_agent.h", "+ios/chrome/browser/tabs/closing_web_state_observer_browser_agent.h", "+ios/chrome/browser/tabs/features.h", "+ios/chrome/browser/tabs/synced_window_delegate_browser_agent.h",
diff --git a/ios/chrome/browser/main/browser_agent_util.mm b/ios/chrome/browser/main/browser_agent_util.mm index d9372c0..f720ef3 100644 --- a/ios/chrome/browser/main/browser_agent_util.mm +++ b/ios/chrome/browser/main/browser_agent_util.mm
@@ -23,7 +23,7 @@ #import "ios/chrome/browser/sessions/session_service_ios.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/snapshots/snapshot_browser_agent.h" -#import "ios/chrome/browser/sync/sync_error_browser_agent.h" +#import "ios/chrome/browser/sync/model/sync_error_browser_agent.h" #import "ios/chrome/browser/tab_insertion/model/tab_insertion_browser_agent.h" #import "ios/chrome/browser/tabs/closing_web_state_observer_browser_agent.h" #import "ios/chrome/browser/tabs/features.h"
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn index b20b36c..9e6df5fa 100644 --- a/ios/chrome/browser/metrics/BUILD.gn +++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -13,7 +13,7 @@ "//components/network_time", "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/browser_state", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", ] } @@ -123,7 +123,7 @@ "//ios/chrome/browser/shared/model/url:constants", "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/tabs", "//ios/chrome/browser/translate", "//ios/chrome/browser/ui/ntp:feature_flags",
diff --git a/ios/chrome/browser/metrics/DEPS b/ios/chrome/browser/metrics/DEPS index 17a3810..d2f5600 100644 --- a/ios/chrome/browser/metrics/DEPS +++ b/ios/chrome/browser/metrics/DEPS
@@ -1,6 +1,6 @@ include_rules = [ "+ios/chrome/browser/history", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/sessions", "+ios/chrome/browser/prerender", "+ios/chrome/browser/ntp/features.h",
diff --git a/ios/chrome/browser/metrics/chrome_browser_state_client.mm b/ios/chrome/browser/metrics/chrome_browser_state_client.mm index e390ef0..e2593d4 100644 --- a/ios/chrome/browser/metrics/chrome_browser_state_client.mm +++ b/ios/chrome/browser/metrics/chrome_browser_state_client.mm
@@ -10,7 +10,7 @@ #import "ios/chrome/browser/shared/model/browser_state/browser_state_info_cache.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state_manager.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" namespace metrics {
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm index 0c7fe0f..6342570 100644 --- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm +++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
@@ -72,16 +72,16 @@ #import "ios/chrome/browser/metrics/ios_feed_enabled_metrics_provider.h" #import "ios/chrome/browser/metrics/ios_profile_session_metrics_provider.h" #import "ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.h" -#import "ios/chrome/browser/shared/model/paths/paths.h" #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser/browser.h" #import "ios/chrome/browser/shared/model/browser/browser_list.h" #import "ios/chrome/browser/shared/model/browser/browser_list_factory.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state_manager.h" +#import "ios/chrome/browser/shared/model/paths/paths.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" -#import "ios/chrome/browser/sync/device_info_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/device_info_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/tabs/tab_parenting_global_observer.h" #import "ios/chrome/browser/translate/translate_ranker_metrics_provider.h" #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
diff --git a/ios/chrome/browser/metrics/ios_profile_session_durations_service_factory.mm b/ios/chrome/browser/metrics/ios_profile_session_durations_service_factory.mm index a9f04bb..7a4884da 100644 --- a/ios/chrome/browser/metrics/ios_profile_session_durations_service_factory.mm +++ b/ios/chrome/browser/metrics/ios_profile_session_durations_service_factory.mm
@@ -13,7 +13,7 @@ #import "ios/chrome/browser/shared/model/browser_state/browser_state_otr_helper.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" // static IOSProfileSessionDurationsService*
diff --git a/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.mm b/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.mm index 50a16a7..70f0eaf 100644 --- a/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.mm +++ b/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.mm
@@ -149,6 +149,8 @@ // enumerated histogram and log this case as well. break; } + base::UmaHistogramBoolean("Tab.HasThemeColor", + web_state->GetThemeColor() != nil); } #pragma mark - BrowserObserver
diff --git a/ios/chrome/browser/ntp/BUILD.gn b/ios/chrome/browser/ntp/BUILD.gn index a914074..4145d7a 100644 --- a/ios/chrome/browser/ntp/BUILD.gn +++ b/ios/chrome/browser/ntp/BUILD.gn
@@ -80,7 +80,7 @@ "//components/sync/service", "//ios/chrome/browser/default_browser:utils", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", ] } @@ -145,7 +145,7 @@ "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/test:test_support", "//ios/web/public/test:test", "//ios/web/public/test/fakes",
diff --git a/ios/chrome/browser/ntp/DEPS b/ios/chrome/browser/ntp/DEPS index 8802809..bc9bc8e9 100644 --- a/ios/chrome/browser/ntp/DEPS +++ b/ios/chrome/browser/ntp/DEPS
@@ -2,5 +2,5 @@ "+ios/chrome/browser/default_browser/utils.h", "+ios/chrome/browser/signin", "+ios/chrome/browser/discover_feed/feed_constants.h", - "+ios/chrome/browser/sync/enterprise_utils.h", + "+ios/chrome/browser/sync/model/enterprise_utils.h", ]
diff --git a/ios/chrome/browser/ntp/set_up_list.mm b/ios/chrome/browser/ntp/set_up_list.mm index 854edbd9..ba637dff 100644 --- a/ios/chrome/browser/ntp/set_up_list.mm +++ b/ios/chrome/browser/ntp/set_up_list.mm
@@ -17,7 +17,7 @@ #import "ios/chrome/browser/ntp/set_up_list_metrics.h" #import "ios/chrome/browser/ntp/set_up_list_prefs.h" #import "ios/chrome/browser/signin/authentication_service.h" -#import "ios/chrome/browser/sync/enterprise_utils.h" +#import "ios/chrome/browser/sync/model/enterprise_utils.h" using set_up_list_prefs::SetUpListItemState;
diff --git a/ios/chrome/browser/ntp/set_up_list_unittest.mm b/ios/chrome/browser/ntp/set_up_list_unittest.mm index e794532..45a7dae 100644 --- a/ios/chrome/browser/ntp/set_up_list_unittest.mm +++ b/ios/chrome/browser/ntp/set_up_list_unittest.mm
@@ -24,7 +24,7 @@ #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #import "ios/web/public/test/fakes/fake_browser_state.h" #import "ios/web/public/test/web_task_environment.h"
diff --git a/ios/chrome/browser/passwords/BUILD.gn b/ios/chrome/browser/passwords/BUILD.gn index 1460305..eb373c1 100644 --- a/ios/chrome/browser/passwords/BUILD.gn +++ b/ios/chrome/browser/passwords/BUILD.gn
@@ -86,8 +86,8 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", "//ios/chrome/browser/ssl", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync/glue", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model/glue", "//ios/chrome/browser/translate:translate", "//ios/chrome/browser/ui/infobars/coordinators", "//ios/chrome/browser/ui/ntp:logo", @@ -152,7 +152,7 @@ "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync/glue", + "//ios/chrome/browser/sync/model/glue", "//ios/chrome/browser/webdata_services/model", "//ios/web/public", "//services/network/public/cpp", @@ -226,7 +226,7 @@ "//components/sync/base", "//components/sync/model", "//ios/chrome/browser/shared/model/browser_state", - "//ios/chrome/browser/sync:model_type_store_service_factory", + "//ios/chrome/browser/sync/model:model_type_store_service_factory", "//ios/chrome/common", ] }
diff --git a/ios/chrome/browser/passwords/DEPS b/ios/chrome/browser/passwords/DEPS index 08f8cb55..6204ea6 100644 --- a/ios/chrome/browser/passwords/DEPS +++ b/ios/chrome/browser/passwords/DEPS
@@ -1,6 +1,6 @@ include_rules = [ "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/infobars", "+ios/chrome/browser/safe_browsing", "+ios/chrome/browser/autofill",
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm index 510ec50..11672b7 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
@@ -44,7 +44,7 @@ #import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/browser/shared/public/features/system_flags.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/translate/chrome_ios_translate_client.h" #import "net/cert/cert_status_flags.h" #import "services/metrics/public/cpp/ukm_recorder.h"
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_receiver_service_factory.mm b/ios/chrome/browser/passwords/ios_chrome_password_receiver_service_factory.mm index cd9b7206..fa6c78d 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_receiver_service_factory.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_receiver_service_factory.mm
@@ -22,7 +22,7 @@ #import "ios/chrome/browser/passwords/ios_chrome_account_password_store_factory.h" #import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/sync/model_type_store_service_factory.h" +#import "ios/chrome/browser/sync/model/model_type_store_service_factory.h" #import "ios/chrome/common/channel_info.h" // static
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_reuse_detection_manager_client.mm b/ios/chrome/browser/passwords/ios_chrome_password_reuse_detection_manager_client.mm index 47f6fda..ae02b2a 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_reuse_detection_manager_client.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_reuse_detection_manager_client.mm
@@ -23,7 +23,7 @@ #import "ios/chrome/browser/safe_browsing/features.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/web/public/web_state_observer_bridge.h" #import "url/gurl.h"
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_sender_service_factory.cc b/ios/chrome/browser/passwords/ios_chrome_password_sender_service_factory.cc index 3a2b608..c408158 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_sender_service_factory.cc +++ b/ios/chrome/browser/passwords/ios_chrome_password_sender_service_factory.cc
@@ -13,7 +13,7 @@ #include "components/sync/base/report_unrecoverable_error.h" #include "components/sync/model/client_tag_based_model_type_processor.h" #include "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/sync/model_type_store_service_factory.h" +#include "ios/chrome/browser/sync/model/model_type_store_service_factory.h" #include "ios/chrome/common/channel_info.h" // static
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_store_factory.mm b/ios/chrome/browser/passwords/ios_chrome_password_store_factory.mm index 3847b419..8b7f4ed 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_store_factory.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_store_factory.mm
@@ -30,7 +30,7 @@ #import "ios/chrome/browser/shared/model/browser_state/browser_state_otr_helper.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/signin_util.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "services/network/public/cpp/shared_url_loader_factory.h" using password_manager::AffiliatedMatchHelper;
diff --git a/ios/chrome/browser/passwords/ios_password_store_utils.mm b/ios/chrome/browser/passwords/ios_password_store_utils.mm index c0b6341b..501c879 100644 --- a/ios/chrome/browser/passwords/ios_password_store_utils.mm +++ b/ios/chrome/browser/passwords/ios_password_store_utils.mm
@@ -18,7 +18,7 @@ #import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" namespace password_manager { class PasswordReuseManager;
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm index 2b4cbf8..1845ad2 100644 --- a/ios/chrome/browser/passwords/password_controller.mm +++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -72,7 +72,7 @@ #import "ios/chrome/browser/shared/public/commands/passwords_account_storage_notice_commands.h" #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/web/common/url_scheme_util.h"
diff --git a/ios/chrome/browser/passwords/password_controller_egtest.mm b/ios/chrome/browser/passwords/password_controller_egtest.mm index 3eb6ea3..db273049 100644 --- a/ios/chrome/browser/passwords/password_controller_egtest.mm +++ b/ios/chrome/browser/passwords/password_controller_egtest.mm
@@ -279,8 +279,8 @@ [ChromeEarlGrey waitForUIElementToAppearWithMatcher:grey_accessibilityID(@"Eguser")]; [[EarlGrey - selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSString( - IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_THANKS))] + selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId( + IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_KEYBOARD)] performAction:grey_tap()]; [ChromeEarlGreyUI waitForAppToIdle]; // Simulate user interacting with fields.
diff --git a/ios/chrome/browser/prefs/BUILD.gn b/ios/chrome/browser/prefs/BUILD.gn index 26f98bb..e846f9be 100644 --- a/ios/chrome/browser/prefs/BUILD.gn +++ b/ios/chrome/browser/prefs/BUILD.gn
@@ -21,6 +21,6 @@ "//components/supervised_user/core/common", "//components/sync_preferences", "//ios/chrome/browser/shared/model/application_context", - "//ios/chrome/browser/sync/prefs", + "//ios/chrome/browser/sync/model/prefs", ] }
diff --git a/ios/chrome/browser/prefs/DEPS b/ios/chrome/browser/prefs/DEPS index 7da5e3c..ba7925ff 100644 --- a/ios/chrome/browser/prefs/DEPS +++ b/ios/chrome/browser/prefs/DEPS
@@ -1,3 +1,3 @@ include_rules = [ - "+ios/chrome/browser/sync/prefs", + "+ios/chrome/browser/sync/model/prefs", ]
diff --git a/ios/chrome/browser/prefs/ios_chrome_pref_model_associator_client.cc b/ios/chrome/browser/prefs/ios_chrome_pref_model_associator_client.cc index cc1321d6..503009a 100644 --- a/ios/chrome/browser/prefs/ios_chrome_pref_model_associator_client.cc +++ b/ios/chrome/browser/prefs/ios_chrome_pref_model_associator_client.cc
@@ -12,22 +12,6 @@ IOSChromePrefModelAssociatorClient::~IOSChromePrefModelAssociatorClient() {} -bool IOSChromePrefModelAssociatorClient::IsMergeableListPreference( - const std::string& pref_name) const { - return false; -} - -bool IOSChromePrefModelAssociatorClient::IsMergeableDictionaryPreference( - const std::string& pref_name) const { - const content_settings::WebsiteSettingsRegistry& registry = - *content_settings::WebsiteSettingsRegistry::GetInstance(); - for (const content_settings::WebsiteSettingsInfo* info : registry) { - if (info->pref_name() == pref_name) - return true; - } - return false; -} - base::Value IOSChromePrefModelAssociatorClient::MaybeMergePreferenceValues( const std::string& pref_name, const base::Value& local_value,
diff --git a/ios/chrome/browser/prefs/ios_chrome_pref_model_associator_client.h b/ios/chrome/browser/prefs/ios_chrome_pref_model_associator_client.h index a49f7426..45f8419 100644 --- a/ios/chrome/browser/prefs/ios_chrome_pref_model_associator_client.h +++ b/ios/chrome/browser/prefs/ios_chrome_pref_model_associator_client.h
@@ -8,7 +8,7 @@ #include <string> #include "components/sync_preferences/pref_model_associator_client.h" -#include "ios/chrome/browser/sync/prefs/ios_chrome_syncable_prefs_database.h" +#include "ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.h" class IOSChromePrefModelAssociatorClient : public sync_preferences::PrefModelAssociatorClient { @@ -23,9 +23,6 @@ ~IOSChromePrefModelAssociatorClient() override; // sync_preferences::PrefModelAssociatorClient implementation. - bool IsMergeableListPreference(const std::string& pref_name) const override; - bool IsMergeableDictionaryPreference( - const std::string& pref_name) const override; base::Value MaybeMergePreferenceValues( const std::string& pref_name, const base::Value& local_value,
diff --git a/ios/chrome/browser/prerender/BUILD.gn b/ios/chrome/browser/prerender/BUILD.gn index f4c3fe3b..08310bf 100644 --- a/ios/chrome/browser/prerender/BUILD.gn +++ b/ios/chrome/browser/prerender/BUILD.gn
@@ -93,6 +93,7 @@ testonly = true sources = [ "prerender_egtest.mm" ] deps = [ + "//build:branding_buildflags", "//components/version_info", "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/ui/content_suggestions:constants",
diff --git a/ios/chrome/browser/prerender/prerender_egtest.mm b/ios/chrome/browser/prerender/prerender_egtest.mm index ecdac0f..43680e2 100644 --- a/ios/chrome/browser/prerender/prerender_egtest.mm +++ b/ios/chrome/browser/prerender/prerender_egtest.mm
@@ -10,6 +10,7 @@ #import "base/memory/ptr_util.h" #import "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" +#import "build/branding_buildflags.h" #import "components/version_info/version_info.h" #import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h" @@ -333,7 +334,15 @@ // Regression test for crbug.com/1482622. Tests that a pre-rendered tab doesn't // lead to an incorrect data source, as can be seen after opening a new tab in // the background before the pre-rendered tab. -- (void)testOpenTabInTabStripBeforePrerenderedTab { +// TODO(crbug.com/1487677): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testOpenTabInTabStripBeforePrerenderedTab \ + DISABLED_testOpenTabInTabStripBeforePrerenderedTab +#else +#define MAYBE_testOpenTabInTabStripBeforePrerenderedTab \ + testOpenTabInTabStripBeforePrerenderedTab +#endif +- (void)MAYBE_testOpenTabInTabStripBeforePrerenderedTab { if (![ChromeEarlGrey isIPadIdiom]) { EARL_GREY_TEST_SKIPPED( @"Skipped for iPhone. The test makes use of the tab strip.");
diff --git a/ios/chrome/browser/reading_list/BUILD.gn b/ios/chrome/browser/reading_list/BUILD.gn index bde9ae9..08ba23f 100644 --- a/ios/chrome/browser/reading_list/BUILD.gn +++ b/ios/chrome/browser/reading_list/BUILD.gn
@@ -60,7 +60,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/shared/ui/util:url_with_title", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync:model_type_store_service_factory", + "//ios/chrome/browser/sync/model:model_type_store_service_factory", "//ios/chrome/browser/ui/ntp/metrics:home_metrics", "//ios/chrome/common", "//ios/components/webui:url_constants",
diff --git a/ios/chrome/browser/reading_list/DEPS b/ios/chrome/browser/reading_list/DEPS index 444fb0f1..a5ed01e2 100644 --- a/ios/chrome/browser/reading_list/DEPS +++ b/ios/chrome/browser/reading_list/DEPS
@@ -1,7 +1,7 @@ include_rules = [ "+ios/chrome/browser/favicon", "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/history", "+ios/chrome/browser/dom_distiller", ]
diff --git a/ios/chrome/browser/reading_list/reading_list_model_factory.mm b/ios/chrome/browser/reading_list/reading_list_model_factory.mm index 91898054..fef238af 100644 --- a/ios/chrome/browser/reading_list/reading_list_model_factory.mm +++ b/ios/chrome/browser/reading_list/reading_list_model_factory.mm
@@ -25,7 +25,7 @@ #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/public/features/system_flags.h" #import "ios/chrome/browser/signin/signin_util.h" -#import "ios/chrome/browser/sync/model_type_store_service_factory.h" +#import "ios/chrome/browser/sync/model/model_type_store_service_factory.h" #import "ios/web/public/thread/web_thread.h" namespace {
diff --git a/ios/chrome/browser/safe_browsing/BUILD.gn b/ios/chrome/browser/safe_browsing/BUILD.gn index 4c35cfa..821d40d 100644 --- a/ios/chrome/browser/safe_browsing/BUILD.gn +++ b/ios/chrome/browser/safe_browsing/BUILD.gn
@@ -73,7 +73,7 @@ "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/components/security_interstitials", "//ios/components/security_interstitials/safe_browsing", "//ios/components/security_interstitials/safe_browsing:util", @@ -177,7 +177,7 @@ "//ios/chrome/browser/prerender", "//ios/chrome/browser/prerender:test_support", "//ios/chrome/browser/shared/model/browser_state:test_support", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/test:test_support", "//ios/components/security_interstitials/safe_browsing", "//ios/components/security_interstitials/safe_browsing:test_support",
diff --git a/ios/chrome/browser/safe_browsing/DEPS b/ios/chrome/browser/safe_browsing/DEPS index f5d04bc..98413bd4 100644 --- a/ios/chrome/browser/safe_browsing/DEPS +++ b/ios/chrome/browser/safe_browsing/DEPS
@@ -2,7 +2,7 @@ "+ios/chrome/browser/history", "+ios/chrome/browser/infobars", "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/passwords", "+ios/chrome/browser/prerender", "+ios/chrome/browser/policy",
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm index d11edd6..029da22a 100644 --- a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm +++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm
@@ -43,8 +43,8 @@ #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/ios_user_event_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/ios_user_event_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/components/security_interstitials/safe_browsing/safe_browsing_service.h" #import "ios/web/public/navigation/navigation_item.h" #import "ios/web/public/navigation/navigation_manager.h"
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service_factory.mm b/ios/chrome/browser/safe_browsing/chrome_password_protection_service_factory.mm index e457902a..33ffc71 100644 --- a/ios/chrome/browser/safe_browsing/chrome_password_protection_service_factory.mm +++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service_factory.mm
@@ -16,8 +16,8 @@ #import "ios/chrome/browser/shared/model/browser_state/browser_state_otr_helper.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/ios_user_event_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/ios_user_event_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" // static ChromePasswordProtectionService*
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.mm b/ios/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.mm index 8fa8bb6..9951d55 100644 --- a/ios/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.mm +++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.mm
@@ -29,7 +29,7 @@ #import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #import "ios/chrome/browser/safe_browsing/safe_browsing_metrics_collector_factory.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" -#import "ios/chrome/browser/sync/ios_user_event_service_factory.h" +#import "ios/chrome/browser/sync/model/ios_user_event_service_factory.h" #import "ios/components/security_interstitials/safe_browsing/fake_safe_browsing_service.h" #import "ios/web/public/navigation/referrer.h" #import "ios/web/public/test/fakes/fake_navigation_manager.h"
diff --git a/ios/chrome/browser/safe_browsing/ohttp_key_service_factory.mm b/ios/chrome/browser/safe_browsing/ohttp_key_service_factory.mm index 8c02416..b3735449 100644 --- a/ios/chrome/browser/safe_browsing/ohttp_key_service_factory.mm +++ b/ios/chrome/browser/safe_browsing/ohttp_key_service_factory.mm
@@ -39,9 +39,13 @@ if (!safe_browsing_service) { return nullptr; } + // TODO(crbug.com/1468377): Pass through `variations_service` in + // `GetCountryCode` call. if (!base::FeatureList::IsEnabled(safe_browsing::kHashRealTimeOverOhttp) && !safe_browsing::hash_realtime_utils:: - IsHashRealTimeLookupEligibleInSession()) { + IsHashRealTimeLookupEligibleInSessionAndLocation( + safe_browsing::hash_realtime_utils::GetCountryCode( + /*variations_service=*/nullptr))) { return nullptr; } ChromeBrowserState* chrome_browser_state =
diff --git a/ios/chrome/browser/safe_browsing/real_time_url_lookup_service_factory.mm b/ios/chrome/browser/safe_browsing/real_time_url_lookup_service_factory.mm index 55cd053..cd3bcf7 100644 --- a/ios/chrome/browser/safe_browsing/real_time_url_lookup_service_factory.mm +++ b/ios/chrome/browser/safe_browsing/real_time_url_lookup_service_factory.mm
@@ -17,7 +17,7 @@ #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/components/security_interstitials/safe_browsing/safe_browsing_service.h" #import "services/network/public/cpp/shared_url_loader_factory.h"
diff --git a/ios/chrome/browser/safe_browsing/tailored_security/BUILD.gn b/ios/chrome/browser/safe_browsing/tailored_security/BUILD.gn index a8ab3406..a767e33 100644 --- a/ios/chrome/browser/safe_browsing/tailored_security/BUILD.gn +++ b/ios/chrome/browser/safe_browsing/tailored_security/BUILD.gn
@@ -25,7 +25,7 @@ "//ios/chrome/browser/overlays", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/components/security_interstitials/safe_browsing", ] }
diff --git a/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.mm b/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.mm index 561a766..6992c0f 100644 --- a/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.mm +++ b/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.mm
@@ -9,7 +9,7 @@ #import "ios/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" // static safe_browsing::TailoredSecurityService*
diff --git a/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_tab_helper.mm b/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_tab_helper.mm index a995e05..cf1a90e3 100644 --- a/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_tab_helper.mm +++ b/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_tab_helper.mm
@@ -14,7 +14,7 @@ #import "ios/chrome/browser/infobars/infobar_manager_impl.h" #import "ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_infobar_delegate.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/components/security_interstitials/safe_browsing/safe_browsing_tab_helper.h" #import "ios/web/public/navigation/navigation_context.h"
diff --git a/ios/chrome/browser/safe_browsing/user_population_helper.mm b/ios/chrome/browser/safe_browsing/user_population_helper.mm index f411a32..c818417 100644 --- a/ios/chrome/browser/safe_browsing/user_population_helper.mm +++ b/ios/chrome/browser/safe_browsing/user_population_helper.mm
@@ -12,7 +12,7 @@ #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" safe_browsing::ChromeUserPopulation GetUserPopulationForBrowserState( ChromeBrowserState* browser_state) {
diff --git a/ios/chrome/browser/safe_browsing/verdict_cache_manager_factory.mm b/ios/chrome/browser/safe_browsing/verdict_cache_manager_factory.mm index 7f8360ba9..72b245b 100644 --- a/ios/chrome/browser/safe_browsing/verdict_cache_manager_factory.mm +++ b/ios/chrome/browser/safe_browsing/verdict_cache_manager_factory.mm
@@ -14,7 +14,7 @@ #import "ios/chrome/browser/history/history_service_factory.h" #import "ios/chrome/browser/shared/model/browser_state/browser_state_otr_helper.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" // static safe_browsing::VerdictCacheManager*
diff --git a/ios/chrome/browser/safety_check/BUILD.gn b/ios/chrome/browser/safety_check/BUILD.gn index 703c427..fca6ffe 100644 --- a/ios/chrome/browser/safety_check/BUILD.gn +++ b/ios/chrome/browser/safety_check/BUILD.gn
@@ -97,8 +97,8 @@ "//ios/chrome/browser/shared/model/browser_state:test_support", "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/shared/public/features", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/upgrade", "//ios/chrome/test:test_support", "//ios/web/public/test",
diff --git a/ios/chrome/browser/segmentation_platform/BUILD.gn b/ios/chrome/browser/segmentation_platform/BUILD.gn index 3376230e..a7b91ae1 100644 --- a/ios/chrome/browser/segmentation_platform/BUILD.gn +++ b/ios/chrome/browser/segmentation_platform/BUILD.gn
@@ -37,7 +37,7 @@ "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/model/paths", "//ios/chrome/browser/shared/model/web_state_list", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", ] if (build_with_tflite_lib) { deps += [ "//components/segmentation_platform/internal:optimization_guide_segmentation_handler" ]
diff --git a/ios/chrome/browser/segmentation_platform/DEPS b/ios/chrome/browser/segmentation_platform/DEPS index 20c2871..01b47d0 100644 --- a/ios/chrome/browser/segmentation_platform/DEPS +++ b/ios/chrome/browser/segmentation_platform/DEPS
@@ -4,7 +4,7 @@ "+components/segmentation_platform", "+components/sync_device_info", "+ios/web/public", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/history", "+ios/chrome/browser/optimization_guide", "+ios/chrome/browser/metrics",
diff --git a/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.mm b/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.mm index 59e19cc..66e7ca5c 100644 --- a/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.mm +++ b/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.mm
@@ -32,9 +32,9 @@ #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser_state/browser_state_otr_helper.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/sync/device_info_sync_service_factory.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/device_info_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" namespace segmentation_platform { namespace {
diff --git a/ios/chrome/browser/send_tab_to_self/model/BUILD.gn b/ios/chrome/browser/send_tab_to_self/model/BUILD.gn index 5e9b420..c85ea73 100644 --- a/ios/chrome/browser/send_tab_to_self/model/BUILD.gn +++ b/ios/chrome/browser/send_tab_to_self/model/BUILD.gn
@@ -26,7 +26,7 @@ "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/util", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/tabs", "//ios/components/webui:url_constants", "//ios/web", @@ -52,8 +52,8 @@ "//ios/chrome/browser/shared/model/browser/test:test_support", "//ios/chrome/browser/shared/model/browser_state:test_support", "//ios/chrome/browser/shared/model/web_state_list", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/web/public/test", "//ios/web/public/test/fakes", "//testing/gtest",
diff --git a/ios/chrome/browser/send_tab_to_self/model/DEPS b/ios/chrome/browser/send_tab_to_self/model/DEPS index 6cd0111..9b2184fc 100644 --- a/ios/chrome/browser/send_tab_to_self/model/DEPS +++ b/ios/chrome/browser/send_tab_to_self/model/DEPS
@@ -1,4 +1,4 @@ include_rules = [ "+ios/chrome/browser/infobars", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", ]
diff --git a/ios/chrome/browser/send_tab_to_self/model/send_tab_to_self_browser_agent.mm b/ios/chrome/browser/send_tab_to_self/model/send_tab_to_self_browser_agent.mm index eb6029a..582355e 100644 --- a/ios/chrome/browser/send_tab_to_self/model/send_tab_to_self_browser_agent.mm +++ b/ios/chrome/browser/send_tab_to_self/model/send_tab_to_self_browser_agent.mm
@@ -26,7 +26,7 @@ #import "ios/chrome/browser/shared/model/browser/browser.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" -#import "ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h" #import "ios/web/public/web_state.h" BROWSER_USER_DATA_KEY_IMPL(SendTabToSelfBrowserAgent)
diff --git a/ios/chrome/browser/send_tab_to_self/model/send_tab_to_self_browser_agent_unittest.mm b/ios/chrome/browser/send_tab_to_self/model/send_tab_to_self_browser_agent_unittest.mm index ccf0777..aa65d55 100644 --- a/ios/chrome/browser/send_tab_to_self/model/send_tab_to_self_browser_agent_unittest.mm +++ b/ios/chrome/browser/send_tab_to_self/model/send_tab_to_self_browser_agent_unittest.mm
@@ -18,7 +18,7 @@ #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_opener.h" -#import "ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h" #import "ios/web/public/navigation/navigation_item.h" #import "ios/web/public/test/fakes/fake_navigation_manager.h" #import "ios/web/public/test/fakes/fake_web_state.h"
diff --git a/ios/chrome/browser/sessions/BUILD.gn b/ios/chrome/browser/sessions/BUILD.gn index 13767ec2..e662c2f5 100644 --- a/ios/chrome/browser/sessions/BUILD.gn +++ b/ios/chrome/browser/sessions/BUILD.gn
@@ -31,7 +31,22 @@ source_set("restoration_observer") { sources = [ "session_restoration_observer.h" ] - deps = [ "//base" ] + public_deps = [ "//base" ] +} + +source_set("restoration_observer_helper") { + sources = [ + "session_restoration_observer_helper.h", + "session_restoration_observer_helper.mm", + ] + deps = [ + ":restoration_agent", + ":restoration_observer", + ":session_restoration_service", + ":session_restoration_service_factory", + "//ios/chrome/browser/shared/model/browser", + "//ios/web/common:features", + ] } source_set("restoration_agent") { @@ -124,15 +139,8 @@ } source_set("session_restoration_service") { - sources = [ - "session_restoration_service.cc", - "session_restoration_service.h", - ] - deps = [ - "//base", - "//components/keyed_service/core", - "//ios/web/common:features", - ] + sources = [ "session_restoration_service.h" ] + deps = [ "//components/keyed_service/core" ] } source_set("session_restoration_service_impl") { @@ -151,6 +159,7 @@ "session_restoration_web_state_observer.mm", ] deps = [ + ":restoration_observer", ":session_restoration_service", "//base", "//components/sessions:session_id", @@ -173,6 +182,7 @@ "//base", "//components/keyed_service/ios", "//ios/chrome/browser/shared/model/browser_state", + "//ios/web/common:features", ] } @@ -220,10 +230,13 @@ sources = [ "proto_util.cc", "proto_util.h", + "test_session_restoration_observer.h", + "test_session_restoration_observer.mm", "test_session_service.h", "test_session_service.mm", ] deps = [ + ":restoration_observer", ":session_service", "//base", "//ios/chrome/browser/sessions/proto", @@ -250,8 +263,10 @@ "session_internal_util_unittest.mm", "session_migration_unittest.mm", "session_restoration_browser_agent_unittest.mm", + "session_restoration_observer_helper_unittest.mm", "session_restoration_scroll_observer_unittest.mm", "session_restoration_service_factory_unittest.cc", + "session_restoration_service_impl_unittest.mm", "session_restoration_web_state_list_observer_unittest.mm", "session_restoration_web_state_observer_unittest.mm", "session_service_ios_unittest.mm", @@ -263,6 +278,7 @@ ":resources_unit_tests", ":restoration_agent", ":restoration_observer", + ":restoration_observer_helper", ":serialisation", ":session_constants", ":session_internal_util",
diff --git a/ios/chrome/browser/sessions/session_restoration_browser_agent.h b/ios/chrome/browser/sessions/session_restoration_browser_agent.h index ad1dbe0..e84e21d 100644 --- a/ios/chrome/browser/sessions/session_restoration_browser_agent.h +++ b/ios/chrome/browser/sessions/session_restoration_browser_agent.h
@@ -19,7 +19,6 @@ #import "ios/web/public/web_state_observer.h" class AllWebStateObservationForwarder; -class ChromeBrowserState; @class SessionWindowIOS; @class SessionWindowIOSFactory; class SessionRestorationObserver; @@ -117,14 +116,12 @@ // The service object which handles the actual saving of sessions. SessionServiceIOS* session_service_ = nullptr; - // The list of web states to be saved. - WebStateList* web_state_list_ = nullptr; + // The Browser containing the WebStates to be saved. + Browser* browser_ = nullptr; - + // List of registered observers. base::ObserverList<SessionRestorationObserver, true> observers_; - ChromeBrowserState* browser_state_ = nullptr; - // SessionWindowIOSFactory used to create session data for saving. SessionWindowIOSFactory* session_window_ios_factory_ = nullptr;
diff --git a/ios/chrome/browser/sessions/session_restoration_browser_agent.mm b/ios/chrome/browser/sessions/session_restoration_browser_agent.mm index 76662ee4..2e4dbd5 100644 --- a/ios/chrome/browser/sessions/session_restoration_browser_agent.mm +++ b/ios/chrome/browser/sessions/session_restoration_browser_agent.mm
@@ -206,16 +206,15 @@ SessionServiceIOS* session_service, bool enable_pinned_web_states) : session_service_(session_service), - web_state_list_(browser->GetWebStateList()), - browser_state_(browser->GetBrowserState()), + browser_(browser), session_window_ios_factory_([[SessionWindowIOSFactory alloc] - initWithWebStateList:web_state_list_]), + initWithWebStateList:browser_->GetWebStateList()]), enable_pinned_web_states_(enable_pinned_web_states), - all_web_state_observer_( - std::make_unique<AllWebStateObservationForwarder>(web_state_list_, - this)) { - browser->AddObserver(this); - web_state_list_->AddObserver(this); + all_web_state_observer_(std::make_unique<AllWebStateObservationForwarder>( + browser_->GetWebStateList(), + this)) { + browser_->AddObserver(this); + browser_->GetWebStateList()->AddObserver(this); } SessionRestorationBrowserAgent::~SessionRestorationBrowserAgent() { @@ -254,15 +253,17 @@ for (auto& observer : observers_) { observer.WillStartSessionRestoration(); + observer.WillStartSessionRestoration(browser_); } // Restore the tabs (except those that would be empty). const std::vector<web::WebState*> restored_web_states = DeserializeWebStateList( - web_state_list_, FilterEmptyTabs(window), scope, + browser_->GetWebStateList(), FilterEmptyTabs(window), scope, enable_pinned_web_states_, - base::BindRepeating(&web::WebState::CreateWithStorageSession, - web::WebState::CreateParams(browser_state_))); + base::BindRepeating( + &web::WebState::CreateWithStorageSession, + web::WebState::CreateParams(browser_->GetBrowserState()))); // Setup the placeholder and start fetching the favicon for the restored // tabs if necessary. @@ -283,6 +284,7 @@ for (auto& observer : observers_) { observer.SessionRestorationFinished(restored_web_states); + observer.SessionRestorationFinished(browser_, restored_web_states); } // Session restoration is complete. @@ -303,7 +305,7 @@ SessionWindowIOS* session_window = [session_service_ loadSessionWithSessionID:session_identifier_ - directory:browser_state_->GetStatePath()]; + directory:browser_->GetBrowserState()->GetStatePath()]; RestoreSessionWindow(session_window, SessionRestorationScope::kAll); base::UmaHistogramTimes("Session.WebStates.LoadingTimeOnMainThread", @@ -320,7 +322,8 @@ if (!CanSaveSession()) return; - if (web_state_list_->IsBatchInProgress()) { + WebStateList* const web_state_list = browser_->GetWebStateList(); + if (web_state_list->IsBatchInProgress()) { save_after_batch_ = true; save_immediately_ = save_immediately_ || immediately; return; @@ -328,12 +331,12 @@ [session_service_ saveSession:session_window_ios_factory_ sessionID:session_identifier_ - directory:browser_state_->GetStatePath() + directory:browser_->GetBrowserState()->GetStatePath() immediately:immediately]; if (web::UseNativeSessionRestorationCache()) { - for (int i = 0; i < web_state_list_->count(); ++i) { - web::WebState* web_state = web_state_list_->GetWebStateAt(i); + for (int i = 0; i < web_state_list->count(); ++i) { + web::WebState* web_state = web_state_list->GetWebStateAt(i); WebSessionStateTabHelper::FromWebState(web_state) ->SaveSessionStateIfStale(); } @@ -367,14 +370,15 @@ return false; } - // A session requires an active browser state and web state list. - if (!browser_state_ || !web_state_list_) { + // A session requires an active Browser. + if (!browser_) { return false; } // Sessions where there's no active tab shouldn't be saved, unless the web // state list is empty. This is a transitional state. - if (!web_state_list_->empty() && !web_state_list_->GetActiveWebState()) { + WebStateList* const web_state_list = browser_->GetWebStateList(); + if (!web_state_list->empty() && !web_state_list->GetActiveWebState()) { return false; } @@ -384,12 +388,14 @@ #pragma mark - BrowserObserver void SessionRestorationBrowserAgent::BrowserDestroyed(Browser* browser) { - DCHECK_EQ(browser->GetWebStateList(), web_state_list_); + DCHECK_EQ(browser, browser_); // Stop observing web states. all_web_state_observer_.reset(); + // Stop observing web state list. - browser->GetWebStateList()->RemoveObserver(this); - browser->RemoveObserver(this); + browser_->GetWebStateList()->RemoveObserver(this); + browser_->RemoveObserver(this); + browser_ = nullptr; } #pragma mark - WebStateListObserver @@ -398,6 +404,7 @@ WebStateList* web_state_list, const WebStateListChangeDetach& detach_change, const WebStateListStatus& status) { + DCHECK_EQ(browser_->GetWebStateList(), web_state_list); if (web_state_list->active_index() == status.index) { return; } @@ -410,12 +417,13 @@ WebStateList* web_state_list, const WebStateListChange& change, const WebStateListStatus& status) { + DCHECK_EQ(browser_->GetWebStateList(), web_state_list); switch (change.type()) { case WebStateListChange::Type::kStatusOnly: // The activation is handled after this switch statement. break; case WebStateListChange::Type::kDetach: { - if (!web_state_list_->empty()) { + if (!web_state_list->empty()) { break; }
diff --git a/ios/chrome/browser/sessions/session_restoration_browser_agent_unittest.mm b/ios/chrome/browser/sessions/session_restoration_browser_agent_unittest.mm index af43b50..7ae7f548 100644 --- a/ios/chrome/browser/sessions/session_restoration_browser_agent_unittest.mm +++ b/ios/chrome/browser/sessions/session_restoration_browser_agent_unittest.mm
@@ -14,8 +14,8 @@ #import "ios/chrome/browser/ntp/new_tab_page_tab_helper_delegate.h" #import "ios/chrome/browser/sessions/ios_chrome_session_tab_helper.h" #import "ios/chrome/browser/sessions/session_restoration_browser_agent.h" -#import "ios/chrome/browser/sessions/session_restoration_observer.h" #import "ios/chrome/browser/sessions/session_window_ios.h" +#import "ios/chrome/browser/sessions/test_session_restoration_observer.h" #import "ios/chrome/browser/sessions/test_session_service.h" #import "ios/chrome/browser/shared/model/browser/browser.h" #import "ios/chrome/browser/shared/model/browser/test/test_browser.h" @@ -126,22 +126,6 @@ selectedIndex:session_info.active_index]; } -class TestRestorationObserver : public SessionRestorationObserver { - public: - bool restore_started() { return restore_started_; } - int restored_web_states_count() { return restored_web_states_count_; } - - private: - void WillStartSessionRestoration() override { restore_started_ = true; } - void SessionRestorationFinished( - const std::vector<web::WebState*>& restored_web_states) override { - restored_web_states_count_ = restored_web_states.size(); - } - - bool restore_started_ = false; - int restored_web_states_count_ = -1; -}; - class SessionRestorationBrowserAgentTest : public PlatformTest { public: SessionRestorationBrowserAgentTest() { @@ -823,7 +807,7 @@ /*pinned=*/false, /*background=*/false); - TestRestorationObserver observer; + TestSessionRestorationObserver observer; session_restoration_agent_->AddObserver(&observer); SessionWindowIOS* window =
diff --git a/ios/chrome/browser/sessions/session_restoration_observer.h b/ios/chrome/browser/sessions/session_restoration_observer.h index 69a8b55..09885b4 100644 --- a/ios/chrome/browser/sessions/session_restoration_observer.h +++ b/ios/chrome/browser/sessions/session_restoration_observer.h
@@ -9,6 +9,7 @@ #include "base/observer_list_types.h" +class Browser; namespace web { class WebState; } // namespace web @@ -16,19 +17,24 @@ // Observer interface for objects interested in Session restoration events. class SessionRestorationObserver : public base::CheckedObserver { public: - SessionRestorationObserver(const SessionRestorationObserver&) = delete; - SessionRestorationObserver& operator=(const SessionRestorationObserver&) = - delete; + SessionRestorationObserver() = default; // Invoked before the session restoration starts. + // OBSOLETE: override `WillStartSessionRestoration(Browser*)` instead. virtual void WillStartSessionRestoration() {} // Invoked when the session restoration is finished. + // OBSOLETE: override `SessionRestorationFinished(Browser*, ...)` instead. virtual void SessionRestorationFinished( const std::vector<web::WebState*>& restored_web_states) {} - protected: - SessionRestorationObserver() = default; + // Invoked before the session restoration starts for `browser`. + virtual void WillStartSessionRestoration(Browser* browser) {} + + // Invoked when the session restoration is finished for `browser`. + virtual void SessionRestorationFinished( + Browser* browser, + const std::vector<web::WebState*>& restored_web_states) {} }; #endif // IOS_CHROME_BROWSER_SESSIONS_SESSION_RESTORATION_OBSERVER_H_
diff --git a/ios/chrome/browser/sessions/session_restoration_observer_helper.h b/ios/chrome/browser/sessions/session_restoration_observer_helper.h new file mode 100644 index 0000000..592f006 --- /dev/null +++ b/ios/chrome/browser/sessions/session_restoration_observer_helper.h
@@ -0,0 +1,26 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SESSIONS_SESSION_RESTORATION_OBSERVER_HELPER_H_ +#define IOS_CHROME_BROWSER_SESSIONS_SESSION_RESTORATION_OBSERVER_HELPER_H_ + +class Browser; +class SessionRestorationObserver; + +// There are two separate classes that can notify of session restoration +// events depending on UseSessionSerializationOptimizations(). This file +// provides helper function abstracting the registration/unregistration +// of SessionRestorationObservers. +// +// TODO(crbug.com/1383087): remove once the feature is fully launched. + +// Registers `observer` as a SessionRestorationObserver for `browser`. +void AddSessionRestorationObserver(Browser* browser, + SessionRestorationObserver* observer); + +// Unregisters `observer` from SessionRestorationObservers of `browser`. +void RemoveSessionRestorationObserver(Browser* browser, + SessionRestorationObserver* observer); + +#endif // IOS_CHROME_BROWSER_SESSIONS_SESSION_RESTORATION_OBSERVER_HELPER_H_
diff --git a/ios/chrome/browser/sessions/session_restoration_observer_helper.mm b/ios/chrome/browser/sessions/session_restoration_observer_helper.mm new file mode 100644 index 0000000..4ffd469 --- /dev/null +++ b/ios/chrome/browser/sessions/session_restoration_observer_helper.mm
@@ -0,0 +1,41 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/sessions/session_restoration_observer_helper.h" + +#import "ios/chrome/browser/sessions/session_restoration_browser_agent.h" +#import "ios/chrome/browser/sessions/session_restoration_service.h" +#import "ios/chrome/browser/sessions/session_restoration_service_factory.h" +#import "ios/chrome/browser/shared/model/browser/browser.h" +#import "ios/web/common/features.h" + +void AddSessionRestorationObserver(Browser* browser, + SessionRestorationObserver* observer) { + if (web::features::UseSessionSerializationOptimizations()) { + SessionRestorationServiceFactory::GetForBrowserState( + browser->GetBrowserState()) + ->AddObserver(observer); + } else { + // The SessionRestorationBrowserAgent may not be created during unit tests, + // so only perform the registration if it has been created. + if (auto* agent = SessionRestorationBrowserAgent::FromBrowser(browser)) { + agent->AddObserver(observer); + } + } +} + +void RemoveSessionRestorationObserver(Browser* browser, + SessionRestorationObserver* observer) { + if (web::features::UseSessionSerializationOptimizations()) { + SessionRestorationServiceFactory::GetForBrowserState( + browser->GetBrowserState()) + ->RemoveObserver(observer); + } else { + // The SessionRestorationBrowserAgent may not be created during unit tests, + // so only perform the unregistration if it has been created. + if (auto* agent = SessionRestorationBrowserAgent::FromBrowser(browser)) { + agent->RemoveObserver(observer); + } + } +}
diff --git a/ios/chrome/browser/sessions/session_restoration_observer_helper_unittest.mm b/ios/chrome/browser/sessions/session_restoration_observer_helper_unittest.mm new file mode 100644 index 0000000..62af971 --- /dev/null +++ b/ios/chrome/browser/sessions/session_restoration_observer_helper_unittest.mm
@@ -0,0 +1,85 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/sessions/session_restoration_observer_helper.h" + +#import "base/test/scoped_feature_list.h" +#import "base/test/task_environment.h" +#import "ios/chrome/browser/sessions/session_restoration_browser_agent.h" +#import "ios/chrome/browser/sessions/test_session_restoration_observer.h" +#import "ios/chrome/browser/sessions/test_session_service.h" +#import "ios/chrome/browser/shared/model/browser/test/test_browser.h" +#import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" +#import "ios/chrome/browser/shared/model/web_state_list/test/fake_web_state_list_delegate.h" +#import "testing/platform_test.h" + +// To get access to web::features::kEnableSessionSerializationOptimizations. +// TODO(crbug.com/1383087): remove once the feature is fully launched. +#import "ios/web/common/features.h" + +using SessionRestorationObserverHelperTest = PlatformTest; + +// Tests that registering an observer works with legacy session restoration. +TEST_F(SessionRestorationObserverHelperTest, ObserverRegistration_Legacy) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature( + web::features::kEnableSessionSerializationOptimizations); + + base::test::TaskEnvironment scoped_task_environment; + std::unique_ptr<TestChromeBrowserState> browser_state = + TestChromeBrowserState::Builder().Build(); + + std::unique_ptr<Browser> browser = std::make_unique<TestBrowser>( + browser_state.get(), std::make_unique<FakeWebStateListDelegate>()); + + TestSessionRestorationObserver observer; + ASSERT_FALSE(observer.IsInObserverList()); + ASSERT_FALSE(SessionRestorationBrowserAgent::FromBrowser(browser.get())); + + // Check that registering the observer when the BrowserAgent has not been + // created still works, but does nothing. + AddSessionRestorationObserver(browser.get(), &observer); + EXPECT_FALSE(observer.IsInObserverList()); + + RemoveSessionRestorationObserver(browser.get(), &observer); + EXPECT_FALSE(observer.IsInObserverList()); + + // Create the BrowserAgent. + SessionRestorationBrowserAgent::CreateForBrowser( + browser.get(), [[TestSessionService alloc] init], + /* enable_pinned_tabs */ true); + ASSERT_TRUE(SessionRestorationBrowserAgent::FromBrowser(browser.get())); + + // Check that registering the observer when the BrowserAgent has been + // created works correctly. + AddSessionRestorationObserver(browser.get(), &observer); + EXPECT_TRUE(observer.IsInObserverList()); + + RemoveSessionRestorationObserver(browser.get(), &observer); + EXPECT_FALSE(observer.IsInObserverList()); +} + +// Tests that registering an observer works with optimized session restoration. +TEST_F(SessionRestorationObserverHelperTest, ObserverRegistration_Optimized) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature( + web::features::kEnableSessionSerializationOptimizations); + + base::test::TaskEnvironment scoped_task_environment; + std::unique_ptr<TestChromeBrowserState> browser_state = + TestChromeBrowserState::Builder().Build(); + + std::unique_ptr<Browser> browser = std::make_unique<TestBrowser>( + browser_state.get(), std::make_unique<FakeWebStateListDelegate>()); + + TestSessionRestorationObserver observer; + ASSERT_FALSE(observer.IsInObserverList()); + + // Check that registering the observer works. + AddSessionRestorationObserver(browser.get(), &observer); + EXPECT_TRUE(observer.IsInObserverList()); + + RemoveSessionRestorationObserver(browser.get(), &observer); + EXPECT_FALSE(observer.IsInObserverList()); +}
diff --git a/ios/chrome/browser/sessions/session_restoration_service.cc b/ios/chrome/browser/sessions/session_restoration_service.cc deleted file mode 100644 index c34e6dd..0000000 --- a/ios/chrome/browser/sessions/session_restoration_service.cc +++ /dev/null
@@ -1,17 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ios/chrome/browser/sessions/session_restoration_service.h" - -#include "base/check.h" - -// To get access to web::features::kEnableSessionSerializationOptimizations. -// TODO(crbug.com/1383087): remove once the feature is fully launched. -#import "ios/web/common/features.h" - -SessionRestorationService::SessionRestorationService() { - DCHECK(web::features::UseSessionSerializationOptimizations()); -} - -SessionRestorationService::~SessionRestorationService() = default;
diff --git a/ios/chrome/browser/sessions/session_restoration_service.h b/ios/chrome/browser/sessions/session_restoration_service.h index bc743ea..0a2f4c9 100644 --- a/ios/chrome/browser/sessions/session_restoration_service.h +++ b/ios/chrome/browser/sessions/session_restoration_service.h
@@ -7,6 +7,8 @@ #include "components/keyed_service/core/keyed_service.h" +class SessionRestorationObserver; + // Service responsible for session saving and restoration. // // This service is only used when the optimized session restoration @@ -16,8 +18,15 @@ // TODO(crbug.com/1383087): Update this comment once launched. class SessionRestorationService : public KeyedService { public: - SessionRestorationService(); - ~SessionRestorationService() override; + SessionRestorationService() = default; + ~SessionRestorationService() override = default; + + // Registers `observer` to be notified about session restoration events. + virtual void AddObserver(SessionRestorationObserver* observer) = 0; + + // Unregisters `observer` from the list of observers to notify about + // session restoration events. + virtual void RemoveObserver(SessionRestorationObserver* observer) = 0; }; #endif // IOS_CHROME_BROWSER_SESSIONS_SESSION_RESTORATION_SERVICE_H_
diff --git a/ios/chrome/browser/sessions/session_restoration_service_factory.cc b/ios/chrome/browser/sessions/session_restoration_service_factory.cc index 3b4df64..b6d294f 100644 --- a/ios/chrome/browser/sessions/session_restoration_service_factory.cc +++ b/ios/chrome/browser/sessions/session_restoration_service_factory.cc
@@ -9,6 +9,10 @@ #include "ios/chrome/browser/shared/model/browser_state/browser_state_otr_helper.h" #include "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" +// To get access to web::features::kEnableSessionSerializationOptimizations. +// TODO(crbug.com/1383087): remove once the feature is fully launched. +#import "ios/web/common/features.h" + // static SessionRestorationService* SessionRestorationServiceFactory::GetForBrowserState( ChromeBrowserState* browser_state) { @@ -33,6 +37,7 @@ std::unique_ptr<KeyedService> SessionRestorationServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { + DCHECK(web::features::UseSessionSerializationOptimizations()); return std::make_unique<SessionRestorationServiceImpl>(); }
diff --git a/ios/chrome/browser/sessions/session_restoration_service_impl.h b/ios/chrome/browser/sessions/session_restoration_service_impl.h index 5e234ff3..9be61fa 100644 --- a/ios/chrome/browser/sessions/session_restoration_service_impl.h +++ b/ios/chrome/browser/sessions/session_restoration_service_impl.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_SESSIONS_SESSION_RESTORATION_SERVICE_IMPL_H_ #define IOS_CHROME_BROWSER_SESSIONS_SESSION_RESTORATION_SERVICE_IMPL_H_ +#include "base/observer_list.h" +#include "ios/chrome/browser/sessions/session_restoration_observer.h" #include "ios/chrome/browser/sessions/session_restoration_service.h" class SessionRestorationServiceImpl final : public SessionRestorationService { @@ -14,6 +16,14 @@ // KeyedService implementation. void Shutdown() final; + + // SessionRestorationService implementation. + void AddObserver(SessionRestorationObserver* observer) final; + void RemoveObserver(SessionRestorationObserver* observer) final; + + private: + // Observer list. + base::ObserverList<SessionRestorationObserver, true> observers_; }; #endif // IOS_CHROME_BROWSER_SESSIONS_SESSION_RESTORATION_SERVICE_IMPL_H_
diff --git a/ios/chrome/browser/sessions/session_restoration_service_impl.mm b/ios/chrome/browser/sessions/session_restoration_service_impl.mm index f8d152e3..0c17956 100644 --- a/ios/chrome/browser/sessions/session_restoration_service_impl.mm +++ b/ios/chrome/browser/sessions/session_restoration_service_impl.mm
@@ -9,3 +9,13 @@ SessionRestorationServiceImpl::~SessionRestorationServiceImpl() = default; void SessionRestorationServiceImpl::Shutdown() {} + +void SessionRestorationServiceImpl::AddObserver( + SessionRestorationObserver* observer) { + observers_.AddObserver(observer); +} + +void SessionRestorationServiceImpl::RemoveObserver( + SessionRestorationObserver* observer) { + observers_.RemoveObserver(observer); +}
diff --git a/ios/chrome/browser/sessions/session_restoration_service_impl_unittest.mm b/ios/chrome/browser/sessions/session_restoration_service_impl_unittest.mm new file mode 100644 index 0000000..6f63cb2 --- /dev/null +++ b/ios/chrome/browser/sessions/session_restoration_service_impl_unittest.mm
@@ -0,0 +1,24 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/sessions/session_restoration_service_impl.h" + +#import "ios/chrome/browser/sessions/test_session_restoration_observer.h" +#import "testing/platform_test.h" + +using SessionRestorationServiceImplTest = PlatformTest; + +// Tests that adding and removing observer works correctly. +TEST_F(SessionRestorationServiceImplTest, ObserverRegistration) { + SessionRestorationServiceImpl service; + TestSessionRestorationObserver observer; + ASSERT_FALSE(observer.IsInObserverList()); + + // Check that registering/unregistering the observer works. + service.AddObserver(&observer); + EXPECT_TRUE(observer.IsInObserverList()); + + service.RemoveObserver(&observer); + EXPECT_FALSE(observer.IsInObserverList()); +}
diff --git a/ios/chrome/browser/sessions/test_session_restoration_observer.h b/ios/chrome/browser/sessions/test_session_restoration_observer.h new file mode 100644 index 0000000..891caa5 --- /dev/null +++ b/ios/chrome/browser/sessions/test_session_restoration_observer.h
@@ -0,0 +1,28 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SESSIONS_TEST_SESSION_RESTORATION_OBSERVER_H_ +#define IOS_CHROME_BROWSER_SESSIONS_TEST_SESSION_RESTORATION_OBSERVER_H_ + +#import "ios/chrome/browser/sessions/session_restoration_observer.h" + +// An implementation of SessionRestorationObserver recording the method +// calls and their parameters for use in test. +class TestSessionRestorationObserver : public SessionRestorationObserver { + public: + bool restore_started() { return restore_started_; } + int restored_web_states_count() { return restored_web_states_count_; } + + // SessionRestorationObserver implementation. + void WillStartSessionRestoration(Browser* browser) override; + void SessionRestorationFinished( + Browser* browser, + const std::vector<web::WebState*>& restored_web_states) override; + + private: + bool restore_started_ = false; + int restored_web_states_count_ = -1; +}; + +#endif // IOS_CHROME_BROWSER_SESSIONS_TEST_SESSION_RESTORATION_OBSERVER_H_
diff --git a/ios/chrome/browser/sessions/test_session_restoration_observer.mm b/ios/chrome/browser/sessions/test_session_restoration_observer.mm new file mode 100644 index 0000000..27b8410 --- /dev/null +++ b/ios/chrome/browser/sessions/test_session_restoration_observer.mm
@@ -0,0 +1,16 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/sessions/test_session_restoration_observer.h" + +void TestSessionRestorationObserver::WillStartSessionRestoration( + Browser* browser) { + restore_started_ = true; +} + +void TestSessionRestorationObserver::SessionRestorationFinished( + Browser* browser, + const std::vector<web::WebState*>& restored_web_states) { + restored_web_states_count_ = static_cast<int>(restored_web_states.size()); +}
diff --git a/ios/chrome/browser/settings/DEPS b/ios/chrome/browser/settings/DEPS index f1ff46e..241f26e 100644 --- a/ios/chrome/browser/settings/DEPS +++ b/ios/chrome/browser/settings/DEPS
@@ -1,5 +1,5 @@ include_rules = [ "+ios/chrome/browser/infobars", "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", ]
diff --git a/ios/chrome/browser/settings/sync/utils/BUILD.gn b/ios/chrome/browser/settings/sync/utils/BUILD.gn index eb5dbed..b08b6b0 100644 --- a/ios/chrome/browser/settings/sync/utils/BUILD.gn +++ b/ios/chrome/browser/settings/sync/utils/BUILD.gn
@@ -26,7 +26,7 @@ "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/symbols", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ui/base", ] frameworks = [ "Foundation.framework" ] @@ -63,8 +63,8 @@ "//ios/chrome/browser/shared/model/browser_state:test_support", "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/shared/ui/symbols", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/common/ui/colors", "//ios/web/public/test", "//testing/gtest",
diff --git a/ios/chrome/browser/settings/sync/utils/sync_error_infobar_delegate.mm b/ios/chrome/browser/settings/sync/utils/sync_error_infobar_delegate.mm index b18dcfc..151b06d1 100644 --- a/ios/chrome/browser/settings/sync/utils/sync_error_infobar_delegate.mm +++ b/ios/chrome/browser/settings/sync/utils/sync_error_infobar_delegate.mm
@@ -20,7 +20,7 @@ #import "ios/chrome/browser/settings/sync/utils/sync_presenter.h" #import "ios/chrome/browser/settings/sync/utils/sync_util.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" // static bool SyncErrorInfoBarDelegate::Create(infobars::InfoBarManager* infobar_manager,
diff --git a/ios/chrome/browser/settings/sync/utils/sync_error_infobar_delegate_unittest.mm b/ios/chrome/browser/settings/sync/utils/sync_error_infobar_delegate_unittest.mm index 849dbfc..1589280 100644 --- a/ios/chrome/browser/settings/sync/utils/sync_error_infobar_delegate_unittest.mm +++ b/ios/chrome/browser/settings/sync/utils/sync_error_infobar_delegate_unittest.mm
@@ -15,8 +15,8 @@ #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/browser/shared/ui/symbols/symbols.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/web/public/test/web_task_environment.h" #import "testing/gtest_mac.h"
diff --git a/ios/chrome/browser/settings/sync/utils/sync_util.mm b/ios/chrome/browser/settings/sync/utils/sync_util.mm index 5eee1a2..1938675 100644 --- a/ios/chrome/browser/settings/sync/utils/sync_util.mm +++ b/ios/chrome/browser/settings/sync/utils/sync_util.mm
@@ -22,7 +22,7 @@ #import "ios/chrome/browser/shared/public/commands/browsing_data_commands.h" #import "ios/chrome/browser/shared/public/commands/show_signin_command.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm index d18b9d7..2a96e78 100644 --- a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm +++ b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
@@ -1488,6 +1488,12 @@ } } + if (_signedInAccountsVC) { + // Don't handle intents if the user has the Signed In Accounts view + // controller presented on the screen. + return NO; + } + return YES; } @@ -1509,12 +1515,13 @@ } - (void)showHistory { + CHECK(!self.currentInterface.incognito) + << "Current interface is incognito and should NOT show history. Call " + "this on regular interface."; self.historyCoordinator = [[HistoryCoordinator alloc] initWithBaseViewController:self.currentInterface.viewController browser:self.mainInterface.browser]; - self.historyCoordinator.loadStrategy = - self.currentInterface.incognito ? UrlLoadStrategy::ALWAYS_IN_INCOGNITO - : UrlLoadStrategy::NORMAL; + self.historyCoordinator.loadStrategy = UrlLoadStrategy::NORMAL; self.historyCoordinator.delegate = self; [self.historyCoordinator start]; }
diff --git a/ios/chrome/browser/shared/public/commands/BUILD.gn b/ios/chrome/browser/shared/public/commands/BUILD.gn index f3dbcc8..011dea2 100644 --- a/ios/chrome/browser/shared/public/commands/BUILD.gn +++ b/ios/chrome/browser/shared/public/commands/BUILD.gn
@@ -60,6 +60,7 @@ "text_zoom_commands.h", "toolbar_commands.h", "tos_commands.h", + "unit_conversion_commands.h", "web_content_commands.h", "whats_new_commands.h", ]
diff --git a/ios/chrome/browser/shared/public/commands/unit_conversion_commands.h b/ios/chrome/browser/shared/public/commands/unit_conversion_commands.h new file mode 100644 index 0000000..0820dd0 --- /dev/null +++ b/ios/chrome/browser/shared/public/commands/unit_conversion_commands.h
@@ -0,0 +1,22 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_UNIT_CONVERSION_COMMANDS_H_ +#define IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_UNIT_CONVERSION_COMMANDS_H_ + +// Commands related to the Unit Conversion feature. +@protocol UnitConversionCommands <NSObject> + +// Shows unit conversion for a source unit/value/location (location of the tap +// in the web view). Note that the set of units is not restricted. +- (void)presentUnitConversionForSourceUnit:(NSUnit*)sourceUnit + sourceUnitValue:(double)sourceUnitValue + location:(CGPoint)location; + +// Hides the unit conversion view. +- (void)hideUnitConversion; + +@end + +#endif // IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_UNIT_CONVERSION_COMMANDS_H_
diff --git a/ios/chrome/browser/signin/BUILD.gn b/ios/chrome/browser/signin/BUILD.gn index 39014f5..4ad43f5 100644 --- a/ios/chrome/browser/signin/BUILD.gn +++ b/ios/chrome/browser/signin/BUILD.gn
@@ -316,7 +316,7 @@ "//components/signin/public/identity_manager:test_support", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/model/browser_state:test_support", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", ] } @@ -381,8 +381,8 @@ "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/public/features:system_flags", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/web", "//ios/chrome/test:test_support", "//ios/net",
diff --git a/ios/chrome/browser/signin/DEPS b/ios/chrome/browser/signin/DEPS index b033cb8..b659b70d 100644 --- a/ios/chrome/browser/signin/DEPS +++ b/ios/chrome/browser/signin/DEPS
@@ -9,7 +9,7 @@ "+ios/chrome/browser/bookmarks/model", "+ios/chrome/browser/crash_report/model", "+ios/chrome/browser/policy", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/web_state_list", "+ios/chrome/browser/web", "+ios/chrome/browser/webdata_services/model",
diff --git a/ios/chrome/browser/signin/authentication_service.mm b/ios/chrome/browser/signin/authentication_service.mm index b0e421e..b774bf7a 100644 --- a/ios/chrome/browser/signin/authentication_service.mm +++ b/ios/chrome/browser/signin/authentication_service.mm
@@ -36,7 +36,7 @@ #import "ios/chrome/browser/signin/signin_util.h" #import "ios/chrome/browser/signin/system_identity.h" #import "ios/chrome/browser/signin/system_identity_manager.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" #import "ios/chrome/browser/ui/authentication/signin/signin_utils.h" namespace {
diff --git a/ios/chrome/browser/signin/authentication_service_factory.mm b/ios/chrome/browser/signin/authentication_service_factory.mm index 7f59a74..bf86902 100644 --- a/ios/chrome/browser/signin/authentication_service_factory.mm +++ b/ios/chrome/browser/signin/authentication_service_factory.mm
@@ -14,8 +14,8 @@ #import "ios/chrome/browser/signin/authentication_service_delegate.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" namespace {
diff --git a/ios/chrome/browser/signin/authentication_service_unittest.mm b/ios/chrome/browser/signin/authentication_service_unittest.mm index c86fbea2..10c191a 100644 --- a/ios/chrome/browser/signin/authentication_service_unittest.mm +++ b/ios/chrome/browser/signin/authentication_service_unittest.mm
@@ -44,10 +44,10 @@ #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/signin/refresh_access_token_error.h" #import "ios/chrome/browser/signin/system_identity.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_mock.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_mock.h" #import "ios/chrome/test/testing_application_context.h" #import "ios/web/public/test/web_task_environment.h" #import "testing/gtest/include/gtest/gtest.h"
diff --git a/ios/chrome/browser/supervised_user/BUILD.gn b/ios/chrome/browser/supervised_user/BUILD.gn index 92b0e4c..cb7d035 100644 --- a/ios/chrome/browser/supervised_user/BUILD.gn +++ b/ios/chrome/browser/supervised_user/BUILD.gn
@@ -40,7 +40,7 @@ "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/components/security_interstitials", "//ios/net", "//ios/web/public/js_messaging:js_messaging",
diff --git a/ios/chrome/browser/supervised_user/DEPS b/ios/chrome/browser/supervised_user/DEPS index a025b46..2a7ba96 100644 --- a/ios/chrome/browser/supervised_user/DEPS +++ b/ios/chrome/browser/supervised_user/DEPS
@@ -1,5 +1,5 @@ include_rules = [ "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/first_run", ]
diff --git a/ios/chrome/browser/supervised_user/supervised_user_service_factory.mm b/ios/chrome/browser/supervised_user/supervised_user_service_factory.mm index 024e1b9b..febb376 100644 --- a/ios/chrome/browser/supervised_user/supervised_user_service_factory.mm +++ b/ios/chrome/browser/supervised_user/supervised_user_service_factory.mm
@@ -16,7 +16,7 @@ #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/supervised_user/kids_chrome_management_client_factory.h" #import "ios/chrome/browser/supervised_user/supervised_user_settings_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "url/gurl.h" namespace {
diff --git a/ios/chrome/browser/sync/BUILD.gn b/ios/chrome/browser/sync/BUILD.gn deleted file mode 100644 index 32206cc..0000000 --- a/ios/chrome/browser/sync/BUILD.gn +++ /dev/null
@@ -1,192 +0,0 @@ -# Copyright 2016 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -source_set("sync") { - sources = [ - "device_info_sync_service_factory.h", - "device_info_sync_service_factory.mm", - "enterprise_utils.cc", - "enterprise_utils.h", - "ios_chrome_sync_client.h", - "ios_chrome_sync_client.mm", - "ios_chrome_synced_tab_delegate.h", - "ios_chrome_synced_tab_delegate.mm", - "ios_user_event_service_factory.cc", - "ios_user_event_service_factory.h", - "send_tab_to_self_sync_service_factory.h", - "send_tab_to_self_sync_service_factory.mm", - "session_sync_service_factory.h", - "session_sync_service_factory.mm", - "sync_invalidations_service_factory.h", - "sync_invalidations_service_factory.mm", - "sync_observer_bridge.h", - "sync_observer_bridge.mm", - "sync_service_factory.h", - "sync_service_factory.mm", - "sync_setup_service.cc", - "sync_setup_service.h", - "sync_setup_service_factory.cc", - "sync_setup_service_factory.h", - ] - deps = [ - ":model_type_store_service_factory", - "//base", - "//components/autofill/core/browser", - "//components/browser_sync", - "//components/consent_auditor", - "//components/dom_distiller/core", - "//components/history/core/browser", - "//components/invalidation/impl", - "//components/keyed_service/core", - "//components/keyed_service/ios", - "//components/metrics/demographics", - "//components/network_time", - "//components/password_manager/core/browser", - "//components/password_manager/core/browser/sharing", - "//components/pref_registry", - "//components/prefs", - "//components/reading_list/core", - "//components/search_engines", - "//components/send_tab_to_self", - "//components/sessions", - "//components/signin/public/identity_manager", - "//components/supervised_user/core/browser", - "//components/supervised_user/core/common:buildflags", - "//components/sync", - "//components/sync_device_info", - "//components/sync_preferences", - "//components/sync_sessions", - "//components/sync_user_events", - "//components/trusted_vault", - "//components/variations/service", - "//components/version_info", - "//google_apis", - "//ios/chrome/browser/bookmarks/model", - "//ios/chrome/browser/complex_tasks/model", - "//ios/chrome/browser/consent_auditor/model", - "//ios/chrome/browser/dom_distiller", - "//ios/chrome/browser/favicon", - "//ios/chrome/browser/gcm", - "//ios/chrome/browser/gcm/instance_id", - "//ios/chrome/browser/history", - "//ios/chrome/browser/invalidation", - "//ios/chrome/browser/metrics:google_groups_updater", - "//ios/chrome/browser/passwords:sharing_factory", - "//ios/chrome/browser/passwords:store_factory", - "//ios/chrome/browser/power_bookmarks", - "//ios/chrome/browser/reading_list", - "//ios/chrome/browser/search_engines", - "//ios/chrome/browser/sessions", - "//ios/chrome/browser/shared/model/application_context", - "//ios/chrome/browser/shared/model/browser", - "//ios/chrome/browser/shared/model/browser_state", - "//ios/chrome/browser/shared/model/prefs:pref_names", - "//ios/chrome/browser/shared/model/url:constants", - "//ios/chrome/browser/signin", - "//ios/chrome/browser/supervised_user:sync_settings_factory", - "//ios/chrome/browser/sync/glue", - "//ios/chrome/browser/sync/sessions", - "//ios/chrome/browser/tabs", - "//ios/chrome/browser/trusted_vault", - "//ios/chrome/browser/webdata_services/model", - "//ios/chrome/common", - "//ios/components/webui:url_constants", - "//ios/web", - "//ios/web/common:features", - "//ios/web/public/session", - "//net", - "//ui/base", - "//url", - ] - allow_circular_includes_from = [ - "//ios/chrome/browser/history", - "//ios/chrome/browser/passwords:store_factory", - "//ios/chrome/browser/reading_list", - "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync/glue", - "//ios/chrome/browser/sync/sessions", - ] -} - -source_set("model_type_store_service_factory") { - sources = [ - "model_type_store_service_factory.cc", - "model_type_store_service_factory.h", - ] - deps = [ - "//base", - "//components/keyed_service/ios", - "//components/sync", - "//ios/chrome/browser/shared/model/browser_state", - ] -} - -source_set("sync_error_browser_agent") { - sources = [ - "sync_error_browser_agent.h", - "sync_error_browser_agent.mm", - ] - deps = [ - "//ios/chrome/browser/settings/sync/utils", - "//ios/chrome/browser/shared/model/browser", - "//ios/chrome/browser/shared/model/browser_state", - "//ios/chrome/browser/shared/model/web_state_list", - "//ios/chrome/browser/shared/ui/util", - "//ios/chrome/browser/ui/authentication", - "//ios/chrome/browser/ui/authentication:signin_presenter", - "//ui/base", - ] - frameworks = [ "UIKit.framework" ] -} - -source_set("test_support") { - testonly = true - sources = [ - "mock_sync_service_utils.cc", - "mock_sync_service_utils.h", - "sync_setup_service_mock.cc", - "sync_setup_service_mock.h", - ] - deps = [ - ":sync", - "//base", - "//components/consent_auditor:test_support", - "//components/keyed_service/core", - "//components/keyed_service/ios", - "//components/sync", - "//components/sync:test_support", - "//ios/chrome/browser/shared/model/browser_state", - "//ios/chrome/browser/signin", - "//ios/chrome/common", - "//ios/web", - "//ui/base", - ] - public_deps = [ "//testing/gmock" ] -} - -source_set("unit_tests") { - testonly = true - sources = [ - "ios_chrome_synced_tab_delegate_unittest.mm", - "session_sync_service_factory_unittest.cc", - "sync_service_factory_unittest.cc", - ] - deps = [ - ":sync", - "//base", - "//components/autofill/core/common/", - "//components/browser_sync", - "//components/password_manager/core/browser/features:password_features", - "//components/supervised_user/core/common:buildflags", - "//components/sync", - "//ios/chrome/browser/favicon", - "//ios/chrome/browser/history", - "//ios/chrome/browser/shared/model/browser_state:test_support", - "//ios/chrome/browser/shared/model/url:constants", - "//ios/chrome/browser/webdata_services/model", - "//ios/web/public/test", - "//testing/gtest", - "//ui/base", - ] -}
diff --git a/ios/chrome/browser/sync/model/BUILD.gn b/ios/chrome/browser/sync/model/BUILD.gn index 790a97b..f1163695 100644 --- a/ios/chrome/browser/sync/model/BUILD.gn +++ b/ios/chrome/browser/sync/model/BUILD.gn
@@ -1,20 +1,192 @@ -# Copyright 2023 The Chromium Authors +# Copyright 2016 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. source_set("model") { sources = [ + "device_info_sync_service_factory.h", + "device_info_sync_service_factory.mm", + "enterprise_utils.cc", + "enterprise_utils.h", + "ios_chrome_sync_client.h", + "ios_chrome_sync_client.mm", + "ios_chrome_synced_tab_delegate.h", + "ios_chrome_synced_tab_delegate.mm", + "ios_user_event_service_factory.cc", + "ios_user_event_service_factory.h", + "send_tab_to_self_sync_service_factory.h", + "send_tab_to_self_sync_service_factory.mm", + "session_sync_service_factory.h", + "session_sync_service_factory.mm", + "sync_invalidations_service_factory.h", + "sync_invalidations_service_factory.mm", + "sync_observer_bridge.h", + "sync_observer_bridge.mm", "sync_service_factory.h", + "sync_service_factory.mm", + "sync_setup_service.cc", "sync_setup_service.h", + "sync_setup_service_factory.cc", "sync_setup_service_factory.h", ] - public_deps = [ "//ios/chrome/browser/sync" ] + deps = [ + ":model_type_store_service_factory", + "//base", + "//components/autofill/core/browser", + "//components/browser_sync", + "//components/consent_auditor", + "//components/dom_distiller/core", + "//components/history/core/browser", + "//components/invalidation/impl", + "//components/keyed_service/core", + "//components/keyed_service/ios", + "//components/metrics/demographics", + "//components/network_time", + "//components/password_manager/core/browser", + "//components/password_manager/core/browser/sharing", + "//components/pref_registry", + "//components/prefs", + "//components/reading_list/core", + "//components/search_engines", + "//components/send_tab_to_self", + "//components/sessions", + "//components/signin/public/identity_manager", + "//components/supervised_user/core/browser", + "//components/supervised_user/core/common:buildflags", + "//components/sync", + "//components/sync_device_info", + "//components/sync_preferences", + "//components/sync_sessions", + "//components/sync_user_events", + "//components/trusted_vault", + "//components/variations/service", + "//components/version_info", + "//google_apis", + "//ios/chrome/browser/bookmarks/model", + "//ios/chrome/browser/complex_tasks/model", + "//ios/chrome/browser/consent_auditor/model", + "//ios/chrome/browser/dom_distiller", + "//ios/chrome/browser/favicon", + "//ios/chrome/browser/gcm", + "//ios/chrome/browser/gcm/instance_id", + "//ios/chrome/browser/history", + "//ios/chrome/browser/invalidation", + "//ios/chrome/browser/metrics:google_groups_updater", + "//ios/chrome/browser/passwords:sharing_factory", + "//ios/chrome/browser/passwords:store_factory", + "//ios/chrome/browser/power_bookmarks", + "//ios/chrome/browser/reading_list", + "//ios/chrome/browser/search_engines", + "//ios/chrome/browser/sessions", + "//ios/chrome/browser/shared/model/application_context", + "//ios/chrome/browser/shared/model/browser", + "//ios/chrome/browser/shared/model/browser_state", + "//ios/chrome/browser/shared/model/prefs:pref_names", + "//ios/chrome/browser/shared/model/url:constants", + "//ios/chrome/browser/signin", + "//ios/chrome/browser/supervised_user:sync_settings_factory", + "//ios/chrome/browser/sync/model/glue", + "//ios/chrome/browser/sync/model/sessions", + "//ios/chrome/browser/tabs", + "//ios/chrome/browser/trusted_vault", + "//ios/chrome/browser/webdata_services/model", + "//ios/chrome/common", + "//ios/components/webui:url_constants", + "//ios/web", + "//ios/web/common:features", + "//ios/web/public/session", + "//net", + "//ui/base", + "//url", + ] + allow_circular_includes_from = [ + "//ios/chrome/browser/history", + "//ios/chrome/browser/passwords:store_factory", + "//ios/chrome/browser/reading_list", + "//ios/chrome/browser/signin", + "//ios/chrome/browser/sync/model/glue", + "//ios/chrome/browser/sync/model/sessions", + ] +} + +source_set("model_type_store_service_factory") { + sources = [ + "model_type_store_service_factory.cc", + "model_type_store_service_factory.h", + ] + deps = [ + "//base", + "//components/keyed_service/ios", + "//components/sync", + "//ios/chrome/browser/shared/model/browser_state", + ] +} + +source_set("sync_error_browser_agent") { + sources = [ + "sync_error_browser_agent.h", + "sync_error_browser_agent.mm", + ] + deps = [ + "//ios/chrome/browser/settings/sync/utils", + "//ios/chrome/browser/shared/model/browser", + "//ios/chrome/browser/shared/model/browser_state", + "//ios/chrome/browser/shared/model/web_state_list", + "//ios/chrome/browser/shared/ui/util", + "//ios/chrome/browser/ui/authentication", + "//ios/chrome/browser/ui/authentication:signin_presenter", + "//ui/base", + ] + frameworks = [ "UIKit.framework" ] } source_set("test_support") { testonly = true - public_deps = [ - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + sources = [ + "mock_sync_service_utils.cc", + "mock_sync_service_utils.h", + "sync_setup_service_mock.cc", + "sync_setup_service_mock.h", + ] + deps = [ + ":model", + "//base", + "//components/consent_auditor:test_support", + "//components/keyed_service/core", + "//components/keyed_service/ios", + "//components/sync", + "//components/sync:test_support", + "//ios/chrome/browser/shared/model/browser_state", + "//ios/chrome/browser/signin", + "//ios/chrome/common", + "//ios/web", + "//ui/base", + ] + public_deps = [ "//testing/gmock" ] +} + +source_set("unit_tests") { + testonly = true + sources = [ + "ios_chrome_synced_tab_delegate_unittest.mm", + "session_sync_service_factory_unittest.cc", + "sync_service_factory_unittest.cc", + ] + deps = [ + ":model", + "//base", + "//components/autofill/core/common/", + "//components/browser_sync", + "//components/password_manager/core/browser/features:password_features", + "//components/supervised_user/core/common:buildflags", + "//components/sync", + "//ios/chrome/browser/favicon", + "//ios/chrome/browser/history", + "//ios/chrome/browser/shared/model/browser_state:test_support", + "//ios/chrome/browser/shared/model/url:constants", + "//ios/chrome/browser/webdata_services/model", + "//ios/web/public/test", + "//testing/gtest", + "//ui/base", ] }
diff --git a/ios/chrome/browser/sync/DEPS b/ios/chrome/browser/sync/model/DEPS similarity index 100% rename from ios/chrome/browser/sync/DEPS rename to ios/chrome/browser/sync/model/DEPS
diff --git a/ios/chrome/browser/sync/DIR_METADATA b/ios/chrome/browser/sync/model/DIR_METADATA similarity index 100% rename from ios/chrome/browser/sync/DIR_METADATA rename to ios/chrome/browser/sync/model/DIR_METADATA
diff --git a/ios/chrome/browser/sync/OWNERS b/ios/chrome/browser/sync/model/OWNERS similarity index 100% rename from ios/chrome/browser/sync/OWNERS rename to ios/chrome/browser/sync/model/OWNERS
diff --git a/ios/chrome/browser/sync/device_info_sync_service_factory.h b/ios/chrome/browser/sync/model/device_info_sync_service_factory.h similarity index 86% rename from ios/chrome/browser/sync/device_info_sync_service_factory.h rename to ios/chrome/browser/sync/model/device_info_sync_service_factory.h index fe9b547..7e93c433 100644 --- a/ios/chrome/browser/sync/device_info_sync_service_factory.h +++ b/ios/chrome/browser/sync/model/device_info_sync_service_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_SYNC_DEVICE_INFO_SYNC_SERVICE_FACTORY_H_ -#define IOS_CHROME_BROWSER_SYNC_DEVICE_INFO_SYNC_SERVICE_FACTORY_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_DEVICE_INFO_SYNC_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_DEVICE_INFO_SYNC_SERVICE_FACTORY_H_ #include <memory> #include <vector> @@ -50,4 +50,4 @@ web::BrowserState* context) const override; }; -#endif // IOS_CHROME_BROWSER_SYNC_DEVICE_INFO_SYNC_SERVICE_FACTORY_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_DEVICE_INFO_SYNC_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/sync/device_info_sync_service_factory.mm b/ios/chrome/browser/sync/model/device_info_sync_service_factory.mm similarity index 96% rename from ios/chrome/browser/sync/device_info_sync_service_factory.mm rename to ios/chrome/browser/sync/model/device_info_sync_service_factory.mm index cf4266a5..54ce0cf 100644 --- a/ios/chrome/browser/sync/device_info_sync_service_factory.mm +++ b/ios/chrome/browser/sync/model/device_info_sync_service_factory.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/sync/device_info_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/device_info_sync_service_factory.h" #import <utility> @@ -22,8 +22,8 @@ #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state_manager.h" -#import "ios/chrome/browser/sync/model_type_store_service_factory.h" -#import "ios/chrome/browser/sync/sync_invalidations_service_factory.h" +#import "ios/chrome/browser/sync/model/model_type_store_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_invalidations_service_factory.h" #import "ios/chrome/common/channel_info.h" namespace {
diff --git a/ios/chrome/browser/sync/enterprise_utils.cc b/ios/chrome/browser/sync/model/enterprise_utils.cc similarity index 90% rename from ios/chrome/browser/sync/enterprise_utils.cc rename to ios/chrome/browser/sync/model/enterprise_utils.cc index 9dcbcf6..c84a0155 100644 --- a/ios/chrome/browser/sync/enterprise_utils.cc +++ b/ios/chrome/browser/sync/model/enterprise_utils.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 "ios/chrome/browser/sync/enterprise_utils.h" +#include "ios/chrome/browser/sync/model/enterprise_utils.h" #include "components/sync/base/user_selectable_type.h" #include "components/sync/service/sync_service.h"
diff --git a/ios/chrome/browser/sync/enterprise_utils.h b/ios/chrome/browser/sync/model/enterprise_utils.h similarity index 66% rename from ios/chrome/browser/sync/enterprise_utils.h rename to ios/chrome/browser/sync/model/enterprise_utils.h index ec73edd..83c6fa0 100644 --- a/ios/chrome/browser/sync/enterprise_utils.h +++ b/ios/chrome/browser/sync/model/enterprise_utils.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_SYNC_ENTERPRISE_UTILS_H_ -#define IOS_CHROME_BROWSER_SYNC_ENTERPRISE_UTILS_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_ENTERPRISE_UTILS_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_ENTERPRISE_UTILS_H_ namespace syncer { class SyncService; @@ -12,4 +12,4 @@ // Returns true if any data type is managed by policies (i.e. is not syncable). bool HasManagedSyncDataType(syncer::SyncService* sync_service); -#endif // IOS_CHROME_BROWSER_SYNC_ENTERPRISE_UTILS_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_ENTERPRISE_UTILS_H_
diff --git a/ios/chrome/browser/sync/glue/BUILD.gn b/ios/chrome/browser/sync/model/glue/BUILD.gn similarity index 100% rename from ios/chrome/browser/sync/glue/BUILD.gn rename to ios/chrome/browser/sync/model/glue/BUILD.gn
diff --git a/ios/chrome/browser/sync/glue/sync_start_util.h b/ios/chrome/browser/sync/model/glue/sync_start_util.h similarity index 84% rename from ios/chrome/browser/sync/glue/sync_start_util.h rename to ios/chrome/browser/sync/model/glue/sync_start_util.h index 06d5528..28c73b90 100644 --- a/ios/chrome/browser/sync/glue/sync_start_util.h +++ b/ios/chrome/browser/sync/model/glue/sync_start_util.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_SYNC_GLUE_SYNC_START_UTIL_H_ -#define IOS_CHROME_BROWSER_SYNC_GLUE_SYNC_START_UTIL_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_GLUE_SYNC_START_UTIL_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_GLUE_SYNC_START_UTIL_H_ #include "components/sync/model/syncable_service.h" @@ -31,4 +31,4 @@ } // namespace sync_start_util } // namespace ios -#endif // IOS_CHROME_BROWSER_SYNC_GLUE_SYNC_START_UTIL_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_GLUE_SYNC_START_UTIL_H_
diff --git a/ios/chrome/browser/sync/glue/sync_start_util.mm b/ios/chrome/browser/sync/model/glue/sync_start_util.mm similarity index 93% rename from ios/chrome/browser/sync/glue/sync_start_util.mm rename to ios/chrome/browser/sync/model/glue/sync_start_util.mm index b55faac..53e272b 100644 --- a/ios/chrome/browser/sync/glue/sync_start_util.mm +++ b/ios/chrome/browser/sync/model/glue/sync_start_util.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/sync/glue/sync_start_util.h" +#import "ios/chrome/browser/sync/model/glue/sync_start_util.h" #import "base/files/file_path.h" #import "base/functional/bind.h" @@ -11,7 +11,7 @@ #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state_manager.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/web/public/thread/web_task_traits.h" #import "ios/web/public/thread/web_thread.h"
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.h b/ios/chrome/browser/sync/model/ios_chrome_sync_client.h similarity index 94% rename from ios/chrome/browser/sync/ios_chrome_sync_client.h rename to ios/chrome/browser/sync/model/ios_chrome_sync_client.h index bc1dbd07..920e8f0 100644 --- a/ios/chrome/browser/sync/ios_chrome_sync_client.h +++ b/ios/chrome/browser/sync/model/ios_chrome_sync_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 IOS_CHROME_BROWSER_SYNC_IOS_CHROME_SYNC_CLIENT_H__ -#define IOS_CHROME_BROWSER_SYNC_IOS_CHROME_SYNC_CLIENT_H__ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_IOS_CHROME_SYNC_CLIENT_H__ +#define IOS_CHROME_BROWSER_SYNC_MODEL_IOS_CHROME_SYNC_CLIENT_H__ #include <memory> @@ -27,7 +27,7 @@ class LocalDataQueryHelper; class LocalDataMigrationHelper; class SyncApiComponentFactoryImpl; -} +} // namespace browser_sync class IOSChromeSyncClient : public browser_sync::BrowserSyncClient { public: @@ -94,4 +94,4 @@ local_data_migration_helper_; }; -#endif // IOS_CHROME_BROWSER_SYNC_IOS_CHROME_SYNC_CLIENT_H__ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_IOS_CHROME_SYNC_CLIENT_H__
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm similarity index 96% rename from ios/chrome/browser/sync/ios_chrome_sync_client.mm rename to ios/chrome/browser/sync/model/ios_chrome_sync_client.mm index 77d996f9..114823c 100644 --- a/ios/chrome/browser/sync/ios_chrome_sync_client.mm +++ b/ios/chrome/browser/sync/model/ios_chrome_sync_client.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/sync/ios_chrome_sync_client.h" +#import "ios/chrome/browser/sync/model/ios_chrome_sync_client.h" #import <utility> @@ -57,12 +57,12 @@ #import "ios/chrome/browser/shared/model/prefs/pref_names.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/device_info_sync_service_factory.h" -#import "ios/chrome/browser/sync/ios_user_event_service_factory.h" -#import "ios/chrome/browser/sync/model_type_store_service_factory.h" -#import "ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_invalidations_service_factory.h" +#import "ios/chrome/browser/sync/model/device_info_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/ios_user_event_service_factory.h" +#import "ios/chrome/browser/sync/model/model_type_store_service_factory.h" +#import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_invalidations_service_factory.h" #import "ios/chrome/browser/trusted_vault/ios_trusted_vault_service_factory.h" #import "ios/chrome/browser/webdata_services/model/web_data_service_factory.h" #import "ios/chrome/common/channel_info.h"
diff --git a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h b/ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate.h similarity index 92% rename from ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h rename to ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate.h index ec0bc70..96bf4f7 100644 --- a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h +++ b/ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate.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_SYNC_IOS_CHROME_SYNCED_TAB_DELEGATE_H_ -#define IOS_CHROME_BROWSER_SYNC_IOS_CHROME_SYNCED_TAB_DELEGATE_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_IOS_CHROME_SYNCED_TAB_DELEGATE_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_IOS_CHROME_SYNCED_TAB_DELEGATE_H_ #include <memory> #include <string> @@ -70,4 +70,4 @@ WEB_STATE_USER_DATA_KEY_DECL(); }; -#endif // IOS_CHROME_BROWSER_SYNC_IOS_CHROME_SYNCED_TAB_DELEGATE_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_IOS_CHROME_SYNCED_TAB_DELEGATE_H_
diff --git a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm b/ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate.mm similarity index 97% rename from ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm rename to ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate.mm index 93b45f34..5205eab 100644 --- a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm +++ b/ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate.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/sync/ios_chrome_synced_tab_delegate.h" +#import "ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate.h" #import "base/check.h" #import "components/sessions/ios/ios_serialized_navigation_builder.h" @@ -193,17 +193,20 @@ return false; } - if (IsInitialBlankNavigation()) + if (IsInitialBlankNavigation()) { return false; // This deliberately ignores a new pending entry. + } int entry_count = GetEntryCount(); for (int i = 0; i < entry_count; ++i) { const GURL& virtual_url = GetVirtualURLAtIndex(i); - if (!virtual_url.is_valid()) + if (!virtual_url.is_valid()) { continue; + } - if (sessions_client->ShouldSyncURL(virtual_url)) + if (sessions_client->ShouldSyncURL(virtual_url)) { return true; + } } return false; }
diff --git a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate_unittest.mm b/ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate_unittest.mm similarity index 94% rename from ios/chrome/browser/sync/ios_chrome_synced_tab_delegate_unittest.mm rename to ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate_unittest.mm index 27e9504..9c79f17 100644 --- a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate_unittest.mm +++ b/ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate_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/sync/ios_chrome_synced_tab_delegate.h" +#import "ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate.h" #import <memory>
diff --git a/ios/chrome/browser/sync/ios_user_event_service_factory.cc b/ios/chrome/browser/sync/model/ios_user_event_service_factory.cc similarity index 92% rename from ios/chrome/browser/sync/ios_user_event_service_factory.cc rename to ios/chrome/browser/sync/model/ios_user_event_service_factory.cc index 8b1d9c95..1a35a39 100644 --- a/ios/chrome/browser/sync/ios_user_event_service_factory.cc +++ b/ios/chrome/browser/sync/model/ios_user_event_service_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 "ios/chrome/browser/sync/ios_user_event_service_factory.h" +#include "ios/chrome/browser/sync/model/ios_user_event_service_factory.h" #include <memory> #include <utility> @@ -20,8 +20,8 @@ #include "components/sync_user_events/user_event_sync_bridge.h" #include "ios/chrome/browser/shared/model/browser_state/browser_state_otr_helper.h" #include "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/sync/model_type_store_service_factory.h" -#include "ios/chrome/browser/sync/session_sync_service_factory.h" +#include "ios/chrome/browser/sync/model/model_type_store_service_factory.h" +#include "ios/chrome/browser/sync/model/session_sync_service_factory.h" #include "ios/chrome/common/channel_info.h" #include "ios/web/public/browser_state.h"
diff --git a/ios/chrome/browser/sync/ios_user_event_service_factory.h b/ios/chrome/browser/sync/model/ios_user_event_service_factory.h similarity index 82% rename from ios/chrome/browser/sync/ios_user_event_service_factory.h rename to ios/chrome/browser/sync/model/ios_user_event_service_factory.h index bc5682d4..daebfaa 100644 --- a/ios/chrome/browser/sync/ios_user_event_service_factory.h +++ b/ios/chrome/browser/sync/model/ios_user_event_service_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_SYNC_IOS_USER_EVENT_SERVICE_FACTORY_H_ -#define IOS_CHROME_BROWSER_SYNC_IOS_USER_EVENT_SERVICE_FACTORY_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_IOS_USER_EVENT_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_IOS_USER_EVENT_SERVICE_FACTORY_H_ #include <memory> @@ -37,4 +37,4 @@ web::BrowserState* context) const override; }; -#endif // IOS_CHROME_BROWSER_SYNC_IOS_USER_EVENT_SERVICE_FACTORY_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_IOS_USER_EVENT_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/sync/mock_sync_service_utils.cc b/ios/chrome/browser/sync/model/mock_sync_service_utils.cc similarity index 81% rename from ios/chrome/browser/sync/mock_sync_service_utils.cc rename to ios/chrome/browser/sync/model/mock_sync_service_utils.cc index 102fd5ea..7f09124 100644 --- a/ios/chrome/browser/sync/mock_sync_service_utils.cc +++ b/ios/chrome/browser/sync/model/mock_sync_service_utils.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 "ios/chrome/browser/sync/mock_sync_service_utils.h" +#include "ios/chrome/browser/sync/model/mock_sync_service_utils.h" std::unique_ptr<KeyedService> CreateMockSyncService( web::BrowserState* context) {
diff --git a/ios/chrome/browser/sync/mock_sync_service_utils.h b/ios/chrome/browser/sync/model/mock_sync_service_utils.h similarity index 64% rename from ios/chrome/browser/sync/mock_sync_service_utils.h rename to ios/chrome/browser/sync/model/mock_sync_service_utils.h index 5b57f34..ae9ee60 100644 --- a/ios/chrome/browser/sync/mock_sync_service_utils.h +++ b/ios/chrome/browser/sync/model/mock_sync_service_utils.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_SYNC_MOCK_SYNC_SERVICE_UTILS_H_ -#define IOS_CHROME_BROWSER_SYNC_MOCK_SYNC_SERVICE_UTILS_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_MOCK_SYNC_SERVICE_UTILS_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_MOCK_SYNC_SERVICE_UTILS_H_ #include "components/sync/test/mock_sync_service.h" #include "ios/web/public/browser_state.h" @@ -11,4 +11,4 @@ // Returns a basic MockSyncService. std::unique_ptr<KeyedService> CreateMockSyncService(web::BrowserState* context); -#endif // IOS_CHROME_BROWSER_SYNC_MOCK_SYNC_SERVICE_UTILS_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_MOCK_SYNC_SERVICE_UTILS_H_
diff --git a/ios/chrome/browser/sync/model_type_store_service_factory.cc b/ios/chrome/browser/sync/model/model_type_store_service_factory.cc similarity index 95% rename from ios/chrome/browser/sync/model_type_store_service_factory.cc rename to ios/chrome/browser/sync/model/model_type_store_service_factory.cc index db956db5..b863f79 100644 --- a/ios/chrome/browser/sync/model_type_store_service_factory.cc +++ b/ios/chrome/browser/sync/model/model_type_store_service_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 "ios/chrome/browser/sync/model_type_store_service_factory.h" +#include "ios/chrome/browser/sync/model/model_type_store_service_factory.h" #include <utility>
diff --git a/ios/chrome/browser/sync/model_type_store_service_factory.h b/ios/chrome/browser/sync/model/model_type_store_service_factory.h similarity index 83% rename from ios/chrome/browser/sync/model_type_store_service_factory.h rename to ios/chrome/browser/sync/model/model_type_store_service_factory.h index 8c172fb..6151b66 100644 --- a/ios/chrome/browser/sync/model_type_store_service_factory.h +++ b/ios/chrome/browser/sync/model/model_type_store_service_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_TYPE_STORE_SERVICE_FACTORY_H_ -#define IOS_CHROME_BROWSER_SYNC_MODEL_TYPE_STORE_SERVICE_FACTORY_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_MODEL_TYPE_STORE_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_MODEL_TYPE_STORE_SERVICE_FACTORY_H_ #include <memory> @@ -38,4 +38,4 @@ web::BrowserState* context) const override; }; -#endif // IOS_CHROME_BROWSER_SYNC_MODEL_TYPE_STORE_SERVICE_FACTORY_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_MODEL_TYPE_STORE_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/sync/prefs/BUILD.gn b/ios/chrome/browser/sync/model/prefs/BUILD.gn similarity index 100% rename from ios/chrome/browser/sync/prefs/BUILD.gn rename to ios/chrome/browser/sync/model/prefs/BUILD.gn
diff --git a/ios/chrome/browser/sync/prefs/ios_chrome_syncable_prefs_database.cc b/ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.cc similarity index 97% rename from ios/chrome/browser/sync/prefs/ios_chrome_syncable_prefs_database.cc rename to ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.cc index 9fccaa23..3cdd5ca 100644 --- a/ios/chrome/browser/sync/prefs/ios_chrome_syncable_prefs_database.cc +++ b/ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.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 "ios/chrome/browser/sync/prefs/ios_chrome_syncable_prefs_database.h" +#include "ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.h" #include "base/containers/fixed_flat_map.h" #include "base/strings/string_piece.h"
diff --git a/ios/chrome/browser/sync/prefs/ios_chrome_syncable_prefs_database.h b/ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.h similarity index 77% rename from ios/chrome/browser/sync/prefs/ios_chrome_syncable_prefs_database.h rename to ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.h index e85afdebd..55734603 100644 --- a/ios/chrome/browser/sync/prefs/ios_chrome_syncable_prefs_database.h +++ b/ios/chrome/browser/sync/model/prefs/ios_chrome_syncable_prefs_database.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_SYNC_PREFS_IOS_CHROME_SYNCABLE_PREFS_DATABASE_H_ -#define IOS_CHROME_BROWSER_SYNC_PREFS_IOS_CHROME_SYNCABLE_PREFS_DATABASE_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_PREFS_IOS_CHROME_SYNCABLE_PREFS_DATABASE_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_PREFS_IOS_CHROME_SYNCABLE_PREFS_DATABASE_H_ #include "components/sync_preferences/common_syncable_prefs_database.h" #include "components/sync_preferences/syncable_prefs_database.h" @@ -26,4 +26,4 @@ } // namespace browser_sync -#endif // IOS_CHROME_BROWSER_SYNC_PREFS_IOS_CHROME_SYNCABLE_PREFS_DATABASE_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_PREFS_IOS_CHROME_SYNCABLE_PREFS_DATABASE_H_
diff --git a/ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h b/ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h similarity index 85% rename from ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h rename to ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h index ecd70ea6..001d74d4 100644 --- a/ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h +++ b/ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_SYNC_SEND_TAB_TO_SELF_SYNC_SERVICE_FACTORY_H_ -#define IOS_CHROME_BROWSER_SYNC_SEND_TAB_TO_SELF_SYNC_SERVICE_FACTORY_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_SEND_TAB_TO_SELF_SYNC_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_SEND_TAB_TO_SELF_SYNC_SERVICE_FACTORY_H_ #include <memory> @@ -45,4 +45,4 @@ web::BrowserState* context) const override; }; -#endif // IOS_CHROME_BROWSER_SYNC_SEND_TAB_TO_SELF_SYNC_SERVICE_FACTORY_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_SEND_TAB_TO_SELF_SYNC_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.mm b/ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.mm similarity index 92% rename from ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.mm rename to ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.mm index 17afd73..95f8eed 100644 --- a/ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.mm +++ b/ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.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/sync/send_tab_to_self_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h" #import "base/no_destructor.h" #import "components/keyed_service/core/service_access_type.h" @@ -11,8 +11,8 @@ #import "components/sync_device_info/device_info_sync_service.h" #import "ios/chrome/browser/history/history_service_factory.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/sync/device_info_sync_service_factory.h" -#import "ios/chrome/browser/sync/model_type_store_service_factory.h" +#import "ios/chrome/browser/sync/model/device_info_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/model_type_store_service_factory.h" #import "ios/chrome/common/channel_info.h" using send_tab_to_self::SendTabToSelfSyncService;
diff --git a/ios/chrome/browser/sync/session_sync_service_factory.h b/ios/chrome/browser/sync/model/session_sync_service_factory.h similarity index 85% rename from ios/chrome/browser/sync/session_sync_service_factory.h rename to ios/chrome/browser/sync/model/session_sync_service_factory.h index 6ad8bbe..5f2b5ec91 100644 --- a/ios/chrome/browser/sync/session_sync_service_factory.h +++ b/ios/chrome/browser/sync/model/session_sync_service_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_SYNC_SESSION_SYNC_SERVICE_FACTORY_H_ -#define IOS_CHROME_BROWSER_SYNC_SESSION_SYNC_SERVICE_FACTORY_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_SESSION_SYNC_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_SESSION_SYNC_SERVICE_FACTORY_H_ #include <memory> @@ -43,4 +43,4 @@ web::BrowserState* context) const override; }; -#endif // IOS_CHROME_BROWSER_SYNC_SESSION_SYNC_SERVICE_FACTORY_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_SESSION_SYNC_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/sync/session_sync_service_factory.mm b/ios/chrome/browser/sync/model/session_sync_service_factory.mm similarity index 94% rename from ios/chrome/browser/sync/session_sync_service_factory.mm rename to ios/chrome/browser/sync/model/session_sync_service_factory.mm index 5fd84643..c482302 100644 --- a/ios/chrome/browser/sync/session_sync_service_factory.mm +++ b/ios/chrome/browser/sync/model/session_sync_service_factory.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/sync/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" #import <utility> @@ -26,10 +26,10 @@ #import "ios/chrome/browser/shared/model/browser/browser_list_factory.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/url/chrome_url_constants.h" -#import "ios/chrome/browser/sync/device_info_sync_service_factory.h" -#import "ios/chrome/browser/sync/glue/sync_start_util.h" -#import "ios/chrome/browser/sync/model_type_store_service_factory.h" -#import "ios/chrome/browser/sync/sessions/ios_chrome_local_session_event_router.h" +#import "ios/chrome/browser/sync/model/device_info_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/glue/sync_start_util.h" +#import "ios/chrome/browser/sync/model/model_type_store_service_factory.h" +#import "ios/chrome/browser/sync/model/sessions/ios_chrome_local_session_event_router.h" #import "ios/chrome/browser/tabs/ios_synced_window_delegate_getter.h" #import "ios/chrome/common/channel_info.h" #import "ios/components/webui/web_ui_url_constants.h"
diff --git a/ios/chrome/browser/sync/session_sync_service_factory_unittest.cc b/ios/chrome/browser/sync/model/session_sync_service_factory_unittest.cc similarity index 92% rename from ios/chrome/browser/sync/session_sync_service_factory_unittest.cc rename to ios/chrome/browser/sync/model/session_sync_service_factory_unittest.cc index e9cba32..976457f 100644 --- a/ios/chrome/browser/sync/session_sync_service_factory_unittest.cc +++ b/ios/chrome/browser/sync/model/session_sync_service_factory_unittest.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 "ios/chrome/browser/sync/session_sync_service_factory.h" +#include "ios/chrome/browser/sync/model/session_sync_service_factory.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h"
diff --git a/ios/chrome/browser/sync/sessions/BUILD.gn b/ios/chrome/browser/sync/model/sessions/BUILD.gn similarity index 93% rename from ios/chrome/browser/sync/sessions/BUILD.gn rename to ios/chrome/browser/sync/model/sessions/BUILD.gn index 927445e9..629cedcf 100644 --- a/ios/chrome/browser/sync/sessions/BUILD.gn +++ b/ios/chrome/browser/sync/model/sessions/BUILD.gn
@@ -17,7 +17,7 @@ "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/model/web_state_list", - "//ios/chrome/browser/sync/glue", + "//ios/chrome/browser/sync/model/glue", "//ios/chrome/browser/tabs", "//ios/web", ]
diff --git a/ios/chrome/browser/sync/sessions/ios_chrome_local_session_event_router.h b/ios/chrome/browser/sync/model/sessions/ios_chrome_local_session_event_router.h similarity index 92% rename from ios/chrome/browser/sync/sessions/ios_chrome_local_session_event_router.h rename to ios/chrome/browser/sync/model/sessions/ios_chrome_local_session_event_router.h index 898a5f7..9182770 100644 --- a/ios/chrome/browser/sync/sessions/ios_chrome_local_session_event_router.h +++ b/ios/chrome/browser/sync/model/sessions/ios_chrome_local_session_event_router.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_SYNC_SESSIONS_IOS_CHROME_LOCAL_SESSION_EVENT_ROUTER_H_ -#define IOS_CHROME_BROWSER_SYNC_SESSIONS_IOS_CHROME_LOCAL_SESSION_EVENT_ROUTER_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_SESSIONS_IOS_CHROME_LOCAL_SESSION_EVENT_ROUTER_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_SESSIONS_IOS_CHROME_LOCAL_SESSION_EVENT_ROUTER_H_ #include <stddef.h> @@ -102,4 +102,4 @@ int batch_in_progress_ = 0; }; -#endif // IOS_CHROME_BROWSER_SYNC_SESSIONS_IOS_CHROME_LOCAL_SESSION_EVENT_ROUTER_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_SESSIONS_IOS_CHROME_LOCAL_SESSION_EVENT_ROUTER_H_
diff --git a/ios/chrome/browser/sync/sessions/ios_chrome_local_session_event_router.mm b/ios/chrome/browser/sync/model/sessions/ios_chrome_local_session_event_router.mm similarity index 93% rename from ios/chrome/browser/sync/sessions/ios_chrome_local_session_event_router.mm rename to ios/chrome/browser/sync/model/sessions/ios_chrome_local_session_event_router.mm index 0e0227c9..a764886 100644 --- a/ios/chrome/browser/sync/sessions/ios_chrome_local_session_event_router.mm +++ b/ios/chrome/browser/sync/model/sessions/ios_chrome_local_session_event_router.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/sync/sessions/ios_chrome_local_session_event_router.h" +#import "ios/chrome/browser/sync/model/sessions/ios_chrome_local_session_event_router.h" #import <stddef.h> @@ -16,8 +16,8 @@ #import "ios/chrome/browser/shared/model/browser/all_web_state_list_observation_registrar.h" #import "ios/chrome/browser/shared/model/browser/browser_list.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" -#import "ios/chrome/browser/sync/glue/sync_start_util.h" -#import "ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h" +#import "ios/chrome/browser/sync/model/glue/sync_start_util.h" +#import "ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate.h" #import "ios/chrome/browser/tabs/tab_parenting_global_observer.h" namespace { @@ -147,12 +147,14 @@ void IOSChromeLocalSessionEventRouter::OnSessionEventEnded() { DCHECK(batch_in_progress_ > 0); batch_in_progress_--; - if (batch_in_progress_) + if (batch_in_progress_) { return; + } // Batch operations are only used for restoration, close all tabs or undo // close all tabs. In any case, a full sync is necessary after this. - if (handler_) + if (handler_) { handler_->OnSessionRestoreComplete(); + } if (!flare_.is_null()) { std::move(flare_).Run(syncer::SESSIONS); } @@ -160,22 +162,26 @@ void IOSChromeLocalSessionEventRouter::OnWebStateChange( web::WebState* web_state) { - if (batch_in_progress_) + if (batch_in_progress_) { return; + } sync_sessions::SyncedTabDelegate* tab = GetSyncedTabDelegateFromWebState(web_state); - if (!tab) + if (!tab) { return; + } // Some WebState event happen during the navigation restoration. Ignore // them as the tab is still considered as placeholder by this point as // the session cannot be forwarded to sync yet. if (tab->IsPlaceholderTab()) { return; } - if (handler_) + if (handler_) { handler_->OnLocalTabModified(tab); - if (!tab->ShouldSync(sessions_client_)) + } + if (!tab->ShouldSync(sessions_client_)) { return; + } if (!flare_.is_null()) { std::move(flare_).Run(syncer::SESSIONS);
diff --git a/ios/chrome/browser/sync/sync_error_browser_agent.h b/ios/chrome/browser/sync/model/sync_error_browser_agent.h similarity index 92% rename from ios/chrome/browser/sync/sync_error_browser_agent.h rename to ios/chrome/browser/sync/model/sync_error_browser_agent.h index ac9d9c6..26607ac 100644 --- a/ios/chrome/browser/sync/sync_error_browser_agent.h +++ b/ios/chrome/browser/sync/model/sync_error_browser_agent.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_SYNC_SYNC_ERROR_BROWSER_AGENT_H_ -#define IOS_CHROME_BROWSER_SYNC_SYNC_ERROR_BROWSER_AGENT_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_ERROR_BROWSER_AGENT_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_ERROR_BROWSER_AGENT_H_ #import "base/scoped_multi_source_observation.h" #import "ios/chrome/browser/shared/model/browser/browser_observer.h" @@ -70,4 +70,4 @@ __weak id<SyncPresenter> sync_presenter_provider_; }; -#endif // IOS_CHROME_BROWSER_SYNC_SYNC_ERROR_BROWSER_AGENT_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_ERROR_BROWSER_AGENT_H_
diff --git a/ios/chrome/browser/sync/sync_error_browser_agent.mm b/ios/chrome/browser/sync/model/sync_error_browser_agent.mm similarity index 98% rename from ios/chrome/browser/sync/sync_error_browser_agent.mm rename to ios/chrome/browser/sync/model/sync_error_browser_agent.mm index e370435..2e76c4b 100644 --- a/ios/chrome/browser/sync/sync_error_browser_agent.mm +++ b/ios/chrome/browser/sync/model/sync_error_browser_agent.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/sync/sync_error_browser_agent.h" +#import "ios/chrome/browser/sync/model/sync_error_browser_agent.h" #import "ios/chrome/browser/settings/sync/utils/sync_util.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h"
diff --git a/ios/chrome/browser/sync/sync_invalidations_service_factory.h b/ios/chrome/browser/sync/model/sync_invalidations_service_factory.h similarity index 84% rename from ios/chrome/browser/sync/sync_invalidations_service_factory.h rename to ios/chrome/browser/sync/model/sync_invalidations_service_factory.h index 83a207b..501492d 100644 --- a/ios/chrome/browser/sync/sync_invalidations_service_factory.h +++ b/ios/chrome/browser/sync/model/sync_invalidations_service_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_SYNC_SYNC_INVALIDATIONS_SERVICE_FACTORY_H_ -#define IOS_CHROME_BROWSER_SYNC_SYNC_INVALIDATIONS_SERVICE_FACTORY_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_INVALIDATIONS_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_INVALIDATIONS_SERVICE_FACTORY_H_ #include <memory> @@ -41,4 +41,4 @@ web::BrowserState* context) const override; }; -#endif // IOS_CHROME_BROWSER_SYNC_SYNC_INVALIDATIONS_SERVICE_FACTORY_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_INVALIDATIONS_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/sync/sync_invalidations_service_factory.mm b/ios/chrome/browser/sync/model/sync_invalidations_service_factory.mm similarity index 96% rename from ios/chrome/browser/sync/sync_invalidations_service_factory.mm rename to ios/chrome/browser/sync/model/sync_invalidations_service_factory.mm index a6d8a9f..52c1892 100644 --- a/ios/chrome/browser/sync/sync_invalidations_service_factory.mm +++ b/ios/chrome/browser/sync/model/sync_invalidations_service_factory.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/sync/sync_invalidations_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_invalidations_service_factory.h" #import "base/no_destructor.h" #import "components/gcm_driver/gcm_profile_service.h"
diff --git a/ios/chrome/browser/sync/sync_observer_bridge.h b/ios/chrome/browser/sync/model/sync_observer_bridge.h similarity index 87% rename from ios/chrome/browser/sync/sync_observer_bridge.h rename to ios/chrome/browser/sync/model/sync_observer_bridge.h index 6cadc05..b461c39b 100644 --- a/ios/chrome/browser/sync/sync_observer_bridge.h +++ b/ios/chrome/browser/sync/model/sync_observer_bridge.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_SYNC_SYNC_OBSERVER_BRIDGE_H_ -#define IOS_CHROME_BROWSER_SYNC_SYNC_OBSERVER_BRIDGE_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_OBSERVER_BRIDGE_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_OBSERVER_BRIDGE_H_ #import <Foundation/Foundation.h> @@ -40,4 +40,4 @@ scoped_observation_{this}; }; -#endif // IOS_CHROME_BROWSER_SYNC_SYNC_OBSERVER_BRIDGE_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_OBSERVER_BRIDGE_H_
diff --git a/ios/chrome/browser/sync/sync_observer_bridge.mm b/ios/chrome/browser/sync/model/sync_observer_bridge.mm similarity index 89% rename from ios/chrome/browser/sync/sync_observer_bridge.mm rename to ios/chrome/browser/sync/model/sync_observer_bridge.mm index 9f7bed9..688c88a 100644 --- a/ios/chrome/browser/sync/sync_observer_bridge.mm +++ b/ios/chrome/browser/sync/model/sync_observer_bridge.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/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" #import "base/check.h" #import "components/sync/service/sync_service.h" @@ -11,8 +11,9 @@ syncer::SyncService* sync_service) : delegate_(delegate) { DCHECK(delegate); - if (sync_service) + if (sync_service) { scoped_observation_.Observe(sync_service); + } } SyncObserverBridge::~SyncObserverBridge() {} @@ -23,8 +24,9 @@ void SyncObserverBridge::OnSyncConfigurationCompleted( syncer::SyncService* sync) { - if ([delegate_ respondsToSelector:@selector(onSyncConfigurationCompleted)]) + if ([delegate_ respondsToSelector:@selector(onSyncConfigurationCompleted)]) { [delegate_ onSyncConfigurationCompleted]; + } } void SyncObserverBridge::OnSyncShutdown(syncer::SyncService* sync) {
diff --git a/ios/chrome/browser/sync/model/sync_service_factory.h b/ios/chrome/browser/sync/model/sync_service_factory.h index c94ab7f..88d5cb2 100644 --- a/ios/chrome/browser/sync/model/sync_service_factory.h +++ b/ios/chrome/browser/sync/model/sync_service_factory.h
@@ -1,10 +1,49 @@ -// Copyright 2023 The Chromium Authors +// Copyright 2015 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_SERVICE_FACTORY_H_ -#import "ios/chrome/browser/sync/sync_service_factory.h" +#include <memory> + +#include "base/no_destructor.h" +#include "components/keyed_service/ios/browser_state_keyed_service_factory.h" + +class ChromeBrowserState; + +namespace syncer { +class SyncServiceImpl; +class SyncService; +} // namespace syncer + +// Singleton that owns all SyncServices and associates them with +// ChromeBrowserState. +class SyncServiceFactory : public BrowserStateKeyedServiceFactory { + public: + static syncer::SyncService* GetForBrowserState( + ChromeBrowserState* browser_state); + + static syncer::SyncService* GetForBrowserStateIfExists( + ChromeBrowserState* browser_state); + + static syncer::SyncServiceImpl* GetAsSyncServiceImplForBrowserStateForTesting( + ChromeBrowserState* browser_state); + + static SyncServiceFactory* GetInstance(); + + // Returns the default factory, useful in tests where it's null by default. + static TestingFactory GetDefaultFactory(); + + private: + friend class base::NoDestructor<SyncServiceFactory>; + + SyncServiceFactory(); + ~SyncServiceFactory() override; + + // BrowserStateKeyedServiceFactory implementation. + std::unique_ptr<KeyedService> BuildServiceInstanceFor( + web::BrowserState* context) const override; +}; #endif // IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/sync/sync_service_factory.mm b/ios/chrome/browser/sync/model/sync_service_factory.mm similarity index 93% rename from ios/chrome/browser/sync/sync_service_factory.mm rename to ios/chrome/browser/sync/model/sync_service_factory.mm index 6c28bc1..299f21bb 100644 --- a/ios/chrome/browser/sync/sync_service_factory.mm +++ b/ios/chrome/browser/sync/model/sync_service_factory.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/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import <utility> @@ -49,13 +49,13 @@ #import "ios/chrome/browser/signin/about_signin_internals_factory.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/device_info_sync_service_factory.h" -#import "ios/chrome/browser/sync/ios_chrome_sync_client.h" -#import "ios/chrome/browser/sync/ios_user_event_service_factory.h" -#import "ios/chrome/browser/sync/model_type_store_service_factory.h" -#import "ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_invalidations_service_factory.h" +#import "ios/chrome/browser/sync/model/device_info_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/ios_chrome_sync_client.h" +#import "ios/chrome/browser/sync/model/ios_user_event_service_factory.h" +#import "ios/chrome/browser/sync/model/model_type_store_service_factory.h" +#import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_invalidations_service_factory.h" #import "ios/chrome/browser/trusted_vault/ios_trusted_vault_service_factory.h" #import "ios/chrome/browser/webdata_services/model/web_data_service_factory.h" #import "ios/chrome/common/channel_info.h" @@ -163,8 +163,9 @@ // static syncer::SyncService* SyncServiceFactory::GetForBrowserState( ChromeBrowserState* browser_state) { - if (!syncer::IsSyncAllowedByFlag()) + if (!syncer::IsSyncAllowedByFlag()) { return nullptr; + } return static_cast<syncer::SyncService*>( GetInstance()->GetServiceForBrowserState(browser_state, true)); @@ -173,8 +174,9 @@ // static syncer::SyncService* SyncServiceFactory::GetForBrowserStateIfExists( ChromeBrowserState* browser_state) { - if (!syncer::IsSyncAllowedByFlag()) + if (!syncer::IsSyncAllowedByFlag()) { return nullptr; + } return static_cast<syncer::SyncService*>( GetInstance()->GetServiceForBrowserState(browser_state, false));
diff --git a/ios/chrome/browser/sync/sync_service_factory_unittest.cc b/ios/chrome/browser/sync/model/sync_service_factory_unittest.cc similarity index 98% rename from ios/chrome/browser/sync/sync_service_factory_unittest.cc rename to ios/chrome/browser/sync/model/sync_service_factory_unittest.cc index 52971ed..0ada5eba 100644 --- a/ios/chrome/browser/sync/sync_service_factory_unittest.cc +++ b/ios/chrome/browser/sync/model/sync_service_factory_unittest.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 "ios/chrome/browser/sync/sync_service_factory.h" +#include "ios/chrome/browser/sync/model/sync_service_factory.h" #include "base/command_line.h" #include "base/feature_list.h"
diff --git a/ios/chrome/browser/sync/sync_setup_service.cc b/ios/chrome/browser/sync/model/sync_setup_service.cc similarity index 93% rename from ios/chrome/browser/sync/sync_setup_service.cc rename to ios/chrome/browser/sync/model/sync_setup_service.cc index 348a9392..3848300 100644 --- a/ios/chrome/browser/sync/sync_setup_service.cc +++ b/ios/chrome/browser/sync/model/sync_setup_service.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 "ios/chrome/browser/sync/sync_setup_service.h" +#include "ios/chrome/browser/sync/model/sync_setup_service.h" #include <stdio.h> @@ -20,8 +20,9 @@ SyncSetupService::~SyncSetupService() {} void SyncSetupService::PrepareForFirstSyncSetup() { - if (!sync_blocker_) + if (!sync_blocker_) { sync_blocker_ = sync_service_->GetSetupInProgressHandle(); + } } void SyncSetupService::SetInitialSyncFeatureSetupComplete(
diff --git a/ios/chrome/browser/sync/model/sync_setup_service.h b/ios/chrome/browser/sync/model/sync_setup_service.h index c40d905b..8f9851db 100644 --- a/ios/chrome/browser/sync/model/sync_setup_service.h +++ b/ios/chrome/browser/sync/model/sync_setup_service.h
@@ -1,10 +1,60 @@ -// Copyright 2023 The Chromium Authors +// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_SETUP_SERVICE_H_ #define IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_SETUP_SERVICE_H_ -#import "ios/chrome/browser/sync/sync_setup_service.h" +#include <memory> + +#include "components/keyed_service/core/keyed_service.h" +#include "components/sync/base/model_type.h" +#include "components/sync/base/user_selectable_type.h" +#include "components/sync/service/sync_user_settings.h" + +namespace syncer { +class SyncService; +class SyncSetupInProgressHandle; +} // namespace syncer + +// Class that allows configuring sync. It handles enabling and disabling it, as +// well as choosing datatypes. Most actions are delayed until a commit is done, +// to allow the complex sync setup flow on iOS. +// vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +// DEPRECATED! Please do not add new usages. Use SyncService directly instead! +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +class SyncSetupService : public KeyedService { + public: + explicit SyncSetupService(syncer::SyncService* sync_service); + + SyncSetupService(const SyncSetupService&) = delete; + SyncSetupService& operator=(const SyncSetupService&) = delete; + + ~SyncSetupService() override; + + // Pauses sync allowing the user to configure what data to sync before + // actually starting to sync data with the server. + // TODO(crbug.com/1438800): Rename to PrepareForSyncSetup(). + virtual void PrepareForFirstSyncSetup(); + + // Sets the first setup complete flag. This method doesn't commit sync + // changes. PrepareForFirstSyncSetup() needs to be called before. This flag is + // not set if the user didn't turn on sync. + // This method should only be used with UnifiedConsent flag. + virtual void SetInitialSyncFeatureSetupComplete( + syncer::SyncFirstSetupCompleteSource source); + + // Commits all the pending configuration changes to Sync. + void CommitSyncChanges(); + + // Returns true if there are uncommitted sync changes. + bool HasUncommittedChanges(); + + private: + syncer::SyncService* const sync_service_; + + // Prevents Sync from running until configuration is complete. + std::unique_ptr<syncer::SyncSetupInProgressHandle> sync_blocker_; +}; #endif // IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_SETUP_SERVICE_H_
diff --git a/ios/chrome/browser/sync/sync_setup_service_factory.cc b/ios/chrome/browser/sync/model/sync_setup_service_factory.cc similarity index 89% rename from ios/chrome/browser/sync/sync_setup_service_factory.cc rename to ios/chrome/browser/sync/model/sync_setup_service_factory.cc index a3f2fe9e..05480d9 100644 --- a/ios/chrome/browser/sync/sync_setup_service_factory.cc +++ b/ios/chrome/browser/sync/model/sync_setup_service_factory.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ios/chrome/browser/sync/sync_setup_service_factory.h" +#include "ios/chrome/browser/sync/model/sync_setup_service_factory.h" #include "base/no_destructor.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/sync/service/sync_service.h" #include "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/sync/sync_service_factory.h" -#include "ios/chrome/browser/sync/sync_setup_service.h" +#include "ios/chrome/browser/sync/model/sync_service_factory.h" +#include "ios/chrome/browser/sync/model/sync_setup_service.h" // static SyncSetupService* SyncSetupServiceFactory::GetForBrowserState(
diff --git a/ios/chrome/browser/sync/model/sync_setup_service_factory.h b/ios/chrome/browser/sync/model/sync_setup_service_factory.h index 1da88caf..61d1c52 100644 --- a/ios/chrome/browser/sync/model/sync_setup_service_factory.h +++ b/ios/chrome/browser/sync/model/sync_setup_service_factory.h
@@ -1,10 +1,41 @@ -// Copyright 2023 The Chromium Authors +// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_SETUP_SERVICE_FACTORY_H_ #define IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_SETUP_SERVICE_FACTORY_H_ -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" +#include <memory> + +#include "base/no_destructor.h" +#include "components/keyed_service/ios/browser_state_keyed_service_factory.h" + +class ChromeBrowserState; +class SyncSetupService; + +// Singleton that owns all SyncSetupServices and associates them with +// BrowserStates. +class SyncSetupServiceFactory : public BrowserStateKeyedServiceFactory { + public: + static SyncSetupService* GetForBrowserState( + ChromeBrowserState* browser_state); + static SyncSetupService* GetForBrowserStateIfExists( + ChromeBrowserState* browser_state); + + static SyncSetupServiceFactory* GetInstance(); + + SyncSetupServiceFactory(const SyncSetupServiceFactory&) = delete; + SyncSetupServiceFactory& operator=(const SyncSetupServiceFactory&) = delete; + + private: + friend class base::NoDestructor<SyncSetupServiceFactory>; + + SyncSetupServiceFactory(); + ~SyncSetupServiceFactory() override; + + // BrowserStateKeyedServiceFactory implementation. + std::unique_ptr<KeyedService> BuildServiceInstanceFor( + web::BrowserState* context) const override; +}; #endif // IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_SETUP_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/sync/sync_setup_service_mock.cc b/ios/chrome/browser/sync/model/sync_setup_service_mock.cc similarity index 85% rename from ios/chrome/browser/sync/sync_setup_service_mock.cc rename to ios/chrome/browser/sync/model/sync_setup_service_mock.cc index 9264878..57003861 100644 --- a/ios/chrome/browser/sync/sync_setup_service_mock.cc +++ b/ios/chrome/browser/sync/model/sync_setup_service_mock.cc
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/chrome/browser/sync/sync_setup_service_mock.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_mock.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/web/public/browser_state.h" SyncSetupServiceMock::SyncSetupServiceMock(syncer::SyncService* sync_service)
diff --git a/ios/chrome/browser/sync/sync_setup_service_mock.h b/ios/chrome/browser/sync/model/sync_setup_service_mock.h similarity index 75% rename from ios/chrome/browser/sync/sync_setup_service_mock.h rename to ios/chrome/browser/sync/model/sync_setup_service_mock.h index ae76fcf9..c30e05e 100644 --- a/ios/chrome/browser/sync/sync_setup_service_mock.h +++ b/ios/chrome/browser/sync/model/sync_setup_service_mock.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_SYNC_SYNC_SETUP_SERVICE_MOCK_H_ -#define IOS_CHROME_BROWSER_SYNC_SYNC_SETUP_SERVICE_MOCK_H_ +#ifndef IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_SETUP_SERVICE_MOCK_H_ +#define IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_SETUP_SERVICE_MOCK_H_ -#include "ios/chrome/browser/sync/sync_setup_service.h" +#include "ios/chrome/browser/sync/model/sync_setup_service.h" #include "components/sync/base/user_selectable_type.h" #include "testing/gmock/include/gmock/gmock.h" @@ -29,4 +29,4 @@ (override)); }; -#endif // IOS_CHROME_BROWSER_SYNC_SYNC_SETUP_SERVICE_MOCK_H_ +#endif // IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_SETUP_SERVICE_MOCK_H_
diff --git a/ios/chrome/browser/sync/sync_service_factory.h b/ios/chrome/browser/sync/sync_service_factory.h deleted file mode 100644 index 43834f53..0000000 --- a/ios/chrome/browser/sync/sync_service_factory.h +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_SYNC_SYNC_SERVICE_FACTORY_H_ -#define IOS_CHROME_BROWSER_SYNC_SYNC_SERVICE_FACTORY_H_ - -#include <memory> - -#include "base/no_destructor.h" -#include "components/keyed_service/ios/browser_state_keyed_service_factory.h" - -class ChromeBrowserState; - -namespace syncer { -class SyncServiceImpl; -class SyncService; -} // namespace syncer - -// Singleton that owns all SyncServices and associates them with -// ChromeBrowserState. -class SyncServiceFactory : public BrowserStateKeyedServiceFactory { - public: - static syncer::SyncService* GetForBrowserState( - ChromeBrowserState* browser_state); - - static syncer::SyncService* GetForBrowserStateIfExists( - ChromeBrowserState* browser_state); - - static syncer::SyncServiceImpl* GetAsSyncServiceImplForBrowserStateForTesting( - ChromeBrowserState* browser_state); - - static SyncServiceFactory* GetInstance(); - - // Returns the default factory, useful in tests where it's null by default. - static TestingFactory GetDefaultFactory(); - - private: - friend class base::NoDestructor<SyncServiceFactory>; - - SyncServiceFactory(); - ~SyncServiceFactory() override; - - // BrowserStateKeyedServiceFactory implementation. - std::unique_ptr<KeyedService> BuildServiceInstanceFor( - web::BrowserState* context) const override; -}; - -#endif // IOS_CHROME_BROWSER_SYNC_SYNC_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/sync/sync_setup_service.h b/ios/chrome/browser/sync/sync_setup_service.h deleted file mode 100644 index 53f97fa..0000000 --- a/ios/chrome/browser/sync/sync_setup_service.h +++ /dev/null
@@ -1,60 +0,0 @@ -// Copyright 2012 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_SYNC_SYNC_SETUP_SERVICE_H_ -#define IOS_CHROME_BROWSER_SYNC_SYNC_SETUP_SERVICE_H_ - -#include <memory> - -#include "components/keyed_service/core/keyed_service.h" -#include "components/sync/base/model_type.h" -#include "components/sync/base/user_selectable_type.h" -#include "components/sync/service/sync_user_settings.h" - -namespace syncer { -class SyncService; -class SyncSetupInProgressHandle; -} // namespace syncer - -// Class that allows configuring sync. It handles enabling and disabling it, as -// well as choosing datatypes. Most actions are delayed until a commit is done, -// to allow the complex sync setup flow on iOS. -// vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// DEPRECATED! Please do not add new usages. Use SyncService directly instead! -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -class SyncSetupService : public KeyedService { - public: - explicit SyncSetupService(syncer::SyncService* sync_service); - - SyncSetupService(const SyncSetupService&) = delete; - SyncSetupService& operator=(const SyncSetupService&) = delete; - - ~SyncSetupService() override; - - // Pauses sync allowing the user to configure what data to sync before - // actually starting to sync data with the server. - // TODO(crbug.com/1438800): Rename to PrepareForSyncSetup(). - virtual void PrepareForFirstSyncSetup(); - - // Sets the first setup complete flag. This method doesn't commit sync - // changes. PrepareForFirstSyncSetup() needs to be called before. This flag is - // not set if the user didn't turn on sync. - // This method should only be used with UnifiedConsent flag. - virtual void SetInitialSyncFeatureSetupComplete( - syncer::SyncFirstSetupCompleteSource source); - - // Commits all the pending configuration changes to Sync. - void CommitSyncChanges(); - - // Returns true if there are uncommitted sync changes. - bool HasUncommittedChanges(); - - private: - syncer::SyncService* const sync_service_; - - // Prevents Sync from running until configuration is complete. - std::unique_ptr<syncer::SyncSetupInProgressHandle> sync_blocker_; -}; - -#endif // IOS_CHROME_BROWSER_SYNC_SYNC_SETUP_SERVICE_H_
diff --git a/ios/chrome/browser/sync/sync_setup_service_factory.h b/ios/chrome/browser/sync/sync_setup_service_factory.h deleted file mode 100644 index f5b99e2..0000000 --- a/ios/chrome/browser/sync/sync_setup_service_factory.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2012 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_SYNC_SYNC_SETUP_SERVICE_FACTORY_H_ -#define IOS_CHROME_BROWSER_SYNC_SYNC_SETUP_SERVICE_FACTORY_H_ - -#include <memory> - -#include "base/no_destructor.h" -#include "components/keyed_service/ios/browser_state_keyed_service_factory.h" - -class ChromeBrowserState; -class SyncSetupService; - -// Singleton that owns all SyncSetupServices and associates them with -// BrowserStates. -class SyncSetupServiceFactory : public BrowserStateKeyedServiceFactory { - public: - static SyncSetupService* GetForBrowserState( - ChromeBrowserState* browser_state); - static SyncSetupService* GetForBrowserStateIfExists( - ChromeBrowserState* browser_state); - - static SyncSetupServiceFactory* GetInstance(); - - SyncSetupServiceFactory(const SyncSetupServiceFactory&) = delete; - SyncSetupServiceFactory& operator=(const SyncSetupServiceFactory&) = delete; - - private: - friend class base::NoDestructor<SyncSetupServiceFactory>; - - SyncSetupServiceFactory(); - ~SyncSetupServiceFactory() override; - - // BrowserStateKeyedServiceFactory implementation. - std::unique_ptr<KeyedService> BuildServiceInstanceFor( - web::BrowserState* context) const override; -}; - -#endif // IOS_CHROME_BROWSER_SYNC_SYNC_SETUP_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/synced_sessions/BUILD.gn b/ios/chrome/browser/synced_sessions/BUILD.gn index 5a240ed..2de4317 100644 --- a/ios/chrome/browser/synced_sessions/BUILD.gn +++ b/ios/chrome/browser/synced_sessions/BUILD.gn
@@ -21,7 +21,7 @@ "//components/sync", "//components/sync_device_info", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/url_loading", "//ios/chrome/browser/url_loading:url_loading_params_header", "//third_party/abseil-cpp:absl",
diff --git a/ios/chrome/browser/synced_sessions/DEPS b/ios/chrome/browser/synced_sessions/DEPS index 0ae71347..10caf9a 100644 --- a/ios/chrome/browser/synced_sessions/DEPS +++ b/ios/chrome/browser/synced_sessions/DEPS
@@ -1,5 +1,5 @@ include_rules = [ "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/url_loading", ]
diff --git a/ios/chrome/browser/synced_sessions/synced_sessions.mm b/ios/chrome/browser/synced_sessions/synced_sessions.mm index 9b373b7..ac89f69 100644 --- a/ios/chrome/browser/synced_sessions/synced_sessions.mm +++ b/ios/chrome/browser/synced_sessions/synced_sessions.mm
@@ -11,7 +11,7 @@ #import "base/time/time.h" #import "components/sync_sessions/open_tabs_ui_delegate.h" #import "components/sync_sessions/session_sync_service.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" #import "ios/chrome/browser/synced_sessions/distant_session.h" namespace {
diff --git a/ios/chrome/browser/tabs/BUILD.gn b/ios/chrome/browser/tabs/BUILD.gn index ee67a53..7cc1db0 100644 --- a/ios/chrome/browser/tabs/BUILD.gn +++ b/ios/chrome/browser/tabs/BUILD.gn
@@ -105,7 +105,7 @@ "//ios/chrome/browser/ssl", "//ios/chrome/browser/store_kit", "//ios/chrome/browser/supervised_user", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/translate", "//ios/chrome/browser/ui/download:features", "//ios/chrome/browser/voice",
diff --git a/ios/chrome/browser/tabs/DEPS b/ios/chrome/browser/tabs/DEPS index 5cb2330..34d08bf 100644 --- a/ios/chrome/browser/tabs/DEPS +++ b/ios/chrome/browser/tabs/DEPS
@@ -1,6 +1,6 @@ include_rules = [ "+ios/chrome/browser/sessions", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", "+ios/chrome/browser/snapshots", "+ios/chrome/browser/download/download_manager_tab_helper.h", "+ios/chrome/browser/ntp/new_tab_page_util.h",
diff --git a/ios/chrome/browser/tabs/synced_window_delegate_browser_agent.mm b/ios/chrome/browser/tabs/synced_window_delegate_browser_agent.mm index ad79250..ae0dc816 100644 --- a/ios/chrome/browser/tabs/synced_window_delegate_browser_agent.mm +++ b/ios/chrome/browser/tabs/synced_window_delegate_browser_agent.mm
@@ -8,7 +8,7 @@ #import "ios/chrome/browser/sessions/ios_chrome_session_tab_helper.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" -#import "ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h" +#import "ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate.h" #import "ios/web/public/navigation/navigation_manager.h" BROWSER_USER_DATA_KEY_IMPL(SyncedWindowDelegateBrowserAgent)
diff --git a/ios/chrome/browser/tabs/tab_helper_util.mm b/ios/chrome/browser/tabs/tab_helper_util.mm index 3b4bcce..679c5a5 100644 --- a/ios/chrome/browser/tabs/tab_helper_util.mm +++ b/ios/chrome/browser/tabs/tab_helper_util.mm
@@ -82,7 +82,7 @@ #import "ios/chrome/browser/ssl/captive_portal_tab_helper.h" #import "ios/chrome/browser/supervised_user/supervised_user_error_container.h" #import "ios/chrome/browser/supervised_user/supervised_user_url_filter_tab_helper.h" -#import "ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h" +#import "ios/chrome/browser/sync/model/ios_chrome_synced_tab_delegate.h" #import "ios/chrome/browser/translate/chrome_ios_translate_client.h" #import "ios/chrome/browser/voice/voice_search_navigations_tab_helper.h" #import "ios/chrome/browser/web/annotations/annotations_tab_helper.h"
diff --git a/ios/chrome/browser/tabs/tab_pickup/BUILD.gn b/ios/chrome/browser/tabs/tab_pickup/BUILD.gn index 8174409..933b078 100644 --- a/ios/chrome/browser/tabs/tab_pickup/BUILD.gn +++ b/ios/chrome/browser/tabs/tab_pickup/BUILD.gn
@@ -20,7 +20,7 @@ "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/shared/model/web_state_list", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/synced_sessions", ] } @@ -42,7 +42,7 @@ "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/snapshots", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/synced_sessions", "//ios/chrome/common/ui/favicon", "//ios/chrome/common/ui/favicon:favicon_constants",
diff --git a/ios/chrome/browser/tabs/tab_pickup/tab_pickup_browser_agent.mm b/ios/chrome/browser/tabs/tab_pickup/tab_pickup_browser_agent.mm index a8ab05f..12192d9 100644 --- a/ios/chrome/browser/tabs/tab_pickup/tab_pickup_browser_agent.mm +++ b/ios/chrome/browser/tabs/tab_pickup/tab_pickup_browser_agent.mm
@@ -14,7 +14,7 @@ #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/prefs/pref_names.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" #import "ios/chrome/browser/synced_sessions/distant_session.h" #import "ios/chrome/browser/synced_sessions/synced_sessions.h" #import "ios/chrome/browser/tabs/tab_pickup/features.h"
diff --git a/ios/chrome/browser/tabs/tab_pickup/tab_pickup_infobar_delegate.mm b/ios/chrome/browser/tabs/tab_pickup/tab_pickup_infobar_delegate.mm index dcba7e3..2a9d508 100644 --- a/ios/chrome/browser/tabs/tab_pickup/tab_pickup_infobar_delegate.mm +++ b/ios/chrome/browser/tabs/tab_pickup/tab_pickup_infobar_delegate.mm
@@ -18,7 +18,7 @@ #import "ios/chrome/browser/shared/model/web_state_list/web_state_opener.h" #import "ios/chrome/browser/shared/public/commands/application_commands.h" #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" #import "ios/chrome/browser/synced_sessions/distant_session.h" #import "ios/chrome/browser/synced_sessions/distant_tab.h" #import "ios/chrome/browser/synced_sessions/synced_sessions.h"
diff --git a/ios/chrome/browser/tabs_search/model/BUILD.gn b/ios/chrome/browser/tabs_search/model/BUILD.gn index fb56f45d..d80ea31 100644 --- a/ios/chrome/browser/tabs_search/model/BUILD.gn +++ b/ios/chrome/browser/tabs_search/model/BUILD.gn
@@ -39,7 +39,7 @@ "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", ] }
diff --git a/ios/chrome/browser/tabs_search/model/DEPS b/ios/chrome/browser/tabs_search/model/DEPS index e0e87d7..4902e3e 100644 --- a/ios/chrome/browser/tabs_search/model/DEPS +++ b/ios/chrome/browser/tabs_search/model/DEPS
@@ -4,7 +4,7 @@ "+ios/chrome/browser/sessions", "+ios/chrome/browser/tabs", "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", ] specific_include_rules = {
diff --git a/ios/chrome/browser/tabs_search/model/tabs_search_service_factory.mm b/ios/chrome/browser/tabs_search/model/tabs_search_service_factory.mm index e807b4a6..ee3fb84 100644 --- a/ios/chrome/browser/tabs_search/model/tabs_search_service_factory.mm +++ b/ios/chrome/browser/tabs_search/model/tabs_search_service_factory.mm
@@ -14,8 +14,8 @@ #import "ios/chrome/browser/shared/model/browser_state/browser_state_otr_helper.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/tabs_search/model/tabs_search_service.h" namespace {
diff --git a/ios/chrome/browser/ui/account_picker/account_picker_confirmation/BUILD.gn b/ios/chrome/browser/ui/account_picker/account_picker_confirmation/BUILD.gn index f886c075..c904cfdc 100644 --- a/ios/chrome/browser/ui/account_picker/account_picker_confirmation/BUILD.gn +++ b/ios/chrome/browser/ui/account_picker/account_picker_confirmation/BUILD.gn
@@ -18,6 +18,7 @@ deps = [ "//base", "//components/signin/public/base", + "//components/signin/public/identity_manager", "//components/strings:components_strings", "//ios/chrome/app/strings:ios_branded_strings_grit", "//ios/chrome/app/strings:ios_strings_grit", @@ -28,7 +29,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/account_picker:account_picker_configuration", "//ios/chrome/browser/ui/account_picker:account_picker_layout", "//ios/chrome/browser/ui/account_picker/account_picker_screen",
diff --git a/ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_coordinator.mm b/ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_coordinator.mm index 7ebe53a..0efca4e3 100644 --- a/ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_coordinator.mm +++ b/ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_coordinator.mm
@@ -9,8 +9,9 @@ #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" +#import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/signin/system_identity.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_coordinator_delegate.h" #import "ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_mediator.h" #import "ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_view_controller.h" @@ -49,6 +50,8 @@ _mediator = [[AccountPickerConfirmationScreenMediator alloc] initWithAccountManagerService:ChromeAccountManagerServiceFactory:: GetForBrowserState(browserState) + identityManager:IdentityManagerFactory::GetForBrowserState( + browserState) configuration:_configuration]; _mediator.delegate = self; _confirmationViewController =
diff --git a/ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_mediator.h b/ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_mediator.h index 87658f37..0a6e5811 100644 --- a/ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_mediator.h +++ b/ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_mediator.h
@@ -13,6 +13,10 @@ class ChromeAccountManagerService; @protocol SystemIdentity; +namespace signin { +class IdentityManager; +} // namespace signin + // Delegate for AccountPickerConfirmationScreenMediator. @protocol AccountPickerConfirmationScreenMediatorDelegate <NSObject> @@ -26,10 +30,11 @@ @interface AccountPickerConfirmationScreenMediator : NSObject // The designated initializer. -- (instancetype)initWithAccountManagerService: - (ChromeAccountManagerService*)accountManagerService - configuration: - (AccountPickerConfiguration*)configuration +- (instancetype) + initWithAccountManagerService: + (ChromeAccountManagerService*)accountManagerService + identityManager:(signin::IdentityManager*)identityManager + configuration:(AccountPickerConfiguration*)configuration NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_mediator.mm b/ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_mediator.mm index 3a212a1..2e749142 100644 --- a/ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_mediator.mm +++ b/ios/chrome/browser/ui/account_picker/account_picker_confirmation/account_picker_confirmation_screen_mediator.mm
@@ -6,6 +6,7 @@ #import <UIKit/UIKit.h> +#import "components/signin/public/identity_manager/identity_manager.h" #import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_observer_bridge.h" @@ -24,22 +25,27 @@ ChromeAccountManagerService* _accountManagerService; std::unique_ptr<ChromeAccountManagerServiceObserverBridge> _accountManagerServiceObserver; + // Identity manager. + signin::IdentityManager* _identityManager; // Account picker configuration. __strong AccountPickerConfiguration* _configuration; // Avatar of selected identity. __strong UIImage* _avatar; } -- (instancetype)initWithAccountManagerService: - (ChromeAccountManagerService*)accountManagerService - configuration: - (AccountPickerConfiguration*)configuration { +- (instancetype) + initWithAccountManagerService: + (ChromeAccountManagerService*)accountManagerService + identityManager:(signin::IdentityManager*)identityManager + configuration:(AccountPickerConfiguration*)configuration { if (self = [super init]) { DCHECK(accountManagerService); + DCHECK(identityManager); _accountManagerService = accountManagerService; _accountManagerServiceObserver = std::make_unique<ChromeAccountManagerServiceObserverBridge>( self, _accountManagerService); + _identityManager = identityManager; _configuration = configuration; } return self; @@ -47,9 +53,11 @@ - (void)dealloc { DCHECK(!_accountManagerService); + DCHECK(!_identityManager); } - (void)disconnect { + _identityManager = nullptr; _accountManagerService = nullptr; _accountManagerServiceObserver.reset(); } @@ -83,6 +91,15 @@ id<SystemIdentity> identity = _accountManagerService->GetDefaultIdentity(); + // If the user is signed-in, present the signed-in account. + if (_identityManager->HasPrimaryAccount(signin::ConsentLevel::kSignin)) { + const CoreAccountInfo primaryAccountInfo = + _identityManager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin); + id<SystemIdentity> primaryAccount = + _accountManagerService->GetIdentityWithGaiaID(primaryAccountInfo.gaia); + identity = primaryAccount; + } + if (!IsConsistencyNewAccountInterfaceEnabled() && !identity) { [_delegate accountPickerConfirmationScreenMediatorNoIdentities:self]; return;
diff --git a/ios/chrome/browser/ui/authentication/BUILD.gn b/ios/chrome/browser/ui/authentication/BUILD.gn index 50f5a97..6331fda 100644 --- a/ios/chrome/browser/ui/authentication/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/BUILD.gn
@@ -63,7 +63,7 @@ "//ios/chrome/browser/signin:capabilities_types", "//ios/chrome/browser/signin:system_identity", "//ios/chrome/browser/signin:system_identity_manager", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/authentication/signin:signin_headers", "//ios/chrome/browser/ui/ntp:feature_flags", @@ -154,8 +154,8 @@ "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/authentication/unified_consent:unified_consent_ui", "//ios/chrome/browser/unified_consent", @@ -200,7 +200,7 @@ "//ios/chrome/browser/signin:capabilities_types", "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/authentication/enterprise/enterprise_prompt", "//ios/chrome/test/app:test_support",
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow.mm b/ios/chrome/browser/ui/authentication/authentication_flow.mm index df958c2..527dfae2 100644 --- a/ios/chrome/browser/ui/authentication/authentication_flow.mm +++ b/ios/chrome/browser/ui/authentication/authentication_flow.mm
@@ -28,7 +28,7 @@ #import "ios/chrome/browser/signin/constants.h" #import "ios/chrome/browser/signin/system_identity.h" #import "ios/chrome/browser/signin/system_identity_manager.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/authentication_flow_performer.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/public/provider/chrome/browser/signin/signin_error_api.h"
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm index f22e866..5879dd07 100644 --- a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm +++ b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm
@@ -41,8 +41,8 @@ #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/signin/system_identity.h" #import "ios/chrome/browser/signin/system_identity_manager.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" #import "ios/chrome/browser/ui/authentication/authentication_constants.h" #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h" #import "ios/chrome/browser/ui/settings/import_data_table_view_controller.h"
diff --git a/ios/chrome/browser/ui/authentication/authentication_ui_util.mm b/ios/chrome/browser/ui/authentication/authentication_ui_util.mm index 9670a50..444f472 100644 --- a/ios/chrome/browser/ui/authentication/authentication_ui_util.mm +++ b/ios/chrome/browser/ui/authentication/authentication_ui_util.mm
@@ -14,8 +14,8 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" #import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/authentication/cells/BUILD.gn b/ios/chrome/browser/ui/authentication/cells/BUILD.gn index 8d18a32..0720056 100644 --- a/ios/chrome/browser/ui/authentication/cells/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/cells/BUILD.gn
@@ -79,7 +79,7 @@ "//ios/chrome/browser/shared/ui/table_view/cells", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/util:image_util", "//ios/chrome/test:test_support",
diff --git a/ios/chrome/browser/ui/authentication/enterprise/BUILD.gn b/ios/chrome/browser/ui/authentication/enterprise/BUILD.gn index b8c6e714..b818dac 100644 --- a/ios/chrome/browser/ui/authentication/enterprise/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/enterprise/BUILD.gn
@@ -18,6 +18,6 @@ "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", ] }
diff --git a/ios/chrome/browser/ui/authentication/history_sync/BUILD.gn b/ios/chrome/browser/ui/authentication/history_sync/BUILD.gn index ea74e89ef..1e77de9 100644 --- a/ios/chrome/browser/ui/authentication/history_sync/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/history_sync/BUILD.gn
@@ -31,7 +31,7 @@ "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:constants", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication/enterprise:enterprise_utils", "//ios/chrome/browser/ui/authentication/signin:constants",
diff --git a/ios/chrome/browser/ui/authentication/history_sync/history_sync_coordinator.mm b/ios/chrome/browser/ui/authentication/history_sync/history_sync_coordinator.mm index 72a0c7dc..832bd27 100644 --- a/ios/chrome/browser/ui/authentication/history_sync/history_sync_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/history_sync/history_sync_coordinator.mm
@@ -17,7 +17,7 @@ #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.h" #import "ios/chrome/browser/ui/authentication/history_sync/history_sync_mediator.h" #import "ios/chrome/browser/ui/authentication/history_sync/history_sync_utils.h"
diff --git a/ios/chrome/browser/ui/authentication/history_sync/history_sync_popup_coordinator.mm b/ios/chrome/browser/ui/authentication/history_sync/history_sync_popup_coordinator.mm index 9160a75..d3ab248 100644 --- a/ios/chrome/browser/ui/authentication/history_sync/history_sync_popup_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/history_sync/history_sync_popup_coordinator.mm
@@ -12,7 +12,7 @@ #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h" #import "ios/chrome/browser/ui/authentication/history_sync/history_sync_coordinator.h"
diff --git a/ios/chrome/browser/ui/authentication/signed_in_accounts/BUILD.gn b/ios/chrome/browser/ui/authentication/signed_in_accounts/BUILD.gn index 65302cd..ef428bee 100644 --- a/ios/chrome/browser/ui/authentication/signed_in_accounts/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signed_in_accounts/BUILD.gn
@@ -49,8 +49,8 @@ "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/test:block_cleanup_test", "//ios/chrome/test:test_support", "//ios/web/public/test",
diff --git a/ios/chrome/browser/ui/authentication/signed_in_accounts/signed_in_accounts_view_controller_unittest.mm b/ios/chrome/browser/ui/authentication/signed_in_accounts/signed_in_accounts_view_controller_unittest.mm index 133d506..1bfe7603 100644 --- a/ios/chrome/browser/ui/authentication/signed_in_accounts/signed_in_accounts_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signed_in_accounts/signed_in_accounts_view_controller_unittest.mm
@@ -19,10 +19,10 @@ #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_mock.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_mock.h" #import "ios/chrome/test/block_cleanup_test.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #import "ios/web/public/test/web_task_environment.h"
diff --git a/ios/chrome/browser/ui/authentication/signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/BUILD.gn index 27bc3a0..27dfa0e 100644 --- a/ios/chrome/browser/ui/authentication/signin/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signin/BUILD.gn
@@ -59,7 +59,7 @@ "//ios/chrome/browser/shared/public/features:system_flags", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication/history_sync", "//ios/chrome/browser/ui/authentication/signin/add_account_signin", "//ios/chrome/browser/ui/authentication/signin/advanced_settings_signin", @@ -116,7 +116,7 @@ "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication/signin:signin_headers", "//ios/chrome/browser/ui/authentication/signin/user_signin", "//ios/chrome/test:test_support",
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn index 090bf4d..fbf0b560 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn
@@ -28,7 +28,7 @@ "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication/signin:signin_protected", "//ios/chrome/browser/ui/settings/google_services", "//ios/chrome/browser/ui/settings/google_services:constants", @@ -66,8 +66,8 @@ "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/authentication", "//ios/chrome/test:test_support", "//ios/web/public/test", @@ -81,6 +81,7 @@ deps = [ "//base", "//base/test:test_support", + "//build:branding_buildflags", "//components/bookmarks/common", "//components/strings", "//components/sync/base:features",
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm index 85fd9af..44cf3c0a3 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.mm
@@ -14,9 +14,9 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" #import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator.h" #import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_navigation_controller.h" #import "ios/chrome/browser/ui/authentication/signin/signin_coordinator+protected.h"
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_egtest.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_egtest.mm index 2bb9a6a..2c121d8 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_egtest.mm +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_egtest.mm
@@ -6,6 +6,7 @@ #import "base/ios/ios_util.h" #import "base/test/ios/wait_util.h" #import "base/time/time.h" +#import "build/branding_buildflags.h" #import "components/bookmarks/common/bookmark_features.h" #import "components/bookmarks/common/storage_type.h" #import "components/strings/grit/components_strings.h" @@ -105,7 +106,13 @@ // Tests that signing in, tapping the Settings link on the confirmation screen // and closing the advanced sign-in settings correctly leaves the user signed // in. -- (void)testSignInOpenSyncSettings { +// TODO(crbug.com/1487981): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testSignInOpenSyncSettings DISABLED_testSignInOpenSyncSettings +#else +#define MAYBE_testSignInOpenSyncSettings testSignInOpenSyncSettings +#endif +- (void)MAYBE_testSignInOpenSyncSettings { FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1]; [SigninEarlGrey addFakeIdentity:fakeIdentity]; @@ -158,7 +165,15 @@ // Tests that a user that signs in and gives sync consent can sign // out through the "Sign out and Turn Off Sync" > "Clear Data" option in Sync // settings. -- (void)testSignInOpenSyncSettingsSignOutAndTurnOffSyncWithClearData { +// TODO(crbug.com/1487981): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testSignInOpenSyncSettingsSignOutAndTurnOffSyncWithClearData \ + DISABLED_testSignInOpenSyncSettingsSignOutAndTurnOffSyncWithClearData +#else +#define MAYBE_testSignInOpenSyncSettingsSignOutAndTurnOffSyncWithClearData \ + testSignInOpenSyncSettingsSignOutAndTurnOffSyncWithClearData +#endif +- (void)MAYBE_testSignInOpenSyncSettingsSignOutAndTurnOffSyncWithClearData { FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1]; [SigninEarlGrey addFakeIdentity:fakeIdentity]; @@ -207,7 +222,15 @@ // Tests that a user that signs in and gives sync consent can sign // out through the "Sign out and Turn Off Sync" > "Keep Data" option in Sync // setting. -- (void)testSignInOpenSyncSettingsSignOutAndTurnOffSyncWithKeepData { +// TODO(crbug.com/1487981): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testSignInOpenSyncSettingsSignOutAndTurnOffSyncWithKeepData \ + DISABLED_testSignInOpenSyncSettingsSignOutAndTurnOffSyncWithKeepData +#else +#define MAYBE_testSignInOpenSyncSettingsSignOutAndTurnOffSyncWithKeepData \ + testSignInOpenSyncSettingsSignOutAndTurnOffSyncWithKeepData +#endif +- (void)MAYBE_testSignInOpenSyncSettingsSignOutAndTurnOffSyncWithKeepData { FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1]; [SigninEarlGrey addFakeIdentity:fakeIdentity]; @@ -273,7 +296,15 @@ // Tests that a user account with a sync password displays a sync error // message after sign-in. -- (void)testSigninOpenSyncSettingsWithPasswordError { +// TODO(crbug.com/1487981): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testSigninOpenSyncSettingsWithPasswordError \ + DISABLED_testSigninOpenSyncSettingsWithPasswordError +#else +#define MAYBE_testSigninOpenSyncSettingsWithPasswordError \ + testSigninOpenSyncSettingsWithPasswordError +#endif +- (void)MAYBE_testSigninOpenSyncSettingsWithPasswordError { [ChromeEarlGrey addBookmarkWithSyncPassphrase:kPassphrase]; FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1]; [SigninEarlGrey addFakeIdentity:fakeIdentity];
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm index 0158087..a451e6d 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm
@@ -21,8 +21,8 @@ #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #import "testing/platform_test.h"
diff --git a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/BUILD.gn index b77ba9e4..78bc004 100644 --- a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/BUILD.gn
@@ -26,7 +26,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication:authentication", "//ios/chrome/browser/ui/authentication/enterprise:enterprise_utils", "//ios/chrome/browser/ui/authentication/signin/consistency_promo_signin:layout",
diff --git a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_coordinator.mm index 0d89f2c..c4fa1e3 100644 --- a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_coordinator.mm
@@ -10,7 +10,7 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/system_identity.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.h" #import "ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.h" #import "ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_view_controller.h"
diff --git a/ios/chrome/browser/ui/authentication/signin/forced_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/forced_signin/BUILD.gn index 7a7e0c1..e32210e 100644 --- a/ios/chrome/browser/ui/authentication/signin/forced_signin/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signin/forced_signin/BUILD.gn
@@ -30,6 +30,7 @@ deps = [ "//base", "//base/test:test_support", + "//build:branding_buildflags", "//components/policy:policy_code_generate", "//components/policy/core/common:common_constants", "//components/signin/ios/browser:features",
diff --git a/ios/chrome/browser/ui/authentication/signin/forced_signin/forced_signin_egtest.mm b/ios/chrome/browser/ui/authentication/signin/forced_signin/forced_signin_egtest.mm index 8cc0f4c5..5cca3fe6 100644 --- a/ios/chrome/browser/ui/authentication/signin/forced_signin/forced_signin_egtest.mm +++ b/ios/chrome/browser/ui/authentication/signin/forced_signin/forced_signin_egtest.mm
@@ -7,6 +7,7 @@ #import "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" #import "base/time/time.h" +#import "build/branding_buildflags.h" #import "components/policy/core/common/policy_loader_ios_constants.h" #import "components/policy/policy_constants.h" #import "components/signin/ios/browser/features.h" @@ -494,7 +495,15 @@ } // Tests signing out account from accounts on this device with sync disabled. -- (void)testSignOutFromAccountsOnThisDeviceSyncDisabled { +// TODO(crbug.com/1487746): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testSignOutFromAccountsOnThisDeviceSyncDisabled \ + DISABLED_testSignOutFromAccountsOnThisDeviceSyncDisabled +#else +#define MAYBE_testSignOutFromAccountsOnThisDeviceSyncDisabled \ + testSignOutFromAccountsOnThisDeviceSyncDisabled +#endif +- (void)MAYBE_testSignOutFromAccountsOnThisDeviceSyncDisabled { // Add account. FakeSystemIdentity* fakeIdentity1 = [FakeSystemIdentity fakeIdentity1]; [SigninEarlGrey addFakeIdentity:fakeIdentity1];
diff --git a/ios/chrome/browser/ui/authentication/signin/instant_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/instant_signin/BUILD.gn index a1f82fa2..ce61978 100644 --- a/ios/chrome/browser/ui/authentication/signin/instant_signin/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signin/instant_signin/BUILD.gn
@@ -19,7 +19,7 @@ "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/ui/elements:activity_overlay", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication/signin:signin_protected", "//ios/chrome/browser/ui/authentication/unified_consent/identity_chooser",
diff --git a/ios/chrome/browser/ui/authentication/signin/instant_signin/instant_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/instant_signin/instant_signin_coordinator.mm index 41bf88a..2ab53a15 100644 --- a/ios/chrome/browser/ui/authentication/signin/instant_signin/instant_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/instant_signin/instant_signin_coordinator.mm
@@ -13,7 +13,7 @@ #import "ios/chrome/browser/shared/ui/elements/activity_overlay_coordinator.h" #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/authentication_flow.h" #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h" #import "ios/chrome/browser/ui/authentication/signin/instant_signin/instant_signin_mediator.h"
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_utils.mm b/ios/chrome/browser/ui/authentication/signin/signin_utils.mm index ad09209..59b7e6f 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_utils.mm +++ b/ios/chrome/browser/ui/authentication/signin/signin_utils.mm
@@ -25,7 +25,7 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/system_identity.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/history_sync/history_sync_coordinator.h" #import "ios/chrome/browser/ui/authentication/signin/signin_constants.h" #import "ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_constants.h"
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_utils_unittest.mm b/ios/chrome/browser/ui/authentication/signin/signin_utils_unittest.mm index 6a9f2ab..6bbdf91 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_utils_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/signin_utils_unittest.mm
@@ -32,7 +32,7 @@ #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_constants.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #import "ios/web/public/test/web_task_environment.h"
diff --git a/ios/chrome/browser/ui/authentication/signin/two_screens_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/two_screens_signin/BUILD.gn index a350d8f..b3ceed7a 100644 --- a/ios/chrome/browser/ui/authentication/signin/two_screens_signin/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signin/two_screens_signin/BUILD.gn
@@ -39,8 +39,8 @@ "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/authentication/signin:signin_headers", "//ios/chrome/browser/ui/authentication/tangible_sync:signin_ui", "//ios/chrome/browser/ui/first_run/signin:signin_ui",
diff --git a/ios/chrome/browser/ui/authentication/signin/two_screens_signin/two_screens_signin_coordinator_unittest.mm b/ios/chrome/browser/ui/authentication/signin/two_screens_signin/two_screens_signin_coordinator_unittest.mm index 0934c83b..9735d4cf 100644 --- a/ios/chrome/browser/ui/authentication/signin/two_screens_signin/two_screens_signin_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/two_screens_signin/two_screens_signin_coordinator_unittest.mm
@@ -18,8 +18,8 @@ #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/signin/signin_completion_info.h" #import "ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_view_controller.h" #import "ios/chrome/browser/ui/first_run/signin/signin_screen_view_controller.h"
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/user_signin/BUILD.gn index bd5800fa..036ef25 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/BUILD.gn
@@ -31,7 +31,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication/signin:signin_headers", "//ios/chrome/browser/ui/authentication/signin:signin_protected", @@ -81,8 +81,8 @@ "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication/signin/user_signin/logging", "//ios/chrome/browser/unified_consent",
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm index 2bc6966..69724093 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm
@@ -20,8 +20,8 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" #import "ios/chrome/browser/ui/authentication/authentication_flow.h" #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h" #import "ios/chrome/browser/ui/authentication/signin/signin_constants.h"
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.mm index a928d8f9..54fff74 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.mm
@@ -15,7 +15,7 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/signin/system_identity.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" #import "ios/chrome/browser/ui/authentication/authentication_flow.h" @interface UserSigninMediator ()
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm index eb10907..211a607 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm
@@ -27,10 +27,10 @@ #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_mock.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_mock.h" #import "ios/chrome/browser/ui/authentication/authentication_flow.h" #import "ios/chrome/browser/ui/authentication/authentication_flow_performer.h" #import "ios/chrome/browser/unified_consent/unified_consent_service_factory.h"
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm b/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm index bb8ef5c..b88cfe2c 100644 --- a/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm +++ b/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm
@@ -36,7 +36,7 @@ #import "ios/chrome/browser/signin/fake_system_identity_interaction_manager.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/cells/table_view_identity_cell.h" #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/testing/earl_grey/earl_grey_app.h"
diff --git a/ios/chrome/browser/ui/authentication/signin_notification_infobar_delegate.h b/ios/chrome/browser/ui/authentication/signin_notification_infobar_delegate.h index 1b38861..6be8bbc 100644 --- a/ios/chrome/browser/ui/authentication/signin_notification_infobar_delegate.h +++ b/ios/chrome/browser/ui/authentication/signin_notification_infobar_delegate.h
@@ -10,7 +10,7 @@ #include "components/infobars/core/confirm_infobar_delegate.h" #include "components/sync/service/sync_service_observer.h" -#include "ios/chrome/browser/sync/sync_setup_service.h" +#include "ios/chrome/browser/sync/model/sync_setup_service.h" #include "ui/gfx/image/image.h" @protocol ApplicationSettingsCommands;
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm index 633c9fd..d882aa33 100644 --- a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm +++ b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm
@@ -27,7 +27,7 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_observer_bridge.h" #import "ios/chrome/browser/signin/system_identity.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_consumer.h" #import "ios/chrome/browser/ui/authentication/signin/signin_coordinator.h"
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator_unittest.mm index 2ad1485..53283d3 100644 --- a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator_unittest.mm
@@ -30,10 +30,10 @@ #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_mock.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_mock.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h"
diff --git a/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.mm b/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.mm index 13b0270e..08852fa 100644 --- a/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.mm
@@ -21,8 +21,8 @@ #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h" #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" -#import "ios/chrome/browser/sync/enterprise_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/enterprise_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h" #import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator_unittest.mm b/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator_unittest.mm index 4f7355e..e40f4497 100644 --- a/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator_unittest.mm
@@ -21,10 +21,10 @@ #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_mock.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_mock.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #import "ios/chrome/test/scoped_key_window.h" #import "testing/platform_test.h"
diff --git a/ios/chrome/browser/ui/authentication/tangible_sync/BUILD.gn b/ios/chrome/browser/ui/authentication/tangible_sync/BUILD.gn index 118909c..d09e6c8 100644 --- a/ios/chrome/browser/ui/authentication/tangible_sync/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/tangible_sync/BUILD.gn
@@ -27,7 +27,7 @@ "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/elements:activity_overlay", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication/signin:signin_headers", "//ios/chrome/browser/unified_consent",
diff --git a/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_coordinator.mm b/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_coordinator.mm index 6f3b7f0c..c49aff42e 100644 --- a/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_coordinator.mm
@@ -17,8 +17,8 @@ #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" #import "ios/chrome/browser/ui/authentication/authentication_flow.h" #import "ios/chrome/browser/ui/authentication/signin/signin_coordinator.h" #import "ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_mediator.h"
diff --git a/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_mediator.mm b/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_mediator.mm index 308c9b3..7413142 100644 --- a/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_mediator.mm +++ b/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_mediator.mm
@@ -13,7 +13,7 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" #import "ios/chrome/browser/ui/authentication/authentication_flow.h" #import "ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_consumer.h" #import "ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_mediator_delegate.h"
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn b/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn index 40c6a31..70c97ae0 100644 --- a/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn
@@ -20,7 +20,7 @@ "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication/enterprise:enterprise_utils", "//ios/chrome/browser/ui/authentication/unified_consent/identity_chooser", ]
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.mm b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.mm index 658e8246..ca355052 100644 --- a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.mm
@@ -10,8 +10,8 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" -#import "ios/chrome/browser/sync/enterprise_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/enterprise_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.h" #import "ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_coordinator.h" #import "ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_coordinator_delegate.h"
diff --git a/ios/chrome/browser/ui/autofill/BUILD.gn b/ios/chrome/browser/ui/autofill/BUILD.gn index 30afd4a..60cea16 100644 --- a/ios/chrome/browser/ui/autofill/BUILD.gn +++ b/ios/chrome/browser/ui/autofill/BUILD.gn
@@ -42,7 +42,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", "//ios/chrome/browser/ssl", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/translate:translate", "//ios/chrome/browser/ui/autofill/cells", "//ios/chrome/browser/ui/autofill/manual_fill:manual_fill",
diff --git a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_coordinator.mm b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_coordinator.mm index bd293bdc..d78e06f 100644 --- a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_coordinator.mm +++ b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_coordinator.mm
@@ -143,7 +143,7 @@ } - (void)secondaryButtonTapped { - // "No thanks" button, which dismisses the bottom sheet. + // "Use Keyboard" button, which dismisses the bottom sheet. [self.viewController dismissViewControllerAnimated:YES completion:NULL]; }
diff --git a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm index 87fa807..ed28cd8f 100644 --- a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm +++ b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm
@@ -82,10 +82,10 @@ l10n_util::GetNSString(IDS_IOS_PAYMENT_BOTTOM_SHEET_CONTINUE)); } -// Matcher for the bottom sheet's "No Thanks" button. -id<GREYMatcher> NoThanksButton() { - return grey_accessibilityLabel( - l10n_util::GetNSString(IDS_IOS_PAYMENT_BOTTOM_SHEET_NO_THANKS)); +// Matcher for the bottom sheet's "Use Keyboard" button. +id<GREYMatcher> UseKeyboardButton() { + return chrome_test_util::ButtonWithAccessibilityLabelId( + IDS_IOS_PAYMENT_BOTTOM_SHEET_USE_KEYBOARD); } // Matcher for the toolbar's edit button. @@ -320,18 +320,18 @@ [[EarlGrey selectElementWithMatcher:continueButton] performAction:grey_tap()]; } -// Verify that the Payments Bottom Sheet "No Thanks" button opens the keyboard. -// Also checks that the bottom sheet's subtitle and the credit card's expiration -// appear as expected before dismissing the bottom sheet. -- (void)testOpenPaymentsBottomSheetTapNoThanksShowKeyboard { +// Verify that the Payments Bottom Sheet "Use Keyboard" button opens the +// keyboard. Also checks that the bottom sheet's subtitle and the credit card's +// expiration appear as expected before dismissing the bottom sheet. +- (void)testOpenPaymentsBottomSheetTapUseKeyboardShowKeyboard { [self loadPaymentsPage]; [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()] performAction:chrome_test_util::TapWebElementWithId(kFormCardName)]; - id<GREYMatcher> noThanksButton = NoThanksButton(); + id<GREYMatcher> useKeyboardButton = UseKeyboardButton(); - [ChromeEarlGrey waitForUIElementToAppearWithMatcher:noThanksButton]; + [ChromeEarlGrey waitForUIElementToAppearWithMatcher:useKeyboardButton]; // Verify that the subtitle string appears. [ChromeEarlGrey @@ -343,7 +343,8 @@ [ChromeEarlGrey waitForUIElementToAppearWithMatcher:ExpirationDateLabel()]; // Dismiss the bottom sheet. - [[EarlGrey selectElementWithMatcher:noThanksButton] performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:useKeyboardButton] + performAction:grey_tap()]; WaitForKeyboardToAppear(); }
diff --git a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_view_controller.mm b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_view_controller.mm index acc9588c..5bfc5cfe 100644 --- a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_view_controller.mm +++ b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_view_controller.mm
@@ -124,7 +124,9 @@ self.primaryActionString = l10n_util::GetNSString(IDS_IOS_PAYMENT_BOTTOM_SHEET_CONTINUE); self.secondaryActionString = - l10n_util::GetNSString(IDS_IOS_PAYMENT_BOTTOM_SHEET_NO_THANKS); + l10n_util::GetNSString(IDS_IOS_PAYMENT_BOTTOM_SHEET_USE_KEYBOARD); + self.secondaryActionImage = + DefaultSymbolWithPointSize(kKeyboardSymbol, kSymbolActionPointSize); [super viewDidLoad];
diff --git a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm index 7722bc6..1fec9433 100644 --- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm +++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
@@ -52,7 +52,7 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/translate/chrome_ios_translate_client.h" #import "ios/chrome/browser/ui/autofill/card_expiration_date_fix_flow_view_bridge.h" #import "ios/chrome/browser/ui/autofill/card_name_fix_flow_view_bridge.h"
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn b/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn index fff9bb20..22d0f6b 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn +++ b/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn
@@ -60,7 +60,7 @@ "//ios/chrome/browser/shared/ui/list_model:list_model", "//ios/chrome/browser/shared/ui/table_view:table_view", "//ios/chrome/browser/shared/ui/util", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/autofill/manual_fill:manual_fill_ui", "//ios/chrome/browser/ui/settings/password:features", "//ios/chrome/browser/ui/settings/password/reauthentication", @@ -183,8 +183,8 @@ "//ios/chrome/browser/shared/model/web_state_list/test:test_support", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/table_view:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/autofill", "//ios/chrome/browser/ui/autofill:bridges", "//ios/chrome/browser/ui/settings/password:features",
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/full_card_requester.mm b/ios/chrome/browser/ui/autofill/manual_fill/full_card_requester.mm index 1de17733..2724c23 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/full_card_requester.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/full_card_requester.mm
@@ -25,7 +25,8 @@ autofill_manager->client().GetCvcAuthenticator(); cvc_authenticator->GetFullCardRequest()->GetFullCard( card, autofill::AutofillClient::UnmaskCardReason::kPaymentRequest, - result_delegate, AsWeakPtr()); + result_delegate, AsWeakPtr(), + autofill_manager->client().GetLastCommittedPrimaryMainFrameOrigin()); } void FullCardRequester::ShowUnmaskPrompt(
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_all_password_coordinator.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_all_password_coordinator.mm index ff56dcf..1fd45a56 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_all_password_coordinator.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_all_password_coordinator.mm
@@ -18,7 +18,7 @@ #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" #import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_navigation_controller.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_all_password_coordinator_delegate.h" #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_injection_handler.h" #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_mediator.h"
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_all_password_coordinator_unittest.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_all_password_coordinator_unittest.mm index 2bf2ee3..b189176 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_all_password_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_all_password_coordinator_unittest.mm
@@ -20,8 +20,8 @@ #import "ios/chrome/browser/shared/model/web_state_list/web_state_opener.h" #import "ios/chrome/browser/shared/public/commands/application_commands.h" #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_all_password_coordinator.h" #import "ios/chrome/browser/ui/autofill/manual_fill/password_view_controller.h" #import "ios/chrome/browser/ui/settings/password/password_manager_ui_features.h"
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_coordinator.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_coordinator.mm index be3e38b1..220c1c79 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_coordinator.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_coordinator.mm
@@ -13,7 +13,7 @@ #import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #import "ios/chrome/browser/shared/model/browser/browser.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_injection_handler.h" #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_mediator.h" #import "ios/chrome/browser/ui/autofill/manual_fill/password_list_navigator.h"
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn index 22293b27..c88d63a 100644 --- a/ios/chrome/browser/ui/bookmarks/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -35,7 +35,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/shared/ui/util:url_with_title", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/tabs", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication/cells", @@ -83,7 +83,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/shared/ui/util:url_with_title", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/ntp/metrics:home_metrics", "//ios/chrome/common/ui/colors", "//ios/third_party/material_components_ios", @@ -120,7 +120,7 @@ "//ios/chrome/browser/shared/ui/symbols", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/ntp/metrics:home_metrics", "//ios/chrome/common/ui/colors", "//ios/third_party/material_components_ios", @@ -163,8 +163,8 @@ "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//testing/gtest", ] }
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm index 8fa8c7f..c4d7a0ca 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm
@@ -33,7 +33,7 @@ #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/shared/ui/util/url_with_title.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/tabs/tab_title_util.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_mediator.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.h"
diff --git a/ios/chrome/browser/ui/bookmarks/editor/BUILD.gn b/ios/chrome/browser/ui/bookmarks/editor/BUILD.gn index 3bf8668..553d2e20 100644 --- a/ios/chrome/browser/ui/bookmarks/editor/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/editor/BUILD.gn
@@ -25,7 +25,7 @@ "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/table_view", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/bookmarks:core", "//ios/chrome/browser/ui/bookmarks:utils", "//ios/chrome/browser/ui/bookmarks/folder_chooser",
diff --git a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.mm b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.mm index 3ff6a513e..fd4d89c 100644 --- a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.mm
@@ -17,7 +17,7 @@ #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_navigation_controller.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" #import "ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator_delegate.h" #import "ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_mediator.h"
diff --git a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_mediator.mm b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_mediator.mm index be0b697..e1424d6b 100644 --- a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_mediator.mm +++ b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_mediator.mm
@@ -16,7 +16,7 @@ #import "ios/chrome/browser/bookmarks/model/bookmarks_utils.h" #import "ios/chrome/browser/shared/model/prefs/pref_names.h" #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_mediator.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" #import "ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_consumer.h"
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/BUILD.gn b/ios/chrome/browser/ui/bookmarks/folder_chooser/BUILD.gn index 3be4ac4..dc81175c 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_chooser/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/BUILD.gn
@@ -39,7 +39,7 @@ "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/signin:signin", - "//ios/chrome/browser/sync:sync", + "//ios/chrome/browser/sync/model:model", "//ios/chrome/browser/ui/bookmarks:core", "//ios/chrome/browser/ui/bookmarks/folder_editor:coordinator_headers", ] @@ -75,7 +75,7 @@ "//ios/chrome/browser/shared/ui/table_view", "//ios/chrome/browser/shared/ui/table_view:utils", "//ios/chrome/browser/signin:signin", - "//ios/chrome/browser/sync:sync", + "//ios/chrome/browser/sync/model:model", "//ios/chrome/browser/ui/bookmarks:constants", "//ios/chrome/browser/ui/bookmarks:utils", "//ios/chrome/browser/ui/bookmarks/cells", @@ -98,8 +98,8 @@ "//ios/chrome/browser/shared/model/browser_state:test_support", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/test:test_support", "//ios/web/public/test:test", "//testing/gtest",
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm index 964e9aa..2facf631 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm
@@ -18,7 +18,7 @@ #import "ios/chrome/browser/shared/model/browser/browser.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.h" #import "ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator_delegate.h" #import "ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_mediator.h"
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_mediator.mm b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_mediator.mm index 748b473f..c738e216 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_mediator.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_mediator.mm
@@ -10,7 +10,7 @@ #import "components/sync/base/features.h" #import "ios/chrome/browser/bookmarks/model/bookmark_model_bridge_observer.h" #import "ios/chrome/browser/signin/authentication_service_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" #import "ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_consumer.h"
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/BUILD.gn b/ios/chrome/browser/ui/bookmarks/folder_editor/BUILD.gn index 62c1a79..f3728a26 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/BUILD.gn
@@ -40,7 +40,7 @@ "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/signin:signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/bookmarks:core", "//ios/chrome/browser/ui/bookmarks/folder_chooser:coordinator_headers", ] @@ -71,7 +71,7 @@ "//ios/chrome/browser/shared/ui/table_view:views", "//ios/chrome/browser/shared/ui/util/image", "//ios/chrome/browser/signin:signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/bookmarks:constants", "//ios/chrome/browser/ui/bookmarks:core", "//ios/chrome/browser/ui/bookmarks:utils",
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm index ff1a282..5233b4c 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm
@@ -17,7 +17,7 @@ #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.h" #import "ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.h" #import "ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator_delegate.h"
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm index ad08647b..4864563 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm
@@ -31,7 +31,7 @@ #import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" #import "ios/chrome/browser/shared/ui/util/rtl_geometry.h" #import "ios/chrome/browser/signin/authentication_service_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" #import "ios/chrome/browser/ui/bookmarks/cells/bookmark_parent_folder_item.h"
diff --git a/ios/chrome/browser/ui/bookmarks/home/BUILD.gn b/ios/chrome/browser/ui/bookmarks/home/BUILD.gn index 4824133..0a8e4d6 100644 --- a/ios/chrome/browser/ui/bookmarks/home/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/home/BUILD.gn
@@ -42,7 +42,7 @@ "//ios/chrome/browser/shared/ui/table_view:views", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication:signin_presenter", "//ios/chrome/browser/ui/authentication/cells",
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmark_promo_controller.mm b/ios/chrome/browser/ui/bookmarks/home/bookmark_promo_controller.mm index 0bd7c46..91eaf4c 100644 --- a/ios/chrome/browser/ui/bookmarks/home/bookmark_promo_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/home/bookmark_promo_controller.mm
@@ -19,7 +19,7 @@ #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_consumer.h" #import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h"
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm index 25ddb62d5..fa7baeb 100644 --- a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm +++ b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm
@@ -30,8 +30,8 @@ #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_header_footer_item.h" #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_item.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_model.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/cells/table_view_signin_promo_item.h" #import "ios/chrome/browser/ui/authentication/signin_presenter.h" #import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h"
diff --git a/ios/chrome/browser/ui/bookmarks/synced_bookmarks_bridge.h b/ios/chrome/browser/ui/bookmarks/synced_bookmarks_bridge.h index 509f9bf..d3cb3282 100644 --- a/ios/chrome/browser/ui/bookmarks/synced_bookmarks_bridge.h +++ b/ios/chrome/browser/ui/bookmarks/synced_bookmarks_bridge.h
@@ -7,7 +7,7 @@ #import <Foundation/Foundation.h> -#import "ios/chrome/browser/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" class ChromeBrowserState;
diff --git a/ios/chrome/browser/ui/bookmarks/synced_bookmarks_bridge.mm b/ios/chrome/browser/ui/bookmarks/synced_bookmarks_bridge.mm index cd9a7a42..705eaa4 100644 --- a/ios/chrome/browser/ui/bookmarks/synced_bookmarks_bridge.mm +++ b/ios/chrome/browser/ui/bookmarks/synced_bookmarks_bridge.mm
@@ -8,7 +8,7 @@ #import "components/sync/service/sync_service.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" namespace sync_bookmarks {
diff --git a/ios/chrome/browser/ui/bring_android_tabs/BUILD.gn b/ios/chrome/browser/ui/bring_android_tabs/BUILD.gn index fd0714a..d99a094 100644 --- a/ios/chrome/browser/ui/bring_android_tabs/BUILD.gn +++ b/ios/chrome/browser/ui/bring_android_tabs/BUILD.gn
@@ -111,7 +111,7 @@ "//ios/chrome/browser/favicon", "//ios/chrome/browser/segmentation_platform", "//ios/chrome/browser/shared/model/browser_state:test_support", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/synced_sessions", "//ios/chrome/test:test_support", "//ios/web/public/test",
diff --git a/ios/chrome/browser/ui/bring_android_tabs/bring_android_tabs_prompt_mediator_unittest.mm b/ios/chrome/browser/ui/bring_android_tabs/bring_android_tabs_prompt_mediator_unittest.mm index b95845e..dde3563 100644 --- a/ios/chrome/browser/ui/bring_android_tabs/bring_android_tabs_prompt_mediator_unittest.mm +++ b/ios/chrome/browser/ui/bring_android_tabs/bring_android_tabs_prompt_mediator_unittest.mm
@@ -11,8 +11,8 @@ #import "ios/chrome/browser/bring_android_tabs/model/metrics.h" #import "ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/synced_sessions/distant_tab.h" #import "ios/web/public/test/web_task_environment.h" #import "testing/platform_test.h"
diff --git a/ios/chrome/browser/ui/bring_android_tabs/tab_list_from_android_mediator_unittest.mm b/ios/chrome/browser/ui/bring_android_tabs/tab_list_from_android_mediator_unittest.mm index acbf7b3..dbbe4385e 100644 --- a/ios/chrome/browser/ui/bring_android_tabs/tab_list_from_android_mediator_unittest.mm +++ b/ios/chrome/browser/ui/bring_android_tabs/tab_list_from_android_mediator_unittest.mm
@@ -12,8 +12,8 @@ #import "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h" #import "ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/synced_sessions/distant_tab.h" #import "ios/web/public/test/web_task_environment.h" #import "testing/platform_test.h"
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn index 08216f7..0765177 100644 --- a/ios/chrome/browser/ui/browser_view/BUILD.gn +++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -114,7 +114,7 @@ "//ios/chrome/browser/snapshots", "//ios/chrome/browser/ssl", "//ios/chrome/browser/store_kit", - "//ios/chrome/browser/sync:sync_error_browser_agent", + "//ios/chrome/browser/sync/model:sync_error_browser_agent", "//ios/chrome/browser/tab_insertion/model", "//ios/chrome/browser/translate", "//ios/chrome/browser/ui/app_store_rating:features", @@ -210,6 +210,7 @@ "//ios/chrome/browser/ui/toolbar/fullscreen", "//ios/chrome/browser/ui/toolbar/fullscreen:fullscreen_broadcasting_util", "//ios/chrome/browser/ui/toolbar/public", + "//ios/chrome/browser/ui/unit_conversion", "//ios/chrome/browser/ui/voice", "//ios/chrome/browser/ui/webui", "//ios/chrome/browser/ui/whats_new", @@ -319,7 +320,7 @@ "//ios/chrome/browser/signin:signin", "//ios/chrome/browser/signin:test_support", "//ios/chrome/browser/snapshots", - "//ios/chrome/browser/sync:sync_error_browser_agent", + "//ios/chrome/browser/sync/model:sync_error_browser_agent", "//ios/chrome/browser/tab_insertion/model", "//ios/chrome/browser/tabs", "//ios/chrome/browser/ui/bookmarks",
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm index 366d4d3d..86cde80 100644 --- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm +++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -96,6 +96,7 @@ #import "ios/chrome/browser/shared/public/commands/show_signin_command.h" #import "ios/chrome/browser/shared/public/commands/text_zoom_commands.h" #import "ios/chrome/browser/shared/public/commands/toolbar_commands.h" +#import "ios/chrome/browser/shared/public/commands/unit_conversion_commands.h" #import "ios/chrome/browser/shared/public/commands/web_content_commands.h" #import "ios/chrome/browser/shared/public/commands/whats_new_commands.h" #import "ios/chrome/browser/shared/public/features/features.h" @@ -110,7 +111,7 @@ #import "ios/chrome/browser/snapshots/snapshot_tab_helper.h" #import "ios/chrome/browser/store_kit/store_kit_coordinator.h" #import "ios/chrome/browser/store_kit/store_kit_coordinator_delegate.h" -#import "ios/chrome/browser/sync/sync_error_browser_agent.h" +#import "ios/chrome/browser/sync/model/sync_error_browser_agent.h" #import "ios/chrome/browser/tab_insertion/model/tab_insertion_browser_agent.h" #import "ios/chrome/browser/tabs/tab_title_util.h" #import "ios/chrome/browser/translate/chrome_ios_translate_client.h" @@ -200,6 +201,7 @@ #import "ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_coordinator_delegate.h" #import "ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.h" #import "ios/chrome/browser/ui/toolbar/toolbar_coordinator.h" +#import "ios/chrome/browser/ui/unit_conversion/unit_conversion_coordinator.h" #import "ios/chrome/browser/ui/voice/text_to_speech_playback_controller.h" #import "ios/chrome/browser/ui/voice/text_to_speech_playback_controller_factory.h" #import "ios/chrome/browser/ui/webui/net_export_coordinator.h" @@ -284,6 +286,7 @@ SnapshotGeneratorDelegate, StoreKitCoordinatorDelegate, ToolbarAccessoryCoordinatorDelegate, + UnitConversionCommands, URLLoadingDelegate, WebContentCommands, WebNavigationNTPDelegate, @@ -472,6 +475,10 @@ // Coordinator for Text Zoom. @property(nonatomic, strong) TextZoomCoordinator* textZoomCoordinator; +// Coordinator in charge of presenting a unit converter. +@property(nonatomic, strong) + UnitConversionCoordinator* unitConversionCoordinator; + // Opens downloaded Vcard. @property(nonatomic, strong) VcardCoordinator* vcardCoordinator; @@ -669,6 +676,9 @@ [self.priceNotificationsViewCoordiantor stop]; self.priceNotificationsViewCoordiantor = nil; + [self.unitConversionCoordinator stop]; + self.unitConversionCoordinator = nil; + [self.viewController clearPresentedStateWithCompletion:completion dismissOmnibox:dismissOmnibox]; } @@ -825,6 +835,7 @@ @protocol(DefaultBrowserPromoCommands), @protocol(MiniMapCommands), @protocol(ParcelTrackingOptInCommands), + @protocol(UnitConversionCommands), ]; for (Protocol* protocol in protocols) { @@ -1386,6 +1397,9 @@ [self.parcelTrackingOptInCoordinator stop]; self.parcelTrackingOptInCoordinator = nil; + + [self.unitConversionCoordinator stop]; + self.unitConversionCoordinator = nil; } // Starts independent mediators owned by this coordinator. @@ -2247,6 +2261,25 @@ return textZoomCoordinator; } +#pragma mark - UnitConversionCommands + +- (void)presentUnitConversionForSourceUnit:(NSUnit*)sourceUnit + sourceUnitValue:(double)sourceUnitValue + location:(CGPoint)location { + self.unitConversionCoordinator = [[UnitConversionCoordinator alloc] + initWithBaseViewController:self.viewController + browser:self.browser + sourceUnit:sourceUnit + sourceUnitValue:sourceUnitValue + location:location]; + [self.unitConversionCoordinator start]; +} + +- (void)hideUnitConversion { + [self.unitConversionCoordinator stop]; + self.unitConversionCoordinator = nil; +} + #pragma mark - URLLoadingDelegate - (void)animateOpenBackgroundTabFromParams:(const UrlLoadParams&)params
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator_unittest.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator_unittest.mm index 323d5ad..6f881d1 100644 --- a/ios/chrome/browser/ui/browser_view/browser_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/browser_view/browser_coordinator_unittest.mm
@@ -33,7 +33,7 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" -#import "ios/chrome/browser/sync/sync_error_browser_agent.h" +#import "ios/chrome/browser/sync/model/sync_error_browser_agent.h" #import "ios/chrome/browser/tab_insertion/model/tab_insertion_browser_agent.h" #import "ios/chrome/browser/tabs/tab_helper_util.h" #import "ios/chrome/browser/ui/browser_view/browser_coordinator+private.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/BUILD.gn index 2ef5af5..62470312 100644 --- a/ios/chrome/browser/ui/content_suggestions/BUILD.gn +++ b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
@@ -107,7 +107,7 @@ "//ios/chrome/browser/shared/public/features:system_flags", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/synced_sessions", "//ios/chrome/browser/tabs", "//ios/chrome/browser/ui/authentication/signin:constants", @@ -342,7 +342,7 @@ "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/content_suggestions/cells", "//ios/chrome/browser/ui/content_suggestions/safety_check", "//ios/chrome/browser/ui/content_suggestions/set_up_list:set_up_list", @@ -385,6 +385,7 @@ ":feature_flags", "//base", "//base/test:test_support", + "//build:branding_buildflags", "//components/feed/core/shared_prefs:feed_shared_prefs", "//components/feed/core/v2/public/ios:feed_ios_public", "//components/signin/internal/identity_manager",
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm index 12465ae2..fc3011e 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -60,7 +60,7 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/signin/signin_constants.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm index 63077a2..4be6ab7 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
@@ -72,9 +72,9 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/authentication_service_observer_bridge.h" -#import "ios/chrome/browser/sync/enterprise_utils.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/enterprise_utils.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" #import "ios/chrome/browser/synced_sessions/synced_sessions_bridge.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm index 9099092..2399e9a5 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm
@@ -47,7 +47,7 @@ #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/query_suggestion_view.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm index 3f5debd1..2638783 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -6,6 +6,7 @@ #import "base/functional/bind.h" #import "base/ios/ios_util.h" #import "base/strings/sys_string_conversions.h" +#import "build/branding_buildflags.h" #import "components/feed/core/v2/public/ios/pref_names.h" #import "components/strings/grit/components_strings.h" #import "ios/chrome/browser/flags/chrome_switches.h" @@ -250,7 +251,15 @@ } // Tests that the collections shortcut are displayed and working. -- (void)testCollectionShortcutsWithWhatsNew { +// TODO(crbug.com/1487974): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testCollectionShortcutsWithWhatsNew \ + DISABLED_testCollectionShortcutsWithWhatsNew +#else +#define MAYBE_testCollectionShortcutsWithWhatsNew \ + testCollectionShortcutsWithWhatsNew +#endif +- (void)MAYBE_testCollectionShortcutsWithWhatsNew { AppLaunchConfiguration config = self.appConfigurationForTestCase; config.relaunch_policy = ForceRelaunchByCleanShutdown; [ChromeEarlGrey setUserDefaultObject:@NO forKey:kWhatsNewM116UsageEntryKey];
diff --git a/ios/chrome/browser/ui/content_suggestions/tab_resumption/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/tab_resumption/BUILD.gn index d54ded7..0fbbe4d 100644 --- a/ios/chrome/browser/ui/content_suggestions/tab_resumption/BUILD.gn +++ b/ios/chrome/browser/ui/content_suggestions/tab_resumption/BUILD.gn
@@ -40,7 +40,7 @@ "//ios/chrome/browser/shared/coordinator/scene:scene_state_browser_agent", "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/model/browser_state", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/synced_sessions", "//ios/chrome/browser/ui/content_suggestions:feature_flags", "//ios/chrome/browser/ui/start_surface",
diff --git a/ios/chrome/browser/ui/content_suggestions/tab_resumption/tab_resumption_helper.mm b/ios/chrome/browser/ui/content_suggestions/tab_resumption/tab_resumption_helper.mm index 977267b..94f4b20 100644 --- a/ios/chrome/browser/ui/content_suggestions/tab_resumption/tab_resumption_helper.mm +++ b/ios/chrome/browser/ui/content_suggestions/tab_resumption/tab_resumption_helper.mm
@@ -14,8 +14,8 @@ #import "ios/chrome/browser/shared/coordinator/scene/scene_state_browser_agent.h" #import "ios/chrome/browser/shared/model/browser/browser.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/synced_sessions/distant_session.h" #import "ios/chrome/browser/synced_sessions/distant_tab.h" #import "ios/chrome/browser/synced_sessions/synced_sessions.h"
diff --git a/ios/chrome/browser/ui/download/features.h b/ios/chrome/browser/ui/download/features.h index 5f1de8f3..6b8ee71c 100644 --- a/ios/chrome/browser/ui/download/features.h +++ b/ios/chrome/browser/ui/download/features.h
@@ -16,4 +16,7 @@ // Kill switch for AR support. BASE_DECLARE_FEATURE(kARKillSwitch); +// Feature flag to add Incognito downloads warning. +BASE_DECLARE_FEATURE(kIOSIncognitoDownloadsWarning); + #endif // IOS_CHROME_BROWSER_UI_DOWNLOAD_FEATURES_H_
diff --git a/ios/chrome/browser/ui/download/features.mm b/ios/chrome/browser/ui/download/features.mm index 08835b5..5dce869 100644 --- a/ios/chrome/browser/ui/download/features.mm +++ b/ios/chrome/browser/ui/download/features.mm
@@ -15,3 +15,7 @@ BASE_FEATURE(kVCardKillSwitch, "DownloadKillSwitchVcard", base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE(kIOSIncognitoDownloadsWarning, + "IOSIncognitoDownloadsWarning", + base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/ios/chrome/browser/ui/first_run/BUILD.gn b/ios/chrome/browser/ui/first_run/BUILD.gn index 266f9ec..bc6d360c 100644 --- a/ios/chrome/browser/ui/first_run/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/BUILD.gn
@@ -71,7 +71,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/shared/ui/util:terms_util", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication/history_sync", "//ios/chrome/browser/ui/authentication/signin", @@ -180,6 +180,7 @@ ":eg_test_support+eg2", "//base", "//base/test:test_support", + "//build:branding_buildflags", "//components/enterprise", "//components/enterprise:test_support", "//components/policy:policy_code_generate", @@ -235,7 +236,7 @@ "//ios/chrome/browser/shared/coordinator/scene:scene_testing", "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/public/features", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/test/app:test_support", "//ios/third_party/earl_grey2:app_framework+link", ]
diff --git a/ios/chrome/browser/ui/first_run/first_run_app_interface.mm b/ios/chrome/browser/ui/first_run/first_run_app_interface.mm index dfb9c456..78109f7f 100644 --- a/ios/chrome/browser/ui/first_run/first_run_app_interface.mm +++ b/ios/chrome/browser/ui/first_run/first_run_app_interface.mm
@@ -13,7 +13,7 @@ #import "ios/chrome/browser/shared/coordinator/scene/scene_controller.h" #import "ios/chrome/browser/shared/coordinator/scene/scene_controller_testing.h" #import "ios/chrome/browser/shared/model/application_context/application_context.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/test/app/chrome_test_util.h" @implementation FirstRunAppInterface
diff --git a/ios/chrome/browser/ui/first_run/first_run_egtest.mm b/ios/chrome/browser/ui/first_run/first_run_egtest.mm index b88348e..0659a93 100644 --- a/ios/chrome/browser/ui/first_run/first_run_egtest.mm +++ b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
@@ -6,6 +6,7 @@ #import "base/ios/ios_util.h" #import "base/strings/string_util.h" #import "base/strings/sys_string_conversions.h" +#import "build/branding_buildflags.h" #import "components/policy/core/common/policy_loader_ios_constants.h" #import "components/policy/policy_constants.h" #import "components/signin/ios/browser/features.h" @@ -227,7 +228,14 @@ } // Tests FRE with UMA off and without sign-in. -- (void)testWithUMAUncheckedAndNoSignin { +// TODO(crbug.com/1487756): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testWithUMAUncheckedAndNoSignin \ + DISABLED_testWithUMAUncheckedAndNoSignin +#else +#define MAYBE_testWithUMAUncheckedAndNoSignin testWithUMAUncheckedAndNoSignin +#endif +- (void)MAYBE_testWithUMAUncheckedAndNoSignin { // Verify 2 step FRE. [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent: FRESigninIntentRegular]; @@ -264,7 +272,15 @@ } // Tests FRE with UMA off, reopen UMA dialog and close the FRE without sign-in. -- (void)testUMAUncheckedWhenOpenedSecondTime { +// TODO(crbug.com/1487756): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testUMAUncheckedWhenOpenedSecondTime \ + DISABLED_testUMAUncheckedWhenOpenedSecondTime +#else +#define MAYBE_testUMAUncheckedWhenOpenedSecondTime \ + testUMAUncheckedWhenOpenedSecondTime +#endif +- (void)MAYBE_testUMAUncheckedWhenOpenedSecondTime { // Verify 2 step FRE. [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent: FRESigninIntentRegular]; @@ -317,7 +333,14 @@ } // Tests to turn off UMA, and open the UMA dialog to turn it back on. -- (void)testUMAUncheckedAndCheckItAgain { +// TODO(crbug.com/1487756): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testUMAUncheckedAndCheckItAgain \ + DISABLED_testUMAUncheckedAndCheckItAgain +#else +#define MAYBE_testUMAUncheckedAndCheckItAgain testUMAUncheckedAndCheckItAgain +#endif +- (void)MAYBE_testUMAUncheckedAndCheckItAgain { // Verify 2 step FRE. [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent: FRESigninIntentRegular]; @@ -370,7 +393,14 @@ } // Tests FRE with UMA off and without sign-in. -- (void)testWithUMAUncheckedAndSignin { +// TODO(crbug.com/1487756): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testWithUMAUncheckedAndSignin \ + DISABLED_testWithUMAUncheckedAndSignin +#else +#define MAYBE_testWithUMAUncheckedAndSignin testWithUMAUncheckedAndSignin +#endif +- (void)MAYBE_testWithUMAUncheckedAndSignin { // Add identity. FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1]; [SigninEarlGrey addFakeIdentity:fakeIdentity];
diff --git a/ios/chrome/browser/ui/first_run/signin/BUILD.gn b/ios/chrome/browser/ui/first_run/signin/BUILD.gn index 338997e..efb2033 100644 --- a/ios/chrome/browser/ui/first_run/signin/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/signin/BUILD.gn
@@ -22,7 +22,7 @@ "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication/enterprise:enterprise_utils", "//ios/chrome/browser/ui/authentication/signin:signin_headers",
diff --git a/ios/chrome/browser/ui/first_run/signin/signin_screen_coordinator.mm b/ios/chrome/browser/ui/first_run/signin/signin_screen_coordinator.mm index ba2fee7..bdd4e24 100644 --- a/ios/chrome/browser/ui/first_run/signin/signin_screen_coordinator.mm +++ b/ios/chrome/browser/ui/first_run/signin/signin_screen_coordinator.mm
@@ -18,7 +18,7 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/authentication_flow.h" #import "ios/chrome/browser/ui/authentication/signin/signin_coordinator.h" #import "ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_coordinator.h"
diff --git a/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm b/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm index 23a5d7d2..bb6d5b2 100644 --- a/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm +++ b/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm
@@ -17,7 +17,7 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_observer_bridge.h" #import "ios/chrome/browser/signin/system_identity.h" -#import "ios/chrome/browser/sync/enterprise_utils.h" +#import "ios/chrome/browser/sync/model/enterprise_utils.h" #import "ios/chrome/browser/ui/authentication/authentication_flow.h" #import "ios/chrome/browser/ui/authentication/signin/user_signin/logging/first_run_signin_logger.h" #import "ios/chrome/browser/ui/authentication/signin/user_signin/logging/user_signin_logger.h"
diff --git a/ios/chrome/browser/ui/first_run/tangible_sync/BUILD.gn b/ios/chrome/browser/ui/first_run/tangible_sync/BUILD.gn index d2164ce..80335dd 100644 --- a/ios/chrome/browser/ui/first_run/tangible_sync/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/tangible_sync/BUILD.gn
@@ -13,7 +13,7 @@ "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication/tangible_sync", "//ios/chrome/browser/ui/first_run:interruptible_chrome_coordinator", "//ios/chrome/browser/ui/first_run:screen_delegate",
diff --git a/ios/chrome/browser/ui/first_run/tangible_sync/tangible_sync_screen_coordinator.mm b/ios/chrome/browser/ui/first_run/tangible_sync/tangible_sync_screen_coordinator.mm index 7ec6531d..baaeb979 100644 --- a/ios/chrome/browser/ui/first_run/tangible_sync/tangible_sync_screen_coordinator.mm +++ b/ios/chrome/browser/ui/first_run/tangible_sync/tangible_sync_screen_coordinator.mm
@@ -10,7 +10,7 @@ #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_coordinator.h" @implementation TangibleSyncScreenCoordinator {
diff --git a/ios/chrome/browser/ui/history/BUILD.gn b/ios/chrome/browser/ui/history/BUILD.gn index 2c116b4d..21e022ca 100644 --- a/ios/chrome/browser/ui/history/BUILD.gn +++ b/ios/chrome/browser/ui/history/BUILD.gn
@@ -27,7 +27,7 @@ "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/ui/table_view", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/history/public", "//ios/chrome/browser/ui/menu", "//ios/chrome/browser/ui/sharing", @@ -93,7 +93,7 @@ "//ios/chrome/browser/shared/ui/table_view:styler", "//ios/chrome/browser/shared/ui/table_view:utils", "//ios/chrome/browser/shared/ui/table_view/cells", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/keyboard", "//ios/chrome/browser/url_loading", "//ios/chrome/browser/window_activities/model",
diff --git a/ios/chrome/browser/ui/history/history_coordinator.mm b/ios/chrome/browser/ui/history/history_coordinator.mm index b513f5d..666ff52 100644 --- a/ios/chrome/browser/ui/history/history_coordinator.mm +++ b/ios/chrome/browser/ui/history/history_coordinator.mm
@@ -17,7 +17,7 @@ #import "ios/chrome/browser/shared/model/browser/browser_observer_bridge.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_navigation_controller.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/history/history_clear_browsing_data_coordinator.h" #import "ios/chrome/browser/ui/history/history_clear_browsing_data_coordinator_delegate.h" #import "ios/chrome/browser/ui/history/history_coordinator_delegate.h"
diff --git a/ios/chrome/browser/ui/history/history_table_view_controller.mm b/ios/chrome/browser/ui/history/history_table_view_controller.mm index 812270f..6c9d987 100644 --- a/ios/chrome/browser/ui/history/history_table_view_controller.mm +++ b/ios/chrome/browser/ui/history/history_table_view_controller.mm
@@ -37,7 +37,7 @@ #import "ios/chrome/browser/shared/ui/table_view/table_view_navigation_controller_constants.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" #import "ios/chrome/browser/shared/ui/util/pasteboard_util.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/history/history_entries_status_item.h" #import "ios/chrome/browser/ui/history/history_entries_status_item_delegate.h" #import "ios/chrome/browser/ui/history/history_entry_inserter.h"
diff --git a/ios/chrome/browser/ui/main/BUILD.gn b/ios/chrome/browser/ui/main/BUILD.gn index 1e5e063..9fb03877 100644 --- a/ios/chrome/browser/ui/main/BUILD.gn +++ b/ios/chrome/browser/ui/main/BUILD.gn
@@ -183,7 +183,7 @@ "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:signin_util", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/tabs", "//ios/chrome/browser/tabs/inactive_tabs:features", "//ios/chrome/browser/ui/browser_view",
diff --git a/ios/chrome/browser/ui/main/browser_view_wrangler_unittest.mm b/ios/chrome/browser/ui/main/browser_view_wrangler_unittest.mm index 8c2105f..12940a5 100644 --- a/ios/chrome/browser/ui/main/browser_view_wrangler_unittest.mm +++ b/ios/chrome/browser/ui/main/browser_view_wrangler_unittest.mm
@@ -26,7 +26,7 @@ #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" -#import "ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h" #import "ios/chrome/browser/tabs/inactive_tabs/features.h" #import "ios/chrome/browser/ui/browser_view/browser_view_controller.h" #import "ios/chrome/browser/ui/main/wrangled_browser.h"
diff --git a/ios/chrome/browser/ui/ntp/BUILD.gn b/ios/chrome/browser/ui/ntp/BUILD.gn index 1abbd41..b79a506 100644 --- a/ios/chrome/browser/ui/ntp/BUILD.gn +++ b/ios/chrome/browser/ui/ntp/BUILD.gn
@@ -122,7 +122,7 @@ "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:capabilities_types", "//ios/chrome/browser/signin:system_identity_manager", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication/enterprise:enterprise_utils", "//ios/chrome/browser/ui/content_suggestions", "//ios/chrome/browser/ui/content_suggestions:content_suggestions_ui_util",
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn b/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn index dd1a652..ac849b55 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn +++ b/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn
@@ -25,7 +25,7 @@ "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication:signin_presenter", "//ios/chrome/browser/ui/authentication/cells",
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm index d989fb7..1d4b0c76 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm
@@ -16,7 +16,7 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/signin_presenter.h" #import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h" #import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.h"
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm index 5b3d7a1a..b080ab5 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -69,7 +69,7 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/signin/system_identity_manager.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.h"
diff --git a/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_egtest.mm b/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_egtest.mm index f993afc..8668e43 100644 --- a/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_egtest.mm +++ b/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_egtest.mm
@@ -212,7 +212,7 @@ } } -- (void)testOpenPasswordBottomSheetTapNoThanksShowKeyboard { +- (void)testOpenPasswordBottomSheetTapUseKeyboardShowKeyboard { [PasswordManagerAppInterface storeCredentialWithUsername:@"user" password:@"password" @@ -229,8 +229,8 @@ waitForUIElementToAppearWithMatcher:grey_accessibilityID(@"user")]; [[EarlGrey - selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSString( - IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_THANKS))] + selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId( + IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_KEYBOARD)] performAction:grey_tap()]; WaitForKeyboardToAppear(); @@ -620,8 +620,8 @@ waitForUIElementToAppearWithMatcher:grey_accessibilityID(@"user")]; [[EarlGrey - selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSString( - IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_THANKS))] + selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId( + IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_KEYBOARD)] performAction:grey_tap()]; WaitForKeyboardToAppear(); @@ -636,8 +636,8 @@ waitForUIElementToAppearWithMatcher:grey_accessibilityID(@"user")]; [[EarlGrey - selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSString( - IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_THANKS))] + selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId( + IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_KEYBOARD)] performAction:grey_tap()]; WaitForKeyboardToAppear(); @@ -652,8 +652,8 @@ waitForUIElementToAppearWithMatcher:grey_accessibilityID(@"user")]; [[EarlGrey - selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSString( - IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_THANKS))] + selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId( + IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_KEYBOARD)] performAction:grey_tap()]; WaitForKeyboardToAppear(); @@ -748,9 +748,9 @@ IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_PASSWORD))] assertWithMatcher:grey_notNil()]; - [[EarlGrey - selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSString( - IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_THANKS))] + [[EarlGrey selectElementWithMatcher: + chrome_test_util::ButtonWithAccessibilityLabelId( + IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_KEYBOARD)] assertWithMatcher:grey_notNil()]; // Verify the credit card tablew view is still visible.
diff --git a/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_view_controller.mm b/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_view_controller.mm index bd703788..e7d3206 100644 --- a/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_view_controller.mm +++ b/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_view_controller.mm
@@ -77,7 +77,9 @@ self.primaryActionString = l10n_util::GetNSString(IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_PASSWORD); self.secondaryActionString = - l10n_util::GetNSString(IDS_IOS_PASSWORD_BOTTOM_SHEET_NO_THANKS); + l10n_util::GetNSString(IDS_IOS_PASSWORD_BOTTOM_SHEET_USE_KEYBOARD); + self.secondaryActionImage = + DefaultSymbolWithPointSize(kKeyboardSymbol, kSymbolActionPointSize); [super viewDidLoad]; } @@ -242,7 +244,7 @@ } - (void)confirmationAlertSecondaryAction { - // "No thanks" button, which dismisses the bottom sheet. + // "Use Keyboard" button, which dismisses the bottom sheet. [self dismiss]; }
diff --git a/ios/chrome/browser/ui/popup_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/BUILD.gn index c2fa11b..0b27fda6 100644 --- a/ios/chrome/browser/ui/popup_menu/BUILD.gn +++ b/ios/chrome/browser/ui/popup_menu/BUILD.gn
@@ -95,7 +95,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", "//ios/chrome/browser/supervised_user", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/translate", "//ios/chrome/browser/ui/bookmarks:core", "//ios/chrome/browser/ui/browser_container",
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm index f6f84da..8814ee36 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
@@ -51,7 +51,7 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/supervised_user/supervised_user_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/browser_container/browser_container_mediator.h" #import "ios/chrome/browser/ui/bubble/bubble_presenter.h" #import "ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h"
diff --git a/ios/chrome/browser/ui/reading_list/BUILD.gn b/ios/chrome/browser/ui/reading_list/BUILD.gn index 271182f..66e8df29 100644 --- a/ios/chrome/browser/ui/reading_list/BUILD.gn +++ b/ios/chrome/browser/ui/reading_list/BUILD.gn
@@ -57,7 +57,7 @@ "//ios/chrome/browser/shared/ui/table_view/cells", "//ios/chrome/browser/shared/ui/util:url_with_title", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/tabs", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication:signin_presenter",
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm index 591fc3c45..54a856c 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm
@@ -44,7 +44,7 @@ #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_consumer.h" #import "ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.h" #import "ios/chrome/browser/ui/authentication/signin_presenter.h"
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_mediator.mm b/ios/chrome/browser/ui/reading_list/reading_list_mediator.mm index 0b5e909..1f9f2f7 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_mediator.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_mediator.mm
@@ -17,7 +17,7 @@ #import "ios/chrome/browser/favicon/favicon_loader.h" #import "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h" #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" #import "ios/chrome/browser/ui/reading_list/reading_list_data_sink.h" #import "ios/chrome/browser/ui/reading_list/reading_list_list_item.h" #import "ios/chrome/browser/ui/reading_list/reading_list_list_item_factory.h"
diff --git a/ios/chrome/browser/ui/recent_tabs/BUILD.gn b/ios/chrome/browser/ui/recent_tabs/BUILD.gn index c24e13b2..7333d8b 100644 --- a/ios/chrome/browser/ui/recent_tabs/BUILD.gn +++ b/ios/chrome/browser/ui/recent_tabs/BUILD.gn
@@ -34,7 +34,7 @@ "//ios/chrome/browser/shared/ui/table_view:constants", "//ios/chrome/browser/shared/ui/table_view/cells", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/synced_sessions", "//ios/chrome/browser/ui/authentication/history_sync", "//ios/chrome/browser/ui/menu", @@ -98,7 +98,7 @@ "//ios/chrome/browser/shared/ui/table_view:styler", "//ios/chrome/browser/shared/ui/table_view:utils", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/synced_sessions", "//ios/chrome/browser/tabs_search/model", "//ios/chrome/browser/tabs_search/model:model_factory", @@ -148,8 +148,8 @@ "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/test:test_support", "//ios/web/public/test", "//testing/gtest",
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm index c10a843..c1edba0 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm
@@ -20,8 +20,8 @@ #import "ios/chrome/browser/shared/ui/table_view/table_view_navigation_controller.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_navigation_controller_constants.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/synced_sessions/distant_session.h" #import "ios/chrome/browser/synced_sessions/synced_sessions_util.h" #import "ios/chrome/browser/ui/authentication/history_sync/history_sync_coordinator.h"
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm index 0a2c503..feb8443 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm
@@ -40,11 +40,11 @@ #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_mock.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_mock.h" #import "ios/chrome/browser/ui/recent_tabs/recent_tabs_presentation_delegate.h" #import "ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.h" #import "ios/chrome/browser/ui/recent_tabs/sessions_sync_user_state.h"
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.mm index ed2afe18..b7a5776 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.mm +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.mm
@@ -27,9 +27,9 @@ #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list_observer_bridge.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" #import "ios/chrome/browser/ui/recent_tabs/recent_tabs_consumer.h" #import "ios/chrome/browser/ui/recent_tabs/sessions_sync_user_state.h" #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_toolbars_mutator.h"
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm index 652233c..20aeec4 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
@@ -63,10 +63,10 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" -#import "ios/chrome/browser/sync/enterprise_utils.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/enterprise_utils.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/synced_sessions/distant_session.h" #import "ios/chrome/browser/synced_sessions/distant_tab.h" #import "ios/chrome/browser/synced_sessions/synced_sessions.h"
diff --git a/ios/chrome/browser/ui/save_to_photos/save_to_photos_mediator.mm b/ios/chrome/browser/ui/save_to_photos/save_to_photos_mediator.mm index 3255d909..1c8fe08 100644 --- a/ios/chrome/browser/ui/save_to_photos/save_to_photos_mediator.mm +++ b/ios/chrome/browser/ui/save_to_photos/save_to_photos_mediator.mm
@@ -68,6 +68,7 @@ NSData* _imageData; id<SystemIdentity> _identity; BOOL _userTappedSuccessSnackbarButton; + base::TimeTicks _uploadStart; } #pragma mark - Initialization @@ -256,6 +257,7 @@ base::BindOnce(^(PhotosService::UploadResult result) { [weakSelf photosServiceFinishedUploadWithResult:result]; }); + _uploadStart = base::TimeTicks::Now(); _photosService->UploadImage(_imageName, _imageData, _identity, base::DoNothing(), std::move(uploadCompletionCallback)); @@ -265,8 +267,12 @@ - (void)photosServiceFinishedUploadWithResult: (const PhotosService::UploadResult&)result { if (result.successful) { + base::UmaHistogramTimes("IOS.SaveToPhotos.UploadSuccessLatency", + base::TimeTicks::Now() - _uploadStart); [self showSnackbarWithSuccessMessageAndOpenButton]; } else { + base::UmaHistogramTimes("IOS.SaveToPhotos.UploadFailureLatency", + base::TimeTicks::Now() - _uploadStart); __weak __typeof(self) weakSelf = self; [self showTryAgainOrCancelAlertWithTryAgainBlock:^{ [weakSelf tryUploadImage];
diff --git a/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn b/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn index 159ab44a..0f1d49a 100644 --- a/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn +++ b/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn
@@ -22,7 +22,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication:signin_presenter", "//ios/chrome/browser/ui/authentication/signin:constants", "//ios/chrome/browser/ui/infobars/presentation",
diff --git a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.mm b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.mm index f48a5d0..dfc2d134 100644 --- a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.mm +++ b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.mm
@@ -38,8 +38,8 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/system_identity.h" -#import "ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/signin/signin_constants.h" #import "ios/chrome/browser/ui/authentication/signin_presenter.h" #import "ios/chrome/browser/ui/infobars/presentation/infobar_modal_positioner.h"
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn index d5de066..739eba1 100644 --- a/ios/chrome/browser/ui/settings/BUILD.gn +++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -157,7 +157,7 @@ "//ios/chrome/browser/shared/ui/util:terms_util", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/tabs/inactive_tabs:features", "//ios/chrome/browser/tabs/tab_pickup:features", "//ios/chrome/browser/translate", @@ -273,8 +273,8 @@ "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/settings/password", "//ios/chrome/test:test_support", "//ios/chrome/test/app:test_support", @@ -351,8 +351,8 @@ "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/tabs/inactive_tabs:features", "//ios/chrome/browser/tabs/tab_pickup:features", "//ios/chrome/browser/translate",
diff --git a/ios/chrome/browser/ui/settings/address_bar_preference/BUILD.gn b/ios/chrome/browser/ui/settings/address_bar_preference/BUILD.gn index c11d4c1..99db0046 100644 --- a/ios/chrome/browser/ui/settings/address_bar_preference/BUILD.gn +++ b/ios/chrome/browser/ui/settings/address_bar_preference/BUILD.gn
@@ -46,6 +46,8 @@ sources = [ "address_bar_preference_egtest.mm" ] deps = [ "//ios/chrome/app/strings", + "//ios/chrome/browser/shared/model/prefs:pref_names", + "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/ui/settings:eg_test_support+eg2", "//ios/chrome/test/earl_grey:eg_test_support+eg2", "//ios/testing/earl_grey:eg_test_support+eg2",
diff --git a/ios/chrome/browser/ui/settings/address_bar_preference/address_bar_preference_egtest.mm b/ios/chrome/browser/ui/settings/address_bar_preference/address_bar_preference_egtest.mm index ca00a35..e7ac92c 100644 --- a/ios/chrome/browser/ui/settings/address_bar_preference/address_bar_preference_egtest.mm +++ b/ios/chrome/browser/ui/settings/address_bar_preference/address_bar_preference_egtest.mm
@@ -2,12 +2,14 @@ // 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/settings/settings_app_interface.h" +#import "ios/chrome/browser/shared/model/prefs/pref_names.h" +#import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" +#import "ios/testing/earl_grey/app_launch_manager.h" #import "ios/testing/earl_grey/earl_grey_test.h" #import "ui/base/l10n/l10n_util_mac.h" @@ -67,15 +69,21 @@ @implementation AddressBarPreferenceTestCase +- (AppLaunchConfiguration)appConfigurationForTestCase { + AppLaunchConfiguration config; + config.features_enabled.push_back(kBottomOmniboxSteadyState); + return config; +} + - (void)setUp { [super setUp]; // Resets the address bar position preference to be on top. - [SettingsAppInterface resetAddressBarPreference]; + [ChromeEarlGrey setBoolValue:NO forUserPref:prefs::kBottomOmnibox]; } - (void)tearDown { // Resets the address bar position preference to be on top. - [SettingsAppInterface resetAddressBarPreference]; + [ChromeEarlGrey setBoolValue:NO forUserPref:prefs::kBottomOmnibox]; [super tearDown]; }
diff --git a/ios/chrome/browser/ui/settings/autofill/BUILD.gn b/ios/chrome/browser/ui/settings/autofill/BUILD.gn index 6574e72..cdbf0e71 100644 --- a/ios/chrome/browser/ui/settings/autofill/BUILD.gn +++ b/ios/chrome/browser/ui/settings/autofill/BUILD.gn
@@ -54,7 +54,7 @@ "//ios/chrome/browser/shared/ui/table_view/cells", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/autofill:autofill_shared_ui", "//ios/chrome/browser/ui/autofill:autofill_ui_type", "//ios/chrome/browser/ui/autofill/cells",
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn index 44f9b77..5c094041 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
@@ -57,7 +57,7 @@ "//ios/chrome/browser/shared/ui/table_view:utils", "//ios/chrome/browser/shared/ui/table_view/cells", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/keyboard", "//ios/chrome/browser/ui/settings:settings_root", @@ -107,8 +107,8 @@ "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/settings/cells", "//ios/chrome/common", "//ios/chrome/test:test_support",
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm index f185402..6b5ce0f 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
@@ -51,7 +51,7 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/scoped_ui_blocker/ui_blocker_manager.h" #import "ios/chrome/browser/ui/settings/cells/clear_browsing_data_constants.h" #import "ios/chrome/browser/ui/settings/cells/search_engine_item.h"
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm index 0e9db6a..038799c 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm
@@ -36,9 +36,9 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_mock.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_mock.h" #import "ios/chrome/browser/ui/settings/clear_browsing_data/fake_browsing_data_counter_wrapper_producer.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h"
diff --git a/ios/chrome/browser/ui/settings/downloads/save_to_photos/save_to_photos_settings_mediator.mm b/ios/chrome/browser/ui/settings/downloads/save_to_photos/save_to_photos_settings_mediator.mm index 79ed88c1..c778a99 100644 --- a/ios/chrome/browser/ui/settings/downloads/save_to_photos/save_to_photos_settings_mediator.mm +++ b/ios/chrome/browser/ui/settings/downloads/save_to_photos/save_to_photos_settings_mediator.mm
@@ -144,7 +144,9 @@ if (event.GetEventTypeFor(signin::ConsentLevel::kSignin) == signin::PrimaryAccountChangeEvent::Type::kCleared) { [self.delegate hideSaveToPhotosSettings]; + return; } + [self updateConsumers]; } #pragma mark - Private @@ -157,11 +159,16 @@ id<SystemIdentity> savedIdentity = _accountManagerService->GetIdentityWithGaiaID(savedGaiaID); + // Get signed-in identity. + const CoreAccountInfo primaryAccountInfo = + _identityManager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin); + id<SystemIdentity> primaryAccount = + _accountManagerService->GetIdentityWithGaiaID(primaryAccountInfo.gaia); + // Update primary consumer with the currently selected Save to Photos account, // if any. id<SystemIdentity> selectedIdentity = - savedIdentity ? savedIdentity - : _accountManagerService->GetDefaultIdentity(); + savedIdentity ? savedIdentity : primaryAccount; if (!selectedIdentity) { // If `selectedIdentity` is nil then there is no identity on the device so // Save to Photos settings should be hidden.
diff --git a/ios/chrome/browser/ui/settings/downloads/save_to_photos/save_to_photos_settings_mediator_unittest.mm b/ios/chrome/browser/ui/settings/downloads/save_to_photos/save_to_photos_settings_mediator_unittest.mm index b891b3fb..ed150912 100644 --- a/ios/chrome/browser/ui/settings/downloads/save_to_photos/save_to_photos_settings_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/downloads/save_to_photos/save_to_photos_settings_mediator_unittest.mm
@@ -98,10 +98,12 @@ fake_identity_b_ = [FakeSystemIdentity fakeIdentity2]; system_identity_manager->AddIdentity(fake_identity_b_); - signin::MakePrimaryAccountAvailable( + signin::MakeAccountAvailable( IdentityManagerFactory::GetForBrowserState(browser_state_.get()), - base::SysNSStringToUTF8(fake_identity_a_.userEmail), - signin::ConsentLevel::kSignin); + signin::AccountAvailabilityOptionsBuilder() + .AsPrimary(signin::ConsentLevel::kSignin) + .WithGaiaId(base::SysNSStringToUTF8(fake_identity_a_.gaiaID)) + .Build(base::SysNSStringToUTF8(fake_identity_a_.userEmail))); } void TearDown() final { [mediator_ disconnect]; }
diff --git a/ios/chrome/browser/ui/settings/google_services/BUILD.gn b/ios/chrome/browser/ui/settings/google_services/BUILD.gn index 8c12497..70c1277 100644 --- a/ios/chrome/browser/ui/settings/google_services/BUILD.gn +++ b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
@@ -71,7 +71,7 @@ "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", "//ios/chrome/browser/signin:system_identity_manager", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication:authentication_constants", "//ios/chrome/browser/ui/authentication/cells", @@ -206,8 +206,8 @@ "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/settings/cells", "//ios/chrome/browser/ui/settings/google_services:constants",
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm index d2722692..a8673be 100644 --- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
@@ -50,8 +50,8 @@ #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/signin/system_identity.h" #import "ios/chrome/browser/signin/system_identity_manager.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h" #import "ios/chrome/browser/ui/authentication/cells/table_view_account_item.h" #import "ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_unittest.mm index 3c2410ff..3dfc066 100644 --- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_unittest.mm
@@ -27,9 +27,9 @@ #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_mock.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_mock.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #import "ios/web/public/browser_state.h" #import "ios/web/public/test/web_task_environment.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/bulk_upload/BUILD.gn b/ios/chrome/browser/ui/settings/google_services/bulk_upload/BUILD.gn index 495f3bd..9d0131a 100644 --- a/ios/chrome/browser/ui/settings/google_services/bulk_upload/BUILD.gn +++ b/ios/chrome/browser/ui/settings/google_services/bulk_upload/BUILD.gn
@@ -24,7 +24,7 @@ "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/common/ui/reauthentication", "//ios/third_party/material_components_ios", "//ui/base",
diff --git a/ios/chrome/browser/ui/settings/google_services/bulk_upload/bulk_upload_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/bulk_upload/bulk_upload_coordinator.mm index 5b41baf8..4a5484d 100644 --- a/ios/chrome/browser/ui/settings/google_services/bulk_upload/bulk_upload_coordinator.mm +++ b/ios/chrome/browser/ui/settings/google_services/bulk_upload/bulk_upload_coordinator.mm
@@ -14,7 +14,7 @@ #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/google_services/bulk_upload/bulk_upload_coordinator_delegate.h" #import "ios/chrome/browser/ui/settings/google_services/bulk_upload/bulk_upload_mediator.h" #import "ios/chrome/browser/ui/settings/google_services/bulk_upload/bulk_upload_mediator_delegate.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm index f25ad76..1a40933 100644 --- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
@@ -25,7 +25,7 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/authentication_flow.h" #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h" #import "ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm index 2ae1ee0..53b1137 100644 --- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
@@ -33,10 +33,10 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/signin/system_identity_manager.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" #import "ios/chrome/browser/ui/authentication/signout_action_sheet_coordinator.h" #import "ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.h" #import "ios/chrome/browser/ui/settings/google_services/bulk_upload/bulk_upload_coordinator.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h index 0a0ae692..9d81f6ef 100644 --- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h
@@ -7,7 +7,7 @@ #import <UIKit/UIKit.h> -#import "ios/chrome/browser/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.h" #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_service_delegate.h" #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller_model_delegate.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm index 8c4a1603..d68bdb2 100644 --- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
@@ -43,9 +43,9 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_observer_bridge.h" #import "ios/chrome/browser/signin/constants.h" -#import "ios/chrome/browser/sync/enterprise_utils.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/enterprise_utils.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" #import "ios/chrome/browser/ui/authentication/cells/table_view_central_account_item.h" #import "ios/chrome/browser/ui/authentication/history_sync/history_sync_utils.h" #import "ios/chrome/browser/ui/settings/cells/settings_image_detail_text_item.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator_unittest.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator_unittest.mm index 10c01c4..16162320c 100644 --- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator_unittest.mm
@@ -29,10 +29,10 @@ #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_mock.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_mock.h" #import "ios/chrome/browser/ui/authentication/cells/table_view_central_account_item.h" #import "ios/chrome/browser/ui/settings/cells/settings_image_detail_text_item.h" #import "ios/chrome/browser/ui/settings/cells/sync_switch_item.h"
diff --git a/ios/chrome/browser/ui/settings/passphrase_table_view_controller_test.mm b/ios/chrome/browser/ui/settings/passphrase_table_view_controller_test.mm index fcbdd50a..73bbf7e 100644 --- a/ios/chrome/browser/ui/settings/passphrase_table_view_controller_test.mm +++ b/ios/chrome/browser/ui/settings/passphrase_table_view_controller_test.mm
@@ -29,11 +29,11 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service_mock.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_mock.h" #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" #import "testing/gtest_mac.h" #import "testing/platform_test.h"
diff --git a/ios/chrome/browser/ui/settings/password/BUILD.gn b/ios/chrome/browser/ui/settings/password/BUILD.gn index a5285fb..39428ec 100644 --- a/ios/chrome/browser/ui/settings/password/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/BUILD.gn
@@ -35,7 +35,7 @@ "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/table_view", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/settings/password/password_checkup", "//ios/chrome/browser/ui/settings/password/password_details", "//ios/chrome/browser/ui/settings/password/password_issues", @@ -219,8 +219,8 @@ "//ios/chrome/browser/shared/ui/table_view/cells", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/settings/cells", "//ios/chrome/browser/ui/settings/utils", "//ios/chrome/common/ui/colors", @@ -274,7 +274,7 @@ "//components/strings", "//ios/chrome/browser/passwords", "//ios/chrome/browser/shared/model/browser_state", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/common/ui/reauthentication", "//ios/chrome/test/app:test_support", "//ios/testing/earl_grey:eg_app_support+eg2",
diff --git a/ios/chrome/browser/ui/settings/password/password_checkup/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_checkup/BUILD.gn index f450d6f7..8aacb13 100644 --- a/ios/chrome/browser/ui/settings/password/password_checkup/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/password_checkup/BUILD.gn
@@ -23,7 +23,7 @@ "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/table_view:utils", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/settings/password:features", "//ios/chrome/browser/ui/settings/password/password_issues", "//ios/chrome/browser/ui/settings/password/reauthentication",
diff --git a/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn index 306fc11..9579228b 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn
@@ -43,7 +43,7 @@ "//ios/chrome/browser/shared/ui/table_view", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/settings/password:common", "//ios/chrome/browser/ui/settings/password:features", "//ios/chrome/browser/ui/settings/password/password_sharing", @@ -153,8 +153,8 @@ "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/table_view:test_support", "//ios/chrome/browser/shared/ui/table_view/cells", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/settings/cells", "//ios/chrome/browser/ui/settings/password:features", "//ios/chrome/browser/ui/settings/password/password_details/cells",
diff --git a/ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator.mm index 11c2d3d9..5e9d7ca7 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator.mm
@@ -18,7 +18,7 @@ #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" #import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h" #import "ios/chrome/browser/shared/public/features/features.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator_delegate.h" #import "ios/chrome/browser/ui/settings/password/password_details/add_password_handler.h" #import "ios/chrome/browser/ui/settings/password/password_details/add_password_mediator.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator_unittest.mm b/ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator_unittest.mm index 51fbc843..e1b9773 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator_unittest.mm
@@ -21,8 +21,8 @@ #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/shared/public/commands/application_commands.h" #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator.h" #import "ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.h" #import "ios/chrome/browser/ui/settings/password/password_manager_ui_features.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm index 7ee5d296..15581c2 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm
@@ -33,7 +33,7 @@ #import "ios/chrome/browser/shared/public/commands/credential_provider_promo_commands.h" #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h" #import "ios/chrome/browser/shared/public/features/features.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/password/password_details/password_details.h" #import "ios/chrome/browser/ui/settings/password/password_details/password_details_consumer.h" #import "ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator_delegate.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator_unittest.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator_unittest.mm index fb8ba84..eb6324c0 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator_unittest.mm
@@ -18,7 +18,7 @@ #import "ios/chrome/browser/passwords/ios_chrome_password_check_manager_factory.h" #import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/password/password_details/password_details_consumer.h" #import "ios/chrome/browser/ui/settings/password/password_details/password_details_mediator+private.h" #import "ios/web/public/test/web_task_environment.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_issues/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_issues/BUILD.gn index 029a21c..312b39d 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/password_issues/BUILD.gn
@@ -27,7 +27,7 @@ "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/table_view", "//ios/chrome/browser/shared/ui/table_view:utils", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/settings/password:common", "//ios/chrome/browser/ui/settings/password:features", "//ios/chrome/browser/ui/settings/password/password_checkup:password_checkup_constants", @@ -104,8 +104,8 @@ "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/table_view:test_support", "//ios/chrome/browser/shared/ui/table_view/cells", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/settings/password:features", "//ios/chrome/browser/ui/settings/password/password_checkup:password_checkup_constants", "//ios/chrome/browser/ui/settings/password/reauthentication:reauthentication_ui",
diff --git a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.mm index 5d916f7..fd0eeed1 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.mm
@@ -17,7 +17,7 @@ #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" #import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.h" #import "ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator_delegate.h" #import "ios/chrome/browser/ui/settings/password/password_issues/password_issue.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator_unittest.mm b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator_unittest.mm index c3cc61b0..ae59419 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator_unittest.mm
@@ -21,8 +21,8 @@ #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/shared/public/commands/application_commands.h" #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.h" #import "ios/chrome/browser/ui/settings/password/password_issues/password_issues_table_view_controller.h" #import "ios/chrome/browser/ui/settings/password/password_manager_ui_features.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_mediator.h b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_mediator.h index 9052aa1..8b4203d 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_mediator.h +++ b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_mediator.h
@@ -8,7 +8,7 @@ #import <Foundation/Foundation.h> #import "ios/chrome/browser/shared/ui/table_view/table_view_favicon_data_source.h" -#include "ios/chrome/browser/sync/sync_service_factory.h" +#include "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/common/ui/reauthentication/reauthentication_module.h" namespace password_manager {
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/password_manager_view_controller_unittest.mm index c6f3f371..c1471fb9 100644 --- a/ios/chrome/browser/ui/settings/password/password_manager_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_manager_view_controller_unittest.mm
@@ -35,7 +35,7 @@ #import "ios/chrome/browser/shared/ui/table_view/chrome_table_view_controller_test.h" #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/cells/inline_promo_item.h" #import "ios/chrome/browser/ui/settings/cells/settings_check_item.h" #import "ios/chrome/browser/ui/settings/password/password_manager_view_controller+private.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn index aa12b881..389f28e 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn
@@ -36,7 +36,7 @@ "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/util:util", "//ios/chrome/browser/signin:signin", - "//ios/chrome/browser/sync:sync", + "//ios/chrome/browser/sync/model:model", "//ios/chrome/browser/ui/settings/elements:enterprise_info_popover_view_controller", "//ios/chrome/browser/ui/settings/password:common", "//ios/chrome/browser/ui/settings/password:features", @@ -114,7 +114,7 @@ "//ios/chrome/browser/shared/model/browser_state:test_support", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/settings/password:features", "//ios/chrome/browser/ui/settings/password/reauthentication:reauthentication_ui", "//ios/chrome/common/ui/reauthentication",
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm index 645b2c1..bb44e5a 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm
@@ -27,7 +27,7 @@ #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h" #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.h" #import "ios/chrome/browser/ui/settings/password/password_manager_ui_features.h" #import "ios/chrome/browser/ui/settings/password/password_settings/password_bulk_move_handler.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm index d99cfc63..262ca700 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm
@@ -24,7 +24,7 @@ #import "components/sync/service/sync_user_settings.h" #import "ios/chrome/browser/shared/model/prefs/pref_backed_boolean.h" #import "ios/chrome/browser/shared/model/utils/observable_boolean.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" #import "ios/chrome/browser/ui/settings/password/password_exporter.h" #import "ios/chrome/browser/ui/settings/password/saved_passwords_presenter_observer.h" #import "ios/chrome/browser/ui/settings/utils/password_auto_fill_status_manager.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator_unittest.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator_unittest.mm index a405978..dc6bc1a 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator_unittest.mm
@@ -20,8 +20,8 @@ #import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/common/ui/reauthentication/reauthentication_protocol.h" #import "ios/web/public/test/web_task_environment.h" #import "testing/gmock/include/gmock/gmock.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_settings_app_interface.mm b/ios/chrome/browser/ui/settings/password/password_settings_app_interface.mm index e661c85..31bf2b3 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings_app_interface.mm +++ b/ios/chrome/browser/ui/settings/password/password_settings_app_interface.mm
@@ -22,7 +22,7 @@ #import "ios/chrome/browser/passwords/ios_chrome_bulk_leak_check_service_factory.h" #import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/app/mock_reauthentication_module.h" #import "ios/chrome/test/app/password_test_util.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_sharing/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_sharing/BUILD.gn index 65e315f..c70e780f 100644 --- a/ios/chrome/browser/ui/settings/password/password_sharing/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/password_sharing/BUILD.gn
@@ -28,6 +28,8 @@ "password_sharing_mediator.h", "password_sharing_mediator.mm", "password_sharing_mediator_delegate.h", + "sharing_status_coordinator.h", + "sharing_status_coordinator.mm", ] deps = [ ":password_sharing_constants", @@ -82,6 +84,8 @@ "password_sharing_view_controller.mm", "recipient_info.h", "recipient_info.mm", + "sharing_status_view_controller.h", + "sharing_status_view_controller.mm", ] deps = [ ":password_sharing_constants", @@ -103,6 +107,7 @@ "//ios/chrome/common/ui/elements:popover_label_view_controller", "//ios/chrome/common/ui/favicon", "//ios/chrome/common/ui/table_view:cells_constants", + "//ios/chrome/common/ui/util", "//ui/base", ] }
diff --git a/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_coordinator.h b/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_coordinator.h new file mode 100644 index 0000000..2553534 --- /dev/null +++ b/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_coordinator.h
@@ -0,0 +1,24 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_SHARING_SHARING_STATUS_COORDINATOR_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_SHARING_SHARING_STATUS_COORDINATOR_H_ + +#import "ios/chrome/browser/shared/coordinator/chrome_coordinator/chrome_coordinator.h" + +// This coordinator presents a view with a sharing status animation. Main part +// of the animation is a progress bar loading between images of the sender and +// the recipients. The progress does not reflect actual sharing going on under +// the hood, but rather has a fixed time that allows the user to cancel sharing. +// If the user does not cancel it, then the API is called to process sharing and +// success status is displayed. Otherwise, cancelled status is displayed. +@interface SharingStatusCoordinator : ChromeCoordinator + +- (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser + NS_DESIGNATED_INITIALIZER; + +@end + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_SHARING_SHARING_STATUS_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_coordinator.mm new file mode 100644 index 0000000..02e14c8 --- /dev/null +++ b/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_coordinator.mm
@@ -0,0 +1,62 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_coordinator.h" + +#import "ios/chrome/browser/shared/ui/table_view/table_view_navigation_controller.h" +#import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" +#import "ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.h" + +@interface SharingStatusCoordinator () + +// The navigation controller displaying the view controller. +@property(nonatomic, strong) + TableViewNavigationController* navigationController; + +// Main view controller for this coordinator. +@property(nonatomic, strong) SharingStatusViewController* viewController; + +@end + +@implementation SharingStatusCoordinator + +- (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser { + self = [super initWithBaseViewController:viewController browser:browser]; + return self; +} + +- (void)start { + [super start]; + + self.viewController = [[SharingStatusViewController alloc] + initWithStyle:ChromeTableViewStyle()]; + + self.navigationController = + [[TableViewNavigationController alloc] initWithTable:self.viewController]; + [self.navigationController + setModalPresentationStyle:UIModalPresentationPageSheet]; + self.navigationController.navigationBar.hidden = YES; + + UISheetPresentationController* sheetPresentationController = + self.navigationController.sheetPresentationController; + if (sheetPresentationController) { + sheetPresentationController.detents = + @[ [UISheetPresentationControllerDetent mediumDetent] ]; + } + + [self.baseViewController presentViewController:self.navigationController + animated:YES + completion:nil]; +} + +- (void)stop { + [self.viewController.presentingViewController + dismissViewControllerAnimated:YES + completion:nil]; + self.navigationController = nil; + self.viewController = nil; +} + +@end
diff --git a/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.h b/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.h new file mode 100644 index 0000000..d87d236 --- /dev/null +++ b/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.h
@@ -0,0 +1,22 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_SHARING_SHARING_STATUS_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_SHARING_SHARING_STATUS_VIEW_CONTROLLER_H_ + +#import "ios/chrome/browser/shared/ui/table_view/chrome_table_view_controller.h" + +// Presents the following animation: +// * Recipient and sender images appear on the middle. +// * Both images slide out (sender to the left, recipient to the right). +// * Shield with lock appears on the middle. +// * Progress bar is loading between sender and the recipient. +// * Shield and progress bar disappear, profile images slide to the middle +// If the user clicks "cancel" button at any point, the animation stops and +// cancelled status is presented. Otherwise, success status is displayed when +// the animation finishes. +@interface SharingStatusViewController : ChromeTableViewController +@end + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_SHARING_SHARING_STATUS_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.mm new file mode 100644 index 0000000..84206b0e --- /dev/null +++ b/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.mm
@@ -0,0 +1,338 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.h" + +#import "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/shared/ui/symbols/symbols.h" +#import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" +#import "ios/chrome/browser/ui/authentication/authentication_constants.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ui/base/l10n/l10n_util_mac.h" + +namespace { + +// Progress bar dimensions. +const CGFloat kProgressBarWidth = 100.0; +const CGFloat kProgressBarHeight = 30.0; +const CGFloat kProgressBarCircleDiameter = 3.0; +const CGFloat kProgressBarCircleSpacing = 2.0; +const NSInteger kProgressBarCirclesAmount = 20; + +// Loaded images size dimensions. +const CGFloat kProfileImageSize = 60.0; +const CGFloat kShieldLockSize = 30.0; + +// Spacing and padding constraints. +const CGFloat kVerticalSpacing = 16.0; +const CGFloat kTopPadding = 20.0; +const CGFloat kBottomPadding = 42.0; + +// Durations of specific parts of the animation. +const CGFloat kImagesSlidingOutDuration = 1.0; +const CGFloat kProgressBarLoadingDuration = 3.25; +const CGFloat kImagesSlidingInDuration = 1.0; + +// Distance by which the profile images need to be moved when sliding. +const CGFloat kImagesSlidingOutDistance = 78; +const CGFloat kImagesSlidingInDistance = 51; + +} // namespace + +@interface SharingStatusViewController () + +// Profile image of the sender. +@property(nonatomic, strong) UIImageView* senderImage; + +// Profile image of the recipients. +@property(nonatomic, strong) UIImageView* recipientImage; + +// Shield icon with a lock. +@property(nonatomic, strong) UIImageView* shieldLockImage; + +// Rectangle view with fixed length and height containing fixed amount of +// circles. +@property(nonatomic, strong) UIView* progressBarView; + +// Animates profile image of the sender sliding to the left and profile images +// of recipients sliding to the right. +@property(nonatomic, strong) UIViewPropertyAnimator* imagesSlidingOutAnimation; + +// Animates shield lock appearing in the middle between profile images and the +// progress bar going from the left to right. +@property(nonatomic, strong) + UIViewPropertyAnimator* progressBarLoadingAnimation; + +// Animates progress bar and shield lock disappearing and profile images sliding +// to the middle. +@property(nonatomic, strong) UIViewPropertyAnimator* imagesSlidingInAnimation; + +@end + +@implementation SharingStatusViewController + +#pragma mark - UIViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + UIView* view = self.view; + view.backgroundColor = [UIColor colorNamed:kPrimaryBackgroundColor]; + + // Add container view for the animation. + UIView* animationView = [[UIView alloc] init]; + animationView = [[UIView alloc] init]; + animationView.translatesAutoresizingMaskIntoConstraints = NO; + [view addSubview:animationView]; + + // Add sender profile image. + UIImageView* senderImage = [self createSenderImage]; + [animationView addSubview:senderImage]; + + // Add recipient profile image. + UIImageView* recipientImage = [self createRecipientImage]; + [animationView insertSubview:recipientImage belowSubview:senderImage]; + + // Add progress bar view. + UIView* progressBarView = [self createProgressBarView]; + [animationView insertSubview:progressBarView belowSubview:recipientImage]; + + // Add shield lock image. + UIImageView* shieldLockImage = [self createShieldLockImage]; + [progressBarView addSubview:shieldLockImage]; + + // Add progress bar circles. + [self createProgressBarSubviews]; + + // Add title label. + UILabel* titleLabel = [self createTitleLabel]; + [view addSubview:titleLabel]; + + // Add cancel button below the label. + UIButton* cancelButton = [self createCancelButton]; + [view addSubview:cancelButton]; + + [NSLayoutConstraint activateConstraints:@[ + // Animation container consraints. + [animationView.topAnchor constraintEqualToAnchor:view.topAnchor + constant:kTopPadding], + [animationView.leadingAnchor constraintEqualToAnchor:view.leadingAnchor + constant:kVerticalSpacing], + [animationView.trailingAnchor constraintEqualToAnchor:view.trailingAnchor + constant:-kVerticalSpacing], + [animationView.centerXAnchor constraintEqualToAnchor:view.centerXAnchor], + + // Sender image constraints. + [senderImage.topAnchor constraintEqualToAnchor:animationView.topAnchor + constant:kVerticalSpacing], + [senderImage.bottomAnchor constraintEqualToAnchor:animationView.bottomAnchor + constant:-kVerticalSpacing], + [senderImage.centerXAnchor + constraintEqualToAnchor:animationView.centerXAnchor], + + // Recipient image constraints. + [recipientImage.centerYAnchor + constraintEqualToAnchor:senderImage.centerYAnchor], + [recipientImage.centerXAnchor + constraintEqualToAnchor:senderImage.centerXAnchor], + + // Progress bar constraints. + [progressBarView.centerXAnchor + constraintEqualToAnchor:senderImage.centerXAnchor], + [progressBarView.centerYAnchor + constraintEqualToAnchor:senderImage.centerYAnchor], + [progressBarView.widthAnchor constraintEqualToConstant:kProgressBarWidth], + [progressBarView.heightAnchor constraintEqualToConstant:kProgressBarHeight], + + // Shield lock image constraints. + [shieldLockImage.centerYAnchor + constraintEqualToAnchor:senderImage.centerYAnchor], + [shieldLockImage.centerXAnchor + constraintEqualToAnchor:senderImage.centerXAnchor], + + // Title constraints. + [titleLabel.topAnchor constraintEqualToAnchor:animationView.bottomAnchor + constant:kVerticalSpacing], + [titleLabel.centerXAnchor constraintEqualToAnchor:view.centerXAnchor], + + // Cancel button constraints. + [cancelButton.topAnchor constraintEqualToAnchor:titleLabel.bottomAnchor + constant:kVerticalSpacing], + [cancelButton.bottomAnchor constraintEqualToAnchor:view.bottomAnchor + constant:-kBottomPadding], + [cancelButton.centerXAnchor + constraintEqualToAnchor:animationView.centerXAnchor], + ]]; + + [self createAnimations]; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + + [self.imagesSlidingOutAnimation startAnimation]; +} + +#pragma mark - Private + +// Helper for creating sender image view. +- (UIImageView*)createSenderImage { + // TODO(crbug.com/1463882): Add actual sender icon. + UIImageView* senderImage = [[UIImageView alloc] + initWithImage:DefaultSymbolTemplateWithPointSize(kPersonCropCircleSymbol, + kProfileImageSize)]; + senderImage.translatesAutoresizingMaskIntoConstraints = NO; + senderImage.hidden = YES; + self.senderImage = senderImage; + return senderImage; +} + +// Helper for creating recipient image view. +- (UIImageView*)createRecipientImage { + // TODO(crbug.com/1463882): Add actual recipient icon. + UIImageView* recipientImage = [[UIImageView alloc] + initWithImage:DefaultSymbolTemplateWithPointSize(kPersonCropCircleSymbol, + kProfileImageSize)]; + recipientImage.translatesAutoresizingMaskIntoConstraints = NO; + self.recipientImage = recipientImage; + return recipientImage; +} + +// Helper for creating progress bar view. +- (UIView*)createProgressBarView { + UIView* progressBarView = [[UIView alloc] init]; + progressBarView.translatesAutoresizingMaskIntoConstraints = NO; + progressBarView.backgroundColor = + [UIColor colorNamed:kPrimaryBackgroundColor]; + self.progressBarView = progressBarView; + return progressBarView; +} + +// Helper for creating the shield lock image view. +- (UIImageView*)createShieldLockImage { + // TODO(crbug.com/1463882): Add correct shield image. + UIImageView* shieldLockImage = [[UIImageView alloc] + initWithImage:CustomSymbolWithPointSize(kShieldSymbol, kShieldLockSize)]; + shieldLockImage.translatesAutoresizingMaskIntoConstraints = NO; + shieldLockImage.backgroundColor = + [UIColor colorNamed:kPrimaryBackgroundColor]; + shieldLockImage.hidden = YES; + self.shieldLockImage = shieldLockImage; + return shieldLockImage; +} + +// Creates `kProgressBarCirclesAmount` blue circles in the progress bar view. +- (void)createProgressBarSubviews { + UIView* progressBarView = self.progressBarView; + for (NSInteger i = 0; i < kProgressBarCirclesAmount; i++) { + UIView* circleView = + [[UIView alloc] initWithFrame:CGRectMake((kProgressBarCircleDiameter + + kProgressBarCircleSpacing) * + i, + kProgressBarHeight / 2, + kProgressBarCircleDiameter, + kProgressBarCircleDiameter)]; + circleView.backgroundColor = [UIColor colorNamed:kBlueColor]; + circleView.alpha = 0.0; + circleView.layer.cornerRadius = kProgressBarCircleDiameter / 2; + [progressBarView addSubview:circleView]; + } +} + +// Creates title label. +- (UILabel*)createTitleLabel { + UILabel* title = [[UILabel alloc] init]; + title.numberOfLines = 0; + title.translatesAutoresizingMaskIntoConstraints = NO; + title.text = + l10n_util::GetNSString(IDS_IOS_PASSWORD_SHARING_STATUS_PROGRESS_TITLE); + title.font = CreateDynamicFont(UIFontTextStyleTitle1, UIFontWeightBold); + title.adjustsFontForContentSizeCategory = YES; + title.textColor = [UIColor colorNamed:kTextPrimaryColor]; + title.textAlignment = NSTextAlignmentCenter; + return title; +} + +// Helper for creating the cancel button +- (UIButton*)createCancelButton { + UIButton* cancelButton = [UIButton buttonWithType:UIButtonTypeSystem]; + cancelButton.translatesAutoresizingMaskIntoConstraints = NO; + [cancelButton setTitle:l10n_util::GetNSString(IDS_CANCEL) + forState:UIControlStateNormal]; + [cancelButton addTarget:self + action:@selector(cancelButtonTapped) + forControlEvents:UIControlEventTouchUpInside]; + return cancelButton; +} + +// Creates sharing status animations that are started one by one. +- (void)createAnimations { + UIImageView* senderImage = self.senderImage; + UIImageView* recipientImage = self.recipientImage; + UIImageView* shieldLockImage = self.shieldLockImage; + UIView* progressBarView = self.progressBarView; + + self.imagesSlidingOutAnimation = [[UIViewPropertyAnimator alloc] + initWithDuration:kImagesSlidingOutDuration + curve:UIViewAnimationCurveEaseInOut + animations:^{ + senderImage.hidden = NO; + senderImage.center = + CGPointMake(senderImage.center.x - kImagesSlidingOutDistance, + senderImage.center.y); + recipientImage.center = CGPointMake( + recipientImage.center.x + kImagesSlidingOutDistance, + recipientImage.center.y); + }]; + + __weak __typeof(self) weakSelf = self; + [self.imagesSlidingOutAnimation + addCompletion:^(UIViewAnimatingPosition finalPosition) { + [weakSelf.progressBarLoadingAnimation startAnimation]; + }]; + + self.progressBarLoadingAnimation = [[UIViewPropertyAnimator alloc] + initWithDuration:kProgressBarLoadingDuration + curve:UIViewAnimationCurveEaseInOut + animations:^{ + shieldLockImage.hidden = NO; + + for (NSInteger i = 0; i < kProgressBarCirclesAmount; i++) { + [UIView animateWithDuration:0 + delay:(kProgressBarLoadingDuration / + kProgressBarCirclesAmount) * + i + options:UIViewAnimationOptionCurveEaseInOut + animations:^{ + progressBarView.subviews[i].alpha = 1.0; + } + completion:nil]; + } + }]; + [self.progressBarLoadingAnimation + addCompletion:^(UIViewAnimatingPosition finalPosition) { + [weakSelf.imagesSlidingInAnimation startAnimation]; + }]; + + self.imagesSlidingInAnimation = [[UIViewPropertyAnimator alloc] + initWithDuration:kImagesSlidingInDuration + curve:UIViewAnimationCurveEaseInOut + animations:^{ + shieldLockImage.hidden = YES; + progressBarView.hidden = YES; + senderImage.center = + CGPointMake(senderImage.center.x + kImagesSlidingInDistance, + senderImage.center.y); + recipientImage.center = CGPointMake( + recipientImage.center.x - kImagesSlidingInDistance, + recipientImage.center.y); + }]; +} + +- (void)cancelButtonTapped { + // TODO(crbug.com/1463882): Implement. +} + +@end
diff --git a/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm b/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm index 8e86f3b..d0ae467b 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm
@@ -27,7 +27,7 @@ #import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/password/password_checkup/password_checkup_coordinator.h" #import "ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator.h" #import "ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator_delegate.h"
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm index fd517eb..affb12e 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm
@@ -20,8 +20,8 @@ #import "ios/chrome/browser/passwords/password_manager_util_ios.h" #import "ios/chrome/browser/passwords/save_passwords_consumer.h" #import "ios/chrome/browser/signin/authentication_service.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" #import "ios/chrome/browser/ui/settings/password/account_storage_utils.h" #import "ios/chrome/browser/ui/settings/password/passwords_consumer.h" #import "ios/chrome/browser/ui/settings/password/passwords_mediator+private.h"
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm index c9da1551..a31bbd1 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm
@@ -31,8 +31,8 @@ #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/shared/ui/table_view/chrome_table_view_controller_test.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/password/passwords_consumer.h" #import "ios/chrome/browser/ui/settings/password/passwords_mediator+private.h" #import "ios/chrome/browser/ui/settings/utils/password_auto_fill_status_observer.h"
diff --git a/ios/chrome/browser/ui/settings/privacy/BUILD.gn b/ios/chrome/browser/ui/settings/privacy/BUILD.gn index 10ba55e..bbe7005 100644 --- a/ios/chrome/browser/ui/settings/privacy/BUILD.gn +++ b/ios/chrome/browser/ui/settings/privacy/BUILD.gn
@@ -58,7 +58,7 @@ "//ios/chrome/browser/shared/ui/table_view:utils", "//ios/chrome/browser/shared/ui/table_view/cells", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/incognito_interstitial:constants", "//ios/chrome/browser/ui/settings:constants", "//ios/chrome/browser/ui/settings:settings_root", @@ -150,8 +150,8 @@ "//ios/chrome/browser/shared/ui/table_view:test_support", "//ios/chrome/browser/shared/ui/table_view:utils", "//ios/chrome/browser/shared/ui/table_view/cells", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/settings/privacy:privacy_ui", "//ios/chrome/browser/ui/settings/utils", "//ios/chrome/browser/web:feature_flags",
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm index 765159f..f9a1a51 100644 --- a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm
@@ -38,7 +38,7 @@ #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_switch_item.h" #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_header_footer_item.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_constants.h" #import "ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.h" #import "ios/chrome/browser/ui/settings/elements/info_popover_view_controller.h"
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller_unittest.mm index 9000669..f1ff8f1 100644 --- a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller_unittest.mm
@@ -31,8 +31,8 @@ #import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/browser/shared/public/features/system_flags.h" #import "ios/chrome/browser/shared/ui/table_view/chrome_table_view_controller_test.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/web/features.h" #import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/settings/safety_check/BUILD.gn b/ios/chrome/browser/ui/settings/safety_check/BUILD.gn index 67377c0..128c304e 100644 --- a/ios/chrome/browser/ui/settings/safety_check/BUILD.gn +++ b/ios/chrome/browser/ui/settings/safety_check/BUILD.gn
@@ -79,7 +79,7 @@ "//ios/chrome/browser/shared/ui/table_view:utils", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/settings:settings_root", "//ios/chrome/browser/ui/settings/cells", "//ios/chrome/browser/ui/settings/cells:public", @@ -131,8 +131,8 @@ "//ios/chrome/browser/shared/ui/table_view/cells", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:test_support", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/content_suggestions:feature_flags", "//ios/chrome/browser/ui/settings/cells", "//ios/chrome/browser/ui/settings/utils",
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm index 6555215ff..534038be 100644 --- a/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm +++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm
@@ -26,7 +26,7 @@ #import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.h" #import "ios/chrome/browser/ui/settings/password/password_checkup/password_checkup_coordinator.h" #import "ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.h"
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm index d38aea5..fbbf43a 100644 --- a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm
@@ -48,7 +48,7 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h" #import "ios/chrome/browser/ui/settings/cells/settings_check_item.h" #import "ios/chrome/browser/ui/settings/safety_check/safety_check_constants.h"
diff --git a/ios/chrome/browser/ui/settings/settings_app_interface.h b/ios/chrome/browser/ui/settings/settings_app_interface.h index 2ae5113..c4d98d42 100644 --- a/ios/chrome/browser/ui/settings/settings_app_interface.h +++ b/ios/chrome/browser/ui/settings/settings_app_interface.h
@@ -45,9 +45,6 @@ + (void)addURLRewriterForHosts:(NSArray<NSString*>*)hosts onPort:(NSString*)port; -// Resets the address bar preference. -+ (void)resetAddressBarPreference; - @end #endif // IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/ui/settings/settings_app_interface.mm b/ios/chrome/browser/ui/settings/settings_app_interface.mm index cd0483af..f216da6 100644 --- a/ios/chrome/browser/ui/settings/settings_app_interface.mm +++ b/ios/chrome/browser/ui/settings/settings_app_interface.mm
@@ -121,11 +121,4 @@ ->AddTransientURLRewriter(&HostToLocalHostRewrite); } -+ (void)resetAddressBarPreference { - ChromeBrowserState* browserState = - chrome_test_util::GetOriginalBrowserState(); - PrefService* preferences = browserState->GetPrefs(); - preferences->SetBoolean(prefs::kBottomOmnibox, false); -} - @end
diff --git a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm index b2f51fc..a6ae5ec 100644 --- a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm +++ b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
@@ -24,10 +24,10 @@ #import "ios/chrome/browser/shared/ui/symbols/chrome_icon.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" -#import "ios/chrome/browser/sync/enterprise_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/enterprise_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" #import "ios/chrome/browser/tabs/inactive_tabs/features.h" #import "ios/chrome/browser/ui/keyboard/UIKeyCommand+Chrome.h" #import "ios/chrome/browser/ui/settings/autofill/autofill_credit_card_edit_table_view_controller.h"
diff --git a/ios/chrome/browser/ui/settings/settings_navigation_controller_unittest.mm b/ios/chrome/browser/ui/settings/settings_navigation_controller_unittest.mm index 73df233..332ab0d 100644 --- a/ios/chrome/browser/ui/settings/settings_navigation_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/settings_navigation_controller_unittest.mm
@@ -23,8 +23,8 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" -#import "ios/chrome/browser/sync/sync_setup_service.h" -#import "ios/chrome/browser/sync/sync_setup_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_setup_service.h" +#import "ios/chrome/browser/sync/model/sync_setup_service_factory.h" #import "ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_state_manager.h" #import "ios/web/public/test/web_task_environment.h" #import "testing/gmock/include/gmock/gmock.h"
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm index 6049c31..5893420 100644 --- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -87,9 +87,9 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service_observer_bridge.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/signin/system_identity.h" -#import "ios/chrome/browser/sync/enterprise_utils.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/enterprise_utils.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/tabs/inactive_tabs/features.h" #import "ios/chrome/browser/tabs/tab_pickup/features.h" #import "ios/chrome/browser/ui/authentication/cells/table_view_account_item.h"
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller_unittest.mm index 182d08fe..5dc9d36 100644 --- a/ios/chrome/browser/ui/settings/settings_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/settings_table_view_controller_unittest.mm
@@ -41,8 +41,8 @@ #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/signin/fake_system_identity_manager.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/tabs/inactive_tabs/features.h" #import "ios/chrome/browser/tabs/tab_pickup/features.h" #import "ios/chrome/browser/ui/authentication/cells/table_view_account_item.h"
diff --git a/ios/chrome/browser/ui/settings/sync/BUILD.gn b/ios/chrome/browser/ui/settings/sync/BUILD.gn index bc53d74f..bce3ef2 100644 --- a/ios/chrome/browser/ui/settings/sync/BUILD.gn +++ b/ios/chrome/browser/ui/settings/sync/BUILD.gn
@@ -38,7 +38,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/scoped_ui_blocker", @@ -81,8 +81,8 @@ "//ios/chrome/browser/shared/ui/table_view/cells", "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:system_identity", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/ui/settings:settings_root", "//ios/chrome/browser/ui/settings:test_support", "//ios/chrome/browser/ui/settings/cells",
diff --git a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.h b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.h index 88dfc47..1d8b2bd 100644 --- a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.h +++ b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.h
@@ -7,7 +7,7 @@ #import <UIKit/UIKit.h> -#import "ios/chrome/browser/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" #import "ios/chrome/browser/ui/settings/settings_controller_protocol.h" #import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h"
diff --git a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm index 8694ba8..9352207 100644 --- a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm
@@ -34,7 +34,7 @@ #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/signin/system_identity.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/scoped_ui_blocker/scoped_ui_blocker.h" #import "ios/chrome/browser/ui/settings/cells/byo_textfield_item.h" #import "ios/chrome/browser/ui/settings/cells/passphrase_error_item.h"
diff --git a/ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller.mm b/ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller.mm index e0c2134..24d3026c 100644 --- a/ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller.mm
@@ -30,8 +30,8 @@ #import "ios/chrome/browser/shared/ui/table_view/table_view_model.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/settings_controller_protocol.h" #import "ios/chrome/browser/ui/settings/sync/sync_create_passphrase_table_view_controller.h" #import "ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.h"
diff --git a/ios/chrome/browser/ui/settings/tabs/BUILD.gn b/ios/chrome/browser/ui/settings/tabs/BUILD.gn index 214b27a..77ce9cb 100644 --- a/ios/chrome/browser/ui/settings/tabs/BUILD.gn +++ b/ios/chrome/browser/ui/settings/tabs/BUILD.gn
@@ -18,7 +18,7 @@ "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/model/prefs:pref_names", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/tabs/inactive_tabs:features", "//ios/chrome/browser/tabs/tab_pickup:features", "//ios/chrome/browser/ui/settings/tabs/inactive_tabs",
diff --git a/ios/chrome/browser/ui/settings/tabs/tab_pickup/BUILD.gn b/ios/chrome/browser/ui/settings/tabs/tab_pickup/BUILD.gn index ce80c16..aa5da78 100644 --- a/ios/chrome/browser/ui/settings/tabs/tab_pickup/BUILD.gn +++ b/ios/chrome/browser/ui/settings/tabs/tab_pickup/BUILD.gn
@@ -19,7 +19,7 @@ "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/shared/model/utils", "//ios/chrome/browser/shared/public/commands", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/tabs/tab_pickup:features", "//ios/chrome/browser/ui/settings/utils", ] @@ -55,6 +55,7 @@ deps = [ "//base:i18n", "//base/test:test_support", + "//build:branding_buildflags", "//components/sync/base:features", "//ios/chrome/app/strings", "//ios/chrome/browser/shared/model/prefs:pref_names",
diff --git a/ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_coordinator.mm b/ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_coordinator.mm index 7bf8f1e7..77cb561 100644 --- a/ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_coordinator.mm +++ b/ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_coordinator.mm
@@ -7,7 +7,7 @@ #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser/browser.h" #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_mediator.h" #import "ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_table_view_controller.h"
diff --git a/ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_egtest.mm b/ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_egtest.mm index 7a8ac46..c178e027 100644 --- a/ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_egtest.mm
@@ -4,6 +4,7 @@ #import "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" +#import "build/branding_buildflags.h" #import "components/sync/base/features.h" #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/tabs/tab_pickup/features.h" @@ -161,7 +162,13 @@ } // Ensures that tab pickup settings links are correctly working. -- (void)testTabPickupSettingsLinks { +// TODO(crbug.com/1487979): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testTabPickupSettingsLinks DISABLED_testTabPickupSettingsLinks +#else +#define MAYBE_testTabPickupSettingsLinks testTabPickupSettingsLinks +#endif +- (void)MAYBE_testTabPickupSettingsLinks { SignInAndSync(); OpenTabsSettings();
diff --git a/ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_mediator.mm b/ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_mediator.mm index a7d9610a..b3cfcbb 100644 --- a/ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_mediator.mm +++ b/ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_mediator.mm
@@ -10,7 +10,7 @@ #import "ios/chrome/browser/shared/model/prefs/pref_backed_boolean.h" #import "ios/chrome/browser/shared/model/prefs/pref_names.h" #import "ios/chrome/browser/shared/model/utils/observable_boolean.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" #import "ios/chrome/browser/tabs/tab_pickup/features.h" #import "ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_consumer.h" #import "ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_table_view_controller.h"
diff --git a/ios/chrome/browser/ui/settings/tabs/tabs_settings_coordinator.mm b/ios/chrome/browser/ui/settings/tabs/tabs_settings_coordinator.mm index 07292a21..fbffda8 100644 --- a/ios/chrome/browser/ui/settings/tabs/tabs_settings_coordinator.mm +++ b/ios/chrome/browser/ui/settings/tabs/tabs_settings_coordinator.mm
@@ -6,7 +6,7 @@ #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser/browser.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/settings/tabs/inactive_tabs/inactive_tabs_settings_coordinator.h" #import "ios/chrome/browser/ui/settings/tabs/tab_pickup/tab_pickup_settings_coordinator.h" #import "ios/chrome/browser/ui/settings/tabs/tabs_settings_mediator.h"
diff --git a/ios/chrome/browser/ui/settings/tabs/tabs_settings_mediator.mm b/ios/chrome/browser/ui/settings/tabs/tabs_settings_mediator.mm index 0b6398f..4791d6d 100644 --- a/ios/chrome/browser/ui/settings/tabs/tabs_settings_mediator.mm +++ b/ios/chrome/browser/ui/settings/tabs/tabs_settings_mediator.mm
@@ -12,7 +12,7 @@ #import "components/sync/service/sync_service.h" #import "components/sync/service/sync_user_settings.h" #import "ios/chrome/browser/shared/model/prefs/pref_names.h" -#import "ios/chrome/browser/sync/sync_observer_bridge.h" +#import "ios/chrome/browser/sync/model/sync_observer_bridge.h" #import "ios/chrome/browser/tabs/inactive_tabs/features.h" #import "ios/chrome/browser/tabs/tab_pickup/features.h" #import "ios/chrome/browser/ui/settings/tabs/tabs_settings_consumer.h"
diff --git a/ios/chrome/browser/ui/sharing/activity_services/BUILD.gn b/ios/chrome/browser/ui/sharing/activity_services/BUILD.gn index e3b8b7b5..cd432de 100644 --- a/ios/chrome/browser/ui/sharing/activity_services/BUILD.gn +++ b/ios/chrome/browser/ui/sharing/activity_services/BUILD.gn
@@ -37,7 +37,7 @@ "//ios/chrome/browser/shared/ui/symbols", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/shared/ui/util:url_with_title", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/tabs", "//ios/chrome/browser/ui/default_promo", "//ios/chrome/browser/ui/main:default_browser_scene_agent", @@ -77,7 +77,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/snapshots", "//ios/chrome/browser/snapshots:test_utils", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/tabs", "//ios/chrome/browser/ui/sharing", "//ios/chrome/browser/ui/sharing/activity_services/activities",
diff --git a/ios/chrome/browser/ui/sharing/activity_services/activity_service_mediator.mm b/ios/chrome/browser/ui/sharing/activity_services/activity_service_mediator.mm index 33b98e1..e677aab 100644 --- a/ios/chrome/browser/ui/sharing/activity_services/activity_service_mediator.mm +++ b/ios/chrome/browser/ui/sharing/activity_services/activity_service_mediator.mm
@@ -18,7 +18,7 @@ #import "ios/chrome/browser/shared/public/commands/bookmarks_commands.h" #import "ios/chrome/browser/shared/public/commands/qr_generation_commands.h" #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" -#import "ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h" #import "ios/chrome/browser/ui/sharing/activity_services/activities/bookmark_activity.h" #import "ios/chrome/browser/ui/sharing/activity_services/activities/copy_activity.h" #import "ios/chrome/browser/ui/sharing/activity_services/activities/find_in_page_activity.h"
diff --git a/ios/chrome/browser/ui/sharing/activity_services/data/BUILD.gn b/ios/chrome/browser/ui/sharing/activity_services/data/BUILD.gn index 9a49d47..71902be 100644 --- a/ios/chrome/browser/ui/sharing/activity_services/data/BUILD.gn +++ b/ios/chrome/browser/ui/sharing/activity_services/data/BUILD.gn
@@ -33,7 +33,7 @@ "//ios/chrome/browser/shared/ui/util:url_with_title", "//ios/chrome/browser/signin", "//ios/chrome/browser/snapshots", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/tabs", "//ios/chrome/common/ui/util:image_util", "//ios/web/common:user_agent",
diff --git a/ios/chrome/browser/ui/sharing/activity_services/data/share_to_data_builder.mm b/ios/chrome/browser/ui/sharing/activity_services/data/share_to_data_builder.mm index ac61ee7..3eca7de 100644 --- a/ios/chrome/browser/ui/sharing/activity_services/data/share_to_data_builder.mm +++ b/ios/chrome/browser/ui/sharing/activity_services/data/share_to_data_builder.mm
@@ -14,7 +14,7 @@ #import "ios/chrome/browser/shared/ui/util/url_with_title.h" #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" -#import "ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h" #import "ios/chrome/browser/tabs/tab_title_util.h" #import "ios/chrome/browser/ui/sharing/activity_services/data/chrome_activity_item_thumbnail_generator.h" #import "ios/chrome/browser/ui/sharing/activity_services/data/share_to_data.h"
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn index c2494ee..a287def 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
@@ -52,7 +52,7 @@ "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/synced_sessions", "//ios/chrome/browser/tabs:features", "//ios/chrome/browser/tabs/inactive_tabs:features",
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn index c8c9cab..92a2727 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/BUILD.gn
@@ -193,8 +193,8 @@ "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:test_support", "//ios/chrome/browser/snapshots", - "//ios/chrome/browser/sync", - "//ios/chrome/browser/sync:test_support", + "//ios/chrome/browser/sync/model", + "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/browser/tabs", "//ios/chrome/browser/ui/tab_switcher/test:fakes", "//ios/chrome/browser/web:feature_flags",
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.mm index 4897136..e9539690 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.mm
@@ -27,8 +27,8 @@ #import "ios/chrome/browser/signin/fake_system_identity_manager.h" #import "ios/chrome/browser/snapshots/snapshot_browser_agent.h" #import "ios/chrome/browser/snapshots/snapshot_tab_helper.h" -#import "ios/chrome/browser/sync/mock_sync_service_utils.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/mock_sync_service_utils.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/tabs/closing_web_state_observer_browser_agent.h" #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator.h" #import "ios/chrome/browser/ui/tab_switcher/test/fake_tab_collection_consumer.h"
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/tests/pinned_tabs_drag_drop_egtest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/tests/pinned_tabs_drag_drop_egtest.mm index 9ba4b36..3710e52 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/tests/pinned_tabs_drag_drop_egtest.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/tests/pinned_tabs_drag_drop_egtest.mm
@@ -114,7 +114,7 @@ // Supposed position of the regular grid. XCUICoordinate* end_point = - [app coordinateWithNormalizedOffset:CGVectorMake(0.5, 0.5)]; + [app coordinateWithNormalizedOffset:CGVectorMake(0.5, 0.4)]; [start_point pressForDuration:1.5 thenDragToCoordinate:end_point @@ -258,6 +258,9 @@ EARL_GREY_TEST_SKIPPED(@"Skipped for iPad. The Pinned Tabs feature is only " @"supported on iPhone."); } + // TODO(crbug.com/1464519): Failing on iOS17, and iOS15.5 for + // ios-simulator-noncq. + XCTSkip(@"Failing on iOS17 and iOS15.5"); [ChromeEarlGrey openNewTab]; [ChromeEarlGreyUI openTabGrid];
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm index e798168..a273b08 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm
@@ -53,8 +53,8 @@ #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/shared/ui/util/util_swift.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/session_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/synced_sessions/distant_session.h" #import "ios/chrome/browser/synced_sessions/synced_sessions_util.h" #import "ios/chrome/browser/tabs/features.h"
diff --git a/ios/chrome/browser/ui/unit_conversion/BUILD.gn b/ios/chrome/browser/ui/unit_conversion/BUILD.gn new file mode 100644 index 0000000..76e7d130 --- /dev/null +++ b/ios/chrome/browser/ui/unit_conversion/BUILD.gn
@@ -0,0 +1,59 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("unit_conversion") { + sources = [ + "unit_conversion_coordinator.h", + "unit_conversion_coordinator.mm", + "unit_conversion_mediator.h", + "unit_conversion_mediator.mm", + ] + deps = [ + ":unit_conversion_ui", + "//components/prefs", + "//ios/chrome/app/strings", + "//ios/chrome/browser/shared/coordinator/chrome_coordinator", + "//ios/chrome/browser/shared/model/browser", + "//ios/chrome/browser/shared/model/browser_state", + "//ios/chrome/browser/shared/model/prefs:pref_names", + "//ios/chrome/browser/shared/public/commands", + "//ios/chrome/browser/web/annotations", + "//ios/chrome/common:string_util", + "//ios/chrome/common/ui/confirmation_alert", + "//ios/chrome/common/ui/util", + "//ios/public/provider/chrome/browser/unit_conversion:unit_conversion_api", + "//ui/base", + ] +} + +source_set("unit_conversion_ui") { + sources = [ + "unit_conversion_consumer.h", + "unit_conversion_mutator.h", + ] + deps = [ + "//components/prefs", + "//ios/chrome/app/strings", + "//ios/chrome/browser/shared/ui/symbols", + "//ios/chrome/common:string_util", + "//ios/chrome/common/ui/colors", + "//ios/chrome/common/ui/confirmation_alert", + "//ios/chrome/common/ui/util", + "//ios/public/provider/chrome/browser/unit_conversion:unit_conversion_api", + "//ui/base", + ] +} + +source_set("unit_tests") { + testonly = true + sources = [ "unit_conversion_mediator_unittest.mm" ] + deps = [ + ":unit_conversion", + ":unit_conversion_ui", + "//base", + "//base/test:test_support", + "//ios/chrome/test/providers/unit_conversion", + "//third_party/ocmock", + ] +}
diff --git a/ios/chrome/browser/ui/unit_conversion/unit_conversion_consumer.h b/ios/chrome/browser/ui/unit_conversion/unit_conversion_consumer.h new file mode 100644 index 0000000..6e296ac --- /dev/null +++ b/ios/chrome/browser/ui/unit_conversion/unit_conversion_consumer.h
@@ -0,0 +1,37 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_UNIT_CONVERSION_UNIT_CONVERSION_CONSUMER_H_ +#define IOS_CHROME_BROWSER_UI_UNIT_CONVERSION_UNIT_CONVERSION_CONSUMER_H_ + +// UnitConversionConsumer defines methods to set the contents of the +// UnitConversionViewController. +@protocol UnitConversionConsumer <NSObject> + +// Tells the consumer to update the unit type title (volume, mass, etc) based on +// the user's new selected unit type. +- (void)updateUnitTypeTitle:(NSString*)unitTypeTitle; + +// Tells the consumer to update the source unit based on the user's new selected +// source unit type. +- (void)updateSourceUnit:(NSUnit*)sourceUnit; + +// Tells the consumer to update the target unit based on the user's new selected +// target unit type. +- (void)updateTargetUnit:(NSUnit*)targetUnit; + +// Tells the consumer to update the source unit value. +- (void)updateSourceUnitValue:(double)sourceUnitValue; + +// Tells the consumer to update the target unit value. +- (void)updateTargetUnitValue:(double)targetUnitValue; + +// Tells the consumer to reload data from its +// UnitConversionTableViewController's data source. Must be called after using +// one of the update* methods. +- (void)reloadUnitTableView; + +@end + +#endif // IOS_CHROME_BROWSER_UI_UNIT_CONVERSION_UNIT_CONVERSION_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/unit_conversion/unit_conversion_coordinator.h b/ios/chrome/browser/ui/unit_conversion/unit_conversion_coordinator.h new file mode 100644 index 0000000..3a3bf1c --- /dev/null +++ b/ios/chrome/browser/ui/unit_conversion/unit_conversion_coordinator.h
@@ -0,0 +1,28 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_UNIT_CONVERSION_UNIT_CONVERSION_COORDINATOR_H_ +#define IOS_CHROME_BROWSER_UI_UNIT_CONVERSION_UNIT_CONVERSION_COORDINATOR_H_ + +#import "ios/chrome/browser/shared/coordinator/chrome_coordinator/chrome_coordinator.h" + +// This coordinator presents unit conversion sheet to the user. +@interface UnitConversionCoordinator : ChromeCoordinator + +// Init UnitConversionCoordinator with the detected unit `sourceUnit`, the +// detected unit value `sourceUnitValue` and the tap/long press location +// `location`. +- (instancetype)initWithBaseViewController:(UIViewController*)baseViewController + browser:(Browser*)browser + sourceUnit:(NSUnit*)sourceUnit + sourceUnitValue:(double)sourceUnitValue + location:(CGPoint)location + NS_DESIGNATED_INITIALIZER; + +- (instancetype)initWithBaseViewController:(UIViewController*)viewController + browser:(Browser*)browser NS_UNAVAILABLE; + +@end + +#endif // IOS_CHROME_BROWSER_UI_UNIT_CONVERSION_UNIT_CONVERSION_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/unit_conversion/unit_conversion_coordinator.mm b/ios/chrome/browser/ui/unit_conversion/unit_conversion_coordinator.mm new file mode 100644 index 0000000..d752d3b --- /dev/null +++ b/ios/chrome/browser/ui/unit_conversion/unit_conversion_coordinator.mm
@@ -0,0 +1,68 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/unit_conversion/unit_conversion_coordinator.h" + +#import "ios/chrome/browser/ui/unit_conversion/unit_conversion_mediator.h" + +@interface UnitConversionCoordinator () < + UIAdaptivePresentationControllerDelegate> + +@end + +@implementation UnitConversionCoordinator { + // TODO(crbug.com/1468905): Add the unit conversion view controller. + + // Mediator to handle the units updates and conversion. + UnitConversionMediator* _mediator; + + // The detected unit. + NSUnit* _sourceUnit; + + // The detected unit value. + double _sourceUnitValue; + + // The user's tap/long press location. + CGPoint _location; +} + +- (instancetype)initWithBaseViewController:(UIViewController*)baseViewController + browser:(Browser*)browser + sourceUnit:(NSUnit*)sourceUnit + sourceUnitValue:(double)sourceUnitValue + location:(CGPoint)location { + self = [super initWithBaseViewController:baseViewController browser:browser]; + if (self) { + _sourceUnit = sourceUnit; + _sourceUnitValue = sourceUnitValue; + _location = location; + } + return self; +} + +- (void)start { + _mediator = [[UnitConversionMediator alloc] init]; + [self presentUnitConversionViewController]; +} + +- (void)stop { + [self dismissUnitConversionViewController]; +} + +#pragma mark - Private + +// Presents the UnitConversionCoordinator's view controller and adapt the +// presentation based on the device (popover for ipad, half sheet for iphone) +- (void)presentUnitConversionViewController { + // TODO(crbug.com/1468905): Present the unit conversion view controller. + return; +} + +// Dismisses the UnitConversionCoordinator's view controller. +- (void)dismissUnitConversionViewController { + // TODO(crbug.com/1468905): Dismiss the unit conversion view controller. + return; +} + +@end
diff --git a/ios/chrome/browser/ui/unit_conversion/unit_conversion_mediator.h b/ios/chrome/browser/ui/unit_conversion/unit_conversion_mediator.h new file mode 100644 index 0000000..0dc132c --- /dev/null +++ b/ios/chrome/browser/ui/unit_conversion/unit_conversion_mediator.h
@@ -0,0 +1,21 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_UNIT_CONVERSION_UNIT_CONVERSION_MEDIATOR_H_ +#define IOS_CHROME_BROWSER_UI_UNIT_CONVERSION_UNIT_CONVERSION_MEDIATOR_H_ + +#import <UIKit/UIKit.h> + +#import "ios/chrome/browser/ui/unit_conversion/unit_conversion_mutator.h" + +@protocol UnitConversionConsumer; + +// Mediator that handles the unit conversion operations. +@interface UnitConversionMediator : NSObject <UnitConversionMutator> + +@property(nonatomic, weak) id<UnitConversionConsumer> consumer; + +@end + +#endif // IOS_CHROME_BROWSER_UI_UNIT_CONVERSION_UNIT_CONVERSION_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/unit_conversion/unit_conversion_mediator.mm b/ios/chrome/browser/ui/unit_conversion/unit_conversion_mediator.mm new file mode 100644 index 0000000..ccca646 --- /dev/null +++ b/ios/chrome/browser/ui/unit_conversion/unit_conversion_mediator.mm
@@ -0,0 +1,93 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/unit_conversion/unit_conversion_mediator.h" + +#import "ios/chrome/browser/ui/unit_conversion/unit_conversion_consumer.h" +#import "ios/chrome/browser/ui/unit_conversion/unit_conversion_mutator.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ios/public/provider/chrome/browser/unit_conversion/unit_conversion_api.h" + +@implementation UnitConversionMediator + +#pragma mark - UnitConversionMutator + +- (void)unitTypeDidChange:(ios::provider::UnitType)unitType + unitValue:(double)unitValue { + NSUnit* sourceUnit = ios::provider::GetDefaultUnitForType(unitType); + NSUnit* targetUnit = ios::provider::GetDefaultTargetUnit(sourceUnit); + + if (sourceUnit && targetUnit) { + NSMeasurement* sourceUnitMeasurement = + [[NSMeasurement alloc] initWithDoubleValue:unitValue unit:sourceUnit]; + if ([sourceUnitMeasurement canBeConvertedToUnit:targetUnit]) { + NSMeasurement* targetUnitMeasurement = + [sourceUnitMeasurement measurementByConvertingToUnit:targetUnit]; + [self.consumer updateSourceUnit:sourceUnit]; + [self.consumer updateTargetUnit:targetUnit]; + [self.consumer updateSourceUnitValue:sourceUnitMeasurement.doubleValue]; + [self.consumer updateTargetUnitValue:targetUnitMeasurement.doubleValue]; + [self.consumer reloadUnitTableView]; + } + } +} + +- (void)sourceUnitDidChange:(NSUnit*)sourceUnit + targetUnit:(NSUnit*)targetUnit + unitValue:(double)unitValue { + NSMeasurement* sourceUnitMeasurement = + [[NSMeasurement alloc] initWithDoubleValue:unitValue unit:sourceUnit]; + if ([sourceUnitMeasurement canBeConvertedToUnit:targetUnit]) { + NSMeasurement* targetUnitMeasurement = + [sourceUnitMeasurement measurementByConvertingToUnit:targetUnit]; + + [self.consumer updateSourceUnit:sourceUnit]; + [self.consumer updateTargetUnitValue:targetUnitMeasurement.doubleValue]; + [self.consumer reloadUnitTableView]; + } +} + +- (void)targetUnitDidChange:(NSUnit*)targetUnit + sourceUnit:(NSUnit*)sourceUnit + unitValue:(double)unitValue { + NSMeasurement* sourceUnitMeasurement = + [[NSMeasurement alloc] initWithDoubleValue:unitValue unit:sourceUnit]; + if ([sourceUnitMeasurement canBeConvertedToUnit:targetUnit]) { + NSMeasurement* targetUnitMeasurement = + [sourceUnitMeasurement measurementByConvertingToUnit:targetUnit]; + + [self.consumer updateTargetUnit:targetUnit]; + [self.consumer updateTargetUnitValue:targetUnitMeasurement.doubleValue]; + [self.consumer reloadUnitTableView]; + } +} + +- (void)sourceUnitValueFieldDidChange:(NSString*)sourceUnitValueField + sourceUnit:(NSUnit*)sourceUnit + targetUnit:(NSUnit*)targetUnit { + NSNumber* unitValueNumber = [self numberFromString:sourceUnitValueField]; + if (!unitValueNumber) { + return; + } + double unitValue = unitValueNumber.doubleValue; + NSMeasurement* sourceUnitMeasurement = + [[NSMeasurement alloc] initWithDoubleValue:unitValue unit:sourceUnit]; + if ([sourceUnitMeasurement canBeConvertedToUnit:targetUnit]) { + NSMeasurement* targetUnitMeasurement = + [sourceUnitMeasurement measurementByConvertingToUnit:targetUnit]; + [self.consumer updateTargetUnitValue:targetUnitMeasurement.doubleValue]; + [self.consumer reloadUnitTableView]; + } +} + +#pragma mark - Private + +// Convert a string to a NSNumber*, returns nil if not valid. +- (NSNumber*)numberFromString:(NSString*)string { + NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init]; + numberFormatter.numberStyle = NSNumberFormatterDecimalStyle; + return [numberFormatter numberFromString:string]; +} + +@end
diff --git a/ios/chrome/browser/ui/unit_conversion/unit_conversion_mediator_unittest.mm b/ios/chrome/browser/ui/unit_conversion/unit_conversion_mediator_unittest.mm new file mode 100644 index 0000000..93d021a --- /dev/null +++ b/ios/chrome/browser/ui/unit_conversion/unit_conversion_mediator_unittest.mm
@@ -0,0 +1,224 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/unit_conversion/unit_conversion_mediator.h" + +#import "ios/chrome/browser/ui/unit_conversion/unit_conversion_consumer.h" +#import "ios/chrome/test/providers/unit_conversion/test_unit_conversion.h" +#import "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" +#import "third_party/ocmock/gtest_support.h" + +namespace { + +// Source and target unit values for testing. +const double kSourceUnitValue = 1; +const double kExpectedTargetUnitValue = 1000; + +// Source unit value field in valid format. +NSString* kValidSourceUnitValueField = @"1"; + +// Source unit value field in invalid format. +NSString* kInvalidSourceUnitValueField = @"&1"; + +} // namespace + +// A Unit Conversion factory that return test source and target units. +@interface TestUnitConversionProviderTestHelper + : NSObject <UnitConversionProviderTestHelper> +@end + +@implementation TestUnitConversionProviderTestHelper + +// Returns default units or nil to test nil units handling. +- (NSUnit*)sourceUnitFromUnitType:(ios::provider::UnitType)unit_type { + if (unit_type == ios::provider::kUnitTypeMass) { + return [NSUnitMass kilograms]; + } + + if (unit_type == ios::provider::kUnitTypeArea) { + return [NSUnitArea squareMiles]; + } + + return nil; +} + +// Returns default, invalid or nil units from a source unit. +- (NSUnit*)targetUnitFromUnit:(NSUnit*)unit { + if ([unit isEqual:[NSUnitMass kilograms]]) { + return [NSUnitMass grams]; + } + + if ([unit isEqual:[NSUnitArea squareMiles]]) { + return [NSUnitVolume cubicMiles]; + } + + return nil; +} + +@end + +// Test the Unit Conversion mediator and its unit conversions. +class UnitConversionMediatorTest : public PlatformTest { + public: + void SetUp() override { + PlatformTest::SetUp(); + mediator_ = [[UnitConversionMediator alloc] init]; + helper_ = [[TestUnitConversionProviderTestHelper alloc] init]; + ios::provider::test::SetUnitConversionProviderTestHelper(helper_); + } + + void TearDown() override { + ios::provider::test::SetUnitConversionProviderTestHelper(nil); + PlatformTest::TearDown(); + } + + protected: + UnitConversionMediator* mediator_; + TestUnitConversionProviderTestHelper* helper_; +}; + +// Tests that the conversion and the updates are handled correctly when the +// source/traget unit conversion is possible (source and target are of the same +// type). +TEST_F(UnitConversionMediatorTest, TestPossibleUnitTypeChange) { + id consumer_mock = OCMStrictProtocolMock(@protocol(UnitConversionConsumer)); + mediator_.consumer = consumer_mock; + + [consumer_mock setExpectationOrderMatters:YES]; + OCMExpect([consumer_mock updateSourceUnit:[OCMArg any]]); + OCMExpect([consumer_mock updateTargetUnit:[OCMArg any]]); + OCMExpect([consumer_mock updateSourceUnitValue:kSourceUnitValue]); + OCMExpect([consumer_mock updateTargetUnitValue:kExpectedTargetUnitValue]); + OCMExpect([consumer_mock reloadUnitTableView]); + + [mediator_ unitTypeDidChange:ios::provider::kUnitTypeMass + unitValue:kSourceUnitValue]; + // Test. + EXPECT_OCMOCK_VERIFY(consumer_mock); +} + +// Tests that no conversion and no consumer unit value update is taking place +// when the conversion is impossible (source and target unit are not of the same +// type). +TEST_F(UnitConversionMediatorTest, TestImpossibleUnitTypeChange) { + id consumer_mock = OCMStrictProtocolMock(@protocol(UnitConversionConsumer)); + mediator_.consumer = consumer_mock; + + [consumer_mock setExpectationOrderMatters:YES]; + [mediator_ unitTypeDidChange:ios::provider::kUnitTypeArea + unitValue:kSourceUnitValue]; + // Test. + EXPECT_OCMOCK_VERIFY(consumer_mock); +} + +// Tests that no conversion and no consumer unit value update is taking place +// when the source/target are nil. +TEST_F(UnitConversionMediatorTest, TestNilUnitTypeChange) { + id consumer_mock = OCMStrictProtocolMock(@protocol(UnitConversionConsumer)); + mediator_.consumer = consumer_mock; + + [consumer_mock setExpectationOrderMatters:YES]; + [mediator_ unitTypeDidChange:ios::provider::kUnitTypeUnknown + unitValue:kSourceUnitValue]; + // Test. + EXPECT_OCMOCK_VERIFY(consumer_mock); +} + +// Tests that the source unit change is handled properly when the conversion is +// possible between source and target unit. +TEST_F(UnitConversionMediatorTest, TestPossibleSourceUnitChange) { + id consumer_mock = OCMStrictProtocolMock(@protocol(UnitConversionConsumer)); + mediator_.consumer = consumer_mock; + [consumer_mock setExpectationOrderMatters:YES]; + NSUnitMass* sourceUnit = [NSUnitMass kilograms]; + NSUnitMass* targetUnit = [NSUnitMass grams]; + OCMExpect([consumer_mock updateSourceUnit:sourceUnit]); + OCMExpect([consumer_mock updateTargetUnitValue:kExpectedTargetUnitValue]); + OCMExpect([consumer_mock reloadUnitTableView]); + [mediator_ sourceUnitDidChange:sourceUnit + targetUnit:targetUnit + unitValue:kSourceUnitValue]; + // Test. + EXPECT_OCMOCK_VERIFY(consumer_mock); +} + +// Tests that no update is taking place after a source unit change when the +// conversion is impossible (source/target units are of different types). +TEST_F(UnitConversionMediatorTest, TestImpossibleSourceUnitChange) { + id consumer_mock = OCMStrictProtocolMock(@protocol(UnitConversionConsumer)); + mediator_.consumer = consumer_mock; + NSUnitMass* sourceUnit = [NSUnitMass kilograms]; + NSUnitArea* targetUnit = [NSUnitArea squareMiles]; + [mediator_ sourceUnitDidChange:sourceUnit + targetUnit:targetUnit + unitValue:kSourceUnitValue]; + // Test. + EXPECT_OCMOCK_VERIFY(consumer_mock); +} + +// Tests that the target unit change is handled properly when the conversion is +// possible between source and target unit. +TEST_F(UnitConversionMediatorTest, TestPossibleTargetUnitChange) { + id consumer_mock = OCMStrictProtocolMock(@protocol(UnitConversionConsumer)); + mediator_.consumer = consumer_mock; + NSUnitMass* sourceUnit = [NSUnitMass kilograms]; + NSUnitMass* targetUnit = [NSUnitMass grams]; + [consumer_mock setExpectationOrderMatters:YES]; + OCMExpect([consumer_mock updateTargetUnit:targetUnit]); + OCMExpect([consumer_mock updateTargetUnitValue:kExpectedTargetUnitValue]); + OCMExpect([consumer_mock reloadUnitTableView]); + + [mediator_ targetUnitDidChange:targetUnit + sourceUnit:sourceUnit + unitValue:kSourceUnitValue]; + // Test. + EXPECT_OCMOCK_VERIFY(consumer_mock); +} + +// Tests that no update is taking place after a target unit change when the +// conversion is impossible (source/target units are of different types). +TEST_F(UnitConversionMediatorTest, TestImpossibleTargetUnitChange) { + id consumer_mock = OCMStrictProtocolMock(@protocol(UnitConversionConsumer)); + mediator_.consumer = consumer_mock; + NSUnitMass* sourceUnit = [NSUnitMass kilograms]; + NSUnitArea* targetUnit = [NSUnitArea squareMiles]; + [mediator_ targetUnitDidChange:targetUnit + sourceUnit:sourceUnit + unitValue:kSourceUnitValue]; + // Test. + EXPECT_OCMOCK_VERIFY(consumer_mock); +} + +// Tests that the source field unit is handled properly when the string to +// NSNumber cast is possible. +TEST_F(UnitConversionMediatorTest, TestValidSourceUnitValueFieldChange) { + id consumer_mock = OCMStrictProtocolMock(@protocol(UnitConversionConsumer)); + mediator_.consumer = consumer_mock; + NSUnitMass* sourceUnit = [NSUnitMass kilograms]; + NSUnitMass* targetUnit = [NSUnitMass grams]; + [consumer_mock setExpectationOrderMatters:YES]; + OCMExpect([consumer_mock updateTargetUnitValue:kExpectedTargetUnitValue]); + OCMExpect([consumer_mock reloadUnitTableView]); + + [mediator_ sourceUnitValueFieldDidChange:kValidSourceUnitValueField + sourceUnit:sourceUnit + targetUnit:targetUnit]; + // Test. + EXPECT_OCMOCK_VERIFY(consumer_mock); +} + +// Tests that no update nor conversion is taking place when the source unit +// field value is invalid. +TEST_F(UnitConversionMediatorTest, TestInvalidSourceUnitValueFieldChange) { + id consumer_mock = OCMStrictProtocolMock(@protocol(UnitConversionConsumer)); + mediator_.consumer = consumer_mock; + NSUnitMass* sourceUnit = [NSUnitMass kilograms]; + NSUnitMass* targetUnit = [NSUnitMass grams]; + [mediator_ sourceUnitValueFieldDidChange:kInvalidSourceUnitValueField + sourceUnit:sourceUnit + targetUnit:targetUnit]; + // Test. + EXPECT_OCMOCK_VERIFY(consumer_mock); +}
diff --git a/ios/chrome/browser/ui/unit_conversion/unit_conversion_mutator.h b/ios/chrome/browser/ui/unit_conversion/unit_conversion_mutator.h new file mode 100644 index 0000000..daa9183 --- /dev/null +++ b/ios/chrome/browser/ui/unit_conversion/unit_conversion_mutator.h
@@ -0,0 +1,32 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_UNIT_CONVERSION_UNIT_CONVERSION_MUTATOR_H_ +#define IOS_CHROME_BROWSER_UI_UNIT_CONVERSION_UNIT_CONVERSION_MUTATOR_H_ +#import "ios/public/provider/chrome/browser/unit_conversion/unit_conversion_api.h" + +@protocol UnitConversionMutator <NSObject> + +// Notifies the mutator of a unit title change. +- (void)unitTypeDidChange:(ios::provider::UnitType)unitTypeTitle + unitValue:(double)unitValue; + +// Notifies the mutator of a source unit change. +- (void)sourceUnitDidChange:(NSUnit*)sourceUnit + targetUnit:(NSUnit*)targetUnit + unitValue:(double)unitValue; + +// Notifies the mutator of a target unit change. +- (void)targetUnitDidChange:(NSUnit*)targetUnit + sourceUnit:(NSUnit*)sourceUnit + unitValue:(double)unitValue; + +// Notifies the mutator of a source unit value change. +- (void)sourceUnitValueFieldDidChange:(NSString*)sourceUnitValueField + sourceUnit:(NSUnit*)sourceUnit + targetUnit:(NSUnit*)targetUnit; + +@end + +#endif // IOS_CHROME_BROWSER_UI_UNIT_CONVERSION_UNIT_CONVERSION_MUTATOR_H_
diff --git a/ios/chrome/browser/ui/webui/BUILD.gn b/ios/chrome/browser/ui/webui/BUILD.gn index 60de4655..86393ef 100644 --- a/ios/chrome/browser/ui/webui/BUILD.gn +++ b/ios/chrome/browser/ui/webui/BUILD.gn
@@ -131,7 +131,7 @@ "//ios/chrome/browser/shared/model/url:constants", "//ios/chrome/browser/shared/public/features:system_flags", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/ui/webui/gcm", "//ios/chrome/browser/ui/webui/interstitials", "//ios/chrome/browser/ui/webui/local_state",
diff --git a/ios/chrome/browser/ui/webui/chrome_web_ui_provider.cc b/ios/chrome/browser/ui/webui/chrome_web_ui_provider.cc index dc612ef..2b1caf0 100644 --- a/ios/chrome/browser/ui/webui/chrome_web_ui_provider.cc +++ b/ios/chrome/browser/ui/webui/chrome_web_ui_provider.cc
@@ -6,8 +6,8 @@ #include "components/sync/invalidations/sync_invalidations_service.h" #include "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/sync/sync_invalidations_service_factory.h" -#include "ios/chrome/browser/sync/sync_service_factory.h" +#include "ios/chrome/browser/sync/model/sync_invalidations_service_factory.h" +#include "ios/chrome/browser/sync/model/sync_service_factory.h" #include "ios/chrome/common/channel_info.h" namespace web_ui {
diff --git a/ios/chrome/browser/ui/whats_new/whats_new_instructions_coordinator.mm b/ios/chrome/browser/ui/whats_new/whats_new_instructions_coordinator.mm index 7e8d825a..2227841 100644 --- a/ios/chrome/browser/ui/whats_new/whats_new_instructions_coordinator.mm +++ b/ios/chrome/browser/ui/whats_new/whats_new_instructions_coordinator.mm
@@ -66,6 +66,7 @@ #pragma mark - ConfirmationAlertActionHandler - (void)confirmationAlertPrimaryAction { + [self.delegate dismissOnlyWhatsNewInstructionsCoordinator:self]; [self.actionHandler didTapActionButton:self.item.type primaryAction:self.item.primaryAction]; }
diff --git a/ios/chrome/browser/unified_consent/BUILD.gn b/ios/chrome/browser/unified_consent/BUILD.gn index f41654b..c5cdd8e 100644 --- a/ios/chrome/browser/unified_consent/BUILD.gn +++ b/ios/chrome/browser/unified_consent/BUILD.gn
@@ -18,6 +18,6 @@ "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/signin", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", ] }
diff --git a/ios/chrome/browser/unified_consent/DEPS b/ios/chrome/browser/unified_consent/DEPS index fc48979..6ce0c91 100644 --- a/ios/chrome/browser/unified_consent/DEPS +++ b/ios/chrome/browser/unified_consent/DEPS
@@ -1,4 +1,4 @@ include_rules = [ "+ios/chrome/browser/signin", - "+ios/chrome/browser/sync", + "+ios/chrome/browser/sync/model", ]
diff --git a/ios/chrome/browser/unified_consent/unified_consent_service_factory.mm b/ios/chrome/browser/unified_consent/unified_consent_service_factory.mm index a7c42288..d01318a 100644 --- a/ios/chrome/browser/unified_consent/unified_consent_service_factory.mm +++ b/ios/chrome/browser/unified_consent/unified_consent_service_factory.mm
@@ -17,7 +17,7 @@ #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/prefs/pref_names.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" UnifiedConsentServiceFactory::UnifiedConsentServiceFactory() : BrowserStateKeyedServiceFactory(
diff --git a/ios/chrome/browser/url_loading/url_loading_browser_agent.mm b/ios/chrome/browser/url_loading/url_loading_browser_agent.mm index af7399d..a670dfd8 100644 --- a/ios/chrome/browser/url_loading/url_loading_browser_agent.mm +++ b/ios/chrome/browser/url_loading/url_loading_browser_agent.mm
@@ -130,19 +130,6 @@ Dispatch(fixed_params); break; } - case UrlLoadStrategy::ALWAYS_IN_INCOGNITO: { - ChromeBrowserState* browser_state = browser_->GetBrowserState(); - if (params.disposition == WindowOpenDisposition::CURRENT_TAB && - !browser_state->IsOffTheRecord()) { - DCHECK(incognito_loader_); - incognito_loader_->Load(params); - } else { - UrlLoadParams fixed_params = params; - fixed_params.in_incognito = YES; - Dispatch(fixed_params); - } - break; - } case UrlLoadStrategy::NORMAL: { Dispatch(params); break;
diff --git a/ios/chrome/browser/url_loading/url_loading_browser_agent_unittest.mm b/ios/chrome/browser/url_loading/url_loading_browser_agent_unittest.mm index 4a6912b..9313a5425 100644 --- a/ios/chrome/browser/url_loading/url_loading_browser_agent_unittest.mm +++ b/ios/chrome/browser/url_loading/url_loading_browser_agent_unittest.mm
@@ -406,72 +406,4 @@ EXPECT_EQ(1, scene_loader_->load_new_tab_call_count_); } -// Test opening an incognito url in new tab with normal service using load -// strategy. -TEST_F(URLLoadingBrowserAgentTest, TestOpenIncognitoInNewTabWithLoadStrategy) { - WebStateList* web_state_list = browser_->GetWebStateList(); - ASSERT_EQ(0, web_state_list->count()); - WebStateList* otr_web_state_list = otr_browser_->GetWebStateList(); - ASSERT_EQ(0, otr_web_state_list->count()); - - scene_loader_->current_browser_ = browser_.get(); - - // Send to normal service. - GURL url1("http://test/1"); - UrlLoadParams params1 = - UrlLoadParams::InNewTab(web::NavigationManager::WebLoadParams(url1)); - params1.load_strategy = UrlLoadStrategy::ALWAYS_IN_INCOGNITO; - loader_->Load(params1); - EXPECT_EQ(0, web_state_list->count()); - EXPECT_EQ(0, otr_web_state_list->count()); - - // Check that we had one app level redirection. - EXPECT_EQ(1, scene_loader_->load_new_tab_call_count_); -} - -// Test opening an incognito url in current tab with normal service using load -// strategy. -TEST_F(URLLoadingBrowserAgentTest, - TestOpenIncognitoInCurrentTabWithLoadStrategy) { - WebStateList* web_state_list = browser_->GetWebStateList(); - ASSERT_EQ(0, web_state_list->count()); - WebStateList* otr_web_state_list = otr_browser_->GetWebStateList(); - ASSERT_EQ(0, otr_web_state_list->count()); - - // Make app level to be otr. - std::unique_ptr<TestBrowser> otr_browser = std::make_unique<TestBrowser>( - chrome_browser_state_->GetOffTheRecordChromeBrowserState()); - scene_loader_->current_browser_ = otr_browser.get(); - - // Set a new incognito tab. - GURL newtab("chrome://newtab"); - UrlLoadParams new_tab_params = - UrlLoadParams::InNewTab(web::NavigationManager::WebLoadParams(newtab)); - new_tab_params.in_incognito = YES; - otr_loader_->Load(new_tab_params); - EXPECT_EQ(0, web_state_list->count()); - EXPECT_EQ(1, otr_web_state_list->count()); - - // Send to normal service. - GURL url1("http://test/1"); - UrlLoadParams params1 = - UrlLoadParams::InCurrentTab(web::NavigationManager::WebLoadParams(url1)); - params1.load_strategy = UrlLoadStrategy::ALWAYS_IN_INCOGNITO; - loader_->Load(params1); - - // We won't to wait for the navigation item to be committed, let's just - // make sure it is at least pending. - EXPECT_EQ(url1, otr_web_state_list->GetActiveWebState() - ->GetNavigationManager() - ->GetPendingItem() - ->GetOriginalRequestURL()); - - // And that a new tab wasn't created. - EXPECT_EQ(0, web_state_list->count()); - EXPECT_EQ(1, otr_web_state_list->count()); - - // Check that we had no app level redirection. - EXPECT_EQ(0, scene_loader_->load_new_tab_call_count_); -} - } // namespace
diff --git a/ios/chrome/browser/url_loading/url_loading_params.h b/ios/chrome/browser/url_loading/url_loading_params.h index a4099f7c..3862c00 100644 --- a/ios/chrome/browser/url_loading/url_loading_params.h +++ b/ios/chrome/browser/url_loading/url_loading_params.h
@@ -15,7 +15,6 @@ NORMAL = 0, ALWAYS_NEW_FOREGROUND_TAB = 1 << 0, - ALWAYS_IN_INCOGNITO = 1 << 1, }; // UrlLoadingService wrapper around web::NavigationManager::WebLoadParams,
diff --git a/ios/chrome/browser/variations/BUILD.gn b/ios/chrome/browser/variations/BUILD.gn index 2228001..df032ae 100644 --- a/ios/chrome/browser/variations/BUILD.gn +++ b/ios/chrome/browser/variations/BUILD.gn
@@ -128,6 +128,7 @@ ":eg_test_support+eg2", "//base", "//base/test:test_support", + "//build:branding_buildflags", "//components/metrics", "//components/prefs", "//components/variations:test_support",
diff --git a/ios/chrome/browser/variations/variations_safe_mode_egtest.mm b/ios/chrome/browser/variations/variations_safe_mode_egtest.mm index 2a57f6e..10676c3 100644 --- a/ios/chrome/browser/variations/variations_safe_mode_egtest.mm +++ b/ios/chrome/browser/variations/variations_safe_mode_egtest.mm
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#import "build/branding_buildflags.h" #import "ios/chrome/browser/variations/variations_app_interface.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" @@ -117,7 +118,14 @@ // // Corresponds to VariationsSafeModeBrowserTest.ThreeCrashesTriggerSafeMode in // variations_safe_mode_browsertest.cc. -- (void)testThreeCrashesTriggerSafeMode { +// TODO(crbug.com/1487978): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testThreeCrashesTriggerSafeMode \ + DISABLED_testThreeCrashesTriggerSafeMode +#else +#define MAYBE_testThreeCrashesTriggerSafeMode testThreeCrashesTriggerSafeMode +#endif +- (void)MAYBE_testThreeCrashesTriggerSafeMode { [VariationsAppInterface setTestSafeSeedAndSignature]; // Persist the local state pref changes made above and in setUp(). @@ -194,7 +202,13 @@ // // Corresponds to VariationsSafeModeBrowserTest.DoNotTriggerSafeMode in // variations_safe_mode_browsertest.cc. -- (void)testDoNotTriggerSafeMode { +// TODO(crbug.com/1487978): Test fails on official builds. +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#define MAYBE_testDoNotTriggerSafeMode DISABLED_testDoNotTriggerSafeMode +#else +#define MAYBE_testDoNotTriggerSafeMode testDoNotTriggerSafeMode +#endif +- (void)MAYBE_testDoNotTriggerSafeMode { [VariationsAppInterface setTestSafeSeedAndSignature]; // Neither a crash streak of 2 nor a fetch failure streak of 24 will trigger // variations safe mode in the next session.
diff --git a/ios/chrome/browser/web/annotations/annotations_tab_helper.h b/ios/chrome/browser/web/annotations/annotations_tab_helper.h index 22e6085c..a4eccc4 100644 --- a/ios/chrome/browser/web/annotations/annotations_tab_helper.h +++ b/ios/chrome/browser/web/annotations/annotations_tab_helper.h
@@ -64,6 +64,9 @@ // WebStateObserver methods: void WebStateDestroyed(web::WebState* web_state) override; + void PageLoaded( + web::WebState* web_state, + web::PageLoadCompletionStatus load_completion_status) override; WEB_STATE_USER_DATA_KEY_DECL(); @@ -88,6 +91,10 @@ // list `parcels`. void MaybeShowParcelTrackingUI(NSArray<CustomTextCheckingResult*>* parcels); + // Puts annotations data in `match_cache_` and replaces it with a uuid key + // to be passed to JS and expect back in `OnClick`. + void BuildCache(base::Value::List& annotations_list); + UIViewController* base_view_controller_ = nil; id<MiniMapCommands> mini_map_handler_ = nil; @@ -98,6 +105,8 @@ std::unique_ptr<base::Value::Dict> metadata_; + std::map<std::string, std::string> match_cache_; + SEQUENCE_CHECKER(sequence_checker_); // Must be last member to ensure it is destroyed last.
diff --git a/ios/chrome/browser/web/annotations/annotations_tab_helper.mm b/ios/chrome/browser/web/annotations/annotations_tab_helper.mm index 818d9ad..d4b7416 100644 --- a/ios/chrome/browser/web/annotations/annotations_tab_helper.mm +++ b/ios/chrome/browser/web/annotations/annotations_tab_helper.mm
@@ -12,6 +12,7 @@ #import "base/strings/sys_string_conversions.h" #import "base/strings/utf_string_conversions.h" #import "base/task/thread_pool.h" +#import "base/uuid.h" #import "base/values.h" #import "components/ukm/ios/ukm_url_recorder.h" #import "ios/chrome/browser/mailto_handler/mailto_handler_service.h" @@ -73,6 +74,15 @@ web_state_ = nullptr; } +void AnnotationsTabHelper::PageLoaded( + web::WebState* web_state, + web::PageLoadCompletionStatus load_completion_status) { + DCHECK_EQ(web_state_, web_state); + if (load_completion_status == web::PageLoadCompletionStatus::SUCCESS) { + match_cache_.clear(); + } +} + #pragma mark - AnnotationsTextObserver methods. void AnnotationsTabHelper::OnTextExtracted(web::WebState* web_state, @@ -126,8 +136,11 @@ CGRect rect, const std::string& data) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - NSTextCheckingResult* match = - web::DecodeNSTextCheckingResultData(base::SysUTF8ToNSString(data)); + if (match_cache_.find(data) == match_cache_.end()) { + return; + } + NSTextCheckingResult* match = web::DecodeNSTextCheckingResultData( + base::SysUTF8ToNSString(match_cache_.at(data))); if (!match) { return; } @@ -159,10 +172,24 @@ if (IsIOSParcelTrackingEnabled()) { AnnotationsTabHelper::ProcessParcelTrackingNumbers(annotations.GetList()); } + BuildCache(annotations.GetList()); manager->DecorateAnnotations(web_state_, annotations, seq_id); } } +void AnnotationsTabHelper::BuildCache(base::Value::List& annotations_list) { + for (size_t i = 0; i < annotations_list.size(); i++) { + base::Value::Dict& entity = annotations_list[i].GetDict(); + const std::string* data = entity.FindString("data"); + if (!data) { + continue; + } + const std::string key = base::Uuid::GenerateRandomV4().AsLowercaseString(); + match_cache_[key] = *data; + entity.Set("data", key); + } +} + void AnnotationsTabHelper::ProcessParcelTrackingNumbers( base::Value::List& annotations_list) { // Return early if not currently active WebState.
diff --git a/ios/chrome/common/intents/Intents.intentdefinition b/ios/chrome/common/intents/Intents.intentdefinition index 87b97fa0..cc25f8e 100644 --- a/ios/chrome/common/intents/Intents.intentdefinition +++ b/ios/chrome/common/intents/Intents.intentdefinition
@@ -1205,7 +1205,7 @@ </dict> <dict> <key>INIntentCategory</key> - <string>generic</string> + <string>information</string> <key>INIntentConfigurable</key> <true/> <key>INIntentDescriptionID</key> @@ -1218,6 +1218,10 @@ <dict> <key>INIntentParameterCombinationSupportsBackgroundExecution</key> <true/> + <key>INIntentParameterCombinationTitle</key> + <string>Open My Latest Tab in Chrome</string> + <key>INIntentParameterCombinationTitleID</key> + <string>eoLMs3</string> <key>INIntentParameterCombinationUpdatesLinked</key> <true/> </dict> @@ -1230,10 +1234,6 @@ <dict> <key>INIntentParameterCombinationIsPrimary</key> <true/> - <key>INIntentParameterCombinationSubtitle</key> - <string>Open My Latest Tab in Chrome.</string> - <key>INIntentParameterCombinationSubtitleID</key> - <string>k6vkhf</string> <key>INIntentParameterCombinationSupportsBackgroundExecution</key> <false/> <key>INIntentParameterCombinationTitle</key> @@ -1265,11 +1265,11 @@ <key>INIntentType</key> <string>Custom</string> <key>INIntentVerb</key> - <string>Do</string> + <string>Open</string> </dict> <dict> <key>INIntentCategory</key> - <string>generic</string> + <string>information</string> <key>INIntentConfigurable</key> <true/> <key>INIntentDescriptionID</key> @@ -1298,10 +1298,6 @@ <dict> <key>INIntentParameterCombinationIsPrimary</key> <true/> - <key>INIntentParameterCombinationSubtitle</key> - <string>Search Visuals in Chrome</string> - <key>INIntentParameterCombinationSubtitleID</key> - <string>pe1BPb</string> <key>INIntentParameterCombinationSupportsBackgroundExecution</key> <false/> <key>INIntentParameterCombinationTitle</key> @@ -1333,11 +1329,11 @@ <key>INIntentType</key> <string>Custom</string> <key>INIntentVerb</key> - <string>Do</string> + <string>Open</string> </dict> <dict> <key>INIntentCategory</key> - <string>generic</string> + <string>information</string> <key>INIntentConfigurable</key> <true/> <key>INIntentDescriptionID</key> @@ -1366,10 +1362,6 @@ <dict> <key>INIntentParameterCombinationIsPrimary</key> <true/> - <key>INIntentParameterCombinationSubtitle</key> - <string>Clear Browsing Data in Chrome.</string> - <key>INIntentParameterCombinationSubtitleID</key> - <string>lfVwmu</string> <key>INIntentParameterCombinationSupportsBackgroundExecution</key> <false/> <key>INIntentParameterCombinationTitle</key> @@ -1401,7 +1393,7 @@ <key>INIntentType</key> <string>Custom</string> <key>INIntentVerb</key> - <string>Do</string> + <string>Open</string> </dict> </array> <key>INTypes</key>
diff --git a/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h b/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h index dbb23f0..f29be8de 100644 --- a/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h +++ b/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h
@@ -54,6 +54,9 @@ // not set. @property(nonatomic, copy) NSString* secondaryActionTextColor; +// The icon for the secondary action. Must be set before the view is loaded. +@property(nonatomic, strong) UIImage* secondaryActionImage; + // The text for the tertiary action. Must be set before the view is loaded. @property(nonatomic, copy) NSString* tertiaryActionString;
diff --git a/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm b/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm index e9f39d65f..1d0e61f 100644 --- a/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm +++ b/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm
@@ -18,6 +18,7 @@ namespace { const CGFloat kDefaultActionsBottomMargin = 10; +const CGFloat kActionButtonImageInsets = 10; // Gradient height. const CGFloat kGradientHeight = 40.; const CGFloat kScrollViewBottomInsets = 20; @@ -823,11 +824,18 @@ [secondaryActionButton setTitleColor:titleColor forState:UIControlStateNormal]; - // TODO(crbug.com/1418068): Replace with UIButtonConfiguration when min - // deployment target is iOS 15. - UIEdgeInsets contentInsets = - UIEdgeInsetsMake(kButtonVerticalInsets, 0, kButtonVerticalInsets, 0); - SetContentEdgeInsets(secondaryActionButton, contentInsets); + UIButtonConfiguration* buttonConfiguration = + secondaryActionButton.configuration + ? secondaryActionButton.configuration + : [UIButtonConfiguration plainButtonConfiguration]; + buttonConfiguration.contentInsets = NSDirectionalEdgeInsetsMake( + kButtonVerticalInsets, 0, kButtonVerticalInsets, 0); + + if (self.secondaryActionImage) { + buttonConfiguration.image = self.secondaryActionImage; + buttonConfiguration.imagePadding = kActionButtonImageInsets; + } + secondaryActionButton.configuration = buttonConfiguration; secondaryActionButton.titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
diff --git a/ios/chrome/content_widget_extension/strings/resources/ios_content_widget_extension_chromium_strings_hi.xtb b/ios/chrome/content_widget_extension/strings/resources/ios_content_widget_extension_chromium_strings_hi.xtb index 1988fde..026a6a5 100644 --- a/ios/chrome/content_widget_extension/strings/resources/ios_content_widget_extension_chromium_strings_hi.xtb +++ b/ios/chrome/content_widget_extension/strings/resources/ios_content_widget_extension_chromium_strings_hi.xtb
@@ -2,4 +2,5 @@ <!DOCTYPE translationbundle> <translationbundle lang="hi"> <translation id="264609280318319531">क्रोमियम - सुझाई गई साइटें</translation> +<translation id="628445239225255562">इस विजेट का इस्तेमाल जारी रखने के लिए, स्क्रीन पर सबसे नीचे मौजूद, 'बदलाव करें' और फिर + पर टैप करें. इसके बाद, Chromium पर जाएं और 'Chromium के शॉर्टकट' को चुनें.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/content_widget_extension/strings/resources/ios_content_widget_extension_google_chrome_strings_hi.xtb b/ios/chrome/content_widget_extension/strings/resources/ios_content_widget_extension_google_chrome_strings_hi.xtb index 5a14b90..28a1556 100644 --- a/ios/chrome/content_widget_extension/strings/resources/ios_content_widget_extension_google_chrome_strings_hi.xtb +++ b/ios/chrome/content_widget_extension/strings/resources/ios_content_widget_extension_google_chrome_strings_hi.xtb
@@ -2,4 +2,5 @@ <!DOCTYPE translationbundle> <translationbundle lang="hi"> <translation id="4544225832231827770">Chrome - सुझाई गई साइटें</translation> +<translation id="5724968293151962792">इस विजेट का इस्तेमाल जारी रखने के लिए, स्क्रीन पर सबसे नीचे मौजूद, 'बदलाव करें' और फिर + पर टैप करें. इसके बाद, Chrome पर जाएं और 'Chrome के शॉर्टकट' को चुनें.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/open_extension/appex/BUILD.gn b/ios/chrome/open_extension/appex/BUILD.gn index c4b030c..3365775 100644 --- a/ios/chrome/open_extension/appex/BUILD.gn +++ b/ios/chrome/open_extension/appex/BUILD.gn
@@ -27,7 +27,7 @@ output_name = "open_extension" deps = [ "//ios/chrome/open_extension:open", - "//ios/chrome/open_extension/resources:extension_icon", + "//ios/chrome/open_extension/resources", ] bundle_deps_filter = [ "//third_party/icu:icudata" ]
diff --git a/ios/chrome/open_extension/resources/BUILD.gn b/ios/chrome/open_extension/resources/BUILD.gn index 8a76e2d..69dc0d6 100644 --- a/ios/chrome/open_extension/resources/BUILD.gn +++ b/ios/chrome/open_extension/resources/BUILD.gn
@@ -4,6 +4,26 @@ import("//build/config/ios/asset_catalog.gni") +group("resources") { + deps = [ + ":empty_pixel", + ":extension_icon", + ] +} + +# The extension only use one app icon. +# As a consequence, the asset compiler will not output any Assets.car file, +# which is not supported by the toolchain. +# To solve the issue, add an empty unused image. +imageset("empty_pixel") { + sources = [ + "empty_pixel.imageset/Contents.json", + "empty_pixel.imageset/empty_pixel.png", + "empty_pixel.imageset/empty_pixel@2x.png", + "empty_pixel.imageset/empty_pixel@3x.png", + ] +} + appiconset("extension_icon") { sources = [ "ExtensionIcon.appiconset/Contents.json",
diff --git a/ios/chrome/open_extension/resources/empty_pixel.imageset/Contents.json b/ios/chrome/open_extension/resources/empty_pixel.imageset/Contents.json new file mode 100644 index 0000000..fbe7a11 --- /dev/null +++ b/ios/chrome/open_extension/resources/empty_pixel.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "empty_pixel.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "empty_pixel@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "empty_pixel@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/open_extension/resources/empty_pixel.imageset/empty_pixel.png b/ios/chrome/open_extension/resources/empty_pixel.imageset/empty_pixel.png new file mode 100644 index 0000000..56082fd --- /dev/null +++ b/ios/chrome/open_extension/resources/empty_pixel.imageset/empty_pixel.png Binary files differ
diff --git a/ios/chrome/open_extension/resources/empty_pixel.imageset/empty_pixel@2x.png b/ios/chrome/open_extension/resources/empty_pixel.imageset/empty_pixel@2x.png new file mode 100644 index 0000000..9ad338972 --- /dev/null +++ b/ios/chrome/open_extension/resources/empty_pixel.imageset/empty_pixel@2x.png Binary files differ
diff --git a/ios/chrome/open_extension/resources/empty_pixel.imageset/empty_pixel@3x.png b/ios/chrome/open_extension/resources/empty_pixel.imageset/empty_pixel@3x.png new file mode 100644 index 0000000..a55704cd --- /dev/null +++ b/ios/chrome/open_extension/resources/empty_pixel.imageset/empty_pixel@3x.png Binary files differ
diff --git a/ios/chrome/open_extension/strings/resources/ios_open_extension_chromium_strings_hi.xtb b/ios/chrome/open_extension/strings/resources/ios_open_extension_chromium_strings_hi.xtb index ee4ce222..4d034d5c 100644 --- a/ios/chrome/open_extension/strings/resources/ios_open_extension_chromium_strings_hi.xtb +++ b/ios/chrome/open_extension/strings/resources/ios_open_extension_chromium_strings_hi.xtb
@@ -1,5 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hi"> +<translation id="6495005293969013988">Chromium में खोलें</translation> <translation id="6965382102122355670">ठीक है</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/search_widget_extension/strings/resources/ios_search_widget_extension_chromium_strings_hi.xtb b/ios/chrome/search_widget_extension/strings/resources/ios_search_widget_extension_chromium_strings_hi.xtb index b9fef71..c36f6ff 100644 --- a/ios/chrome/search_widget_extension/strings/resources/ios_search_widget_extension_chromium_strings_hi.xtb +++ b/ios/chrome/search_widget_extension/strings/resources/ios_search_widget_extension_chromium_strings_hi.xtb
@@ -2,4 +2,5 @@ <!DOCTYPE translationbundle> <translationbundle lang="hi"> <translation id="7091575783311734770">क्रोमियम - झटपट कार्रवाइयां</translation> +<translation id="8886794733440832930">इस विजेट का इस्तेमाल जारी रखने के लिए, स्क्रीन पर सबसे नीचे मौजूद, 'बदलाव करें' और फिर + पर टैप करें. इसके बाद, Chromium पर जाएं और 'तेज़ कार्रवाइयां' को चुनें.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/search_widget_extension/strings/resources/ios_search_widget_extension_google_chrome_strings_hi.xtb b/ios/chrome/search_widget_extension/strings/resources/ios_search_widget_extension_google_chrome_strings_hi.xtb index 0a9e1d04..f8d0f73 100644 --- a/ios/chrome/search_widget_extension/strings/resources/ios_search_widget_extension_google_chrome_strings_hi.xtb +++ b/ios/chrome/search_widget_extension/strings/resources/ios_search_widget_extension_google_chrome_strings_hi.xtb
@@ -2,4 +2,5 @@ <!DOCTYPE translationbundle> <translationbundle lang="hi"> <translation id="1848444672771235816">Chrome - झटपट कार्रवाइयां</translation> +<translation id="6834084925134176532">इस विजेट का इस्तेमाल जारी रखने के लिए, स्क्रीन पर सबसे नीचे मौजूद, 'बदलाव करें' और फिर + पर टैप करें. इसके बाद, Chrome पर जाएं और 'तेज़ कार्रवाइयां' को चुनें.</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index 4a376f45..fb8a66b 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -280,7 +280,7 @@ "//ios/chrome/browser/ssl:unit_tests", "//ios/chrome/browser/store_kit:unit_tests", "//ios/chrome/browser/supervised_user:unit_tests", - "//ios/chrome/browser/sync:unit_tests", + "//ios/chrome/browser/sync/model:unit_tests", "//ios/chrome/browser/tab_insertion/model:unit_tests", "//ios/chrome/browser/tabs:unit_tests", "//ios/chrome/browser/tabs/inactive_tabs:unit_tests", @@ -425,6 +425,7 @@ "//ios/chrome/browser/ui/tabs:unit_tests", "//ios/chrome/browser/ui/toolbar:unit_tests", "//ios/chrome/browser/ui/toolbar/fullscreen:unit_tests", + "//ios/chrome/browser/ui/unit_conversion:unit_tests", "//ios/chrome/browser/ui/voice:unit_tests", "//ios/chrome/browser/ui/whats_new/cells:unit_tests", "//ios/chrome/browser/ui/whats_new/data_source:unit_tests",
diff --git a/ios/chrome/test/app/BUILD.gn b/ios/chrome/test/app/BUILD.gn index aaaeafa..6ed5b3d 100644 --- a/ios/chrome/test/app/BUILD.gn +++ b/ios/chrome/test/app/BUILD.gn
@@ -81,7 +81,7 @@ "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/signin:fake_system_identity_manager", "//ios/chrome/browser/signin:system_identity_manager", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/synced_sessions", "//ios/chrome/browser/tabs", "//ios/chrome/browser/ui/authentication",
diff --git a/ios/chrome/test/app/signin_test_util.mm b/ios/chrome/test/app/signin_test_util.mm index 6bd18de8..d76d356c 100644 --- a/ios/chrome/test/app/signin_test_util.mm +++ b/ios/chrome/test/app/signin_test_util.mm
@@ -26,7 +26,7 @@ #import "ios/chrome/browser/signin/fake_system_identity_manager.h" #import "ios/chrome/browser/signin/gaia_auth_fetcher_ios.h" #import "ios/chrome/browser/signin/system_identity_manager.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/authentication_flow.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view.h" #import "ios/chrome/browser/ui/authentication/history_sync/history_sync_utils.h"
diff --git a/ios/chrome/test/app/sync_test_util.mm b/ios/chrome/test/app/sync_test_util.mm index 494aa0b..be58778 100644 --- a/ios/chrome/test/app/sync_test_util.mm +++ b/ios/chrome/test/app/sync_test_util.mm
@@ -43,8 +43,8 @@ #import "ios/chrome/browser/autofill/personal_data_manager_factory.h" #import "ios/chrome/browser/history/history_service_factory.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" -#import "ios/chrome/browser/sync/device_info_sync_service_factory.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/device_info_sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/synced_sessions/distant_session.h" #import "ios/chrome/browser/synced_sessions/distant_tab.h" #import "ios/chrome/test/app/chrome_test_util.h"
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn index bdae284..49a794c 100644 --- a/ios/chrome/test/earl_grey/BUILD.gn +++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -111,7 +111,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/shared/ui/util:eg_app_support+eg2", "//ios/chrome/browser/signin:fake_system_identity", - "//ios/chrome/browser/sync", + "//ios/chrome/browser/sync/model", "//ios/chrome/browser/translate:eg_app_support+eg2", "//ios/chrome/browser/ui/authentication:eg_app_support+eg2", "//ios/chrome/browser/ui/authentication/cells",
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm index 56c13d9e..578aa0f 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -55,7 +55,7 @@ #import "ios/chrome/browser/shared/ui/symbols/symbols.h" #import "ios/chrome/browser/shared/ui/util/rtl_geometry.h" #import "ios/chrome/browser/signin/fake_system_identity.h" -#import "ios/chrome/browser/sync/sync_service_factory.h" +#import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_feature.h" #import "ios/chrome/browser/ui/popup_menu/overflow_menu/feature_flags.h" #import "ios/chrome/browser/unified_consent/unified_consent_service_factory.h"
diff --git a/ios/chrome/test/providers/unit_conversion/BUILD.gn b/ios/chrome/test/providers/unit_conversion/BUILD.gn index 5f86224..895c242 100644 --- a/ios/chrome/test/providers/unit_conversion/BUILD.gn +++ b/ios/chrome/test/providers/unit_conversion/BUILD.gn
@@ -3,7 +3,10 @@ # found in the LICENSE file. source_set("unit_conversion") { - sources = [ "test_unit_conversion.mm" ] + sources = [ + "test_unit_conversion.h", + "test_unit_conversion.mm", + ] deps = [ "//base", "//ios/public/provider/chrome/browser/unit_conversion:unit_conversion_api",
diff --git a/ios/chrome/test/providers/unit_conversion/test_unit_conversion.h b/ios/chrome/test/providers/unit_conversion/test_unit_conversion.h new file mode 100644 index 0000000..ecbbba7 --- /dev/null +++ b/ios/chrome/test/providers/unit_conversion/test_unit_conversion.h
@@ -0,0 +1,29 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_TEST_PROVIDERS_UNIT_CONVERSION_TEST_UNIT_CONVERSION_H_ +#define IOS_CHROME_TEST_PROVIDERS_UNIT_CONVERSION_TEST_UNIT_CONVERSION_H_ + +#import "ios/public/provider/chrome/browser/unit_conversion/unit_conversion_api.h" + +// A protocol to replace the Unit Conversion providers in tests. +@protocol UnitConversionProviderTestHelper + +- (NSUnit*)sourceUnitFromUnitType:(ios::provider::UnitType)unit_type; +- (NSUnit*)targetUnitFromUnit:(NSUnit*)unit; + +@end + +namespace ios::provider { +namespace test { + +// Sets the global helper for the tests. +// Resets it if `helper` is nil. +void SetUnitConversionProviderTestHelper( + id<UnitConversionProviderTestHelper> helper); + +} // namespace test +} // namespace ios::provider + +#endif // IOS_CHROME_TEST_PROVIDERS_UNIT_CONVERSION_TEST_UNIT_CONVERSION_H_
diff --git a/ios/chrome/test/providers/unit_conversion/test_unit_conversion.mm b/ios/chrome/test/providers/unit_conversion/test_unit_conversion.mm index 09e8956..99973cf 100644 --- a/ios/chrome/test/providers/unit_conversion/test_unit_conversion.mm +++ b/ios/chrome/test/providers/unit_conversion/test_unit_conversion.mm
@@ -2,12 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#import "ios/chrome/test/providers/unit_conversion/test_unit_conversion.h" + #import "ios/public/provider/chrome/browser/unit_conversion/unit_conversion_api.h" +namespace { +id<UnitConversionProviderTestHelper> g_unit_conversion_provider_test_helper; +} + namespace ios::provider { NSUnit* GetDefaultUnitForType(UnitType unitType) { - return nil; + return + [g_unit_conversion_provider_test_helper sourceUnitFromUnitType:unitType]; } std::vector<UnitType> GetSupportedUnitTypes() { @@ -15,7 +22,7 @@ } NSUnit* GetDefaultTargetUnit(NSUnit* unit) { - return nil; + return [g_unit_conversion_provider_test_helper targetUnitFromUnit:unit]; } const NSArray<NSArray<NSUnit*>*>* GetUnitsForType(UnitType unitType) { @@ -26,4 +33,13 @@ return nil; } +namespace test { + +void SetUnitConversionProviderTestHelper( + id<UnitConversionProviderTestHelper> helper) { + g_unit_conversion_provider_test_helper = helper; +} + +} // namespace test + } // namespace ios::provider
diff --git a/ios/components/security_interstitials/safe_browsing/safe_browsing_service_impl.mm b/ios/components/security_interstitials/safe_browsing/safe_browsing_service_impl.mm index aad04fc..a68b655 100644 --- a/ios/components/security_interstitials/safe_browsing/safe_browsing_service_impl.mm +++ b/ios/components/security_interstitials/safe_browsing/safe_browsing_service_impl.mm
@@ -156,11 +156,16 @@ safe_browsing::HashRealTimeService* hash_real_time_service = client->GetHashRealTimeService(); + // TODO(crbug.com/1468377): Pass through `variations_service` in + // `GetCountryCode` call. safe_browsing::hash_realtime_utils::HashRealTimeSelection hash_real_time_selection = safe_browsing::hash_realtime_utils::DetermineHashRealTimeSelection( web_state->GetBrowserState()->IsOffTheRecord(), - pref_change_registrar_->prefs(), /*log_usage_histograms=*/true); + pref_change_registrar_->prefs(), + safe_browsing::hash_realtime_utils::GetCountryCode( + /*variations_service=*/nullptr), + /*log_usage_histograms=*/true); return std::make_unique<safe_browsing::SafeBrowsingUrlCheckerImpl>( request_destination, url_checker_delegate, web_state->GetWeakPtr(),
diff --git a/ios/components/security_interstitials/safe_browsing/safe_browsing_service_unittest.mm b/ios/components/security_interstitials/safe_browsing/safe_browsing_service_unittest.mm index 8eeb689..025b8cf 100644 --- a/ios/components/security_interstitials/safe_browsing/safe_browsing_service_unittest.mm +++ b/ios/components/security_interstitials/safe_browsing/safe_browsing_service_unittest.mm
@@ -622,7 +622,7 @@ kHashRealTimeCheck, client.performed_check()); histogram_tester.ExpectBucketCount( - "SafeBrowsing.HPRT.Ineligible.IneligibleForSession", + "SafeBrowsing.HPRT.Ineligible.IneligibleForSessionOrLocation", /*sample=*/false, /*expected_bucket_count=*/1); @@ -651,7 +651,7 @@ kHashDatabaseCheck, client.performed_check()); histogram_tester.ExpectBucketCount( - "SafeBrowsing.HPRT.Ineligible.IneligibleForSession", + "SafeBrowsing.HPRT.Ineligible.IneligibleForSessionOrLocation", /*sample=*/true, /*expected_bucket_count=*/1);
diff --git a/ios/web/annotations/annotations_inttest.mm b/ios/web/annotations/annotations_inttest.mm index 007d192..6da2ab3 100644 --- a/ios/web/annotations/annotations_inttest.mm +++ b/ios/web/annotations/annotations_inttest.mm
@@ -82,6 +82,7 @@ CGRect rect, const std::string& data) override { clicks_++; + click_data_ = data; } const std::string& extracted_text() const { return extracted_text_; } @@ -90,10 +91,11 @@ int clicks() const { return clicks_; } int seq_id() const { return seq_id_; } const base::Value::Dict& metadata() const { return metadata_; } + const std::string& click_data() const { return click_data_; } void SetAnnotations(int count) { annotations_ = count; } private: - std::string extracted_text_; + std::string extracted_text_, click_data_; int successes_, annotations_, clicks_, seq_id_; base::Value::Dict metadata_; }; @@ -185,8 +187,9 @@ for (NSString* type in items) { for (NSString* item in items[type]) { NSRange range = [source rangeOfString:item]; - annotations.Append( - web::ConvertMatchToAnnotation(source, range, @"data", type)); + annotations.Append(web::ConvertMatchToAnnotation( + source, range, [NSString stringWithFormat:@"%@-%@", type, item], + type)); } } auto* manager = AnnotationsTextManager::FromWebState(web_state()); @@ -532,4 +535,52 @@ CheckHtml(html); } +// Tests on (simulated) navigation in web state. +TEST_F(AnnotationTextManagerTest, NavigationClearsAnnotation) { + std::string text1 = "<html><body>" + "<p>text</p>" + "<p>annotation</p>" + "<p>text</p>" + "</body></html>"; + + LoadHtmlAndExtractText(text1); + NSString* source = base::SysUTF8ToNSString(observer()->extracted_text()); + CreateAndApplyAnnotationsWithTypes( + source, + @{@"type1" : @[ @"annotation" ]}, observer()->seq_id()); + ClickAnnotation(0); + ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{ + return observer()->clicks() == 1; + })); + ASSERT_TRUE(observer()->click_data() == "type1-annotation"); + + std::string text2 = "<html><body>" + "<p>bla</p>" + "<p>blurb</p>" + "<p>bla</p>" + "</body></html>"; + LoadHtmlAndExtractText(text2); + source = base::SysUTF8ToNSString(observer()->extracted_text()); + CreateAndApplyAnnotationsWithTypes( + source, + @{@"type2" : @[ @"blurb" ]}, observer()->seq_id()); + ClickAnnotation(0); + ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{ + return observer()->clicks() == 2; + })); + ASSERT_TRUE(observer()->click_data() == "type2-blurb"); + + // Now navigate back to original text. + LoadHtmlAndExtractText(text1); + source = base::SysUTF8ToNSString(observer()->extracted_text()); + CreateAndApplyAnnotationsWithTypes( + source, + @{@"type1" : @[ @"annotation" ]}, observer()->seq_id()); + ClickAnnotation(0); + ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{ + return observer()->clicks() == 3; + })); + ASSERT_TRUE(observer()->click_data() == "type1-annotation"); +} + } // namespace web
diff --git a/ios/web/annotations/resources/annotations.ts b/ios/web/annotations/resources/annotations.ts index f913a2c7..8ab435b 100644 --- a/ios/web/annotations/resources/annotations.ts +++ b/ios/web/annotations/resources/annotations.ts
@@ -183,6 +183,11 @@ * @param seqId - id of extracted text to pass back. */ function extractText(maxChars: number, seqId: number): void { + // If page is reloaded, remove decorations because the external cache + // will need to be rebuilt with new data. + if (decorations.length) { + removeDecorations(); + } sendWebKitMessage('annotations', { command: 'annotations.extractedText', text: getPageText(maxChars),
diff --git a/ios_internal b/ios_internal index e875678..d25fde4 160000 --- a/ios_internal +++ b/ios_internal
@@ -1 +1 @@ -Subproject commit e875678118f79bdac3c7bd75be7fb79360d77757 +Subproject commit d25fde46a7b3f1ac5863c2fd69c3e0898a87b8a3
diff --git a/mojo/core/BUILD.gn b/mojo/core/BUILD.gn index 36d2d8ba..76cf546 100644 --- a/mojo/core/BUILD.gn +++ b/mojo/core/BUILD.gn
@@ -187,6 +187,8 @@ ] } + configs += [ "//build/config/compiler:wexit_time_destructors" ] + defines = [] if (invoker.for_shared_library) { defines += [ "MOJO_CORE_SHARED_LIBRARY" ] @@ -253,6 +255,7 @@ shared_library("shared_library") { output_name = "mojo_core" sources = [ "mojo_core.cc" ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] defines = [ "MOJO_CORE_SHARED_LIBRARY" ] deps = [ ":impl_for_shared_library",
diff --git a/mojo/core/embedder/BUILD.gn b/mojo/core/embedder/BUILD.gn index df6f3e93..90cf7945 100644 --- a/mojo/core/embedder/BUILD.gn +++ b/mojo/core/embedder/BUILD.gn
@@ -16,6 +16,8 @@ "scoped_ipc_support.cc", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + defines = [ "IS_MOJO_CORE_EMBEDDER_IMPL" ] public_deps = [ @@ -35,6 +37,8 @@ component("features") { output_name = "mojo_core_embedder_features" + configs += [ "//build/config/compiler:wexit_time_destructors" ] + defines = [ "IS_MOJO_CORE_EMBEDDER_FEATURES_IMPL" ] public = [ "features.h" ]
diff --git a/mojo/core/mojo_core.cc b/mojo/core/mojo_core.cc index 2aadd3e6..51219b5 100644 --- a/mojo/core/mojo_core.cc +++ b/mojo/core/mojo_core.cc
@@ -78,6 +78,7 @@ class GlobalStateInitializer { public: GlobalStateInitializer() = default; + ~GlobalStateInitializer() = delete; bool Initialize(int argc, const char* const* argv) { if (initialized_) @@ -158,9 +159,9 @@ argv = options->argv; } - static GlobalStateInitializer global_state_initializer; + static base::NoDestructor<GlobalStateInitializer> global_state_initializer; const bool was_global_state_already_initialized = - !global_state_initializer.Initialize(argc, argv); + !global_state_initializer->Initialize(argc, argv); if (!should_initialize_ipc_support) { if (was_global_state_already_initialized)
diff --git a/mojo/core/ports/BUILD.gn b/mojo/core/ports/BUILD.gn index 0728285..40aa1c3 100644 --- a/mojo/core/ports/BUILD.gn +++ b/mojo/core/ports/BUILD.gn
@@ -30,6 +30,8 @@ "user_message.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + defines = [ "IS_MOJO_CORE_PORTS_IMPL" ] if (target_os == "chromeos") {
diff --git a/mojo/public/c/system/BUILD.gn b/mojo/public/c/system/BUILD.gn index aefb714..27d1f88 100644 --- a/mojo/public/c/system/BUILD.gn +++ b/mojo/public/c/system/BUILD.gn
@@ -7,6 +7,8 @@ sources = [ "thunks.cc" ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + defines = [ "MOJO_SYSTEM_IMPLEMENTATION" ] public_deps = [ ":headers" ]
diff --git a/mojo/public/c/system/thunks.cc b/mojo/public/c/system/thunks.cc index 56f37ed..f0c568e1 100644 --- a/mojo/public/c/system/thunks.cc +++ b/mojo/public/c/system/thunks.cc
@@ -13,6 +13,7 @@ #include "base/compiler_specific.h" #include "base/files/file_path.h" #include "base/logging.h" +#include "base/no_destructor.h" #include "base/notreached.h" #include "base/strings/string_piece.h" #include "build/build_config.h" @@ -68,7 +69,7 @@ CoreLibraryInitializer() = default; CoreLibraryInitializer(const CoreLibraryInitializer&) = delete; CoreLibraryInitializer& operator=(const CoreLibraryInitializer&) = delete; - ~CoreLibraryInitializer() = default; + ~CoreLibraryInitializer() = delete; MojoResult LoadLibrary(base::FilePath library_path) { #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || \ @@ -152,7 +153,7 @@ extern "C" { MojoResult MojoInitialize(const struct MojoInitializeOptions* options) { - static mojo::CoreLibraryInitializer initializer; + static base::NoDestructor<mojo::CoreLibraryInitializer> initializer; base::StringPiece library_path_utf8; if (options) { @@ -162,7 +163,7 @@ options->mojo_core_path_length); } - MojoResult load_result = initializer.LoadLibrary( + MojoResult load_result = initializer->LoadLibrary( base::FilePath::FromUTF8Unsafe(library_path_utf8)); if (load_result != MOJO_RESULT_OK) return load_result;
diff --git a/mojo/public/cpp/base/BUILD.gn b/mojo/public/cpp/base/BUILD.gn index ac56847..29ae1741 100644 --- a/mojo/public/cpp/base/BUILD.gn +++ b/mojo/public/cpp/base/BUILD.gn
@@ -14,6 +14,8 @@ "shared_memory_utils.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + defines = [ "IS_MOJO_BASE_IMPL" ] public_deps = [ @@ -64,6 +66,8 @@ ] } + configs += [ "//build/config/compiler:wexit_time_destructors" ] + defines = [ "IS_MOJO_BASE_TRAITS_IMPL" ] public_deps = [ @@ -120,6 +124,8 @@ "version_mojom_traits.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + defines = [ "IS_MOJO_BASE_SHARED_TRAITS_IMPL" ] public_deps = [
diff --git a/mojo/public/cpp/bindings/BUILD.gn b/mojo/public/cpp/bindings/BUILD.gn index 6f7b3d7f..6a361e3 100644 --- a/mojo/public/cpp/bindings/BUILD.gn +++ b/mojo/public/cpp/bindings/BUILD.gn
@@ -125,6 +125,8 @@ "//mojo/public/cpp/system", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + if (enable_ipc_fuzzer) { all_dependent_configs = [ "//tools/ipc_fuzzer:ipc_fuzzer_config" ] } @@ -254,6 +256,8 @@ "//mojo/core/embedder", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + defines = [ "IS_MOJO_CPP_BINDINGS_IMPL" ] } @@ -295,6 +299,8 @@ "string_traits_wtf.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + defines = [ "IS_MOJO_CPP_BINDINGS_BASE_IMPL" ] public_deps = [
diff --git a/mojo/public/cpp/platform/BUILD.gn b/mojo/public/cpp/platform/BUILD.gn index 5cfcc0f..f346fd5 100644 --- a/mojo/public/cpp/platform/BUILD.gn +++ b/mojo/public/cpp/platform/BUILD.gn
@@ -76,5 +76,7 @@ public += [ "named_platform_channel.h" ] } + configs += [ "//build/config/compiler:wexit_time_destructors" ] + defines = [ "IS_MOJO_CPP_PLATFORM_IMPL" ] }
diff --git a/mojo/public/cpp/system/BUILD.gn b/mojo/public/cpp/system/BUILD.gn index 0bdff51b..6321c8d 100644 --- a/mojo/public/cpp/system/BUILD.gn +++ b/mojo/public/cpp/system/BUILD.gn
@@ -65,5 +65,7 @@ "//mojo/public/cpp/platform", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + defines = [ "MOJO_CPP_SYSTEM_IMPLEMENTATION" ] }
diff --git a/net/BUILD.gn b/net/BUILD.gn index 2634c9b..d118c5e 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -2956,6 +2956,7 @@ "//net/tools/huffman_trie:huffman_trie_generator_sources", "//testing/gmock", "//testing/gtest", + "//third_party/anonymous_tokens:anonymous_tokens_tests", "//third_party/protobuf:protobuf_lite", "//third_party/zlib", "//url",
diff --git a/net/disk_cache/simple/post_doom_waiter.cc b/net/disk_cache/simple/post_doom_waiter.cc index aab714fa..a407216 100644 --- a/net/disk_cache/simple/post_doom_waiter.cc +++ b/net/disk_cache/simple/post_doom_waiter.cc
@@ -27,14 +27,14 @@ SimplePostDoomWaiterTable::~SimplePostDoomWaiterTable() = default; void SimplePostDoomWaiterTable::OnDoomStart(uint64_t entry_hash) { - DCHECK_EQ(0u, entries_pending_doom_.count(entry_hash)); - entries_pending_doom_.insert( + auto [it, inserted] = entries_pending_doom_.insert( std::make_pair(entry_hash, std::vector<SimplePostDoomWaiter>())); + CHECK(inserted); } void SimplePostDoomWaiterTable::OnDoomComplete(uint64_t entry_hash) { - DCHECK_EQ(1u, entries_pending_doom_.count(entry_hash)); auto it = entries_pending_doom_.find(entry_hash); + CHECK(it != entries_pending_doom_.end()); std::vector<SimplePostDoomWaiter> to_handle_waiters; to_handle_waiters.swap(it->second); entries_pending_doom_.erase(it);
diff --git a/net/disk_cache/simple/simple_entry_impl.cc b/net/disk_cache/simple/simple_entry_impl.cc index 8c8714e..c3685365 100644 --- a/net/disk_cache/simple/simple_entry_impl.cc +++ b/net/disk_cache/simple/simple_entry_impl.cc
@@ -212,8 +212,8 @@ // If we are optimistically returning before a preceeding doom, we need to // wait for that IO, about which we will be notified externally. if (optimistic_create_pending_doom_state_ != CREATE_NORMAL) { - DCHECK_EQ(CREATE_OPTIMISTIC_PENDING_DOOM, - optimistic_create_pending_doom_state_); + CHECK_EQ(CREATE_OPTIMISTIC_PENDING_DOOM, + optimistic_create_pending_doom_state_); state_ = STATE_IO_PENDING; } } else { @@ -256,7 +256,7 @@ EntryResultCallback())); // The post-doom stuff should go through CreateEntry, not here. - DCHECK_EQ(CREATE_NORMAL, optimistic_create_pending_doom_state_); + CHECK_EQ(CREATE_NORMAL, optimistic_create_pending_doom_state_); } else { pending_operations_.push(SimpleEntryOperation::OpenOrCreateOperation( this, index_state, SimpleEntryOperation::ENTRY_NEEDS_CALLBACK, @@ -285,9 +285,9 @@ if (optimistic_create_pending_doom_state_ == CREATE_NORMAL) { post_doom_waiting_ = backend_->OnDoomStart(entry_hash_); } else { - DCHECK_EQ(STATE_IO_PENDING, state_); - DCHECK_EQ(CREATE_OPTIMISTIC_PENDING_DOOM, - optimistic_create_pending_doom_state_); + CHECK_EQ(STATE_IO_PENDING, state_); + CHECK_EQ(CREATE_OPTIMISTIC_PENDING_DOOM, + optimistic_create_pending_doom_state_); // If we are in this state, we went ahead with making the entry even // though the backend was already keeping track of a doom, so it can't // keep track of ours. So we delay notifying it until @@ -308,13 +308,13 @@ } void SimpleEntryImpl::SetCreatePendingDoom() { - DCHECK_EQ(CREATE_NORMAL, optimistic_create_pending_doom_state_); + CHECK_EQ(CREATE_NORMAL, optimistic_create_pending_doom_state_); optimistic_create_pending_doom_state_ = CREATE_OPTIMISTIC_PENDING_DOOM; } void SimpleEntryImpl::NotifyDoomBeforeCreateComplete() { - DCHECK_EQ(STATE_IO_PENDING, state_); - DCHECK_NE(CREATE_NORMAL, optimistic_create_pending_doom_state_); + CHECK_EQ(STATE_IO_PENDING, state_); + CHECK_NE(CREATE_NORMAL, optimistic_create_pending_doom_state_); if (backend_.get() && optimistic_create_pending_doom_state_ == CREATE_OPTIMISTIC_PENDING_DOOM_FOLLOWED_BY_DOOM) post_doom_waiting_ = backend_->OnDoomStart(entry_hash_);
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index 4ef3db4..1bc7c7b1 100644 --- a/net/http/transport_security_state_static.pins +++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2023-09-28 13:00 UTC +# Last updated: 2023-09-29 13:06 UTC PinsListTimestamp -1695906028 +1695992777 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json index 4012cd2..82901f3 100644 --- a/net/http/transport_security_state_static_pins.json +++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@ // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets' // refer to, and the timestamp at which the pins list was last updated. // -// Last updated: 2023-09-28 13:00 UTC +// Last updated: 2023-09-29 13:06 UTC // { "pinsets": [
diff --git a/net/third_party/quiche/BUILD.gn b/net/third_party/quiche/BUILD.gn index 8072b574..09a30c1 100644 --- a/net/third_party/quiche/BUILD.gn +++ b/net/third_party/quiche/BUILD.gn
@@ -426,10 +426,6 @@ visibility = [ ":quiche_tests" ] testonly = true sources = [ - "src/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus2048_example.binarypb", - "src/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus2048_example_2.binarypb", - "src/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus3072_example.binarypb", - "src/quiche/common/anonymous_tokens/testdata/strong_rsa_modulus4096_example.binarypb", "src/quiche/common/platform/api/testdir/README.md", "src/quiche/common/platform/api/testdir/a/b/c/d/e", "src/quiche/common/platform/api/testdir/a/subdir/testfile", @@ -444,13 +440,6 @@ testonly = true sources = [ "src/quiche/binary_http/binary_http_message_test.cc", - "src/quiche/blind_sign_auth/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client_test.cc", - "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters_test.cc", - "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/at_crypto_utils_test.cc", - "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blind_signer_test.cc", - "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_blinder_test.cc", - "src/quiche/blind_sign_auth/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier_test.cc", - "src/quiche/blind_sign_auth/anonymous_tokens/cpp/shared/proto_utils_test.cc", "src/quiche/blind_sign_auth/blind_sign_auth_test.cc", "src/quiche/blind_sign_auth/cached_blind_sign_auth_test.cc", "src/quiche/common/capsule_test.cc", @@ -696,10 +685,7 @@ "src/quiche/spdy/core/spdy_protocol_test.cc", ] - data = [ - "src/quiche/common/platform/api/testdir/", - "src/quiche/common/anonymous_tokens/testdata/", - ] + data = [ "src/quiche/common/platform/api/testdir/" ] configs += [ ":quiche_internal_config" ] public_configs = [ ":quiche_config" ]
diff --git a/services/tracing/public/cpp/perfetto/producer_client.cc b/services/tracing/public/cpp/perfetto/producer_client.cc index 6073bc5..519c4c31 100644 --- a/services/tracing/public/cpp/perfetto/producer_client.cc +++ b/services/tracing/public/cpp/perfetto/producer_client.cc
@@ -265,7 +265,7 @@ } } - LOG(DFATAL) << "Invalid data source ID."; + DLOG(ERROR) << "Invalid data source ID."; } void ProducerClient::Flush(uint64_t flush_request_id,
diff --git a/skia/BUILD.gn b/skia/BUILD.gn index 41dcc44..0b415e3d 100644 --- a/skia/BUILD.gn +++ b/skia/BUILD.gn
@@ -76,6 +76,7 @@ "SK_DISABLE_LEGACY_INIT_DECODERS", "SK_DISABLE_LEGACY_GRDIRECTCONTEXT_FLUSH", "SK_DISABLE_LEGACY_GRDIRECTCONTEXT_BOOLS", + "SK_DISABLE_LEGACY_GL_GRDIRECTCONTEXT_FACTORIES", ] include_dirs = [
diff --git a/styleguide/c++/c++-features.md b/styleguide/c++/c++-features.md index 9872d03..40974f6 100644 --- a/styleguide/c++/c++-features.md +++ b/styleguide/c++/c++-features.md
@@ -1950,7 +1950,7 @@ **Description:** Returns a functor that provides overloads based on the functors passed to it **Documentation:** -[nullability.h](https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/functional/overload.h) +[overload.h](https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/functional/overload.h) **Notes:** *** promo
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 90d80ee7..1d2140a4 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -4141,10 +4141,22 @@ "ConsolidatedIPCForProxyCreation": [ { "platforms": [ - "android" + "android", + "chromeos", + "chromeos_lacros", + "ios", + "linux", + "mac", + "windows" ], "experiments": [ { + "name": "Enabled_non_android_20230928", + "enable_features": [ + "ConsolidatedIPCForProxyCreation" + ] + }, + { "name": "Enabled_20230323", "enable_features": [ "ConsolidatedIPCForProxyCreation" @@ -6806,11 +6818,11 @@ ], "experiments": [ { - "name": "EnabledF-4", + "name": "EnabledF-5", "params": { "close_should_proceed": "true", "default_browser_variant": "new", - "group_name": "EnabledF-4", + "group_name": "EnabledF-5", "signin_promo_variant": "sign-in", "with_default_browser_step": "yes" }, @@ -9182,6 +9194,21 @@ ] } ], + "InvalidateLocalSurfaceIdPreCommit": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Disabled_EmergencyKillSwitch", + "disable_features": [ + "InvalidateLocalSurfaceIdPreCommit" + ] + } + ] + } + ], "JourneysAndroidPreStable": [ { "platforms": [ @@ -10545,9 +10572,10 @@ ], "experiments": [ { - "name": "Redesigned_Quests_ML_20230913", + "name": "Redesigned_Quests_MR_ML_20230929", "params": { "NtpHistoryClustersModuleCategoriesBoostlistParam": "/m/testparsinglogicboost,/m/testparsinglogicboost-2", + "NtpModulesOrderParam": "drive", "NtpRealboxWidthBehaviorParam": "wide" }, "enable_features": [ @@ -10556,6 +10584,7 @@ "NtpHistoryClustersModule", "NtpHistoryClustersModuleCategories", "NtpHistoryClustersModuleUseModelRanking", + "NtpModulesOrder", "NtpModulesRedesigned", "NtpRealboxIsTall", "NtpRealboxWidthBehavior" @@ -12196,48 +12225,6 @@ ] } ], - "PerformanceControlsLaunch": [ - { - "platforms": [ - "chromeos", - "chromeos_lacros", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled_OptIn", - "params": { - "IPH_BatterySaverMode_availability": "any", - "IPH_BatterySaverMode_event_trigger": "name:battery_saver_info_triggered;comparator:<3;window:360;storage:360", - "IPH_BatterySaverMode_event_used": "name:battery_saver_info_shown;comparator:==0;window:7;storage:360", - "IPH_BatterySaverMode_session_rate": "==0", - "IPH_HighEfficiencyMode_availability": "any", - "IPH_HighEfficiencyMode_event_1": "name:high_efficiency_prompt_in_trigger;comparator:<3;window:360;storage:360", - "IPH_HighEfficiencyMode_event_trigger": "name:high_efficiency_prompt_in_trigger;comparator:<1;window:7;storage:360", - "IPH_HighEfficiencyMode_event_used": "name:high_efficiency_prompt_in_used;comparator:==0;window:360;storage:360", - "IPH_HighEfficiencyMode_session_rate": "any", - "IPH_PerformanceNewBadge_availability": "any", - "IPH_PerformanceNewBadge_event_trigger": "name:performance_new_badge_shown;comparator:<20;window:360;storage:360", - "IPH_PerformanceNewBadge_event_used": "name:performance_activated;comparator:<3;window:360;storage:360", - "IPH_PerformanceNewBadge_session_rate": "any", - "IPH_PerformanceNewBadge_session_rate_impact": "none", - "default_state": "false" - }, - "enable_features": [ - "BatterySaverModeAvailable", - "HighEfficiencyModeAvailable", - "IPH_BatterySaverMode", - "IPH_HighEfficiencyMode", - "IPH_PerformanceNewBadge", - "PageTimelineMonitor" - ], - "disable_features": [] - } - ] - } - ], "PerformanceControlsRound2Launch": [ { "platforms": [ @@ -14040,6 +14027,28 @@ ] } ], + "ResourceAttributionCPUMonitorLaunch": [ + { + "platforms": [ + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_20230925", + "params": { + "use_resource_attribution_cpu_monitor": "true" + }, + "enable_features": [ + "PageTimelineMonitor" + ] + } + ] + } + ], "RestoreSyncedPlaceholderTabs": [ { "platforms": [
diff --git a/third_party/angle b/third_party/angle index 1cab871..16651b6 160000 --- a/third_party/angle +++ b/third_party/angle
@@ -1 +1 @@ -Subproject commit 1cab871c220744402b887e73ff86aaf8f7f97fa0 +Subproject commit 16651b659829a3263d8065cda1b6f8d47ebb5518
diff --git a/third_party/anonymous_tokens/BUILD.gn b/third_party/anonymous_tokens/BUILD.gn new file mode 100644 index 0000000..ee2ba82 --- /dev/null +++ b/third_party/anonymous_tokens/BUILD.gn
@@ -0,0 +1,354 @@ +import("//third_party/protobuf/proto_library.gni") + +# TODO(awillia): Fix compilation issues without this and then remove. +config("anonymous_tokens_internal_config") { + cflags = [] + if (is_clang) { + cflags += [ + "-Wno-sign-compare", + "-Wno-c++11-narrowing", + ] + } +} + +config("anonymous_tokens_config") { + include_dirs = [ + "overrides", + "src", + ] +} + +source_set("anonymous_tokens_public_key_client") { + sources = [ + "src/anonymous_tokens/cpp/client/anonymous_tokens_public_key_client.cc", + "src/anonymous_tokens/cpp/client/anonymous_tokens_public_key_client.h", + ] + + public_configs = [ ":anonymous_tokens_config" ] + + deps = [ + ":proto_utils", + ":status_utils", + ] + public_deps = [ + ":anonymous_tokens_cc_proto", + "//third_party/abseil-cpp:absl", + ] +} +source_set("anonymous_tokens_rsa_bssa_client") { + sources = [ + "src/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.cc", + "src/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client.h", + ] + + public_configs = [ ":anonymous_tokens_config" ] + + deps = [ + ":anonymous_tokens_pb_openssl_converters", + ":crypto_utils", + ":rsa_blinder", + ":status_utils", + ] + public_deps = [ + ":anonymous_tokens_cc_proto", + ":proto_utils", + "//third_party/abseil-cpp:absl", + ] +} +source_set("anonymous_tokens_redemption_client") { + sources = [ + "src/anonymous_tokens/cpp/client/anonymous_tokens_redemption_client.cc", + "src/anonymous_tokens/cpp/client/anonymous_tokens_redemption_client.h", + ] + + configs += [ ":anonymous_tokens_internal_config" ] + public_configs = [ ":anonymous_tokens_config" ] + + deps = [ ":constants" ] + public_deps = [ + ":anonymous_tokens_cc_proto", + "//third_party/abseil-cpp:absl", + ] +} + +source_set("anonymous_tokens_pb_openssl_converters") { + sources = [ + "src/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.cc", + "src/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters.h", + ] + + configs += [ ":anonymous_tokens_internal_config" ] + public_configs = [ ":anonymous_tokens_config" ] + + deps = [ + ":anonymous_tokens_cc_proto", + ":constants", + ":crypto_utils", + ":status_utils", + "//third_party/abseil-cpp:absl", + "//third_party/boringssl", + ] + public_deps = [ + ":anonymous_tokens_cc_proto", + "//third_party/abseil-cpp:absl", + ] +} + +proto_library("anonymous_tokens_cc_proto") { + visibility = [ + ":*", + "//net/third_party/quiche:blind_sign_auth_proto", + "//net/third_party/quiche:blind_sign_auth_proto_gen", + ] + + sources = [ "src/anonymous_tokens/proto/anonymous_tokens.proto" ] + + component_build_force_source_set = true + cc_generator_options = "lite=true:" + + proto_in_dir = "src" +} + +source_set("proto_utils") { + sources = [ + "src/anonymous_tokens/cpp/shared/proto_utils.cc", + "src/anonymous_tokens/cpp/shared/proto_utils.h", + ] + + public_configs = [ ":anonymous_tokens_config" ] + + public_deps = [ + ":anonymous_tokens_cc_proto", + "//third_party/abseil-cpp:absl", + ] +} +source_set("status_utils") { + sources = [ "src/anonymous_tokens/cpp/shared/status_utils.h" ] + + public_configs = [ ":anonymous_tokens_config" ] + + public_deps = [ "//third_party/abseil-cpp:absl" ] +} + +source_set("blinder") { + sources = [ "src/anonymous_tokens/cpp/crypto/blinder.h" ] + public_configs = [ ":anonymous_tokens_config" ] + public_deps = [ "//third_party/abseil-cpp:absl" ] +} + +source_set("constants") { + sources = [ "src/anonymous_tokens/cpp/crypto/constants.h" ] + public_configs = [ ":anonymous_tokens_config" ] + public_deps = [ "//third_party/abseil-cpp:absl" ] +} + +source_set("crypto_utils") { + sources = [ + "src/anonymous_tokens/cpp/crypto/crypto_utils.cc", + "src/anonymous_tokens/cpp/crypto/crypto_utils.h", + ] + configs += [ ":anonymous_tokens_internal_config" ] + public_configs = [ ":anonymous_tokens_config" ] + deps = [ + ":constants", + ":status_utils", + ] + public_deps = [ + ":anonymous_tokens_cc_proto", + "//third_party/abseil-cpp:absl", + "//third_party/boringssl", + ] +} + +source_set("rsa_blinder") { + sources = [ + "src/anonymous_tokens/cpp/crypto/rsa_blinder.cc", + "src/anonymous_tokens/cpp/crypto/rsa_blinder.h", + ] + configs += [ ":anonymous_tokens_internal_config" ] + public_configs = [ ":anonymous_tokens_config" ] + deps = [ + ":blinder", + ":constants", + ":crypto_utils", + ":status_utils", + ] + public_deps = [ + ":anonymous_tokens_cc_proto", + "//third_party/abseil-cpp:absl", + "//third_party/boringssl", + ] +} + +source_set("blind_signer") { + sources = [ "src/anonymous_tokens/cpp/crypto/blind_signer.h" ] + public_configs = [ ":anonymous_tokens_config" ] + public_deps = [ "//third_party/abseil-cpp:absl" ] +} + +source_set("rsa_blind_signer") { + sources = [ + "src/anonymous_tokens/cpp/crypto/rsa_blind_signer.cc", + "src/anonymous_tokens/cpp/crypto/rsa_blind_signer.h", + ] + configs += [ ":anonymous_tokens_internal_config" ] + public_configs = [ ":anonymous_tokens_config" ] + deps = [ + ":anonymous_tokens_pb_openssl_converters", + ":blind_signer", + ":constants", + ":crypto_utils", + ":status_utils", + ] + public_deps = [ + ":anonymous_tokens_cc_proto", + "//third_party/abseil-cpp:absl", + "//third_party/boringssl", + ] +} + +source_set("verifier") { + sources = [ "src/anonymous_tokens/cpp/crypto/verifier.h" ] + public_configs = [ ":anonymous_tokens_config" ] + public_deps = [ "//third_party/abseil-cpp:absl" ] +} + +source_set("rsa_ssa_pss_verifier") { + sources = [ + "src/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.cc", + "src/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier.h", + ] + public_configs = [ ":anonymous_tokens_config" ] + deps = [ + ":anonymous_tokens_pb_openssl_converters", + ":constants", + ":crypto_utils", + ":status_utils", + ":verifier", + ] + public_deps = [ + ":anonymous_tokens_cc_proto", + "//third_party/abseil-cpp:absl", + "//third_party/boringssl", + ] +} + +source_set("rsa_bssa_public_metadata_client") { + sources = [ + "src/anonymous_tokens/cpp/privacy_pass/rsa_bssa_public_metadata_client.cc", + "src/anonymous_tokens/cpp/privacy_pass/rsa_bssa_public_metadata_client.h", + ] + configs += [ ":anonymous_tokens_internal_config" ] + public_configs = [ ":anonymous_tokens_config" ] + deps = [ + ":constants", + ":crypto_utils", + ":rsa_blinder", + ":status_utils", + ":tokens_encodings", + ] + public_deps = [ + "//third_party/abseil-cpp:absl", + "//third_party/boringssl", + ] +} + +source_set("tokens_encodings") { + sources = [ + "src/anonymous_tokens/cpp/privacy_pass/token_encodings.cc", + "src/anonymous_tokens/cpp/privacy_pass/token_encodings.h", + ] + public_configs = [ ":anonymous_tokens_config" ] + deps = [ ":status_utils" ] + public_deps = [ + "//third_party/abseil-cpp:absl", + "//third_party/boringssl", + ] +} + +static_library("anonymous_tokens_test_support") { + testonly = true + sources = [ + "overrides/anonymous_tokens/cpp/testing/testdata_utils.h", + "src/anonymous_tokens/cpp/testing/proto_utils.cc", + "src/anonymous_tokens/cpp/testing/proto_utils.h", + "src/anonymous_tokens/cpp/testing/utils.cc", + "src/anonymous_tokens/cpp/testing/utils.h", + "testdata_utils_impl.cc", + "testdata_utils_impl.h", + ] + public_configs = [ ":anonymous_tokens_config" ] + deps = [ + ":constants", + ":crypto_utils", + ":status_utils", + "//base:base", + ] + public_deps = [ + ":anonymous_tokens_cc_proto", + "//third_party/abseil-cpp:absl", + "//third_party/boringssl", + ] +} + +bundle_data("test_data") { + visibility = [ ":anonymous_tokens_tests" ] + testonly = true + sources = [ + "src/anonymous_tokens/testdata/strong_rsa_modulus2048_example.binarypb", + "src/anonymous_tokens/testdata/strong_rsa_modulus2048_example_2.binarypb", + "src/anonymous_tokens/testdata/strong_rsa_modulus3072_example.binarypb", + "src/anonymous_tokens/testdata/strong_rsa_modulus4096_example.binarypb", + ] + outputs = [ "{{bundle_resources_dir}}/" + + "{{source_root_relative_dir}}/{{source_file_part}}" ] +} + +source_set("anonymous_tokens_tests") { + testonly = true + sources = [ + "src/anonymous_tokens/cpp/client/anonymous_tokens_public_key_client_test.cc", + "src/anonymous_tokens/cpp/client/anonymous_tokens_redemption_client_test.cc", + "src/anonymous_tokens/cpp/crypto/crypto_utils_test.cc", + "src/anonymous_tokens/cpp/crypto/rsa_blinder_test.cc", + "src/anonymous_tokens/cpp/privacy_pass/rsa_bssa_public_metadata_client_test.cc", + "src/anonymous_tokens/cpp/privacy_pass/token_encodings_test.cc", + "src/anonymous_tokens/cpp/shared/proto_utils_test.cc", + ] + + # TODO(awillia): Figure out how to get the testdata properly bundled on iOS so + # that these tests won't all fail on the ios-simulator trybot. + if (!is_ios) { + sources += [ + "src/anonymous_tokens/cpp/client/anonymous_tokens_rsa_bssa_client_test.cc", + "src/anonymous_tokens/cpp/crypto/anonymous_tokens_pb_openssl_converters_test.cc", + "src/anonymous_tokens/cpp/crypto/rsa_blind_signer_test.cc", + "src/anonymous_tokens/cpp/crypto/rsa_ssa_pss_verifier_test.cc", + ] + } + data = [ "src/anonymous_tokens/testdata/" ] + configs += [ ":anonymous_tokens_internal_config" ] + public_configs = [ ":anonymous_tokens_config" ] + deps = [ + ":anonymous_tokens_pb_openssl_converters", + ":anonymous_tokens_public_key_client", + ":anonymous_tokens_redemption_client", + ":anonymous_tokens_rsa_bssa_client", + ":anonymous_tokens_test_support", + ":constants", + ":crypto_utils", + ":proto_utils", + ":rsa_blind_signer", + ":rsa_blinder", + ":rsa_bssa_public_metadata_client", + ":rsa_ssa_pss_verifier", + ":status_utils", + ":tokens_encodings", + "//testing/gmock", + "//testing/gtest", + "//third_party/abseil-cpp:absl", + ] + if (is_ios) { + deps += [ ":test_data" ] + } +}
diff --git a/third_party/anonymous_tokens/DEPS b/third_party/anonymous_tokens/DEPS new file mode 100644 index 0000000..7e36923 --- /dev/null +++ b/third_party/anonymous_tokens/DEPS
@@ -0,0 +1,9 @@ +specific_include_rules = { + # This file lives in the Chromium repo and can safely depend on base. + "testdata_utils_impl\.cc": [ + "+base/base_paths.h", + "+base/files/file_path.h", + "+base/path_service.h", + "+base/threading/thread_restrictions.h", + ], +}
diff --git a/third_party/anonymous_tokens/README.chromium b/third_party/anonymous_tokens/README.chromium index 76edef51..9cb6c375 100644 --- a/third_party/anonymous_tokens/README.chromium +++ b/third_party/anonymous_tokens/README.chromium
@@ -1,8 +1,8 @@ Name: Anonymous Tokens Short Name: anonymous_tokens URL: https://github.com/google/anonymous-tokens -Version: 0 -Revision: 8c8d20953d502db31fec2353b199e6c22ef0236e +Version: N/A +Revision: 79562f0175dba82f671046b5bdea0853323445b7 License: Apache 2.0 License File: src/LICENSE Security Critical: yes
diff --git a/third_party/anonymous_tokens/overrides/anonymous_tokens/cpp/testing/testdata_utils.h b/third_party/anonymous_tokens/overrides/anonymous_tokens/cpp/testing/testdata_utils.h new file mode 100644 index 0000000..170162bf --- /dev/null +++ b/third_party/anonymous_tokens/overrides/anonymous_tokens/cpp/testing/testdata_utils.h
@@ -0,0 +1,30 @@ +// Copyright 2023 Google LLC +// +// 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 ANONYMOUS_TOKENS_CPP_TESTING_ANONYMOUS_TOKENS_TESTDATA_UTILS_H_ +#define ANONYMOUS_TOKENS_CPP_TESTING_ANONYMOUS_TOKENS_TESTDATA_UTILS_H_ + +#include <string> + +#include "third_party/anonymous_tokens/testdata_utils_impl.h" + +namespace anonymous_tokens { + +inline std::string GetTestdataPath() { + return GetTestdataPathImpl(); +} + +} // namespace anonymous_tokens + +#endif // ANONYMOUS_TOKENS_CPP_TESTING_ANONYMOUS_TOKENS_TESTDATA_UTILS_H_
diff --git a/third_party/anonymous_tokens/src b/third_party/anonymous_tokens/src index 8c8d209..79562f0 160000 --- a/third_party/anonymous_tokens/src +++ b/third_party/anonymous_tokens/src
@@ -1 +1 @@ -Subproject commit 8c8d20953d502db31fec2353b199e6c22ef0236e +Subproject commit 79562f0175dba82f671046b5bdea0853323445b7
diff --git a/third_party/anonymous_tokens/testdata_utils_impl.cc b/third_party/anonymous_tokens/testdata_utils_impl.cc new file mode 100644 index 0000000..cf32ddf --- /dev/null +++ b/third_party/anonymous_tokens/testdata_utils_impl.cc
@@ -0,0 +1,38 @@ +// Copyright 2023 Google LLC +// +// 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 "testdata_utils_impl.h" + +#include <string> + +#include "base/base_paths.h" +#include "base/files/file_path.h" +#include "base/path_service.h" +#include "base/threading/thread_restrictions.h" + +namespace { + +const base::FilePath::CharType kTestdataPath[] = FILE_PATH_LITERAL( + "third_party/anonymous_tokens/src/anonymous_tokens/testdata/"); + +} + +std::string GetTestdataPathImpl() { + base::FilePath src_root; + { + base::ScopedAllowBlockingForTesting allow_blocking; + base::PathService::Get(base::DIR_SOURCE_ROOT, &src_root); + } + return src_root.Append(kTestdataPath).MaybeAsASCII(); +}
diff --git a/third_party/anonymous_tokens/testdata_utils_impl.h b/third_party/anonymous_tokens/testdata_utils_impl.h new file mode 100644 index 0000000..6b307fb --- /dev/null +++ b/third_party/anonymous_tokens/testdata_utils_impl.h
@@ -0,0 +1,22 @@ +// Copyright 2023 Google LLC +// +// 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 THIRD_PARTY_ANONYMOUS_TOKENS_TESTDATA_UTILS_IMPL_H_ +#define THIRD_PARTY_ANONYMOUS_TOKENS_TESTDATA_UTILS_IMPL_H_ + +#include <string> + +std::string GetTestdataPathImpl(); + +#endif // THIRD_PARTY_ANONYMOUS_TOKENS_TESTDATA_UTILS_IMPL_H_
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn index f4dae94..dec2f82 100644 --- a/third_party/blink/public/BUILD.gn +++ b/third_party/blink/public/BUILD.gn
@@ -172,7 +172,6 @@ "platform/web_blob_info.h", "platform/web_cache.h", "platform/web_callbacks.h", - "platform/web_code_cache_loader.h", "platform/web_common.h", "platform/web_computed_ax_tree.h", "platform/web_connection_type.h",
diff --git a/third_party/blink/public/mojom/webid/federated_auth_request.mojom b/third_party/blink/public/mojom/webid/federated_auth_request.mojom index a74338a16..d7cf671 100644 --- a/third_party/blink/public/mojom/webid/federated_auth_request.mojom +++ b/third_party/blink/public/mojom/webid/federated_auth_request.mojom
@@ -148,6 +148,15 @@ RpContext context; }; +// The error which occurred during the retrieval of a token. +struct TokenError { + // Type of error which resulted in an IdentityCredential not being created. + string? code; + + // String URL where the user can learn more information about the error. + string? url; +}; + // Create a federated sign-in request using the specified provider. // This interface is called from a renderer process and implemented in the // browser process. @@ -160,12 +169,14 @@ // A null URL is returned if the token request failed or did not occur due // to an error earlier in the flow. // - Raw content of the token. + // - The error which occurred during the retrieval of a token. // - Whether the account was automatically selected. RequestToken(array<IdentityProviderGetParameters> idp_get_params, CredentialMediationRequirement requirement) => (RequestTokenStatus status, url.mojom.Url? selected_identity_provider_config_url, string? token, + TokenError? error, bool is_account_auto_selected); // Requests user info to be generated, given an IDP config.
diff --git a/third_party/blink/public/platform/web_code_cache_loader.h b/third_party/blink/public/platform/web_code_cache_loader.h deleted file mode 100644 index d2e552c..0000000 --- a/third_party/blink/public/platform/web_code_cache_loader.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_CODE_CACHE_LOADER_H_ -#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_CODE_CACHE_LOADER_H_ - -#include "base/functional/callback.h" -#include "base/time/time.h" -#include "mojo/public/cpp/base/big_buffer.h" -#include "third_party/blink/public/mojom/loader/code_cache.mojom-shared.h" -#include "third_party/blink/public/platform/web_common.h" -#include "third_party/blink/public/platform/web_url.h" -#include "third_party/blink/public/platform/web_vector.h" -#include "url/gurl.h" - -namespace blink { - -class CodeCacheHost; - -// WebCodeCacheLoader is an abstract class that provides the interface for -// fetching the data from code cache. -class BLINK_PLATFORM_EXPORT WebCodeCacheLoader { - public: - using FetchCodeCacheCallback = - base::OnceCallback<void(base::Time, mojo_base::BigBuffer)>; - virtual ~WebCodeCacheLoader() = default; - - static std::unique_ptr<WebCodeCacheLoader> Create( - CodeCacheHost* code_cache_host); - virtual void FetchFromCodeCache(mojom::CodeCacheType cache_type, - const WebURL& url, - FetchCodeCacheCallback) = 0; - - virtual void ClearCodeCacheEntry(mojom::CodeCacheType cache_type, - const WebURL& url) = 0; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_CODE_CACHE_LOADER_H_
diff --git a/third_party/blink/public/platform/web_worker_fetch_context.h b/third_party/blink/public/platform/web_worker_fetch_context.h index 8110665..a570678 100644 --- a/third_party/blink/public/platform/web_worker_fetch_context.h +++ b/third_party/blink/public/platform/web_worker_fetch_context.h
@@ -16,11 +16,11 @@ #include "third_party/blink/public/mojom/service_worker/controller_service_worker_mode.mojom-shared.h" #include "third_party/blink/public/platform/cross_variant_mojo_util.h" #include "third_party/blink/public/platform/resource_load_info_notifier_wrapper.h" -#include "third_party/blink/public/platform/web_code_cache_loader.h" #include "third_party/blink/public/platform/web_document_subresource_filter.h" #include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/platform/web_url.h" +#include "third_party/blink/public/platform/web_vector.h" #include "third_party/blink/public/platform/websocket_handshake_throttle.h" namespace base { @@ -33,7 +33,6 @@ namespace blink { -class CodeCacheHost; class WebDocumentSubresourceFilter; class URLLoaderFactory; class WebURLRequest; @@ -85,18 +84,6 @@ CrossVariantMojoRemote<network::mojom::URLLoaderFactoryInterfaceBase> url_loader_factory) = 0; - // Returns a WebCodeCacheLoader that fetches data from code caches. If - // a nullptr is returned then data would not be fetched from the code - // cache. - // TODO(mythria): Currently, code_cache_host can be a nullptr when fetching - // cached code from worklets. For these cases we use a per-process mojo - // interface. Update worklets to use context specific interface and check that - // code_cache_host is not a nullptr. - virtual std::unique_ptr<WebCodeCacheLoader> CreateCodeCacheLoader( - CodeCacheHost* code_cache_host) { - return nullptr; - } - // Returns a URLLoaderFactory for loading scripts in this worker context. // Unlike GetURLLoaderFactory(), this may return nullptr. // The returned URLLoaderFactory is owned by |this|.
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc b/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc index ca7f030d..346dc9ca 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc
@@ -87,9 +87,7 @@ BackForwardCacheLoaderHelper*) override { return std::make_unique<NoopURLLoader>(std::move(freezable_task_runner)); } - std::unique_ptr<WebCodeCacheLoader> CreateCodeCacheLoader() override { - return std::make_unique<CodeCacheLoaderMock>(); - } + CodeCacheHost* GetCodeCacheHost() override { return nullptr; } class NoopURLLoader final : public URLLoader { public:
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni index adeaacad..76bdedd 100644 --- a/third_party/blink/renderer/bindings/generated_in_modules.gni +++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -489,6 +489,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_origin_3d_dict.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_pipeline_descriptor_base.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_pipeline_descriptor_base.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_error_init.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_error_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_pipeline_error_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_pipeline_error_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_pipeline_layout_descriptor.cc", @@ -2067,6 +2069,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_out_of_memory_error.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_pipeline_error.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_pipeline_error.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_error.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_error.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_pipeline_layout.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_pipeline_layout.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_query_set.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni index 60b2b7e..13c5b2d 100644 --- a/third_party/blink/renderer/bindings/idl_in_modules.gni +++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -1061,6 +1061,7 @@ "//third_party/blink/renderer/modules/webgpu/gpu_pipeline_base.idl", "//third_party/blink/renderer/modules/webgpu/gpu_pipeline_descriptor_base.idl", "//third_party/blink/renderer/modules/webgpu/gpu_pipeline_error.idl", + "//third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.idl", "//third_party/blink/renderer/modules/webgpu/gpu_pipeline_layout.idl", "//third_party/blink/renderer/modules/webgpu/gpu_pipeline_layout_descriptor.idl", "//third_party/blink/renderer/modules/webgpu/gpu_primitive_state.idl",
diff --git a/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.h.tmpl b/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.h.tmpl index 6e31270..b81c0c7f 100644 --- a/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.h.tmpl +++ b/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.h.tmpl
@@ -72,7 +72,7 @@ static_assert(CSSPropertyID::kZoom == kLastHighPriorityCSSProperty, "CSSPropertyID::kZoom is the last high-priority property"); static_assert((static_cast<int>(kLastHighPriorityCSSProperty) - - static_cast<int>(kFirstHighPriorityCSSProperty)) == 31, + static_cast<int>(kFirstHighPriorityCSSProperty)) == 32, "There should a low number of high-priority properties"); inline int GetCSSPropertyIDIndex(CSSPropertyID id) {
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5 index ca39fde..71bcdc91 100644 --- a/third_party/blink/renderer/core/css/css_properties.json5 +++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -5104,8 +5104,10 @@ name: "text-spacing-trim", property_methods: ["CSSValueFromComputedStyleInternal"], inherited: true, - field_group: "*", - field_template: "keyword", + font: true, + priority: "High", + type_name: "TextSpacingTrim", + include_paths: ["third_party/blink/renderer/platform/fonts/shaping/text_spacing_trim.h"], keywords: ["space-first", "space-all"], default_value: "space-first", typedom_types: ["Keyword"],
diff --git a/third_party/blink/renderer/core/css/css_property_equality.cc b/third_party/blink/renderer/core/css/css_property_equality.cc index 1d2b875..2cb865c 100644 --- a/third_party/blink/renderer/core/css/css_property_equality.cc +++ b/third_party/blink/renderer/core/css/css_property_equality.cc
@@ -711,7 +711,8 @@ case CSSPropertyID::kTextSizeAdjust: return a.GetTextSizeAdjust() == b.GetTextSizeAdjust(); case CSSPropertyID::kTextSpacingTrim: - return a.TextSpacingTrim() == b.TextSpacingTrim(); + return a.GetFontDescription().GetTextSpacingTrim() == + b.GetFontDescription().GetTextSpacingTrim(); case CSSPropertyID::kTextTransform: return a.TextTransform() == b.TextTransform(); case CSSPropertyID::kTextUnderlineOffset:
diff --git a/third_party/blink/renderer/core/css/css_value_id_mappings.h b/third_party/blink/renderer/core/css/css_value_id_mappings.h index fccab35..5dac582 100644 --- a/third_party/blink/renderer/core/css/css_value_id_mappings.h +++ b/third_party/blink/renderer/core/css/css_value_id_mappings.h
@@ -441,6 +441,31 @@ } template <> +inline TextSpacingTrim CssValueIDToPlatformEnum(CSSValueID v) { + switch (v) { + case CSSValueID::kSpaceFirst: + return TextSpacingTrim::kSpaceFirst; + case CSSValueID::kSpaceAll: + return TextSpacingTrim::kSpaceAll; + default: + NOTREACHED(); + return TextSpacingTrim::kSpaceFirst; + } +} + +template <> +inline CSSValueID PlatformEnumToCSSValueID(TextSpacingTrim v) { + switch (v) { + case TextSpacingTrim::kSpaceFirst: + return CSSValueID::kSpaceFirst; + case TextSpacingTrim::kSpaceAll: + return CSSValueID::kSpaceAll; + } + NOTREACHED(); + return CSSValueID::kNone; +} + +template <> inline TextWrap CssValueIDToPlatformEnum(CSSValueID v) { switch (v) { case CSSValueID::kWrap:
diff --git a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc index ba294a27..4f3e094 100644 --- a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc +++ b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
@@ -8167,7 +8167,8 @@ const ComputedStyle& style, const LayoutObject*, bool allow_visited_style) const { - return CSSIdentifierValue::Create(style.TextSpacingTrim()); + return CSSIdentifierValue::Create( + style.GetFontDescription().GetTextSpacingTrim()); } const CSSValue* TextTransform::CSSValueFromComputedStyleInternal(
diff --git a/third_party/blink/renderer/core/css/resolver/font_builder.cc b/third_party/blink/renderer/core/css/resolver/font_builder.cc index 2f3a83b1..948f05ef 100644 --- a/third_party/blink/renderer/core/css/resolver/font_builder.cc +++ b/third_party/blink/renderer/core/css/resolver/font_builder.cc
@@ -203,6 +203,11 @@ font_description_.SetKerning(kerning); } +void FontBuilder::SetTextSpacingTrim(TextSpacingTrim text_spacing_trim) { + Set(PropertySetFlag::kTextSpacingTrim); + font_description_.SetTextSpacingTrim(text_spacing_trim); +} + void FontBuilder::SetFontOpticalSizing(OpticalSizing font_optical_sizing) { Set(PropertySetFlag::kFontOpticalSizing); @@ -529,6 +534,13 @@ description.SetKerning(font_description_.GetKerning()); } } + if (IsSet(PropertySetFlag::kTextSpacingTrim)) { + if (description.GetTextSpacingTrim() != + font_description_.GetTextSpacingTrim()) { + modified = true; + description.SetTextSpacingTrim(font_description_.GetTextSpacingTrim()); + } + } if (IsSet(PropertySetFlag::kFontOpticalSizing)) { if (description.FontOpticalSizing() != font_description_.FontOpticalSizing()) {
diff --git a/third_party/blink/renderer/core/css/resolver/font_builder.h b/third_party/blink/renderer/core/css/resolver/font_builder.h index e07af0a..c71752b 100644 --- a/third_party/blink/renderer/core/css/resolver/font_builder.h +++ b/third_party/blink/renderer/core/css/resolver/font_builder.h
@@ -80,6 +80,7 @@ void SetFontSynthesisSmallCaps(FontDescription::FontSynthesisSmallCaps); void SetTextRendering(TextRenderingMode); void SetKerning(FontDescription::Kerning); + void SetTextSpacingTrim(TextSpacingTrim); void SetFontPalette(scoped_refptr<FontPalette>); void SetFontVariantAlternates(scoped_refptr<FontVariantAlternates>); void SetFontOpticalSizing(OpticalSizing); @@ -131,6 +132,9 @@ static FontDescription::Kerning InitialKerning() { return FontDescription::kAutoKerning; } + static TextSpacingTrim InitialTextSpacingTrim() { + return TextSpacingTrim::kSpaceFirst; + } static OpticalSizing InitialFontOpticalSizing() { return kAutoOpticalSizing; } static FontSmoothingMode InitialFontSmoothing() { return kAutoSmoothing; } @@ -197,6 +201,7 @@ kVariationSettings, kTextRendering, kKerning, + kTextSpacingTrim, kFontOpticalSizing, kFontPalette, kFontVariantAlternates, @@ -207,7 +212,9 @@ kEffectiveZoom, kTextOrientation, - kWritingMode + kWritingMode, + + kNumFlags, }; void Set(PropertySetFlag flag) { flags_ |= (1 << unsigned(flag)); } @@ -216,6 +223,8 @@ } unsigned flags_{0}; + static_assert(static_cast<int>(PropertySetFlag::kNumFlags) <= + sizeof(flags_) * 8); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/dom/dom_exception.cc b/third_party/blink/renderer/core/dom/dom_exception.cc index c5b0d894..afbc9dca 100644 --- a/third_party/blink/renderer/core/dom/dom_exception.cc +++ b/third_party/blink/renderer/core/dom/dom_exception.cc
@@ -168,7 +168,12 @@ // Media Capture and Streams API // https://w3c.github.io/mediacapture-main/#overconstrainederror-interface {DOMExceptionCode::kOverconstrainedError, "OverconstrainedError", - "The desired set of constraints/capabilities cannot be met."} + "The desired set of constraints/capabilities cannot be met."}, + + // FedCM API + // https://fedidcg.github.io/FedCM/#browser-api-identity-credential-error-interface + {DOMExceptionCode::kIdentityCredentialError, "IdentityCredentialError", + "An attempt to retrieve an IdentityCredential has failed."} // Extra comment to keep the end of the initializer list on its own line. };
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc index 95d16f8..3d1a99e1 100644 --- a/third_party/blink/renderer/core/dom/node.cc +++ b/third_party/blink/renderer/core/dom/node.cc
@@ -681,24 +681,6 @@ callback->Invoke(&scroll_state); } -void Node::WillBeginCustomizedScrollPhase( - scroll_customization::ScrollDirection direction) { - DCHECK(!GetScrollCustomizationCallbacks().InScrollPhase(this)); - LayoutBox* box = GetLayoutBox(); - if (!box) - return; - - scroll_customization::ScrollDirection scroll_customization = - box->Style()->ScrollCustomization(); - - GetScrollCustomizationCallbacks().SetInScrollPhase( - this, direction & scroll_customization); -} - -void Node::DidEndCustomizedScrollPhase() { - GetScrollCustomizationCallbacks().SetInScrollPhase(this, false); -} - Node* Node::insertBefore(Node* new_child, Node* ref_child, ExceptionState& exception_state) {
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h index 31fd8d2..d74f19b 100644 --- a/third_party/blink/renderer/core/dom/node.h +++ b/third_party/blink/renderer/core/dom/node.h
@@ -240,8 +240,6 @@ void NativeApplyScroll(ScrollState&); void CallDistributeScroll(ScrollState&); void CallApplyScroll(ScrollState&); - void WillBeginCustomizedScrollPhase(scroll_customization::ScrollDirection); - void DidEndCustomizedScrollPhase(); Node& TreeRoot() const; Node& ShadowIncludingRoot() const;
diff --git a/third_party/blink/renderer/core/fetch/deferred_request_init.idl b/third_party/blink/renderer/core/fetch/deferred_request_init.idl index 304c5f4..bf0eaca 100644 --- a/third_party/blink/renderer/core/fetch/deferred_request_init.idl +++ b/third_party/blink/renderer/core/fetch/deferred_request_init.idl
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://whatpr.org/fetch/1647/094ea69...152d725.html#fetch-later-method +// https://whatpr.org/fetch/1647/9ca4bda...7bff4de.html#fetch-later-method dictionary DeferredRequestInit : RequestInit { - DOMHighResTimeStamp backgroundTimeout; + DOMHighResTimeStamp activationTimeout; };
diff --git a/third_party/blink/renderer/core/fetch/fetch_later.idl b/third_party/blink/renderer/core/fetch/fetch_later.idl index cac3211..e02ed6c 100644 --- a/third_party/blink/renderer/core/fetch/fetch_later.idl +++ b/third_party/blink/renderer/core/fetch/fetch_later.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://whatpr.org/fetch/1647/53e4c3d...71fd383.html#fetch-later-method +// https://whatpr.org/fetch/1647/9ca4bda...7bff4de.html#fetch-later-method [ ImplementedAs=FetchLaterResult,
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index 3e061d3d5..93df9a0 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -2404,10 +2404,6 @@ pause_handle_receivers_.Clear(); } -void LocalFrame::AnimateSnapFling(base::TimeTicks monotonic_time) { - GetEventHandler().AnimateSnapFling(monotonic_time); -} - SmoothScrollSequencer* LocalFrame::CreateNewSmoothScrollSequence() { if (!IsLocalRoot()) { return LocalFrameRoot().CreateNewSmoothScrollSequence();
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h index 04b7958..adf7bf2 100644 --- a/third_party/blink/renderer/core/frame/local_frame.h +++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -615,8 +615,6 @@ void ResumeSubresourceLoading(); - void AnimateSnapFling(base::TimeTicks monotonic_time); - ClientHintsPreferences& GetClientHintsPreferences() { return client_hints_preferences_; }
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index ea3c74f0..f36bbfa 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -3600,7 +3600,6 @@ start_time.since_origin().InSecondsF()); } } - GetFrame().AnimateSnapFling(start_time); // After scroll updates, snapshot scroll state once at top of animation // frame. GetFrame().UpdateScrollSnapshots();
diff --git a/third_party/blink/renderer/core/input/event_handler.cc b/third_party/blink/renderer/core/input/event_handler.cc index 2e17263c..938877d 100644 --- a/third_party/blink/renderer/core/input/event_handler.cc +++ b/third_party/blink/renderer/core/input/event_handler.cc
@@ -1416,10 +1416,6 @@ should_only_fire_drag_over_event_ = false; } -void EventHandler::AnimateSnapFling(base::TimeTicks monotonic_time) { - scroll_manager_->AnimateSnapFling(monotonic_time); -} - void EventHandler::RecomputeMouseHoverStateIfNeeded() { mouse_event_manager_->RecomputeMouseHoverStateIfNeeded(); }
diff --git a/third_party/blink/renderer/core/input/event_handler.h b/third_party/blink/renderer/core/input/event_handler.h index 643f992..af669ebb 100644 --- a/third_party/blink/renderer/core/input/event_handler.h +++ b/third_party/blink/renderer/core/input/event_handler.h
@@ -256,8 +256,6 @@ return *keyboard_event_manager_; } - void AnimateSnapFling(base::TimeTicks monotonic_time); - void RecomputeMouseHoverStateIfNeeded(); void MarkHoverStateDirty();
diff --git a/third_party/blink/renderer/core/input/scroll_manager.cc b/third_party/blink/renderer/core/input/scroll_manager.cc index 4c7f682..d7ce989c9 100644 --- a/third_party/blink/renderer/core/input/scroll_manager.cc +++ b/third_party/blink/renderer/core/input/scroll_manager.cc
@@ -42,28 +42,8 @@ #include "ui/gfx/geometry/point_conversions.h" namespace blink { -namespace { - -cc::SnapFlingController::GestureScrollType ToGestureScrollType( - WebInputEvent::Type web_event_type) { - switch (web_event_type) { - case WebInputEvent::Type::kGestureScrollBegin: - return cc::SnapFlingController::GestureScrollType::kBegin; - case WebInputEvent::Type::kGestureScrollUpdate: - return cc::SnapFlingController::GestureScrollType::kUpdate; - case WebInputEvent::Type::kGestureScrollEnd: - return cc::SnapFlingController::GestureScrollType::kEnd; - default: - NOTREACHED(); - return cc::SnapFlingController::GestureScrollType::kBegin; - } -} - -} // namespace ScrollManager::ScrollManager(LocalFrame& frame) : frame_(frame) { - snap_fling_controller_ = std::make_unique<cc::SnapFlingController>(this); - Clear(); } @@ -77,20 +57,12 @@ void ScrollManager::Trace(Visitor* visitor) const { visitor->Trace(frame_); visitor->Trace(scroll_gesture_handling_node_); - visitor->Trace(previous_gesture_scrolled_node_); visitor->Trace(scrollbar_handling_scroll_gesture_); visitor->Trace(resize_scrollable_area_); } void ScrollManager::ClearGestureScrollState() { - last_gesture_scroll_over_embedded_content_view_ = false; scroll_gesture_handling_node_ = nullptr; - previous_gesture_scrolled_node_ = nullptr; - last_scroll_delta_for_scroll_gesture_ = ScrollOffset(); - delta_consumed_for_scroll_sequence_ = false; - did_scroll_x_for_scroll_gesture_ = false; - did_scroll_y_for_scroll_gesture_ = false; - current_scroll_chain_.clear(); if (Page* page = frame_->GetPage()) { bool reset_x = true; @@ -99,15 +71,6 @@ } } -Node* ScrollManager::GetScrollEventTarget() { - // Send the overscroll event to the node that scrolling is latched to which - // is either previously scrolled node or the last node in the scroll chain. - Node* scroll_target = previous_gesture_scrolled_node_; - if (!scroll_target && !current_scroll_chain_.empty()) - scroll_target = DOMNodeIds::NodeForId(current_scroll_chain_.front()); - return scroll_target; -} - void ScrollManager::StopAutoscroll() { if (AutoscrollController* controller = GetAutoscrollController()) controller->StopAutoscroll(); @@ -273,7 +236,8 @@ // latch on to the deepest autoscrollable node. if (IsA<LayoutView>(scrolling_box) && current_node.GetDocument().IsInMainFrame() && - GetPage()->GetVisualViewport().IsActiveViewport() && !for_autoscroll) { + frame_->GetPage()->GetVisualViewport().IsActiveViewport() && + !for_autoscroll) { return true; } @@ -460,307 +424,15 @@ return frame_->BubbleLogicalScrollInParentFrame(direction, granularity); } -void ScrollManager::CustomizedScroll(ScrollState& scroll_state) { - TRACE_EVENT0("input", "ScrollManager::CustomizedScroll"); - if (scroll_state.FullyConsumed()) - return; - - if (scroll_state.deltaX() || scroll_state.deltaY()) { - frame_->GetDocument()->UpdateStyleAndLayout(DocumentUpdateReason::kScroll); - } - - DCHECK(!current_scroll_chain_.empty()); - - scroll_state.SetScrollChain(current_scroll_chain_); - - scroll_state.distributeToScrollChainDescendant(); -} - -uint32_t ScrollManager::GetNonCompositedMainThreadScrollingReasons() const { - // When scrolling on the main thread, the scrollableArea may or may not be - // composited. Either way, we have recorded either the reasons stored in - // its layer or the reason NonFastScrollableRegion from the compositor - // side. Here we record scrolls that occurred on main thread due to a - // non-composited scroller. - if (!scroll_gesture_handling_node_->GetLayoutObject()) - return 0; - - uint32_t non_composited_main_thread_scrolling_reasons = 0; - for (auto* cur_box = - scroll_gesture_handling_node_->GetLayoutObject()->EnclosingBox(); - cur_box; cur_box = cur_box->ContainingBlock()) { - PaintLayerScrollableArea* scrollable_area = cur_box->GetScrollableArea(); - - if (!scrollable_area || !scrollable_area->ScrollsOverflow()) - continue; - - if (auto* compositor = - cur_box->GetFrameView()->GetPaintArtifactCompositor()) { - non_composited_main_thread_scrolling_reasons |= - (compositor->GetMainThreadScrollingReasons( - *cur_box->FirstFragment().PaintProperties()->Scroll()) & - cc::MainThreadScrollingReason::kNonCompositedReasons); - } - } - return non_composited_main_thread_scrolling_reasons; -} - -void ScrollManager::RecordScrollRelatedMetrics(WebGestureDevice device) const { - if (device != WebGestureDevice::kTouchpad && - device != WebGestureDevice::kTouchscreen) { - return; - } - - if (uint32_t non_composited_main_thread_scrolling_reasons = - GetNonCompositedMainThreadScrollingReasons()) { - RecordScrollReasonsMetric(device, - non_composited_main_thread_scrolling_reasons); - } -} - -WebInputEventResult ScrollManager::HandleGestureScrollBegin( - const WebGestureEvent& gesture_event) { - TRACE_EVENT0("input", "ScrollManager::handleGestureScrollBegin"); - return WebInputEventResult::kNotHandled; -} - -WebInputEventResult ScrollManager::HandleGestureScrollUpdate( - const WebGestureEvent& gesture_event) { - TRACE_EVENT0("input", "ScrollManager::handleGestureScrollUpdate"); - DCHECK_EQ(gesture_event.GetType(), WebInputEvent::Type::kGestureScrollUpdate); - - return WebInputEventResult::kNotHandled; -} - -void ScrollManager::AdjustForSnapAtScrollUpdate( - const WebGestureEvent& gesture_event, - ScrollStateData* scroll_state_data) { - // Scrollbar interactions outside of the scroll thumb behave like logical - // scrolls with respect to scroll snap behavior. - // Scrollbar arrows trigger scroll by line, whereas the scrollbar track - // triggers scroll by page. - DCHECK(gesture_event.SourceDevice() == WebGestureDevice::kScrollbar); - ui::ScrollGranularity granularity = gesture_event.DeltaUnits(); - if (granularity != ui::ScrollGranularity::kScrollByLine && - granularity != ui::ScrollGranularity::kScrollByPage) { - return; - } - - Node* node = scroll_gesture_handling_node_; - ScrollableArea* scrollable_area = nullptr; - if (node && node->GetLayoutObject()) { - LayoutBox* layout_box = node->GetLayoutBox(); - if (!layout_box) - return; - scrollable_area = ScrollableArea::GetForScrolling(layout_box); - } - - if (!scrollable_area) - return; - - gfx::PointF current_position = scrollable_area->ScrollPosition(); - std::unique_ptr<cc::SnapSelectionStrategy> strategy = - cc::SnapSelectionStrategy::CreateForDirection( - current_position, - gfx::Vector2dF(scroll_state_data->delta_x, - scroll_state_data->delta_y), - RuntimeEnabledFeatures::FractionalScrollOffsetsEnabled()); - - absl::optional<gfx::PointF> snap_point = - scrollable_area->GetSnapPositionAndSetTarget(*strategy); - if (!snap_point) - return; - - scroll_state_data->delta_x = (snap_point->x() - current_position.x()); - scroll_state_data->delta_y = (snap_point->y() - current_position.y()); - scroll_state_data->delta_granularity = ui::ScrollGranularity::kScrollByPixel; -} - -// This method is used as a ScrollCallback which requires a void return. Since -// this call to HandleGestureScrollEnd is async, we can just ignore the return -// value. -void ScrollManager::HandleDeferredGestureScrollEnd( - const WebGestureEvent& gesture_event, - ScrollableArea::ScrollCompletionMode mode) { - HandleGestureScrollEnd(gesture_event); -} - -WebInputEventResult ScrollManager::HandleGestureScrollEnd( - const WebGestureEvent& gesture_event) { - TRACE_EVENT0("input", "ScrollManager::handleGestureScrollEnd"); - - return WebInputEventResult::kNotHandled; -} - -LayoutBox* ScrollManager::LayoutBoxForSnapping() const { - if (!previous_gesture_scrolled_node_) - return nullptr; - return previous_gesture_scrolled_node_->GetLayoutBox(); -} - ScrollOffset GetScrollDirection(ScrollOffset delta) { delta.SetToMax(ScrollOffset(-1, -1)); delta.SetToMin(ScrollOffset(1, 1)); return delta; } -bool ScrollManager::SnapAtGestureScrollEnd( - const WebGestureEvent& end_event, - base::ScopedClosureRunner on_finish) { - if (!previous_gesture_scrolled_node_ || - (!did_scroll_x_for_scroll_gesture_ && !did_scroll_y_for_scroll_gesture_)) - return false; - ScrollableArea* scrollable_area = - ScrollableArea::GetForScrolling(LayoutBoxForSnapping()); - if (!scrollable_area) - return false; - - bool is_mouse_wheel = - end_event.SourceDevice() == WebGestureDevice::kTouchpad && - end_event.data.scroll_end.delta_units != - ui::ScrollGranularity::kScrollByPrecisePixel; - - // Treat mouse wheel scrolls as direction only scroll with its last scroll - // delta amout. This means each wheel tick will prefer the next snap position - // in the given direction. This leads to a much better UX for wheels. - // - // Precise wheel and trackpads continue to be treated similar as end position - // scrolling. - if (is_mouse_wheel && !last_scroll_delta_for_scroll_gesture_.IsZero()) { - // TODO(majidvp): Currently DirectionStrategy uses current offset + delta as - // the intended offset and chooses snap offset closest to that intended - // offset. In this case, this is not correct because we are already at the - // intended position. DirectionStategy should be updated to use current - // offset as intended position. This requires changing how we snap in - // |ScrollManager::LogicalScroll()|. For now use a unit scroll offset to - // limit the miscalculation to 1px. - ScrollOffset scroll_direction = - GetScrollDirection(last_scroll_delta_for_scroll_gesture_); - return scrollable_area->SnapForDirection(scroll_direction, - std::move(on_finish)); - } - - return scrollable_area->SnapAtCurrentPosition( - did_scroll_x_for_scroll_gesture_, did_scroll_y_for_scroll_gesture_, - std::move(on_finish)); -} - -bool ScrollManager::GetSnapFlingInfoAndSetAnimatingSnapTarget( - const gfx::Vector2dF& current_delta, - const gfx::Vector2dF& natural_displacement, - gfx::PointF* out_initial_position, - gfx::PointF* out_target_position) const { - ScrollableArea* scrollable_area = - ScrollableArea::GetForScrolling(LayoutBoxForSnapping()); - if (!scrollable_area) - return false; - - gfx::PointF current_position = scrollable_area->ScrollPosition(); - *out_initial_position = current_position; - std::unique_ptr<cc::SnapSelectionStrategy> strategy = - cc::SnapSelectionStrategy::CreateForEndAndDirection( - *out_initial_position, natural_displacement, - RuntimeEnabledFeatures::FractionalScrollOffsetsEnabled()); - absl::optional<gfx::PointF> snap_end = - scrollable_area->GetSnapPositionAndSetTarget(*strategy); - if (!snap_end.has_value()) - return false; - *out_target_position = snap_end.value(); - return true; -} - -gfx::PointF ScrollManager::ScrollByForSnapFling(const gfx::Vector2dF& delta) { - ScrollableArea* scrollable_area = - ScrollableArea::GetForScrolling(LayoutBoxForSnapping()); - if (!scrollable_area) - return gfx::PointF(); - - std::unique_ptr<ScrollStateData> scroll_state_data = - std::make_unique<ScrollStateData>(); - - // TODO(sunyunjia): Plumb the velocity of the snap curve as well. - scroll_state_data->delta_x = delta.x(); - scroll_state_data->delta_y = delta.y(); - scroll_state_data->is_in_inertial_phase = true; - scroll_state_data->from_user_input = true; - scroll_state_data->delta_granularity = - ui::ScrollGranularity::kScrollByPrecisePixel; - scroll_state_data->delta_consumed_for_scroll_sequence = - delta_consumed_for_scroll_sequence_; - auto* scroll_state = - MakeGarbageCollected<ScrollState>(std::move(scroll_state_data)); - scroll_state->SetCurrentNativeScrollingNode(previous_gesture_scrolled_node_); - - CustomizedScroll(*scroll_state); - // Return the end scroll position. - return scrollable_area->ScrollPosition(); -} - -void ScrollManager::ScrollEndForSnapFling(bool did_finish) { - if (RuntimeEnabledFeatures::ScrollEndEventsEnabled()) { - if (Node* scroll_end_target = GetScrollEventTarget()) { - scroll_end_target->GetDocument().EnqueueScrollEndEventForNode( - scroll_end_target); - } - } - if (current_scroll_chain_.empty()) { - NotifyScrollPhaseEndForCustomizedScroll(); - ClearGestureScrollState(); - return; - } - std::unique_ptr<ScrollStateData> scroll_state_data = - std::make_unique<ScrollStateData>(); - scroll_state_data->is_ending = true; - scroll_state_data->is_in_inertial_phase = true; - scroll_state_data->from_user_input = true; - scroll_state_data->delta_consumed_for_scroll_sequence = - delta_consumed_for_scroll_sequence_; - auto* scroll_state = - MakeGarbageCollected<ScrollState>(std::move(scroll_state_data)); - CustomizedScroll(*scroll_state); - NotifyScrollPhaseEndForCustomizedScroll(); - ClearGestureScrollState(); -} - -void ScrollManager::RequestAnimationForSnapFling() { - if (Page* page = frame_->GetPage()) - page->GetChromeClient().ScheduleAnimation(frame_->View()); -} - -void ScrollManager::AnimateSnapFling(base::TimeTicks monotonic_time) { - DCHECK(snap_fling_controller_); - snap_fling_controller_->Animate(monotonic_time); -} - -Page* ScrollManager::GetPage() const { - return frame_->GetPage(); -} - -WebInputEventResult ScrollManager::PassScrollGestureEvent( - const WebGestureEvent& gesture_event, - LayoutObject* layout_object) { - DCHECK(gesture_event.IsScrollEvent()); - - auto* embedded = DynamicTo<LayoutEmbeddedContent>(layout_object); - if (!last_gesture_scroll_over_embedded_content_view_ || !embedded) - return WebInputEventResult::kNotHandled; - - FrameView* frame_view = embedded->ChildFrameView(); - - if (!frame_view) - return WebInputEventResult::kNotHandled; - - auto* local_frame_view = DynamicTo<LocalFrameView>(frame_view); - if (!local_frame_view) - return WebInputEventResult::kNotHandled; - - return local_frame_view->GetFrame() - .GetEventHandler() - .HandleGestureScrollEvent(gesture_event); -} - WebInputEventResult ScrollManager::HandleGestureScrollEvent( const WebGestureEvent& gesture_event) { + // TODO(crbug.com/1369739): This method is probably dead code. if (!frame_->View()) return WebInputEventResult::kNotHandled; @@ -787,9 +459,6 @@ ClearGestureScrollState(); scroll_gesture_handling_node_ = event_target; - if (event_target->GetLayoutObject()->IsLayoutEmbeddedContent()) { - last_gesture_scroll_over_embedded_content_view_ = true; - } } if (!event_target) { @@ -810,14 +479,7 @@ event_target = result.InnerNode(); - last_gesture_scroll_over_embedded_content_view_ = - result.IsOverEmbeddedContentView(); - scroll_gesture_handling_node_ = event_target; - previous_gesture_scrolled_node_ = nullptr; - delta_consumed_for_scroll_sequence_ = false; - did_scroll_x_for_scroll_gesture_ = false; - did_scroll_y_for_scroll_gesture_ = false; if (!scrollbar) scrollbar = result.GetScrollbar(); @@ -846,28 +508,7 @@ if (HandleScrollGestureOnResizer(event_target, gesture_event)) return WebInputEventResult::kHandledSuppressed; } - - if (snap_fling_controller_) { - if (gesture_event.IsGestureScroll() && - (snap_fling_controller_->FilterEventForSnap( - ToGestureScrollType(gesture_event.GetType())))) { - return WebInputEventResult::kNotHandled; - } - } - switch (gesture_event.GetType()) { - case WebInputEvent::Type::kGestureScrollBegin: - return HandleGestureScrollBegin(gesture_event); - case WebInputEvent::Type::kGestureScrollUpdate: - return HandleGestureScrollUpdate(gesture_event); - case WebInputEvent::Type::kGestureScrollEnd: - return HandleGestureScrollEnd(gesture_event); - case WebInputEvent::Type::kGestureFlingStart: - case WebInputEvent::Type::kGestureFlingCancel: - return WebInputEventResult::kNotHandled; - default: - NOTREACHED(); - return WebInputEventResult::kNotHandled; - } + return WebInputEventResult::kNotHandled; } Node* ScrollManager::NodeTargetForScrollableAreaElementId( @@ -1019,24 +660,4 @@ return false; } -void ScrollManager::NotifyScrollPhaseBeginForCustomizedScroll( - const ScrollState& scroll_state) { - scroll_customization::ScrollDirection direction = - scroll_customization::GetScrollDirectionFromDeltas( - scroll_state.deltaXHint(), scroll_state.deltaYHint()); - for (auto id : current_scroll_chain_) { - Node* node = DOMNodeIds::NodeForId(id); - if (node) - node->WillBeginCustomizedScrollPhase(direction); - } -} - -void ScrollManager::NotifyScrollPhaseEndForCustomizedScroll() { - for (auto id : current_scroll_chain_) { - Node* node = DOMNodeIds::NodeForId(id); - if (node) - node->DidEndCustomizedScrollPhase(); - } -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/input/scroll_manager.h b/third_party/blink/renderer/core/input/scroll_manager.h index 07c925a..091eb0d 100644 --- a/third_party/blink/renderer/core/input/scroll_manager.h +++ b/third_party/blink/renderer/core/input/scroll_manager.h
@@ -5,8 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INPUT_SCROLL_MANAGER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INPUT_SCROLL_MANAGER_H_ -#include <memory> - #include "base/functional/callback_helpers.h" #include "cc/input/snap_fling_controller.h" #include "third_party/blink/public/platform/web_input_event_result.h" @@ -27,11 +25,9 @@ class AutoscrollController; class LayoutBox; -class LayoutObject; class LocalFrame; class PaintLayer; class PaintLayerScrollableArea; -class Page; class Scrollbar; class ScrollState; class WebGestureEvent; @@ -47,8 +43,7 @@ // and the ScrollableArea APIs. // TODO(crbug.com/1369739): Now that scroll unification has launched, much of // this class can be deleted. -class CORE_EXPORT ScrollManager : public GarbageCollected<ScrollManager>, - public cc::SnapFlingClient { +class CORE_EXPORT ScrollManager : public GarbageCollected<ScrollManager> { public: explicit ScrollManager(LocalFrame&); ScrollManager(const ScrollManager&) = delete; @@ -94,8 +89,6 @@ // as necessary. WebInputEventResult HandleGestureScrollEvent(const WebGestureEvent&); - WebInputEventResult HandleGestureScrollEnd(const WebGestureEvent&); - bool IsScrollbarHandlingGestures() const; // Returns true if the gesture event should be handled in ScrollManager. @@ -109,18 +102,6 @@ void ClearResizeScrollableArea(bool should_not_be_null); void SetResizeScrollableArea(PaintLayer*, gfx::Point); - // SnapFlingClient implementation. - bool GetSnapFlingInfoAndSetAnimatingSnapTarget( - const gfx::Vector2dF& current_delta, - const gfx::Vector2dF& natural_displacement, - gfx::PointF* out_initial_position, - gfx::PointF* out_target_position) const override; - gfx::PointF ScrollByForSnapFling(const gfx::Vector2dF& delta) override; - void ScrollEndForSnapFling(bool did_finish) override; - void RequestAnimationForSnapFling() override; - - void AnimateSnapFling(base::TimeTicks monotonic_time); - // Determines whether the scroll-chain should be propagated upwards given a // scroll direction. static bool CanPropagate(const LayoutBox* layout_box, @@ -131,25 +112,9 @@ private: Node* NodeTargetForScrollableAreaElementId( CompositorElementId scrollable_area_element_id) const; - WebInputEventResult HandleGestureScrollUpdate(const WebGestureEvent&); - WebInputEventResult HandleGestureScrollBegin(const WebGestureEvent&); - - // Handling of GestureScrollEnd may be deferred if there's an outstanding - // scroll animation. This is the callback that invokes the deferred operation. - void HandleDeferredGestureScrollEnd(const WebGestureEvent& gesture_event, - ScrollableArea::ScrollCompletionMode); - - WebInputEventResult PassScrollGestureEvent(const WebGestureEvent&, - LayoutObject*); - - Node* GetScrollEventTarget(); void ClearGestureScrollState(); - void CustomizedScroll(ScrollState&); - - Page* GetPage() const; - bool HandleScrollGestureOnResizer(Node*, const WebGestureEvent&); void RecomputeScrollChain(const Node& start_node, @@ -160,58 +125,17 @@ const Node& current_node, bool for_autoscroll); - uint32_t GetNonCompositedMainThreadScrollingReasons() const; - void RecordScrollRelatedMetrics(WebGestureDevice) const; - - bool SnapAtGestureScrollEnd(const WebGestureEvent& end_event, - base::ScopedClosureRunner callback); - - void AdjustForSnapAtScrollUpdate(const WebGestureEvent& gesture_event, - ScrollStateData* scroll_state_data); - - void NotifyScrollPhaseBeginForCustomizedScroll(const ScrollState&); - void NotifyScrollPhaseEndForCustomizedScroll(); - - LayoutBox* LayoutBoxForSnapping() const; - // NOTE: If adding a new field to this class please ensure that it is // cleared in |ScrollManager::clear()|. const Member<LocalFrame> frame_; - // Only used with the ScrollCustomization runtime enabled feature. - Deque<DOMNodeId> current_scroll_chain_; - Member<Node> scroll_gesture_handling_node_; - bool last_gesture_scroll_over_embedded_content_view_; - - // The most recent Node to scroll natively during this scroll - // sequence. Null if no native element has scrolled this scroll - // sequence, or if the most recent element to scroll used scroll - // customization. - Member<Node> previous_gesture_scrolled_node_; - - ScrollOffset last_scroll_delta_for_scroll_gesture_; - - // True iff some of the delta has been consumed for the current - // scroll sequence in this frame, or any child frames. Only used - // with ScrollCustomization. If some delta has been consumed, a - // scroll which shouldn't propagate can't cause any element to - // scroll other than the |m_previousGestureScrolledNode|. - bool delta_consumed_for_scroll_sequence_; - - // True iff some of the delta has been consumed for the current - // scroll sequence on the specific axis. - bool did_scroll_x_for_scroll_gesture_; - bool did_scroll_y_for_scroll_gesture_; - Member<Scrollbar> scrollbar_handling_scroll_gesture_; Member<PaintLayerScrollableArea> resize_scrollable_area_; - std::unique_ptr<cc::SnapFlingController> snap_fling_controller_; - // In the coords of resize_scrollable_area_. gfx::Vector2d offset_from_resize_corner_; };
diff --git a/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc b/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc index 48fb3fca..8326471 100644 --- a/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc +++ b/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc
@@ -192,13 +192,8 @@ back_forward_cache_loader_helper, std::move(throttles)); } -std::unique_ptr<WebCodeCacheLoader> -LoaderFactoryForFrame::CreateCodeCacheLoader() { - if (document_loader_->GetCodeCacheHost() == nullptr) { - return nullptr; - } - return blink::WebCodeCacheLoader::Create( - document_loader_->GetCodeCacheHost()); +CodeCacheHost* LoaderFactoryForFrame::GetCodeCacheHost() { + return document_loader_->GetCodeCacheHost(); } void LoaderFactoryForFrame::IssueKeepAliveHandleIfRequested(
diff --git a/third_party/blink/renderer/core/loader/loader_factory_for_frame.h b/third_party/blink/renderer/core/loader/loader_factory_for_frame.h index c800d65..ded01b3 100644 --- a/third_party/blink/renderer/core/loader/loader_factory_for_frame.h +++ b/third_party/blink/renderer/core/loader/loader_factory_for_frame.h
@@ -41,7 +41,7 @@ scoped_refptr<base::SingleThreadTaskRunner>, scoped_refptr<base::SingleThreadTaskRunner>, BackForwardCacheLoaderHelper*) override; - std::unique_ptr<WebCodeCacheLoader> CreateCodeCacheLoader() override; + CodeCacheHost* GetCodeCacheHost() override; private: void IssueKeepAliveHandleIfRequested(
diff --git a/third_party/blink/renderer/core/loader/loader_factory_for_worker.cc b/third_party/blink/renderer/core/loader/loader_factory_for_worker.cc index 23467e9..1aa7cdf 100644 --- a/third_party/blink/renderer/core/loader/loader_factory_for_worker.cc +++ b/third_party/blink/renderer/core/loader/loader_factory_for_worker.cc
@@ -16,6 +16,7 @@ #include "third_party/blink/renderer/core/fileapi/public_url_manager.h" #include "third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h" #include "third_party/blink/renderer/platform/exported/wrapped_resource_request.h" +#include "third_party/blink/renderer/platform/loader/fetch/code_cache_host.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h" #include "third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader.h" @@ -125,9 +126,8 @@ std::move(throttles)); } -std::unique_ptr<WebCodeCacheLoader> -LoaderFactoryForWorker::CreateCodeCacheLoader() { - return web_context_->CreateCodeCacheLoader(global_scope_->GetCodeCacheHost()); +CodeCacheHost* LoaderFactoryForWorker::GetCodeCacheHost() { + return global_scope_->GetCodeCacheHost(); } } // namespace blink
diff --git a/third_party/blink/renderer/core/loader/loader_factory_for_worker.h b/third_party/blink/renderer/core/loader/loader_factory_for_worker.h index f056559..b71b68fb 100644 --- a/third_party/blink/renderer/core/loader/loader_factory_for_worker.h +++ b/third_party/blink/renderer/core/loader/loader_factory_for_worker.h
@@ -30,7 +30,7 @@ scoped_refptr<base::SingleThreadTaskRunner> freezable_task_runner, scoped_refptr<base::SingleThreadTaskRunner> unfreezable_task_runner, BackForwardCacheLoaderHelper*) override; - std::unique_ptr<WebCodeCacheLoader> CreateCodeCacheLoader() override; + CodeCacheHost* GetCodeCacheHost() override; private: const Member<WorkerOrWorkletGlobalScope> global_scope_;
diff --git a/third_party/blink/renderer/core/loader/resource/resource_loader_code_cache_test.cc b/third_party/blink/renderer/core/loader/resource/resource_loader_code_cache_test.cc index a59688b..2fb51cb1 100644 --- a/third_party/blink/renderer/core/loader/resource/resource_loader_code_cache_test.cc +++ b/third_party/blink/renderer/core/loader/resource/resource_loader_code_cache_test.cc
@@ -3,11 +3,15 @@ // found in the LICENSE file. #include "base/task/single_thread_task_runner.h" +#include "base/test/bind.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" +#include "third_party/blink/public/mojom/loader/code_cache.mojom-blink.h" #include "third_party/blink/renderer/core/loader/resource/script_resource.h" #include "third_party/blink/renderer/platform/exported/wrapped_resource_response.h" #include "third_party/blink/renderer/platform/loader/fetch/cached_metadata.h" +#include "third_party/blink/renderer/platform/loader/fetch/code_cache_host.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_loader.h" #include "third_party/blink/renderer/platform/loader/fetch/script_cached_metadata_handler.h" @@ -15,15 +19,49 @@ #include "third_party/blink/renderer/platform/loader/testing/mock_fetch_context.h" #include "third_party/blink/renderer/platform/loader/testing/test_resource_fetcher_properties.h" #include "third_party/blink/renderer/platform/scheduler/test/fake_task_runner.h" -#include "third_party/blink/renderer/platform/testing/code_cache_loader_mock.h" #include "third_party/blink/renderer/platform/testing/mock_context_lifecycle_notifier.h" #include "third_party/blink/renderer/platform/testing/noop_url_loader.h" #include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h" +#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" #include "third_party/blink/renderer/platform/weborigin/scheme_registry.h" namespace blink { namespace { +using FetchCachedCodeCallback = + mojom::blink::CodeCacheHost::FetchCachedCodeCallback; +using ProcessCodeCacheRequestCallback = + base::RepeatingCallback<void(FetchCachedCodeCallback)>; + +class DummyCodeCacheHost final : public mojom::blink::CodeCacheHost { + public: + explicit DummyCodeCacheHost( + ProcessCodeCacheRequestCallback process_code_cache_request_callback) + : process_code_cache_request_callback_( + std::move(process_code_cache_request_callback)) {} + + // mojom::blink::CodeCacheHost implementations + void DidGenerateCacheableMetadata(mojom::blink::CodeCacheType cache_type, + const KURL& url, + base::Time expected_response_time, + mojo_base::BigBuffer data) override {} + void FetchCachedCode(mojom::blink::CodeCacheType cache_type, + const KURL& url, + FetchCachedCodeCallback callback) override { + process_code_cache_request_callback_.Run(std::move(callback)); + } + void ClearCodeCacheEntry(mojom::blink::CodeCacheType cache_type, + const KURL& url) override {} + void DidGenerateCacheableMetadataInCacheStorage( + const KURL& url, + base::Time expected_response_time, + mojo_base::BigBuffer data, + const WTF::String& cache_storage_cache_name) override {} + + private: + ProcessCodeCacheRequestCallback process_code_cache_request_callback_; +}; + class ResourceLoaderCodeCacheTest : public testing::Test { protected: static scoped_refptr<base::SingleThreadTaskRunner> CreateTaskRunner() { @@ -44,8 +82,16 @@ class CodeCacheTestLoaderFactory : public ResourceFetcher::LoaderFactory { public: explicit CodeCacheTestLoaderFactory( - scoped_refptr<CodeCacheLoaderMock::Controller> controller) - : controller_(std::move(controller)) {} + ProcessCodeCacheRequestCallback process_code_cache_request_callback) { + mojo::PendingRemote<mojom::blink::CodeCacheHost> pending_remote; + mojo::MakeSelfOwnedReceiver( + std::make_unique<DummyCodeCacheHost>( + std::move(process_code_cache_request_callback)), + pending_remote.InitWithNewPipeAndPassReceiver()); + code_cache_host_ = std::make_unique<CodeCacheHost>( + mojo::Remote<mojom::blink::CodeCacheHost>(std::move(pending_remote))); + } + std::unique_ptr<URLLoader> CreateURLLoader( const ResourceRequest& request, const ResourceLoaderOptions& options, @@ -55,12 +101,12 @@ override { return std::make_unique<NoopURLLoader>(std::move(freezable_task_runner)); } - std::unique_ptr<WebCodeCacheLoader> CreateCodeCacheLoader() override { - return std::make_unique<CodeCacheLoaderMock>(controller_); + CodeCacheHost* GetCodeCacheHost() override { + return code_cache_host_.get(); } private: - scoped_refptr<CodeCacheLoaderMock::Controller> controller_; + std::unique_ptr<CodeCacheHost> code_cache_host_; }; void CommonSetup(const char* url_string = nullptr) { @@ -70,12 +116,14 @@ SchemeRegistry::RegisterURLSchemeAsCodeCacheWithHashing( "codecachewithhashing"); + base::RunLoop run_loop; auto* properties = MakeGarbageCollected<TestResourceFetcherProperties>(); FetchContext* context = MakeGarbageCollected<MockFetchContext>(); - controller_ = base::MakeRefCounted<CodeCacheLoaderMock::Controller>(); - controller_->DelayResponse(); - auto* loader_factory = - MakeGarbageCollected<CodeCacheTestLoaderFactory>(controller_); + auto* loader_factory = MakeGarbageCollected<CodeCacheTestLoaderFactory>( + base::BindLambdaForTesting([&](FetchCachedCodeCallback callback) { + code_cache_response_callback_ = std::move(callback); + run_loop.Quit(); + })); auto* fetcher = MakeResourceFetcher(properties, context, loader_factory); KURL url(url_string ? url_string @@ -91,6 +139,7 @@ resource_ = ScriptResource::Fetch( params, fetcher, nullptr, ScriptResource::kNoStreaming, kNoCompileHintsProducer, kNoCompileHintsConsumer); + run_loop.Run(); loader_ = resource_->Loader(); response_ = ResourceResponse(url); @@ -131,6 +180,11 @@ return serialized_data; } + void Respond(base::Time time, mojo_base::BigBuffer data) { + std::move(code_cache_response_callback_).Run(time, std::move(data)); + test::RunPendingTasks(); + } + ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler> platform_; @@ -138,7 +192,7 @@ Persistent<ScriptResource> resource_; Persistent<ResourceLoader> loader_; ResourceResponse response_; - scoped_refptr<CodeCacheLoaderMock::Controller> controller_; + FetchCachedCodeCallback code_cache_response_callback_; }; TEST_F(ResourceLoaderCodeCacheTest, WebUICodeCacheEmptyResponseFirst) { @@ -150,7 +204,7 @@ EXPECT_FALSE(resource_->CodeCacheSize()); // An empty code cache response means no data was found. - controller_->Respond(base::Time(), mojo_base::BigBuffer()); + Respond(base::Time(), mojo_base::BigBuffer()); // No code cache data was present. EXPECT_FALSE(resource_->CodeCacheSize()); @@ -160,7 +214,7 @@ CommonSetup(); // An empty code cache response means no data was found. - controller_->Respond(base::Time(), mojo_base::BigBuffer()); + Respond(base::Time(), mojo_base::BigBuffer()); // Nothing has changed yet because the content response hasn't arrived yet. EXPECT_FALSE(resource_->CodeCacheSize()); @@ -180,9 +234,8 @@ EXPECT_FALSE(resource_->CodeCacheSize()); std::vector<uint8_t> cache_data{2, 3, 4, 5, 6}; - controller_->Respond( - base::Time(), - mojo_base::BigBuffer(MakeSerializedCodeCacheData(cache_data))); + Respond(base::Time(), + mojo_base::BigBuffer(MakeSerializedCodeCacheData(cache_data))); // Code cache data was present. EXPECT_EQ(resource_->CodeCacheSize(), @@ -193,9 +246,8 @@ CommonSetup(); std::vector<uint8_t> cache_data{2, 3, 4, 5, 6}; - controller_->Respond( - base::Time(), - mojo_base::BigBuffer(MakeSerializedCodeCacheData(cache_data))); + Respond(base::Time(), + mojo_base::BigBuffer(MakeSerializedCodeCacheData(cache_data))); // Nothing has changed yet because the content response hasn't arrived yet. EXPECT_FALSE(resource_->CodeCacheSize()); @@ -211,9 +263,8 @@ CommonSetup("https://www.example.com/"); std::vector<uint8_t> cache_data{2, 3, 4, 5, 6}; - controller_->Respond( - base::Time(), - mojo_base::BigBuffer(MakeSerializedCodeCacheData(cache_data))); + Respond(base::Time(), + mojo_base::BigBuffer(MakeSerializedCodeCacheData(cache_data))); // Nothing has changed yet because the content response hasn't arrived yet. EXPECT_FALSE(resource_->CodeCacheSize()); @@ -229,10 +280,9 @@ CommonSetup(); std::vector<uint8_t> cache_data{2, 3, 4, 5, 6}; - controller_->Respond( - base::Time(), - mojo_base::BigBuffer(MakeSerializedCodeCacheData( - cache_data, {}, 0, CachedMetadataHandler::kSingleEntryWithTag))); + Respond(base::Time(), + mojo_base::BigBuffer(MakeSerializedCodeCacheData( + cache_data, {}, 0, CachedMetadataHandler::kSingleEntryWithTag))); // Nothing has changed yet because the content response hasn't arrived yet. EXPECT_FALSE(resource_->CodeCacheSize()); @@ -248,9 +298,8 @@ std::vector<uint8_t> cache_data{2, 3, 4, 5, 6}; String source_text("alert('hello world');"); - controller_->Respond( - base::Time(), mojo_base::BigBuffer( - MakeSerializedCodeCacheData(cache_data, source_text))); + Respond(base::Time(), mojo_base::BigBuffer(MakeSerializedCodeCacheData( + cache_data, source_text))); // Nothing has changed yet because the content response hasn't arrived yet. EXPECT_FALSE(resource_->CodeCacheSize()); @@ -283,9 +332,8 @@ std::vector<uint8_t> cache_data{2, 3, 4, 5, 6}; String source_text("alert('hello world');"); - controller_->Respond( - base::Time(), mojo_base::BigBuffer( - MakeSerializedCodeCacheData(cache_data, source_text))); + Respond(base::Time(), mojo_base::BigBuffer(MakeSerializedCodeCacheData( + cache_data, source_text))); // Nothing has changed yet because the content response hasn't arrived yet. EXPECT_FALSE(resource_->CodeCacheSize());
diff --git a/third_party/blink/renderer/core/page/scrolling/scroll_customization_callbacks.cc b/third_party/blink/renderer/core/page/scrolling/scroll_customization_callbacks.cc index e961a67..3d4036a 100644 --- a/third_party/blink/renderer/core/page/scrolling/scroll_customization_callbacks.cc +++ b/third_party/blink/renderer/core/page/scrolling/scroll_customization_callbacks.cc
@@ -41,12 +41,7 @@ } bool ScrollCustomizationCallbacks::InScrollPhase(Node* node) const { - return in_scrolling_phase_.Contains(node) && in_scrolling_phase_.at(node); -} - -void ScrollCustomizationCallbacks::SetInScrollPhase(Node* node, bool value) { - DCHECK(node); - in_scrolling_phase_.Set(node, value); + return false; } } // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/scroll_customization_callbacks.h b/third_party/blink/renderer/core/page/scrolling/scroll_customization_callbacks.h index a161de6..545b25c0 100644 --- a/third_party/blink/renderer/core/page/scrolling/scroll_customization_callbacks.h +++ b/third_party/blink/renderer/core/page/scrolling/scroll_customization_callbacks.h
@@ -28,12 +28,10 @@ void RemoveApplyScroll(Node*); ScrollStateCallback* GetApplyScroll(Node*); bool InScrollPhase(Node*) const; - void SetInScrollPhase(Node*, bool); void Trace(Visitor* visitor) const { visitor->Trace(apply_scroll_callbacks_); visitor->Trace(distribute_scroll_callbacks_); - visitor->Trace(in_scrolling_phase_); } private: @@ -41,7 +39,6 @@ HeapHashMap<WeakMember<Node>, Member<ScrollStateCallback>>; ScrollStateCallbackList apply_scroll_callbacks_; ScrollStateCallbackList distribute_scroll_callbacks_; - HeapHashMap<WeakMember<Node>, bool> in_scrolling_phase_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/scroll/build.gni b/third_party/blink/renderer/core/scroll/build.gni index 82d0da5..77542c3 100644 --- a/third_party/blink/renderer/core/scroll/build.gni +++ b/third_party/blink/renderer/core/scroll/build.gni
@@ -15,7 +15,6 @@ "scroll_animator_base.h", "scroll_animator_compositor_coordinator.cc", "scroll_animator_compositor_coordinator.h", - "scroll_customization.cc", "scroll_customization.h", "scroll_into_view_util.cc", "scroll_into_view_util.h",
diff --git a/third_party/blink/renderer/core/scroll/scroll_customization.cc b/third_party/blink/renderer/core/scroll/scroll_customization.cc deleted file mode 100644 index 0b7f3bf..0000000 --- a/third_party/blink/renderer/core/scroll/scroll_customization.cc +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/scroll/scroll_customization.h" - -namespace blink { -namespace scroll_customization { - -ScrollDirection GetScrollDirectionFromDeltas(double delta_x, double delta_y) { - // TODO(ekaramad, tdresser): Find out the right value for kEpsilon here (see - // https://crbug.com/510550). - const double kEpsilon = 0.1f; - - ScrollDirection direction = kScrollDirectionNone; - if (delta_x > kEpsilon) - direction |= kScrollDirectionPanRight; - if (delta_x < -kEpsilon) - direction |= kScrollDirectionPanLeft; - if (delta_y > kEpsilon) - direction |= kScrollDirectionPanDown; - if (delta_y < -kEpsilon) - direction |= kScrollDirectionPanUp; - - if (!direction) { - // TODO(ekaramad, sahel): Remove this and perhaps replace with a DCHECK when - // issue https://crbug.com/728214 is fixed. - return kScrollDirectionAuto; - } - - return direction; -} - -} // namespace scroll_customization -} // namespace blink
diff --git a/third_party/blink/renderer/core/scroll/scroll_customization.h b/third_party/blink/renderer/core/scroll/scroll_customization.h index 009261e4..f9759cd 100644 --- a/third_party/blink/renderer/core/scroll/scroll_customization.h +++ b/third_party/blink/renderer/core/scroll/scroll_customization.h
@@ -25,8 +25,6 @@ constexpr ScrollDirection kScrollDirectionAuto = kScrollDirectionPanX | kScrollDirectionPanY; -CORE_EXPORT ScrollDirection GetScrollDirectionFromDeltas(double delta_x, - double delta_y); } // namespace scroll_customization } // namespace blink
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc index b6253f05..b79ddc76 100644 --- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc +++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -70,6 +70,7 @@ #include "third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.h" #include "third_party/blink/renderer/modules/geolocation/geolocation_coordinates.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/blink/renderer/platform/heap/heap_traits.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h" #include "third_party/blink/renderer/platform/wtf/text/base64.h" @@ -248,15 +249,21 @@ ~AuctionHandle() override = default; - void AttachPromiseHandler(ScriptState& script_state, - ScriptPromise promise, - ScriptFunction::Callable* success_helper) { - promise.Then( - MakeGarbageCollected<ScriptFunction>(&script_state, success_helper), - MakeGarbageCollected<ScriptFunction>( - &script_state, - MakeGarbageCollected<NavigatorAuction::AuctionHandle::Rejected>( - this))); + void QueueAttachPromiseHandler(ScriptPromise promise, + ScriptFunction::Callable* success_helper) { + queued_promises_.emplace_back(promise, success_helper); + } + + void AttachQueuedPromises(ScriptState& script_state) { + for (auto& [promise, success_helper] : queued_promises_) { + promise.Then( + MakeGarbageCollected<ScriptFunction>(&script_state, success_helper), + MakeGarbageCollected<ScriptFunction>( + &script_state, + MakeGarbageCollected<NavigatorAuction::AuctionHandle::Rejected>( + this))); + } + queued_promises_.clear(); } void Abort() { abortable_ad_auction_->Abort(); } @@ -267,6 +274,7 @@ void Trace(Visitor* visitor) const override { visitor->Trace(abortable_ad_auction_); visitor->Trace(auction_resolver_); + visitor->Trace(queued_promises_); AbortSignal::Algorithm::Trace(visitor); } @@ -285,6 +293,7 @@ } private: + VectorOfPairs<ScriptPromise, ScriptFunction::Callable> queued_promises_; HeapMojoRemote<mojom::blink::AbortableAdAuction> abortable_ad_auction_; absl::optional<bool> resolve_to_config_; @@ -1129,7 +1138,6 @@ bool CopyServerResponseFromIdlToMojo( NavigatorAuction::AuctionHandle* auction_handle, mojom::blink::AuctionAdConfigAuctionId* auction_id, - ScriptState& script_state, ExceptionState& exception_state, const AuctionAdConfig& input, mojom::blink::AuctionAdConfig& output) { @@ -1166,8 +1174,8 @@ return false; } - auction_handle->AttachPromiseHandler( - script_state, input.serverResponse(), + auction_handle->QueueAttachPromiseHandler( + input.serverResponse(), MakeGarbageCollected< NavigatorAuction::AuctionHandle::ServerResponseResolved>( auction_handle, auction_id->Clone(), input.seller())); @@ -1268,13 +1276,12 @@ ConvertJsonPromiseFromIdlToMojo( NavigatorAuction::AuctionHandle* auction_handle, mojom::blink::AuctionAdConfigAuctionId* auction_id, - ScriptState& script_state, const AuctionAdConfig& input, const ScriptPromise& promise, mojom::blink::AuctionAdConfigField field, const char* field_name) { - auction_handle->AttachPromiseHandler( - script_state, promise, + auction_handle->QueueAttachPromiseHandler( + promise, MakeGarbageCollected<NavigatorAuction::AuctionHandle::JsonResolved>( auction_handle, auction_id->Clone(), field, input.seller(), field_name)); @@ -1286,7 +1293,6 @@ void CopyAuctionSignalsFromIdlToMojo( NavigatorAuction::AuctionHandle* auction_handle, mojom::blink::AuctionAdConfigAuctionId* auction_id, - ScriptState& script_state, const AuctionAdConfig& input, mojom::blink::AuctionAdConfig& output) { DCHECK_EQ(auction_id == nullptr, auction_handle == nullptr); @@ -1299,8 +1305,7 @@ output.auction_ad_config_non_shared_params->auction_signals = ConvertJsonPromiseFromIdlToMojo( - auction_handle, auction_id, script_state, input, - input.auctionSignals(), + auction_handle, auction_id, input, input.auctionSignals(), mojom::blink::AuctionAdConfigField::kAuctionSignals, "auctionSignals"); } @@ -1308,7 +1313,6 @@ void CopySellerSignalsFromIdlToMojo( NavigatorAuction::AuctionHandle* auction_handle, mojom::blink::AuctionAdConfigAuctionId* auction_id, - ScriptState& script_state, const AuctionAdConfig& input, mojom::blink::AuctionAdConfig& output) { if (!input.hasSellerSignals()) { @@ -1319,8 +1323,7 @@ output.auction_ad_config_non_shared_params->seller_signals = ConvertJsonPromiseFromIdlToMojo( - auction_handle, auction_id, script_state, input, - input.sellerSignals(), + auction_handle, auction_id, input, input.sellerSignals(), mojom::blink::AuctionAdConfigField::kSellerSignals, "sellerSignals"); } @@ -1457,7 +1460,6 @@ void CopyDirectFromSellerSignalsFromIdlToMojo( NavigatorAuction::AuctionHandle* auction_handle, const mojom::blink::AuctionAdConfigAuctionId* auction_id, - ScriptState& script_state, const AuctionAdConfig& input, mojom::blink::AuctionAdConfig& output) { if (!input.hasDirectFromSellerSignals()) { @@ -1466,8 +1468,8 @@ return; } - auction_handle->AttachPromiseHandler( - script_state, input.directFromSellerSignals(), + auction_handle->QueueAttachPromiseHandler( + input.directFromSellerSignals(), MakeGarbageCollected< NavigatorAuction::AuctionHandle::DirectFromSellerSignalsResolved>( auction_handle, auction_id->Clone(), input.seller(), output.seller, @@ -1479,7 +1481,6 @@ void CopyDirectFromSellerSignalsHeaderAdSlotFromIdlToMojo( NavigatorAuction::AuctionHandle* auction_handle, const mojom::blink::AuctionAdConfigAuctionId* auction_id, - ScriptState& script_state, const AuctionAdConfig& input, mojom::blink::AuctionAdConfig& output) { if (!input.hasDirectFromSellerSignalsHeaderAdSlot()) { @@ -1487,8 +1488,8 @@ return; } - auction_handle->AttachPromiseHandler( - script_state, input.directFromSellerSignalsHeaderAdSlot(), + auction_handle->QueueAttachPromiseHandler( + input.directFromSellerSignalsHeaderAdSlot(), MakeGarbageCollected<NavigatorAuction::AuctionHandle:: DirectFromSellerSignalsHeaderAdSlotResolved>( auction_handle, auction_id->Clone(), input.seller())); @@ -1498,7 +1499,6 @@ bool CopyAdditionalBidsFromIdlToMojo( NavigatorAuction::AuctionHandle* auction_handle, const mojom::blink::AuctionAdConfigAuctionId* auction_id, - ScriptState& script_state, ExceptionState& exception_state, const AuctionAdConfig& input, mojom::blink::AuctionAdConfig& output) { @@ -1524,8 +1524,8 @@ return false; } - auction_handle->AttachPromiseHandler( - script_state, input.additionalBids(), + auction_handle->QueueAttachPromiseHandler( + input.additionalBids(), MakeGarbageCollected< NavigatorAuction::AuctionHandle::AdditionalBidsResolved>( auction_handle, auction_id->Clone(), input.seller())); @@ -1597,7 +1597,6 @@ void CopyPerBuyerSignalsFromIdlToMojo( NavigatorAuction::AuctionHandle* auction_handle, const mojom::blink::AuctionAdConfigAuctionId* auction_id, - ScriptState& script_state, const AuctionAdConfig& input, mojom::blink::AuctionAdConfig& output) { if (!input.hasPerBuyerSignals()) { @@ -1607,8 +1606,8 @@ return; } - auction_handle->AttachPromiseHandler( - script_state, input.perBuyerSignals(), + auction_handle->QueueAttachPromiseHandler( + input.perBuyerSignals(), MakeGarbageCollected< NavigatorAuction::AuctionHandle::PerBuyerSignalsResolved>( auction_handle, auction_id->Clone(), input.seller())); @@ -1672,7 +1671,6 @@ void CopyPerBuyerTimeoutsFromIdlToMojo( NavigatorAuction::AuctionHandle* auction_handle, const mojom::blink::AuctionAdConfigAuctionId* auction_id, - ScriptState& script_state, const AuctionAdConfig& input, mojom::blink::AuctionAdConfig& output) { if (!input.hasPerBuyerTimeouts()) { @@ -1682,8 +1680,8 @@ return; } - auction_handle->AttachPromiseHandler( - script_state, input.perBuyerTimeouts(), + auction_handle->QueueAttachPromiseHandler( + input.perBuyerTimeouts(), MakeGarbageCollected< NavigatorAuction::AuctionHandle::BuyerTimeoutsResolved>( auction_handle, auction_id->Clone(), @@ -1696,7 +1694,6 @@ void CopyPerBuyerCumulativeTimeoutsFromIdlToMojo( NavigatorAuction::AuctionHandle* auction_handle, const mojom::blink::AuctionAdConfigAuctionId* auction_id, - ScriptState& script_state, const AuctionAdConfig& input, mojom::blink::AuctionAdConfig& output) { if (!input.hasPerBuyerCumulativeTimeouts()) { @@ -1706,8 +1703,8 @@ return; } - auction_handle->AttachPromiseHandler( - script_state, input.perBuyerCumulativeTimeouts(), + auction_handle->QueueAttachPromiseHandler( + input.perBuyerCumulativeTimeouts(), MakeGarbageCollected< NavigatorAuction::AuctionHandle::BuyerTimeoutsResolved>( auction_handle, auction_id->Clone(), @@ -1766,7 +1763,6 @@ void CopyPerBuyerCurrenciesFromIdlToMojo( NavigatorAuction::AuctionHandle* auction_handle, const mojom::blink::AuctionAdConfigAuctionId* auction_id, - ScriptState& script_state, const AuctionAdConfig& input, mojom::blink::AuctionAdConfig& output) { if (!input.hasPerBuyerCurrencies()) { @@ -1776,8 +1772,8 @@ return; } - auction_handle->AttachPromiseHandler( - script_state, input.perBuyerCurrencies(), + auction_handle->QueueAttachPromiseHandler( + input.perBuyerCurrencies(), MakeGarbageCollected< NavigatorAuction::AuctionHandle::BuyerCurrenciesResolved>( auction_handle, auction_id->Clone(), input.seller())); @@ -2085,8 +2081,7 @@ if (!CopySellerFromIdlToMojo(exception_state, config, *mojo_config) || !CopyServerResponseFromIdlToMojo(auction_handle, auction_id.get(), - script_state, exception_state, config, - *mojo_config) || + exception_state, config, *mojo_config) || !CopyDecisionLogicUrlFromIdlToMojo(context, exception_state, config, *mojo_config) || !CopyTrustedScoringSignalsFromIdlToMojo(context, exception_state, config, @@ -2110,8 +2105,7 @@ !CopyAuctionNonceFromIdlToMojo(context, exception_state, config, *mojo_config) || !CopyAdditionalBidsFromIdlToMojo(auction_handle, auction_id.get(), - script_state, exception_state, config, - *mojo_config) || + exception_state, config, *mojo_config) || !CopyAggregationCoordinatorOriginFromIdlToMojo(exception_state, config, *mojo_config)) { return mojom::blink::AuctionAdConfigPtr(); @@ -2127,22 +2121,22 @@ return mojom::blink::AuctionAdConfigPtr(); } - CopyAuctionSignalsFromIdlToMojo(auction_handle, auction_id.get(), - script_state, config, *mojo_config); - CopySellerSignalsFromIdlToMojo(auction_handle, auction_id.get(), script_state, - config, *mojo_config); + CopyAuctionSignalsFromIdlToMojo(auction_handle, auction_id.get(), config, + *mojo_config); + CopySellerSignalsFromIdlToMojo(auction_handle, auction_id.get(), config, + *mojo_config); CopyDirectFromSellerSignalsFromIdlToMojo(auction_handle, auction_id.get(), - script_state, config, *mojo_config); + config, *mojo_config); CopyDirectFromSellerSignalsHeaderAdSlotFromIdlToMojo( - auction_handle, auction_id.get(), script_state, config, *mojo_config); - CopyPerBuyerSignalsFromIdlToMojo(auction_handle, auction_id.get(), - script_state, config, *mojo_config); - CopyPerBuyerTimeoutsFromIdlToMojo(auction_handle, auction_id.get(), - script_state, config, *mojo_config); - CopyPerBuyerCumulativeTimeoutsFromIdlToMojo( - auction_handle, auction_id.get(), script_state, config, *mojo_config); - CopyPerBuyerCurrenciesFromIdlToMojo(auction_handle, auction_id.get(), - script_state, config, *mojo_config); + auction_handle, auction_id.get(), config, *mojo_config); + CopyPerBuyerSignalsFromIdlToMojo(auction_handle, auction_id.get(), config, + *mojo_config); + CopyPerBuyerTimeoutsFromIdlToMojo(auction_handle, auction_id.get(), config, + *mojo_config); + CopyPerBuyerCumulativeTimeoutsFromIdlToMojo(auction_handle, auction_id.get(), + config, *mojo_config); + CopyPerBuyerCurrenciesFromIdlToMojo(auction_handle, auction_id.get(), config, + *mojo_config); if (mojo_config->server_response && !is_top_level) { // TODO(1457241): Add support for multi-level auctions including server-side @@ -3240,8 +3234,8 @@ } if (config->hasResolveToConfig()) { - auction_handle->AttachPromiseHandler( - *script_state, config->resolveToConfig(), + auction_handle->QueueAttachPromiseHandler( + config->resolveToConfig(), MakeGarbageCollected< NavigatorAuction::AuctionHandle::ResolveToConfigResolved>( auction_handle)); @@ -3249,6 +3243,7 @@ auction_handle->SetResolveToConfig(false); } + auction_handle->AttachQueuedPromises(*script_state); ad_auction_service_->RunAdAuction( std::move(mojo_config), std::move(abort_receiver), WTF::BindOnce(&NavigatorAuction::AuctionHandle::AuctionComplete, @@ -3531,14 +3526,13 @@ // TODO(morlovich): These no longer work since promise-capable type handling // requires non-null auction_handle. CopyAuctionSignalsFromIdlToMojo(/*auction_handle=*/nullptr, - /*auction_id=*/nullptr, *script_state, - *config, *mojo_config); + /*auction_id=*/nullptr, *config, + *mojo_config); CopySellerSignalsFromIdlToMojo(/*auction_handle=*/nullptr, - /*auction_id=*/nullptr, *script_state, *config, - *mojo_config); + /*auction_id=*/nullptr, *config, *mojo_config); CopyPerBuyerSignalsFromIdlToMojo(/*auction_handle=*/nullptr, - /*auction_id=*/nullptr, *script_state, - *config, *mojo_config); + /*auction_id=*/nullptr, *config, + *mojo_config); if (!ValidateAdsObject(exception_state, ads)) { return ScriptPromise();
diff --git a/third_party/blink/renderer/modules/credentialmanagement/BUILD.gn b/third_party/blink/renderer/modules/credentialmanagement/BUILD.gn index 32e65e14a..500bac1 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/BUILD.gn +++ b/third_party/blink/renderer/modules/credentialmanagement/BUILD.gn
@@ -24,6 +24,8 @@ "federated_credential.h", "identity_credential.cc", "identity_credential.h", + "identity_credential_error.cc", + "identity_credential_error.h", "identity_provider.cc", "identity_provider.h", "json.cc",
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc index fd185b4..b1e6bd95 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc
@@ -63,6 +63,7 @@ #include "third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.h" // IWYU pragma: keep #include "third_party/blink/renderer/modules/credentialmanagement/federated_credential.h" #include "third_party/blink/renderer/modules/credentialmanagement/identity_credential.h" +#include "third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.h" #include "third_party/blink/renderer/modules/credentialmanagement/otp_credential.h" #include "third_party/blink/renderer/modules/credentialmanagement/password_credential.h" #include "third_party/blink/renderer/modules/credentialmanagement/public_key_credential.h" @@ -536,6 +537,7 @@ RequestTokenStatus status, const absl::optional<KURL>& selected_idp_config_url, const WTF::String& token, + mojom::blink::TokenErrorPtr error, bool is_account_auto_selected) { switch (status) { case RequestTokenStatus::kErrorTooManyRequests: { @@ -559,8 +561,13 @@ return; } case RequestTokenStatus::kError: { - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kNetworkError, "Error retrieving a token.")); + if (!RuntimeEnabledFeatures::FedCmErrorEnabled() || !error) { + resolver->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kNetworkError, "Error retrieving a token.")); + return; + } + resolver->Reject(MakeGarbageCollected<IdentityCredentialError>( + "Error retrieving a token.", error->code, error->url)); return; } case RequestTokenStatus::kSuccess: {
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.cc b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.cc new file mode 100644 index 0000000..6064b40e --- /dev/null +++ b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.cc
@@ -0,0 +1,32 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_error_init.h" +#include "third_party/blink/renderer/platform/heap/garbage_collected.h" + +namespace blink { + +// static +IdentityCredentialError* IdentityCredentialError::Create( + const String& message, + const IdentityCredentialErrorInit* options) { + return MakeGarbageCollected<IdentityCredentialError>(message, options); +} + +IdentityCredentialError::IdentityCredentialError( + const String& message, + const IdentityCredentialErrorInit* options) + : DOMException(DOMExceptionCode::kIdentityCredentialError, message), + code_(options->hasCode() ? options->code() : ""), + url_(options->hasUrl() ? options->url() : "") {} + +IdentityCredentialError::IdentityCredentialError(const String& message, + const String& code, + const String& url) + : DOMException(DOMExceptionCode::kIdentityCredentialError, message), + code_(code), + url_(url) {} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.h b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.h new file mode 100644 index 0000000..4861d38b --- /dev/null +++ b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.h
@@ -0,0 +1,41 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_CREDENTIALMANAGEMENT_IDENTITY_CREDENTIAL_ERROR_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_CREDENTIALMANAGEMENT_IDENTITY_CREDENTIAL_ERROR_H_ + +#include "third_party/blink/renderer/core/dom/dom_exception.h" +#include "third_party/blink/renderer/modules/modules_export.h" + +namespace blink { + +class IdentityCredentialErrorInit; + +// https://fedidcg.github.io/FedCM/#browser-api-identity-credential-error-interface +class MODULES_EXPORT IdentityCredentialError : public DOMException { + DEFINE_WRAPPERTYPEINFO(); + + public: + // Constructor exposed to script. Called by the V8 bindings. + static IdentityCredentialError* Create( + const String& message, + const IdentityCredentialErrorInit* options); + + IdentityCredentialError(const String& message, + const IdentityCredentialErrorInit* options); + IdentityCredentialError(const String& message, + const String& code, + const String& url); + + String code() const { return code_; } + String url() const { return url_; } + + private: + const String code_; + const String url_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_CREDENTIALMANAGEMENT_IDENTITY_CREDENTIAL_ERROR_H_
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.idl b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.idl new file mode 100644 index 0000000..6b269bc --- /dev/null +++ b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.idl
@@ -0,0 +1,24 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://fedidcg.github.io/FedCM/#browser-api-identity-credential-error-interface + +dictionary IdentityCredentialErrorInit { + DOMString code; + DOMString url; +}; + +[ + Exposed=Window, + SecureContext, + RuntimeEnabled=FedCmError +] interface IdentityCredentialError : DOMException { + constructor(optional DOMString message = "", optional IdentityCredentialErrorInit options = {}); + + // Type of error which resulted in an IdentityCredential not being created. + readonly attribute DOMString code; + + // URL where the user can learn more information about the error. + readonly attribute DOMString url; +};
diff --git a/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.cc b/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.cc index de6800e..2c23ce9 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/dom/scoped_abort_state.h" #include "third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.h" #include "third_party/blink/renderer/modules/credentialmanagement/identity_credential.h" +#include "third_party/blink/renderer/modules/credentialmanagement/identity_credential_error.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" @@ -21,6 +22,7 @@ mojom::blink::RequestTokenStatus status, const absl::optional<KURL>& selected_idp_config_url, const WTF::String& token, + mojom::blink::TokenErrorPtr error, bool is_account_auto_selected) { for (const auto& provider_resolver_pair : provider_to_resolver_) { KURL provider = provider_resolver_pair.key; @@ -40,15 +42,25 @@ continue; } case mojom::blink::RequestTokenStatus::kError: { - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kNetworkError, "Error retrieving a token.")); + if (!RuntimeEnabledFeatures::FedCmErrorEnabled() || !error) { + resolver->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kNetworkError, "Error retrieving a token.")); + continue; + } + resolver->Reject(MakeGarbageCollected<IdentityCredentialError>( + "Error retrieving a token.", error->code, error->url)); continue; } case mojom::blink::RequestTokenStatus::kSuccess: { DCHECK(selected_idp_config_url); if (provider != selected_idp_config_url) { - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kNetworkError, "Error retrieving a token.")); + if (!RuntimeEnabledFeatures::FedCmErrorEnabled() || !error) { + resolver->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kNetworkError, "Error retrieving a token.")); + continue; + } + resolver->Reject(MakeGarbageCollected<IdentityCredentialError>( + "Error retrieving a token.", error->code, error->url)); continue; } IdentityCredential* credential = @@ -199,7 +211,8 @@ if (!is_requesting_token_) { OnRequestToken(mojom::blink::RequestTokenStatus::kErrorCanceled, - absl::nullopt, "", /*is_account_auto_selected=*/false); + absl::nullopt, "", nullptr, + /*is_account_auto_selected=*/false); return; }
diff --git a/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.h b/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.h index 7d441dd..ca2f1eb 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.h +++ b/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.h
@@ -31,6 +31,7 @@ void OnRequestToken(mojom::blink::RequestTokenStatus status, const absl::optional<KURL>& selected_idp_config_url, const WTF::String& token, + const mojom::blink::TokenErrorPtr error, bool is_account_auto_selected); // Invoked at most once per token request.
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request_test.cc b/third_party/blink/renderer/modules/indexeddb/idb_request_test.cc index cd5e341..2d3dfbc 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_request_test.cc +++ b/third_party/blink/renderer/modules/indexeddb/idb_request_test.cc
@@ -39,6 +39,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h" #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" +#include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/platform/web_url_response.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_transaction_test.cc b/third_party/blink/renderer/modules/indexeddb/idb_transaction_test.cc index a8c0046..b2a830f2 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_transaction_test.cc +++ b/third_party/blink/renderer/modules/indexeddb/idb_transaction_test.cc
@@ -36,6 +36,7 @@ #include "base/memory/scoped_refptr.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" +#include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/platform/web_url_response.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" #include "third_party/blink/renderer/core/dom/document.h"
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 6c68728..8c710aa 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -751,6 +751,7 @@ "fonts/shaping/stretchy_operator_shaper.h", "fonts/shaping/text_auto_space.cc", "fonts/shaping/text_auto_space.h", + "fonts/shaping/text_spacing_trim.h", "fonts/simple_font_data.cc", "fonts/simple_font_data.h", "fonts/skia/font_cache_skia.cc", @@ -1861,8 +1862,6 @@ "graphics/test/mock_frame_sink_bundle.h", "graphics/test/mock_image_decoder.h", "graphics/test/mock_paint_canvas.h", - "testing/code_cache_loader_mock.cc", - "testing/code_cache_loader_mock.h", "testing/compositor_test.cc", "testing/compositor_test.h", "testing/empty_web_media_player.cc",
diff --git a/third_party/blink/renderer/platform/bindings/exception_code.h b/third_party/blink/renderer/platform/bindings/exception_code.h index c6cbc327..874c8af 100644 --- a/third_party/blink/renderer/platform/bindings/exception_code.h +++ b/third_party/blink/renderer/platform/bindings/exception_code.h
@@ -124,6 +124,10 @@ // https://w3c.github.io/mediacapture-main/#overconstrainederror-interface kOverconstrainedError, + // FedCM API + // https://fedidcg.github.io/FedCM/#browser-api-identity-credential-error-interface + kIdentityCredentialError, + kNumOfCodes, };
diff --git a/third_party/blink/renderer/platform/fonts/font_description.cc b/third_party/blink/renderer/platform/fonts/font_description.cc index 35232d5b..e5e850fb 100644 --- a/third_party/blink/renderer/platform/fonts/font_description.cc +++ b/third_party/blink/renderer/platform/fonts/font_description.cc
@@ -114,6 +114,7 @@ fields_.font_synthesis_style_ = kAutoFontSynthesisStyle; fields_.font_synthesis_small_caps_ = kAutoFontSynthesisSmallCaps; fields_.variant_position_ = kNormalVariantPosition; + static_assert(static_cast<unsigned>(TextSpacingTrim::kSpaceFirst) == 0); } FontDescription::FontDescription(const FontDescription&) = default;
diff --git a/third_party/blink/renderer/platform/fonts/font_description.h b/third_party/blink/renderer/platform/fonts/font_description.h index fa63909..d16673d 100644 --- a/third_party/blink/renderer/platform/fonts/font_description.h +++ b/third_party/blink/renderer/platform/fonts/font_description.h
@@ -43,6 +43,7 @@ #include "third_party/blink/renderer/platform/fonts/font_variant_numeric.h" #include "third_party/blink/renderer/platform/fonts/font_width_variant.h" #include "third_party/blink/renderer/platform/fonts/opentype/font_settings.h" +#include "third_party/blink/renderer/platform/fonts/shaping/text_spacing_trim.h" #include "third_party/blink/renderer/platform/fonts/text_rendering_mode.h" #include "third_party/blink/renderer/platform/fonts/typesetting_features.h" #include "third_party/blink/renderer/platform/text/layout_locale.h" @@ -247,6 +248,9 @@ Family().FamilyName() == font_family_names::kMonospace; } Kerning GetKerning() const { return static_cast<Kerning>(fields_.kerning_); } + TextSpacingTrim GetTextSpacingTrim() const { + return static_cast<TextSpacingTrim>(fields_.text_spacing_trim_); + } FontVariantEastAsian VariantEastAsian() const { return FontVariantEastAsian::InitializeFromUnsigned( fields_.variant_east_asian_); @@ -370,6 +374,9 @@ fields_.kerning_ = kerning; UpdateTypesettingFeatures(); } + void SetTextSpacingTrim(TextSpacingTrim text_spacing_trim) { + fields_.text_spacing_trim_ = static_cast<unsigned>(text_spacing_trim); + } void SetKeywordSize(unsigned s) { fields_.keyword_size_ = s; } void SetFontSmoothing(FontSmoothingMode smoothing) { fields_.font_smoothing_ = smoothing; @@ -557,6 +564,7 @@ unsigned font_optical_sizing_ : 1; unsigned has_size_adjust_descriptor_ : 1; unsigned variant_position_ : 2; + unsigned text_spacing_trim_ : kTextSpacingTrimBitCount; unsigned hash_category_ : 2; // HashCategory };
diff --git a/third_party/blink/renderer/platform/fonts/shaping/text_spacing_trim.h b/third_party/blink/renderer/platform/fonts/shaping/text_spacing_trim.h new file mode 100644 index 0000000..743bf53 --- /dev/null +++ b/third_party/blink/renderer/platform/fonts/shaping/text_spacing_trim.h
@@ -0,0 +1,21 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_SHAPING_TEXT_SPACING_TRIM_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_SHAPING_TEXT_SPACING_TRIM_H_ + +namespace blink { + +// Values for the `text-spacing-trim` property. +// https://drafts.csswg.org/css-text-4/#text-spacing-trim-property +enum class TextSpacingTrim { + kSpaceFirst, + kSpaceAll, +}; + +constexpr unsigned kTextSpacingTrimBitCount = 1; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_SHAPING_TEXT_SPACING_TRIM_H_
diff --git a/third_party/blink/renderer/platform/loader/BUILD.gn b/third_party/blink/renderer/platform/loader/BUILD.gn index 1272df2..d5d3383 100644 --- a/third_party/blink/renderer/platform/loader/BUILD.gn +++ b/third_party/blink/renderer/platform/loader/BUILD.gn
@@ -123,8 +123,6 @@ "fetch/unique_identifier.h", "fetch/url_loader/cached_metadata_handler.cc", "fetch/url_loader/cached_metadata_handler.h", - "fetch/url_loader/code_cache_loader.cc", - "fetch/url_loader/code_cache_loader.h", "fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc", "fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.h", "fetch/url_loader/mojo_url_loader_client.cc",
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 d249f94..f3974ef 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -57,7 +57,6 @@ #include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h" -#include "third_party/blink/public/platform/web_code_cache_loader.h" #include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h" @@ -1601,11 +1600,11 @@ back_forward_cache_loader_helper_); } -std::unique_ptr<WebCodeCacheLoader> ResourceFetcher::CreateCodeCacheLoader() { +CodeCacheHost* ResourceFetcher::GetCodeCacheHost() { DCHECK(!GetProperties().IsDetached()); // TODO(http://crbug.com/1252983): Revert this to DCHECK. CHECK(loader_factory_); - return loader_factory_->CreateCodeCacheLoader(); + return loader_factory_->GetCodeCacheHost(); } void ResourceFetcher::AddToMemoryCacheIfNeeded(const FetchParameters& params,
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h index 6599ea19..14df820 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
@@ -66,6 +66,7 @@ enum class ResourceType : uint8_t; class BackForwardCacheLoaderHelper; +class CodeCacheHost; class DetachableConsoleLogger; class DetachableUseCounter; class DetachableResourceFetcherProperties; @@ -78,7 +79,6 @@ class ResourceLoadObserver; class SubresourceWebBundle; class SubresourceWebBundleList; -class WebCodeCacheLoader; struct ResourceFetcherInit; struct ResourceLoaderOptions; @@ -117,8 +117,8 @@ scoped_refptr<base::SingleThreadTaskRunner> unfreezable_task_runner, BackForwardCacheLoaderHelper*) = 0; - // Create a code cache loader to fetch data from code caches. - virtual std::unique_ptr<WebCodeCacheLoader> CreateCodeCacheLoader() = 0; + // Get a code cache host to fetch data from code caches. + virtual CodeCacheHost* GetCodeCacheHost() = 0; }; // ResourceFetcher creators are responsible for setting consistent objects @@ -174,9 +174,8 @@ // Create a loader. This cannot be called after ClearContext is called. std::unique_ptr<URLLoader> CreateURLLoader(const ResourceRequestHead&, const ResourceLoaderOptions&); - // Create a code cache loader. This cannot be called after ClearContext is - // called. - std::unique_ptr<WebCodeCacheLoader> CreateCodeCacheLoader(); + // Get a code cache host. This cannot be called after ClearContext is called. + CodeCacheHost* GetCodeCacheHost(); Resource* CachedResource(const KURL&) const;
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc index b9065cf..e65528d 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -34,6 +34,7 @@ #include "base/feature_list.h" #include "base/functional/bind.h" +#include "base/memory/weak_ptr.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/numerics/checked_math.h" @@ -58,7 +59,6 @@ #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-blink.h" #include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/public/platform/platform.h" -#include "third_party/blink/public/platform/web_code_cache_loader.h" #include "third_party/blink/public/platform/web_data.h" #include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/public/platform/web_url_error.h" @@ -72,6 +72,7 @@ #include "third_party/blink/renderer/platform/loader/cors/cors.h" #include "third_party/blink/renderer/platform/loader/cors/cors_error_string.h" #include "third_party/blink/renderer/platform/loader/fetch/back_forward_cache_loader_helper.h" +#include "third_party/blink/renderer/platform/loader/fetch/code_cache_host.h" #include "third_party/blink/renderer/platform/loader/fetch/console_logger.h" #include "third_party/blink/renderer/platform/loader/fetch/detachable_use_counter.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_context.h" @@ -229,11 +230,12 @@ USING_FAST_MALLOC(ResourceLoader::CodeCacheRequest); public: - CodeCacheRequest(std::unique_ptr<WebCodeCacheLoader> code_cache_loader, + CodeCacheRequest(CodeCacheHost* code_cache_host, const KURL& url, LoaderFreezeMode freeze_mode) : status_(kNoRequestSent), - code_cache_loader_(std::move(code_cache_loader)), + code_cache_host_(code_cache_host ? code_cache_host->GetWeakPtr() + : nullptr), url_(url), freeze_mode_(freeze_mode), should_use_source_hash_( @@ -277,13 +279,13 @@ mojo_base::BigBuffer data, ResourceLoader* resource_loader); - // Send |cache_code| if we got a response from code_cache_loader and the + // Send `cache_code` if we got a response from `code_cache_host_` and the // url_loader. void MaybeSendCachedCode(mojo_base::BigBuffer data, ResourceLoader* resource_loader); CodeCacheRequestStatus status_; - std::unique_ptr<WebCodeCacheLoader> code_cache_loader_; + base::WeakPtr<CodeCacheHost> code_cache_host_; const WebURL url_; LoaderFreezeMode freeze_mode_ = LoaderFreezeMode::kNone; mojo_base::BigBuffer cached_code_; @@ -304,7 +306,7 @@ bool ResourceLoader::CodeCacheRequest::FetchFromCodeCache( URLLoader* url_loader, ResourceLoader* resource_loader) { - if (!code_cache_loader_) { + if (!code_cache_host_) { return false; } DCHECK_EQ(status_, kNoRequestSent); @@ -315,13 +317,12 @@ // This directly calls the URLLoader's SetDefersLoading without going through // ResourceLoader. url_loader->Freeze(LoaderFreezeMode::kStrict); - - WebCodeCacheLoader::FetchCodeCacheCallback callback = + auto callback = WTF::BindOnce(&ResourceLoader::CodeCacheRequest::DidReceiveCachedCode, weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now(), WrapWeakPersistent(resource_loader)); auto cache_type = resource_loader->GetCodeCacheType(); - code_cache_loader_->FetchFromCodeCache(cache_type, url_, std::move(callback)); + (*code_cache_host_)->FetchCachedCode(cache_type, url_, std::move(callback)); return true; } @@ -396,16 +397,11 @@ auto ClearCachedCodeIfPresent = [&]() { if (data.size() != 0) { auto cache_type = resource_loader->GetCodeCacheType(); - // TODO(crbug/1245526): Return early if we don't have a valid - // code_cache_loader_. This shouldn't happen but looks like we are hitting - // this case sometimes. This is a temporary fix to see if it fixes crashes - // and we should investigate why the code_cache_loader_ isn't valid here - // if this fixes the crashes. It is OK to return early here since the - // entry can be cleared on the next fetch. - if (!code_cache_loader_) { + // `code_cache_host_` may have been deleted due to teardown ordering. + if (!code_cache_host_) { return; } - code_cache_loader_->ClearCodeCacheEntry(cache_type, url_); + (*code_cache_host_)->ClearCodeCacheEntry(cache_type, url_); } }; @@ -670,7 +666,7 @@ if (ShouldFetchCodeCache()) { code_cache_request_ = std::make_unique<CodeCacheRequest>( - fetcher_->CreateCodeCacheLoader(), request.Url(), + fetcher_->GetCodeCacheHost(), request.Url(), fetcher_->GetProperties().FreezeMode()); }
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader_defer_loading_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader_defer_loading_test.cc index e084f22..43d9c5d 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader_defer_loading_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader_defer_loading_test.cc
@@ -6,13 +6,17 @@ #include "base/debug/stack_trace.h" #include "base/functional/bind.h" +#include "base/run_loop.h" #include "base/task/single_thread_task_runner.h" #include "mojo/public/cpp/base/big_buffer.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" +#include "third_party/blink/public/mojom/loader/code_cache.mojom-blink.h" #include "third_party/blink/public/platform/resource_load_info_notifier_wrapper.h" #include "third_party/blink/public/platform/web_runtime_features.h" #include "third_party/blink/public/platform/web_url_request_extra_data.h" +#include "third_party/blink/renderer/platform/loader/fetch/code_cache_host.h" #include "third_party/blink/renderer/platform/loader/fetch/raw_resource.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/loader/fetch/unique_identifier.h" @@ -23,36 +27,16 @@ #include "third_party/blink/renderer/platform/loader/testing/test_resource_fetcher_properties.h" #include "third_party/blink/renderer/platform/testing/mock_context_lifecycle_notifier.h" #include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h" +#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" namespace blink { namespace { +using FetchCachedCodeCallback = + mojom::blink::CodeCacheHost::FetchCachedCodeCallback; using ProcessCodeCacheRequestCallback = - base::RepeatingCallback<void(WebCodeCacheLoader::FetchCodeCacheCallback)>; - -// A mock code cache loader that calls the processing function whenever it -// receives fetch requests. -class TestCodeCacheLoader : public WebCodeCacheLoader { - public: - explicit TestCodeCacheLoader(ProcessCodeCacheRequestCallback callback) - : process_request_(callback) {} - ~TestCodeCacheLoader() override = default; - - // WebCodeCacheLoader methods: - void FetchFromCodeCache( - mojom::blink::CodeCacheType cache_type, - const WebURL& url, - WebCodeCacheLoader::FetchCodeCacheCallback callback) override { - process_request_.Run(std::move(callback)); - } - - void ClearCodeCacheEntry(mojom::blink::CodeCacheType cache_type, - const WebURL& url) override {} - - private: - ProcessCodeCacheRequestCallback process_request_; -}; + base::RepeatingCallback<void(FetchCachedCodeCallback)>; // A mock URLLoader to know the status of defers flag. class TestURLLoader final : public URLLoader { @@ -100,14 +84,49 @@ LoaderFreezeMode* const freeze_mode_ptr_; }; +class DummyCodeCacheHost final : public mojom::blink::CodeCacheHost { + public: + explicit DummyCodeCacheHost( + ProcessCodeCacheRequestCallback process_code_cache_request_callback) + : process_code_cache_request_callback_( + std::move(process_code_cache_request_callback)) {} + + // mojom::blink::CodeCacheHost implementations + void DidGenerateCacheableMetadata(mojom::blink::CodeCacheType cache_type, + const KURL& url, + base::Time expected_response_time, + mojo_base::BigBuffer data) override {} + void FetchCachedCode(mojom::blink::CodeCacheType cache_type, + const KURL& url, + FetchCachedCodeCallback callback) override { + process_code_cache_request_callback_.Run(std::move(callback)); + } + void ClearCodeCacheEntry(mojom::blink::CodeCacheType cache_type, + const KURL& url) override {} + void DidGenerateCacheableMetadataInCacheStorage( + const KURL& url, + base::Time expected_response_time, + mojo_base::BigBuffer data, + const WTF::String& cache_storage_cache_name) override {} + + private: + ProcessCodeCacheRequestCallback process_code_cache_request_callback_; +}; + class DeferTestLoaderFactory final : public ResourceFetcher::LoaderFactory { public: DeferTestLoaderFactory( LoaderFreezeMode* const freeze_mode_ptr, ProcessCodeCacheRequestCallback process_code_cache_request_callback) - : freeze_mode_ptr_(freeze_mode_ptr), - process_code_cache_request_callback_( - process_code_cache_request_callback) {} + : freeze_mode_ptr_(freeze_mode_ptr) { + mojo::PendingRemote<mojom::blink::CodeCacheHost> pending_remote; + mojo::MakeSelfOwnedReceiver( + std::make_unique<DummyCodeCacheHost>( + std::move(process_code_cache_request_callback)), + pending_remote.InitWithNewPipeAndPassReceiver()); + code_cache_host_ = std::make_unique<CodeCacheHost>( + mojo::Remote<mojom::blink::CodeCacheHost>(std::move(pending_remote))); + } // LoaderFactory implementations std::unique_ptr<URLLoader> CreateURLLoader( @@ -119,16 +138,13 @@ return std::make_unique<TestURLLoader>(freeze_mode_ptr_); } - std::unique_ptr<WebCodeCacheLoader> CreateCodeCacheLoader() override { - return std::make_unique<TestCodeCacheLoader>( - process_code_cache_request_callback_); - } + CodeCacheHost* GetCodeCacheHost() override { return code_cache_host_.get(); } private: // Points to |ResourceLoaderDefersLoadingTest::freeze_mode_|. LoaderFreezeMode* const freeze_mode_ptr_; - ProcessCodeCacheRequestCallback process_code_cache_request_callback_; + std::unique_ptr<CodeCacheHost> code_cache_host_; }; } // namespace @@ -141,10 +157,12 @@ base::Unretained(this))); } - void SaveCodeCacheCallback( - WebCodeCacheLoader::FetchCodeCacheCallback callback) { + void SaveCodeCacheCallback(FetchCachedCodeCallback callback) { // Store the callback to send back a response. code_cache_response_callback_ = std::move(callback); + if (save_code_cache_callback_done_closure_) { + std::move(save_code_cache_callback_done_closure_).Run(); + } } ResourceFetcher* CreateFetcher() { @@ -163,8 +181,13 @@ process_code_cache_request_callback_ = callback; } + void SetSaveCodeCacheCallbackDoneClosure(base::OnceClosure closure) { + save_code_cache_callback_done_closure_ = std::move(closure); + } + ProcessCodeCacheRequestCallback process_code_cache_request_callback_; - WebCodeCacheLoader::FetchCodeCacheCallback code_cache_response_callback_; + FetchCachedCodeCallback code_cache_response_callback_; + // Passed to TestURLLoader (via |platform_|) and updated when its Freeze // method is called. LoaderFreezeMode freeze_mode_ = LoaderFreezeMode::kNone; @@ -174,6 +197,7 @@ platform_; private: + base::OnceClosure save_code_cache_callback_done_closure_; base::test::SingleThreadTaskEnvironment task_environment_; }; @@ -186,36 +210,21 @@ FetchParameters fetch_parameters = FetchParameters::CreateForTest(std::move(request)); + base::RunLoop run_loop; + SetSaveCodeCacheCallbackDoneClosure(run_loop.QuitClosure()); Resource* resource = RawResource::Fetch(fetch_parameters, fetcher, nullptr); // After code cache fetch it should have deferred URLLoader. DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kStrict); DCHECK(resource); + + run_loop.Run(); std::move(code_cache_response_callback_).Run(base::Time(), {}); + test::RunPendingTasks(); // Once the response is received it should be reset. DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kNone); } -TEST_F(ResourceLoaderDefersLoadingTest, CodeCacheFetchSyncReturn) { - SetCodeCacheProcessFunction(base::BindRepeating( - [](WebCodeCacheLoader::FetchCodeCacheCallback callback) { - std::move(callback).Run(base::Time(), {}); - })); - - auto* fetcher = CreateFetcher(); - - ResourceRequest request; - request.SetUrl(test_url_); - request.SetRequestContext(mojom::blink::RequestContextType::FETCH); - FetchParameters fetch_parameters = - FetchParameters::CreateForTest(std::move(request)); - - Resource* resource = RawResource::Fetch(fetch_parameters, fetcher, nullptr); - DCHECK(resource); - // The callback would be called so it should not be deferred. - DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kNone); -} - TEST_F(ResourceLoaderDefersLoadingTest, ChangeDefersToFalse) { auto* fetcher = CreateFetcher(); @@ -225,6 +234,8 @@ FetchParameters fetch_parameters = FetchParameters::CreateForTest(std::move(request)); + base::RunLoop run_loop; + SetSaveCodeCacheCallbackDoneClosure(run_loop.QuitClosure()); Resource* resource = RawResource::Fetch(fetch_parameters, fetcher, nullptr); DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kStrict); @@ -233,6 +244,12 @@ ResourceLoader* loader = resource->Loader(); loader->SetDefersLoading(LoaderFreezeMode::kNone); DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kStrict); + + run_loop.Run(); + std::move(code_cache_response_callback_).Run(base::Time(), {}); + test::RunPendingTasks(); + // Once the response is received it should be reset. + DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kNone); } TEST_F(ResourceLoaderDefersLoadingTest, ChangeDefersToTrue) { @@ -244,6 +261,8 @@ FetchParameters fetch_parameters = FetchParameters::CreateForTest(std::move(request)); + base::RunLoop run_loop; + SetSaveCodeCacheCallbackDoneClosure(run_loop.QuitClosure()); Resource* resource = RawResource::Fetch(fetch_parameters, fetcher, nullptr); DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kStrict); @@ -251,7 +270,9 @@ loader->SetDefersLoading(LoaderFreezeMode::kStrict); DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kStrict); + run_loop.Run(); std::move(code_cache_response_callback_).Run(base::Time(), {}); + test::RunPendingTasks(); // Since it was requested to be deferred, it should be reset to the // correct value. DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kStrict); @@ -266,6 +287,8 @@ FetchParameters fetch_parameters = FetchParameters::CreateForTest(std::move(request)); + base::RunLoop run_loop; + SetSaveCodeCacheCallbackDoneClosure(run_loop.QuitClosure()); Resource* resource = RawResource::Fetch(fetch_parameters, fetcher, nullptr); DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kStrict); @@ -273,7 +296,9 @@ loader->SetDefersLoading(LoaderFreezeMode::kBufferIncoming); DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kStrict); + run_loop.Run(); std::move(code_cache_response_callback_).Run(base::Time(), {}); + test::RunPendingTasks(); // Since it was requested to be deferred, it should be reset to the // correct value. DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kBufferIncoming); @@ -288,6 +313,8 @@ FetchParameters fetch_parameters = FetchParameters::CreateForTest(std::move(request)); + base::RunLoop run_loop; + SetSaveCodeCacheCallbackDoneClosure(run_loop.QuitClosure()); Resource* resource = RawResource::Fetch(fetch_parameters, fetcher, nullptr); DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kStrict); @@ -298,7 +325,9 @@ loader->SetDefersLoading(LoaderFreezeMode::kNone); DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kStrict); + run_loop.Run(); std::move(code_cache_response_callback_).Run(base::Time(), {}); + test::RunPendingTasks(); DCHECK_EQ(freeze_mode_, LoaderFreezeMode::kNone); }
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader_test.cc index 92344bc..6121d9cb 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader_test.cc
@@ -19,6 +19,7 @@ #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" #include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/resource_load_info_notifier_wrapper.h" +#include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/platform/web_url_request_extra_data.h" #include "third_party/blink/renderer/platform/exported/wrapped_resource_response.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" @@ -34,7 +35,6 @@ #include "third_party/blink/renderer/platform/loader/testing/mock_fetch_context.h" #include "third_party/blink/renderer/platform/loader/testing/test_resource_fetcher_properties.h" #include "third_party/blink/renderer/platform/network/http_names.h" -#include "third_party/blink/renderer/platform/testing/code_cache_loader_mock.h" #include "third_party/blink/renderer/platform/testing/mock_context_lifecycle_notifier.h" #include "third_party/blink/renderer/platform/testing/noop_url_loader.h" #include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h" @@ -95,9 +95,7 @@ override { return std::make_unique<NoopURLLoader>(std::move(freezable_task_runner)); } - std::unique_ptr<WebCodeCacheLoader> CreateCodeCacheLoader() override { - return std::make_unique<CodeCacheLoaderMock>(); - } + CodeCacheHost* GetCodeCacheHost() override { return nullptr; } }; static scoped_refptr<base::SingleThreadTaskRunner> CreateTaskRunner() {
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/code_cache_loader.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/code_cache_loader.cc deleted file mode 100644 index 9edaeb2b..0000000 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/code_cache_loader.cc +++ /dev/null
@@ -1,43 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/platform/loader/fetch/url_loader/code_cache_loader.h" - -#include "mojo/public/cpp/base/big_buffer.h" -#include "mojo/public/cpp/bindings/remote.h" -#include "third_party/blink/public/mojom/loader/code_cache.mojom-blink.h" -#include "third_party/blink/public/platform/platform.h" -#include "third_party/blink/renderer/platform/loader/fetch/code_cache_host.h" -#include "third_party/blink/renderer/platform/weborigin/kurl.h" - -namespace blink { - -CodeCacheLoader::CodeCacheLoader(CodeCacheHost* code_cache_host) { - DCHECK(code_cache_host); - code_cache_host_ = code_cache_host->GetWeakPtr(); -} - -CodeCacheLoader::~CodeCacheLoader() = default; - -void CodeCacheLoader::FetchFromCodeCache(mojom::CodeCacheType cache_type, - const WebURL& url, - FetchCodeCacheCallback callback) { - DCHECK(code_cache_host_); - code_cache_host_->get()->FetchCachedCode(cache_type, url, - std::move(callback)); -} - -void CodeCacheLoader::ClearCodeCacheEntry(mojom::CodeCacheType cache_type, - const WebURL& url) { - DCHECK(code_cache_host_); - code_cache_host_->get()->ClearCodeCacheEntry(cache_type, url); -} - -// static -std::unique_ptr<WebCodeCacheLoader> WebCodeCacheLoader::Create( - CodeCacheHost* code_cache_host) { - return std::make_unique<CodeCacheLoader>(code_cache_host); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/code_cache_loader.h b/third_party/blink/renderer/platform/loader/fetch/url_loader/code_cache_loader.h deleted file mode 100644 index fd0c12b..0000000 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/code_cache_loader.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_URL_LOADER_CODE_CACHE_LOADER_H_ -#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_URL_LOADER_CODE_CACHE_LOADER_H_ - -#include "base/memory/weak_ptr.h" -#include "third_party/blink/public/platform/web_code_cache_loader.h" -#include "third_party/blink/public/platform/web_common.h" - -namespace blink { - -class CodeCacheHost; - -// This class is loading V8 compilation code cache for scripts -// (either separate script resources, or inline scripts in html file). -// It is talking to the browser process and uses per-site isolated -// cache backend to avoid cross-origin contamination. -class BLINK_PLATFORM_EXPORT CodeCacheLoader : public WebCodeCacheLoader { - public: - // |code_cache_host| is the per-frame mojo interface that should be used when - // fetching code cache. - explicit CodeCacheLoader(CodeCacheHost* code_cache_host); - - ~CodeCacheLoader() override; - - void FetchFromCodeCache(mojom::CodeCacheType cache_type, - const WebURL& url, - FetchCodeCacheCallback callback) override; - - void ClearCodeCacheEntry(mojom::CodeCacheType cache_type, - const WebURL& url) override; - - private: - base::WeakPtr<CodeCacheHost> code_cache_host_; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER__FETCH_URL_LOADER_CODE_CACHE_LOADER_H_
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc index 4b11371..cb0b8541 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc
@@ -24,7 +24,6 @@ #include "third_party/blink/public/platform/resource_load_info_notifier_wrapper.h" #include "third_party/blink/public/platform/url_loader_throttle_provider.h" #include "third_party/blink/public/platform/weak_wrapper_resource_load_info_notifier.h" -#include "third_party/blink/public/platform/web_code_cache_loader.h" #include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/public/platform/web_url_request_extra_data.h" #include "third_party/blink/public/platform/websocket_handshake_throttle_provider.h" @@ -369,12 +368,6 @@ cors_exempt_header_list_, terminate_sync_load_event_); } -std::unique_ptr<WebCodeCacheLoader> -DedicatedOrSharedWorkerFetchContextImpl::CreateCodeCacheLoader( - CodeCacheHost* code_cache_host) { - return WebCodeCacheLoader::Create(code_cache_host); -} - void DedicatedOrSharedWorkerFetchContextImpl::WillSendRequest( WebURLRequest& request) { if (renderer_preferences_.enable_do_not_track) {
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.h b/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.h index 5024f94..dff2b582 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.h +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.h
@@ -115,8 +115,6 @@ std::unique_ptr<URLLoaderFactory> WrapURLLoaderFactory( CrossVariantMojoRemote<network::mojom::URLLoaderFactoryInterfaceBase> url_loader_factory) override; - std::unique_ptr<WebCodeCacheLoader> CreateCodeCacheLoader( - CodeCacheHost*) override; void WillSendRequest(WebURLRequest&) override; WebVector<std::unique_ptr<URLLoaderThrottle>> CreateThrottles( const WebURLRequest& request) override;
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc index ecb0801..725711f 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc
@@ -23,7 +23,6 @@ #include "third_party/blink/public/mojom/loader/code_cache.mojom-blink.h" #include "third_party/blink/public/mojom/navigation/navigation_params.mojom.h" #include "third_party/blink/public/platform/resource_load_info_notifier_wrapper.h" -#include "third_party/blink/public/platform/web_code_cache_loader.h" #include "third_party/blink/public/platform/web_url_error.h" #include "third_party/blink/public/platform/web_url_response.h" #include "third_party/blink/public/web/web_navigation_params.h"
diff --git a/third_party/blink/renderer/platform/loader/testing/test_loader_factory.h b/third_party/blink/renderer/platform/loader/testing/test_loader_factory.h index 963e5953..53a5462 100644 --- a/third_party/blink/renderer/platform/loader/testing/test_loader_factory.h +++ b/third_party/blink/renderer/platform/loader/testing/test_loader_factory.h
@@ -11,7 +11,6 @@ #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/platform/exported/wrapped_resource_request.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" -#include "third_party/blink/renderer/platform/testing/code_cache_loader_mock.h" #include "third_party/blink/renderer/platform/testing/url_loader_mock_factory.h" namespace blink { @@ -35,9 +34,7 @@ return mock_factory_->CreateURLLoader(); } - std::unique_ptr<WebCodeCacheLoader> CreateCodeCacheLoader() override { - return std::make_unique<CodeCacheLoaderMock>(); - } + CodeCacheHost* GetCodeCacheHost() override { return nullptr; } private: URLLoaderMockFactory* mock_factory_;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index b2e9ffa..d483e235 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2168,7 +2168,6 @@ }, { name: "LayoutIgnoreMarginsForSticky", - status: "stable", }, { name: "LayoutNewFixedPositionInvalidation", @@ -2825,6 +2824,7 @@ origin_trial_feature_name: "PaymentHandlerMinimalHeaderUX", origin_trial_allows_third_party: true, origin_trial_os: ["win", "mac", "linux", "fuchsia", "chromeos"], + status: "stable", }, { name: "PaymentInstruments",
diff --git a/third_party/blink/renderer/platform/testing/code_cache_loader_mock.cc b/third_party/blink/renderer/platform/testing/code_cache_loader_mock.cc deleted file mode 100644 index ac94399..0000000 --- a/third_party/blink/renderer/platform/testing/code_cache_loader_mock.cc +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/platform/testing/code_cache_loader_mock.h" - -namespace blink { - -void CodeCacheLoaderMock::FetchFromCodeCache( - mojom::CodeCacheType cache_type, - const WebURL& url, - WebCodeCacheLoader::FetchCodeCacheCallback callback) { - if (controller_ && controller_->delayed_) { - // This simple mock doesn't support multiple in-flight loads. - CHECK(!controller_->callback_); - - controller_->callback_ = std::move(callback); - } else { - std::move(callback).Run(base::Time(), mojo_base::BigBuffer()); - } -} - -void CodeCacheLoaderMock::ClearCodeCacheEntry(mojom::CodeCacheType cache_type, - const WebURL& url) {} - -void CodeCacheLoaderMock::Controller::DelayResponse() { - delayed_ = true; -} -void CodeCacheLoaderMock::Controller::Respond(base::Time time, - mojo_base::BigBuffer data) { - CHECK(callback_); - std::move(callback_).Run(time, std::move(data)); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/platform/testing/code_cache_loader_mock.h b/third_party/blink/renderer/platform/testing/code_cache_loader_mock.h deleted file mode 100644 index 8a89ca2..0000000 --- a/third_party/blink/renderer/platform/testing/code_cache_loader_mock.h +++ /dev/null
@@ -1,58 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_TESTING_CODE_CACHE_LOADER_MOCK_H_ -#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_TESTING_CODE_CACHE_LOADER_MOCK_H_ - -#include "base/memory/weak_ptr.h" -#include "third_party/blink/public/platform/web_code_cache_loader.h" -#include "url/gurl.h" - -namespace blink { - -// A simple class for mocking WebCodeCacheLoader. -class CodeCacheLoaderMock : public WebCodeCacheLoader { - public: - // A class which can be owned by both this mock loader and the creator of this - // mock loader, which lets the creator control the behavior of the mock loader - // without having to retain a reference to the mock loader itself. - class Controller : public base::RefCounted<Controller> { - public: - void DelayResponse(); - void Respond(base::Time time, mojo_base::BigBuffer data); - - private: - friend class CodeCacheLoaderMock; - friend class base::RefCounted<Controller>; - ~Controller() = default; - - // Whether to delay responses until Respond is called. - // Otherwise responses are immediate and empty. - bool delayed_ = false; - - // Callback saved by fetch call, if delayed_ was true. - WebCodeCacheLoader::FetchCodeCacheCallback callback_; - }; - - explicit CodeCacheLoaderMock(scoped_refptr<Controller> controller = nullptr) - : controller_(std::move(controller)) {} - CodeCacheLoaderMock(const CodeCacheLoaderMock&) = delete; - CodeCacheLoaderMock& operator=(const CodeCacheLoaderMock&) = delete; - ~CodeCacheLoaderMock() override = default; - - // CodeCacheLoader methods: - void FetchFromCodeCache( - mojom::CodeCacheType cache_type, - const WebURL& url, - WebCodeCacheLoader::FetchCodeCacheCallback callback) override; - void ClearCodeCacheEntry(mojom::CodeCacheType cache_type, - const WebURL& url) override; - - private: - scoped_refptr<Controller> controller_; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_TESTING_CODE_CACHE_LOADER_MOCK_H_
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support.h b/third_party/blink/renderer/platform/testing/testing_platform_support.h index 00c907d..de980345 100644 --- a/third_party/blink/renderer/platform/testing/testing_platform_support.h +++ b/third_party/blink/renderer/platform/testing/testing_platform_support.h
@@ -41,7 +41,6 @@ #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/platform/heap/heap_test_utilities.h" #include "third_party/blink/renderer/platform/platform_export.h" -#include "third_party/blink/renderer/platform/testing/code_cache_loader_mock.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "v8/include/v8-platform.h"
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 49f7a34..9220ecf 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -829,9 +829,6 @@ # Fractional paint offsets lead to 1px bleed with position sticky. crbug.com/1136079 external/wpt/css/css-position/sticky/position-sticky-fractional-offset.html [ Failure ] -# Temporary failure see: https://github.com/w3c/csswg-drafts/issues/9052 -crbug.com/1466293 external/wpt/css/css-position/sticky/position-sticky-margins.html [ Failure ] - # ====== Layout team owned tests from here ====== crbug.com/711704 external/wpt/css/CSS2/floats/floats-rule3-outside-left-002.xht [ Failure ] @@ -1264,11 +1261,6 @@ crbug.com/835484 paint/invalidation/outline/inline-focus.html [ Failure ] crbug.com/591099 paint/invalidation/scroll/fixed-under-composited-fixed-scrolled.html [ Failure ] -# CSS counters failures to be fixed with the new implementation -crbug.com/990657 fast/css/counters/adding-nodes.html [ Failure ] -crbug.com/990657 fast/css/counters/counter-reset-000.html [ Failure ] -crbug.com/990657 fast/css/counters/nesting.html [ Failure ] - # CSS Text failures crbug.com/750990 external/wpt/css/css-text/text-transform/text-transform-upperlower-105.html [ Failure ] crbug.com/750990 external/wpt/css/css-text/text-transform/text-transform-upperlower-106.html [ Failure ] @@ -6214,6 +6206,8 @@ crbug.com/1404951 [ Win ] external/wpt/credential-management/fedcm-nonce-is-optional.https.html [ Pass Timeout ] +crbug.com/1480054 [ Win ] external/wpt/credential-management/fedcm-loginhint.https.html [ Pass Timeout ] + # We skip these tests in the base test suite in NeverFixTests, but we do want # to run them in the virtual test suite. crbug.com/1373766 virtual/fedcm-multi-idp/external/wpt/credential-management/fedcm-multi-idp/* [ Pass ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-lists/list-item-counter-crash.html b/third_party/blink/web_tests/external/wpt/css/css-lists/list-item-counter-crash.html new file mode 100644 index 0000000..fc8a38c62 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-lists/list-item-counter-crash.html
@@ -0,0 +1,15 @@ +<!doctype html> +<html class="reftest-wait"> +<link rel="help" href="http://crbug.com/1487174"> +<style> +* { counter-increment: c; } +</style> +<script> + function error_fn() { + test.style.setProperty("text-orientation", "upright"); + document.documentElement.classList.remove("reftest-wait"); + } +</script> +<li id="test"></li> +<image onerror="error_fn()" srcset="error" ></image> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.blur-from-outside-canvas.no-clipping-expected.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.blur-from-outside-canvas.no-clipping-expected.html new file mode 100644 index 0000000..6cad180 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.blur-from-outside-canvas.no-clipping-expected.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.blur-from-outside-canvas.no-clipping</title> +<h1>2d.layer.blur-from-outside-canvas.no-clipping</h1> +<p class="desc">Checks blur leaking inside from drawing outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const svg = ` + <svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur in="SourceGraphic" stdDeviation="30" /> + </filter> + <g filter="url(#filter)"> + <rect x="201" y="50" width="100" height="100" fill="turquoise"/> + <rect x="50" y="201" width="100" height="100" fill="indigo"/> + <rect x="-101" y="50" width="100" height="100" fill="orange"/> + <rect x="50" y="-101" width="100" height="100" fill="brown"/> + </g> + </svg>`; + const img = new Image(); + img.width = 200; + img.height = 200; + img.onload = () => { + // No clipping. + + ctx.drawImage(img, 0, 0); + }; + img.src = 'data:image/svg+xml;base64,' + btoa(svg); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.blur-from-outside-canvas.no-clipping.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.blur-from-outside-canvas.no-clipping.html new file mode 100644 index 0000000..b689ad3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.blur-from-outside-canvas.no-clipping.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.blur-from-outside-canvas.no-clipping-expected.html"> +<title>Canvas test: 2d.layer.blur-from-outside-canvas.no-clipping</title> +<h1>2d.layer.blur-from-outside-canvas.no-clipping</h1> +<p class="desc">Checks blur leaking inside from drawing outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + // No clipping. + + ctx.beginLayer({filter: [ {name: 'gaussianBlur', stdDeviation: 30} ]}); + + ctx.fillStyle = 'turquoise'; + ctx.fillRect(201, 50, 100, 100); + ctx.fillStyle = 'indigo'; + ctx.fillRect(50, 201, 100, 100); + ctx.fillStyle = 'orange'; + ctx.fillRect(-1, 50, -100, 100); + ctx.fillStyle = 'brown'; + ctx.fillRect(50, -1, 100, -100); + + ctx.endLayer(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.blur-from-outside-canvas.with-clipping-expected.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.blur-from-outside-canvas.with-clipping-expected.html new file mode 100644 index 0000000..1823f78 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.blur-from-outside-canvas.with-clipping-expected.html
@@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.blur-from-outside-canvas.with-clipping</title> +<h1>2d.layer.blur-from-outside-canvas.with-clipping</h1> +<p class="desc">Checks blur leaking inside from drawing outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const svg = ` + <svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur in="SourceGraphic" stdDeviation="30" /> + </filter> + <g filter="url(#filter)"> + <rect x="201" y="50" width="100" height="100" fill="turquoise"/> + <rect x="50" y="201" width="100" height="100" fill="indigo"/> + <rect x="-101" y="50" width="100" height="100" fill="orange"/> + <rect x="50" y="-101" width="100" height="100" fill="brown"/> + </g> + </svg>`; + const img = new Image(); + img.width = 200; + img.height = 200; + img.onload = () => { + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.drawImage(img, 0, 0); + }; + img.src = 'data:image/svg+xml;base64,' + btoa(svg); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.blur-from-outside-canvas.with-clipping.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.blur-from-outside-canvas.with-clipping.html new file mode 100644 index 0000000..9e81610 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.blur-from-outside-canvas.with-clipping.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.blur-from-outside-canvas.with-clipping-expected.html"> +<title>Canvas test: 2d.layer.blur-from-outside-canvas.with-clipping</title> +<h1>2d.layer.blur-from-outside-canvas.with-clipping</h1> +<p class="desc">Checks blur leaking inside from drawing outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.beginLayer({filter: [ {name: 'gaussianBlur', stdDeviation: 30} ]}); + + ctx.fillStyle = 'turquoise'; + ctx.fillRect(201, 50, 100, 100); + ctx.fillStyle = 'indigo'; + ctx.fillRect(50, 201, 100, 100); + ctx.fillStyle = 'orange'; + ctx.fillRect(-1, 50, -100, 100); + ctx.fillStyle = 'brown'; + ctx.fillRect(50, -1, 100, -100); + + ctx.endLayer(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.no-clipping-expected.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.no-clipping-expected.html new file mode 100644 index 0000000..6cad180 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.no-clipping-expected.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.blur-from-outside-canvas.no-clipping</title> +<h1>2d.layer.blur-from-outside-canvas.no-clipping</h1> +<p class="desc">Checks blur leaking inside from drawing outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const svg = ` + <svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur in="SourceGraphic" stdDeviation="30" /> + </filter> + <g filter="url(#filter)"> + <rect x="201" y="50" width="100" height="100" fill="turquoise"/> + <rect x="50" y="201" width="100" height="100" fill="indigo"/> + <rect x="-101" y="50" width="100" height="100" fill="orange"/> + <rect x="50" y="-101" width="100" height="100" fill="brown"/> + </g> + </svg>`; + const img = new Image(); + img.width = 200; + img.height = 200; + img.onload = () => { + // No clipping. + + ctx.drawImage(img, 0, 0); + }; + img.src = 'data:image/svg+xml;base64,' + btoa(svg); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.no-clipping.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.no-clipping.html new file mode 100644 index 0000000..3cd1c674a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.no-clipping.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.blur-from-outside-canvas.no-clipping-expected.html"> +<title>Canvas test: 2d.layer.blur-from-outside-canvas.no-clipping</title> +<h1>2d.layer.blur-from-outside-canvas.no-clipping</h1> +<p class="desc">Checks blur leaking inside from drawing outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + // No clipping. + + ctx.beginLayer({filter: [ {name: 'gaussianBlur', stdDeviation: 30} ]}); + + ctx.fillStyle = 'turquoise'; + ctx.fillRect(201, 50, 100, 100); + ctx.fillStyle = 'indigo'; + ctx.fillRect(50, 201, 100, 100); + ctx.fillStyle = 'orange'; + ctx.fillRect(-1, 50, -100, 100); + ctx.fillStyle = 'brown'; + ctx.fillRect(50, -1, 100, -100); + + ctx.endLayer(); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.no-clipping.w.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.no-clipping.w.html new file mode 100644 index 0000000..90b013c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.no-clipping.w.html
@@ -0,0 +1,45 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.blur-from-outside-canvas.no-clipping-expected.html"> +<title>Canvas test: 2d.layer.blur-from-outside-canvas.no-clipping</title> +<h1>2d.layer.blur-from-outside-canvas.no-clipping</h1> +<p class="desc">Checks blur leaking inside from drawing outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + // No clipping. + + ctx.beginLayer({filter: [ {name: 'gaussianBlur', stdDeviation: 30} ]}); + + ctx.fillStyle = 'turquoise'; + ctx.fillRect(201, 50, 100, 100); + ctx.fillStyle = 'indigo'; + ctx.fillRect(50, 201, 100, 100); + ctx.fillStyle = 'orange'; + ctx.fillRect(-1, 50, -100, 100); + ctx.fillStyle = 'brown'; + ctx.fillRect(50, -1, 100, -100); + + ctx.endLayer(); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.with-clipping-expected.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.with-clipping-expected.html new file mode 100644 index 0000000..1823f78 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.with-clipping-expected.html
@@ -0,0 +1,38 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.blur-from-outside-canvas.with-clipping</title> +<h1>2d.layer.blur-from-outside-canvas.with-clipping</h1> +<p class="desc">Checks blur leaking inside from drawing outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const svg = ` + <svg xmlns="http://www.w3.org/2000/svg" + width="200" height="200" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur in="SourceGraphic" stdDeviation="30" /> + </filter> + <g filter="url(#filter)"> + <rect x="201" y="50" width="100" height="100" fill="turquoise"/> + <rect x="50" y="201" width="100" height="100" fill="indigo"/> + <rect x="-101" y="50" width="100" height="100" fill="orange"/> + <rect x="50" y="-101" width="100" height="100" fill="brown"/> + </g> + </svg>`; + const img = new Image(); + img.width = 200; + img.height = 200; + img.onload = () => { + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.drawImage(img, 0, 0); + }; + img.src = 'data:image/svg+xml;base64,' + btoa(svg); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.with-clipping.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.with-clipping.html new file mode 100644 index 0000000..7647744 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.with-clipping.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.blur-from-outside-canvas.with-clipping-expected.html"> +<title>Canvas test: 2d.layer.blur-from-outside-canvas.with-clipping</title> +<h1>2d.layer.blur-from-outside-canvas.with-clipping</h1> +<p class="desc">Checks blur leaking inside from drawing outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.beginLayer({filter: [ {name: 'gaussianBlur', stdDeviation: 30} ]}); + + ctx.fillStyle = 'turquoise'; + ctx.fillRect(201, 50, 100, 100); + ctx.fillStyle = 'indigo'; + ctx.fillRect(50, 201, 100, 100); + ctx.fillStyle = 'orange'; + ctx.fillRect(-1, 50, -100, 100); + ctx.fillStyle = 'brown'; + ctx.fillRect(50, -1, 100, -100); + + ctx.endLayer(); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.with-clipping.w.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.with-clipping.w.html new file mode 100644 index 0000000..cf5570c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.blur-from-outside-canvas.with-clipping.w.html
@@ -0,0 +1,47 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.blur-from-outside-canvas.with-clipping-expected.html"> +<title>Canvas test: 2d.layer.blur-from-outside-canvas.with-clipping</title> +<h1>2d.layer.blur-from-outside-canvas.with-clipping</h1> +<p class="desc">Checks blur leaking inside from drawing outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.beginLayer({filter: [ {name: 'gaussianBlur', stdDeviation: 30} ]}); + + ctx.fillStyle = 'turquoise'; + ctx.fillRect(201, 50, 100, 100); + ctx.fillStyle = 'indigo'; + ctx.fillRect(50, 201, 100, 100); + ctx.fillStyle = 'orange'; + ctx.fillRect(-1, 50, -100, 100); + ctx.fillStyle = 'brown'; + ctx.fillRect(50, -1, 100, -100); + + ctx.endLayer(); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/layers.yaml b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/layers.yaml index dd33e05..c790389 100644 --- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/layers.yaml +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/layers.yaml
@@ -687,3 +687,54 @@ @assert throws TypeError ctx.beginLayer({filter: 1}); @assert throws TypeError ctx.beginLayer({filter: true}); @assert throws TypeError ctx.beginLayer({filter: false}); + +- name: 2d.layer.blur-from-outside-canvas + desc: Checks blur leaking inside from drawing outside the canvas + size: [200, 200] + code: | + {{ clipping }} + + ctx.beginLayer({filter: [ {name: 'gaussianBlur', stdDeviation: 30} ]}); + + ctx.fillStyle = 'turquoise'; + ctx.fillRect(201, 50, 100, 100); + ctx.fillStyle = 'indigo'; + ctx.fillRect(50, 201, 100, 100); + ctx.fillStyle = 'orange'; + ctx.fillRect(-1, 50, -100, 100); + ctx.fillStyle = 'brown'; + ctx.fillRect(50, -1, 100, -100); + + ctx.endLayer(); + reference: | + const svg = ` + <svg xmlns="http://www.w3.org/2000/svg" + width="{{ size[0] }}" height="{{ size[1] }}" + color-interpolation-filters="sRGB"> + <filter id="filter" x="-100%" y="-100%" width="300%" height="300%"> + <feGaussianBlur in="SourceGraphic" stdDeviation="30" /> + </filter> + <g filter="url(#filter)"> + <rect x="201" y="50" width="100" height="100" fill="turquoise"/> + <rect x="50" y="201" width="100" height="100" fill="indigo"/> + <rect x="-101" y="50" width="100" height="100" fill="orange"/> + <rect x="50" y="-101" width="100" height="100" fill="brown"/> + </g> + </svg>`; + const img = new Image(); + img.width = {{ size[0] }}; + img.height = {{ size[1] }}; + img.onload = () => { + {{ clipping | indent(4) }} + + ctx.drawImage(img, 0, 0); + }; + img.src = 'data:image/svg+xml;base64,' + btoa(svg); + variants: + no-clipping: + clipping: // No clipping. + with-clipping: + clipping: |- + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); \ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/css/counters/adding-nodes-expected.txt b/third_party/blink/web_tests/fast/css/counters/adding-nodes-expected.txt index 6410448..d933186 100644 --- a/third_party/blink/web_tests/fast/css/counters/adding-nodes-expected.txt +++ b/third_party/blink/web_tests/fast/css/counters/adding-nodes-expected.txt
@@ -1,4 +1,4 @@ The following two lines should have the same content: 1- 2- 2- 2.1- -1- 2- 2- 2.1- +1-2-2.0-2.0.1-
diff --git a/third_party/blink/web_tests/fast/css/counters/counter-reset-000-expected.txt b/third_party/blink/web_tests/fast/css/counters/counter-reset-000-expected.txt index c669791..da14174 100644 --- a/third_party/blink/web_tests/fast/css/counters/counter-reset-000-expected.txt +++ b/third_party/blink/web_tests/fast/css/counters/counter-reset-000-expected.txt
@@ -1,4 +1,5 @@ The following two lines should be the same: + 1- 2- 3- -1- 2- 3- +0.1-0.1-0.2-
diff --git a/third_party/blink/web_tests/fast/css/counters/nesting-expected.txt b/third_party/blink/web_tests/fast/css/counters/nesting-expected.txt index 8ccda2bd..7a3f3ab 100644 --- a/third_party/blink/web_tests/fast/css/counters/nesting-expected.txt +++ b/third_party/blink/web_tests/fast/css/counters/nesting-expected.txt
@@ -2,4 +2,4 @@ 1- 1- 2- 3- -1- 1- 2- 3- +0.2- 0.2- 0.5- 1-
diff --git a/third_party/blink/web_tests/storage/indexeddb/mozilla/resources/versionchange-abort.js b/third_party/blink/web_tests/storage/indexeddb/mozilla/resources/versionchange-abort.js deleted file mode 100644 index b44e876..0000000 --- a/third_party/blink/web_tests/storage/indexeddb/mozilla/resources/versionchange-abort.js +++ /dev/null
@@ -1,39 +0,0 @@ -// original test: -// http://mxr.mozilla.org/mozilla2.0/source/dom/indexedDB/test/test_setVersion_abort.html -// license of original test: -// " Any copyright is dedicated to the Public Domain. -// http://creativecommons.org/publicdomain/zero/1.0/ " - -if (this.importScripts) { - importScripts('../../../../resources/js-test.js'); - importScripts('../../resources/shared.js'); -} - -description("When a versionchange transaction is aborted, the version and newly created object stores should be reset"); - -indexedDBTest(prepareDatabase); -function prepareDatabase() -{ - db = event.target.result; - request = event.target; - request.onerror = null; - - objectStore = evalAndLog("objectStore = db.createObjectStore('foo');"); - shouldBe("db.objectStoreNames.length", "1"); - - index = evalAndLog("index = objectStore.createIndex('bar', 'baz');"); - shouldBe("objectStore.indexNames.length", "1"); - - trans = request.transaction; - trans.oncomplete = unexpectedCompleteCallback; - trans.onabort = postAbort; - evalAndLog("event.target.transaction.abort();"); -} - -function postAbort() -{ - shouldBe("db.version", "0"); - shouldBe("db.objectStoreNames.length", "0"); - - finishJSTest(); -}
diff --git a/third_party/blink/web_tests/storage/indexeddb/mozilla/versionchange-abort-expected.txt b/third_party/blink/web_tests/storage/indexeddb/mozilla/versionchange-abort-expected.txt deleted file mode 100644 index 047d009d..0000000 --- a/third_party/blink/web_tests/storage/indexeddb/mozilla/versionchange-abort-expected.txt +++ /dev/null
@@ -1,18 +0,0 @@ -When a versionchange transaction is aborted, the version and newly created object stores should be reset - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -dbname = "versionchange-abort.html" -indexedDB.deleteDatabase(dbname) -indexedDB.open(dbname) -objectStore = db.createObjectStore('foo'); -PASS db.objectStoreNames.length is 1 -index = objectStore.createIndex('bar', 'baz'); -PASS objectStore.indexNames.length is 1 -event.target.transaction.abort(); -PASS db.version is 0 -PASS db.objectStoreNames.length is 0 -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/storage/indexeddb/mozilla/versionchange-abort.html b/third_party/blink/web_tests/storage/indexeddb/mozilla/versionchange-abort.html deleted file mode 100644 index 598f6230..0000000 --- a/third_party/blink/web_tests/storage/indexeddb/mozilla/versionchange-abort.html +++ /dev/null
@@ -1,9 +0,0 @@ -<html> -<head> -<script src="../../../resources/js-test.js"></script> -<script src="../resources/shared.js"></script> -</head> -<body> -<script src="resources/versionchange-abort.js"></script> -</body> -</html>
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index ac72c84..a2d6387 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -5238,6 +5238,11 @@ getter isAccountAutoSelected getter token method constructor +interface IdentityCredentialError : DOMException + attribute @@toStringTag + getter code + getter url + method constructor interface IdentityProvider static method close static method getUserInfo
diff --git a/third_party/blink/web_tests/wpt_internal/private-aggregation/resources/utils.js b/third_party/blink/web_tests/wpt_internal/private-aggregation/resources/utils.js index faaaabb..5de6f09 100644 --- a/third_party/blink/web_tests/wpt_internal/private-aggregation/resources/utils.js +++ b/third_party/blink/web_tests/wpt_internal/private-aggregation/resources/utils.js
@@ -1,10 +1,38 @@ -// Payload with contributions [{bucket: 1n, value: 2}] +// Payload with contributions [{bucket: 1n, value: 2}], padded to 20 +// contributions const ONE_CONTRIBUTION_EXAMPLE_PAYLOAD = - 'omRkYXRhgaJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAWlvcGVyYXRpb25paGlzdG9ncmFt'; + 'omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAAAG' + + 'ZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAA' + + 'AAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidW' + + 'NrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAA' + + 'AKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZX' + + 'RQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJl' + + 'dmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAA' + + 'AAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFs' + + 'dWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAA' + + 'AAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVE' + + 'AAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAA' + + 'AAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAA' + + 'AGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAA' + + 'AAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt'; -// Payload with contributions [{bucket: 1n, value: 2}, {bucket: 3n, value: 4}] +// Payload with contributions [{bucket: 1n, value: 2}, {bucket: 3n, value: 4}], +// padded to 20 contributions const MULTIPLE_CONTRIBUTIONS_EXAMPLE_PAYLOAD = - 'omRkYXRhgqJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA2lvcGVyYXRpb25paGlzdG9ncmFt'; + 'omRkYXRhlKJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAaJldmFsdWVEAAAABG' + + 'ZidWNrZXRQAAAAAAAAAAAAAAAAAAAAA6JldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAA' + + 'AAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidW' + + 'NrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAA' + + 'AKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZX' + + 'RQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJl' + + 'dmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAA' + + 'AAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFs' + + 'dWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAA' + + 'AAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVE' + + 'AAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAA' + + 'AAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAA' + + 'AGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAA' + + 'AAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt'; const private_aggregation_promise_test = (f, name) => promise_test(async t => {
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal index 0f63441..727896d 160000 --- a/third_party/devtools-frontend-internal +++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@ -Subproject commit 0f634419f74c7b73d8fef44d1a234dcd8072403c +Subproject commit 727896d2e633e60a13f17643095dc8aa58ee9b97
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index 71eed7b..7140442 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit 71eed7b30070691bf97612d9cb99ed7967806952 +Subproject commit 714044231292652a5c7ef0d7baecbd996ee739b1
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index d87f3ee..7955fdf 100644 --- a/third_party/freetype/README.chromium +++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@ Name: FreeType URL: http://www.freetype.org/ -Version: VER-2-13-2-31-ge0e5b838e -Revision: e0e5b838e508aa4043c0e27d8403ab7be2a46153 +Version: VER-2-13-2-32-g7b308a29d +Revision: 7b308a29dd105074eea9c8d5953a182d325f74f1 CPEPrefix: cpe:/a:freetype:freetype:2.13.2 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses"
diff --git a/third_party/freetype/src b/third_party/freetype/src index e0e5b838..7b308a2 160000 --- a/third_party/freetype/src +++ b/third_party/freetype/src
@@ -1 +1 @@ -Subproject commit e0e5b838e508aa4043c0e27d8403ab7be2a46153 +Subproject commit 7b308a29dd105074eea9c8d5953a182d325f74f1
diff --git a/third_party/perfetto b/third_party/perfetto index e879b2e..5773ad9 160000 --- a/third_party/perfetto +++ b/third_party/perfetto
@@ -1 +1 @@ -Subproject commit e879b2e2ee67ba3ce9bbb01bb7d776c8dff28897 +Subproject commit 5773ad947c4f24adfea80579dcbac145cd03c831
diff --git a/third_party/skia b/third_party/skia index a80c164..9f82423 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit a80c164ffb8a26aa29020be39993581a6761ab6c +Subproject commit 9f8242377455ccfa4ffba67f0b3bd59bc2bf038b
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps index 4d31920..2acabb4 160000 --- a/third_party/vulkan-deps +++ b/third_party/vulkan-deps
@@ -1 +1 @@ -Subproject commit 4d31920a095aeda9fa83819cd17fdebc4d89220c +Subproject commit 2acabb46a641318d321dc36a3998e6a97f0ae056
diff --git a/third_party/webrtc b/third_party/webrtc index a61b334..7d3eb10 160000 --- a/third_party/webrtc +++ b/third_party/webrtc
@@ -1 +1 @@ -Subproject commit a61b334a12c7556c64887e1c553fd822d060881d +Subproject commit 7d3eb10c7e705667b3c26a70e70d06ce152b6b62
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 5999c62..8d217db 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -1173,8 +1173,8 @@ 'lacros-arm64-generic-rel-skylab-fyi': 'chromeos_arm64-generic_lacros_rel_skylab_reclient', 'linux-cfm-rel': 'linux_cfm_release_trybot_reclient', 'linux-chromeos-annotator-rel': 'chromeos_with_codecs_release_trybot_code_coverage_reclient', - 'linux-chromeos-compile-dbg': 'chromeos_with_codecs_debug_bot_reclient', - 'linux-chromeos-dbg': 'chromeos_with_codecs_debug_bot_reclient', + 'linux-chromeos-compile-dbg': 'chromeos_with_codecs_debug_trybot_reclient', + 'linux-chromeos-dbg': 'chromeos_with_codecs_debug_trybot_reclient', 'linux-chromeos-inverse-fieldtrials-fyi-rel': 'chromeos_with_codecs_release_trybot_invert_fieldtrials_reclient', 'linux-chromeos-rel': 'chromeos_with_codecs_release_trybot_code_coverage_reclient', 'linux-chromeos-siso-rel': 'chromeos_with_codecs_release_trybot_code_coverage_reclient', @@ -2218,7 +2218,7 @@ ], 'chromeos_amd64-generic_lacros_rel_dchecks_reclient': [ - 'chromeos_amd64-generic-crostoolchain_reclient', 'lacros', 'release', 'dcheck_always_on', + 'chromeos_amd64-generic-crostoolchain_reclient', 'lacros', 'release', 'dcheck_always_on', 'use_dummy_lastchange', ], 'chromeos_amd64-generic_lacros_rel_dchecks_skylab_reclient': [ @@ -2235,7 +2235,7 @@ 'chromeos_amd64-generic_use_fake_dbus_clients_vm_optimized_dchecks_reclient': [ 'chromeos_amd64-generic-vm_reclient', 'use_fake_dbus_clients', 'dcheck_always_on', - 'also_build_lacros_chrome_for_architecture_amd64', + 'also_build_lacros_chrome_for_architecture_amd64', 'use_dummy_lastchange', ], 'chromeos_amd64-generic_use_fake_dbus_clients_vm_optimized_goma': [ @@ -2260,7 +2260,7 @@ ], 'chromeos_arm-generic_dcheck_always_on_reclient': [ - 'chromeos_device_reclient', 'arm-generic', 'dcheck_always_on', 'ozone_headless' + 'chromeos_device_reclient', 'arm-generic', 'dcheck_always_on', 'ozone_headless', 'use_dummy_lastchange', ], 'chromeos_arm-generic_lacros_official_reclient': [ @@ -2275,7 +2275,7 @@ ], 'chromeos_arm-generic_lacros_rel_dchecks_reclient': [ - 'chromeos_arm-generic-crostoolchain_reclient', 'lacros', 'release', 'dcheck_always_on', + 'chromeos_arm-generic-crostoolchain_reclient', 'lacros', 'release', 'dcheck_always_on', 'use_dummy_lastchange', ], 'chromeos_arm-generic_lacros_rel_reclient': [ @@ -2473,6 +2473,10 @@ 'chromeos_with_codecs', 'debug_bot_reclient', ], + 'chromeos_with_codecs_debug_trybot_reclient': [ + 'chromeos_with_codecs', 'debug_bot_reclient', 'use_dummy_lastchange', + ], + 'chromeos_with_codecs_release_bot_coverage_reclient': [ 'chromeos_with_codecs', 'release_bot_reclient', 'use_clang_coverage', ], @@ -2485,14 +2489,14 @@ 'chromeos_with_codecs_release_trybot_code_coverage_reclient': [ 'chromeos_with_codecs', 'release_trybot_reclient', 'no_symbols', 'also_build_lacros_chrome', 'use_clang_coverage', 'partial_code_coverage_instrumentation', - 'enable_dangling_raw_ptr_feature_flag', 'enable_backup_ref_ptr_feature_flag', + 'enable_dangling_raw_ptr_feature_flag', 'enable_backup_ref_ptr_feature_flag', 'use_dummy_lastchange', ], 'chromeos_with_codecs_release_trybot_code_coverage_siso': [ 'chromeos_with_codecs', 'release_trybot', 'no_symbols', 'also_build_lacros_chrome', 'use_clang_coverage', 'partial_code_coverage_instrumentation', 'enable_dangling_raw_ptr_feature_flag', 'enable_backup_ref_ptr_feature_flag', - 'no_goma', 'no_reclient', 'siso', + 'no_goma', 'no_reclient', 'siso', 'use_dummy_lastchange', ], 'chromeos_with_codecs_release_trybot_invert_fieldtrials_reclient': [ @@ -3166,7 +3170,7 @@ ], 'lacros_on_linux_release_trybot_reclient_code_coverage': [ - 'lacros_on_linux_release_trybot_reclient', 'clang', 'use_clang_coverage', 'partial_code_coverage_instrumentation', + 'lacros_on_linux_release_trybot_reclient', 'clang', 'use_clang_coverage', 'partial_code_coverage_instrumentation', 'use_dummy_lastchange', ], 'lacros_on_linux_tot_debug': [
diff --git a/tools/mb/mb_config_expectations/chromium.build.json b/tools/mb/mb_config_expectations/chromium.build.json index f20962af..27d40129 100644 --- a/tools/mb/mb_config_expectations/chromium.build.json +++ b/tools/mb/mb_config_expectations/chromium.build.json
@@ -238,6 +238,7 @@ "symbol_level": 0, "target_os": "chromeos", "use_clang_coverage": true, + "use_dummy_lastchange": true, "use_remoteexec": true } }, @@ -258,6 +259,7 @@ "symbol_level": 0, "target_os": "chromeos", "use_clang_coverage": true, + "use_dummy_lastchange": true, "use_goma": false, "use_remoteexec": false } @@ -277,6 +279,7 @@ "symbol_level": 0, "target_os": "chromeos", "use_clang_coverage": true, + "use_dummy_lastchange": true, "use_remoteexec": true } }
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json b/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json index a462440..e0132b3 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json
@@ -52,6 +52,7 @@ "dcheck_always_on": true, "is_chromeos_device": true, "ozone_platform_headless": true, + "use_dummy_lastchange": true, "use_real_dbus_clients": false, "use_remoteexec": true } @@ -63,6 +64,7 @@ "dcheck_always_on": true, "is_chromeos_device": true, "ozone_platform_headless": true, + "use_dummy_lastchange": true, "use_real_dbus_clients": false, "use_remoteexec": true } @@ -84,6 +86,7 @@ "dcheck_always_on": true, "is_chromeos_device": true, "ozone_platform_headless": true, + "use_dummy_lastchange": true, "use_remoteexec": true } }, @@ -166,6 +169,7 @@ "is_debug": false, "ozone_platform_headless": true, "target_os": "chromeos", + "use_dummy_lastchange": true, "use_remoteexec": true } }, @@ -191,6 +195,7 @@ "is_debug": false, "ozone_platform_headless": true, "target_os": "chromeos", + "use_dummy_lastchange": true, "use_remoteexec": true } }, @@ -245,6 +250,7 @@ "symbol_level": 0, "target_os": "chromeos", "use_clang_coverage": true, + "use_dummy_lastchange": true, "use_remoteexec": true } }, @@ -256,6 +262,7 @@ "proprietary_codecs": true, "symbol_level": 1, "target_os": "chromeos", + "use_dummy_lastchange": true, "use_remoteexec": true } }, @@ -267,6 +274,7 @@ "proprietary_codecs": true, "symbol_level": 1, "target_os": "chromeos", + "use_dummy_lastchange": true, "use_remoteexec": true } }, @@ -298,6 +306,7 @@ "symbol_level": 0, "target_os": "chromeos", "use_clang_coverage": true, + "use_dummy_lastchange": true, "use_remoteexec": true } }, @@ -316,6 +325,7 @@ "symbol_level": 0, "target_os": "chromeos", "use_clang_coverage": true, + "use_dummy_lastchange": true, "use_remoteexec": true } }, @@ -342,6 +352,7 @@ "symbol_level": 0, "target_os": "chromeos", "use_clang_coverage": true, + "use_dummy_lastchange": true, "use_remoteexec": true } }, @@ -357,6 +368,7 @@ "symbol_level": 0, "target_os": "chromeos", "use_clang_coverage": true, + "use_dummy_lastchange": true, "use_remoteexec": true } }
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index b3b71f7..c087a91 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -31066,6 +31066,13 @@ <int value="1" label="EC"/> </enum> +<enum name="DTLoadPersistedKeyResult"> + <int value="0" label="Success"/> + <int value="1" label="Not Found"/> + <int value="2" label="Malformed Key"/> + <int value="3" label="Unknown"/> +</enum> + <enum name="DTLS_SRTPCryptoSuite"> <summary> DTLS/SRTP crypto suites from the IANA registry as specified at @@ -78017,6 +78024,12 @@ <int value="2" label="Dismiss"/> </enum> +<enum name="NotificationSuppressionState"> + <int value="0" label="NotSuppressed"/> + <int value="1" label="UserSuppressed"/> + <int value="2" label="PolicySuppressed"/> +</enum> + <enum name="NotificationTypeDetailed"> <int value="0" label="ChromeApp priority=-2"/> <int value="1" label="ChromeApp priority=-2 requireInteraction"/> @@ -98603,6 +98616,7 @@ <int value="9" label="Prompt shown"/> <int value="10" label="Search engine choice dialog will be or has been displayed"/> + <int value="11" label="Browser not a normal tabbed browser"/> </enum> <enum name="SettingsPrivacySandboxPromptStartupState"> @@ -104448,7 +104462,7 @@ <int value="8" label="SERVER_RETURN_THROTTLED"/> <int value="9" label="SERVER_RETURN_TRANSIENT_ERROR"/> <int value="10" label="SERVER_RETURN_MIGRATION_DONE"/> - <int value="11" label="SERVER_RETURN_CLEAR_PENDING"/> + <int value="11" label="(deprecated) SERVER_RETURN_CLEAR_PENDING"/> <int value="12" label="SERVER_RETURN_NOT_MY_BIRTHDAY"/> <int value="13" label="SERVER_RETURN_CONFLICT"/> <int value="14" label="SERVER_RESPONSE_VALIDATION_FAILED"/>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml index cf0f2d8..45b88edd 100644 --- a/tools/metrics/histograms/metadata/autofill/histograms.xml +++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -262,6 +262,13 @@ <variant name=".Unknown" summary="Unknown form type"/> </variants> +<variants name="AutofillPlusAddressNetworkRequestType"> + <variant name="Create" summary="Create a Plus Address after reservation"/> + <variant name="GetOrCreate" summary="Get or create a Plus Address"/> + <variant name="List" summary="Retrieve all Plus Addresses"/> + <variant name="Reserve" summary="Reserve a Plus Address"/> +</variants> + <variants name="AutofillProfileCategory"> <variant name="AccountChrome" summary="kAccount profiles originating from Chrome"/> @@ -3586,6 +3593,65 @@ </summary> </histogram> +<histogram name="Autofill.PlusAddresses.NetworkRequest.OauthError" + enum="GoogleServiceAuthError" expires_after="2024-09-24"> + <owner>mreichhoff@chromium.org</owner> + <owner>kaklilu@chromium.org</owner> + <summary> + Records any OAuth error that the experimental plus addresses feature + encounters. This is recorded when the PlusAddressClient needs to fetch an + OAuth token to make a network request. This enum also captures the non-error + case with NONE. + </summary> +</histogram> + +<histogram name="Autofill.PlusAddresses.NetworkRequest.{Type}.Latency" + units="ms" expires_after="2024-09-24"> + <owner>mreichhoff@chromium.org</owner> + <owner>kaklilu@chromium.org</owner> + <summary> + Measures the latency of network requests made by the experimental plus + addresses feature. Latency is measured as the difference between when the + PlusAddressClient issues the request and when it receives a response. The + PlusAddressClient records this whenever it gets a response for the network + requests it makes. + </summary> + <token key="Type"> + <variant name="AutofillPlusAddressNetworkRequestType" + summary="The relevant network request."/> + </token> +</histogram> + +<histogram name="Autofill.PlusAddresses.NetworkRequest.{Type}.ResponseByteSize" + units="bytes" expires_after="2024-09-24"> + <owner>mreichhoff@chromium.org</owner> + <owner>kaklilu@chromium.org</owner> + <summary> + Records the response body size of network requests made by the experimental + plus addresses feature. The PlusAddressClient records this whenever it gets + a response for the network requests it makes. + </summary> + <token key="Type"> + <variant name="AutofillPlusAddressNetworkRequestType" + summary="The relevant network request."/> + </token> +</histogram> + +<histogram name="Autofill.PlusAddresses.NetworkRequest.{Type}.ResponseCode" + enum="HttpResponseCode" expires_after="2024-09-24"> + <owner>mreichhoff@chromium.org</owner> + <owner>kaklilu@chromium.org</owner> + <summary> + Records HTTP response codes of network requests made by the experimental + plus addresses feature. The PlusAddressClient records this whenever it gets + a response for the network requests it makes. + </summary> + <token key="Type"> + <variant name="AutofillPlusAddressNetworkRequestType" + summary="The relevant network request."/> + </token> +</histogram> + <histogram name="Autofill.PlusAddresses.Suggestion.Events" enum="PlusAddressSuggestionEvent" expires_after="2024-09-24"> <owner>mreichhoff@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml index da73232..3256dfc 100644 --- a/tools/metrics/histograms/metadata/enterprise/histograms.xml +++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -939,6 +939,16 @@ </summary> </histogram> +<histogram name="Enterprise.DeviceTrust.Key.LoadPersistedKeyResult" + enum="DTLoadPersistedKeyResult" expires_after="2024-06-01"> + <owner>seblalancette@google.com</owner> + <owner>cbe-device-trust-eng@google.com</owner> + <summary> + Recorded when a key loading attempt was made with an enum value representing + either a successful attempt, or different possible errors. + </summary> +</histogram> + <histogram name="Enterprise.DeviceTrust.Key.Signing.Latency.{Variant}" units="ms" expires_after="2024-06-01"> <owner>seblalancette@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml index a78ffbbc..3dc2237 100644 --- a/tools/metrics/histograms/metadata/ios/histograms.xml +++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -2642,6 +2642,36 @@ </summary> </histogram> +<histogram name="IOS.SaveToPhotos.UploadFailureLatency" units="ms" + expires_after="2024-03-29"> + <owner>qpubert@chromium.org</owner> + <owner>djean@chromium.org</owner> + <summary> + Logged when the Photos service completes an image upload with failure. It + records the time elapsed between the moment the upload request is submitted + to the service and the moment the service calls the provided completion + callback. In particular, this includes the time necessary to create a + destination album if necessary, upload the media item and add it to the + destination album. See IOS.SaveToPhotos.UploadSuccessLatency for recording + of successful completion. + </summary> +</histogram> + +<histogram name="IOS.SaveToPhotos.UploadSuccessLatency" units="ms" + expires_after="2024-03-29"> + <owner>qpubert@chromium.org</owner> + <owner>djean@chromium.org</owner> + <summary> + Logged when the Photos service completes an image upload with success. It + records the time elapsed between the moment the upload request is submitted + to the service and the moment the service calls the provided completion + callback. In particular, this includes the time necessary to create a + destination album if necessary, upload the media item and add it to the + destination album. See IOS.SaveToPhotos.UploadFailureLatency for recording + of unsuccessful completion. + </summary> +</histogram> + <histogram name="IOS.SearchExtension.Action" enum="IOSSearchExtensionAction" expires_after="2024-09-18"> <owner>olivierrobin@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml index fb56bc04..bc40cc8c 100644 --- a/tools/metrics/histograms/metadata/network/histograms.xml +++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -117,6 +117,17 @@ </summary> </histogram> +<histogram + name="Network.Ash.Cellular.AllowTextMessages.TextMessageNotificationSuppressionState" + enum="NotificationSuppressionState" expires_after="2024-06-01"> + <owner>gordonseto@google.com</owner> + <owner>cros-connectivity@google.com</owner> + <summary> + Records the received text message notification suppression state. This is + emitted whenever a text message notification is received. + </summary> +</histogram> + <histogram name="Network.Ash.Cellular.AllowTextMessages.User.SuppressionState" enum="UserTextMessageSuppressionState" expires_after="2024-06-01"> <owner>gordonseto@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index 85ff5b4..77b098b 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -9451,13 +9451,38 @@ <token key="ClientId" variants="PageImageServiceClientId"/> </histogram> +<histogram name="PageImageService.ConsentStatusOnTimeout" + enum="PageImageServiceConsentStatus" expires_after="2024-02-20"> + <owner>tommycli@chromium.org</owner> + <owner>chrome-journeys@google.com</owner> + <component>UI>Browser>Journeys</component> + <summary> + Records the result of the URL consent check after timeout has expired. + Recorded for each request which was enqueued by the time when timeout + happened. + </summary> +</histogram> + +<histogram name="PageImageService.ConsentStatusRequestCount" enum="Boolean" + expires_after="2024-02-20"> + <owner>tommycli@chromium.org</owner> + <owner>chrome-journeys@google.com</owner> + <component>UI>Browser>Journeys</component> + <summary> + Recorded on each URL consent check request. This metric is used to compare + numbers with consent check result in PageImageService.ConsentStatus. + </summary> +</histogram> + <histogram name="PageImageService.ConsentStatus{ClientId}" enum="PageImageServiceConsentStatus" expires_after="2024-02-20"> <owner>tommycli@chromium.org</owner> <owner>chrome-journeys@google.com</owner> <component>UI>Browser>Journeys</component> <summary> - Records the result of the URL consent check for this request. + Records the result of the URL consent check for this request. The number of + consent check requests is recorded in + PageImageService.ConsentStatusRequestCount. Note that only success and failure are captured if the "old" unified consent throttle is used.
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index 90781c2..95d9245 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -2033,19 +2033,6 @@ </summary> </histogram> -<histogram name="PasswordManager.MigratedSettingsUPMAndroid" - enum="BooleanEnabled" expires_after="2024-02-04"> - <owner>ioanap@chromium.org</owner> - <owner>kazinova@google.com</owner> - <summary> - Records true when a settings migration occurs as part of the UPM transition. - It is recorded when the settings service (profile-scoped) is instantiated in - a Chrome client with UPM enabled if a migration hasn't already occured. Note - that if UPM is disabled, the next time it is enabled a new migration will - happen and be recorded. - </summary> -</histogram> - <histogram name="PasswordManager.MigrationToOSCrypt.{Store}DeletedPasswordCount" units="count" expires_after="2024-03-17">
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml index 337299a..b361c11 100644 --- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml +++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -1227,8 +1227,8 @@ one of them. </summary> <token key="IneligibleReason"> - <variant name="IneligibleForSession" - summary="the feature being disabled for the session"/> + <variant name="IneligibleForSessionOrLocation" + summary="the feature being disabled for the session or the location"/> <variant name="NotAllowedByPolicy" summary="not being allowed by policy"/> <variant name="NotStandardProtection" summary="not having standard protection"/>
diff --git a/tools/metrics/histograms/metadata/settings/histograms.xml b/tools/metrics/histograms/metadata/settings/histograms.xml index bee00914..c0b8516d 100644 --- a/tools/metrics/histograms/metadata/settings/histograms.xml +++ b/tools/metrics/histograms/metadata/settings/histograms.xml
@@ -417,6 +417,28 @@ </summary> </histogram> +<histogram + name="Settings.PrivacySandbox.CanNonNormalBrowserWindowFitConsentWidth" + enum="Boolean" expires_after="2024-08-25"> + <owner>boujane@google.com</owner> + <owner>koilos@google.com</owner> + <summary> + In case of non normal browser(Pop up or PIP for example), Records whether + the window width was too small to fit the consent dialog. + </summary> +</histogram> + +<histogram + name="Settings.PrivacySandbox.CanNonNormalBrowserWindowFitNoticeWidth" + enum="Boolean" expires_after="2024-08-25"> + <owner>boujane@google.com</owner> + <owner>koilos@google.com</owner> + <summary> + In case of non normal browser(Pop up or PIP for example), Records whether + the window width was too small to fit the notice dialog. + </summary> +</histogram> + <histogram name="Settings.PrivacySandbox.DeprecatedRedirect" enum="BooleanRedirected" expires_after="2024-02-11"> <owner>olesiamarukhno@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml index 12479bc..f37bbbcb 100644 --- a/tools/metrics/histograms/metadata/tab/histograms.xml +++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -244,6 +244,16 @@ </summary> </histogram> +<histogram name="Tab.HasThemeColor" units="BooleanPresent" + expires_after="2024-09-29"> + <owner>gambard@chromium.org</owner> + <owner>bling-team@google.com</owner> + <summary> + [iOS] Whether a page has a theme-color html tag set, recorded when the page + is fully loaded. + </summary> +</histogram> + <histogram name="Tab.NewTab" enum="NewTabType" expires_after="2024-02-25"> <owner>tbergquist@chromium.org</owner> <owner>bsep@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/update_engine/histograms.xml b/tools/metrics/histograms/metadata/update_engine/histograms.xml index 53ebe7c..97808bf 100644 --- a/tools/metrics/histograms/metadata/update_engine/histograms.xml +++ b/tools/metrics/histograms/metadata/update_engine/histograms.xml
@@ -475,6 +475,18 @@ </summary> </histogram> +<histogram name="UpdateEngine.EnterpriseUpdateInvalidatedResult" + enum="BooleanSuccess" expires_after="2024-05-01"> + <owner>artyomchen@google.com</owner> + <owner>chromeos-commercial-remote-management@google.com</owner> + <summary> + This metric is reported every time the updates are invalidated due to the + enterprise policy. Reports whether the update was able to be invalidated. + + This metric is specific to Chrome OS. + </summary> +</histogram> + <histogram name="UpdateEngine.FailedUpdateCount" units="count" expires_after="2024-03-03"> <owner>kimjae@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 d8d51b49..76c6a69 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@ "full_remote_path": "perfetto-luci-artifacts/v37.0/linux-arm64/trace_processor_shell" }, "win": { - "hash": "a95a54e93fe90c0f4c8cd9eb6c0e623240519ec4", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/e879b2e2ee67ba3ce9bbb01bb7d776c8dff28897/trace_processor_shell.exe" + "hash": "942259b3b9a20124538fbce57d8160f08e2bba19", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/5773ad947c4f24adfea80579dcbac145cd03c831/trace_processor_shell.exe" }, "linux_arm": { "hash": "4ad0dc8eeae3ad92d6a1da2f1653a81fb9e3c4c1", @@ -21,8 +21,8 @@ "full_remote_path": "perfetto-luci-artifacts/v35.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "9a38db3d9d1808db8f543f6f2aec55c831058b66", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/e879b2e2ee67ba3ce9bbb01bb7d776c8dff28897/trace_processor_shell" + "hash": "901915bcbeacf0aa5a6f339fa89ee2f5209a60c5", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/5773ad947c4f24adfea80579dcbac145cd03c831/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/base/x/x11_display_util.cc b/ui/base/x/x11_display_util.cc index 8f833ba..d9fafd7 100644 --- a/ui/base/x/x11_display_util.cc +++ b/ui/base/x/x11_display_util.cc
@@ -370,8 +370,8 @@ display.set_depth_per_component(bits_per_component); // Set monitor refresh rate - int refresh_rate = static_cast<int>( - GetRefreshRateFromXRRModeInfo(resources->modes, crtc->mode)); + float refresh_rate = + GetRefreshRateFromXRRModeInfo(resources->modes, crtc->mode); display.set_display_frequency(refresh_rate); }
diff --git a/ui/display/display.h b/ui/display/display.h index 67d728b..890d2329 100644 --- a/ui/display/display.h +++ b/ui/display/display.h
@@ -267,8 +267,8 @@ void set_is_monochrome(bool is_monochrome) { is_monochrome_ = is_monochrome; } // The display frequency of the monitor. - int display_frequency() const { return display_frequency_; } - void set_display_frequency(int display_frequency) { + float display_frequency() const { return display_frequency_; } + void set_display_frequency(float display_frequency) { display_frequency_ = display_frequency; } @@ -334,7 +334,7 @@ int depth_per_component_; bool is_monochrome_ = false; bool detected_ = true; - int display_frequency_ = 0; + float display_frequency_ = 0; std::string label_; uint32_t audio_formats_ = 0; };
diff --git a/ui/display/display_unittest.cc b/ui/display/display_unittest.cc index 7707742..ce9e5c14 100644 --- a/ui/display/display_unittest.cc +++ b/ui/display/display_unittest.cc
@@ -74,11 +74,11 @@ TEST(DisplayTest, DisplayFrequency) { Display display(0, gfx::Rect(0, 0, 100, 100)); - display.set_display_frequency(60); - EXPECT_EQ(60, display.display_frequency()); + display.set_display_frequency(60.0f); + EXPECT_EQ(60.0f, display.display_frequency()); - display.set_display_frequency(120); - EXPECT_EQ(120, display.display_frequency()); + display.set_display_frequency(120.0f); + EXPECT_EQ(120.0f, display.display_frequency()); } TEST(DisplayTest, DisplayLabel) {
diff --git a/ui/display/mojom/display.mojom b/ui/display/mojom/display.mojom index 7b95a7c..d11de5c 100644 --- a/ui/display/mojom/display.mojom +++ b/ui/display/mojom/display.mojom
@@ -45,6 +45,6 @@ int32 color_depth; int32 depth_per_component; bool is_monochrome; - int32 display_frequency; + float display_frequency; string label; };
diff --git a/ui/display/mojom/display_mojom_traits.h b/ui/display/mojom/display_mojom_traits.h index c021d92c..7c9ccef 100644 --- a/ui/display/mojom/display_mojom_traits.h +++ b/ui/display/mojom/display_mojom_traits.h
@@ -100,7 +100,7 @@ return display.is_monochrome(); } - static int32_t display_frequency(const display::Display& display) { + static float display_frequency(const display::Display& display) { return display.display_frequency(); } static const std::string& label(const display::Display& display) {
diff --git a/ui/display/mojom/screen_info.mojom b/ui/display/mojom/screen_info.mojom index 7991569..cd697ac 100644 --- a/ui/display/mojom/screen_info.mojom +++ b/ui/display/mojom/screen_info.mojom
@@ -34,7 +34,7 @@ // The display frequency in Hz of the monitor. Set to 0 if it fails in the // monitor frequency query. - uint32 display_frequency; + float display_frequency; // The display monitor rectangle in virtual-screen coordinates. Note that // this may be negative.
diff --git a/ui/display/mojom/screen_info_mojom_traits.h b/ui/display/mojom/screen_info_mojom_traits.h index 57f37527..7aed71b 100644 --- a/ui/display/mojom/screen_info_mojom_traits.h +++ b/ui/display/mojom/screen_info_mojom_traits.h
@@ -34,7 +34,7 @@ return r.is_monochrome; } - static int display_frequency(const display::ScreenInfo& r) { + static float display_frequency(const display::ScreenInfo& r) { return r.display_frequency; }
diff --git a/ui/display/screen_info.h b/ui/display/screen_info.h index 13f51ce..082e53c 100644 --- a/ui/display/screen_info.h +++ b/ui/display/screen_info.h
@@ -38,7 +38,7 @@ // The display frequency in Hz of the monitor. Set to 0 if it fails in the // monitor frequency query. - int display_frequency = 0; + float display_frequency = 0; // This is set from the rcMonitor member of MONITORINFOEX, to whit: // "A RECT structure that specifies the display monitor rectangle,
diff --git a/ui/display/util/gpu_info_util.cc b/ui/display/util/gpu_info_util.cc index b95600f..ca5c3761 100644 --- a/ui/display/util/gpu_info_util.cc +++ b/ui/display/util/gpu_info_util.cc
@@ -24,4 +24,12 @@ return dict; } +base::Value::Dict BuildGpuInfoEntry(base::StringPiece description, + base::Value::List value) { + base::Value::Dict dict; + dict.Set("description", description); + dict.Set("value", std::move(value)); + return dict; +} + } // namespace display
diff --git a/ui/display/util/gpu_info_util.h b/ui/display/util/gpu_info_util.h index 83cf1e47..db56da3 100644 --- a/ui/display/util/gpu_info_util.h +++ b/ui/display/util/gpu_info_util.h
@@ -16,6 +16,8 @@ base::StringPiece value); base::Value::Dict BuildGpuInfoEntry(base::StringPiece description, base::Value value); +base::Value::Dict BuildGpuInfoEntry(base::StringPiece description, + base::Value::List value); } // namespace display
diff --git a/ui/display/win/display_info.cc b/ui/display/win/display_info.cc index a6b195d7..76bcd33f5 100644 --- a/ui/display/win/display_info.cc +++ b/ui/display/win/display_info.cc
@@ -14,7 +14,7 @@ float device_scale_factor, float sdr_white_level, Display::Rotation rotation, - int display_frequency, + float display_frequency, const gfx::Vector2dF& pixels_per_inch, DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY output_technology, const std::string& label)
diff --git a/ui/display/win/display_info.h b/ui/display/win/display_info.h index dd1a9d1..e2221e4 100644 --- a/ui/display/win/display_info.h +++ b/ui/display/win/display_info.h
@@ -20,7 +20,7 @@ float device_scale_factor, float sdr_white_level, Display::Rotation rotation, - int display_frequency, + float display_frequency, const gfx::Vector2dF& pixels_per_inch, DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY output_technology, const std::string& label); @@ -35,7 +35,7 @@ float device_scale_factor() const { return device_scale_factor_; } float sdr_white_level() const { return sdr_white_level_; } Display::Rotation rotation() const { return rotation_; } - int display_frequency() const { return display_frequency_; } + float display_frequency() const { return display_frequency_; } const gfx::Vector2dF& pixels_per_inch() const { return pixels_per_inch_; } DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY output_technology() const { return output_technology_; @@ -57,7 +57,7 @@ float device_scale_factor_; float sdr_white_level_; Display::Rotation rotation_; - int display_frequency_; + float display_frequency_; // Pixels per inch of a display. This value will only be set for touch // monitors. In non-touch cases, it will be set to Zero. gfx::Vector2dF pixels_per_inch_;
diff --git a/ui/display/win/scaling_util_unittest.cc b/ui/display/win/scaling_util_unittest.cc index c18edc2..4b831660 100644 --- a/ui/display/win/scaling_util_unittest.cc +++ b/ui/display/win/scaling_util_unittest.cc
@@ -24,8 +24,8 @@ gfx::Rect(x, y, width, height), kFakeDisplayName); return internal::DisplayInfo( - monitor_info, scale_factor, 1.0f, Display::ROTATE_0, 60, gfx::Vector2dF(), - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, std::string()); + monitor_info, scale_factor, 1.0f, Display::ROTATE_0, 60.0f, + gfx::Vector2dF(), DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, std::string()); } ::testing::AssertionResult AssertOffsetsEqual(
diff --git a/ui/display/win/screen_win.cc b/ui/display/win/screen_win.cc index aa73868..773fbb8 100644 --- a/ui/display/win/screen_win.cc +++ b/ui/display/win/screen_win.cc
@@ -179,10 +179,7 @@ const gfx::ColorSpace& color_space, float sdr_white_level) { gfx::DisplayColorSpaces display_color_spaces(color_space); - // When alpha is not needed, specify BGRX_8888 to get - // DXGI_ALPHA_MODE_IGNORE. This saves significant power (see - // https://crbug.com/1057163). - display_color_spaces.SetOutputBufferFormats(gfx::BufferFormat::BGRX_8888, + display_color_spaces.SetOutputBufferFormats(gfx::BufferFormat::BGRA_8888, gfx::BufferFormat::BGRA_8888); display_color_spaces.SetSDRMaxLuminanceNits(sdr_white_level); return display_color_spaces;
diff --git a/ui/display/win/screen_win_unittest.cc b/ui/display/win/screen_win_unittest.cc index cddf74c9..e96bf4d 100644 --- a/ui/display/win/screen_win_unittest.cc +++ b/ui/display/win/screen_win_unittest.cc
@@ -166,7 +166,7 @@ win::test::CreateMonitorInfo(pixel_bounds, pixel_work, device_name); monitor_infos_.push_back(monitor_info); display_infos_.push_back(internal::DisplayInfo( - monitor_info, device_scale_factor, 1.0f, Display::ROTATE_0, 60, + monitor_info, device_scale_factor, 1.0f, Display::ROTATE_0, 60.0f, gfx::Vector2dF(), tech, std::string())); }
diff --git a/ui/display/win/test/scoped_screen_win.cc b/ui/display/win/test/scoped_screen_win.cc index 0d05660..d3f43312 100644 --- a/ui/display/win/test/scoped_screen_win.cc +++ b/ui/display/win/test/scoped_screen_win.cc
@@ -16,9 +16,9 @@ const MONITORINFOEX monitor_info = CreateMonitorInfo(kPixelBounds, kPixelWork, L"primary"); UpdateFromDisplayInfos( - {{monitor_info, /*device_scale_factor=*/1.0f, 1.0f, Display::ROTATE_0, 60, - gfx::Vector2dF(96.0, 96.0), DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, - std::string()}}); + {{monitor_info, /*device_scale_factor=*/1.0f, 1.0f, Display::ROTATE_0, + 60.0f, gfx::Vector2dF(96.0, 96.0), + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, std::string()}}); } } // namespace test
diff --git a/ui/gfx/geometry/rrect_f.cc b/ui/gfx/geometry/rrect_f.cc index 85e49c88..7225700 100644 --- a/ui/gfx/geometry/rrect_f.cc +++ b/ui/gfx/geometry/rrect_f.cc
@@ -10,6 +10,7 @@ #include "base/values.h" #include "third_party/skia/include/core/SkMatrix.h" +#include "ui/gfx/geometry/rect_conversions.h" namespace gfx { @@ -224,4 +225,18 @@ return true; } +// static +RRectF RRectF::ToEnclosingRRectF(const RRectF& rrect_f) { + return RRectF(gfx::RectF(ToEnclosingRect(rrect_f.rect())), + rrect_f.GetRoundedCorners()); +} + +gfx::RoundedCornersF RRectF::GetRoundedCorners() const { + auto upper_left = GetCornerRadii(Corner::kUpperLeft); + auto upper_right = GetCornerRadii(Corner::kUpperRight); + auto lower_right = GetCornerRadii(Corner::kLowerRight); + auto lower_left = GetCornerRadii(Corner::kLowerLeft); + return {upper_left.x(), upper_right.x(), lower_right.x(), lower_left.x()}; +} + } // namespace gfx
diff --git a/ui/gfx/geometry/rrect_f.h b/ui/gfx/geometry/rrect_f.h index b96df59..c76d4db1 100644 --- a/ui/gfx/geometry/rrect_f.h +++ b/ui/gfx/geometry/rrect_f.h
@@ -169,9 +169,13 @@ explicit operator SkRRect() const { return skrrect_; } + static RRectF ToEnclosingRRectF(const RRectF& rrect); + private: void GetAllRadii(SkVector radii[4]) const; + gfx::RoundedCornersF GetRoundedCorners() const; + SkRRect skrrect_; };
diff --git a/ui/ozone/demo/skia/skia_gl_renderer.cc b/ui/ozone/demo/skia/skia_gl_renderer.cc index a65021b..a81d9b8 100644 --- a/ui/ozone/demo/skia/skia_gl_renderer.cc +++ b/ui/ozone/demo/skia/skia_gl_renderer.cc
@@ -19,6 +19,7 @@ #include "third_party/skia/include/gpu/GrBackendSurface.h" #include "third_party/skia/include/gpu/ganesh/SkSurfaceGanesh.h" #include "third_party/skia/include/gpu/ganesh/gl/GrGLBackendSurface.h" +#include "third_party/skia/include/gpu/ganesh/gl/GrGLDirectContext.h" #include "third_party/skia/include/gpu/gl/GrGLAssembleInterface.h" #include "third_party/skia/include/gpu/gl/GrGLInterface.h" #include "third_party/skia/include/gpu/gl/GrGLTypes.h" @@ -79,7 +80,7 @@ // TODO(csmartdalton): enable internal multisampling after the related Skia // rolls are in. options.fInternalMultisampleCount = 0; - gr_context_ = GrDirectContext::MakeGL(std::move(native_interface), options); + gr_context_ = GrDirectContexts::MakeGL(std::move(native_interface), options); DCHECK(gr_context_); PostRenderFrameTask(gfx::SwapCompletionResult(gfx::SwapResult::SWAP_ACK));
diff --git a/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc b/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc index 4ba7183..f566469 100644 --- a/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc
@@ -272,16 +272,14 @@ TEST_P(WaylandDataDragControllerTest, StartDrag) { FocusAndPressLeftPointerButton(window_.get(), &delegate_); - auto test = [](WaylandDataDragControllerTest* self) { - // Now the server can read the data and give it to our callback. - self->ReadAndCheckData(kMimeTypeTextUtf8, kSampleTextForDragAndDrop); - - self->SendDndCancelled(); - }; - // Post test task to be performed asynchronously once the dnd-related protocol // objects are ready. - ScheduleTestTask(base::BindOnce(test, base::Unretained(this))); + ScheduleTestTask(base::BindLambdaForTesting([&]() { + // Now the server can read the data and give it to our callback. + ReadAndCheckData(kMimeTypeTextUtf8, kSampleTextForDragAndDrop); + + SendDndCancelled(); + })); RunMouseDragWithSampleData( window_.get(), DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_MOVE); @@ -317,8 +315,9 @@ ClipboardFormatType::WebCustomDataType(), ClipboardFormatType::GetType("chromium/x-bookmark-entries"), ClipboardFormatType::GetType("xyz/arbitrary-custom-type")}; - for (auto format : kCustomFormats) + for (auto format : kCustomFormats) { data.SetPickledData(format, {}); + } // The client starts dragging offering pickled data with custom formats. drag_controller()->StartSession(data, DragDropTypes::DRAG_MOVE, @@ -336,22 +335,6 @@ }); } -TEST_P(WaylandDataDragControllerTest, StartDragWithText) { - FocusAndPressLeftPointerButton(window_.get(), &delegate_); - - // The client starts dragging offering text mime type. - OSExchangeData os_exchange_data; - os_exchange_data.SetString(sample_text_for_dnd()); - int operations = DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_MOVE; - drag_controller()->StartSession(os_exchange_data, operations, - DragEventSource::kMouse); - - // The server should get a "text" representation in ReadData callback when - // trying to read it as mime type other than |kMimeTypeText| and - // |kTextMimeTypeUtf8|. - ReadAndCheckData(kMimeTypeText, kSampleTextForDragAndDrop); -} - TEST_P(WaylandDataDragControllerTest, StartDragWithFileContents) { FocusAndPressLeftPointerButton(window_.get(), &delegate_);
diff --git a/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h b/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h index e565d1c..0720a82d 100644 --- a/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h +++ b/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h
@@ -110,6 +110,8 @@ absl::optional<mojom::DragEventSource> drag_source() { return drag_source_; } + const gfx::Vector2d& drag_offset_for_testing() const { return drag_offset_; } + private: class ExtendedDragSource;
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 ea4c7f2e..3209b4e 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
@@ -43,6 +43,7 @@ #include "ui/ozone/platform/wayland/test/test_output.h" #include "ui/ozone/platform/wayland/test/test_util.h" #include "ui/ozone/platform/wayland/test/test_wayland_server_thread.h" +#include "ui/ozone/platform/wayland/test/test_zaura_toplevel.h" #include "ui/ozone/platform/wayland/test/wayland_drag_drop_test.h" #include "ui/platform_window/extensions/wayland_extension.h" #include "ui/platform_window/platform_window_delegate.h" @@ -105,6 +106,41 @@ } } + void SendDndMotionForWindowDrag(const gfx::Point& location) { + WaylandDragDropTest::SendDndMotion(location); +#if BUILDFLAG(IS_CHROMEOS_LACROS) + // Emulate the server side logic during move loop. The server + // server controls the bounds only when the window is detached. + if (connection_->window_drag_controller()->state() != + WaylandWindowDragController::State::kDetached) { + return; + } + // The window must exist. (should not be swallowed nor destroyed) + ASSERT_TRUE(window_); + auto& offset = + connection_->window_drag_controller()->drag_offset_for_testing(); + gfx::Point new_origin = (location - offset); + auto* dragged_window = + connection_->window_drag_controller()->dragged_window_for_testing(); + ASSERT_TRUE(dragged_window); + const uint32_t surface_id = + dragged_window->root_surface()->get_surface_id(); + PostToServerAndWait( + [new_origin, surface_id](wl::TestWaylandServerThread* server) { + auto* surface = server->GetObject<wl::MockSurface>(surface_id); + ASSERT_TRUE(surface); + ASSERT_TRUE(surface->xdg_surface()); + ASSERT_TRUE(surface->xdg_surface()->xdg_toplevel()); + + auto* aura_toplevel = + surface->xdg_surface()->xdg_toplevel()->zaura_toplevel(); + ASSERT_TRUE(aura_toplevel); + zaura_toplevel_send_origin_change(aura_toplevel->resource(), + new_origin.x(), new_origin.y()); + }); +#endif + } + protected: using State = WaylandWindowDragController::State; @@ -164,18 +200,11 @@ } }; -// TODO(https://crbug.com/1448391): Reenable for Lacros when adjusted for screen -// coordinates. -#if BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_DragInsideWindowAndDrop DISABLED_DragInsideWindowAndDrop -#else -#define MAYBE_DragInsideWindowAndDrop DragInsideWindowAndDrop -#endif // Check the following flow works as expected: // 1. With a single 1 window open, // 2. Move pointer into it, press left button, move cursor a bit (drag), // 3. Run move loop, drag it within the window bounds and drop. -TEST_P(WaylandWindowDragControllerTest, MAYBE_DragInsideWindowAndDrop) { +TEST_P(WaylandWindowDragControllerTest, DragInsideWindowAndDrop) { // Ensure there is no window currently focused EXPECT_FALSE(window_manager()->GetCurrentPointerOrTouchFocusedWindow()); EXPECT_EQ(gfx::kNullAcceleratedWidget, @@ -213,9 +242,9 @@ // WaylandWindowDragController::OnDragEnter. Run this via a task run. // Otherwise, the data offer will be reset and // WaylandWindowDragController will crash. - ScheduleTestTask(base::BindOnce(&WaylandDragDropTest::SendDndMotion, - base::Unretained(this), - gfx::Point(20, 20))); + ScheduleTestTask(base::BindOnce( + &WaylandWindowDragControllerTest::SendDndMotionForWindowDrag, + base::Unretained(this), gfx::Point(20, 20))); test_step = kDragging; break; case kDropping: { @@ -263,19 +292,11 @@ screen_->GetLocalProcessWidgetAtPoint({20, 20}, {})); } -// TODO(https://crbug.com/1448391): Reenable for Lacros when adjusted for screen -// coordinates. -#if BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_DragInsideWindowAndDrop_TOUCH \ - DISABLED_DragInsideWindowAndDrop_TOUCH -#else -#define MAYBE_DragInsideWindowAndDrop_TOUCH DragInsideWindowAndDrop_TOUCH -#endif // Check the following flow works as expected: // 1. With a single window open, // 2. Touch down and move the touch point a bit (drag), // 3. Run move loop, drag it within the window bounds and drop. -TEST_P(WaylandWindowDragControllerTest, MAYBE_DragInsideWindowAndDrop_TOUCH) { +TEST_P(WaylandWindowDragControllerTest, DragInsideWindowAndDrop_TOUCH) { ASSERT_TRUE(GetWmMoveLoopHandler(*window_)); ASSERT_TRUE(GetWaylandExtension(*window_)); @@ -303,7 +324,7 @@ EXPECT_EQ(ET_TOUCH_MOVED, event->type()); EXPECT_EQ(gfx::Point(10, 10), screen_->GetCursorScreenPoint()); }); - SendDndMotion({10, 10}); + SendDndMotionForWindowDrag({10, 10}); enum TestStep { kDragging, kDropping, kDone } test_step = kDragging; @@ -336,9 +357,9 @@ // Otherwise, we are not able to override the dispatcher and miss events. // This task must be scheduled so that move loop is able to be started before // this task is executed. - ScheduleTestTask(base::BindOnce(&WaylandDragDropTest::SendDndMotion, - base::Unretained(this), - gfx::Point({20, 20}))); + ScheduleTestTask(base::BindOnce( + &WaylandWindowDragControllerTest::SendDndMotionForWindowDrag, + base::Unretained(this), gfx::Point({20, 20}))); // RunMoveLoop() blocks until the dragging session ends, so resume test // server's run loop until it returns. @@ -448,13 +469,6 @@ SendTouchUp(0 /*touch id*/); } -// TODO(https://crbug.com/1448391): Reenable for Lacros when adjusted for screen -// coordinates. -#if BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_DragExitWindowAndDrop DISABLED_DragExitWindowAndDrop -#else -#define MAYBE_DragExitWindowAndDrop DragExitWindowAndDrop -#endif // Check the following flow works as expected: // 1. With only 1 window open; // 2. Move pointer into it, press left button, move cursor a bit (drag); @@ -462,7 +476,7 @@ // 4. Drag pointer to outside the window and release the mouse button, and make // sure RELEASE and EXIT mouse events are delivered even when the drop // happens outside the bounds of any surface. -TEST_P(WaylandWindowDragControllerTest, MAYBE_DragExitWindowAndDrop) { +TEST_P(WaylandWindowDragControllerTest, DragExitWindowAndDrop) { // Ensure there is no window currently focused EXPECT_FALSE(window_manager()->GetCurrentPointerOrTouchFocusedWindow()); EXPECT_EQ(gfx::kNullAcceleratedWidget, @@ -500,9 +514,9 @@ // WaylandWindowDragController::OnDragEnter. Run this via a task run. // Otherwise, the data offer will be reset and // WaylandWindowDragController will crash. - ScheduleTestTask(base::BindOnce(&WaylandDragDropTest::SendDndMotion, - base::Unretained(this), - gfx::Point(20, 20))); + ScheduleTestTask(base::BindOnce( + &WaylandWindowDragControllerTest::SendDndMotionForWindowDrag, + base::Unretained(this), gfx::Point(20, 20))); test_step = kDragging; break; case kExitedDropping: { @@ -551,14 +565,6 @@ screen_->GetLocalProcessWidgetAtPoint({20, 20}, {})); } -// TODO(https://crbug.com/1448391): Reenable for Lacros when adjusted for screen -// coordinates. -#if BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_DragToOtherWindowSnapDragDrop \ - DISABLED_DragToOtherWindowSnapDragDrop -#else -#define MAYBE_DragToOtherWindowSnapDragDrop DragToOtherWindowSnapDragDrop -#endif // Check the following flow works as expected: // 1. With 2 windows open, // 2. Focus window 1, starts dragging, @@ -567,7 +573,7 @@ // 5. Drag it a bit more (within window 2) and then calls EndMoveLoop(), // emulating a window snap), and then // 6. With the window in "snapped" state, drag it further and then drop. -TEST_P(WaylandWindowDragControllerTest, MAYBE_DragToOtherWindowSnapDragDrop) { +TEST_P(WaylandWindowDragControllerTest, DragToOtherWindowSnapDragDrop) { // Init and open |target_window|. PlatformWindowInitProperties properties{gfx::Rect{80, 80}}; properties.type = PlatformWindowType::kWindow; @@ -624,9 +630,9 @@ // WaylandWindowDragController::OnDragEnter. Run this via a task run. // Otherwise, the data offer will be reset and // WaylandWindowDragController will crash. - ScheduleTestTask(base::BindOnce(&WaylandDragDropTest::SendDndMotion, - base::Unretained(this), - gfx::Point(50, 50))); + ScheduleTestTask(base::BindOnce( + &WaylandWindowDragControllerTest::SendDndMotionForWindowDrag, + base::Unretained(this), gfx::Point(50, 50))); test_step = kDragging; break; case kEnteredTarget: @@ -676,7 +682,7 @@ EXPECT_CALL(delegate_, DispatchEvent(_)).Times(5); gfx::Point location(30, 30); for (size_t count = 1; count <= 5; ++count) { - SendDndMotion(location); + SendDndMotionForWindowDrag(location); location.Offset(0, 3); } @@ -724,15 +730,6 @@ screen_->GetLocalProcessWidgetAtPoint({20, 20}, {})); } -// TODO(https://crbug.com/1448391): Reenable for Lacros when adjusted for screen -// coordinates. -#if BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_DragToOtherWindowSnapDragDrop_TOUCH \ - DISABLED_DragToOtherWindowSnapDragDrop_TOUCH -#else -#define MAYBE_DragToOtherWindowSnapDragDrop_TOUCH \ - DragToOtherWindowSnapDragDrop_TOUCH -#endif // Check the following flow works as expected: // 1. With 2 windows open, // 2. Focus window 1, starts dragging, @@ -741,8 +738,7 @@ // 5. Drag it a bit more (within window 2) and then calls EndMoveLoop(), // emulating a window snap), and then // 6. With the window in "snapped" state, drag it further and then drop. -TEST_P(WaylandWindowDragControllerTest, - MAYBE_DragToOtherWindowSnapDragDrop_TOUCH) { +TEST_P(WaylandWindowDragControllerTest, DragToOtherWindowSnapDragDrop_TOUCH) { // Init and open |target_window|. PlatformWindowInitProperties properties{gfx::Rect{80, 80}}; properties.type = PlatformWindowType::kWindow; @@ -777,7 +773,7 @@ EXPECT_EQ(ET_TOUCH_MOVED, event->type()); EXPECT_EQ(gfx::Point(10, 10), screen_->GetCursorScreenPoint()); }); - SendDndMotion({10, 10}); + SendDndMotionForWindowDrag({10, 10}); auto* move_loop_handler = GetWmMoveLoopHandler(*window_); ASSERT_TRUE(move_loop_handler); @@ -813,8 +809,9 @@ // While in |kDetached| state, motion events are expected to be propagated // window bounds changed events. test_step = kDragging; - ScheduleTestTask(base::BindOnce(&WaylandDragDropTest::SendDndMotion, - base::Unretained(this), gfx::Point(50, 50))); + ScheduleTestTask(base::BindOnce( + &WaylandWindowDragControllerTest::SendDndMotionForWindowDrag, + base::Unretained(this), gfx::Point(50, 50))); // RunMoveLoop() blocks until the window moving ends. // TODO(nickdiego): Should succeed for this test case. @@ -840,7 +837,7 @@ EXPECT_CALL(delegate_, DispatchEvent(_)).Times(5); gfx::Point location(30, 30); for (size_t count = 1; count <= 5; ++count) { - SendDndMotion(location); + SendDndMotionForWindowDrag(location); location.Offset(0, 3); } @@ -870,15 +867,6 @@ EXPECT_FALSE(window_manager()->GetCurrentPointerOrTouchFocusedWindow()); } -// TODO(https://crbug.com/1448391): Reenable for Lacros when adjusted for screen -// coordinates. -#if BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_DragToOtherWindowIgnoringSpuriousPointerEnterEvent \ - DISABLED_DragToOtherWindowIgnoringSpuriousPointerEnterEvent -#else -#define MAYBE_DragToOtherWindowIgnoringSpuriousPointerEnterEvent \ - DragToOtherWindowIgnoringSpuriousPointerEnterEvent -#endif // Check the following flow works as expected: // 1. With 2 windows open, // 2. Focus window 1, starts dragging, @@ -889,7 +877,7 @@ // 6. Drag it a bit more (within window 2) and then calls EndMoveLoop(), // emulating a window snap), and then drop. TEST_P(WaylandWindowDragControllerTest, - MAYBE_DragToOtherWindowIgnoringSpuriousPointerEnterEvent) { + DragToOtherWindowIgnoringSpuriousPointerEnterEvent) { // Init and open |target_window|. PlatformWindowInitProperties properties{gfx::Rect{80, 80}}; properties.type = PlatformWindowType::kWindow; @@ -946,9 +934,9 @@ // WaylandWindowDragController::OnDragEnter. Run this via a task run. // Otherwise, the data offer will be reset and // WaylandWindowDragController will crash. - ScheduleTestTask(base::BindOnce(&WaylandDragDropTest::SendDndMotion, - base::Unretained(this), - gfx::Point(50, 50))); + ScheduleTestTask(base::BindOnce( + &WaylandWindowDragControllerTest::SendDndMotionForWindowDrag, + base::Unretained(this), gfx::Point(50, 50))); test_step = kDragging; break; case kEnteredTarget: @@ -1033,7 +1021,7 @@ // Emulate a [motion => leave] event sequence and make sure the correct // ui::Events are dispatched in response. EXPECT_CALL(delegate_, DispatchEvent(_)).Times(1); - SendDndMotion({50, 50}); + SendDndMotionForWindowDrag({50, 50}); EXPECT_CALL(delegate_, DispatchEvent(_)).WillOnce([&](Event* event) { EXPECT_EQ(ET_MOUSE_DRAGGED, event->type()); @@ -1049,8 +1037,13 @@ EXPECT_EQ(window_.get(), window_manager()->GetCurrentPointerOrTouchFocusedWindow()); - EXPECT_EQ(window_->GetWidget(), - screen_->GetLocalProcessWidgetAtPoint({20, 20}, {})); + if (window_->IsScreenCoordinatesEnabled()) { + EXPECT_EQ(window_->GetWidget(), + screen_->GetLocalProcessWidgetAtPoint({70, 70}, {})); + } else { + EXPECT_EQ(window_->GetWidget(), + screen_->GetLocalProcessWidgetAtPoint({20, 20}, {})); + } } // Verifies wl_data_device::leave events are properly handled and propagated @@ -1076,7 +1069,7 @@ // Emulate a [motion => leave] event sequence and make sure the correct // ui::Events are dispatched in response. EXPECT_CALL(delegate_, DispatchEvent(_)).Times(1); - SendDndMotion({50, 50}); + SendDndMotionForWindowDrag({50, 50}); EXPECT_CALL(delegate_, DispatchEvent(_)).WillOnce([&](Event* event) { EXPECT_EQ(ET_TOUCH_MOVED, event->type()); @@ -1127,13 +1120,6 @@ EXPECT_EQ(PlatformWindowState::kMaximized, window_->GetPlatformWindowState()); } -// TODO(https://crbug.com/1448391): Reenable for Lacros when adjusted for screen -// coordinates. -#if BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_IgnorePointerEventsUntilDrop DISABLED_IgnorePointerEventsUntilDrop -#else -#define MAYBE_IgnorePointerEventsUntilDrop IgnorePointerEventsUntilDrop -#endif // Check the following flow works as expected: // // 1. With a single 1 window open, @@ -1144,7 +1130,7 @@ // // Verifies window drag controller is resistant to issues such as // https://crbug.com/1148021. -TEST_P(WaylandWindowDragControllerTest, MAYBE_IgnorePointerEventsUntilDrop) { +TEST_P(WaylandWindowDragControllerTest, IgnorePointerEventsUntilDrop) { // Ensure there is no window currently focused EXPECT_FALSE(window_manager()->GetCurrentPointerOrTouchFocusedWindow()); EXPECT_EQ(gfx::kNullAcceleratedWidget, @@ -1182,9 +1168,9 @@ // WaylandWindowDragController::OnDragEnter. Run this via a task run. // Otherwise, the data offer will be reset and // WaylandWindowDragController will crash. - ScheduleTestTask(base::BindOnce(&WaylandDragDropTest::SendDndMotion, - base::Unretained(this), - gfx::Point(100, 100))); + ScheduleTestTask(base::BindOnce( + &WaylandWindowDragControllerTest::SendDndMotionForWindowDrag, + base::Unretained(this), gfx::Point(100, 100))); test_step = kDragging; break; case kDropping: { @@ -1274,18 +1260,8 @@ screen_->GetLocalProcessWidgetAtPoint({20, 20}, {})); } -// TODO(https://crbug.com/1448391): Reenable for Lacros when adjusted for screen -// coordinates. -#if BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_MotionEventsSkippedWhileReattaching \ - DISABLED_MotionEventsSkippedWhileReattaching -#else -#define MAYBE_MotionEventsSkippedWhileReattaching \ - MotionEventsSkippedWhileReattaching -#endif // Regression test for https://crbug.com/1169446. -TEST_P(WaylandWindowDragControllerTest, - MAYBE_MotionEventsSkippedWhileReattaching) { +TEST_P(WaylandWindowDragControllerTest, MotionEventsSkippedWhileReattaching) { auto* dragged_window = window_.get(); EXPECT_TRUE(dragged_window); @@ -1317,7 +1293,7 @@ self->window()->GetBoundsInDIP().origin()); EXPECT_TRUE(change.origin_changed); }); - self->SendDndMotion({30, 30}); + self->SendDndMotionForWindowDrag({30, 30}); move_loop_handler->EndMoveLoop(); @@ -1326,7 +1302,7 @@ // propagated. EXPECT_EQ(State::kAttaching, self->drag_controller()->state()); EXPECT_CALL(self->delegate(), OnBoundsChanged(_)).Times(0); - self->SendDndMotion({31, 31}); + self->SendDndMotionForWindowDrag({31, 31}); }; ScheduleTestTask(base::BindOnce(test, base::Unretained(this), base::Unretained(move_loop_handler))); @@ -1340,7 +1316,7 @@ // controller as usual. EXPECT_EQ(State::kAttached, drag_controller()->state()); EXPECT_CALL(delegate(), DispatchEvent(_)).Times(1); - SendDndMotion({30, 30}); + SendDndMotionForWindowDrag({30, 30}); EXPECT_CALL(delegate(), DispatchEvent(_)).Times(1); SendDndDrop(); @@ -1350,17 +1326,9 @@ EXPECT_EQ(State::kIdle, drag_controller()->state()); } -// TODO(https://crbug.com/1448391): Reenable for Lacros when adjusted for screen -// coordinates. -#if BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_CursorPositionIsUpdatedOnMotion \ - DISABLED_CursorPositionIsUpdatedOnMotion -#else -#define MAYBE_CursorPositionIsUpdatedOnMotion CursorPositionIsUpdatedOnMotion -#endif // Test that cursor position is using DIP coordinates and is updated correctly // on DragMotion event. -TEST_P(WaylandWindowDragControllerTest, MAYBE_CursorPositionIsUpdatedOnMotion) { +TEST_P(WaylandWindowDragControllerTest, CursorPositionIsUpdatedOnMotion) { constexpr gfx::Rect kOutputBounds(0, 0, 1920, 1080); PostToServerAndWait([&](wl::TestWaylandServerThread* server) { // Configure the first output with scale 1. @@ -1399,7 +1367,7 @@ EXPECT_EQ(State::kAttached, drag_controller()->state()); // Now move the pointer to 10x10 location and start the test. - SendDndMotion(p0); + SendDndMotionForWindowDrag(p0); EXPECT_EQ(p0, screen_->GetCursorScreenPoint()); auto* move_loop_handler = GetWmMoveLoopHandler(*window_); @@ -1425,7 +1393,7 @@ EXPECT_EQ(expected_point, screen->GetCursorScreenPoint()); // Resetting cursor to the initial position. - self->SendDndMotion(p0); + self->SendDndMotionForWindowDrag(p0); // Send the window to |output|. const uint32_t surface_id = window->root_surface()->get_surface_id(); @@ -1451,7 +1419,7 @@ : p1); expected_point += window->GetBoundsInDIP().origin().OffsetFromOrigin(); - self->SendDndMotion(p1); + self->SendDndMotionForWindowDrag(p1); EXPECT_EQ(expected_point, screen->GetCursorScreenPoint()); self->PostToServerAndWait([surface_id, output_id]( @@ -1529,19 +1497,10 @@ screen_->GetLocalProcessWidgetAtPoint({20, 20}, {})); } -// TODO(https://crbug.com/1448391): Reenable for Lacros when adjusted for screen -// coordinates. -#if BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_HandleWindowsDestructionDuringMoveLoop \ - DISABLED_HandleWindowsDestructionDuringMoveLoop -#else -#define MAYBE_HandleWindowsDestructionDuringMoveLoop \ - HandleWindowsDestructionDuringMoveLoop -#endif // Ensure no memory issues happen when the dragged and/or events grabber windows // get destroyed while the move loop is running. TEST_P(WaylandWindowDragControllerTest, - MAYBE_HandleWindowsDestructionDuringMoveLoop) { + HandleWindowsDestructionDuringMoveLoop) { // 1. Send some initial pointer events to |window_|. ASSERT_FALSE(window_manager()->GetCurrentPointerOrTouchFocusedWindow()); SendPointerEnter(window_.get(), &delegate_); @@ -1565,6 +1524,8 @@ auto window_2 = delegate_2.CreateWaylandWindow(connection_.get(), std::move(properties)); ASSERT_NE(gfx::kNullAcceleratedWidget, window_2->GetWidget()); + window_2->Show(/*inactive=*/false); + wl::SyncDisplay(connection_->display_wrapper(), *connection_->display()); // Spin the nested move loop and schedule a sequence of test steps to be // pefomed while it is running. @@ -1574,8 +1535,9 @@ // Send a motion event and verify it is correctly propagated. EXPECT_CALL(delegate_2, OnBoundsChanged(_)).Times(1); - SendDndMotion({11, 10}); + SendDndMotionForWindowDrag({11, 10}); EXPECT_EQ(gfx::Point(11, 10), cursor_tracker->GetCursorSurfacePoint()); + Mock::VerifyAndClearExpectations(&delegate_2); // Destroy the window being currently dragged. This will end the drag // session. @@ -1585,8 +1547,9 @@ // Verify drag-and-drop events are not propagated after the drag ends. EXPECT_CALL(delegate_2, DispatchEvent(_)).Times(0); EXPECT_CALL(delegate_2, OnBoundsChanged(_)).Times(0); - SendDndMotion({12, 10}); + SendDndMotionForWindowDrag({12, 10}); drag_controller()->OnDragDrop(); + Mock::VerifyAndClearExpectations(&delegate_2); // Verify that internal "last cursor position" is not updated after the // grab owner is destroyed. @@ -1747,20 +1710,11 @@ ASSERT_EQ(State::kIdle, drag_controller()->state()); } -// TODO(https://crbug.com/1448391): Reenable for Lacros when adjusted for screen -// coordinates. -#if BUILDFLAG(IS_CHROMEOS_LACROS) -#define MAYBE_HandleTargetWindowDestruction_DetachedState \ - DISABLED_HandleTargetWindowDestruction_DetachedState -#else -#define MAYBE_HandleTargetWindowDestruction_DetachedState \ - HandleTargetWindowDestruction_DetachedState -#endif // Ensure events are handled appropriately when the target window is destroyed // while the move loop is running (i.e. dragging in the detached state). // Regression test for crbug.com/1433577. TEST_P(WaylandWindowDragControllerTest, - MAYBE_HandleTargetWindowDestruction_DetachedState) { + HandleTargetWindowDestruction_DetachedState) { // Send some initial pointer events to `window_`. ASSERT_FALSE(window_manager()->GetCurrentPointerOrTouchFocusedWindow()); SendPointerEnter(window_.get(), &delegate_); @@ -1784,6 +1738,8 @@ auto window_2 = delegate_2.CreateWaylandWindow(connection_.get(), std::move(properties)); ASSERT_NE(gfx::kNullAcceleratedWidget, window_2->GetWidget()); + window_2->Show(/*inactive=*/false); + wl::SyncDisplay(connection_->display_wrapper(), *connection_->display()); // Spin the nested move loop and schedule a sequence of test steps to be // pefomed while it is running. @@ -1797,7 +1753,7 @@ // Send a motion event and verify it is correctly propagated. EXPECT_CALL(delegate_2, OnBoundsChanged(_)).Times(1); - SendDndMotion({11, 10}); + SendDndMotionForWindowDrag({11, 10}); EXPECT_EQ(gfx::Point(11, 10), cursor_tracker->GetCursorSurfacePoint()); // Destroy the target window (which at this point should be the origin @@ -1816,7 +1772,7 @@ EXPECT_CALL(delegate_, OnBoundsChanged(_)).Times(0); EXPECT_CALL(delegate_2, DispatchEvent(_)).Times(0); EXPECT_CALL(delegate_2, OnBoundsChanged(_)).Times(0); - SendDndMotion({12, 10}); + SendDndMotionForWindowDrag({12, 10}); drag_controller()->OnDragDrop(); // Verify that internal "last cursor position" is not updated after the @@ -1859,9 +1815,9 @@ auto* cursor_tracker = connection_->wayland_cursor_position(); ASSERT_TRUE(cursor_tracker); - SendDndMotion({11, 10}); + SendDndMotionForWindowDrag({11, 10}); EXPECT_EQ(gfx::Point(11, 10), cursor_tracker->GetCursorSurfacePoint()); - SendDndMotion({12, 10}); + SendDndMotionForWindowDrag({12, 10}); EXPECT_EQ(gfx::Point(12, 10), cursor_tracker->GetCursorSurfacePoint()); // Destroy the target window (which at this point should be the origin window, @@ -1875,7 +1831,7 @@ // Verify drag-and-drop events are not propagated after the drag session has // ended. EXPECT_CALL(delegate_, DispatchEvent(_)).Times(0); - SendDndMotion({13, 10}); + SendDndMotionForWindowDrag({13, 10}); drag_controller()->OnDragDrop(); // Verifies that related state is correctly reset. @@ -1885,17 +1841,18 @@ screen_->GetLocalProcessWidgetAtPoint({20, 20}, {})); } +#if !BUILDFLAG(IS_CHROMEOS_LACROS) +// Lacros requires aura shell. INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest, WaylandWindowDragControllerTest, Values(wl::ServerConfig{})); +#endif INSTANTIATE_TEST_SUITE_P( XdgVersionStableTestWithAuraShell, WaylandWindowDragControllerTest, - Values(wl::ServerConfig{.enable_aura_shell = - wl::EnableAuraShellProtocol::kEnabled}, - wl::ServerConfig{ - .enable_aura_shell = wl::EnableAuraShellProtocol::kEnabled, - .use_aura_output_manager = true})); + Values(wl::ServerConfig{ + .enable_aura_shell = wl::EnableAuraShellProtocol::kEnabled, + .use_aura_output_manager = true})); } // namespace ui
diff --git a/ui/ozone/platform/wayland/test/wayland_drag_drop_test.cc b/ui/ozone/platform/wayland/test/wayland_drag_drop_test.cc index d0ca6dd..e9c74d2b 100644 --- a/ui/ozone/platform/wayland/test/wayland_drag_drop_test.cc +++ b/ui/ozone/platform/wayland/test/wayland_drag_drop_test.cc
@@ -11,6 +11,7 @@ #include "base/functional/callback.h" #include "base/task/single_thread_task_runner.h" +#include "base/test/bind.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/geometry/point.h" #include "ui/ozone/platform/wayland/host/wayland_connection.h" @@ -104,24 +105,23 @@ void WaylandDragDropTest::ReadAndCheckData(const std::string& mime_type, const std::string& expected_data) { - PostToServerAndWait( - [mime_type, expected_data](wl::TestWaylandServerThread* server) { - auto* data_source = server->data_device_manager()->data_source(); - ASSERT_TRUE(data_source); + PostToServerAndWait([mime_type, + expected_data](wl::TestWaylandServerThread* server) { + auto* server_data_source = server->data_device_manager()->data_source(); + ASSERT_TRUE(server_data_source); - base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed); - auto read_callback = base::BindOnce( - [](std::string expected_data, base::RunLoop* loop, - std::vector<uint8_t>&& data) { - std::string result(data.begin(), data.end()); - EXPECT_EQ(expected_data, result); - loop->Quit(); - }, - std::move(expected_data), &run_loop); - - data_source->ReadData(mime_type, std::move(read_callback)); - run_loop.Run(); - }); + // Data fetching is done asynchronously using wl_display.sync callbacks, + // so a nested run loop is required to ensure it is fully and reliably done. + base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed); + server_data_source->ReadData( + mime_type, base::BindLambdaForTesting([&run_loop, &expected_data]( + std::vector<uint8_t>&& data) { + std::string result(data.begin(), data.end()); + EXPECT_EQ(expected_data, result); + run_loop.Quit(); + })); + run_loop.Run(); + }); } void WaylandDragDropTest::SendPointerEnter( @@ -236,8 +236,9 @@ } void WaylandDragDropTest::MaybeRunScheduledTasks() { - if (is_task_running_ || scheduled_tasks_.empty()) + if (is_task_running_ || scheduled_tasks_.empty()) { return; + } is_task_running_ = true;
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.cc b/ui/views/bubble/bubble_dialog_delegate_view.cc index d3f564c..0b1ef55 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view.cc +++ b/ui/views/bubble/bubble_dialog_delegate_view.cc
@@ -860,9 +860,11 @@ void (*uma_func)(const std::string&, Value), std::string histogram_name, Value value) const { + if (!base::FeatureList::IsEnabled(::features::kBubbleMetricsApi)) { + return; + } uma_func(base::StrCat({"Bubble.All.", histogram_name}), value); - if (bubble_name_.has_value() && - base::FeatureList::IsEnabled(::features::kBubbleMetricsApi)) { + if (bubble_name_.has_value()) { uma_func(base::StrCat({"Bubble.", *bubble_name_, ".", histogram_name}), value); }
diff --git a/ui/views/controls/button/md_text_button.cc b/ui/views/controls/button/md_text_button.cc index e77b666..a1bbf3d 100644 --- a/ui/views/controls/button/md_text_button.cc +++ b/ui/views/controls/button/md_text_button.cc
@@ -324,10 +324,24 @@ features::IsChromeRefresh2023() /* should_border_scale */))); } +void MdTextButton::UpdateIconColor() { + if (features::IsChromeRefresh2023() && HasImage(ButtonState::STATE_NORMAL)) { + auto image_model = GetImageModel(ButtonState::STATE_NORMAL); + if (image_model.IsVectorIcon()) { + LabelButton::SetImageModel(ButtonState::STATE_NORMAL, + ui::ImageModel::FromVectorIcon( + *image_model.GetVectorIcon().vector_icon(), + LabelButton::GetCurrentTextColor(), + image_model.GetVectorIcon().icon_size())); + } + } +} + void MdTextButton::UpdateColors() { if (GetWidget()) { UpdateTextColor(); UpdateBackgroundColor(); + UpdateIconColor(); SchedulePaint(); } }
diff --git a/ui/views/controls/button/md_text_button.h b/ui/views/controls/button/md_text_button.h index 81c0f82..61b9e1a 100644 --- a/ui/views/controls/button/md_text_button.h +++ b/ui/views/controls/button/md_text_button.h
@@ -76,6 +76,7 @@ void UpdateTextColor(); void UpdateBackgroundColor() override; void UpdateColors(); + void UpdateIconColor(); ui::ButtonStyle style_ = ui::ButtonStyle::kDefault;
diff --git a/ui/views/examples/button_example.cc b/ui/views/examples/button_example.cc index d92bab54..7f6dd62 100644 --- a/ui/views/examples/button_example.cc +++ b/ui/views/examples/button_example.cc
@@ -171,33 +171,6 @@ BEGIN_METADATA(FabButton, views::MdTextButton) END_METADATA -class IconAndTextButton : public views::MdTextButton { - public: - METADATA_HEADER(IconAndTextButton); - IconAndTextButton(PressedCallback callback, - const std::u16string& text, - const gfx::VectorIcon& icon) - : MdTextButton(callback, text), icon_(icon) {} - IconAndTextButton(const IconAndTextButton&) = delete; - IconAndTextButton& operator=(const IconAndTextButton&) = delete; - ~IconAndTextButton() override = default; - - void OnThemeChanged() override { - views::MdTextButton::OnThemeChanged(); - - // Use the text color for the associated vector image. - SetImageModel( - views::Button::ButtonState::STATE_NORMAL, - ui::ImageModel::FromVectorIcon(*icon_, label()->GetEnabledColor())); - } - - private: - const raw_ref<const gfx::VectorIcon> icon_; -}; - -BEGIN_METADATA(IconAndTextButton, views::MdTextButton) -END_METADATA - ButtonExample::ButtonExample() : ExampleBase("Button") { ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); icon_ = rb.GetImageNamed(IDR_CLOSE_H).ToImageSkia(); @@ -240,6 +213,9 @@ .CopyAddressTo(&md_text_button_) .SetStyle(ui::ButtonStyle::kText) .SetText(u"Material Text"), + Builder<MdTextButton>() + .CopyAddressTo(&md_icon_text_button_) + .SetText(u"Material Text with Icon"), Builder<ImageButton>() .CopyAddressTo(&image_button_) .SetAccessibleName(l10n_util::GetStringUTF16( @@ -249,12 +225,9 @@ &ButtonExample::ImageButtonPressed, base::Unretained(this)))) .Build(); - - view->AddChildView(std::make_unique<IconAndTextButton>( - base::BindRepeating(&ButtonExample::ImageButtonPressed, - base::Unretained(this)), - l10n_util::GetStringUTF16(IDS_COLORED_DIALOG_CHOOSER_BUTTON), - views::kInfoIcon)); + md_icon_text_button_->SetImageModel( + views::Button::ButtonState::STATE_NORMAL, + ui::ImageModel::FromVectorIcon(views::kInfoIcon)); view->AddChildView(std::make_unique<FabButton>( base::BindRepeating(&ButtonExample::ImageButtonPressed, base::Unretained(this)),
diff --git a/ui/views/examples/button_example.h b/ui/views/examples/button_example.h index 74442e24..620de6f 100644 --- a/ui/views/examples/button_example.h +++ b/ui/views/examples/button_example.h
@@ -48,6 +48,7 @@ raw_ptr<MdTextButton> md_default_button_ = nullptr; raw_ptr<MdTextButton> md_tonal_button_ = nullptr; raw_ptr<MdTextButton> md_text_button_ = nullptr; + raw_ptr<MdTextButton> md_icon_text_button_ = nullptr; raw_ptr<ImageButton> image_button_ = nullptr; raw_ptr<const gfx::ImageSkia> icon_ = nullptr;
diff --git a/ui/webui/resources/cr_elements/md_select.css b/ui/webui/resources/cr_elements/md_select.css index 36df7ad..27bab2e 100644 --- a/ui/webui/resources/cr_elements/md_select.css +++ b/ui/webui/resources/cr_elements/md_select.css
@@ -6,6 +6,7 @@ * #type=style * #import=./cr_shared_vars.css.js * #import=//resources/polymer/v3_0/paper-styles/color.js + * #scheme=relative * #css_wrapper_metadata_end */ .md-select {