diff --git a/DEPS b/DEPS index 462039fa..da3c6f6 100644 --- a/DEPS +++ b/DEPS
@@ -295,11 +295,11 @@ # 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': 'ca97f221e74329f4254872c518b49217678b8a3b', + 'skia_revision': 'd6f07ec0bc1a89eea0ff3417849d0ae17a05673b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '8a4c79f2f72614bf9af2f65593d37f49a4c86e8e', + 'v8_revision': 'd1661839f02abdcd85c6841fe123c4b1495bcf93', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -387,7 +387,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': '1aa930db260d7c3c77e0f60faa2bf2dbce0f057c', + 'devtools_frontend_revision': '7633ebbe50bbc7cd261df46b9b1ecf11cc76723a', # 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. @@ -411,7 +411,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '62e0e50822042e394fdcc9206d4c83a22f442b1c', + 'dawn_revision': 'c6ac86ef3ddb8c945f00aebcdc6ef0c5a53161fd', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -1473,7 +1473,7 @@ 'packages': [ { 'package': 'chromium/chrome/test/data/variations/cipd', - 'version': '__ZxUHz7hvMhAwflUGypw4qlSvJyMly8gyq3Tr-iY0oC', + 'version': 'EZAgibhdVpFKIeHALwQi67mB-RTb6eQDv__JDzWLQKoC', }, ], 'dep_type': 'cipd', @@ -1484,7 +1484,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'dc56cf11e9e079b4e75aea145d2e4e218e62d3c1', + 'a16b3ebe1b1e181215c098f25e148871aa192abf', 'condition': 'checkout_android and checkout_src_internal', }, @@ -1736,7 +1736,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_build_tools/lint', - 'version': 'MQDFXnhKbdeZPJ4I_uqwhEEJmTvS082X-fI65Z-izhgC', + 'version': 'DGEQcQfbonqqmrtaKLbu7qkNhJgyZ5ONzcseAUFVX08C', }, ], 'condition': 'checkout_android and non_git_source', @@ -1747,7 +1747,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_build_tools/manifest_merger', - 'version': 'tn0WN5WVlfko88RztSP0vzEJjavXf2mLfSzTkjiVu7sC', + 'version': 'YS3S6_AiCf06beDfeUId4rgDQEi9n0QGN_dUHdUiMx4C', }, ], 'condition': 'checkout_android and non_git_source', @@ -2224,7 +2224,7 @@ 'packages': [ { 'package': 'chromium/third_party/kotlin_stdlib', - 'version': 'D-E_fC1qWgbLAcQNu6OuHGYl-DqhvMnp9r3vmW6-L3kC', + 'version': 'Ek4qdlAGvswwQ1AaKLNPnDUMCYHw4uWRL63Yek0nMwkC', }, ], 'condition': 'checkout_android and non_git_source', @@ -2838,7 +2838,7 @@ 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@7d7f6e8bdba2335d5f55218ae404025cf67a97af', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@5ad52bb056fea9fa54842b5377652ef75e77b0cd', 'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@e57f993cff981c8c3ffd38967e030f04d13781a9', 'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3', 'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@0e710677989b4326ac974fd80c5308191ed80965', @@ -2847,7 +2847,7 @@ 'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@47404470464709ed5c4b660f9ebc73c717e85a50', 'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@32ee3e6e333a4bc4064fe64cfdfdcf6e71a92743', 'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@ccae111ac678adbc9c74be10c8384cd1af835710', - 'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@fb1e5dd1f552e41770720679f1b7aaf37e546b9c', + 'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@38fdfde70d967e5ae719269a7ec91348a513cc16', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '56300b29fbfcc693ee6609ddad3fdd5b7a449a21', @@ -2892,7 +2892,7 @@ Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'), 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'b906bbbcd5f5d7c6953979d937a5a0ff5824e05e', + Var('webrtc_git') + '/src.git' + '@' + '7afa8f6c8335d8f1db051ab3e2f1241e61551954', # 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. @@ -3022,7 +3022,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'DHdvEjWHqgKjufBTsT53WL6-nDnBJoFd64JtaUaqGxsC', + 'version': 'HEYuU6C39wxXfrSC4j8urSLvO0d9eZsWvwn_hg-AVDYC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3033,7 +3033,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': '02tA3UW1e-79Cmz6sPlUFEr6mVWGTGSSHsZ5McW3UygC', + 'version': 'Fk3RDnAI_5U9XrYSbmRoBfzyfXMd0jywA4LVQs_crhUC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -4615,7 +4615,7 @@ 'src/components/optimization_guide/internal': { 'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' + - 'ab3d1ff586a8607770bf168810386580ef20e7e9', + 'd6d63d40815a6fae96bbd81a1a417ea374791125', 'condition': 'checkout_src_internal', }, @@ -4681,7 +4681,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - '0bf543ddfc682a16bdb1927324e62064148f8d91', + '4bb036a8d48c481cf171749c9ed5708e858526ad', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index dca5f2a..c3aa6e8 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -149,6 +149,7 @@ <translation id="1455242230282523554">แสดงการตั้งค่าภาษา</translation> <translation id="1459693405370120464">สภาพอากาศ</translation> <translation id="1460620680449458626">ระดับเสียงปิดเสียงอยู่</translation> +<translation id="1462439140224375968">สร้างเอกสารใน Google เอกสารแล้ว</translation> <translation id="14648076227129703">การดำเนินการนี้ช่วยให้ <ph name="APP1_NAME" />, <ph name="APP2_NAME" /> รวมถึงแอปและเว็บไซต์ทั้งหมดที่มีสิทธิ์สามารถเข้าถึงกล้องได้</translation> <translation id="1467432559032391204">ซ้าย</translation> <translation id="146902737843070955">ผู้ดูแลระบบขอให้ทำการเปลี่ยนแปลงนี้</translation> @@ -593,6 +594,7 @@ <translation id="301584155502740476">แสดงรายละเอียดฮอตสปอต ฮอตสปอตปิดอยู่</translation> <translation id="3017079585324758401">พื้นหลัง</translation> <translation id="3018135054368884502">กรอสื่อไปข้างหน้า</translation> +<translation id="3026897869154397692">เพิ่มลงในปฏิทินแล้ว</translation> <translation id="3033545621352269033">เปิด</translation> <translation id="3033912566804961911">รวมกับ <ph name="DESK_NAME" /></translation> <translation id="3036649622769666520">เปิดไฟล์</translation> @@ -1889,6 +1891,7 @@ <translation id="7228968829656641943">เลือกเพื่อค้นหาในหน้าจอของฉัน กดแป้น Tab แล้วกดแป้น Space เพื่อไปยังส่วนต่างๆ ด้วยแป้นพิมพ์</translation> <translation id="7229029500464092426">ใช้หน่วยความจำแล้ว <ph name="AVAILABLE_MEMORY" /> | รวมทั้งหมด <ph name="TOTAL_MEMORY" /></translation> <translation id="7239814253344511868">ปุ่มเมาส์ทั้งสองปุ่ม</translation> +<translation id="7240636904654154599">สร้างสเปรดชีตใน Google ชีตแล้ว</translation> <translation id="7244725679040769470">แบตเตอรี่เหลืออยู่ <ph name="PERCENTAGE" />% โปรดเชื่อมต่ออุปกรณ์กับแหล่งจ่ายไฟ</translation> <translation id="7246071203293827765"><ph name="UPDATE_TEXT" /> Chromebook นี้ต้องรีสตาร์ทเพื่อใช้การอัปเดต ซึ่งอาจใช้เวลาถึง 1 นาที</translation> <translation id="7256057185598509352">ExpressKey 2</translation> @@ -2399,6 +2402,7 @@ <translation id="8921624153894383499">Google Assistant ยังพูดภาษานี้ไม่ได้</translation> <translation id="8926951137623668982">ซ่อนชั้นวางเสมอ</translation> <translation id="8929566928381252430">หากต้องการใช้ฟังก์ชัน Caps Lock ให้ใช้แป้น</translation> +<translation id="8929623844713377237">สร้างรายชื่อติดต่อแล้ว</translation> <translation id="8934418770423095813">สร้างเอกสารใน Google เอกสาร</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ไฟล์}other{# ไฟล์}}</translation> <translation id="8936501819958976551">ปิดใช้งานอยู่</translation>
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index e541973d..4271c8b 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -27.20250315.103.1 +27.20250323.101.1
diff --git a/chrome/VERSION b/chrome/VERSION index 68aad05..39d263d 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=136 MINOR=0 -BUILD=7085 +BUILD=7087 PATCH=0
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java index 23e73bd..5ec0d0c9 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java
@@ -187,7 +187,6 @@ .setIsIconAtStart(false) .setSuggestionType(suggestionType) .setIsDeletable(isDeletable) - .setIsMultiLineLabel(false) .setFeatureForIph(featureForIph) .setIphDescriptionText(iphDescriptionText) .setCustomIconUrl(customIconUrl)
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb index 4151008a..19ecee2 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb
@@ -118,7 +118,7 @@ <translation id="5400836586163650660">グレー</translation> <translation id="5446043142172831860">タブを削除するとグループから退出します</translation> <translation id="5490235265819901748">タブグループを展開しました</translation> -<translation id="5494920125229734069">すべて選択する</translation> +<translation id="5494920125229734069">すべて選択</translation> <translation id="5551694449008560081">{NUMBER_OF_TABS,plural, =1{タブグループ(タブの数: <ph name="TABS_COUNT_ONE" />、色: <ph name="COLOR_NAME" />)を閉じます。}other{タブグループ(タブの数: <ph name="TABS_COUNT_MANY" />、色: <ph name="COLOR_NAME" />)を閉じます。}}</translation> <translation id="5556417849629758491">ストア情報を表示、画面上部付近に表示されるオプション</translation> <translation id="5627941783489838464">タブの更新はありません</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb index af3471a9..f797aab 100644 --- a/chrome/app/resources/chromium_strings_th.xtb +++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -363,6 +363,7 @@ <translation id="6174920971222007286">ไฟล์นี้อาจเป็นอันตราย<ph name="LINE_BREAK" />Chromium ตรวจสอบการดาวน์โหลดนี้ให้คุณได้หากคุณให้รหัสผ่าน ข้อมูลเกี่ยวกับไฟล์จะส่งไปยัง Google Safe Browsing แต่เนื้อหาและรหัสผ่านของไฟล์จะยังอยู่ในอุปกรณ์ของคุณ</translation> <translation id="6182736845697986886">การติดตั้งไม่สำเร็จเนื่องจากเกิดข้อผิดพลาดภายในเซิร์ฟเวอร์การอัปเดต</translation> <translation id="6183079672144801177">ตรวจสอบว่าคุณลงชื่อเข้าใช้ Chromium ใน <ph name="TARGET_DEVICE_NAME" /> แล้วลองส่งอีกครั้ง</translation> +<translation id="6196339736238974634">หากต้องการใช้โปรไฟล์นี้กับ Glic ให้เปิด Chromium แล้วลงชื่อเข้าใช้</translation> <translation id="6212496753309875659">คอมพิวเตอร์เครื่องนี้ติดตั้ง Chromium รุ่นที่ใหม่กว่าอยู่แล้ว ถ้าซอฟต์แวร์ไม่ทำงาน โปรดถอนการติดตั้ง Chromium และลองอีกครั้ง</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium จะเปิดขึ้นมาใหม่ตอนนี้}=1{Chromium จะเปิดขึ้นมาใหม่ใน 1 วินาที}other{Chromium จะเปิดขึ้นมาใหม่ใน # วินาที}}</translation> <translation id="6241367896540709610">Chromium ต้องการสิทธิ์เข้าถึงพื้นที่เก็บข้อมูลเพื่อดาวน์โหลดไฟล์</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index cfb8a98..3537589 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -6384,7 +6384,7 @@ <translation id="5493792505296048976">画面オン</translation> <translation id="5494016731375030300">最近閉じたタブ</translation> <translation id="5494362494988149300">ダウンロードしたら開く(&D)</translation> -<translation id="5494920125229734069">すべて選択する</translation> +<translation id="5494920125229734069">すべて選択</translation> <translation id="5495466433285976480">すべてのローカル ユーザー、ファイル、データ、およびその他の設定が次回の再起動後に削除されます。すべてのユーザーは、もう一度ログインする必要があります。</translation> <translation id="5495597166260341369">画面をオンのままにする</translation> <translation id="549602578321198708">単語</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 863fe70..210b1fc 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -2222,6 +2222,7 @@ คุณสามารถจัดการการตั้งค่าจากเมนูการ์ดหรือดูตัวเลือกเพิ่มเติมได้ใน "ปรับแต่ง Chrome"</translation> <translation id="2514326558286966059">ปลดล็อกได้เร็วขึ้นด้วยลายนิ้วมือ</translation> <translation id="2514465118223423406">เมื่อเชื่อมต่อเมาส์</translation> +<translation id="2514938842036917377">การดำเนินการนี้จะลบข้อมูลที่ <ph name="SITE_NAME" />, เว็บไซต์ที่เกี่ยวข้อง และแอปที่ติดตั้งไว้จัดเก็บไว้รวมทั้งสิ้น <ph name="TOTAL_USAGE" /></translation> <translation id="2515586267016047495">Alt</translation> <translation id="251722524540674480">ยืนยันชื่อผู้ใช้ของคุณ</translation> <translation id="2517472476991765520">สแกน</translation> @@ -9074,6 +9075,7 @@ <translation id="7443806024147773267">เข้าถึงรหัสผ่านได้เมื่อใดก็ตามที่ลงชื่อเข้าใช้บัญชี Google อยู่</translation> <translation id="7444176988908839653">{COUNT,plural, =0{คุกกี้จะถูกบล็อกอีกครั้งในวันนี้}=1{คุกกี้จะถูกบล็อกอีกครั้งในวันพรุ่งนี้}other{คุกกี้จะถูกบล็อกอีกครั้งในอีก # วัน}}</translation> <translation id="7444983668544353857">ปิดการใช้งาน<ph name="NETWORKDEVICE" /></translation> +<translation id="7446716846072322308">การดำเนินการนี้จะลบข้อมูลที่ <ph name="SITE_NAME" /> และเว็บไซต์ที่เกี่ยวข้องจัดเก็บไว้รวมทั้งสิ้น <ph name="TOTAL_USAGE" /></translation> <translation id="7448430327655618736">ติดตั้งแอปโดยอัตโนมัติ</translation> <translation id="7448664748118305024">ลบเว็บไซต์ข้อมูลที่บันทึกไว้ในอุปกรณ์เมื่อคุณปิดหน้าต่างทั้งหมด</translation> <translation id="7450761244949417357">เปิดอยู่ใน <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb index 6de21e9d..3122212 100644 --- a/chrome/app/resources/google_chrome_strings_th.xtb +++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -508,6 +508,7 @@ <translation id="7787950393032327779">ดูเหมือนว่าโปรไฟล์กำลังถูกใช้งานโดยกระบวนการอื่นของ Google Chrome (<ph name="PROCESS_ID" />) บนคอมพิวเตอร์อีกเครื่อง (<ph name="HOST_NAME" />) Chrome ล็อกโปรไฟล์ไว้เพื่อไม่ให้โปรไฟล์เกิดความเสียหาย หากคุณมั่นใจว่าไม่มีกระบวนการอื่นใดกำลังใช้โปรไฟล์นี้อยู่ คุณสามารถปลดล็อกโปรไฟล์และเปิด Chrome ใหม่</translation> <translation id="7801699035218095297">Google Chrome กำลังพยายามคัดลอกรหัสผ่าน โปรดพิมพ์รหัสผ่าน Windows ของคุณเพื่ออนุญาต</translation> <translation id="7808348361785373670">นำออกจาก Chrome...</translation> +<translation id="782480918904119604">หากต้องการใช้โปรไฟล์นี้กับ Glic ให้เปิด Chrome แล้วลงชื่อเข้าใช้</translation> <translation id="7825851276765848807">การติดตั้งล้มเหลวเนื่องจากเกิดข้อผิดพลาดที่ไม่ระบุ โปรดดาวน์โหลด Google Chrome อีกครั้ง</translation> <translation id="7845233973568007926">ขอขอบคุณที่ติดตั้ง คุณต้องรีสตาร์ทคอมพิวเตอร์ก่อนใช้ <ph name="BUNDLE_NAME" /></translation> <translation id="7872446069773932638">กำลังดาวน์โหลด... เหลืออีก <ph name="SECONDS" /> วินาที</translation>
diff --git a/chrome/browser/actor/BUILD.gn b/chrome/browser/actor/BUILD.gn index 29d353d..1e13ce7 100644 --- a/chrome/browser/actor/BUILD.gn +++ b/chrome/browser/actor/BUILD.gn
@@ -2,20 +2,26 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/gclient_args.gni") import("//chrome/common/features.gni") -import("//mojo/public/tools/bindings/mojom.gni") assert(enable_glic) source_set("actor") { + friend = [ + ":unit_tests", + ":browser_tests", + ] + public = [ "actor_coordinator.h" ] sources = [ "actor_coordinator.cc", - "actor_coordinator.h", "actor_features.cc", "actor_features.h", "site_policy.cc", "site_policy.h", + "tools/tool_controller.cc", + "tools/tool_controller.h", + "tools/tool_invocation.cc", + "tools/tool_invocation.h", ] public_deps = [ "//base", @@ -46,14 +52,20 @@ source_set("browser_tests") { testonly = true defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] - sources = [ "site_policy_browsertest.cc" ] + sources = [ + "site_policy_browsertest.cc", + "tools/tools_browsertest.cc", + ] deps = [ ":actor", "//base/test:test_support", "//chrome/browser/safe_browsing", + "//chrome/browser/ui:ui", "//chrome/test:test_support", + "//chrome/test:test_support_ui", "//components/safe_browsing:buildflags", "//components/safe_browsing/core/common:features", + "//content/test:test_support", "//testing/gtest", ] }
diff --git a/chrome/browser/actor/actor_coordinator.cc b/chrome/browser/actor/actor_coordinator.cc index 3598feb1..87333a0 100644 --- a/chrome/browser/actor/actor_coordinator.cc +++ b/chrome/browser/actor/actor_coordinator.cc
@@ -10,12 +10,19 @@ #include "base/memory/weak_ptr.h" #include "base/notimplemented.h" #include "chrome/browser/actor/site_policy.h" +#include "chrome/browser/actor/tools/tool_controller.h" +#include "chrome/browser/actor/tools/tool_invocation.h" #include "chrome/common/chrome_features.h" #include "components/optimization_guide/proto/features/actions_data.pb.h" #include "components/tab_collections/public/tab_interface.h" #include "content/public/browser/web_contents.h" #include "url/origin.h" +using content::WebContents; +using optimization_guide::proto::ActionInformation; +using optimization_guide::proto::BrowserAction; +using tabs::TabInterface; + namespace actor { ActorCoordinator::ActorCoordinator() = default; @@ -24,17 +31,16 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } -void ActorCoordinator::Act( - tabs::TabInterface* tab, - const optimization_guide::proto::BrowserAction& action, - ActionResultCallback callback) { +void ActorCoordinator::Act(TabInterface& tab, + const BrowserAction& action, + ActionResultCallback callback) { CHECK(base::FeatureList::IsEnabled(features::kGlicActor)); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - content::WebContents& web_contents = *tab->GetContents(); + content::WebContents& web_contents = *tab.GetContents(); MayActOnTab( - *tab, + tab, base::BindOnce( &ActorCoordinator::OnMayActOnTabResponse, weak_ptr_factory_.GetWeakPtr(), web_contents.GetWeakPtr(), action, @@ -43,8 +49,8 @@ } void ActorCoordinator::OnMayActOnTabResponse( - base::WeakPtr<content::WebContents> web_contents, - const optimization_guide::proto::BrowserAction& action, + base::WeakPtr<WebContents> web_contents, + const BrowserAction& action, const url::Origin& evaluated_origin, ActionResultCallback callback, bool may_act) { @@ -55,8 +61,7 @@ return; } - tabs::TabInterface* tab = - tabs::TabInterface::GetFromContents(web_contents.get()); + TabInterface* tab = TabInterface::GetFromContents(web_contents.get()); CHECK(tab); if (!evaluated_origin.IsSameOriginWith( @@ -74,9 +79,10 @@ return; } - // TODO(https://crbug.com/402086021): Use actor tool framework. - NOTIMPLEMENTED(); - std::move(callback).Run(/*succeeded=*/false); + // Currently, only one action at a time is supported. + CHECK_EQ(action.action_information_size(), 1); + ToolInvocation invocation(action.action_information().at(0), *tab); + tool_controller_.Invoke(invocation, std::move(callback)); } } // namespace actor
diff --git a/chrome/browser/actor/actor_coordinator.h b/chrome/browser/actor/actor_coordinator.h index 74df28b..df13886 100644 --- a/chrome/browser/actor/actor_coordinator.h +++ b/chrome/browser/actor/actor_coordinator.h
@@ -5,12 +5,10 @@ #ifndef CHROME_BROWSER_ACTOR_ACTOR_COORDINATOR_H_ #define CHROME_BROWSER_ACTOR_ACTOR_COORDINATOR_H_ -#include <cstdint> - #include "base/functional/callback_forward.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" -#include "components/optimization_guide/proto/features/actions_data.pb.h" +#include "chrome/browser/actor/tools/tool_controller.h" namespace content { class WebContents; @@ -24,6 +22,10 @@ class Origin; } // namespace url +namespace optimization_guide::proto { +class BrowserAction; +} // namespace optimization_guide::proto + namespace actor { // Coordinates the execution of a multi-step task. @@ -37,7 +39,7 @@ ~ActorCoordinator(); // Performs the next action. - void Act(tabs::TabInterface* tab, + void Act(tabs::TabInterface& tab, const optimization_guide::proto::BrowserAction& action, ActionResultCallback callback); @@ -49,6 +51,8 @@ ActionResultCallback callback, bool may_act); + ToolController tool_controller_; + SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory<ActorCoordinator> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/actor/tools/tool_controller.cc b/chrome/browser/actor/tools/tool_controller.cc new file mode 100644 index 0000000..3f429ae --- /dev/null +++ b/chrome/browser/actor/tools/tool_controller.cc
@@ -0,0 +1,80 @@ +// Copyright 2025 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/actor/tools/tool_controller.h" + +#include "base/feature_list.h" +#include "base/functional/callback.h" +#include "base/task/sequenced_task_runner.h" +#include "chrome/browser/actor/tools/tool_invocation.h" +#include "chrome/common/actor.mojom.h" +#include "chrome/common/chrome_features.h" +#include "chrome/common/chrome_render_frame.mojom.h" +#include "components/optimization_guide/proto/features/actions_data.pb.h" +#include "components/tab_collections/public/tab_interface.h" +#include "content/public/browser/render_frame_host.h" +#include "mojo/public/cpp/bindings/associated_remote.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" + +using content::RenderFrameHost; +using mojo::AssociatedRemote; +using tabs::TabInterface; + +namespace actor { + +namespace { +// Callback for the reply to the InvokeTool call on a page-level request. This +// is mainly a helper to hold the mojo interface until the reply is received. +void PageInvokeToolReply( + mojo::AssociatedRemote<chrome::mojom::ChromeRenderFrame> + chrome_render_frame, + ToolInvocation::ResultCallback result_callback, + bool result_success) { + std::move(result_callback).Run(result_success); +} +} // namespace + +ToolController::ToolController() { + CHECK(base::FeatureList::IsEnabled(features::kGlicActor)); +} + +ToolController::~ToolController() = default; + +void ToolController::Invoke(const ToolInvocation& invocation, + ToolInvocation::ResultCallback result_callback) { + TabInterface* target_tab = invocation.FindTargetTab(); + if (!target_tab) { + // The tab for this action was closed. + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, base::BindOnce(std::move(result_callback), false)); + return; + } + + if (invocation.IsTargetingPage()) { + RenderFrameHost* frame = invocation.FindTargetFrame(); + + AssociatedRemote<chrome::mojom::ChromeRenderFrame> chrome_render_frame; + frame->GetRemoteAssociatedInterfaces()->GetInterface(&chrome_render_frame); + + auto request = actor::mojom::ToolInvocation::New(); + // TODO(crbug.com/398849001): Fill this struct out + request->dom_node_id = invocation.GetTargetDOMNodeId(); + + // Bind the mojo remote into the callback to keep it alive in order to + // receive the response. + chrome::mojom::ChromeRenderFrame::Proxy_* chrome_render_frame_proxy = + chrome_render_frame.get(); + auto reply_callback = + base::BindOnce(&PageInvokeToolReply, std::move(chrome_render_frame), + std::move(result_callback)); + + chrome_render_frame_proxy->InvokeTool(std::move(request), + std::move(reply_callback)); + } else { + CHECK(invocation.IsTargetingTab()); + // TODO(crbug.com/402731599): Implement tab-level actions. + } +} + +} // namespace actor
diff --git a/chrome/browser/actor/tools/tool_controller.h b/chrome/browser/actor/tools/tool_controller.h new file mode 100644 index 0000000..1f1b621 --- /dev/null +++ b/chrome/browser/actor/tools/tool_controller.h
@@ -0,0 +1,29 @@ +// Copyright 2025 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_ACTOR_TOOLS_TOOL_CONTROLLER_H_ +#define CHROME_BROWSER_ACTOR_TOOLS_TOOL_CONTROLLER_H_ + +#include "chrome/browser/actor/tools/tool_invocation.h" + +namespace actor { + +// Entry point into actor tool usage. This class routes a tool use request to +// the appropriate browser tool or to a corresponding executor in the renderer +// for page-level tools. +class ToolController { + public: + ToolController(); + ~ToolController(); + ToolController(const ToolController&) = delete; + ToolController& operator=(const ToolController&) = delete; + + // Invokes a tool action. + void Invoke(const ToolInvocation& action, + ToolInvocation::ResultCallback result_callback); +}; + +} // namespace actor + +#endif // CHROME_BROWSER_ACTOR_TOOLS_TOOL_CONTROLLER_H_
diff --git a/chrome/browser/actor/tools/tool_invocation.cc b/chrome/browser/actor/tools/tool_invocation.cc new file mode 100644 index 0000000..a4a9b9f5 --- /dev/null +++ b/chrome/browser/actor/tools/tool_invocation.cc
@@ -0,0 +1,96 @@ +// Copyright 2025 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/actor/tools/tool_invocation.h" + +#include "components/optimization_guide/proto/features/actions_data.pb.h" +#include "components/tab_collections/public/tab_interface.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents.h" + +using content::RenderFrameHost; +using optimization_guide::proto::ActionInformation; +using optimization_guide::proto::ActionTarget; +using tabs::TabInterface; + +namespace actor { + +ToolInvocation::ToolInvocation(const ActionInformation& action_information, + TabInterface& target_tab) + : action_information_(action_information), target_tab_(target_tab) {} + +RenderFrameHost* ToolInvocation::FindTargetFrame() const { + CHECK(IsTargetingPage()); + + // A foreground tab must have a web contents. When backgrounded, it is the + // caller's responsibility to ensure contents aren't discarded. + CHECK(target_tab_.GetContents()); + + // TODO(crbug.com/402086380): action_target.frame_info() is currently empty. + // This should be: + // auto* rfh = RenderFrameHost::FromID(frame_info.process, frame_info.frame); + // CHECK_EQ(rfh, target_tab_.GetPrimaryMainFrame()) + // return rfh; + return target_tab_.GetContents()->GetPrimaryMainFrame(); +} + +TabInterface* ToolInvocation::FindTargetTab() const { + // TODO(crbug.com/398849001): We should look-up the tab from the action_target + // but since we can't yet find frames (see above TODO) always return the + // focused web_contents (they should be the same for now anyway). + return &target_tab_; +} + +int ToolInvocation::GetTargetDOMNodeId() const { + CHECK(IsTargetingPage()); + return GetActionTarget().content_node_id(); +} + +const ActionTarget& ToolInvocation::GetActionTarget() const { + switch (action_information_.action_info_case()) { + case ActionInformation::ActionInfoCase::kClick: + return action_information_.click().target(); + case ActionInformation::ActionInfoCase::kType: + return action_information_.type().target(); + case ActionInformation::ActionInfoCase::kScroll: + return action_information_.scroll().target(); + case ActionInformation::ActionInfoCase::kMoveMouse: + return action_information_.move_mouse().target(); + case ActionInformation::ActionInfoCase::kDragAndRelease: + // TODO(crbug.com/398849001): if from and to can differ we'll need + // something something more sophisticated (this becomes tab-targeting). + return action_information_.drag_and_release().from_target(); + case ActionInformation::ActionInfoCase::kSelect: + return action_information_.select().target(); + case ActionInformation::ActionInfoCase::kNavigate: + case ActionInformation::ActionInfoCase::kBack: + case ActionInformation::ActionInfoCase::kForward: + case ActionInformation::ActionInfoCase::ACTION_INFO_NOT_SET: + NOTREACHED(); + } +} + +bool ToolInvocation::IsTargetingPage() const { + return !IsTargetingTab(); +} + +bool ToolInvocation::IsTargetingTab() const { + switch (action_information_.action_info_case()) { + case ActionInformation::ActionInfoCase::kClick: + case ActionInformation::ActionInfoCase::kType: + case ActionInformation::ActionInfoCase::kScroll: + case ActionInformation::ActionInfoCase::kMoveMouse: + case ActionInformation::ActionInfoCase::kDragAndRelease: + case ActionInformation::ActionInfoCase::kSelect: + return false; + case ActionInformation::ActionInfoCase::kNavigate: + case ActionInformation::ActionInfoCase::kBack: + case ActionInformation::ActionInfoCase::kForward: + return true; + case ActionInformation::ActionInfoCase::ACTION_INFO_NOT_SET: + NOTREACHED(); + } +} + +} // namespace actor
diff --git a/chrome/browser/actor/tools/tool_invocation.h b/chrome/browser/actor/tools/tool_invocation.h new file mode 100644 index 0000000..39cdce8 --- /dev/null +++ b/chrome/browser/actor/tools/tool_invocation.h
@@ -0,0 +1,66 @@ +// Copyright 2025 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_ACTOR_TOOLS_TOOL_INVOCATION_H_ +#define CHROME_BROWSER_ACTOR_TOOLS_TOOL_INVOCATION_H_ + +#include "base/functional/callback_forward.h" +#include "base/memory/stack_allocated.h" +#include "components/optimization_guide/proto/features/actions_data.pb.h" + +namespace content { +class RenderFrameHost; +} // namespace content + +namespace tabs { +class TabInterface; +} // namespace tabs + +namespace actor { + +// A request to invoke a tool in the actor tool framework. Currently this just +// wraps an ActionInformation unpacked proto and provides some convenience +// methods. +class ToolInvocation { + STACK_ALLOCATED(); + + public: + using ResultCallback = base::OnceCallback<void(bool)>; + + explicit ToolInvocation( + const optimization_guide::proto::ActionInformation& action_information, + tabs::TabInterface& target_tab); + + ToolInvocation(const ToolInvocation& other) = default; + + // Not assignable because of the target_tab_ reference. + ToolInvocation& operator=(const ToolInvocation& other) = delete; + + content::RenderFrameHost* FindTargetFrame() const; + tabs::TabInterface* FindTargetTab() const; + + // Returns the target DOMNodeId for the requested action. Can only be called + // if `IsTargetingPage` is true. + int GetTargetDOMNodeId() const; + + // Whether the tool is a tab-level action. + bool IsTargetingTab() const; + + // Whether the tool is a page-level action. + bool IsTargetingPage() const; + + private: + const optimization_guide::proto::ActionTarget& GetActionTarget() const; + + optimization_guide::proto::ActionInformation action_information_; + + // TODO(crbug.com/398849001): It'd be better if ActionInformation provided a + // FrameInfo for non-page targeting actions but it currently doesn't so we + // have to include the tab to use for tab-targeting actions. + tabs::TabInterface& target_tab_; +}; + +} // namespace actor + +#endif // CHROME_BROWSER_ACTOR_TOOLS_TOOL_INVOCATION_H_
diff --git a/chrome/browser/actor/tools/tools_browsertest.cc b/chrome/browser/actor/tools/tools_browsertest.cc new file mode 100644 index 0000000..4712562f --- /dev/null +++ b/chrome/browser/actor/tools/tools_browsertest.cc
@@ -0,0 +1,88 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <string_view> + +#include "base/test/bind.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/test_future.h" +#include "chrome/browser/actor/actor_coordinator.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/common/chrome_features.h" +#include "chrome/common/chrome_render_frame.mojom.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/test/base/chrome_test_utils.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "components/optimization_guide/proto/features/actions_data.pb.h" +#include "components/tab_collections/public/tab_interface.h" +#include "content/public/test/browser_test.h" +#include "content/public/test/browser_test_utils.h" +#include "mojo/public/cpp/bindings/associated_remote.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" + +using base::test::ScopedFeatureList; +using base::test::TestFuture; +using content::WebContents; +using optimization_guide::proto::BrowserAction; +using optimization_guide::proto::ClickAction; +using tabs::TabInterface; + +namespace actor { + +namespace { + +class ActorToolsTest : public InProcessBrowserTest { + public: + ActorToolsTest() { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{features::kGlic, features::kTabstripComboButton, + features::kGlicActor}, + /*disabled_features=*/{features::kGlicWarming}); + } + ActorToolsTest(const ActorToolsTest&) = delete; + ActorToolsTest& operator=(const ActorToolsTest&) = delete; + + ~ActorToolsTest() override = default; + + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + actor_coordinator_ = std::make_unique<actor::ActorCoordinator>(); + } + + WebContents* web_contents() { + return chrome_test_utils::GetActiveWebContents(this); + } + + TabInterface* active_tab() { return browser()->GetActiveTabInterface(); } + + ActorCoordinator& actor_coordinator() { return *actor_coordinator_; } + + private: + std::unique_ptr<ActorCoordinator> actor_coordinator_; + + ScopedFeatureList scoped_feature_list_; +}; + +// Exercises the basic API to ensure nothing CHECKs or crashes. +IN_PROC_BROWSER_TEST_F(ActorToolsTest, BasicSmokeTest) { + ASSERT_TRUE(embedded_test_server()->Start()); + const GURL url = embedded_test_server()->GetURL("/simple.html"); + ASSERT_TRUE(content::NavigateToURL(web_contents(), url)); + + BrowserAction action; + ClickAction* click = action.add_action_information()->mutable_click(); + click->mutable_target()->set_content_node_id(123); + click->set_click_type(ClickAction::LEFT); + click->set_click_count(ClickAction::SINGLE); + + TabInterface& tab = *active_tab(); + + TestFuture<bool> result_success; + actor_coordinator().Act(tab, action, result_success.GetCallback()); + EXPECT_TRUE(result_success.Get()); +} + +} // namespace + +} // namespace actor
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java index c84234b..85f4d4c 100644 --- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java +++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
@@ -1120,13 +1120,6 @@ } /** - * @return Whether the Autofill feature is managed. - */ - public boolean isAutofillManaged() { - return PersonalDataManagerJni.get().isAutofillManaged(mPersonalDataManagerAndroid); - } - - /** * @return Whether the Autofill feature for Profiles (addresses) is managed. */ public boolean isAutofillProfileManaged() { @@ -1281,8 +1274,6 @@ boolean isFidoAuthenticationAvailable(long nativePersonalDataManagerAndroid); - boolean isAutofillManaged(long nativePersonalDataManagerAndroid); - boolean isAutofillProfileManaged(long nativePersonalDataManagerAndroid); boolean isAutofillCreditCardManaged(long nativePersonalDataManagerAndroid);
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc index 33e2e35..8338658f 100644 --- a/chrome/browser/autofill/android/personal_data_manager_android.cc +++ b/chrome/browser/autofill/android/personal_data_manager_android.cc
@@ -832,10 +832,6 @@ type.obj()); } -jboolean PersonalDataManagerAndroid::IsAutofillManaged(JNIEnv* env) { - return prefs::IsAutofillManaged(prefs_); -} - jboolean PersonalDataManagerAndroid::IsAutofillProfileManaged(JNIEnv* env) { return prefs::IsAutofillProfileManaged(prefs_); }
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.h b/chrome/browser/autofill/android/personal_data_manager_android.h index 032a3997..9feb859 100644 --- a/chrome/browser/autofill/android/personal_data_manager_android.h +++ b/chrome/browser/autofill/android/personal_data_manager_android.h
@@ -234,9 +234,6 @@ // methods settings page. jboolean ShouldShowAddIbanButtonOnSettingsPage(JNIEnv* env); - // Returns whether the Autofill feature is managed. - jboolean IsAutofillManaged(JNIEnv* env); - // Returns whether the Autofill feature for profiles is managed. jboolean IsAutofillProfileManaged(JNIEnv* env);
diff --git a/chrome/browser/glic/glic_keyed_service.h b/chrome/browser/glic/glic_keyed_service.h index 5f84e36..978abcf 100644 --- a/chrome/browser/glic/glic_keyed_service.h +++ b/chrome/browser/glic/glic_keyed_service.h
@@ -29,7 +29,6 @@ class GlicActorController; class FocusedTabData; class GlicEnabling; -class GlicFocusedTabManager; class GlicMetrics; class GlicProfileManager; class GlicScreenshotCapturer;
diff --git a/chrome/browser/glic/host/glic_actor_controller.cc b/chrome/browser/glic/host/glic_actor_controller.cc index e41e5279..960a5af 100644 --- a/chrome/browser/glic/host/glic_actor_controller.cc +++ b/chrome/browser/glic/host/glic_actor_controller.cc
@@ -67,7 +67,7 @@ CHECK(tab); actor_coordinator_->Act( - tab, action, + *tab, action, base::BindOnce(&GlicActorController::OnActionFinished, GetWeakPtr(), focused_tab_data, options, std::move(callback))); }
diff --git a/chrome/browser/recent_tabs/internal/android/java/strings/translations/android_restore_tabs_strings_ja.xtb b/chrome/browser/recent_tabs/internal/android/java/strings/translations/android_restore_tabs_strings_ja.xtb index 1c90134..1a69e9ee 100644 --- a/chrome/browser/recent_tabs/internal/android/java/strings/translations/android_restore_tabs_strings_ja.xtb +++ b/chrome/browser/recent_tabs/internal/android/java/strings/translations/android_restore_tabs_strings_ja.xtb
@@ -15,7 +15,7 @@ <translation id="4619615317237390068">他のデバイスからのタブ</translation> <translation id="4811934403802581334">現在選択されているデバイスから選択したタブがすべて復元されます。</translation> <translation id="5336031759968328813">すべてのタブを確認</translation> -<translation id="5494920125229734069">すべて選択する</translation> +<translation id="5494920125229734069">すべて選択</translation> <translation id="5972844218283131174">すべての選択を解除</translation> <translation id="791922009843073162">選択されたタブの選択をすべて解除、または選択が解除されたタブをすべて選択します。</translation> <translation id="7927711904086083099">選択されていません</translation>
diff --git a/chrome/browser/ui/views/autofill/autofill_ai/save_or_update_autofill_ai_data_bubble_view.cc b/chrome/browser/ui/views/autofill/autofill_ai/save_or_update_autofill_ai_data_bubble_view.cc index b6c4043..1eba1d52 100644 --- a/chrome/browser/ui/views/autofill/autofill_ai/save_or_update_autofill_ai_data_bubble_view.cc +++ b/chrome/browser/ui/views/autofill/autofill_ai/save_or_update_autofill_ai_data_bubble_view.cc
@@ -26,6 +26,7 @@ #include "ui/views/controls/button/image_button_factory.h" #include "ui/views/controls/label.h" #include "ui/views/controls/styled_label.h" +#include "ui/views/layout/box_layout.h" #include "ui/views/layout/box_layout_view.h" #include "ui/views/layout/flex_layout_view.h" #include "ui/views/style/typography.h" @@ -41,7 +42,8 @@ constexpr int kBubbleWidth = 320; constexpr int kNewOrUpdatedAttributeDotSize = 4; -constexpr int kNewOrUpdatedAttributeDotSpacing = 4; +constexpr int kNewOrUpdatedAttributeDotRightSpacing = 4; +constexpr int kNewOrUpdatedAttributeDotTopSpacing = 8; int GetVerticaSpaceBetweenDialogSections() { return ChromeLayoutProvider::Get()->GetDistanceMetric( @@ -49,16 +51,50 @@ 2; } +gfx::Insets GetBubbleInnerMargins() { + return ChromeLayoutProvider::Get()->GetDialogInsetsForContentType( + views::DialogContentType::kControl, views::DialogContentType::kControl); +} + +int GetEntityAttributeAndValueLabelMaxWidth() { + // The maximum width is the bubble size minus its margin divided by two. + // One half is for the entity attribute name and the other for the value. + return (kBubbleWidth - GetBubbleInnerMargins().width() - + ChromeLayoutProvider::Get()->GetDistanceMetric( + DISTANCE_RELATED_CONTROL_HORIZONTAL_SMALL)) / + 2; +} + +std::unique_ptr<views::BoxLayoutView> GetEntityAttributeAndValueLayout( + views::BoxLayout::CrossAxisAlignment aligment) { + auto row = + views::Builder<views::BoxLayoutView>() + .SetOrientation(views::BoxLayout::Orientation::kVertical) + .SetCrossAxisAlignment(aligment) + .SetMainAxisAlignment(views::LayoutAlignment::kStart) + // The minimum width is also set because we want to always reserve the + // same size for both the attribute name and its value, meaning no + // resizing/stretching. + .SetMinimumCrossAxisSize(GetEntityAttributeAndValueLabelMaxWidth()) + .Build(); + return row; +} + std::unique_ptr<views::View> GetAttributeValueView( const SaveOrUpdateAutofillAiDataController::EntityAttributeUpdateDetails& detail, bool is_save_prompt) { + std::unique_ptr<views::BoxLayoutView> atribute_value_row_wrapper = + GetEntityAttributeAndValueLayout( + views::BoxLayout::CrossAxisAlignment::kEnd); std::unique_ptr<views::Label> label = views::Builder<views::Label>() .SetText(detail.attribute_value) .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_RIGHT) .SetTextStyle(views::style::STYLE_BODY_3_MEDIUM) .SetAccessibleRole(ax::mojom::Role::kDefinition) + .SetMultiLine(true) + .SetMaximumWidth(GetEntityAttributeAndValueLabelMaxWidth()) .Build(); // Only update dialogs have a dot circle in front of added or updated values. @@ -68,21 +104,28 @@ SaveOrUpdateAutofillAiDataController::EntityAttributeUpdateType:: kNewEntityAttributeUnchanged; if (!existing_entity_added_or_updated_attribute) { - return label; + atribute_value_row_wrapper->AddChildView(std::move(label)); + return atribute_value_row_wrapper; } - auto row = - views::Builder<views::BoxLayoutView>() - .SetOrientation(views::BoxLayout::Orientation::kHorizontal) - .SetCrossAxisAlignment(views::BoxLayout::CrossAxisAlignment::kCenter) - .SetMainAxisAlignment(views::LayoutAlignment::kEnd) - .Build(); - views::BoxLayoutView* updated_entity_dot = row->AddChildView( - views::Builder<views::BoxLayoutView>() - .SetProperty( - views::kMarginsKey, - gfx::Insets::TLBR(0, 0, 0, kNewOrUpdatedAttributeDotSpacing)) - .Build()); + views::View* updated_entity_dot_and_value_wrapper = + atribute_value_row_wrapper->AddChildView( + views::Builder<views::BoxLayoutView>() + .SetOrientation(views::BoxLayout::Orientation::kHorizontal) + .SetCrossAxisAlignment( + views::BoxLayout::CrossAxisAlignment::kStart) + .SetMainAxisAlignment(views::LayoutAlignment::kEnd) + .Build()); + views::BoxLayoutView* updated_entity_dot = + updated_entity_dot_and_value_wrapper->AddChildView( + views::Builder<views::BoxLayoutView>() + .SetProperty( + views::kMarginsKey, + // The top margin is done to roughly center the dot at the + // middle of the first line of the attribute value. + gfx::Insets::TLBR(kNewOrUpdatedAttributeDotTopSpacing, 0, 0, + kNewOrUpdatedAttributeDotRightSpacing)) + .Build()); updated_entity_dot->SetPreferredSize( gfx::Size(kNewOrUpdatedAttributeDotSize, kNewOrUpdatedAttributeDotSize)); updated_entity_dot->SizeToPreferredSize(); @@ -95,8 +138,9 @@ ? IDS_AUTOFILL_AI_UPDATE_ENTITY_DIALOG_NEW_ATTRIBUTE_ACCESSIBLE_NAME : IDS_AUTOFILL_AI_UPDATE_ENTITY_DIALOG_UPDATED_ATTRIBUTE_ACCESSIBLE_NAME, detail.attribute_value)); - row->AddChildView(std::move(label)); - return row; + updated_entity_dot_and_value_wrapper->AddChildView(std::move(label)); + + return atribute_value_row_wrapper; } // Helper to create a row displayed in the dialog. This row contains information @@ -109,12 +153,18 @@ .SetOrientation(views::BoxLayout::Orientation::kHorizontal) .SetMainAxisAlignment(views::LayoutAlignment::kCenter) .Build(); - row->AddChildView( + + views::BoxLayoutView* entity_attribute_wrapper = + row->AddChildView(GetEntityAttributeAndValueLayout( + views::BoxLayout::CrossAxisAlignment::kStart)); + entity_attribute_wrapper->AddChildView( views::Builder<views::Label>() .SetText(detail.attribute_name) .SetTextStyle(views::style::STYLE_BODY_4) .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT) .SetAccessibleRole(ax::mojom::Role::kTerm) + .SetElideBehavior(gfx::ELIDE_TAIL) + .SetMaximumWidthSingleLine(GetEntityAttributeAndValueLabelMaxWidth()) .Build()); row->AddChildView(GetAttributeValueView(detail, is_save_prompt)); // Set every child to expand with the same ratio. @@ -163,8 +213,7 @@ set_fixed_width(kBubbleWidth); SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical)); - set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType( - views::DialogContentType::kControl, views::DialogContentType::kControl)); + set_margins(GetBubbleInnerMargins()); SetAccessibleTitle(controller_->GetDialogTitle()); auto* main_content_wrapper = AddChildView(
diff --git a/chrome/browser/webauthn/chrome_webauthn_browsertest.cc b/chrome/browser/webauthn/chrome_webauthn_browsertest.cc index b0bad6d..4549aab8 100644 --- a/chrome/browser/webauthn/chrome_webauthn_browsertest.cc +++ b/chrome/browser/webauthn/chrome_webauthn_browsertest.cc
@@ -69,6 +69,7 @@ #include "extensions/common/extension_builder.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#include "third_party/blink/public/common/features.h" #include "url/gurl.h" #if BUILDFLAG(IS_WIN) @@ -1780,4 +1781,88 @@ EXPECT_THAT(result, testing::HasSubstr("NotAllowedError")); } +#if BUILDFLAG(IS_LINUX) +// TODO(crbug.com/393055190): There is segfault in Linux during the move of the +// newly constructed `request_handler` to the `RequestState` in +// `AuthenticatorCommonImpl::StartGetAssertionRequest`. Fix and re-enable. +#define WebAuthnImmediateGetTest DISABLED_WebAuthnImmediateGetTest +#else +#define WebAuthnImmediateGetTest WebAuthnImmediateGetTest +#endif + +class WebAuthnImmediateGetTest : public WebAuthnBrowserTest { + protected: + static constexpr std::string_view kRequestWithPasswordTemplate = R"( + navigator.credentials.get({ + mediation: 'immediate', + password: $1, + publicKey: { + challenge: new Uint8Array([1,3,2,7,1,3,2,7]), + timeout: 10000, + userVerification: 'discouraged', + }}).then(c => 'webauthn: OK', e => 'error ' + e); + )"; + + static constexpr std::string_view kRequestWithAllowlistTemplate = R"( + navigator.credentials.get({ + mediation: 'immediate', + publicKey: { + challenge: new Uint8Array([1,3,2,7,1,3,2,7]), + allowCredentials: [$1], + timeout: 10000, + userVerification: 'discouraged', + }}).then(c => 'webauthn: OK', e => 'error ' + e); + )"; + + private: + base::test::ScopedFeatureList scoped_feature_list_{ + blink::features::kWebAuthenticationImmediateGet}; +}; + +IN_PROC_BROWSER_TEST_F(WebAuthnImmediateGetTest, NoCreds_NotFoundError) { + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), https_server_.GetURL("www.example.com", "/title1.html"))); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + + for (const auto& request_password : {"false", "true"}) { + const auto& script = base::ReplaceStringPlaceholders( + kRequestWithPasswordTemplate, {request_password}, + /*offsets=*/nullptr); + const auto& result = content::EvalJs(web_contents, script); + EXPECT_THAT(result.ExtractString(), testing::HasSubstr("NotFoundError")); + } +} + +IN_PROC_BROWSER_TEST_F(WebAuthnImmediateGetTest, + Incognito_NoCreds_NotFoundError) { + auto* otr_browser = OpenURLOffTheRecord( + browser()->profile(), + https_server_.GetURL("www.example.com", "/title1.html")); + content::WebContents* web_contents = + otr_browser->tab_strip_model()->GetActiveWebContents(); + + for (const auto& request_password : {"false", "true"}) { + const auto& script = base::ReplaceStringPlaceholders( + kRequestWithPasswordTemplate, {request_password}, + /*offsets=*/nullptr); + const auto& result = content::EvalJs(web_contents, script); + EXPECT_THAT(result.ExtractString(), testing::HasSubstr("NotFoundError")); + } +} + +IN_PROC_BROWSER_TEST_F(WebAuthnImmediateGetTest, Allowlist_NotAllowedError) { + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), https_server_.GetURL("www.example.com", "/title1.html"))); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + + const auto& script = base::ReplaceStringPlaceholders( + kRequestWithAllowlistTemplate, + {"{type: 'public-key', id: new Uint8Array([1,3,2,7])}"}, + /*offsets=*/nullptr); + const auto& result = content::EvalJs(web_contents, script); + EXPECT_THAT(result.ExtractString(), testing::HasSubstr("NotAllowedError")); +} + } // namespace
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt index 5bfa90bd..414ffce 100644 --- a/chrome/build/android-arm32.pgo.txt +++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@ -chrome-android32-main-1742687491-74c05224b43a409455fdec0f202a360423613fcd-b542c53d9e1607dd432a5eae5b39bf2346678de2.profdata +chrome-android32-main-1742751948-4dd35fcf0ffc35be26689364f681998a94b81c28-2538dfa14509ace31120a482cfaa0701e8dd3fd7.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt index be814a6..5cb7108 100644 --- a/chrome/build/android-arm64.pgo.txt +++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@ -chrome-android64-main-1742687283-6f1c9e6703b5b29530ff07bc0298cff22450279e-8d788eb704f6b63031e8ea998d094e896d7699a2.profdata +chrome-android64-main-1742760610-d82ef830e39d187098508c6a8f12b8572e67cdb4-0f0f19989ae098e61e1ddd11537173174f5bc37b.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 9a2dd7d..e0f2ed2 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1742664846-9b1b6a5e329690cab180c6405cdba3c90697fb1e-8439787b33206b28e53cdc0ca350cd4501324d56.profdata +chrome-linux-main-1742730877-400c297db2202c0b29d5355e1307e0bd68f94eba-9c22ccfe8640a6f89bef0d91848bf1a1e2417072.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 67b118f9..15ea6d3 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1742687491-538dae7ac104cc485c78765341300ed81905f2e5-b542c53d9e1607dd432a5eae5b39bf2346678de2.profdata +chrome-mac-arm-main-1742759851-ddba442677f128d5e1794a71f817e338443b7134-df01b87d9cece37475862ee07c2c1f2ca8dc4724.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index fcd15874..15c30265 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1742664846-6c61c7cc1f761ce2776778fa7c0cff3f855498ee-8439787b33206b28e53cdc0ca350cd4501324d56.profdata +chrome-mac-main-1742730877-38b4b1b123265fe5222d77eea19c2f599ad19e87-9c22ccfe8640a6f89bef0d91848bf1a1e2417072.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index 78c799f..8afaed0 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1742664846-28c3c6f80599b0a43d595c0ead85348ca08f04bd-8439787b33206b28e53cdc0ca350cd4501324d56.profdata +chrome-win-arm64-main-1742751948-beb41bf5b9399cee73c0b9c25cb57bd3bee8f07e-2538dfa14509ace31120a482cfaa0701e8dd3fd7.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 8bc4c05..b4ae818 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1742664846-03119dadef34e62472c5b4b4574d62363f982cf7-8439787b33206b28e53cdc0ca350cd4501324d56.profdata +chrome-win32-main-1742741230-234cde35fc1839c988eb7f7fc742c404334100f3-c3b4daab3a850a7484ac0e47968327a562e6c1db.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 447dcc6..77b5ace2 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1742664846-61d9ffea9d42ccda6f7b748d2db6c3f102e86d7b-8439787b33206b28e53cdc0ca350cd4501324d56.profdata +chrome-win64-main-1742741230-4dfd9a7cdae5f93b7e31c2b4e4b6c25fe1b88c7e-c3b4daab3a850a7484ac0e47968327a562e6c1db.profdata
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn index 40e1d1c..f8cecc628 100644 --- a/chrome/common/BUILD.gn +++ b/chrome/common/BUILD.gn
@@ -727,6 +727,13 @@ sources += [ "ppapi_metrics.mojom" ] } + enabled_features = [] + + if (enable_glic) { + sources += [ "actor.mojom" ] + enabled_features += [ "enable_glic" ] + } + public_deps = [ "//components/content_settings/common:mojom", "//components/content_settings/core/common:mojo_bindings", @@ -760,8 +767,6 @@ component_deps = [ "//content/public/common" ] - enabled_features = [] - if (enable_offline_pages) { sources += [ "mhtml_page_notifier.mojom" ] deps += [ "//third_party/blink/public/mojom:mojom_mhtml_load_result" ]
diff --git a/chrome/common/actor.mojom b/chrome/common/actor.mojom new file mode 100644 index 0000000..1dcd0d6a --- /dev/null +++ b/chrome/common/actor.mojom
@@ -0,0 +1,14 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module actor.mojom; + +// All information required to invoke a tool in the renderer. +struct ToolInvocation { + // DOMNodeId for the node this invocation should be applied to. + int32 dom_node_id; + + // TODO(crbug.com/6377727): Add details union which includes parameters + // for what type of tool to invoke and any details. +};
diff --git a/chrome/common/chrome_render_frame.mojom b/chrome/common/chrome_render_frame.mojom index 1e9026519..7d3e46d 100644 --- a/chrome/common/chrome_render_frame.mojom +++ b/chrome/common/chrome_render_frame.mojom
@@ -4,6 +4,8 @@ module chrome.mojom; +[EnableIf=enable_glic] +import "chrome/common/actor.mojom"; import "components/lens/lens_metadata.mojom"; import "mojo/public/mojom/base/string16.mojom"; import "skia/public/mojom/bitmap.mojom"; @@ -98,4 +100,9 @@ // Sets whether the frame needs to defer media loading when it is in // background. SetShouldDeferMediaLoad(bool should_defer); + + // Requests invoking of a tool from the actor automation framework. See + // chrome/browser/actor + [EnableIf=enable_glic] + InvokeTool(actor.mojom.ToolInvocation request) => (bool success); };
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn index ffd3e6d1..948d6c4 100644 --- a/chrome/renderer/BUILD.gn +++ b/chrome/renderer/BUILD.gn
@@ -246,6 +246,10 @@ ] } + if (enable_glic) { + deps += [ "//chrome/renderer/actor" ] + } + if (enable_nacl) { deps += [ "//components/nacl/renderer" ]
diff --git a/chrome/renderer/actor/BUILD.gn b/chrome/renderer/actor/BUILD.gn new file mode 100644 index 0000000..bdf99d6f --- /dev/null +++ b/chrome/renderer/actor/BUILD.gn
@@ -0,0 +1,21 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//chrome/common/features.gni") + +assert(enable_glic) + +source_set("actor") { + sources = [ + "tool_executor.cc", + "tool_executor.h", + ] + + public_deps = [ + "//base", + "//content/public/renderer", + ] + + deps = [ "//chrome/common" ] +}
diff --git a/chrome/renderer/actor/OWNERS b/chrome/renderer/actor/OWNERS new file mode 100644 index 0000000..5145dbe --- /dev/null +++ b/chrome/renderer/actor/OWNERS
@@ -0,0 +1 @@ +file://chrome/browser/actor/OWNERS
diff --git a/chrome/renderer/actor/tool_executor.cc b/chrome/renderer/actor/tool_executor.cc new file mode 100644 index 0000000..df5d3ac --- /dev/null +++ b/chrome/renderer/actor/tool_executor.cc
@@ -0,0 +1,32 @@ +// Copyright 2025 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/renderer/actor/tool_executor.h" + +#include "base/functional/callback.h" +#include "chrome/common/actor.mojom.h" +#include "content/public/renderer/render_frame.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" + +using content::RenderFrame; +using mojo::PendingReceiver; + +namespace actor { + +ToolExecutor::ToolExecutor(RenderFrame* frame) : frame_(*frame) { + // TODO(crbug.com/398260855): Currently, this is created only for the main + // frame but eventually this will have to support all local roots in a page. + CHECK(frame->IsMainFrame()); + CHECK(!frame->IsInFencedFrameTree()); +} + +ToolExecutor::~ToolExecutor() = default; + +void ToolExecutor::InvokeTool(mojom::ToolInvocationPtr request, + ToolExecutorCallback callback) { + // TODO(crbug.com/402731599): Implement tools. + std::move(callback).Run(true); +} + +} // namespace actor
diff --git a/chrome/renderer/actor/tool_executor.h b/chrome/renderer/actor/tool_executor.h new file mode 100644 index 0000000..194b417e --- /dev/null +++ b/chrome/renderer/actor/tool_executor.h
@@ -0,0 +1,46 @@ +// Copyright 2025 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_RENDERER_ACTOR_TOOL_EXECUTOR_H_ +#define CHROME_RENDERER_ACTOR_TOOL_EXECUTOR_H_ + +#include "base/functional/callback_forward.h" +#include "base/memory/raw_ref.h" +#include "base/memory/stack_allocated.h" +#include "chrome/common/chrome_render_frame.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" + +namespace content { +class RenderFrame; +} + +namespace actor { + +// Renderer-side tool executor. +// +// This class is responsible for receiving tool request messages and invoking +// the requested tool in the renderer. +class ToolExecutor { + STACK_ALLOCATED(); + + public: + using ToolExecutorCallback = base::OnceCallback<void(bool)>; + explicit ToolExecutor(content::RenderFrame* frame); + ~ToolExecutor(); + + ToolExecutor(const ToolExecutor&) = delete; + ToolExecutor& operator=(const ToolExecutor&) = delete; + + void InvokeTool(mojom::ToolInvocationPtr request, + ToolExecutorCallback callback); + + private: + // Raw ref since the executor is currently only stack allocated by the render + // frame so it must be outlived. + base::raw_ref<content::RenderFrame> frame_; +}; + +} // namespace actor + +#endif // CHROME_RENDERER_ACTOR_TOOL_EXECUTOR_H_
diff --git a/chrome/renderer/chrome_render_frame_observer.cc b/chrome/renderer/chrome_render_frame_observer.cc index 211b52c6..2b85527 100644 --- a/chrome/renderer/chrome_render_frame_observer.cc +++ b/chrome/renderer/chrome_render_frame_observer.cc
@@ -9,6 +9,7 @@ #include <limits> #include <map> +#include <memory> #include <set> #include <utility> @@ -85,6 +86,10 @@ #include "chrome/renderer/plugins/chrome_plugin_placeholder.h" #endif +#if BUILDFLAG(ENABLE_GLIC) +#include "chrome/renderer/actor/tool_executor.h" +#endif + using blink::WebDocumentLoader; using blink::WebElement; using blink::WebFrameContentDumper; @@ -611,6 +616,15 @@ prerender::SetShouldDeferMediaLoad(render_frame(), should_defer); } +#if BUILDFLAG(ENABLE_GLIC) +void ChromeRenderFrameObserver::InvokeTool( + actor::mojom::ToolInvocationPtr request, + InvokeToolCallback callback) { + actor::ToolExecutor executor(render_frame()); + executor.InvokeTool(std::move(request), std::move(callback)); +} +#endif + void ChromeRenderFrameObserver::SetClientSidePhishingDetection() { #if BUILDFLAG(SAFE_BROWSING_AVAILABLE) phishing_classifier_ = safe_browsing::PhishingClassifierDelegate::Create(
diff --git a/chrome/renderer/chrome_render_frame_observer.h b/chrome/renderer/chrome_render_frame_observer.h index bb2ee36..72e1c62 100644 --- a/chrome/renderer/chrome_render_frame_observer.h +++ b/chrome/renderer/chrome_render_frame_observer.h
@@ -10,6 +10,7 @@ #include "base/memory/raw_ptr.h" #include "build/build_config.h" +#include "chrome/common/buildflags.h" #include "chrome/common/chrome_render_frame.mojom.h" #include "components/safe_browsing/buildflags.h" #include "content/public/renderer/render_frame_observer.h" @@ -18,6 +19,10 @@ #include "services/service_manager/public/cpp/binder_registry.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" +#if BUILDFLAG(ENABLE_GLIC) +#include "chrome/common/actor.mojom.h" +#endif + class SkBitmap; namespace gfx { @@ -115,6 +120,11 @@ void SetSupportsDraggableRegions(bool supports_draggable_regions) override; void SetShouldDeferMediaLoad(bool should_defer) override; +#if BUILDFLAG(ENABLE_GLIC) + void InvokeTool(actor::mojom::ToolInvocationPtr request, + InvokeToolCallback callback) override; +#endif + // Initialize a |phishing_classifier_delegate_|. void SetClientSidePhishingDetection();
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 0ab87d4..e6cfb58 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -3545,7 +3545,6 @@ ] deps += [ - "//chrome/browser/actor", "//chrome/browser/actor:browser_tests", "//chrome/browser/background/glic:glic", "//chrome/browser/glic:browser_tests",
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index f7b7f4ee..16b9231 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -16229.0.0-1067671 \ No newline at end of file +16230.0.0-1067690 \ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index c27dbd3..6574b80 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -5,6 +5,7 @@ <translation id="1014750484722996375">เดสก์</translation> <translation id="1018219910092211213">ไม่สามารถแปลง DNS</translation> <translation id="1018656279737460067">ยกเลิกแล้ว</translation> +<translation id="1019971142067430077">สร้างชื่อบันทึกเสียงสำหรับเนื้อหานี้ไม่ได้</translation> <translation id="1020274983236703756">ชิ้นงานสุดพิเศษจาก <ph name="PRODUCT_NAME" /> พร้อมใช้งานแล้ว</translation> <translation id="1022628058306505708">การเคลื่อนที่ของโลก</translation> <translation id="102432830749687801">โปรดใช้แอป Content Transfer โดย Google เพื่อย้ายข้อมูลบัญชีโรงเรียนไปยังบัญชีส่วนตัวก่อนที่คุณจะสูญเสียสิทธิ์เข้าถึง</translation> @@ -101,6 +102,7 @@ <translation id="1418991483994088776">กล้วยไม้</translation> <translation id="142205161612889714">WEBM</translation> <translation id="142228117786570094">ฉันมีคู่คีย์</translation> +<translation id="1422912431241997307">แก้ไขชื่อแล้ว</translation> <translation id="1423591390236870726">ไม่ได้กดปุ่ม <ph name="KEY_NAME" /> อยู่</translation> <translation id="1432110487435300883">สำหรับผลลัพธ์โดยประมาณ ให้นำค่า <ph name="CATEGORY_TEXT" /> มาหารด้วย <ph name="CONVERSION_RATE" /></translation> <translation id="1435763214710588005">รีเซ็ตปริมาณการใช้อินเทอร์เน็ตทุกเดือนโดยอัตโนมัติในวันที่เลือก</translation> @@ -343,6 +345,7 @@ <translation id="2418150275289244458">เปิดในการตั้งค่า</translation> <translation id="2421798028054665193">ภาพที่ <ph name="CURRENT_PAGE" /> จาก <ph name="TOTAL_PAGES" /></translation> <translation id="242825218556404975">ไม่พบเสียงพูด</translation> +<translation id="2438248248625638801">กำลังสร้างชื่อของบันทึกเสียง</translation> <translation id="2446553403094072641">ความแม่นยำของจุดลอยตัว</translation> <translation id="2448312741937722512">ประเภท</translation> <translation id="2468124392950503650">เลือกพรอมต์เพื่อสร้างหรือดู<ph name="BEGIN_LINK_PROMPTING_GUIDE" />คู่มือการใช้พรอมต์<ph name="END_LINK_PROMPTING_GUIDE" /></translation> @@ -421,6 +424,7 @@ <translation id="2873483161362553159">การนำทางสำหรับเบราว์เซอร์</translation> <translation id="2874939134665556319">แทร็กก่อนหน้า</translation> <translation id="2875812231449496375">เปิดโหมดนี้เพื่อให้วอลเปเปอร์นี้มีผลลัพธ์ที่ดีที่สุด คุณปิดการตั้งค่านี้ได้ทุกเมื่อ</translation> +<translation id="2878126681324394319">ดาวน์โหลดสรุปและโมเดลการสร้างชื่อ</translation> <translation id="2878387241690264070">คายประจุ <ph name="RATE" /> ใน <ph name="NUM_SECONDS" /> วินาที</translation> <translation id="2880569433548999039">ภาพพักหน้าจอการเคลื่อนตัวของเมฆ</translation> <translation id="2882230315487799269">ปรับแต่งพรอมต์ AI</translation> @@ -493,6 +497,7 @@ <translation id="3303855915957856445">ไม่พบผลการค้นหา</translation> <translation id="3305294846493618482">เพิ่มเติม</translation> <translation id="3310640316857623290">เวลาในการตอบสนอง DNS สูงกว่าเกณฑ์ที่ยอมรับได้อย่างมีนัยสำคัญ</translation> +<translation id="3316495615885967552">ดาวน์โหลดโมเดลการสร้างชื่อและสรุปเสร็จสมบูรณ์</translation> <translation id="3321030238473337787">ความเร็วในการเล่น</translation> <translation id="3327613592010997943"><ph name="DAY" />คุณจะใช้อุปกรณ์นี้ได้อีกครั้งในเวลา <ph name="TIME" /></translation> <translation id="3328783797891415197">กำลังทดสอบ</translation> @@ -583,6 +588,7 @@ <translation id="3767737419527918477">ค้นหาไฟล์บันทึก</translation> <translation id="3771294271822695279">ไฟล์วิดีโอ</translation> <translation id="3771694256347217732">ข้อกำหนดในการให้บริการของ Google</translation> +<translation id="3772164567520167489">สร้างชื่อของบันทึกเสียงสําหรับภาษาของข้อความถอดเสียงนี้ไม่ได้</translation> <translation id="3780740315729837296">กำหนดแป้นบนแป้นพิมพ์</translation> <translation id="3784455785234192852">ล็อก</translation> <translation id="3785643128701396311">พิกเซลอาร์ต</translation> @@ -597,6 +603,7 @@ <translation id="3845880861638660475">กดแป้น <ph name="ALT_SHORTCUT_START" />Alt<ph name="ALT_SHORTCUT_END" /> + <ph name="ESC_SHORTCUT_START" />Esc<ph name="ESC_SHORTCUT_END" /> เพื่อปิดกล่องโต้ตอบ</translation> <translation id="3848280697030027394">ปรับให้แป้นพิมพ์มืด</translation> <translation id="385051799172605136">กลับ</translation> +<translation id="3852931845120288955">ชื่อ (A ถึง Z)</translation> <translation id="3858860766373142691">ชื่อ</translation> <translation id="3862598938296403232">ต้องป้อนคำอธิบาย</translation> <translation id="386280020966669610">ขอแรงบันดาลใจหน่อย</translation> @@ -651,6 +658,7 @@ <translation id="4093865285251893588">รูปโปรไฟล์</translation> <translation id="409427325554347132">บันทึกรายละเอียดการทดสอบ</translation> <translation id="409469431304488632">เวอร์ชันทดลอง</translation> +<translation id="4095155732125588500">กำลังดาวน์โหลดโมเดลการสร้างชื่อและสรุป</translation> <translation id="4095829376260267438">WPA2WPA3</translation> <translation id="4110686435123617899">เลือกอัลบั้ม <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4111761024568264522">ทัชแพด USB</translation> @@ -675,6 +683,7 @@ <translation id="4171077696775491955">ลดความสว่าง</translation> <translation id="4176463684765177261">ปิดการทำงาน</translation> <translation id="4176659219503619100">แผงควบคุม</translation> +<translation id="4192913637640303603">สร้างชื่อของบันทึกเสียงไม่ได้</translation> <translation id="4193496492959950834">การตั้งค่าโปรแกรมอัดเสียง</translation> <translation id="4198398257084619072">แพนด้า</translation> <translation id="420283545744377356">ปิดโปรแกรมรักษาหน้าจอ</translation> @@ -957,6 +966,7 @@ <translation id="550600468576850160">ทุ่งหญ้า</translation> <translation id="551689408806449779">ยกเลิกการเชื่อมต่ออุปกรณ์แล้ว ลองเชื่อมต่ออีกครั้งเพื่อทดสอบ</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="552644173505433109">ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างชื่อและสรุป</translation> <translation id="5527146180235316490">ตัวเลือกไมโครโฟน</translation> <translation id="5534900277405737921">ภูมิประเทศ</translation> <translation id="554067135846762198">ชมพูคอรัลและน้ำตาลอ่อน</translation> @@ -1055,6 +1065,7 @@ <translation id="5982621672636444458">ตัวเลือกการจัดเรียง</translation> <translation id="5984145644188835034">วอลเปเปอร์เริ่มต้น</translation> <translation id="5996832681196460718">ไหม</translation> +<translation id="6016750809509395299">ชื่อที่สร้าง:</translation> <translation id="6017514345406065928">สีเขียว</translation> <translation id="6019566113895157499">แป้นพิมพ์ลัด</translation> <translation id="6034694447310538551">เปิดใช้การรีเซ็ตทุกเดือนโดยอัตโนมัติ</translation> @@ -1092,6 +1103,7 @@ <translation id="6147514244879357420">PNG</translation> <translation id="6149015141270619212">เชื่อมต่ออินเทอร์เน็ตไม่ได้</translation> <translation id="6156030503438652198">น้ำตาลแดงและชมพู</translation> +<translation id="6163318050265152852">สร้างชื่อไม่ได้ โปรดลองใช้ข้อความถอดเสียงที่สั้นกว่านี้</translation> <translation id="6165508094623778733">ดูข้อมูลเพิ่มเติม</translation> <translation id="6184793017104303157">B4</translation> <translation id="6185263894115593524">รีเซ็ตเพื่อไม่ให้ผู้อื่นใช้ไมโครโฟนหรือกล้องของคุณ โปรดให้สิทธิ์เฉพาะเว็บไซต์ที่คุณเชื่อถือเท่านั้น</translation> @@ -1171,6 +1183,7 @@ <translation id="6500818810472529210">ดูผลการค้นหาใน Google Search</translation> <translation id="650266656685499220">หากต้องการสร้างอัลบั้ม โปรดไปที่ Google Photos</translation> <translation id="6505750420152840539">รุ่งเช้าจนถึงกลางคืน</translation> +<translation id="6515056490985026110">สร้างชื่อไม่ได้ โปรดลองใช้ข้อความถอดเสียงที่ยาวกว่านี้</translation> <translation id="6516990319416533844">ปล่อยให้มีการใช้งานแบตเตอรี่อีกสักครู่เพื่อทดสอบอัตราการชาร์จแบตเตอรี่</translation> <translation id="6517239166834772319">สำรวจ</translation> <translation id="6526200165918397681">จับคู่วอลเปเปอร์ที่เข้ากัน</translation> @@ -1256,11 +1269,13 @@ <translation id="6910312834584889076">ฝาเครื่องสแกนเปิดอยู่ ปิดฝาแล้วลองอีกครั้ง</translation> <translation id="6910845598686542904">ประมวลผลรูปแบบเสียงที่ตรวจพบในเสียงที่บันทึกไว้</translation> <translation id="6911383237894364323">เชื่อมต่อเซิร์ฟเวอร์สื่อไม่ได้</translation> +<translation id="6926069762081461162">ชื่อไฟล์บันทึกเสียง</translation> <translation id="6930242544192836755">ระยะเวลา</translation> <translation id="6930597342185648547">เกี่ยวกับพื้นหลัง</translation> <translation id="6939766318048400022">ร้านกาแฟ</translation> <translation id="6942253772720771875">แชร์ความคิดเห็นหรืออธิบายปัญหาของคุณ</translation> <translation id="6943893908656559156">ข้อมูลประจำตัวระยะไกล (ไม่บังคับ)</translation> +<translation id="694981048020558038">ค้นหาชื่อบันทึกเสียง</translation> <translation id="6953137545147683679">ทอง</translation> <translation id="6957231940976260713">ชื่อบริการ</translation> <translation id="695776212669661671">ลูกศรขวา</translation> @@ -1335,6 +1350,7 @@ <translation id="7216409898977639127">ผู้ให้บริการเครือข่ายมือถือ</translation> <translation id="7223952304612664117">การตั้งค่านี้จะช่วยให้บริการของระบบใช้ความแม่นยำของตำแหน่งเพื่อระบุตำแหน่งของคุณได้ ความแม่นยำของตำแหน่งจะใช้ข้อมูลเกี่ยวกับสัญญาณไร้สายและเซ็นเซอร์เพื่อประมาณตำแหน่งของอุปกรณ์</translation> <translation id="7233782086689993269">คืนค่าแป้นพิมพ์ลัดแล้ว</translation> +<translation id="723419678599947502">สร้างชื่อโดยใช้ AI ของ Google</translation> <translation id="725133483556299729">เลือกอีเมล</translation> <translation id="7255187042098209569">ชมพูและม่วง</translation> <translation id="7267918995585557751">รีเซ็ตเพื่อให้หน้าเริ่มต้นใช้งานเริ่มต้นไม่ใช่เว็บไซต์ฟิชชิง โปรดใช้เฉพาะเว็บไซต์ที่คุณเชื่อถือเท่านั้น</translation> @@ -1483,6 +1499,7 @@ <translation id="7897043345768902965">ทางเท้า</translation> <translation id="7902285181767404769">ปิดเสียงการแจ้งเตือนขณะบันทึก</translation> <translation id="7903695460270716054">เลือกงานศิลปะและรูปภาพที่ดูแลจัดการ</translation> +<translation id="7908543555831145677">สร้างชื่อของบันทึกเสียงเรียบร้อยแล้ว</translation> <translation id="7912005977894000746">กลับไปที่หน้าหลัก</translation> <translation id="7915220255123750251">จัดการการตั้งค่า APN ของเครือข่าย APN จะเริ่มการเชื่อมต่อระหว่างเครือข่ายมือถือกับอินเทอร์เน็ต</translation> <translation id="7915759923880480519">รีเซ็ตเพื่อปกป้องข้อมูลที่ส่งผ่านเครือข่าย โปรดใช้เฉพาะเครือข่ายที่คุณเชื่อถือเท่านั้น</translation> @@ -1557,6 +1574,7 @@ <translation id="8261506727792406068">ลบ</translation> <translation id="8262870577632766028">1 ชั่วโมง</translation> <translation id="827422111966801947">สีคราม</translation> +<translation id="8280687443902283243">แก้ไขชื่อ</translation> <translation id="8286154143153872371">โปรดเชื่อมต่อเครือข่ายและโหลดหน้าซ้ำเพื่อดูวอลเปเปอร์</translation> <translation id="8291967909914612644">ประเทศผู้ให้บริการหน้าแรก</translation> <translation id="8294431847097064396">แหล่งที่มา</translation> @@ -1564,6 +1582,7 @@ <translation id="8308787307410010965">การตั้งค่าเนื้อหาเว็บไซต์</translation> <translation id="8312330582793120272">เล่นสื่อ</translation> <translation id="8318753676953949627">ไม่มีภาพ</translation> +<translation id="8319809980370328428">การสร้างชื่อและสรุปบันทึกเสียง</translation> <translation id="8320910311642849813">ป่า</translation> <translation id="8322464149031882595">คลิกเพื่อดำเนินการต่อ</translation> <translation id="8329018942023753850">แอปเครื่องคิดเลข</translation>
diff --git a/clank b/clank index dc56cf1..a16b3eb 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit dc56cf11e9e079b4e75aea145d2e4e218e62d3c1 +Subproject commit a16b3ebe1b1e181215c098f25e148871aa192abf
diff --git a/components/autofill/android/java/src/org/chromium/components/autofill/AutofillDropdownAdapter.java b/components/autofill/android/java/src/org/chromium/components/autofill/AutofillDropdownAdapter.java index 9e5e592d..e283ca7 100644 --- a/components/autofill/android/java/src/org/chromium/components/autofill/AutofillDropdownAdapter.java +++ b/components/autofill/android/java/src/org/chromium/components/autofill/AutofillDropdownAdapter.java
@@ -21,7 +21,6 @@ import android.widget.TextView; import androidx.core.view.MarginLayoutParamsCompat; -import androidx.core.view.ViewCompat; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; @@ -37,7 +36,6 @@ private final Context mContext; private final Set<Integer> mSeparators; private final boolean mAreAllItemsEnabled; - private final int mLabelMargin; /** * Creates an {@code ArrayAdapter} with specified parameters. @@ -52,9 +50,6 @@ addAll(items); mSeparators = separators; mAreAllItemsEnabled = checkAreAllItemsEnabled(); - mLabelMargin = - context.getResources() - .getDimensionPixelSize(R.dimen.autofill_dropdown_item_label_margin); } private boolean checkAreAllItemsEnabled() { @@ -120,7 +115,6 @@ // instead. If you need to modify this layout, don't forget to test it with TalkBack and // make sure it doesn't regress. http://crbug.com/429364 LinearLayout wrapper = (LinearLayout) layout.findViewById(R.id.dropdown_label_wrapper); - if (item.isMultilineLabel()) height = LayoutParams.WRAP_CONTENT; wrapper.setOrientation(LinearLayout.VERTICAL); wrapper.setLayoutParams(new LinearLayout.LayoutParams(0, height, 1)); @@ -135,14 +129,7 @@ R.id.dropdown_secondary_label, item.getSecondaryLabel(), item.isEnabled()); - labelView.setSingleLine(!item.isMultilineLabel()); - if (item.isMultilineLabel()) { - // If there is a multiline label, we add extra padding at the top and bottom because - // WRAP_CONTENT, defined above for multiline labels, leaves none. - int existingStart = ViewCompat.getPaddingStart(labelView); - int existingEnd = ViewCompat.getPaddingEnd(labelView); - labelView.setPaddingRelative(existingStart, mLabelMargin, existingEnd, mLabelMargin); - } + labelView.setSingleLine(true); if (item.isGroupHeader()) { labelView.setTypeface(null, Typeface.BOLD);
diff --git a/components/autofill/android/java/src/org/chromium/components/autofill/AutofillSuggestion.java b/components/autofill/android/java/src/org/chromium/components/autofill/AutofillSuggestion.java index a7e232a..d4012aa 100644 --- a/components/autofill/android/java/src/org/chromium/components/autofill/AutofillSuggestion.java +++ b/components/autofill/android/java/src/org/chromium/components/autofill/AutofillSuggestion.java
@@ -30,7 +30,6 @@ private final boolean mIsIconAtStart; private final int mSuggestionType; private final boolean mIsDeletable; - private final boolean mIsMultilineLabel; private final boolean mApplyDeactivatedStyle; private final boolean mShouldDisplayTermsAvailable; private final @Nullable String mFeatureForIph; @@ -53,7 +52,6 @@ * @param isIconAtStart {@code true} if {@code iconId} is displayed before {@code label}. * @param popupItemId The type of suggestion. * @param isDeletable Whether the item can be deleted by the user. - * @param isMultilineLabel Whether the label is displayed over multiple lines. * @param applyDeactivatedStyle Whether to apply deactivated style to the suggestion. * @param shouldDisplayTermsAvailable Whether the terms message is displayed. * @param featureForIph The IPH feature for the autofill suggestion. If present, it'll be @@ -73,7 +71,6 @@ boolean isIconAtStart, @SuggestionType int popupItemId, boolean isDeletable, - boolean isMultilineLabel, boolean applyDeactivatedStyle, boolean shouldDisplayTermsAvailable, @Nullable String featureForIph, @@ -90,7 +87,6 @@ mIsIconAtStart = isIconAtStart; mSuggestionType = popupItemId; mIsDeletable = isDeletable; - mIsMultilineLabel = isMultilineLabel; mApplyDeactivatedStyle = applyDeactivatedStyle; mShouldDisplayTermsAvailable = shouldDisplayTermsAvailable; mFeatureForIph = featureForIph; @@ -130,11 +126,6 @@ } @Override - public boolean isMultilineLabel() { - return mIsMultilineLabel; - } - - @Override public int getLabelFontColorResId() { if (mSuggestionType == SuggestionType.INSECURE_CONTEXT_PAYMENT_DISABLED_MESSAGE) { return R.color.insecure_context_payment_disabled_message_text; @@ -212,7 +203,6 @@ && this.mIsIconAtStart == other.mIsIconAtStart && this.mSuggestionType == other.mSuggestionType && this.mIsDeletable == other.mIsDeletable - && this.mIsMultilineLabel == other.mIsMultilineLabel && this.mApplyDeactivatedStyle == other.mApplyDeactivatedStyle && this.mShouldDisplayTermsAvailable == other.mShouldDisplayTermsAvailable && Objects.equals(this.mFeatureForIph, other.mFeatureForIph) @@ -228,7 +218,6 @@ private @Nullable Drawable mIconDrawable; private boolean mIsIconAtStart; private boolean mIsDeletable; - private boolean mIsMultiLineLabel; private boolean mApplyDeactivatedStyle; private boolean mShouldDisplayTermsAvailable; private @Nullable String mFeatureForIph; @@ -266,11 +255,6 @@ return this; } - public Builder setIsMultiLineLabel(boolean isMultiLineLabel) { - this.mIsMultiLineLabel = isMultiLineLabel; - return this; - } - public Builder setApplyDeactivatedStyle(boolean applyDeactivatedStyle) { this.mApplyDeactivatedStyle = applyDeactivatedStyle; return this; @@ -342,7 +326,6 @@ mIsIconAtStart, mSuggestionType, mIsDeletable, - mIsMultiLineLabel, mApplyDeactivatedStyle, mShouldDisplayTermsAvailable, mFeatureForIph,
diff --git a/components/autofill/core/browser/autofill_field.cc b/components/autofill/core/browser/autofill_field.cc index 494b4a6..0a18c79 100644 --- a/components/autofill/core/browser/autofill_field.cc +++ b/components/autofill/core/browser/autofill_field.cc
@@ -369,11 +369,6 @@ // Equivalent to a `NO_SERVER_DATA` prediction from `SOURCE_UNSPECIFIED`. server_predictions_.emplace_back(); } - - LOG_IF(ERROR, server_predictions_.size() > 2) - << "Expected up to 2 default predictions from the Autofill server. " - "Actual: " - << server_predictions_.size(); } void AutofillField::SetHtmlType(HtmlFieldType type, HtmlFieldMode mode) {
diff --git a/components/autofill/core/browser/crowdsourcing/test_votes_uploader.cc b/components/autofill/core/browser/crowdsourcing/test_votes_uploader.cc index b045fd42..711e56ea 100644 --- a/components/autofill/core/browser/crowdsourcing/test_votes_uploader.cc +++ b/components/autofill/core/browser/crowdsourcing/test_votes_uploader.cc
@@ -17,6 +17,7 @@ void TestVotesUploader::UploadVote( std::unique_ptr<FormStructure> submitted_form, + std::vector<AutofillUploadContents> upload_contents, base::TimeTicks initial_interaction_timestamp, base::TimeTicks submission_timestamp, bool observed_submission, @@ -49,10 +50,10 @@ } } - VotesUploader::UploadVote(std::move(submitted_form), - initial_interaction_timestamp, submission_timestamp, - observed_submission, last_unlocked_credit_card_cvc, - source_id); + VotesUploader::UploadVote( + std::move(submitted_form), std::move(upload_contents), + initial_interaction_timestamp, submission_timestamp, observed_submission, + last_unlocked_credit_card_cvc, source_id); } bool TestVotesUploader::MaybeStartVoteUploadProcess(
diff --git a/components/autofill/core/browser/crowdsourcing/test_votes_uploader.h b/components/autofill/core/browser/crowdsourcing/test_votes_uploader.h index 72ecd5f..7a43b15 100644 --- a/components/autofill/core/browser/crowdsourcing/test_votes_uploader.h +++ b/components/autofill/core/browser/crowdsourcing/test_votes_uploader.h
@@ -44,6 +44,7 @@ ukm::SourceId ukm_source_id) override; void UploadVote(std::unique_ptr<FormStructure> submitted_form, + std::vector<AutofillUploadContents> upload_contents, base::TimeTicks initial_interaction_timestamp, base::TimeTicks submission_timestamp, bool observed_submission,
diff --git a/components/autofill/core/browser/crowdsourcing/votes_uploader.cc b/components/autofill/core/browser/crowdsourcing/votes_uploader.cc index 3ae30da..360b3d6 100644 --- a/components/autofill/core/browser/crowdsourcing/votes_uploader.cc +++ b/components/autofill/core/browser/crowdsourcing/votes_uploader.cc
@@ -247,25 +247,40 @@ // |AlternativeStateNameMap| can only be accessed on the main UI thread. PreProcessStateMatchingTypes(*client_, copied_profiles, *form); - // TODO(crbug.com/368306576): Bound the size of `copied_profiles` and - // `copied_credit_cards` by `kMaxDataConsideredForPossibleTypes` and make - // the call to DeterminePossibleFieldTypesForUpload() synchronous. task_runner().PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce( [](const std::vector<AutofillProfile>& profiles, const std::vector<CreditCard>& credit_cards, const std::u16string& last_unlocked_credit_card_cvc, - const std::string& app_locale, + const std::string& app_locale, bool observed_submission, std::unique_ptr<FormStructure> form) { DeterminePossibleFieldTypesForUpload(profiles, credit_cards, last_unlocked_credit_card_cvc, app_locale, *form); - return form; + + FieldTypeSet non_empty_types; + for (const AutofillProfile& profile : profiles) { + profile.GetNonEmptyTypes(app_locale, &non_empty_types); + } + for (const CreditCard& card : credit_cards) { + card.GetNonEmptyTypes(app_locale, &non_empty_types); + } + // As CVC is not stored, treat it separately. + if (!last_unlocked_credit_card_cvc.empty() || + non_empty_types.contains(CREDIT_CARD_NUMBER)) { + non_empty_types.insert(CREDIT_CARD_VERIFICATION_CODE); + } + + std::vector<AutofillUploadContents> upload_contents = + EncodeUploadRequest(*form, non_empty_types, + /*login_form_signature=*/{}, + observed_submission); + return std::pair(std::move(form), std::move(upload_contents)); }, std::move(copied_profiles), std::move(copied_credit_cards), last_unlocked_credit_card_cvc, client_->GetAppLocale(), - std::move(form)), + observed_submission, std::move(form)), base::BindOnce(&VotesUploader::OnFieldTypesDetermined, weak_ptr_factory_.GetWeakPtr(), initial_interaction_timestamp, base::TimeTicks::Now(), @@ -280,13 +295,16 @@ bool observed_submission, const std::u16string& last_unlocked_credit_card_cvc, ukm::SourceId ukm_source_id, - std::unique_ptr<FormStructure> form) { + std::pair<std::unique_ptr<FormStructure>, + std::vector<AutofillUploadContents>> form_and_upload_contents) { + auto& [form, upload_contents] = form_and_upload_contents; LocalFrameToken frame = form->global_id().frame_token; WipePendingVotesForForm(form->form_signature()); if (observed_submission) { - UploadVote(std::move(form), initial_interaction_timestamp, - submission_timestamp, observed_submission, - last_unlocked_credit_card_cvc, ukm_source_id); + UploadVote(std::move(form), std::move(upload_contents), + initial_interaction_timestamp, submission_timestamp, + observed_submission, last_unlocked_credit_card_cvc, + ukm_source_id); FlushPendingVotesForFrame(frame); } else { FlushOldestPendingVotesIfNecessary(); @@ -295,9 +313,10 @@ .form_signature = form->form_signature(), .upload_vote = base::BindOnce( &VotesUploader::UploadVote, weak_ptr_factory_.GetWeakPtr(), - std::move(form), initial_interaction_timestamp, - submission_timestamp, observed_submission, - last_unlocked_credit_card_cvc, ukm_source_id)}); + std::move(form), std::move(upload_contents), + initial_interaction_timestamp, submission_timestamp, + observed_submission, last_unlocked_credit_card_cvc, + ukm_source_id)}); } } @@ -317,6 +336,7 @@ void VotesUploader::UploadVote( std::unique_ptr<FormStructure> submitted_form, + std::vector<AutofillUploadContents> upload_contents, base::TimeTicks initial_interaction_timestamp, base::TimeTicks submission_timestamp, bool observed_submission, @@ -382,25 +402,8 @@ client_->GetUkmRecorder(), ukm_source_id, *submitted_form, submission_timestamp); } - const PersonalDataManager& pdm = client_->GetPersonalDataManager(); - FieldTypeSet non_empty_types; - for (const AutofillProfile* profile : - pdm.address_data_manager().GetProfiles()) { - profile->GetNonEmptyTypes(client_->GetAppLocale(), &non_empty_types); - } - for (const CreditCard* card : pdm.payments_data_manager().GetCreditCards()) { - card->GetNonEmptyTypes(client_->GetAppLocale(), &non_empty_types); - } - // As CVC is not stored, treat it separately. - if (!last_unlocked_credit_card_cvc.empty() || - non_empty_types.contains(CREDIT_CARD_NUMBER)) { - non_empty_types.insert(CREDIT_CARD_VERIFICATION_CODE); - } client_->GetCrowdsourcingManager().StartUploadRequest( - /*upload_contents=*/EncodeUploadRequest(*submitted_form, non_empty_types, - /*login_form_signature=*/{}, - observed_submission), - submitted_form->submission_source(), + std::move(upload_contents), submitted_form->submission_source(), /*is_password_manager_upload=*/false); }
diff --git a/components/autofill/core/browser/crowdsourcing/votes_uploader.h b/components/autofill/core/browser/crowdsourcing/votes_uploader.h index f7b73b3f..8a1de4b 100644 --- a/components/autofill/core/browser/crowdsourcing/votes_uploader.h +++ b/components/autofill/core/browser/crowdsourcing/votes_uploader.h
@@ -108,6 +108,7 @@ // // Virtual and protected for testing. virtual void UploadVote(std::unique_ptr<FormStructure> submitted_form, + std::vector<AutofillUploadContents> upload_contents, base::TimeTicks initial_interaction_timestamp, base::TimeTicks submission_timestamp, bool observed_submission, @@ -127,7 +128,8 @@ bool observed_submission, const std::u16string& last_unlocked_credit_card_cvc, ukm::SourceId ukm_source_id, - std::unique_ptr<FormStructure> submitted_form); + std::pair<std::unique_ptr<FormStructure>, + std::vector<AutofillUploadContents>> form_and_upload_contents); // Uploads all pending votes for forms from `frame`. void FlushPendingVotesForFrame(const LocalFrameToken& frame);
diff --git a/components/autofill/core/browser/data_model/data_model_utils.cc b/components/autofill/core/browser/data_model/data_model_utils.cc index 6173cc5..490b61c 100644 --- a/components/autofill/core/browser/data_model/data_model_utils.cc +++ b/components/autofill/core/browser/data_model/data_model_utils.cc
@@ -128,7 +128,10 @@ bool ParseDate(std::u16string_view date, std::u16string_view format, - Date& result) { + Date& result, + const char16_t*& first_separator) { + first_separator = nullptr; + // Consumes `part` (= YYYY, YY, MM, M, DD, or D) from `format` and the // corresponding numeric value from `date`. Returns that numeric value if // successful, and -1 otherwise. @@ -143,8 +146,6 @@ return -1; }; - const char16_t* first_separator = nullptr; - while (!date.empty() && !format.empty()) { int num = -1; if ((num = consume_part(u"YYYY")) >= 0) {
diff --git a/components/autofill/core/browser/data_model/data_model_utils.h b/components/autofill/core/browser/data_model/data_model_utils.h index 10d0b2ae3..f2b9071 100644 --- a/components/autofill/core/browser/data_model/data_model_utils.h +++ b/components/autofill/core/browser/data_model/data_model_utils.h
@@ -54,26 +54,40 @@ // matches only non-empty separators. The first occurrence of a wildcard binds // the wildcard, so that subsequent occurrences only match the identical // separator. +// The out parameter `separator` is set to the separator if the wildcard matches +// any (including the empty separator). Otherwise, it is set to nullptr. // // Partial matches: // For partial matches, the first matches are populated in `result`. // // Examples: -// - ParseDate(u"2025-09-10", u"YYYY-MM-DD", result) returns true and sets -// `result` to Date{.year = 2025, .month = 9, .day = 10}. -// - ParseDate(u"2025-09-10", u"YYYY+MM+DD", result) behaves as above. -// - ParseDate(u"2025-09-10", u"YYYY*MM*DD", result) behaves as above. -// - ParseDate(u"20250910", u"YYYY*MM*DD", result) behaves as above. -// - ParseDate(u"2025-XX-10", u"YYYY-MM-DD", result) returns false and sets -// `result.year` to 2025. -// - ParseDate(u"20250910", u"YYYY+MM+DD", result) returns false and sets -// `result.year` to 2025. +// - ParseDate(u"2025-09-10", u"YYYY-MM-DD", result, separator) returns true and +// sets `result` to Date{.year = 2025, .month = 9, .day = 10} and `separator` +// to nullptr. +// - ParseDate(u"2025-09-10", u"YYYY+MM+DD", result, separator) behaves as +// above, except that it sets `separator` to u"-". +// - ParseDate(u"2025-09-10", u"YYYY*MM*DD", result, separator) behaves as +// above, except that it sets `separator` to u"-". +// - ParseDate(u"20250910", u"YYYY*MM*DD", result, separator) behaves as +// above, except that it sets `separator` to u"". +// - ParseDate(u"2025-XX-10", u"YYYY-MM-DD", result, separator) returns false +// and sets `result.year` to 2025 and `separator` to nullptr. +// - ParseDate(u"20250910", u"YYYY+MM+DD", result, separator) returns false and +// sets `result.year` to 2025 and `separator` to u"". // // This function is minimalistic and cheap (~1000x cheaper than parsing with // ICU without caching the SimpleDateFormat). bool ParseDate(std::u16string_view date, std::u16string_view format, - Date& result); + Date& result, + const char16_t*& wildcard_instance); + +inline bool ParseDate(std::u16string_view date, + std::u16string_view format, + Date& result) { + const char16_t* wildcard_instance = nullptr; + return ParseDate(date, format, result, wildcard_instance); +} // Returns true iff all values requested by `format` are valid in `date`: // - If `format` contains a year, the date's year must be in the range 1 to 9999
diff --git a/components/autofill/core/browser/data_model/data_model_utils_unittest.cc b/components/autofill/core/browser/data_model/data_model_utils_unittest.cc index 8c46a8abb..cf61435e 100644 --- a/components/autofill/core/browser/data_model/data_model_utils_unittest.cc +++ b/components/autofill/core/browser/data_model/data_model_utils_unittest.cc
@@ -130,6 +130,9 @@ EXPECT_EQ(ParseDate(u"2025-12-10", u"YYYY*MM*DD"), Date(2025, 12, 10)); EXPECT_EQ(ParseDate(u"20251210", u"YYYY*MM*DD"), Date(2025, 12, 10)); EXPECT_EQ(ParseDate(u"2025-12-10", u"YYYY+MM+DD"), Date(2025, 12, 10)); + EXPECT_EQ(ParseDate(u"2025-12-10", u"YYYY+MM*DD"), Date(2025, 12, 10)); + EXPECT_EQ(ParseDate(u"2025-12-10", u"YYYY*MM+DD"), Date(2025, 12, 10)); + EXPECT_EQ(ParseDate(u"2025 / 12 / 10", u"YYYY*MM*DD"), Date(2025, 12, 10)); EXPECT_EQ(ParseDate(u"2025", u"YYYY"), Date(2025, 0, 0)); EXPECT_EQ(ParseDate(u"0001", u"YYYY"), Date(1, 0, 0)); @@ -199,47 +202,94 @@ EXPECT_EQ(ParseDate(u"2025-12-10", u"M"), std::nullopt); EXPECT_EQ(ParseDate(u"2025-12-10", u"DD"), std::nullopt); EXPECT_EQ(ParseDate(u"2025-12-10", u"D"), std::nullopt); + EXPECT_EQ(ParseDate(u"20251210", u"YYYY+MM+DD"), std::nullopt); { Date date; - EXPECT_TRUE(ParseDate(u"2025-12-11", u"YYYY-MM-DD", date)); + const char16_t* separator = u"whatever"; + EXPECT_TRUE(ParseDate(u"2025-12-11", u"YYYY-MM-DD", date, separator)); EXPECT_EQ(date, Date(2025, 12, 11)); + EXPECT_EQ(separator, nullptr); } { Date date; - EXPECT_FALSE(ParseDate(u"20251210", u"YYYY+MM+DD", date)); + const char16_t* separator = u"whatever"; + EXPECT_TRUE(ParseDate(u"2025-12-10", u"YYYY+MM+DD", date, separator)); + EXPECT_EQ(date, Date(2025, 12, 10)); + EXPECT_EQ(std::u16string_view(separator), std::u16string_view(u"-")); + } + + { + Date date; + const char16_t* separator = u"whatever"; + EXPECT_TRUE(ParseDate(u"2025-12-10", u"YYYY*MM*DD", date, separator)); + EXPECT_EQ(date, Date(2025, 12, 10)); + EXPECT_EQ(std::u16string_view(separator), std::u16string_view(u"-")); + } + + { + Date date; + const char16_t* separator = u"whatever"; + EXPECT_TRUE(ParseDate(u"20251210", u"YYYY*MM*DD", date, separator)); + EXPECT_EQ(date, Date(2025, 12, 10)); + EXPECT_EQ(separator, std::u16string_view(u"")); + } + + { + Date date; + const char16_t* separator = u"whatever"; + EXPECT_FALSE(ParseDate(u"20251210", u"YYYY+MM+DD", date, separator)); EXPECT_EQ(date, Date(2025, 0, 0)); + EXPECT_EQ(separator, std::u16string_view(u"")); } { Date date; - EXPECT_FALSE(ParseDate(u"202512-10", u"YYYYMMDD", date)); + const char16_t* separator = u"whatever"; + EXPECT_FALSE(ParseDate(u"2025-12-10", u"YYYY-XX-DD", date, separator)); + EXPECT_EQ(date, Date(2025, 0, 0)); + EXPECT_EQ(separator, nullptr); + } + + { + Date date; + const char16_t* separator = u"whatever"; + EXPECT_FALSE(ParseDate(u"202512-10", u"YYYYMMDD", date, separator)); EXPECT_EQ(date, Date(2025, 12, 0)); + EXPECT_EQ(separator, nullptr); } { Date date; - EXPECT_FALSE(ParseDate(u"202521", u"YYYYMD", date)); + const char16_t* separator = u"whatever"; + EXPECT_FALSE(ParseDate(u"202521", u"YYYYMD", date, separator)); EXPECT_EQ(date, Date(2025, 21, 0)); + EXPECT_EQ(separator, nullptr); } { Date date; - EXPECT_FALSE(ParseDate(u"2025-12-11", u"YYYY-MM", date)); + const char16_t* separator = u"whatever"; + EXPECT_FALSE(ParseDate(u"2025-12-11", u"YYYY-MM", date, separator)); EXPECT_EQ(date, Date(2025, 12, 0)); + EXPECT_EQ(separator, nullptr); } { Date date; - EXPECT_FALSE(ParseDate(u"2025-12", u"YYYY-MM-DD", date)); + const char16_t* separator = u"whatever"; + EXPECT_FALSE(ParseDate(u"2025-12", u"YYYY-MM-DD", date, separator)); EXPECT_EQ(date, Date(2025, 12, 0)); + EXPECT_EQ(separator, nullptr); } { Date date; - EXPECT_FALSE(ParseDate(u"2025-12-10", u"YYYY-ZZ-DD", date)); + const char16_t* separator = u"whatever"; + EXPECT_FALSE(ParseDate(u"2025-12-10", u"YYYY-ZZ-DD", date, separator)); EXPECT_EQ(date, Date(2025, 0, 0)); + EXPECT_EQ(separator, nullptr); } }
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc index 9dea1d7..567ecd3f 100644 --- a/components/autofill/core/browser/form_structure.cc +++ b/components/autofill/core/browser/form_structure.cc
@@ -115,6 +115,10 @@ return field->parsed_autocomplete().has_value(); } +bool is_password_field(const std::unique_ptr<AutofillField>& field) { + return field->form_control_type() == FormControlType::kInputPassword; +} + } // namespace FormStructure::FormStructure(const FormData& form) @@ -126,7 +130,6 @@ full_source_url_(form.full_url()), target_url_(form.action()), main_frame_origin_(form.main_frame_origin()), - all_fields_are_passwords_(!form.fields().empty()), form_parsed_timestamp_(base::TimeTicks::Now()), host_frame_(form.host_frame()), version_(form.version()), @@ -140,8 +143,6 @@ if (field.form_control_type() == FormControlType::kInputPassword) { has_password_field_ = true; - } else { - all_fields_are_passwords_ = false; } fields_.push_back(std::make_unique<AutofillField>(field)); @@ -373,9 +374,9 @@ } if (active_field_count() < params.min_required_fields && - (!all_fields_are_passwords() || - active_field_count() < - params.required_fields_for_forms_with_only_password_fields) && + (active_field_count() < + params.required_fields_for_forms_with_only_password_fields || + !std::ranges::all_of(fields_, is_password_field)) && std::ranges::none_of(fields_, has_autocomplete)) { LOG_AF(log_manager) << LoggingScope::kAbortParsing << LogMessage::kAbortParsingNotEnoughFields
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h index b14fac10..484eef3 100644 --- a/components/autofill/core/browser/form_structure.h +++ b/components/autofill/core/browser/form_structure.h
@@ -223,14 +223,6 @@ void RetrieveFromCache(const FormStructure& cached_form, RetrieveFromCacheReason reason); - void LogDetermineHeuristicTypesMetrics(); - - // Sets each field's `html_type` and `html_mode` based on the field's - // `parsed_autocomplete` member. - // Sets `has_author_specified_types_` to `true` iff the `parsed_autocomplete` - // is available for at least one field. - void SetFieldTypesFromAutocompleteAttribute(); - // Rationalize phone number fields so that, in every section, only the first // complete phone number is filled automatically. This is useful for when a // form contains a first phone number and second phone number, which usually @@ -313,8 +305,6 @@ last_filling_timestamp_ = last_filling_timestamp; } - bool all_fields_are_passwords() const { return all_fields_are_passwords_; } - bool may_run_autofill_ai_model() const { return may_run_autofill_ai_model_; } void set_may_run_autofill_ai_model(bool may_run_autofill_ai_model) { @@ -412,6 +402,14 @@ void AssignBestFieldTypes(const FieldCandidatesMap& field_type_map, HeuristicSource heuristic_source); + void LogDetermineHeuristicTypesMetrics(); + + // Sets each field's `html_type` and `html_mode` based on the field's + // `parsed_autocomplete` member. + // Sets `has_author_specified_types_` to `true` iff the `parsed_autocomplete` + // is available for at least one field. + void SetFieldTypesFromAutocompleteAttribute(); + // Production code only uses the default parameters. // Unit tests also test other parameters. struct ShouldBeParsedParams { @@ -491,9 +489,6 @@ // True if the form contains at least one password field. bool has_password_field_ = false; - // True if all form fields are password fields. - bool all_fields_are_passwords_ = false; - // Indicates whether the client may run the AutofillAI model for this form. bool may_run_autofill_ai_model_ = false;
diff --git a/components/autofill/core/common/autofill_prefs.cc b/components/autofill/core/common/autofill_prefs.cc index 702f451..539e5b15 100644 --- a/components/autofill/core/common/autofill_prefs.cc +++ b/components/autofill/core/common/autofill_prefs.cc
@@ -15,102 +15,91 @@ #include "base/android/build_info.h" #endif -namespace autofill { -namespace prefs { +namespace autofill::prefs { void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { // Synced prefs. Used for cross-device choices, e.g., credit card Autofill. registry->RegisterBooleanPref( - prefs::kAutofillProfileEnabled, true, + kAutofillProfileEnabled, true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); registry->RegisterIntegerPref( - prefs::kAutofillLastVersionDeduped, 0, + kAutofillLastVersionDeduped, 0, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); registry->RegisterBooleanPref( - prefs::kAutofillHasSeenIban, false, + kAutofillHasSeenIban, false, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); registry->RegisterBooleanPref( - prefs::kAutofillCreditCardEnabled, true, + kAutofillCreditCardEnabled, true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); registry->RegisterBooleanPref( - prefs::kAutofillPaymentCvcStorage, true, + kAutofillPaymentCvcStorage, true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); registry->RegisterBooleanPref( kAutofillPaymentCardBenefits, true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); // Non-synced prefs. Used for per-device choices, e.g., signin promo. - registry->RegisterDictionaryPref(prefs::kAutofillAiOptInStatus); - registry->RegisterBooleanPref(prefs::kAutofillCreditCardFidoAuthEnabled, - false); + registry->RegisterDictionaryPref(kAutofillAiOptInStatus); + registry->RegisterBooleanPref(kAutofillCreditCardFidoAuthEnabled, false); #if BUILDFLAG(IS_ANDROID) - registry->RegisterBooleanPref( - prefs::kAutofillCreditCardFidoAuthOfferCheckboxState, true); + registry->RegisterBooleanPref(kAutofillCreditCardFidoAuthOfferCheckboxState, + true); #endif - registry->RegisterIntegerPref(prefs::kAutocompleteLastVersionRetentionPolicy, - 0); - registry->RegisterStringPref(prefs::kAutofillUploadEncodingSeed, ""); - registry->RegisterDictionaryPref(prefs::kAutofillVoteUploadEvents); - registry->RegisterDictionaryPref(prefs::kAutofillMetadataUploadEvents); - registry->RegisterTimePref(prefs::kAutofillUploadEventsLastResetTimestamp, - base::Time()); - registry->RegisterDictionaryPref(prefs::kAutofillSyncTransportOptIn); + registry->RegisterIntegerPref(kAutocompleteLastVersionRetentionPolicy, 0); + registry->RegisterStringPref(kAutofillUploadEncodingSeed, ""); + registry->RegisterDictionaryPref(kAutofillVoteUploadEvents); + registry->RegisterDictionaryPref(kAutofillMetadataUploadEvents); + registry->RegisterTimePref(kAutofillUploadEventsLastResetTimestamp, {}); + registry->RegisterDictionaryPref(kAutofillSyncTransportOptIn); #if BUILDFLAG(IS_ANDROID) // Automotive devices require stricter data protection for user privacy, so // mandatory reauth for autofill payment methods should always be enabled. if (base::android::BuildInfo::GetInstance()->is_automotive()) { - registry->RegisterBooleanPref(prefs::kAutofillPaymentMethodsMandatoryReauth, - true); + registry->RegisterBooleanPref(kAutofillPaymentMethodsMandatoryReauth, true); } else { - registry->RegisterBooleanPref(prefs::kAutofillPaymentMethodsMandatoryReauth, + registry->RegisterBooleanPref(kAutofillPaymentMethodsMandatoryReauth, false); } registry->RegisterIntegerPref( - prefs::kAutofillPaymentMethodsMandatoryReauthPromoShownCounter, 0); + kAutofillPaymentMethodsMandatoryReauthPromoShownCounter, 0); #elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) - registry->RegisterBooleanPref(prefs::kAutofillPaymentMethodsMandatoryReauth, - false); + registry->RegisterBooleanPref(kAutofillPaymentMethodsMandatoryReauth, false); registry->RegisterIntegerPref( - prefs::kAutofillPaymentMethodsMandatoryReauthPromoShownCounter, 0); + kAutofillPaymentMethodsMandatoryReauthPromoShownCounter, 0); #elif BUILDFLAG(IS_IOS) - registry->RegisterBooleanPref(prefs::kAutofillPaymentMethodsMandatoryReauth, - true); + registry->RegisterBooleanPref(kAutofillPaymentMethodsMandatoryReauth, true); #endif // Deprecated prefs registered for migration. - registry->RegisterBooleanPref(prefs::kAutofillEnabledDeprecated, true); - registry->RegisterBooleanPref(prefs::kAutofillOrphanRowsRemoved, false); - registry->RegisterBooleanPref(prefs::kAutofillIbanEnabled, true); - registry->RegisterIntegerPref( - prefs::kAutofillLastVersionDisusedAddressesDeleted, 0); - registry->RegisterIntegerPref( - prefs::kAutofillLastVersionDisusedCreditCardsDeleted, 0); + registry->RegisterBooleanPref(kAutofillEnabledDeprecated, true); + registry->RegisterBooleanPref(kAutofillOrphanRowsRemoved, false); + registry->RegisterBooleanPref(kAutofillIbanEnabled, true); + registry->RegisterIntegerPref(kAutofillLastVersionDisusedAddressesDeleted, 0); + registry->RegisterIntegerPref(kAutofillLastVersionDisusedCreditCardsDeleted, + 0); registry->RegisterStringPref(kAutofillAblationSeedPref, ""); - registry->RegisterBooleanPref( - prefs::kAutofillRanQuasiDuplicateExtraDeduplication, false); + registry->RegisterBooleanPref(kAutofillRanQuasiDuplicateExtraDeduplication, + false); #if BUILDFLAG(IS_ANDROID) - registry->RegisterBooleanPref(prefs::kAutofillUsingVirtualViewStructure, - false); + registry->RegisterBooleanPref(kAutofillUsingVirtualViewStructure, false); + registry->RegisterBooleanPref(kAutofillThirdPartyPasswordManagersAllowed, + true); registry->RegisterBooleanPref( - prefs::kAutofillThirdPartyPasswordManagersAllowed, true); - registry->RegisterBooleanPref( - prefs::kFacilitatedPaymentsPix, /*default_value=*/true, + kFacilitatedPaymentsPix, /*default_value=*/true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); registry->RegisterBooleanPref( - prefs::kFacilitatedPaymentsEwallet, /*default_value=*/true, + kFacilitatedPaymentsEwallet, /*default_value=*/true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); #endif #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ BUILDFLAG(IS_CHROMEOS) - registry->RegisterBooleanPref(prefs::kAutofillPredictionImprovementsEnabled, - false); registry->RegisterBooleanPref( - prefs::kAutofillBnplEnabled, true, + kAutofillBnplEnabled, true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); registry->RegisterBooleanPref( - prefs::kAutofillHasSeenBnpl, false, + kAutofillHasSeenBnpl, false, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || // BUILDFLAG(IS_CHROMEOS) @@ -118,18 +107,18 @@ void MigrateDeprecatedAutofillPrefs(PrefService* pref_service) { // Added 09/2022. - pref_service->ClearPref(prefs::kAutofillEnabledDeprecated); + pref_service->ClearPref(kAutofillEnabledDeprecated); // Added 05/2023. - pref_service->ClearPref(prefs::kAutofillOrphanRowsRemoved); + pref_service->ClearPref(kAutofillOrphanRowsRemoved); // Added 09/2023. - pref_service->ClearPref(prefs::kAutofillIbanEnabled); + pref_service->ClearPref(kAutofillIbanEnabled); // Added 10/2023 - pref_service->ClearPref(prefs::kAutofillLastVersionDisusedAddressesDeleted); - pref_service->ClearPref(prefs::kAutofillLastVersionDisusedCreditCardsDeleted); + pref_service->ClearPref(kAutofillLastVersionDisusedAddressesDeleted); + pref_service->ClearPref(kAutofillLastVersionDisusedCreditCardsDeleted); // Added 07/2024 (moved from profile pref to local state) - pref_service->ClearPref(prefs::kAutofillAblationSeedPref); + pref_service->ClearPref(kAutofillAblationSeedPref); // Added 10/2024 - pref_service->ClearPref(prefs::kAutofillRanQuasiDuplicateExtraDeduplication); + pref_service->ClearPref(kAutofillRanQuasiDuplicateExtraDeduplication); } void RegisterLocalStatePrefs(PrefRegistrySimple* registry) { @@ -166,10 +155,6 @@ prefs->SetBoolean(kAutofillHasSeenIban, true); } -bool IsAutofillManaged(const PrefService* prefs) { - return prefs->IsManagedPreference(kAutofillEnabledDeprecated); -} - bool IsAutofillProfileManaged(const PrefService* prefs) { return prefs->IsManagedPreference(kAutofillProfileEnabled); } @@ -263,7 +248,7 @@ } void ClearSyncTransportOptIns(PrefService* prefs) { - prefs->SetDict(prefs::kAutofillSyncTransportOptIn, base::Value::Dict()); + prefs->SetDict(kAutofillSyncTransportOptIn, base::Value::Dict()); } // UsesVirtualViewStructureForAutofill is defined in @@ -329,5 +314,4 @@ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || // BUILDFLAG(IS_CHROMEOS) -} // namespace prefs -} // namespace autofill +} // namespace autofill::prefs
diff --git a/components/autofill/core/common/autofill_prefs.h b/components/autofill/core/common/autofill_prefs.h index 490422f..1afb7b6 100644 --- a/components/autofill/core/common/autofill_prefs.h +++ b/components/autofill/core/common/autofill_prefs.h
@@ -85,16 +85,6 @@ // Boolean that is true when users can see the card benefits with the card. inline constexpr char kAutofillPaymentCardBenefits[] = "autofill.payment_card_benefits"; -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ - BUILDFLAG(IS_CHROMEOS) -// Boolean that controls improved autofill filling predictions. When enabled, -// the autofill functionality is enhanced with adopting user data to -// the form being filled in, which is triggered by the user via an extra -// autofill suggestion. -inline constexpr char kAutofillPredictionImprovementsEnabled[] = - "autofill.prediction_improvements.enabled"; -#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || - // BUILDFLAG(IS_CHROMEOS) // Boolean that is true if Autofill is enabled and allowed to save profile data. // Do not get/set the value of this pref directly. Use provided getter/setter. inline constexpr char kAutofillProfileEnabled[] = "autofill.profile_enabled"; @@ -195,8 +185,6 @@ void SetAutofillHasSeenIban(PrefService* prefs); -bool IsAutofillManaged(const PrefService* prefs); - bool IsAutofillProfileManaged(const PrefService* prefs); bool IsAutofillCreditCardManaged(const PrefService* prefs);
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 6c9fcb52..e08f234 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "51.50", - "log_list_timestamp": "2025-03-22T12:56:02Z", + "version": "51.51", + "log_list_timestamp": "2025-03-23T12:54:15Z", "operators": [ { "name": "Google",
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal index ab3d1ff..d6d63d4 160000 --- a/components/optimization_guide/internal +++ b/components/optimization_guide/internal
@@ -1 +1 @@ -Subproject commit ab3d1ff586a8607770bf168810386580ef20e7e9 +Subproject commit d6d63d40815a6fae96bbd81a1a417ea374791125
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 5784ea34..b33598d 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -8701,6 +8701,18 @@ อุปกรณ์ <ph name="PRODUCT_OS_NAME" /> จะใช้ช่วงเวลาเหล่านี้ตามเขตเวลาของระบบ หมายเหตุสำคัญ: การตั้งเวลาที่กำหนดโดยนโยบายนี้อาจไม่เกิดขึ้นตามที่คาดไว้หากขัดแย้งกับการตั้งค่าการจัดการพลังงานอื่นๆ เช่น <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> ตรวจสอบว่าได้กำหนดการตั้งค่าเหล่านี้เพื่อให้ช่วงเวลาการระงับที่ตั้งเวลาไว้มีผล</translation> +<translation id="7196944905905233325">เปิดใช้ผู้ให้บริการเฟรมเวิร์กการช่วยเหลือพิเศษสำหรับ<ph name="UIA_NAME" /> ใน <ph name="PRODUCT_NAME" /> เพื่อใช้เครื่องมือช่วยเหลือพิเศษ + +เรารองรับนโยบายนี้ใน <ph name="PRODUCT_NAME" /> ในช่วงเวลาการเปลี่ยนแปลง 1 ปี เพื่อให้ผู้ดูแลระบบขององค์กรสามารถควบคุมการติดตั้งใช้งานของผู้ให้บริการเฟรมเวิร์กการช่วยเหลือพิเศษสำหรับ<ph name="UIA_NAME" /> ของเบราว์เซอร์ได้ การช่วยเหลือพิเศษและเครื่องมืออื่นๆ ที่ใช้เฟรมเวิร์กการช่วยเหลือพิเศษสำหรับ<ph name="UIA_NAME" /> เพื่อทำงานร่วมกับเบราว์เซอร์อาจต้องมีการอัปเดตจึงจะทำงานกับผู้ให้บริการ<ph name="UIA_NAME" /> ของเบราว์เซอร์ได้อย่างถูกต้อง ผู้ดูแลระบบสามารถใช้นโยบายนี้เพื่อปิดใช้ผู้ให้บริการ<ph name="UIA_NAME" /> ของเบราว์เซอร์ชั่วคราว (ดังนั้นจะมีการเปลี่ยนกลับไปเป็นลักษณะการทำงานแบบเดิม) ขณะทำงานร่วมกับผู้ให้บริการเพื่ออัปเดตเครื่องมือที่ได้รับผลกระทบ + +เมื่อตั้งค่าเป็น "เท็จ" <ph name="PRODUCT_NAME" /> จะเปิดใช้เฉพาะผู้ให้บริการ <ph name="MSAA_NAME" /> การช่วยเหลือพิเศษและเครื่องมืออื่นๆ ที่ใช้เฟรมเวิร์กการช่วยเหลือพิเศษสำหรับ<ph name="UIA_NAME" /> เวอร์ชันใหม่กว่าเพื่อทำงานร่วมกับเบราว์เซอร์จะสื่อสารกับเบราว์เซอร์โดยใช้รูปแบบความเข้ากันได้ใน <ph name="MS_WIN_NAME" /> + +เมื่อตั้งค่าเป็น "จริง" <ph name="PRODUCT_NAME" /> จะเปิดใช้ผู้ให้บริการ<ph name="UIA_NAME" /> เพิ่มเติมจากผู้ให้บริการ <ph name="MSAA_NAME" /> +การช่วยเหลือพิเศษและเครื่องมืออื่นๆ ที่ใช้เฟรมเวิร์กการช่วยเหลือพิเศษสำหรับ<ph name="UIA_NAME" /> เวอร์ชันใหม่กว่าเพื่อทำงานร่วมกับเบราว์เซอร์จะสื่อสารกับเบราว์เซอร์โดยตรง + +เมื่อไม่ได้ตั้งค่า ระบบจะใช้เฟรมเวิร์กรูปแบบต่างๆ ใน <ph name="PRODUCT_NAME" /> เพื่อเปิดใช้หรือปิดใช้ผู้ให้บริการ + +การรองรับการตั้งค่านโยบายนี้จะสิ้นสุดใน <ph name="PRODUCT_NAME" /> 146</translation> <translation id="7198134478421755850">ส่วนขยาย</translation> <translation id="7199304109870655950">กำหนดค่าตัวเลือกการเข้าถึงระยะไกลในโฮสต์ Chrome Remote Desktop
diff --git a/components/strings/privacy_sandbox_strings_fa.xtb b/components/strings/privacy_sandbox_strings_fa.xtb index 3b3926d..6397e1c8 100644 --- a/components/strings/privacy_sandbox_strings_fa.xtb +++ b/components/strings/privacy_sandbox_strings_fa.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fa"> +<translation id="1045545926731898784">این سایت به گروهی از سایتها تعلق دارد که توسط <ph name="SET_OWNER" /> تعریف شدهاند و میتوانند فعالیت شما را در گروه همرسانی کنند تا به سایتها کمک کنند طبق انتظار کار کنند.</translation> <translation id="1055273091707420432">Chromium موضوعات آگهی قدیمیتر از ۴ هفته را بهطور خودکار حذف میکند.</translation> <translation id="1184166532603925201">وقتی در «حالت ناشناس» هستید، Chrome اجازه استفاده از کوکیهای طرف سوم را به سایتها نمیدهد</translation> <translation id="1297285729613779935">آگهیهای پیشنهادی سایت به محافظت از سابقه مرور و هویت شما کمک میکند و درعینحال به سایتها اجازه میدهد آگهیهای مرتبطی به شما نشان دهند. بااستفاده از فعالیت شما، مانند نحوه صرف زمان در سایتهایی که بازدید میکنید، سایتهای دیگر میتوانند آگهیهای مربوط را هنگام ادامه مرور پیشنهاد دهند. در تنظیمات میتوانید فهرستی از این سایتها ببینید و آنهایی را که نمیخواهید مسدود کنید.</translation> @@ -12,6 +13,7 @@ <translation id="1716616582630291702"><ph name="BEGIN_BOLD" />سایتها چگونه از این دادهها استفاده میکنند؟<ph name="END_BOLD" /> Chrome هنگام مرور موضوعهای موردعلاقه شما را ثبت میکند. برچسب موضوعات ازپیشتعریفشده است و شامل مواردی مانند «هنر و سرگرمی»، «خرید»، و «ورزش» میشود. بعداً سایتی که از آن بازدید میکنید میتواند برای شخصیسازی آگهیهایی که میبینید، چند موضوع شما را از Chrome درخواست کند.</translation> <translation id="1732764153129912782">میتوانید تغییرات موردنظرتان را در تنظیمات حریم خصوصی آگهی اعمال کنید.</translation> <translation id="1780659583673667574">برای مثال، اگر از سایتی برای یافتن دستور پخت غذا برای شام بازدید کنید، ممکن است آن سایت تعیین کند که به آشپزی علاقهمند هستید. در ادامه، سایت دیگری ممکن است آگهی مرتبطی را برای یک سرویس ارسال مواد غذایی که توسط سایت اول پیشنهاد شده است، به شما نمایش دهد.</translation> +<translation id="1818866261309406359">مدیریت دادههای سایتهای مرتبط در برگه جدید</translation> <translation id="1887631853265748225">بهکمک ویژگیهای حریم خصوصی آگهیها قادرید اطلاعاتی را که وب سایتها و شرکای تبلیغاتیشان میتوانند هنگام نمایش آگهیهای شخصیسازیشده درباره شما کسب کنند محدود کنید.</translation> <translation id="1954777269544683286">Google شرکتها را ملزم میکند به عموم اعلام کنند که از این دادهها برای رهگیری شما در سایتها استفاده نخواهند کرد. شرکتها مسئولند به شما اطلاع دهند چگونه از دادههایتان استفاده میکنند. <ph name="BEGIN_LINK" />در «خطمشی رازداری» ما اطلاعات بیشتری کسب کنید<ph name="END_LINK" />.</translation> <translation id="2004697686368036666">ممکن است ویژگیهای برخیاز سایتها کار نکنند</translation> @@ -67,6 +69,7 @@ <translation id="5117284457376555514">سایتها نمیتوانند از کوکیهای طرف سوم برای شخصیسازی محتوا و آگهیها و همچنین مطلع شدن از کنشهای شما در سایتهای دیگر استفاده کنند، مگر اینکه به سایتهای مربوطه اجازه دسترسی به آنها را بدهید. ممکن است برخیاز ویژگیهای سایت طبق انتظار کار نکند.</translation> <translation id="5165490319523240316">سایتها و شرکای تبلیغاتیشان میتوانند از فعالیت شما، مانند نحوه صرف زمان در سایتهایی که بازدید میکنید، برای شخصیسازی آگهیها در سایتهای دیگر استفاده کنند. برای مثال، اگر از سایتی برای یافتن دستور پخت غذا برای شام بازدید کنید، ممکن است آن سایت تعیین کند که به آشپزی علاقهمند هستید. در ادامه، سایت دیگری ممکن است آگهی مرتبطی را برای یک سرویس ارسال مواد غذایی که توسط سایت اول پیشنهاد شده است، به شما نمایش دهد.</translation> <translation id="544199055391706031">فعالیت شما یکی از موارد بسیاری است که یک سایت میتواند از آن برای پیشنهاد آگهیها استفاده کند. وقتی که گزینه نمایش آگهیهای پیشنهادی سایت خاموش باشد، سایتها همچنان میتوانند به شما آگهیهایی را نمایش دهند، اما این آگهیها ممکن است کمتر شخصیسازی شده باشند. درباره <ph name="BEGIN_LINK" />آگهیهای پیشنهادی سایت<ph name="END_LINK" /> بیشتر بدانید.</translation> +<translation id="5495405805627942351">مدیریت دادههای سایتهای مرتبط</translation> <translation id="5574580428711706114">Google شرکتها را ملزم میکند به عموم اعلام کنند که از این دادهها برای رهگیری شما در سایتها استفاده نخواهند کرد. شرکتها مسئولند به شما اطلاع دهند چگونه از دادههایتان استفاده میکنند. <ph name="BEGIN_LINK1" />در «خطمشی رازداری» ما اطلاعات بیشتری کسب کنید<ph name="LINK_END1" />.</translation> <translation id="5576983628189470385">Google شرکتها را ملزم میکند به عموم اعلام کنند که از این دادهها برای رهگیری شما در سایتها استفاده نخواهند کرد. برخی سایتها ممکن است علاوهبر شخصیسازی آگهیها، از فعالیتهای شما برای شخصیسازی موارد دیگر نیز استفاده کنند. آنها همچنین ممکن است این دادهها را با اطلاعات دیگری که ازقبل درباره شما دارند ترکیب کنند. شرکتها مسئولند به شما اطلاع دهند چگونه از دادههایتان استفاده میکنند. در «خطمشی رازداری» ما اطلاعات بیشتری کسب کنید.</translation> <translation id="5812448946879247580"><ph name="BEGIN_BOLD" />سایتها چگونه از این دادهها استفاده میکنند؟<ph name="END_BOLD" /> سایتها میتوانند اطلاعاتی از Chrome درخواست کنند که به آنها کمک میکند عملکرد آگهیهایشان را بسنجند. Chrome با محدود کردن اطلاعاتی که سایتها میتوانند با هم همرسانی کنند از حریم خصوصی شما محافظت میکند.</translation>
diff --git a/components/strings/privacy_sandbox_strings_gu.xtb b/components/strings/privacy_sandbox_strings_gu.xtb index 5cb4364..128c5a8 100644 --- a/components/strings/privacy_sandbox_strings_gu.xtb +++ b/components/strings/privacy_sandbox_strings_gu.xtb
@@ -81,6 +81,7 @@ <translation id="6710025070089118043">સાઇટ કન્ટેન્ટ અને જાહેરાતોને મનગમતી બનાવવા માટે અને તમે અન્ય સાઇટ પર કરો તે ક્રિયાઓ વિશે જાણવા માટે ત્રીજા પક્ષની કુકીનો ઉપયોગ ન કરી શકે, સિવાય કે તમે સંબંધિત સાઇટને તેમનો ઍક્સેસ આપો</translation> <translation id="6774168155917940386">કંપનીઓ માટે Googleની એ આવશ્યકતા છે કે તેઓ સાર્વજનિક રીતે એ જણાવે કે તેઓ આ ડેટાનો ઉપયોગ તમામ સાઇટ પર તમને ટ્રૅક કરવા માટે કરશે નહીં. ફક્ત જાહેરાતો કરતાં વધુ બાબતો માટે તમારા અનુભવને મનગમતો બનાવવા, કેટલીક સાઇટ તમારી ઍક્ટિવિટીનો ઉપયોગ કરી શકે છે. તેઓ તમારા વિશે પહેલેથી જ જાણતા હોય તેવી અન્ય માહિતી સાથે પણ તેને તેઓ જોડી શકે છે. કંપનીઓ તમને એ જણાવવા માટે જવાબદાર છે કે તેઓ તમારા ડેટાનો ઉપયોગ કેવી રીતે કરે છે. અમારી <ph name="BEGIN_LINK" />પ્રાઇવસી પૉલિસી<ph name="END_LINK" />માં વધુ જાણો.</translation> <translation id="6789193059040353742">તમે જુઓ છો તે જાહેરાત મનગમતી બનાવેલી છે કે નહીં તે આ સેટિંગ, <ph name="BEGIN_LINK1" />જાહેરાતના વિષયો<ph name="LINK_END1" />, તમારા <ph name="BEGIN_LINK2" />કુકીનાં સેટિંગ<ph name="LINK_END2" /> અને તમે જોઈ રહ્યાં હો તે સાઇટ જાહેરાતો મનગમતી બનાવે છે કે નહીં તે સહિતની ઘણી બાબતો પર આધારિત હોઈ શકે છે.</translation> +<translation id="7011445931908871535">ડેટા ડિલીટ કરીએ?</translation> <translation id="7084100010522077571">જાહેરાતની માપણી વિશે વધુ</translation> <translation id="7315780377187123731">ત્રીજા પક્ષની કુકીને બ્લૉક કરો વિકલ્પ વિશે વધુ</translation> <translation id="737025278945207416">ફક્ત જાહેરાતો કરતાં વધુ બાબતો માટે તમારા અનુભવને મનગમતો બનાવવા, કેટલીક સાઇટ તમારી ઍક્ટિવિટીનો ઉપયોગ કરી શકે છે. તેઓ જાહેરાતના વિષયો 4 અઠવાડિયાથી વધુ સમય માટે સ્ટોર કરી શકે છે અને તમારા વિશે પહેલેથી જાણતા હોય તેવી અન્ય માહિતી સાથે તેને જોડી શકે છે</translation> @@ -94,6 +95,7 @@ <translation id="8200078544056087897">ત્રીજા પક્ષની કુકી પર આધાર રાખતી સાઇટની સુવિધાઓ અપેક્ષા પ્રમાણે કાર્ય કરવી જોઈએ</translation> <translation id="8365690958942020052">તમે મુલાકાત લીધેલી કોઈ સાઇટ આ માહિતી માટે પૂછી શકે છે — કાં તો જાહેરાતના તમારા વિષયો અથવા તમે મુલાકાત લીધેલી સાઇટ દ્વારા સૂચવવામાં આવતી જાહેરાતો.</translation> <translation id="839994149685752920">સાઇટ કન્ટેન્ટ અને જાહેરાતોને મનગમતી બનાવવા માટે ત્રીજા પક્ષની કુકીનો ઉપયોગ કરી શકે</translation> +<translation id="8477178913400731244">ડેટા ડિલીટ કરો</translation> <translation id="859369389161884405">પ્રાઇવસી પૉલિસીને નવા ટૅબમાં ખોલે છે</translation> <translation id="877699835489047794"><ph name="BEGIN_BOLD" />તમે આ ડેટા કેવી રીતે મેનેજ કરી શકો છો?<ph name="END_BOLD" /> Chrome 4 અઠવાડિયાથી વધુ જૂના વિષયોને ઑટોમૅટિક રીતે ડિલીટ કરે છે. જેમ-જેમ તમે બ્રાઉઝ કરતા જશો, તેમ-તેમ સૂચિમાં કોઈ વિષય ફરીથી દેખાઈ શકે છે. કોઈ અન્ય સાઇટ સાથે Chrome શેર ન કરે એવું જો તમે ઇચ્છતા હો, તો તમે તેવા વિષયોને બ્લૉક પણ કરી શકો છો તેમજ કોઈપણ સમયે Chrome સેટિંગમાંથી જાહેરાતના વિષયો બંધ કરી શકો છો.</translation> <translation id="8908886019881851657"><ph name="BEGIN_BOLD" />સાઇટ આ ડેટાનો ઉપયોગ કેવી રીતે કરે છે?<ph name="END_BOLD" /> સાઇટ અને તેના જાહેરાત પાર્ટનર અન્ય સાઇટ પર જાહેરાતો મનગમતી બનાવવા માટે તમારી ઍક્ટિવિટીનો ઉપયોગ કરી શકે છે. ઉદાહરણ તરીકે, જો તમે રાત્રિ ભોજન માટેની રૅસિપિ શોધવા માટે કોઈ સાઇટની મુલાકાત લો, તો સાઇટ કદાચ એવું તારણ કાઢી શકે કે તમે કુકિંગમાં રુચિ ધરાવો છો. પછીથી, પહેલી સાઇટના સૂચન પરથી અન્ય કોઈ સાઇટ તમને કરિયાણાની ડિલિવરી માટેની સેવાને સંબંધિત કોઈ જાહેરાત બતાવે એમ બની શકે છે.</translation>
diff --git a/components/strings/privacy_sandbox_strings_sw.xtb b/components/strings/privacy_sandbox_strings_sw.xtb index a360ae5d..db5f39c 100644 --- a/components/strings/privacy_sandbox_strings_sw.xtb +++ b/components/strings/privacy_sandbox_strings_sw.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sw"> +<translation id="1045545926731898784">Tovuti hii inamilikiwa na kikundi cha tovuti, kinachobainishwa na <ph name="SET_OWNER" />, ambacho kinaweza kutuma data ya shughuli zako kwenye kikundi ili kuzisaidia tovuti zifanye kazi ipasavyo.</translation> <translation id="1055273091707420432">Chromium hufuta kiotomatiki mada za matangazo zilizohifadhiwa zaidi ya wiki 4</translation> <translation id="1184166532603925201">Ukiwa katika Hali ya kutumia faraghani, Chrome huzuia tovuti zisitumie vidakuzi vya washirika wengine</translation> <translation id="1297285729613779935">Matangazo yanayopendekezwa na tovuti husaidia kulinda historia ya kuvinjari na utambulisho wako huku yakiruhusu tovuti zikuonyeshe matangazo yanayokufaa. Kupitia shughuli zako, kama vile jinsi unavyotumia muda wako kwenye tovuti unazotembelea, tovuti zingine zinaweza kupendekeza matangazo yanayohusiana kadiri unavyoendelea kuvinjari. Unaweza kuona orodha ya tovuti hizi na kuzuia ambazo huzihitaji kwenye mipangilio.</translation> @@ -12,6 +13,7 @@ <translation id="1716616582630291702"><ph name="BEGIN_BOLD" />Tovuti hutumiaje data hii?<ph name="END_BOLD" /> Chrome hurekodi mada zinazokuvutia kadiri unavyovinjari. Lebo za mada hubainishwa mapema na hujumuisha mambo kama vile, Sanaa na Burudani, Ununuzi na Spoti. Baadaye, tovuti unayoitembelea inaweza kuiomba Chrome ili ione mada zako kadhaa ili iweke mapendeleo kwenye matangazo unayoona.</translation> <translation id="1732764153129912782">Unaweza kufanya mabadiliko kwenye mipangilio ya faragha ya matangazo</translation> <translation id="1780659583673667574">Kwa mfano, ikiwa utatembelea tovuti ili upate mapishi ya chakula cha jioni, huenda tovuti ikaamua kwamba unavutiwa na mapishi. Baadaye, tovuti nyingine inaweza kukuonyesha tangazo linalohusiana la huduma ya kukuletea bidhaa za vyakula, iliyopendekezwa na tovuti ya kwanza.</translation> +<translation id="1818866261309406359">Dhibiti data ya tovuti zinazohusiana katika kichupo kipya</translation> <translation id="1887631853265748225">Vipengele vya faragha ya matangazo husaidia kudhibiti kile ambacho tovuti na washirika wake wa utangazaji wanaweza kufahamu kukuhusu wanapokuonyesha matangazo yaliyowekewa mapendeleo.</translation> <translation id="1954777269544683286">Google inahitaji kampuni zibainishe kwa umma kuwa hazitatumia data hii kukufuatilia kwenye tovuti mbalimbali. Kampuni zina wajibu wa kukufahamisha jinsi zinatumia data yako. <ph name="BEGIN_LINK" />Pata maelezo zaidi kwenye Sera yetu ya Faragha<ph name="END_LINK" />.</translation> <translation id="2004697686368036666">Huenda vipengele kwenye baadhi ya tovuti visifanye kazi</translation> @@ -67,6 +69,7 @@ <translation id="5117284457376555514">Tovuti haziwezi kutumia vidakuzi vya washirika wengine kuweka mapendeleo kwenye matangazo na maudhui pamoja na kujifunza kuhusu vitendo unavyotekeleza kwenye tovuti nyingine, isipokuwa uruhusu vifikiwe na tovuti zinazohusiana. Huenda baadhi ya vipengele visifanye kazi inavyotarajiwa.</translation> <translation id="5165490319523240316">Tovuti na washirika wake wa utangazaji wanaweza kutumia shughuli zako, kama vile jinsi unavyotumia muda wako kwenye tovuti unazotembelea, ili kuweka mapendeleo kwenye matangazo katika tovuti zingine. Kwa mfano, ikiwa utatembelea tovuti ili upate mapishi ya chakula cha jioni, huenda tovuti ikaamua kwamba unavutiwa na mapishi. Baadaye, tovuti nyingine inaweza kukuonyesha tangazo linalohusiana la huduma ya kukuletea bidhaa za vyakula, iliyopendekezwa na tovuti ya kwanza.</translation> <translation id="544199055391706031">Shughuli zako ni mojawapo ya mambo mengi ambayo tovuti inaweza kutumia kupendekeza matangazo. Ukizima kipengele cha matangazo yanayopendekezwa na tovuti, tovuti bado zinaweza kukuonyesha matangazo lakini huenda yasikufae zaidi. Pata maelezo zaidi kuhusu <ph name="BEGIN_LINK" />matangazo yanayopendekezwa na tovuti<ph name="END_LINK" />.</translation> +<translation id="5495405805627942351">Dhibiti data ya tovuti zinazohusiana</translation> <translation id="5574580428711706114">Google inahitaji kampuni zibainishe kwa umma kuwa hazitatumia data hii kukufuatilia kwenye tovuti mbalimbali. Kampuni zina wajibu wa kukufahamisha jinsi zinatumia data yako. <ph name="BEGIN_LINK1" />Pata maelezo zaidi kwenye Sera yetu ya Faragha<ph name="LINK_END1" />.</translation> <translation id="5576983628189470385">Google inahitaji kampuni zibainishe kwa umma kuwa hazitatumia data hii kukufuatilia kwenye tovuti mbalimbali. Baadhi ya tovuti zinaweza kutumia shughuli zako kuweka mapendeleo kwenye hali yako ya utumiaji kando na kukuonyesha matangazo. Huenda pia zikazijumuisha na taarifa nyingine ambazo tayari zinafahamu kukuhusu. Kampuni zina wajibu wa kukufahamisha jinsi zinavyotumia data yako. Pata maelezo zaidi kwenye Sera yetu ya Faragha.</translation> <translation id="5812448946879247580"><ph name="BEGIN_BOLD" />Tovuti hutumiaje data hii?<ph name="END_BOLD" /> Tovuti unazotembelea zinaweza kuiomba Chrome taarifa zinazozisaidia kupima utendaji wa matangazo yazo. Chrome hulinda faragha yako kwa kudhibiti taarifa ambazo tovuti zinaweza kutumiana.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index bc48626..c34ce489a2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -1030,7 +1030,7 @@ <translation id="5482922178977937393">興味や関心に基づいてニュースやスポーツなどに関する通知を受け取りますか?</translation> <translation id="5483838506518938965">以上で完了です</translation> <translation id="5487521232677179737">データを削除</translation> -<translation id="5494920125229734069">すべて選択する</translation> +<translation id="5494920125229734069">すべて選択</translation> <translation id="5499648645977734083">お支払い方法を管理…</translation> <translation id="5501346139932663133">Google のアプリ</translation> <translation id="5506763544823940561">画像を保存…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 734d319..224d72ce 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -133,6 +133,7 @@ <translation id="1513858653616922153">ลบรหัสผ่าน</translation> <translation id="1517166097004694782">ซ่อน "ดำเนินการต่อโดยใช้แท็บนี้"</translation> <translation id="1520027731907768768">รับการแจ้งเตือนเมื่อราคาผลิตภัณฑ์ที่ติดตามต่ำลง</translation> +<translation id="1521366073263497277">ไปที่ตารางกริดของแท็บ</translation> <translation id="1521774566618522728">ใช้งานวันนี้</translation> <translation id="1524563461097350801">ไม่เป็นไร ขอบคุณ</translation> <translation id="1531038290222364269">แสดงแท็บ</translation> @@ -534,6 +535,7 @@ <translation id="3245429137663807393">หากคุณแชร์รายงานการใช้งาน Chrome ด้วย รายงานดังกล่าวจะรวม URL ที่คุณเข้าชม</translation> <translation id="3245744387817103524">บันทึกการเปลี่ยนแปลงไม่ได้</translation> <translation id="3254806613790954367">แท็บที่เปิดล่าสุดในอุปกรณ์ทั้งหมดของคุณ</translation> +<translation id="325717987950204592">แตะ "ความเป็นส่วนตัวและความปลอดภัย"</translation> <translation id="3272527697863656322">ยกเลิก</translation> <translation id="3273510436356991673">ปรับแต่งหน้าจอหลัก</translation> <translation id="3277021493514034324">คัดลอกที่อยู่เว็บไซต์แล้ว</translation> @@ -567,6 +569,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> นาที</translation> <translation id="344589138074534176">ดูข้อมูลเพิ่มเติมเกี่ยวกับ Google Lens</translation> <translation id="3447332786336558089">เมื่อออกจากระบบแล้ว ระบบจะปิดแท็บและลบข้อมูลบัญชีที่ไม่ได้บันทึกออกจากอุปกรณ์เครื่องนี้ ซึ่งอาจรวมถึงรหัสผ่าน ประวัติการเข้าชม และอื่นๆ</translation> +<translation id="3449029510150690417">สร้างกลุ่มแท็บใหม่โดยตั้งชื่อและสีให้กลุ่มแท็บ</translation> <translation id="345348365500626747">พบที่อยู่</translation> <translation id="3464194322481586217">ติดตามราคาไม่ได้</translation> <translation id="3469117812148449995">ตัวเลือกในการบันทึกรหัสผ่าน</translation> @@ -648,6 +651,7 @@ <translation id="3838691874161539578">ตรวจสอบรหัสผ่านที่บันทึกไว้เพื่อเสริมความปลอดภัยในโลกออนไลน์ให้มากยิ่งขึ้น</translation> <translation id="3838985624086228724">ราคาต่ำลงในผลิตภัณฑ์ที่ติดตาม จาก <ph name="PREVIOUS_PRICE" /> เป็น <ph name="PRICE" />, <ph name="PRODUCT_NAME" />, <ph name="DOMAIN" /></translation> <translation id="385051799172605136">กลับ</translation> +<translation id="3850952228519377137">ซ่อน "ติดตามราคาจากแท็บ"</translation> <translation id="3851938967634752633">ระบบจะลบรหัสผ่านสําหรับ <ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" /> และอีก <ph name="NUMBER_OF_ACCOUNTS" /> บัญชี โดยระบบจะไม่ลบบัญชีของคุณ</translation> <translation id="3858860766373142691">ชื่อ</translation> <translation id="3868495844258915202">แสดง URL แบบเต็ม</translation> @@ -1129,6 +1133,7 @@ <translation id="5860491529813859533">เปิด</translation> <translation id="5868644772996939262">ป้อนรหัสผ่านและพาสคีย์อัตโนมัติ</translation> <translation id="5869522115854928033">รหัสผ่านที่บันทึกไว้</translation> +<translation id="5873179562631407582">แตะแท็บที่เปิดอยู่ค้างไว้</translation> <translation id="5878899964490256268"><ph name="EMAIL" /> จัดการโดยองค์กรของคุณ</translation> <translation id="5888889603768021126">ลงชื่อเข้าใช้ด้วย</translation> <translation id="5889333064153755823">ลบข้อมูลการท่องเว็บ</translation> @@ -1314,6 +1319,7 @@ <translation id="6583087784430677195">หากต้องการปิด ให้เปิด<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" />แล้วไปที่ "ป้อนรหัสผ่านอัตโนมัติ"</translation> <translation id="6585048665672348661">ลบข้อมูลการท่องเว็บ…</translation> <translation id="6585618849026997638">กลับไปยังหน้าเว็บที่สำคัญสำหรับคุณได้โดยการเพิ่มบุ๊กมาร์ก</translation> +<translation id="659407965921887085">การ์ดนี้แสดงราคาต่ำลงบนเว็บสำหรับผลิตภัณฑ์ที่คุณกำลังติดตามอยู่</translation> <translation id="6596481460663245319">ค้นหารูปภาพด้วย Google</translation> <translation id="6598432073497341323">{COUNT,plural, =1{รหัสผ่าน 1 รายการ}other{รหัสผ่าน # รายการ}}</translation> <translation id="6601302169302852717">บันทึกรูปภาพสำหรับ <ph name="USER_EMAIL" /> ไว้ใน Google Photos แล้ว</translation> @@ -1351,6 +1357,7 @@ <translation id="6680416467695217368">ปรับแต่งเมนู</translation> <translation id="6681586159478273915">ค้นหาด้วยเสียง</translation> <translation id="6681791404926413601">{count,plural, =1{ตัวเลือกวิธีการชำระเงิน {count} รายการพร้อมให้ใช้งานอยู่เหนือแป้นพิมพ์}other{ตัวเลือกวิธีการชำระเงิน {count} รายการพร้อมให้ใช้งานอยู่เหนือแป้นพิมพ์}}</translation> +<translation id="6684262542644248484">ลงชื่อเข้าใช้เว็บไซต์</translation> <translation id="6685259053455152195">ทางลัดเพื่อแก้ไขการตั้งค่าและใช้ฟีเจอร์ต่างๆ จากแถบที่อยู่ได้อย่างรวดเร็ว</translation> <translation id="6689685206615181381">ใช้ได้เฉพาะโหมดไม่ระบุตัวตน</translation> <translation id="6708501134077648845">ตัวเลือกรหัสผ่าน</translation> @@ -1369,6 +1376,7 @@ <translation id="6761393919622941301">เสียง</translation> <translation id="6779455296366983087">ข้อมูลการท่องเว็บจะถูกลบ</translation> <translation id="6790502149545262384">เร็วๆ นี้คุณจะเห็นเรื่องราวจาก <ph name="CHANNEL_NAME" /> เมื่อเปิดแท็บใหม่</translation> +<translation id="6791425686608802741">แตะ "เพิ่มแท็บไปยังกลุ่มใหม่"</translation> <translation id="6794476726485507147">เลือกวันที่และเวลาที่จะรับการแจ้งเตือนเกี่ยวกับการช่วยเตือนให้กลับมาดูหน้านี้</translation> <translation id="6807287147325542056">รหัสผ่านในแอปอื่นๆ</translation> <translation id="681368974849482173">สร้างรายการแล้ว</translation> @@ -1556,6 +1564,7 @@ <translation id="7646772052135772216">การซิงค์รหัสผ่านไม่ทำงาน</translation> <translation id="764827086632467055">แตะแอปเบราว์เซอร์เริ่มต้น</translation> <translation id="7649070708921625228">ความช่วยเหลือ</translation> +<translation id="765631330137769217">แตะ "บันทึก" เพื่อเข้าถึงรหัสผ่านนี้ได้อย่างง่ายดายเมื่อลงชื่อเข้าใช้ครั้งถัดไป</translation> <translation id="7658239707568436148">ยกเลิก</translation> <translation id="7662316065255305764">ข้อมูลเว็บไซต์</translation> <translation id="7665369617277396874">เพิ่มบัญชี</translation> @@ -1725,6 +1734,7 @@ <translation id="8307481894409578819">อัปโหลดไฟล์นี้ไม่ได้</translation> <translation id="8319076807703933069">ค้นหาใหม่</translation> <translation id="8320212361750431956">กิจกรรมล่าสุด</translation> +<translation id="8325455175867928593">ซ่อน "รีวิวที่อิงตามความสนใจของคุณ"</translation> <translation id="833647236762414178">สร้าง บันทึก และจัดการรหัสผ่านและพาสคีย์เพื่อให้ลงชื่อเข้าใช้เว็บไซต์และแอปได้โดยง่าย <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation> <translation id="8343993175958086504">สำรองข้อมูลและใช้ในอุปกรณ์เครื่องใดก็ได้</translation> <translation id="8349305172487531364">แถบบุ๊กมาร์ก</translation>
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 index aec858c..89c12ada 100644 --- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -d8fef7e166c9cfc36d48a308837495e3afd23320 \ No newline at end of file +fad1940318b3ed11779277f4d3faae3c8b656bff \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1 index 7ece51d..8045433c 100644 --- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@ -7fe44cd96e4b69c0be8d79b8961146af27280d56 \ No newline at end of file +e02ce3807f378a0388d66db277c75202473bff00 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 index 6b78834..c2d8e36 100644 --- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -05ac72afdf8a639f108c789024d2940405c5bc00 \ No newline at end of file +11c7f64f7ceb8d88914e6600190d5f92a694ce3c \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1 index 945de22..0a1c976 100644 --- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@ -c68423adbf136aaff3e3721a3aff433fa1a4a5cc \ No newline at end of file +8815e036782ef91726586e6e159f76b7e77b331d \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 index d6b882b..989ff12a 100644 --- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -3a09a18516039c01d5fce635d6eefaf486bf0189 \ No newline at end of file +de8754e3b13303f03bdcbbfa8b89bf0e52f2e9e2 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1 index bca7e64..db19665 100644 --- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@ -02cfd2dd73dc164dae5c1b6cabaa94cc123da07a \ No newline at end of file +7e8075ffeb51d2bf814964ac02715de36eed96ed \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 index fd3bfb88..cf167a7 100644 --- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -9ac899341f4a44702e0ffb1c7c9c38b956c66149 \ No newline at end of file +fd971efe65e613337b6caec3df007a9ab24e96cf \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1 index bacb027..3e4760b 100644 --- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@ -5d37f0072bb9526e376331e7e24a16837b762aa0 \ No newline at end of file +bd213cd78616133bcd1974fa4f89c4c1e376fbae \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 index 1535425..4104a17 100644 --- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -9821ff5dc0f80f148d459b489bb36a65efb985df \ No newline at end of file +ef3de3c60a526d19bcb8aa1f5e6d01c9aa9e5738 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1 index 02ecb29..46a539f9 100644 --- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@ -e7e5af96d3825d6d9de635963e458685995d0bb5 \ No newline at end of file +4a212576a6e55a787bdb844c4915b75a0c82e278 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 5e962022..ec00abb 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -adbae5624f764e1a9405659e10251d18774ae44d \ No newline at end of file +b36b24f786c2a7227daccde24c8e1ed440e52b05 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1 index ee502942..7661b65 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@ -96d791780b6d13b9403c316ba46e02e3d43cff32 \ No newline at end of file +4f77761c7bc133d76867d94768c8213226d6f5d9 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index f02e37c..84a67043 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -e9805176f6929616bfac5b71e53b2b04b7bbb87c \ No newline at end of file +4d2cc94e146b538ac295db1c47796965eb938125 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1 index 93410c9e..30d4d1a8 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@ -b5852cbd4dd9041df8480b3d8c934a2496b0c5b5 \ No newline at end of file +3230bc2eaf65c43fd8a36b3047afc119a7c5f0db \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index 694c0ab8..ec2df1b7 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -19c6e16120c3edef3d1f01a9563794a1adadc155 \ No newline at end of file +d816f447faa03032d2d498fd6fa195feb3b4b8c9 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1 index 2c75cce..5574ac34 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@ -2332eb42f41e3055bf1416263cbfd2ef38e11d18 \ No newline at end of file +72cfa15be84179e76fe1de964fd072c83f61051c \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index ae7e2253..67613a0 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -d794e0e1e66822d6d929d2869de60eb307d4c29a \ No newline at end of file +53e93a794752237e2fd638909fe3b006e3a47b0f \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1 index c56809f..c78783c 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@ -2b786de870827deaa5267dc7b39bd5f40393e5f3 \ No newline at end of file +52e2f73002849696ce85ddd7869e848ec9247f88 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 index fbcd40d3..d7a2f3b9 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -bf6dd5dcd090c29926d831894df9de150bea666e \ No newline at end of file +d81d572a8fb2d3f82c6d020935b5dcd65ce74248 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 index bbf64989..6b2bcb9 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -61129d911a67174b69697bc116662b269c28b700 \ No newline at end of file +468ba152563f492ef3a404e153eef6327188504f \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index c5a9489..7b11de9 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -e38dcef7d7e164de3e785d0add7e0f8e627a2a78 \ No newline at end of file +5b9057c0ba19353d145d2d6f38cdfa2c81bec77e \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1 index 40ac4bf0..e97275d 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@ -f9974ecd2d7062323c5079db6cee91df81b3101d \ No newline at end of file +023519d92fc398db57b2f880652d122675620b8c \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index fda276b..e738c4f 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -237f898857a44e26d7dd247f342fb21598262dc7 \ No newline at end of file +2a446537be9de537783d5648ac4d78028f50cf98 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1 index bc19895..8d01df60 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@ -01f2b2a6f049438111e6ed6e1ee1bf38f3f55f45 \ No newline at end of file +08061d3832e98c5065bc50a28fe7bf39fdbdd919 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index ab9638a..97d033b7 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -076bdac74aa0a7ecdc18663ffd74d7ad1d04f92d \ No newline at end of file +9ff9fddb9119946dd2a48c5c5b86cb1312e61ebe \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1 index e0b1274d..8640572 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@ -64fd2b80196163e5bdcf799a8ef62329ea68d70f \ No newline at end of file +7fc8d74805355454a411317c02720712e084078c \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index e0f0af59..c08f3733 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -44ec96e4b96e38a5a547fe29f317c76fa4801b3f \ No newline at end of file +b729a68bcd8ff33c8ebb36e0fa00f6fd7ea376cd \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1 index 9490efc..bb6c568f 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@ -26c1c7ce3e88b9cd553f1ee42c3ed7c681f1b7c7 \ No newline at end of file +4b5544b37725f1f03faa433aa310b4c0a97e81bc \ No newline at end of file
diff --git a/ios_internal b/ios_internal index 0bf543d..4bb036a 160000 --- a/ios_internal +++ b/ios_internal
@@ -1 +1 @@ -Subproject commit 0bf543ddfc682a16bdb1927324e62064148f8d91 +Subproject commit 4bb036a8d48c481cf171749c9ed5708e858526ad
diff --git a/remoting/resources/remoting_strings_th.xtb b/remoting/resources/remoting_strings_th.xtb index 32d015b..b954b12 100644 --- a/remoting/resources/remoting_strings_th.xtb +++ b/remoting/resources/remoting_strings_th.xtb
@@ -40,6 +40,7 @@ <translation id="2758123043070977469">มีปัญหาในการตรวจสอบสิทธิ์ โปรดเข้าสู่ระบบอีกครั้ง</translation> <translation id="2803375539583399270">ป้อน PIN</translation> <translation id="2919669478609886916">ขณะนี้คุณกำลังแชร์คอมพิวเตอร์เครื่องนี้กับผู้ใช้อื่น คุณต้องการแชร์ต่อไปหรือไม่</translation> +<translation id="2929683002824598593">แชร์อุปกรณ์</translation> <translation id="2939145106548231838">ตรวจสอบสิทธิ์ตามที่โฮสต์กำหนด</translation> <translation id="3027681561976217984">โหมดสัมผัส</translation> <translation id="3106379468611574572">คอมพิวเตอร์ระยะไกลไม่ตอบสนองคำขอการเชื่อมต่อ โปรดตรวจยืนยันว่าคอมพิวเตอร์ดังกล่าวออนไลน์อยู่และลองอีกครั้ง</translation> @@ -117,10 +118,12 @@ <translation id="6178645564515549384">โฮสต์การรับส่งข้อความดั้งเดิมสำหรับการสนับสนุนระยะไกล</translation> <translation id="618120821413932081">อัปเดตความละเอียดของเดสก์ท็อประยะไกลให้พอดีกับหน้าต่าง</translation> <translation id="6223301979382383752">เปิดค่ากำหนดการบันทึกหน้าจอ</translation> +<translation id="6252344563748670011"><ph name="CLIENT_USERNAME" /> ขอสิทธิ์เข้าถึงเพื่อดูหน้าจอ รวมถึงควบคุมแป้นพิมพ์และเมาส์ของคุณ คุณต้องการแชร์อุปกรณ์ไหม</translation> <translation id="6284412385303060032">โฮสต์ที่ทำงานที่หน้าจอตรรกะของคอนโซลได้ปิดตัวลงเพื่อสนับสนุนโหมด Curtain โดยการเปลี่ยนไปเป็นโฮสต์ที่ทำงานในเซสชันเฉพาะผู้ใช้</translation> <translation id="6542902059648396432">รายงานปัญหา…</translation> <translation id="6583902294974160967">การสนับสนุน</translation> <translation id="6612717000975622067">ส่ง Ctrl-Alt-Del</translation> +<translation id="6625262630437221505">{0,plural, =1{หากคุณไม่ดำเนินการใดๆ อุปกรณ์จะเริ่มแชร์โดยอัตโนมัติในอีก # วินาที}other{หากคุณไม่ดำเนินการใดๆ อุปกรณ์จะเริ่มแชร์โดยอัตโนมัติในอีก # วินาที}}</translation> <translation id="6654753848497929428">แชร์</translation> <translation id="677755392401385740">โฮสต์เริ่มใช้งานสำหรับผู้ใช้: <ph name="HOST_USERNAME" /></translation> <translation id="6902524959760471898">แอปพลิเคชันตัวช่วยที่จะเปิด URL ในไคลเอ็นต์ของ <ph name="PRODUCT_NAME" /></translation>
diff --git a/services/network/public/cpp/permissions_policy/permissions_policy.cc b/services/network/public/cpp/permissions_policy/permissions_policy.cc index 81c2e72a..5714937 100644 --- a/services/network/public/cpp/permissions_policy/permissions_policy.cc +++ b/services/network/public/cpp/permissions_policy/permissions_policy.cc
@@ -397,13 +397,13 @@ return std::nullopt; } -std::optional<std::string> PermissionsPolicy::GetEndpointForFeature( +std::string PermissionsPolicy::GetEndpointForFeature( network::mojom::PermissionsPolicyFeature feature) const { auto endpoint = reporting_endpoints_.find(feature); if (endpoint != reporting_endpoints_.end()) { return endpoint->second; } - return std::nullopt; + return std::string(); } // static
diff --git a/services/network/public/cpp/permissions_policy/permissions_policy.h b/services/network/public/cpp/permissions_policy/permissions_policy.h index 437f50d..df2b17ae 100644 --- a/services/network/public/cpp/permissions_policy/permissions_policy.h +++ b/services/network/public/cpp/permissions_policy/permissions_policy.h
@@ -265,7 +265,8 @@ std::optional<const Allowlist> GetAllowlistForFeatureIfExists( network::mojom::PermissionsPolicyFeature feature) const; - std::optional<std::string> GetEndpointForFeature( + // Returns empty string when there is no reporting endpoint. + std::string GetEndpointForFeature( network::mojom::PermissionsPolicyFeature feature) const; // Returns a new permissions policy, based on this policy and a client hint
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.h b/third_party/blink/renderer/core/execution_context/execution_context.h index 68de4ed..b18ddc8 100644 --- a/third_party/blink/renderer/core/execution_context/execution_context.h +++ b/third_party/blink/renderer/core/execution_context/execution_context.h
@@ -376,12 +376,12 @@ virtual void ReportPermissionsPolicyViolation( network::mojom::PermissionsPolicyFeature, mojom::blink::PolicyDisposition, - const std::optional<String>& reporting_endpoint, + const String& reporting_endpoint, const String& message = g_empty_string) const {} virtual void ReportPotentialPermissionsPolicyViolation( network::mojom::PermissionsPolicyFeature, mojom::blink::PolicyDisposition, - const std::optional<String>& reporting_endpoint, + const String& reporting_endpoint, const String& message = g_empty_string, const String& allow_attribute = g_empty_string, const String& src_attribute = g_empty_string) const {}
diff --git a/third_party/blink/renderer/core/execution_context/security_context.cc b/third_party/blink/renderer/core/execution_context/security_context.cc index 1b882b3..5cd5e22 100644 --- a/third_party/blink/renderer/core/execution_context/security_context.cc +++ b/third_party/blink/renderer/core/execution_context/security_context.cc
@@ -197,15 +197,13 @@ bool should_report = !permissions_policy_result || !report_only_permissions_policy_result; - std::optional<String> reporting_endpoint; + String reporting_endpoint; if (!permissions_policy_result) { - reporting_endpoint = std::optional<String>( - permissions_policy_->GetEndpointForFeature(feature)); + reporting_endpoint = + String::FromUTF8(permissions_policy_->GetEndpointForFeature(feature)); } else if (!report_only_permissions_policy_result) { - reporting_endpoint = std::optional<String>( + reporting_endpoint = String::FromUTF8( report_only_permissions_policy_->GetEndpointForFeature(feature)); - } else { - reporting_endpoint = std::nullopt; } return {permissions_policy_result, should_report, reporting_endpoint}; @@ -228,7 +226,7 @@ !report_only_document_policy_ || report_only_document_policy_->IsFeatureEnabled(feature, threshold_value); return {policy_result, !policy_result || !report_only_policy_result, - std::nullopt}; + String()}; } } // namespace blink
diff --git a/third_party/blink/renderer/core/execution_context/security_context.h b/third_party/blink/renderer/core/execution_context/security_context.h index 51d7bfb1..58eca04 100644 --- a/third_party/blink/renderer/core/execution_context/security_context.h +++ b/third_party/blink/renderer/core/execution_context/security_context.h
@@ -161,9 +161,9 @@ // Whether a report should be sent (to Reporting API, ReportingObservers, // and the console). bool should_report; - // Where a report should be sent, if one should be. nullopt if no reporting - // is configured for this feature. - std::optional<String> reporting_endpoint; + // Where a report should be sent, if one should be. empty if no + // reporting is configured for this feature. + String reporting_endpoint; }; // Permissions Policy
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc index f4c1836..f4a1ed78 100644 --- a/third_party/blink/renderer/core/frame/local_dom_window.cc +++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -605,7 +605,7 @@ void LocalDOMWindow::ReportPermissionsPolicyViolation( network::mojom::PermissionsPolicyFeature feature, mojom::blink::PolicyDisposition disposition, - const std::optional<String>& reporting_endpoint, + const String& reporting_endpoint, const String& message) const { if (disposition == mojom::blink::PolicyDisposition::kEnforce) { const_cast<LocalDOMWindow*>(this)->CountPermissionsPolicyUsage( @@ -633,8 +633,8 @@ // Send the permissions policy violation report to the specified endpoint, // if one exists, as well as any ReportingObservers. - if (reporting_endpoint) { - ReportingContext::From(this)->QueueReport(report, {*reporting_endpoint}); + if (!reporting_endpoint.empty()) { + ReportingContext::From(this)->QueueReport(report, {reporting_endpoint}); } else { ReportingContext::From(this)->QueueReport(report); } @@ -650,7 +650,7 @@ void LocalDOMWindow::ReportPotentialPermissionsPolicyViolation( network::mojom::PermissionsPolicyFeature feature, mojom::blink::PolicyDisposition disposition, - const std::optional<String>& reporting_endpoint, + const String& reporting_endpoint, const String& message, const String& allow_attribute, const String& src_attribute) const { @@ -674,8 +674,8 @@ // Send the potential permissions policy violation report to the specified // endpoint if one exists, as well as any ReportingObservers. - if (reporting_endpoint) { - ReportingContext::From(this)->QueueReport(report, {*reporting_endpoint}); + if (!reporting_endpoint.empty()) { + ReportingContext::From(this)->QueueReport(report, {reporting_endpoint}); } else { ReportingContext::From(this)->QueueReport(report); }
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.h b/third_party/blink/renderer/core/frame/local_dom_window.h index b408283..615d185 100644 --- a/third_party/blink/renderer/core/frame/local_dom_window.h +++ b/third_party/blink/renderer/core/frame/local_dom_window.h
@@ -194,12 +194,12 @@ void ReportPermissionsPolicyViolation( network::mojom::PermissionsPolicyFeature, mojom::blink::PolicyDisposition, - const std::optional<String>& reporting_endpoint, + const String& reporting_endpoint, const String& message = g_empty_string) const final; void ReportPotentialPermissionsPolicyViolation( network::mojom::PermissionsPolicyFeature, mojom::blink::PolicyDisposition, - const std::optional<String>& reporting_endpoint, + const String& reporting_endpoint, const String& message = g_empty_string, const String& allow_attribute = g_empty_string, const String& src_attribute = g_empty_string) const final;
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.cc b/third_party/blink/renderer/core/html/html_iframe_element.cc index f112d335..4941d03 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.cc +++ b/third_party/blink/renderer/core/html/html_iframe_element.cc
@@ -680,8 +680,8 @@ permissions_policy && !network::PermissionsPolicy::InheritedValueForFeature( src, permissions_policy, feature_desc, container_policy)) { - auto endpoint = std::optional<String>( - permissions_policy->GetEndpointForFeature(feature)); + auto endpoint = + String::FromUTF8(permissions_policy->GetEndpointForFeature(feature)); GetExecutionContext()->ReportPotentialPermissionsPolicyViolation( feature, mojom::blink::PolicyDisposition::kEnforce, endpoint, /*message*/ "", allow_, src_); @@ -691,8 +691,8 @@ !network::PermissionsPolicy::InheritedValueForFeature( src, report_only_permissions_policy, feature_desc, container_policy)) { - auto endpoint = std::optional<String>( - report_only_permissions_policy->GetEndpointForFeature(feature)); + auto endpoint = + String::FromUTF8(permissions_policy->GetEndpointForFeature(feature)); GetExecutionContext()->ReportPotentialPermissionsPolicyViolation( feature, mojom::blink::PolicyDisposition::kReport, endpoint, /*message*/ "", allow_, src_);
diff --git a/third_party/blink/renderer/core/permissions_policy/permissions_policy_devtools_support_test.cc b/third_party/blink/renderer/core/permissions_policy/permissions_policy_devtools_support_test.cc index bf615ba..958cb042 100644 --- a/third_party/blink/renderer/core/permissions_policy/permissions_policy_devtools_support_test.cc +++ b/third_party/blink/renderer/core/permissions_policy/permissions_policy_devtools_support_test.cc
@@ -266,7 +266,7 @@ network::mojom::PermissionsPolicyFeature::kFullscreen); EXPECT_TRUE(status.enabled); EXPECT_FALSE(status.should_report); - EXPECT_EQ(status.reporting_endpoint, std::nullopt); + EXPECT_EQ(status.reporting_endpoint, String()); status = MainFrame() .GetFrame() @@ -276,7 +276,7 @@ network::mojom::PermissionsPolicyFeature::kFullscreen); EXPECT_TRUE(status.enabled); EXPECT_FALSE(status.should_report); - EXPECT_EQ(status.reporting_endpoint, std::nullopt); + EXPECT_EQ(status.reporting_endpoint, String()); status = MainFrame() .GetFrame() @@ -287,7 +287,7 @@ network::mojom::PermissionsPolicyFeature::kFullscreen); EXPECT_TRUE(status.enabled); EXPECT_FALSE(status.should_report); - EXPECT_EQ(status.reporting_endpoint, std::nullopt); + EXPECT_EQ(status.reporting_endpoint, String()); EXPECT_EQ(locator, std::nullopt); }
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index a5d08e8..71b2301 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -7448,9 +7448,6 @@ # Gardener 2023-07-26 crbug.com/1364187 http/tests/misc/scroll-cross-origin-iframes.html [ Failure Pass ] -# Gardener 2023-07-27 -crbug.com/1468169 external/wpt/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html [ Failure Pass ] - # Gardener 2023-07-31 crbug.com/1468996 fast/events/touch/gesture/gesture-tap-active-state.html [ Failure Pass ] # flaky crbug.com/1468996 fast/events/touch/gesture/gesture-tap-active-state-hidden-iframe.html [ Failure Pass ] # flaky
diff --git a/third_party/blink/web_tests/TestLists/content_shell.filter b/third_party/blink/web_tests/TestLists/content_shell.filter index c1358727..5b0a81d 100644 --- a/third_party/blink/web_tests/TestLists/content_shell.filter +++ b/third_party/blink/web_tests/TestLists/content_shell.filter
@@ -561,66 +561,13 @@ external/wpt/html/browsers/the-window-object/open-close/open-features-non-integer-innerwidth.html external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization* external/wpt/html/browsers/the-window-object/window-open-popup-behavior.html -external/wpt/html/canvas/element/compositing/2d.composite.grid.filter.no_shadow.drawImage.html -external/wpt/html/canvas/element/compositing/2d.composite.grid.filter.no_shadow.fillRect.html -external/wpt/html/canvas/element/compositing/2d.composite.grid.filter.no_shadow.pattern.html -external/wpt/html/canvas/element/compositing/2d.composite.grid.filter.shadow.drawImage.html -external/wpt/html/canvas/element/compositing/2d.composite.grid.filter.shadow.fillRect.html -external/wpt/html/canvas/element/compositing/2d.composite.grid.filter.shadow.pattern.html -external/wpt/html/canvas/element/compositing/2d.composite.grid.no_filter.no_shadow.drawImage.html -external/wpt/html/canvas/element/compositing/2d.composite.grid.no_filter.no_shadow.fillRect.html -external/wpt/html/canvas/element/compositing/2d.composite.grid.no_filter.no_shadow.pattern.html -external/wpt/html/canvas/element/compositing/2d.composite.grid.no_filter.shadow.drawImage.html -external/wpt/html/canvas/element/compositing/2d.composite.grid.no_filter.shadow.fillRect.html -external/wpt/html/canvas/element/compositing/2d.composite.grid.no_filter.shadow.pattern.html external/wpt/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html -external/wpt/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.html external/wpt/html/canvas/element/filters/2d.filter.layers.dropShadow.tentative.html -external/wpt/html/canvas/element/filters/2d.filter.layers.gaussianBlur.tentative.html -external/wpt/html/canvas/element/manual/fill-and-stroke-styles/canvas_colorsandstyles_createlineargradient_001.htm external/wpt/html/canvas/element/manual/filters/svg-filter-lh-rlh.html -external/wpt/html/canvas/element/manual/filters/tentative/canvas-filter-object-turbulence.html -external/wpt/html/canvas/element/text/direction-inherit-rtl.html -external/wpt/html/canvas/element/text/direction-rtl.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.filter.no_shadow.drawImage.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.filter.no_shadow.drawImage.w.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.filter.no_shadow.fillRect.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.filter.no_shadow.fillRect.w.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.filter.no_shadow.pattern.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.filter.no_shadow.pattern.w.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.filter.shadow.drawImage.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.filter.shadow.drawImage.w.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.filter.shadow.fillRect.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.filter.shadow.fillRect.w.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.filter.shadow.pattern.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.filter.shadow.pattern.w.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.no_filter.no_shadow.drawImage.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.no_filter.no_shadow.drawImage.w.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.no_filter.no_shadow.fillRect.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.no_filter.no_shadow.fillRect.w.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.no_filter.no_shadow.pattern.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.no_filter.no_shadow.pattern.w.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.no_filter.shadow.drawImage.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.no_filter.shadow.drawImage.w.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.no_filter.shadow.fillRect.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.no_filter.shadow.fillRect.w.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.no_filter.shadow.pattern.html -external/wpt/html/canvas/offscreen/compositing/2d.composite.grid.no_filter.shadow.pattern.w.html external/wpt/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html external/wpt/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html -external/wpt/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.html -external/wpt/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.w.html external/wpt/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.tentative.html external/wpt/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.tentative.w.html -external/wpt/html/canvas/offscreen/filters/2d.filter.layers.gaussianBlur.tentative.html -external/wpt/html/canvas/offscreen/filters/2d.filter.layers.gaussianBlur.tentative.w.html -external/wpt/html/canvas/offscreen/manual/filter/offscreencanvas.filter.w.html -external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.getcontext.html -external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.getcontext.worker.html -external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.resize.html -external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html -external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html -external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.w.html external/wpt/html/cross-origin-embedder-policy/credentialless/service-worker.https.window.html external/wpt/html/cross-origin-embedder-policy/reflection-require-corp.tentative.https.any.* external/wpt/html/cross-origin-embedder-policy/shared-workers.https.html
diff --git a/third_party/dawn b/third_party/dawn index 62e0e50..c6ac86e 160000 --- a/third_party/dawn +++ b/third_party/dawn
@@ -1 +1 @@ -Subproject commit 62e0e50822042e394fdcc9206d4c83a22f442b1c +Subproject commit c6ac86ef3ddb8c945f00aebcdc6ef0c5a53161fd
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index 1aa930d..7633ebb 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit 1aa930db260d7c3c77e0f60faa2bf2dbce0f057c +Subproject commit 7633ebbe50bbc7cd261df46b9b1ecf11cc76723a
diff --git a/third_party/skia b/third_party/skia index ca97f22..d6f07ec 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit ca97f221e74329f4254872c518b49217678b8a3b +Subproject commit d6f07ec0bc1a89eea0ff3417849d0ae17a05673b
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps index 7d7f6e8..5ad52bb 160000 --- a/third_party/vulkan-deps +++ b/third_party/vulkan-deps
@@ -1 +1 @@ -Subproject commit 7d7f6e8bdba2335d5f55218ae404025cf67a97af +Subproject commit 5ad52bb056fea9fa54842b5377652ef75e77b0cd
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src index fb1e5dd..38fdfde 160000 --- a/third_party/vulkan-validation-layers/src +++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@ -Subproject commit fb1e5dd1f552e41770720679f1b7aaf37e546b9c +Subproject commit 38fdfde70d967e5ae719269a7ec91348a513cc16
diff --git a/third_party/webrtc b/third_party/webrtc index b906bbb..7afa8f6 160000 --- a/third_party/webrtc +++ b/third_party/webrtc
@@ -1 +1 @@ -Subproject commit b906bbbcd5f5d7c6953979d937a5a0ff5824e05e +Subproject commit 7afa8f6c8335d8f1db051ab3e2f1241e61551954
diff --git a/ui/android/java/src/org/chromium/ui/DropdownAdapter.java b/ui/android/java/src/org/chromium/ui/DropdownAdapter.java index 7baf958..684173857 100644 --- a/ui/android/java/src/org/chromium/ui/DropdownAdapter.java +++ b/ui/android/java/src/org/chromium/ui/DropdownAdapter.java
@@ -22,7 +22,6 @@ import androidx.appcompat.content.res.AppCompatResources; import androidx.core.view.MarginLayoutParamsCompat; -import androidx.core.view.ViewCompat; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; @@ -36,7 +35,6 @@ private final Context mContext; private final @Nullable Set<Integer> mSeparators; private final boolean mAreAllItemsEnabled; - private final int mLabelMargin; /** * Creates an {@code ArrayAdapter} with specified parameters. @@ -53,8 +51,6 @@ addAll(items); mSeparators = separators; mAreAllItemsEnabled = checkAreAllItemsEnabled(); - mLabelMargin = - context.getResources().getDimensionPixelSize(R.dimen.dropdown_item_label_margin); } private boolean checkAreAllItemsEnabled() { @@ -106,21 +102,13 @@ // it doesn't regress. // http://crbug.com/429364 LinearLayout wrapper = (LinearLayout) layout.findViewById(R.id.dropdown_label_wrapper); - if (item.isMultilineLabel()) height = LayoutParams.WRAP_CONTENT; wrapper.setOrientation(LinearLayout.VERTICAL); wrapper.setLayoutParams(new LinearLayout.LayoutParams(0, height, 1)); // Layout of the main label view. TextView labelView = (TextView) layout.findViewById(R.id.dropdown_label); labelView.setText(item.getLabel()); - labelView.setSingleLine(!item.isMultilineLabel()); - if (item.isMultilineLabel()) { - // If there is a multiline label, we add extra padding at the top and bottom because - // WRAP_CONTENT, defined above for multiline labels, leaves none. - int existingStart = ViewCompat.getPaddingStart(labelView); - int existingEnd = ViewCompat.getPaddingEnd(labelView); - labelView.setPaddingRelative(existingStart, mLabelMargin, existingEnd, mLabelMargin); - } + labelView.setSingleLine(true); labelView.setEnabled(item.isEnabled()); if (item.isGroupHeader()) {
diff --git a/ui/android/java/src/org/chromium/ui/DropdownItem.java b/ui/android/java/src/org/chromium/ui/DropdownItem.java index 42ca168..a3ad1491 100644 --- a/ui/android/java/src/org/chromium/ui/DropdownItem.java +++ b/ui/android/java/src/org/chromium/ui/DropdownItem.java
@@ -63,9 +63,6 @@ /** Returns true if the item should be a group header in the dropdown. */ boolean isGroupHeader(); - /** Returns whether the label should be displayed over multiple lines. */ - boolean isMultilineLabel(); - /** Returns resource ID of label's font color. */ int getLabelFontColorResId();
diff --git a/ui/android/java/src/org/chromium/ui/DropdownItemBase.java b/ui/android/java/src/org/chromium/ui/DropdownItemBase.java index 51201a97..6ec6a63 100644 --- a/ui/android/java/src/org/chromium/ui/DropdownItemBase.java +++ b/ui/android/java/src/org/chromium/ui/DropdownItemBase.java
@@ -57,11 +57,6 @@ } @Override - public boolean isMultilineLabel() { - return false; - } - - @Override public int getLabelFontColorResId() { return R.color.default_text_color_list_baseline; }
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb index fcfbcf4..a89a758 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
@@ -588,7 +588,7 @@ <translation id="5473333559083690127">新しい PIN を再入力</translation> <translation id="5489067830765222292">ラトビア語</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> フィルタがオフになりました。</translation> -<translation id="5494920125229734069">すべて選択する</translation> +<translation id="5494920125229734069">すべて選択</translation> <translation id="5500122897333236901">アイスランド語</translation> <translation id="5508696409934741614">ドット</translation> <translation id="5522908512596376669">ファイルの一覧がリスト表示に切り替わりました。</translation>
diff --git a/v8 b/v8 index 8a4c79f..d166183 160000 --- a/v8 +++ b/v8
@@ -1 +1 @@ -Subproject commit 8a4c79f2f72614bf9af2f65593d37f49a4c86e8e +Subproject commit d1661839f02abdcd85c6841fe123c4b1495bcf93