diff --git a/.gitignore b/.gitignore index 0474802..3a385b67 100644 --- a/.gitignore +++ b/.gitignore
@@ -99,6 +99,7 @@ /chrome/browser/media/engagement_internal /chrome/browser/performance_monitor/performance_monitor.xml /chrome/browser/protector/internal +/chrome/browser/resources/chromeos/kiosk_next_home/internal /chrome/browser/resources/chromeos/quickoffice /chrome/browser/resources/pdf/html_office /chrome/browser/resources/media_router/extension/src/
diff --git a/.gn b/.gn index 2bccf9d..50a46403 100644 --- a/.gn +++ b/.gn
@@ -77,6 +77,8 @@ "//buildtools/*", "//cc/*", + #"//chrome/*", # Many errors: https://crbug.com/949535 + #"//chrome/android/*", # 13 errors "//chrome/app/*", "//chrome/app_shim/*", @@ -243,7 +245,8 @@ #"//chrome/renderer/*", # ~30 errors #"//chrome/service/*", # 2 errors #"//chrome/services/*", # ~30 errors - #"//chrome/test/*", # ~3000 errors + #"//chrome/test/*", # ~1900 errors + "//chrome/test/chromedriver", "//chrome/third_party/*", "//chrome/tools/*", "//chrome/utility/*",
diff --git a/DEPS b/DEPS index 9b01b13..29e3750d 100644 --- a/DEPS +++ b/DEPS
@@ -129,11 +129,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': 'f153e221140adb32b91cbbc45e1f05d08f4fee0c', + 'skia_revision': '29c1c8029a52f95250180b58f13c639dd6c59b39', # 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': 'ab1a9efefbbd2a95a35a74a5ef699cc20581c137', + 'v8_revision': '33a2e1abff72ef2a7955b2ee942286901c638544', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -145,11 +145,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '707ed9974cb3eea6987bf3e79c0865a6bea3ef91', + 'swiftshader_revision': '652edcc30204cf9edc770a43f865f873015c5a0b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '0f35a9ee0be19783496a143744ad247422941d0f', + 'pdfium_revision': 'e9fa6a97fea60fcacb3088a6f012fb4dd218095e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -196,7 +196,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': 'fb33e51cc0d88e3694b218041f9e02be32e326c7', + 'catapult_revision': '0c3de1750970ae5b2578a1fdd4b27703e5802236', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -252,7 +252,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. - 'spv_tools_revision': '07c4dd4b9ecb13f3a6d3bea1f51be6c9563c45ec', + 'spv_tools_revision': '736376dbf9892b47c7ae3cf4e6d0b8172f6331d4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -805,7 +805,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'de445983dd9293d55cbad16f18b78334f7223a68', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '18d98f00a12ce2e5659f8da9a401e74547376395', 'condition': 'checkout_linux', }, @@ -1183,7 +1183,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '22219acb4b586534155702c4fcac9f95a2d45a09', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '5929b0ffd0d5efbbc4f7ee19c717145ba94368d5', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78', @@ -1395,7 +1395,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@11c47f6e5f74a5ea96d0f553e9c44e687a3b7a79', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@643152926e8678fb4fd1d9fed31900e6b3d1c208', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/docs/quick-start.md b/android_webview/docs/quick-start.md index affd0edec..e6ff030 100644 --- a/android_webview/docs/quick-start.md +++ b/android_webview/docs/quick-start.md
@@ -138,11 +138,27 @@ it might not even be possible to build WebView for your device. *** -### Valid package ... is installed/enabled for all users +### Invalid package ... Incorrect signature + +This shouldn't happen for userdebug devices, and there's no workaround for user +devices. Make sure you have a userdebug device (you can check with `adb shell +getprop ro.build.type`). + +### Valid package ... **is** installed/enabled for all users This is the correct state. If this is not the "preferred WebView package" or the "current WebView package", call `set-webview-implementation` again. +### Valid package ... **is NOT** installed/enabled for all users + +This shouldn't happen for `com.google.android.apps.chrome` (the recommended +package name). If you need to use a different package name, you may be able to +workaround this by enabling "redundant packages" (`adb shell cmd webviewupdate +enable-redundant-packages`), reinstalling, and running `set-webview-provider` +again. + +Otherwise, please [reach out to the team][1]. + ### My package isn't in the list Either your package didn't install (see below) or you chose a package which is @@ -158,11 +174,10 @@ Check the "Current WebView package" in the dumpsys output. You're probably hitting one of the cases above. -### I couldn't install the APK +### I couldn't install the APK/... is NOT installed. This could fail for an even wider variety of reasons than already listed. Please -[reach out to the -team](https://groups.google.com/a/chromium.org/forum/#!forum/android-webview-dev). +[reach out to the team][1]. ### I couldn't **build** the APK @@ -181,3 +196,5 @@ If you can't follow the quick start guide for some reason, please consult our [public](https://www.chromium.org/developers/how-tos/build-instructions-android-webview) or [internal](http://go/clank-webview) instructions. + +[1]: https://groups.google.com/a/chromium.org/forum/#!forum/android-webview-dev
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 45a587a..a047afe 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -1712,6 +1712,9 @@ <message name="IDS_ASH_MESSAGE_CENTER_HIDDEN_NOTIFICATION_COUNT_LABEL" desc="The label text the number of hidden notifications."> +<ph name="COUNT">$1<ex>2</ex></ph> more </message> + <message name="IDS_ASH_MESSAGE_CENTER_STACKING_BAR_CLEAR_ALL_BUTTON_TOOLTIP" desc="The tooltip text for the top clear all button, which also has the total number of notifications. Note: This button only appears when there are 2 or more notifications."> + Clear all <ph name="COUNT">$1<ex>2</ex></ph> notifications + </message> <message name="IDS_ASH_MESSAGE_CENTER_SETTINGS_BUTTON_TOOLTIP" desc="The tooltip text for visiting the appropriate settings page in the footer of the message center."> Settings </message>
diff --git a/ash/ash_strings_grd/IDS_ASH_MESSAGE_CENTER_STACKING_BAR_CLEAR_ALL_BUTTON_TOOLTIP.png.sha1 b/ash/ash_strings_grd/IDS_ASH_MESSAGE_CENTER_STACKING_BAR_CLEAR_ALL_BUTTON_TOOLTIP.png.sha1 new file mode 100644 index 0000000..1b0145f --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_MESSAGE_CENTER_STACKING_BAR_CLEAR_ALL_BUTTON_TOOLTIP.png.sha1
@@ -0,0 +1 @@ +cb3227010be206339130ec7808f63055792dcbf2 \ No newline at end of file
diff --git a/ash/assistant/ui/assistant_container_view.cc b/ash/assistant/ui/assistant_container_view.cc index bbe6c84f..4f1044c 100644 --- a/ash/assistant/ui/assistant_container_view.cc +++ b/ash/assistant/ui/assistant_container_view.cc
@@ -25,7 +25,6 @@ #include "ui/display/display.h" #include "ui/display/screen.h" #include "ui/gfx/animation/tween.h" -#include "ui/views/bubble/bubble_border.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/layout/layout_manager.h" #include "ui/views/view.h" @@ -236,10 +235,10 @@ views::BubbleDialogDelegateView::CreateBubble(this); // Corner radius can only be set after bubble creation. - GetBubbleFrameView()->bubble_border()->SetCornerRadius( - delegate_->GetUiModel()->ui_mode() == AssistantUiMode::kMiniUi - ? kMiniUiCornerRadiusDip - : kCornerRadiusDip); + GetBubbleFrameView()->SetCornerRadius(delegate_->GetUiModel()->ui_mode() == + AssistantUiMode::kMiniUi + ? kMiniUiCornerRadiusDip + : kCornerRadiusDip); // Initialize non-client view layer. GetBubbleFrameView()->SetPaintToLayer(); @@ -439,11 +438,11 @@ } int AssistantContainerView::GetCornerRadius() const { - return GetBubbleFrameView()->bubble_border()->GetBorderCornerRadius(); + return GetBubbleFrameView()->corner_radius(); } void AssistantContainerView::SetCornerRadius(int corner_radius) { - GetBubbleFrameView()->bubble_border()->SetCornerRadius(corner_radius); + GetBubbleFrameView()->SetCornerRadius(corner_radius); } ui::Layer* AssistantContainerView::GetNonClientViewLayer() {
diff --git a/ash/public/cpp/ash_pref_names.cc b/ash/public/cpp/ash_pref_names.cc index 090c816f..a714daf6 100644 --- a/ash/public/cpp/ash_pref_names.cc +++ b/ash/public/cpp/ash_pref_names.cc
@@ -361,15 +361,18 @@ const char kVpnConfigAllowed[] = "vpn_config_allowed"; // A boolean pref that indicates whether power peak shift is enabled. +// Ignored unless powerd is configured to honor charging-related prefs. const char kPowerPeakShiftEnabled[] = "ash.power.peak_shift_enabled"; // An integer pref that specifies the power peak shift battery threshold in // percent. +// Ignored unless powerd is configured to honor charging-related prefs. const char kPowerPeakShiftBatteryThreshold[] = "ash.power.peak_shift_battery_threshold"; // A dictionary pref that specifies the power peak shift day configs. // For details see "DevicePowerPeakShiftDayConfig" in policy_templates.json. +// Ignored unless powerd is configured to honor charging-related prefs. const char kPowerPeakShiftDayConfig[] = "ash.power.peak_shift_day_config"; // A boolean pref that indicates whether boot on AC is enabled. @@ -377,23 +380,27 @@ // A boolean pref that indicates whether advanced battery charge mode is // enabled. +// Ignored unless powerd is configured to honor charging-related prefs. const char kAdvancedBatteryChargeModeEnabled[] = "ash.power.advanced_battery_charge_mode_enabled"; // A dictionary pref that specifies the advanced battery charge mode day config. // For details see "DeviceAdvancedBatteryChargeModeDayConfig" in // policy_templates.json. +// Ignored unless powerd is configured to honor charging-related prefs. const char kAdvancedBatteryChargeModeDayConfig[] = "ash.power.advanced_battery_charge_mode_day_config"; // An integer pref that specifies the battery charge mode. // For details see "DeviceBatteryChargeMode" in policy_templates.json. +// Ignored unless powerd is configured to honor charging-related prefs. const char kBatteryChargeMode[] = "ash.power.battery_charge_mode"; // An integer pref that specifies the battery charge custom start charging in // percent. // For details see "DeviceBatteryChargeCustomStartCharging" in // policy_templates.json. +// Ignored unless powerd is configured to honor charging-related prefs. const char kBatteryChargeCustomStartCharging[] = "ash.power.battery_charge_custom_start_charging"; @@ -401,11 +408,13 @@ // percent. // For details see "DeviceBatteryChargeCustomStopCharging" in // policy_templates.json. +// Ignored unless powerd is configured to honor charging-related prefs. const char kBatteryChargeCustomStopCharging[] = "ash.power.battery_charge_custom_stop_charging"; // A boolean pref that indicates whether USB power share is enabled. // For details see "DeviceUsbPowerShareEnabled" in policy_templates.json. +// Ignored unless powerd is configured to honor charging-related prefs. const char kUsbPowerShareEnabled[] = "ash.power.usb_power_share_enabled"; // NOTE: New prefs should start with the "ash." prefix. Existing prefs moved
diff --git a/ash/shelf/shelf_bubble.cc b/ash/shelf/shelf_bubble.cc index 93de197..814fbae 100644 --- a/ash/shelf/shelf_bubble.cc +++ b/ash/shelf/shelf_bubble.cc
@@ -51,8 +51,8 @@ views::BubbleDialogDelegateView::CreateBubble(this); // Settings that should only be changed just after bubble creation. - GetBubbleFrameView()->bubble_border()->SetCornerRadius(border_radius_); - GetBubbleFrameView()->bubble_border()->set_background_color(color()); + GetBubbleFrameView()->SetCornerRadius(border_radius_); + GetBubbleFrameView()->SetBackgroundColor(color()); } int ShelfBubble::GetDialogButtons() const {
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index fab5da87..d1b7c466 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -86,6 +86,7 @@ <translation id="225680501294068881">Ieškoma įrenginių...</translation> <translation id="2268130516524549846">„Bluetooth“ neleidžiama</translation> <translation id="2268813581635650749">Atjungti visus</translation> +<translation id="2277103315734023688">Prasukti pirmyn</translation> <translation id="2292698582925480719">Ekrano mastelis</translation> <translation id="2302092602801625023">Ši paskyra tvarkoma naudojant „Family Link“</translation> <translation id="2303600792989757991">Perjungti lango apžvalgą</translation> @@ -166,6 +167,7 @@ <translation id="3371140690572404006">USB-C įrenginys (prievadas dešinėje, priekinėje dalyje)</translation> <translation id="3400357268283240774">Papildomi nustatymai</translation> <translation id="3413817803639110246">Dar nėra nieko, ką būtų galima peržiūrėti</translation> +<translation id="343571671045587506">Redaguoti priminimą</translation> <translation id="3445925074670675829">USB-C įrenginys</translation> <translation id="3454224730401036106">Ryšys perjungtas į saugesnį tinklą</translation> <translation id="3465223694362104965">Nuo paskutinio jūsų prisijungimo su įrenginiu susieta kita klaviatūra. Prieš ją naudodami įsitikinkite, kad galite pasitikėti šia klaviatūra.</translation> @@ -198,12 +200,14 @@ <translation id="3900355044994618856">Sesija baigsis po <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Jungiamasi prie „<ph name="NAME" />“</translation> <translation id="394485226368336402">Garso nustatymai</translation> +<translation id="3962859241508114581">Ankstesnis takelis</translation> <translation id="397105322502079400">Skaičiuojama...</translation> <translation id="3995138139523574647">USB-C įrenginys (prievadas dešinėje, užpakalinėje dalyje)</translation> <translation id="4017989525502048489">Lazerinis žymeklis</translation> <translation id="4042660782729322247">Bendrinate ekraną</translation> <translation id="4065525899979931964">{NUM_APPS,plural, =1{Programos pranešimai išjungti}one{# programos pranešimai išjungti}few{# programų pranešimai išjungti}many{# programos pranešimai išjungti}other{# programų pranešimai išjungti}}</translation> <translation id="4072264167173457037">Vidutinio stiprumo signalas</translation> +<translation id="4112140312785995938">Prasukti atgal</translation> <translation id="4129129681837227511">Jei norite matyti pranešimus užrakinimo ekrane, atrakinkite ir pakeiskite nustatymą</translation> <translation id="4146833061457621061">„Play music“ (Leisk muziką)</translation> <translation id="4181841719683918333">Kalbos</translation> @@ -228,6 +232,7 @@ <translation id="4421231901400348175"><ph name="HELPER_NAME" /> gali valdyti jūsų ekraną naudodamas (-a) Nuotolinę pagalbą.</translation> <translation id="4430019312045809116">Apimtis</translation> <translation id="4450893287417543264">Daugiau neberodyti</translation> +<translation id="4477350412780666475">Kitas takelis</translation> <translation id="4479639480957787382">Eternetas</translation> <translation id="4481530544597605423">Atsieti įrenginiai</translation> <translation id="4508225577814909926">„<ph name="NAME" />“: jungiamasi...</translation> @@ -393,6 +398,7 @@ <translation id="7222902781030499995">Stabdyti laikmatį</translation> <translation id="7256634071279256947">Užpakalinis mikrofonas</translation> <translation id="726276584504105859">Vilkite čia, kad naudotumėte skaidytą ekraną</translation> +<translation id="7262906531272962081">Sukurti priminimą</translation> <translation id="7303365578352795231">Atsakoma kitame įrenginyje.</translation> <translation id="7305884605064981971">EDGE</translation> <translation id="7348093485538360975">Ekraninė klaviatūra</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 1ab75ff..0711a36 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -86,6 +86,7 @@ <translation id="225680501294068881">Zoeken naar apparaten...</translation> <translation id="2268130516524549846">Bluetooth uitgeschakeld</translation> <translation id="2268813581635650749">Uitloggen van alle accounts</translation> +<translation id="2277103315734023688">Vooruit zoeken</translation> <translation id="2292698582925480719">Weergaveschaal</translation> <translation id="2302092602801625023">Dit account wordt beheerd door Family Link</translation> <translation id="2303600792989757991">Overzicht venster in-/uitschakelen</translation> @@ -166,6 +167,7 @@ <translation id="3371140690572404006">USB-C-apparaat (poort rechts aan de voorkant)</translation> <translation id="3400357268283240774">Aanvullende instellingen</translation> <translation id="3413817803639110246">Er is nog niets te zien</translation> +<translation id="343571671045587506">Herinnering bewerken</translation> <translation id="3445925074670675829">USB-C-apparaat</translation> <translation id="3454224730401036106">Je verbinding is overgeschakeld op een beter beveiligd netwerk</translation> <translation id="3465223694362104965">Een ander toetsenbord heeft verbinding met dit apparaat gemaakt sinds de laatste keer dat je bent ingelogd. Controleer of je dit toetsenbord vertrouwt voordat je het gebruikt.</translation> @@ -198,12 +200,14 @@ <translation id="3900355044994618856">Je sessie loopt over <ph name="SESSION_TIME_REMAINING" /> af</translation> <translation id="3901991538546252627">Verbinding maken met <ph name="NAME" /></translation> <translation id="394485226368336402">Audio-instellingen</translation> +<translation id="3962859241508114581">Vorig nummer</translation> <translation id="397105322502079400">Berekenen...</translation> <translation id="3995138139523574647">USB-C-apparaat (poort rechts aan de achterkant)</translation> <translation id="4017989525502048489">Laserpen</translation> <translation id="4042660782729322247">Je deelt je scherm</translation> <translation id="4065525899979931964">{NUM_APPS,plural, =1{Uitgeschakeld voor een app}other{Uitgeschakeld voor # apps}}</translation> <translation id="4072264167173457037">Normaal signaal</translation> +<translation id="4112140312785995938">Achteruit zoeken</translation> <translation id="4129129681837227511">Als je meldingen op je vergrendelingsscherm wilt zien, ontgrendel je het scherm om de instellingen te wijzigen</translation> <translation id="4146833061457621061">Speel muziek</translation> <translation id="4181841719683918333">Talen</translation> @@ -227,6 +231,7 @@ <translation id="4421231901400348175">De controle over je scherm wordt gedeeld met <ph name="HELPER_NAME" /> via externe ondersteuning.</translation> <translation id="4430019312045809116">Volume</translation> <translation id="4450893287417543264">Niet meer tonen</translation> +<translation id="4477350412780666475">Volgend nummer</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4481530544597605423">Ontkoppelde apparaten</translation> <translation id="4508225577814909926"><ph name="NAME" />: verbinden...</translation> @@ -392,6 +397,7 @@ <translation id="7222902781030499995">Timer stoppen</translation> <translation id="7256634071279256947">Microfoon aan achterzijde</translation> <translation id="726276584504105859">Sleep hier naartoe om het scherm te splitsen</translation> +<translation id="7262906531272962081">Herinnering maken</translation> <translation id="7303365578352795231">Je vraag wordt beantwoord op een ander apparaat.</translation> <translation id="7305884605064981971">EDGE</translation> <translation id="7348093485538360975">Schermtoetsenbord</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index c9f3d009..74dcf77 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -27,8 +27,10 @@ <translation id="1290331692326790741">வலுவற்ற சிக்னல்</translation> <translation id="1293264513303784526">USB-C சாதனம் (இடது போர்ட்)</translation> <translation id="1294929383540927798">பூட்டுத் திரை அறிவிப்பு அமைப்புகளை மாற்றும்</translation> +<translation id="1301069673413256657">GSM</translation> <translation id="1302880136325416935">புளூடூத் அமைப்புகளைக் காண்பிக்கும். <ph name="STATE_TEXT" /></translation> <translation id="1316069254387866896">ஷெல்ஃபை எப்போதும் காட்டு</translation> +<translation id="1341651618736211726">கூடுதல் விருப்பங்கள்</translation> <translation id="1346748346194534595">வலது</translation> <translation id="1351937230027495976">மெனுவைச் சுருக்கு</translation> <translation id="1383876407941801731">தேடல்</translation> @@ -207,6 +209,7 @@ <translation id="4181841719683918333">மொழிகள்</translation> <translation id="4195877955194704651">தானியங்குக் கிளிக்குகள் பட்டன்</translation> <translation id="4217571870635786043">சொல்வதை எழுதுவது</translation> +<translation id="4239069858505860023">GPRS</translation> <translation id="4261870227682513959">அறிவிப்பு அமைப்புகளைக் காண்பிக்கும். அறிவிப்புகள் முடக்கப்பட்டுள்ளன</translation> <translation id="4269883910223712419">இந்தச் சாதனத்தின் நிர்வாகி இவற்றைச் செய்ய முடியும்:</translation> <translation id="4279490309300973883">பிரதிபலிக்கிறது</translation> @@ -276,6 +279,7 @@ <translation id="544691375626129091">எல்லா பயனர்களும் ஏற்கனவே இந்த அமர்வில் சேர்க்கப்பட்டுள்ளனர்.</translation> <translation id="5465662442746197494">உதவி தேவையா?</translation> <translation id="5496819745535887422">உங்கள் நிர்வாகி உங்கள் சாதனத்தை மீட்டமைக்கிறார். சாதனம் மீண்டும் தொடங்கும்போது அனைத்துத் தரவும் நீக்கப்படும்.</translation> +<translation id="5519195206574732858">LTE</translation> <translation id="553675580533261935">அமர்விலிருந்து வெளியேறுதல்</translation> <translation id="5537725057119320332">அலைபரப்பு</translation> <translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" என்ற நீட்டிப்பு இந்த நெட்வொர்க்குடன் இணைய உதவும்.</translation> @@ -283,6 +287,7 @@ <translation id="5571066253365925590">புளூடூத் இயக்கப்பட்டது</translation> <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation> <translation id="5600837773213129531">பேச்சுவடிவக் கருத்தை முடக்க, Ctrl + Alt + Zஐ அழுத்தவும்.</translation> +<translation id="5625955975703555628">LTE+</translation> <translation id="5648021990716966815">மைக் ஜாக்</translation> <translation id="5669267381087807207">செயலாக்குகிறது</translation> <translation id="5673434351075758678">அமைப்புகளை ஒத்திசைத்த பின்னர், "<ph name="FROM_LOCALE" />" இலிருந்து "<ph name="TO_LOCALE" />"க்கு மாற்றப்பட்டது.</translation> @@ -320,6 +325,7 @@ <translation id="615957422585914272">ஸ்கிரீன் கீபோர்டைக் காட்டு</translation> <translation id="6164005077879661055">இந்தக் மேற்பார்வையிடப்படும் பயனர் அகற்றப்பட்டவுடன் மேற்பார்வையிடப்படும் பயனருடன் தொடர்புடைய எல்லா கோப்புகளும், அகத் தரவும் நிரந்தரமாக நீக்கப்படும். இந்தக் மேற்பார்வையிடப்படும் பயனர் பார்வையிட்ட இணையதளங்களையும் அமைப்புகளையும் <ph name="MANAGEMENT_URL" /> இல் இன்னும் நிர்வாகியால் பார்க்க முடியும்.</translation> <translation id="6165508094623778733">மேலும் அறிக</translation> +<translation id="6237231532760393653">1X</translation> <translation id="6254629735336163724">கிடைமட்ட நிலையில் பூட்டப்பட்டது</translation> <translation id="6259254695169772643">தேர்ந்தெடுக்க, ஸ்டைலஸைப் பயன்படுத்தலாம்</translation> <translation id="6267036997247669271"><ph name="NAME" />: செயல்படுத்துகிறது...</translation> @@ -387,6 +393,7 @@ <translation id="7256634071279256947">பின்பக்க மைக்ரோஃபோன்</translation> <translation id="726276584504105859">திரைப் பிரிப்பைப் பயன்படுத்த, இங்கே இழுக்கவும்</translation> <translation id="7303365578352795231">மற்றொரு சாதனத்தில் பதிலளிக்கப்படுகிறது.</translation> +<translation id="7305884605064981971">EDGE</translation> <translation id="7348093485538360975">ஸ்கிரீன் கீபோர்ட்</translation> <translation id="735745346212279324">VPN துண்டிக்கப்பட்டது</translation> <translation id="7377169924702866686">Caps Lock இயக்கத்தில் உள்ளது.</translation> @@ -491,9 +498,11 @@ <translation id="8877788021141246043">நினைவூட்டலை அமை</translation> <translation id="8878886163241303700">திரையை விரிவாக்குகிறது</translation> <translation id="890616557918890486">மூலத்தை மாற்று</translation> +<translation id="8921554779039049422">H+</translation> <translation id="8921624153894383499">Google அசிஸ்டண்ட், இந்த மொழியை ஆதரிக்கவில்லை.</translation> <translation id="8938800817013097409">USB-C சாதனம் (பின்பக்கம் உள்ள வலது போர்ட்)</translation> <translation id="8940956008527784070">பேட்டரி குறைவு (<ph name="PERCENTAGE" />%)</translation> +<translation id="8983038754672563810">HSPA</translation> <translation id="8990809378771970590"><ph name="IME_NAME" /> பயன்படுத்தப்படுகிறது</translation> <translation id="899350903320462459">அறிவிப்பில் வந்த செயலைச் செய்வதற்கு, சாதனத்தை <ph name="LOGIN_ID" /> ஆகத் திறக்கவும்</translation> <translation id="8995603266996330174"><ph name="DOMAIN" /> ஆல் நிர்வகிக்கப்படுகிறது</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index 25514b2..30ca433 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -86,6 +86,7 @@ <translation id="225680501294068881">Пошук пристроїв...</translation> <translation id="2268130516524549846">Bluetooth вимкнено</translation> <translation id="2268813581635650749">Вийти з усіх облікових записів</translation> +<translation id="2277103315734023688">Перейти вперед</translation> <translation id="2292698582925480719">Масштаб дисплея</translation> <translation id="2302092602801625023">Цим обліковим записом керують через Family Link</translation> <translation id="2303600792989757991">Увімкнення чи вимкнення вікна перегляду</translation> @@ -166,6 +167,7 @@ <translation id="3371140690572404006">пристрій, під’єднаний до порту USB-C (праворуч на передній панелі)</translation> <translation id="3400357268283240774">Додаткові налаштування</translation> <translation id="3413817803639110246">Ще нічого немає</translation> +<translation id="343571671045587506">Змінити нагадування</translation> <translation id="3445925074670675829">Пристрій із портом USB типу C</translation> <translation id="3454224730401036106">Вас під’єднано до більш захищеної мережі</translation> <translation id="3465223694362104965">Після вашого останнього входу до пристрою було підключено іншу клавіатуру. Переконайтеся, що вона безпечна, перш ніж користуватися нею.</translation> @@ -198,12 +200,14 @@ <translation id="3900355044994618856">Сеанс закінчиться через <ph name="SESSION_TIME_REMAINING" /></translation> <translation id="3901991538546252627">Під’єднання до <ph name="NAME" /></translation> <translation id="394485226368336402">Налаштування звуку</translation> +<translation id="3962859241508114581">Попередня композиція</translation> <translation id="397105322502079400">Обчислення...</translation> <translation id="3995138139523574647">пристрій, під’єднаний до порту USB-C (праворуч на задній панелі)</translation> <translation id="4017989525502048489">Лазерний вказівник</translation> <translation id="4042660782729322247">Ви ділитеся екраном</translation> <translation id="4065525899979931964">{NUM_APPS,plural, =1{Вимкнено для додатка}one{Вимкнено для # додатка}few{Вимкнено для # додатків}many{Вимкнено для # додатків}other{Вимкнено для # додатка}}</translation> <translation id="4072264167173457037">середній сигнал</translation> +<translation id="4112140312785995938">Перейти назад</translation> <translation id="4129129681837227511">Щоб переглядати сповіщення на заблокованому екрані, розблокуйте його й змініть налаштування</translation> <translation id="4146833061457621061">Увімкни музику</translation> <translation id="4181841719683918333">Мови</translation> @@ -227,6 +231,7 @@ <translation id="4421231901400348175">Спільний доступ до екрана для користувача <ph name="HELPER_NAME" /> через віддалену допомогу.</translation> <translation id="4430019312045809116">Гучність</translation> <translation id="4450893287417543264">Більше не показувати</translation> +<translation id="4477350412780666475">Наступна композиція</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4481530544597605423">Відключені пристрої</translation> <translation id="4508225577814909926"><ph name="NAME" />: Під’єднання…</translation> @@ -392,6 +397,7 @@ <translation id="7222902781030499995">Зупинити таймер</translation> <translation id="7256634071279256947">Мікрофон на задній панелі</translation> <translation id="726276584504105859">Перетягніть сюди, щоб розділити екран</translation> +<translation id="7262906531272962081">Створити нагадування</translation> <translation id="7303365578352795231">Відповідь на іншому пристрої.</translation> <translation id="7305884605064981971">EDGE</translation> <translation id="7348093485538360975">Екранна клавіатура</translation>
diff --git a/ash/system/message_center/unified_message_center_view.cc b/ash/system/message_center/unified_message_center_view.cc index 2ff5d94d..351776bd2 100644 --- a/ash/system/message_center/unified_message_center_view.cc +++ b/ash/system/message_center/unified_message_center_view.cc
@@ -206,6 +206,13 @@ if (features::IsNotificationStackingBarRedesignEnabled()) { SetVisible(total_notification_count_ > 1); + + auto tooltip = l10n_util::GetStringFUTF16Int( + IDS_ASH_MESSAGE_CENTER_STACKING_BAR_CLEAR_ALL_BUTTON_TOOLTIP, + total_notification_count_); + clear_all_button_->SetTooltipText(tooltip); + clear_all_button_->SetAccessibleName(tooltip); + if (stacked_notification_count_ > 0) { count_label_->SetText(l10n_util::GetStringFUTF16Int( IDS_ASH_MESSAGE_CENTER_HIDDEN_NOTIFICATION_COUNT_LABEL,
diff --git a/ash/system/power/power_prefs.cc b/ash/system/power/power_prefs.cc index 96ee6c27..7d5e336 100644 --- a/ash/system/power/power_prefs.cc +++ b/ash/system/power/power_prefs.cc
@@ -435,6 +435,11 @@ values.boot_on_ac = local_state_->GetBoolean(prefs::kBootOnAcEnabled); } + if (local_state_->IsManagedPreference(prefs::kUsbPowerShareEnabled)) { + values.usb_power_share = + local_state_->GetBoolean(prefs::kUsbPowerShareEnabled); + } + power_policy_controller_->ApplyPrefs(values); } @@ -503,6 +508,8 @@ local_state_registrar_->Add(prefs::kBootOnAcEnabled, update_callback); + local_state_registrar_->Add(prefs::kUsbPowerShareEnabled, update_callback); + UpdatePowerPolicyFromPrefs(); }
diff --git a/ash/system/power/power_prefs_unittest.cc b/ash/system/power/power_prefs_unittest.cc index 15b0bd5..affb62b2 100644 --- a/ash/system/power/power_prefs_unittest.cc +++ b/ash/system/power/power_prefs_unittest.cc
@@ -113,7 +113,11 @@ prefs->GetBoolean(prefs::kPowerWaitForInitialUserActivity)); expected_policy.set_force_nonzero_brightness_for_user_activity( prefs->GetBoolean(prefs::kPowerForceNonzeroBrightnessForUserActivity)); + + // Device-level prefs do not exist in the user-level |prefs|. expected_policy.set_boot_on_ac(false); + expected_policy.set_usb_power_share(true); + expected_policy.set_reason("Prefs"); return chromeos::PowerPolicyController::GetPolicyDebugString(expected_policy); } @@ -420,4 +424,12 @@ EXPECT_FALSE(power_manager_client()->policy().boot_on_ac()); } +TEST_F(PowerPrefsTest, UsbPowerShare) { + managed_pref_store_->SetBoolean(prefs::kUsbPowerShareEnabled, true); + EXPECT_TRUE(power_manager_client()->policy().usb_power_share()); + + managed_pref_store_->SetBoolean(prefs::kUsbPowerShareEnabled, false); + EXPECT_FALSE(power_manager_client()->policy().usb_power_share()); +} + } // namespace ash
diff --git a/ash/system/tray/tray_bubble_view.cc b/ash/system/tray/tray_bubble_view.cc index b79b711..571d8e5bf 100644 --- a/ash/system/tray/tray_bubble_view.cc +++ b/ash/system/tray/tray_bubble_view.cc
@@ -235,7 +235,7 @@ if (!ash::features::ShouldUseShaderRoundedCorner()) { bubble_content_mask_ = views::Painter::CreatePaintedLayer( views::Painter::CreateSolidRoundRectPainter( - SK_ColorBLACK, bubble_border_->GetBorderCornerRadius())); + SK_ColorBLACK, bubble_border_->corner_radius())); } auto layout = std::make_unique<BottomAlignedBoxLayout>(this); @@ -266,7 +266,7 @@ void TrayBubbleView::InitializeAndShowBubble() { if (ash::features::ShouldUseShaderRoundedCorner()) { - int radius = bubble_border_->GetBorderCornerRadius(); + int radius = bubble_border_->corner_radius(); layer()->parent()->SetRoundedCornerRadius({radius, radius, radius, radius}); layer()->parent()->SetIsFastRoundedCorner(true); } else {
diff --git a/ash/wm/tablet_mode/tablet_mode_backdrop_delegate_impl.h b/ash/wm/tablet_mode/tablet_mode_backdrop_delegate_impl.h index 1e70719c..db8e0b9 100644 --- a/ash/wm/tablet_mode/tablet_mode_backdrop_delegate_impl.h +++ b/ash/wm/tablet_mode/tablet_mode_backdrop_delegate_impl.h
@@ -12,7 +12,7 @@ namespace ash { -// A backdrop delegate for MaximizedMode, which always creates a backdrop. +// A backdrop delegate for tablet mode, which always creates a backdrop. // This is also used in the WorkspaceLayoutManagerBackdropTest, hence // is public. class ASH_EXPORT TabletModeBackdropDelegateImpl : public BackdropDelegate {
diff --git a/ash/wm/tablet_mode/tablet_mode_controller.cc b/ash/wm/tablet_mode/tablet_mode_controller.cc index 3668f0d..f71b5826 100644 --- a/ash/wm/tablet_mode/tablet_mode_controller.cc +++ b/ash/wm/tablet_mode/tablet_mode_controller.cc
@@ -10,6 +10,7 @@ #include "ash/kiosk_next/kiosk_next_shell_controller.h" #include "ash/public/cpp/ash_switches.h" +#include "ash/public/cpp/fps_counter.h" #include "ash/public/cpp/tablet_mode.h" #include "ash/root_window_controller.h" #include "ash/shell.h" @@ -90,6 +91,13 @@ constexpr base::TimeDelta kOcclusionTrackerTimeout = base::TimeDelta::FromMilliseconds(500); +// Histogram names for recording animation smoothness when entering or exiting +// tablet mode. +constexpr char kTabletModeEnterHistogram[] = + "Ash.TabletMode.AnimationSmoothness.Enter"; +constexpr char kTabletModeExitHistogram[] = + "Ash.TabletMode.AnimationSmoothness.Exit"; + // The angle between AccelerometerReadings are considered stable if // their magnitudes do not differ greatly. This returns false if the deviation // between the screen and keyboard accelerometers is too high. @@ -131,6 +139,33 @@ } // namespace +// Class which records animation smoothness when entering or exiting tablet +// mode. No stats should be recorded if no windows are animated. +class TabletModeController::TabletModeTransitionFpsCounter : public FpsCounter { + public: + TabletModeTransitionFpsCounter(ui::Compositor* compositor, + bool enter_tablet_mode) + : FpsCounter(compositor), enter_tablet_mode_(enter_tablet_mode) {} + ~TabletModeTransitionFpsCounter() override = default; + + void LogUma() { + int smoothness = ComputeSmoothness(); + if (smoothness < 0) + return; + + if (enter_tablet_mode_) + UMA_HISTOGRAM_PERCENTAGE(kTabletModeEnterHistogram, smoothness); + else + UMA_HISTOGRAM_PERCENTAGE(kTabletModeExitHistogram, smoothness); + } + + bool enter_tablet_mode() const { return enter_tablet_mode_; } + + private: + bool enter_tablet_mode_; + DISALLOW_COPY_AND_ASSIGN(TabletModeTransitionFpsCounter); +}; + constexpr char TabletModeController::kLidAngleHistogramName[]; TabletModeController::TabletModeController() @@ -171,6 +206,9 @@ } TabletModeController::~TabletModeController() { + if (tablet_mode_window_manager_) + tablet_mode_window_manager_->Shutdown(); + UMA_HISTOGRAM_COUNTS_1000("Tablet.AppWindowDrag.CountOfPerUserSession", app_window_drag_count_); UMA_HISTOGRAM_COUNTS_1000( @@ -200,7 +238,7 @@ // TODO(jcliang): Hide or remove EnableTabletModeWindowManager // (http://crbug.com/620241). void TabletModeController::EnableTabletModeWindowManager(bool should_enable) { - bool is_enabled = !!tablet_mode_window_manager_.get(); + bool is_enabled = IsTabletModeWindowManagerEnabled(); if (should_enable == is_enabled) return; @@ -211,10 +249,13 @@ RootWindowController::ForWindow(root_window)->HideContextMenu(); if (should_enable) { + state_ = State::kEnteringTabletMode; // Suspend occlusion tracker when entering tablet mode. SuspendOcclusionTracker(); tablet_mode_window_manager_.reset(new TabletModeWindowManager()); + tablet_mode_window_manager_->Init(); + base::RecordAction(base::UserMetricsAction("Touchview_Enabled")); RecordTabletModeUsageInterval(TABLET_MODE_INTERVAL_INACTIVE); for (auto& observer : tablet_mode_observers_) @@ -231,22 +272,26 @@ Shell::Get()->overview_controller()->ToggleOverview(); } + state_ = State::kInTabletMode; if (client_) // Null at startup and in tests. client_->OnTabletModeToggled(true); VLOG(1) << "Enter tablet mode."; } else { + state_ = State::kExitingTabletMode; // Suspend occlusion tracker when exiting tablet mode. SuspendOcclusionTracker(); tablet_mode_window_manager_->SetIgnoreWmEventsForExit(); for (auto& observer : tablet_mode_observers_) observer.OnTabletModeEnding(); + tablet_mode_window_manager_->Shutdown(); tablet_mode_window_manager_.reset(); base::RecordAction(base::UserMetricsAction("Touchview_Disabled")); RecordTabletModeUsageInterval(TABLET_MODE_INTERVAL_ACTIVE); for (auto& observer : tablet_mode_observers_) observer.OnTabletModeEnded(); + state_ = State::kInClamshellMode; if (client_) // Null at startup and in tests. client_->OnTabletModeToggled(false); VLOG(1) << "Exit tablet mode."; @@ -256,7 +301,7 @@ } bool TabletModeController::IsTabletModeWindowManagerEnabled() const { - return tablet_mode_window_manager_.get() != NULL; + return !!tablet_mode_window_manager_; } void TabletModeController::AddWindow(aura::Window* window) { @@ -304,6 +349,47 @@ return true; } +void TabletModeController::MaybeObserveBoundsAnimation(aura::Window* window) { + if (state_ != State::kEnteringTabletMode && + state_ != State::kExitingTabletMode) { + return; + } + + // A window may not be tracked by |tablet_mode_window_manager_|. Do not + // observe the animations of these windows. + if (tablet_mode_window_manager_ && + !tablet_mode_window_manager_->IsTrackingWindow(window)) { + return; + } + + // If |fps_counter_| exists and is of the same mode do nothing, as we only + // need to observe one window animation. + bool entering_tablet_mode = state_ == State::kEnteringTabletMode; + if (fps_counter_ && + fps_counter_->enter_tablet_mode() == entering_tablet_mode) { + return; + } + + // When leaving tablet mode, DefaultState will get reattached. DefaultState + // does not skip animations to maximized mode unlike TabletModeWindowState, so + // manually check here. + // TODO(sammiequon): Make sure the maximize to maximize state is not animated + // in DefaultState. + if (!entering_tablet_mode && + wm::GetWindowState(window)->IsMaximizedOrFullscreenOrPinned()) { + return; + } + + if (!window->layer()->GetAnimator()->is_animating()) + return; + + observed_window_ = window; + window->AddObserver(this); + window->layer()->GetAnimator()->AddObserver(this); + fps_counter_ = std::make_unique<TabletModeTransitionFpsCounter>( + window->layer()->GetCompositor(), entering_tablet_mode); +} + void TabletModeController::OnShellInitialized() { force_ui_mode_ = GetTabletMode(); if (force_ui_mode_ == UiMode::kTabletMode) @@ -484,6 +570,37 @@ HandlePointingDeviceAddedOrRemoved(); } +void TabletModeController::OnKioskNextEnabled() { + kiosk_next_enabled_ = true; + AttemptEnterTabletMode(); +} + +void TabletModeController::OnLayerAnimationStarted( + ui::LayerAnimationSequence* sequence) {} + +void TabletModeController::OnLayerAnimationAborted( + ui::LayerAnimationSequence* sequence) { + StopObservingAnimation(/*record_stats=*/false); +} + +void TabletModeController::OnLayerAnimationEnded( + ui::LayerAnimationSequence* sequence) { + StopObservingAnimation(/*record_stats=*/true); +} + +void TabletModeController::OnLayerAnimationScheduled( + ui::LayerAnimationSequence* sequence) { + // If another animation is scheduled while the animation we were originally + // watching is still animating, abort and do not log stats as the stats will + // not be accurate. + StopObservingAnimation(/*record_stats=*/false); +} + +void TabletModeController::OnWindowDestroying(aura::Window* window) { + DCHECK_EQ(observed_window_, window); + StopObservingAnimation(/*record_stats=*/false); +} + void TabletModeController::HandleHingeRotation( scoped_refptr<const AccelerometerUpdate> update) { static const gfx::Vector3dF hinge_vector(1.0f, 0.0f, 0.0f); @@ -770,8 +887,16 @@ occlusion_tracker_pauser_.reset(); } -void TabletModeController::OnKioskNextEnabled() { - kiosk_next_enabled_ = true; - AttemptEnterTabletMode(); +void TabletModeController::StopObservingAnimation(bool record_stats) { + DCHECK(observed_window_); + DCHECK(fps_counter_); + StopObserving(); + observed_window_->layer()->GetAnimator()->RemoveObserver(this); + observed_window_->RemoveObserver(this); + observed_window_ = nullptr; + if (record_stats) + fps_counter_->LogUma(); + fps_counter_.reset(); } + } // namespace ash
diff --git a/ash/wm/tablet_mode/tablet_mode_controller.h b/ash/wm/tablet_mode/tablet_mode_controller.h index c503606..506ff2ae 100644 --- a/ash/wm/tablet_mode/tablet_mode_controller.h +++ b/ash/wm/tablet_mode/tablet_mode_controller.h
@@ -26,7 +26,9 @@ #include "chromeos/dbus/power/power_manager_client.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/interface_ptr_set.h" +#include "ui/aura/window_observer.h" #include "ui/aura/window_occlusion_tracker.h" +#include "ui/compositor/layer_animation_observer.h" #include "ui/events/devices/input_device_event_observer.h" #include "ui/gfx/geometry/vector3d_f.h" @@ -42,6 +44,10 @@ class Vector3dF; } +namespace ui { +class LayerAnimationSequence; +} + namespace views { class Widget; } @@ -64,7 +70,9 @@ public WindowTreeHostManager::Observer, public SessionObserver, public ui::InputDeviceEventObserver, - public KioskNextShellObserver { + public KioskNextShellObserver, + public ui::LayerAnimationObserver, + public aura::WindowObserver { public: // Used for keeping track if the user wants the machine to behave as a // clamshell/tablet regardless of hardware orientation. @@ -118,6 +126,9 @@ // Otherwise, returns false. bool TriggerRecordLidAngleTimerForTesting() WARN_UNUSED_RESULT; + // Called from a WindowState object when the bounds of |window| changes. + void MaybeObserveBoundsAnimation(aura::Window* window); + // ShellObserver: void OnShellInitialized() override; @@ -146,6 +157,15 @@ // KioskNextShellObserver: void OnKioskNextEnabled() override; + // ui::LayerAnimationObserver: + void OnLayerAnimationStarted(ui::LayerAnimationSequence* sequence) override; + void OnLayerAnimationEnded(ui::LayerAnimationSequence* sequence) override; + void OnLayerAnimationAborted(ui::LayerAnimationSequence* sequence) override; + void OnLayerAnimationScheduled(ui::LayerAnimationSequence* sequence) override; + + // aura::WindowObserver: + void OnWindowDestroying(aura::Window* window) override; + void increment_app_window_drag_count() { ++app_window_drag_count_; } void increment_app_window_drag_in_splitview_count() { ++app_window_drag_in_splitview_count_; @@ -156,6 +176,7 @@ } private: + class TabletModeTransitionFpsCounter; friend class TabletModeControllerTestApi; // Used for recording metrics for intervals of time spent in @@ -165,6 +186,15 @@ TABLET_MODE_INTERVAL_ACTIVE }; + // Tracks whether we are in the process of entering or exiting tablet mode. + // Used for logging histogram metrics. + enum class State { + kInClamshellMode, + kEnteringTabletMode, + kInTabletMode, + kExitingTabletMode, + }; + // If EC cannot handle lid angle calc, browser detects hinge rotation from // base and lid accelerometers and automatically start / stop tablet mode. void HandleHingeRotation(scoped_refptr<const AccelerometerUpdate> update); @@ -246,6 +276,10 @@ // Resets |occlusion_tracker_pauser_|. void ResetPauser(); + // Called by LayerAnimationObserver overrides. Stops observing the window + // which is being animated from tablet <-> clamshell. + void StopObservingAnimation(bool record_stats); + // The maximized window manager (if enabled). std::unique_ptr<TabletModeWindowManager> tablet_mode_window_manager_; @@ -326,6 +360,8 @@ // Tracks whether a flag is used to force ui mode. UiMode force_ui_mode_ = UiMode::kNone; + State state_ = State::kInClamshellMode; + // Calls RecordLidAngle() periodically. base::RepeatingTimer record_lid_angle_timer_; @@ -341,6 +377,12 @@ // Observer to observe the bluetooth devices. std::unique_ptr<BluetoothDevicesObserver> bluetooth_devices_observer_; + // The window we are observing when animating from clamshell to tablet mode or + // vice versa. + aura::Window* observed_window_ = nullptr; + + std::unique_ptr<TabletModeTransitionFpsCounter> fps_counter_; + base::ObserverList<TabletModeObserver>::Unchecked tablet_mode_observers_; base::WeakPtrFactory<TabletModeController> weak_factory_;
diff --git a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc index 1f0660f..6c4fcba 100644 --- a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc +++ b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
@@ -17,6 +17,7 @@ #include "ash/public/cpp/app_types.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_switches.h" +#include "ash/public/cpp/fps_counter.h" #include "ash/public/cpp/tablet_mode.h" #include "ash/public/cpp/window_properties.h" #include "ash/screen_util.h" @@ -37,6 +38,7 @@ #include "ui/aura/client/aura_constants.h" #include "ui/aura/test/test_window_delegate.h" #include "ui/base/hit_test.h" +#include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/display/manager/display_manager.h" #include "ui/display/screen.h" #include "ui/display/test/display_manager_test_api.h" @@ -58,6 +60,9 @@ constexpr char kTabletModeEnabled[] = "Touchview_Enabled"; constexpr char kTabletModeDisabled[] = "Touchview_Disabled"; +constexpr char kEnterHistogram[] = "Ash.TabletMode.AnimationSmoothness.Enter"; +constexpr char kExitHistogram[] = "Ash.TabletMode.AnimationSmoothness.Exit"; + } // namespace // Test accelerometer data taken with the lid at less than 180 degrees while @@ -94,6 +99,7 @@ AshTestBase::SetUp(); AccelerometerReader::GetInstance()->RemoveObserver( tablet_mode_controller()); + FpsCounter::SetForceReportZeroAnimationForTest(true); // Set the first display to be the internal display for the accelerometer // screen rotation tests. @@ -104,6 +110,7 @@ } void TearDown() override { + FpsCounter::SetForceReportZeroAnimationForTest(false); AccelerometerReader::GetInstance()->AddObserver(tablet_mode_controller()); AshTestBase::TearDown(); } @@ -1528,4 +1535,69 @@ EXPECT_FALSE(IsTabletModeStarted()); } +TEST_F(TabletModeControllerTest, TabletModeTransitionHistogramsNotLogged) { + ui::ScopedAnimationDurationScaleMode test_duration_mode( + ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); + base::HistogramTester histogram_tester; + + // Tests that we get no animation smoothness histograms when entering or + // exiting tablet mode with no windows. + { + SCOPED_TRACE("No window"); + histogram_tester.ExpectTotalCount(kEnterHistogram, 0); + histogram_tester.ExpectTotalCount(kExitHistogram, 0); + tablet_mode_controller()->EnableTabletModeWindowManager(true); + tablet_mode_controller()->EnableTabletModeWindowManager(false); + histogram_tester.ExpectTotalCount(kEnterHistogram, 0); + histogram_tester.ExpectTotalCount(kExitHistogram, 0); + } + + // Test that we get no animation smoothness histograms when entering or + // exiting tablet mode with a maximized window as no animation will take + // place. + auto window = CreateTestWindow(gfx::Rect(200, 200)); + { + SCOPED_TRACE("Window is maximized"); + wm::GetWindowState(window.get())->Maximize(); + tablet_mode_controller()->EnableTabletModeWindowManager(true); + window->layer()->GetAnimator()->StopAnimating(); + histogram_tester.ExpectTotalCount(kEnterHistogram, 0); + histogram_tester.ExpectTotalCount(kExitHistogram, 0); + tablet_mode_controller()->EnableTabletModeWindowManager(false); + window->layer()->GetAnimator()->StopAnimating(); + histogram_tester.ExpectTotalCount(kEnterHistogram, 0); + histogram_tester.ExpectTotalCount(kExitHistogram, 0); + } +} + +TEST_F(TabletModeControllerTest, TabletModeTransitionHistogramsLogged) { + ui::ScopedAnimationDurationScaleMode test_duration_mode( + ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); + base::HistogramTester histogram_tester; + + // We have two windows, which both animated into tablet mode, but we only + // observe and record smoothness for one. + auto window = CreateTestWindow(gfx::Rect(200, 200)); + auto window2 = CreateTestWindow(gfx::Rect(300, 200)); + + // Tests that we get one enter and one exit animation smoothess histogram when + // entering and exiting tablet mode with a normal window. + tablet_mode_controller()->EnableTabletModeWindowManager(true); + EXPECT_TRUE(window->layer()->GetAnimator()->is_animating()); + EXPECT_TRUE(window2->layer()->GetAnimator()->is_animating()); + window->layer()->GetAnimator()->StopAnimating(); + window2->layer()->GetAnimator()->StopAnimating(); + histogram_tester.ExpectTotalCount(kEnterHistogram, 1); + histogram_tester.ExpectTotalCount(kExitHistogram, 0); + + // Only |window2| animates on exit because on animation start |window| is + // fully covered by |window2|. + tablet_mode_controller()->EnableTabletModeWindowManager(false); + EXPECT_FALSE(window->layer()->GetAnimator()->is_animating()); + EXPECT_TRUE(window2->layer()->GetAnimator()->is_animating()); + window2->layer()->GetAnimator()->StopAnimating(); + histogram_tester.ExpectTotalCount(kEnterHistogram, 1); + histogram_tester.ExpectTotalCount(kExitHistogram, 1); +} + } // namespace ash
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager.cc b/ash/wm/tablet_mode/tablet_mode_window_manager.cc index 291cc42b..bca3e68 100644 --- a/ash/wm/tablet_mode/tablet_mode_window_manager.cc +++ b/ash/wm/tablet_mode/tablet_mode_window_manager.cc
@@ -75,7 +75,26 @@ } // namespace -TabletModeWindowManager::~TabletModeWindowManager() { +TabletModeWindowManager::~TabletModeWindowManager() = default; + +void TabletModeWindowManager::Init() { + // The overview mode needs to be ended before the tablet mode is started. To + // guarantee the proper order, it will be turned off from here. + CancelOverview(); + + ArrangeWindowsForTabletMode(); + AddWindowCreationObservers(); + EnableBackdropBehindTopWindowOnEachDisplay(true); + display::Screen::GetScreen()->AddObserver(this); + Shell::Get()->AddShellObserver(this); + Shell::Get()->session_controller()->AddObserver(this); + Shell::Get()->overview_controller()->AddObserver(this); + accounts_since_entering_tablet_.insert( + Shell::Get()->session_controller()->GetActiveAccountId()); + event_handler_ = std::make_unique<wm::TabletModeEventHandler>(); +} + +void TabletModeWindowManager::Shutdown() { // Overview mode needs to be ended before exiting tablet mode to prevent // transforming windows which are currently in // overview: http://crbug.com/366605 @@ -96,11 +115,14 @@ return window_state_map_.size(); } +bool TabletModeWindowManager::IsTrackingWindow(aura::Window* window) { + return base::ContainsKey(window_state_map_, window); +} + void TabletModeWindowManager::AddWindow(aura::Window* window) { // Only add the window if it is a direct dependent of a container window // and not yet tracked. - if (base::ContainsKey(window_state_map_, window) || - !IsContainerWindow(window->parent())) { + if (IsTrackingWindow(window) || !IsContainerWindow(window->parent())) { return; } @@ -242,7 +264,7 @@ void TabletModeWindowManager::OnWindowVisibilityChanged(aura::Window* window, bool visible) { // Skip if it's already managed. - if (base::ContainsKey(window_state_map_, window)) + if (IsTrackingWindow(window)) return; if (IsContainerWindow(window->parent()) && @@ -252,7 +274,7 @@ TrackWindow(window); // When the state got added, the "WM_EVENT_ADDED_TO_WORKSPACE" event got // already sent and we have to notify our state again. - if (base::ContainsKey(window_state_map_, window)) { + if (IsTrackingWindow(window)) { wm::WMEvent event(wm::WM_EVENT_ADDED_TO_WORKSPACE); wm::GetWindowState(window)->OnWMEvent(&event); } @@ -340,27 +362,19 @@ } } +void TabletModeWindowManager::OnPostWindowStateTypeChange( + wm::WindowState* window_state, + mojom::WindowStateType old_type) { + Shell::Get()->tablet_mode_controller()->MaybeObserveBoundsAnimation( + window_state->window()); +} + void TabletModeWindowManager::SetIgnoreWmEventsForExit() { for (auto& pair : window_state_map_) pair.second->set_ignore_wm_events(true); } -TabletModeWindowManager::TabletModeWindowManager() { - // The overview mode needs to be ended before the tablet mode is started. To - // guarantee the proper order, it will be turned off from here. - CancelOverview(); - - ArrangeWindowsForTabletMode(); - AddWindowCreationObservers(); - EnableBackdropBehindTopWindowOnEachDisplay(true); - display::Screen::GetScreen()->AddObserver(this); - Shell::Get()->AddShellObserver(this); - Shell::Get()->session_controller()->AddObserver(this); - Shell::Get()->overview_controller()->AddObserver(this); - accounts_since_entering_tablet_.insert( - Shell::Get()->session_controller()->GetActiveAccountId()); - event_handler_ = std::make_unique<wm::TabletModeEventHandler>(); -} +TabletModeWindowManager::TabletModeWindowManager() = default; mojom::WindowStateType TabletModeWindowManager::GetDesktopWindowStateType( aura::Window* window) const { @@ -445,9 +459,15 @@ void TabletModeWindowManager::ArrangeWindowsForDesktopMode( bool was_in_overview) { - while (window_state_map_.size()) - ForgetWindow(window_state_map_.begin()->first, false /* destroyed */, - was_in_overview); + while (window_state_map_.size()) { + // Observe the window state so that when TabletModeWindowState gets detached + // and default state gets attached, we can see the change without adding a + // dependency in DefaultState. + aura::Window* window = window_state_map_.begin()->first; + wm::GetWindowState(window)->AddObserver(this); + ForgetWindow(window, /*destroyed=*/false, was_in_overview); + wm::GetWindowState(window)->RemoveObserver(this); + } } void TabletModeWindowManager::TrackWindow(aura::Window* window, @@ -457,11 +477,14 @@ if (!ShouldHandleWindow(window)) return; - DCHECK(!base::ContainsKey(window_state_map_, window)); + DCHECK(!IsTrackingWindow(window)); window->AddObserver(this); // We create and remember a tablet mode state which will attach itself to - // the provided state object. + // the provided state object. First set the map to point to a null object + // because on creating a TabletModeWindowState will check to see if |window| + // is being tracked by |this|, and we want that to return true. + window_state_map_.emplace(window, nullptr); window_state_map_[window] = new TabletModeWindowState( window, this, snap, animate_bounds_on_attach, entering_tablet_mode); } @@ -490,7 +513,7 @@ // By telling the state object to revert, it will switch back the old // State object and destroy itself, calling WindowStateDestroyed(). it->second->LeaveTabletMode(wm::GetWindowState(it->first), was_in_overview); - DCHECK(!base::ContainsKey(window_state_map_, window)); + DCHECK(!IsTrackingWindow(window)); } }
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager.h b/ash/wm/tablet_mode/tablet_mode_window_manager.h index b6452464..17341a06 100644 --- a/ash/wm/tablet_mode/tablet_mode_window_manager.h +++ b/ash/wm/tablet_mode/tablet_mode_window_manager.h
@@ -17,9 +17,11 @@ #include "ash/wm/mru_window_tracker.h" #include "ash/wm/overview/overview_observer.h" #include "ash/wm/splitview/split_view_controller.h" +#include "ash/wm/window_state_observer.h" #include "base/containers/flat_set.h" #include "base/macros.h" #include "ui/aura/window_observer.h" +#include "ui/compositor/layer_animation_observer.h" #include "ui/display/display_observer.h" namespace aura { @@ -44,11 +46,22 @@ public display::DisplayObserver, public OverviewObserver, public ShellObserver, - public SessionObserver { + public SessionObserver, + public wm::WindowStateObserver { public: - // This should only be deleted by the creator (ash::Shell). + // This should only be deleted by the creator (TabletModeController). ~TabletModeWindowManager() override; + void Init(); + + // Stops tracking windows and returns them to their clamshell mode state. Work + // is done here instead of the destructor because TabletModeController may + // still need this object alive during shutdown. + void Shutdown(); + + // True if |window| is in |window_state_map_|. + bool IsTrackingWindow(aura::Window* window); + // Returns the number of maximized & tracked windows by this manager. int GetNumberOfManagedWindows(); @@ -86,13 +99,17 @@ // SessionObserver: void OnActiveUserSessionChanged(const AccountId& account_id) override; + // wm::WindowStateObserver: + void OnPostWindowStateTypeChange(wm::WindowState* window_state, + mojom::WindowStateType old_type) override; + // Tell all managing windows not to handle WM events. void SetIgnoreWmEventsForExit(); protected: friend class TabletModeController; - // The object should only be created by the ash::Shell. + // The object should only be created by TabletModeController. TabletModeWindowManager(); private:
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc index d94140a14..2c1827a 100644 --- a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc +++ b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
@@ -431,7 +431,7 @@ // Test that a window which got created while the tablet mode window manager // is active gets restored to a usable (non tiny) size upon switching back. TEST_F(TabletModeWindowManagerTest, - CreateWindowInMaximizedModeRestoresToUsefulSize) { + CreateWindowInTabletModeRestoresToUsefulSize) { TabletModeWindowManager* manager = CreateTabletModeWindowManager(); ASSERT_TRUE(manager); EXPECT_EQ(0, manager->GetNumberOfManagedWindows()); @@ -1191,7 +1191,7 @@ // Check that the full screen mode will stay active when the tablet mode is // ended. TEST_F(TabletModeWindowManagerTest, - FullScreenModeRemainsWhenCreatedInMaximizedMode) { + FullScreenModeRemainsWhenCreatedInTabletMode) { CreateTabletModeWindowManager(); gfx::Rect rect(20, 140, 100, 100);
diff --git a/ash/wm/tablet_mode/tablet_mode_window_state.cc b/ash/wm/tablet_mode/tablet_mode_window_state.cc index 761d8d4e..7100352 100644 --- a/ash/wm/tablet_mode/tablet_mode_window_state.cc +++ b/ash/wm/tablet_mode/tablet_mode_window_state.cc
@@ -16,6 +16,7 @@ #include "ash/wm/screen_pinning_controller.h" #include "ash/wm/splitview/split_view_controller.h" #include "ash/wm/splitview/split_view_utils.h" +#include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "ash/wm/tablet_mode/tablet_mode_window_manager.h" #include "ash/wm/window_properties.h" #include "ash/wm/window_state_util.h" @@ -76,7 +77,7 @@ } // Returns the maximized/full screen and/or centered bounds of a window. -gfx::Rect GetBoundsInMaximizedMode(wm::WindowState* state_object) { +gfx::Rect GetBoundsInTabletMode(wm::WindowState* state_object) { if (state_object->IsFullscreen() || state_object->IsPinned()) { return screen_util::GetFullscreenWindowBoundsInParent( state_object->window()); @@ -158,7 +159,7 @@ // static void TabletModeWindowState::UpdateWindowPosition(wm::WindowState* window_state, bool animate) { - gfx::Rect bounds_in_parent = GetBoundsInMaximizedMode(window_state); + gfx::Rect bounds_in_parent = GetBoundsInTabletMode(window_state); if (bounds_in_parent == window_state->window()->GetTargetBounds()) return; @@ -451,7 +452,7 @@ if (current_state_type_ == mojom::WindowStateType::MINIMIZED) return; - gfx::Rect bounds_in_parent = GetBoundsInMaximizedMode(window_state); + gfx::Rect bounds_in_parent = GetBoundsInTabletMode(window_state); // If we have a target bounds rectangle, we center it and set it // accordingly. if (!bounds_in_parent.IsEmpty() && @@ -465,6 +466,8 @@ // Reset the |enter_animation_type_| to DEFAULT it if is STEP_END, which // is set for non-top windows when entering tablet mode. set_enter_animation_type(DEFAULT); + Shell::Get()->tablet_mode_controller()->MaybeObserveBoundsAnimation( + window_state->window()); return; } // If we animate (to) tablet mode, we want to use the cross fade to @@ -475,6 +478,9 @@ window_state->SetBoundsDirect(bounds_in_parent); else window_state->SetBoundsDirectAnimated(bounds_in_parent); + + Shell::Get()->tablet_mode_controller()->MaybeObserveBoundsAnimation( + window_state->window()); } } }
diff --git a/base/files/file_path_watcher_linux.cc b/base/files/file_path_watcher_linux.cc index 22732f2..3f5eb8e 100644 --- a/base/files/file_path_watcher_linux.cc +++ b/base/files/file_path_watcher_linux.cc
@@ -13,6 +13,7 @@ #include <unistd.h> #include <algorithm> +#include <fstream> #include <map> #include <memory> #include <set> @@ -43,9 +44,39 @@ namespace { +// The /proc path to max_user_watches. +constexpr char kInotifyMaxUserWatchesPath[] = + "/proc/sys/fs/inotify/max_user_watches"; + +// This is a soft limit. If there are more than |kExpectedFilePathWatches| +// FilePathWatchers for a user, than they might affect each other's inotify +// watchers limit. +constexpr int kExpectedFilePathWatchers = 16; + +// The default max inotify watchers limit per user, if reading +// /proc/sys/fs/inotify/max_user_watches fails. +constexpr int kDefaultInotifyMaxUserWatches = 8192; + class FilePathWatcherImpl; class InotifyReader; +// Get the maximum number of inotify watches can be used by a FilePathWatcher +// instance. This is based on /proc/sys/fs/inotify/max_user_watches entry. +int GetMaxNumberOfInotifyWatches() { + const static int max = []() { + int max_number_of_inotify_watches = 0; + + std::ifstream in(kInotifyMaxUserWatchesPath); + if (!in.is_open() || !(in >> max_number_of_inotify_watches)) { + LOG(ERROR) << "Failed to read " << kInotifyMaxUserWatchesPath; + return kDefaultInotifyMaxUserWatches / kExpectedFilePathWatchers; + } + + return max_number_of_inotify_watches / kExpectedFilePathWatchers; + }(); + return max; +} + class InotifyReaderThreadDelegate final : public PlatformThread::Delegate { public: explicit InotifyReaderThreadDelegate(int inotify_fd) @@ -67,6 +98,7 @@ public: using Watch = int; // Watch descriptor used by AddWatch() and RemoveWatch(). static constexpr Watch kInvalidWatch = -1; + static constexpr Watch kWatchLimitExceeded = -2; // Watch directory |path| for changes. |watcher| will be notified on each // change. Returns |kInvalidWatch| on failure. @@ -125,6 +157,14 @@ bool deleted, bool is_dir); + // Increase the number of inotify watches associated to this + // FilePathWatcherImpl instance. + bool IncreaseWatch(); + + // Decrease the number of inotify watches associated to this + // FilePathWatcherImpl instance. + void DecreaseWatch(); + private: void OnFilePathChangedOnOriginSequence(InotifyReader::Watch fired_watch, const FilePath::StringType& child, @@ -200,6 +240,9 @@ // |target_| and always stores an empty next component name in |subdir|. std::vector<WatchEntry> watches_; + // The number of inotify watches currently associated with this instance. + int number_of_inotify_watches_ = 0; + std::unordered_map<InotifyReader::Watch, FilePath> recursive_paths_by_watch_; std::map<FilePath, InotifyReader::Watch> recursive_watches_by_path_; @@ -296,13 +339,19 @@ AutoLock auto_lock(lock_); ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::WILL_BLOCK); + + if (!watcher->IncreaseWatch()) + return kWatchLimitExceeded; Watch watch = inotify_add_watch(inotify_fd_, path.value().c_str(), IN_ATTRIB | IN_CREATE | IN_DELETE | IN_CLOSE_WRITE | IN_MOVE | IN_ONLYDIR); - if (watch == kInvalidWatch) + if (watch == kInvalidWatch) { + // This watch shouldn't be counted. + watcher->DecreaseWatch(); return kInvalidWatch; + } watchers_[watch].insert(watcher); @@ -316,6 +365,7 @@ AutoLock auto_lock(lock_); watchers_[watch].erase(watcher); + watcher->DecreaseWatch(); if (watchers_[watch].empty()) { watchers_.erase(watch); @@ -453,6 +503,21 @@ } } +bool FilePathWatcherImpl::IncreaseWatch() { + if (number_of_inotify_watches_ >= GetMaxNumberOfInotifyWatches()) { + // Notify that error happened since we are hitting the inotify watches + // limit. + callback_.Run(target_, true /* error */); + return false; + } + ++number_of_inotify_watches_; + return true; +} + +void FilePathWatcherImpl::DecreaseWatch() { + --number_of_inotify_watches_; +} + bool FilePathWatcherImpl::Watch(const FilePath& path, bool recursive, const FilePathWatcher::Callback& callback) { @@ -506,6 +571,8 @@ watch_entry.watch = InotifyReader::kInvalidWatch; watch_entry.linkname.clear(); watch_entry.watch = g_inotify_reader.Get().AddWatch(path, this); + if (watch_entry.watch == InotifyReader::kWatchLimitExceeded) + break; if (watch_entry.watch == InotifyReader::kInvalidWatch) { // Ignore the error code (beyond symlink handling) to attempt to add // watches on accessible children of unreadable directories. Note that @@ -587,6 +654,8 @@ // Add new watches. InotifyReader::Watch watch = g_inotify_reader.Get().AddWatch(current, this); + if (watch == InotifyReader::kWatchLimitExceeded) + break; TrackWatchForRecursion(watch, current); } else { // Update existing watches. @@ -594,6 +663,8 @@ DCHECK_NE(InotifyReader::kInvalidWatch, old_watch); InotifyReader::Watch watch = g_inotify_reader.Get().AddWatch(current, this); + if (watch == InotifyReader::kWatchLimitExceeded) + break; if (watch != old_watch) { g_inotify_reader.Get().RemoveWatch(old_watch, this); recursive_paths_by_watch_.erase(old_watch);
diff --git a/base/task/sequence_manager/time_domain.h b/base/task/sequence_manager/time_domain.h index 22506672..152ebed 100644 --- a/base/task/sequence_manager/time_domain.h +++ b/base/task/sequence_manager/time_domain.h
@@ -64,7 +64,7 @@ // This is the signal that virtual time should step forward. If // RunLoop::QuitWhenIdle has been called then |quit_when_idle_requested| will - // be true. Returns true if time advanced and there is now a task to run. + // be true. Returns true if there is a task to run now. virtual bool MaybeFastForwardToNextTask(bool quit_when_idle_requested) = 0; protected:
diff --git a/base/task/thread_pool/platform_native_worker_pool_win.cc b/base/task/thread_pool/platform_native_worker_pool_win.cc index 9b16a5e5..8eb2218 100644 --- a/base/task/thread_pool/platform_native_worker_pool_win.cc +++ b/base/task/thread_pool/platform_native_worker_pool_win.cc
@@ -6,11 +6,38 @@ #include "base/optional.h" #include "base/task/thread_pool/task_tracker.h" +#include "base/threading/scoped_blocking_call.h" #include "base/win/scoped_com_initializer.h" namespace base { namespace internal { +class PlatformNativeWorkerPoolWin::ScopedCallbackMayRunLongObserver + : public BlockingObserver { + public: + ScopedCallbackMayRunLongObserver(PTP_CALLBACK_INSTANCE callback) + : callback_(callback) { + SetBlockingObserverForCurrentThread(this); + } + + ~ScopedCallbackMayRunLongObserver() override { + ClearBlockingObserverForCurrentThread(); + } + + // BlockingObserver: + void BlockingStarted(BlockingType blocking_type) override { + ::CallbackMayRunLong(callback_); + } + + void BlockingTypeUpgraded() override {} + void BlockingEnded() override {} + + private: + PTP_CALLBACK_INSTANCE callback_; + + DISALLOW_COPY_AND_ASSIGN(ScopedCallbackMayRunLongObserver); +}; + PlatformNativeWorkerPoolWin::PlatformNativeWorkerPoolWin( TrackedRef<TaskTracker> task_tracker, TrackedRef<Delegate> delegate, @@ -44,13 +71,13 @@ void PlatformNativeWorkerPoolWin::SubmitWork() { // TODO(fdoray): Handle priorities by having different work objects and using - // SetThreadpoolCallbackPriority() and SetThreadpoolCallbackRunsLong(). + // SetThreadpoolCallbackPriority(). ::SubmitThreadpoolWork(work_); } // static void CALLBACK PlatformNativeWorkerPoolWin::RunNextSequence( - PTP_CALLBACK_INSTANCE, + PTP_CALLBACK_INSTANCE callback_instance, void* scheduler_worker_pool_windows_impl, PTP_WORK) { auto* worker_pool = static_cast<PlatformNativeWorkerPoolWin*>( @@ -63,6 +90,9 @@ if (worker_pool->worker_environment_ == WorkerEnvironment::COM_MTA) com_initializer.emplace(win::ScopedCOMInitializer::kMTA); + ScopedCallbackMayRunLongObserver callback_may_run_long_observer( + callback_instance); + worker_pool->RunNextSequenceImpl(); }
diff --git a/base/task/thread_pool/platform_native_worker_pool_win.h b/base/task/thread_pool/platform_native_worker_pool_win.h index cb7fe7a..5adb15f 100644 --- a/base/task/thread_pool/platform_native_worker_pool_win.h +++ b/base/task/thread_pool/platform_native_worker_pool_win.h
@@ -34,8 +34,10 @@ ~PlatformNativeWorkerPoolWin() override; private: + class ScopedCallbackMayRunLongObserver; + // Callback that gets run by |pool_|. - static void CALLBACK RunNextSequence(PTP_CALLBACK_INSTANCE, + static void CALLBACK RunNextSequence(PTP_CALLBACK_INSTANCE callback_instance, void* scheduler_worker_pool_windows_impl, PTP_WORK);
diff --git a/base/test/scoped_task_environment.cc b/base/test/scoped_task_environment.cc index 724b37e2..76811d1 100644 --- a/base/test/scoped_task_environment.cc +++ b/base/test/scoped_task_environment.cc
@@ -191,12 +191,17 @@ // We don't need to call ReclaimMemory here because // DelayTillNextTask will have dealt with cancelled delayed tasks for us. Optional<TimeTicks> run_time = NextScheduledRunTime(); - if (!run_time || run_time == now_ticks_) { - // We've run out of tasks (or an immediate task came in racily from - // another thread after reaching idle, ignore it, it will be processed in - // the next run as-if it arrived slightly later). - // ScopedTaskEnvironment::FastForwardBy requires the remaining virtual - // time to be consumed upon reaching idle. + // If an immediate task came in racily from another thread, resume work + // without advancing time. This can happen regardless of whether the main + // thread has more delayed tasks scheduled before |allow_advance_until_|. If + // there are such tasks, auto-advancing time all the way would be incorrect. + // In both cases, resuming is fine. + if (run_time == now_ticks_) + return true; + + if (!run_time) { + // We've run out of tasks. ScopedTaskEnvironment::FastForwardBy requires + // the remaining virtual time to be consumed upon reaching idle. if (now_ticks_ < allow_advance_until_ && !allow_advance_until_.is_max()) SetTime(allow_advance_until_); return false; @@ -439,6 +444,11 @@ : sequence_manager_->GetRealTimeDomain(); } +void ScopedTaskEnvironment::SetAllowTimeToAutoAdvanceUntilForTesting( + TimeTicks advance_until) { + mock_time_domain_->SetAllowTimeToAutoAdvanceUntil(advance_until); +} + sequence_manager::SequenceManager* ScopedTaskEnvironment::sequence_manager() const { DCHECK(subclass_creates_default_taskrunner_);
diff --git a/base/test/scoped_task_environment.h b/base/test/scoped_task_environment.h index e6ccfc0..2e17d0ce 100644 --- a/base/test/scoped_task_environment.h +++ b/base/test/scoped_task_environment.h
@@ -236,6 +236,9 @@ // Returns the TimeDomain driving this ScopedTaskEnvironment. sequence_manager::TimeDomain* GetTimeDomain() const; + // For testing the MockTimeDomain. + void SetAllowTimeToAutoAdvanceUntilForTesting(TimeTicks advance_until); + sequence_manager::SequenceManager* sequence_manager() const; void DeferredInitFromSubclass(
diff --git a/base/test/scoped_task_environment_unittest.cc b/base/test/scoped_task_environment_unittest.cc index 0dc605f..73ef2f6 100644 --- a/base/test/scoped_task_environment_unittest.cc +++ b/base/test/scoped_task_environment_unittest.cc
@@ -15,10 +15,12 @@ #include "base/synchronization/waitable_event.h" #include "base/task/post_task.h" #include "base/task/sequence_manager/time_domain.h" +#include "base/test/bind_test_util.h" #include "base/test/mock_callback.h" #include "base/test/test_timeouts.h" #include "base/threading/platform_thread.h" #include "base/threading/sequence_local_storage_slot.h" +#include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/clock.h" #include "base/time/default_clock.h" @@ -50,6 +52,7 @@ : ScopedTaskEnvironment(args...) {} using ScopedTaskEnvironment::GetTimeDomain; + using ScopedTaskEnvironment::SetAllowTimeToAutoAdvanceUntilForTesting; }; class ScopedTaskEnvironmentTest @@ -380,23 +383,124 @@ TEST_F(ScopedTaskEnvironmentTest, MockTimeDomain_MaybeFastForwardToNextTask_ImmediateTaskPending) { + ScopedTaskEnvironmentForTest scoped_task_environment( + ScopedTaskEnvironment::MainThreadType::MOCK_TIME, + ScopedTaskEnvironment::NowSource::MAIN_THREAD_MOCK_TIME); + const TimeTicks start_time = base::TimeTicks::Now(); + scoped_task_environment.SetAllowTimeToAutoAdvanceUntilForTesting( + start_time + TimeDelta::FromSeconds(100)); + + ThreadTaskRunnerHandle::Get()->PostDelayedTask(FROM_HERE, base::DoNothing(), + TimeDelta::FromSeconds(42)); + ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, base::DoNothing()); + EXPECT_TRUE( + scoped_task_environment.GetTimeDomain()->MaybeFastForwardToNextTask( + false)); + EXPECT_EQ(start_time, base::TimeTicks::Now()); +} + +TEST_F(ScopedTaskEnvironmentTest, + MockTimeDomain_MaybeFastForwardToNextTask_TaskAfterAutoAdvanceUntil) { constexpr base::TimeDelta kDelay = TimeDelta::FromSeconds(42); ScopedTaskEnvironmentForTest scoped_task_environment( ScopedTaskEnvironment::MainThreadType::MOCK_TIME, ScopedTaskEnvironment::NowSource::MAIN_THREAD_MOCK_TIME); const TimeTicks start_time = base::TimeTicks::Now(); - EXPECT_FALSE( - scoped_task_environment.GetTimeDomain()->MaybeFastForwardToNextTask( - false)); - EXPECT_EQ(start_time, base::TimeTicks::Now()); + scoped_task_environment.SetAllowTimeToAutoAdvanceUntilForTesting(start_time + + kDelay); ThreadTaskRunnerHandle::Get()->PostDelayedTask(FROM_HERE, base::DoNothing(), - kDelay); - ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, base::DoNothing()); + TimeDelta::FromSeconds(100)); + EXPECT_TRUE( + scoped_task_environment.GetTimeDomain()->MaybeFastForwardToNextTask( + false)); + EXPECT_EQ(start_time + kDelay, base::TimeTicks::Now()); +} + +TEST_F(ScopedTaskEnvironmentTest, + MockTimeDomain_MaybeFastForwardToNextTask_NoTasksPending) { + constexpr base::TimeDelta kDelay = TimeDelta::FromSeconds(42); + ScopedTaskEnvironmentForTest scoped_task_environment( + ScopedTaskEnvironment::MainThreadType::MOCK_TIME, + ScopedTaskEnvironment::NowSource::MAIN_THREAD_MOCK_TIME); + const TimeTicks start_time = base::TimeTicks::Now(); + scoped_task_environment.SetAllowTimeToAutoAdvanceUntilForTesting(start_time + + kDelay); + EXPECT_FALSE( scoped_task_environment.GetTimeDomain()->MaybeFastForwardToNextTask( false)); - EXPECT_EQ(start_time, base::TimeTicks::Now()); + EXPECT_EQ(start_time + kDelay, base::TimeTicks::Now()); +} + +TEST_F(ScopedTaskEnvironmentTest, FastForwardZero) { + ScopedTaskEnvironment scoped_task_environment( + ScopedTaskEnvironment::MainThreadType::MOCK_TIME); + + int run_count = 0; + ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { run_count++; })); + ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { run_count++; })); + ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { run_count++; })); + + scoped_task_environment.FastForwardBy(base::TimeDelta()); + + EXPECT_EQ(3, run_count); +} + +#if defined(OS_IOS) +// This test flakily times out on iOS. +#define MAYBE_CrossThreadTaskPostingDoesntAffectMockTime \ + DISABLED_CrossThreadTaskPostingDoesntAffectMockTime +#else +#define MAYBE_CrossThreadTaskPostingDoesntAffectMockTime \ + CrossThreadTaskPostingDoesntAffectMockTime +#endif + +TEST_F(ScopedTaskEnvironmentTest, + MAYBE_CrossThreadTaskPostingDoesntAffectMockTime) { + ScopedTaskEnvironment scoped_task_environment( + ScopedTaskEnvironment::MainThreadType::MOCK_TIME); + scoped_refptr<SingleThreadTaskRunner> main_thread = + ThreadTaskRunnerHandle::Get(); + + // Start a thread that will spam the main thread with uninteresting tasks + // which shouldn't interfere with main thread MOCK_TIME. + Thread spamming_thread("test thread"); + spamming_thread.Start(); + AtomicFlag stop_spamming; + + RepeatingClosure repeating_spam_task = BindLambdaForTesting([&]() { + if (stop_spamming.IsSet()) + return; + // We don't want to completely drown out main thread tasks so we rate limit + // how fast we post to the main thread to at most 1 per 50 microseconds. + spamming_thread.task_runner()->PostDelayedTask( + FROM_HERE, repeating_spam_task, TimeDelta::FromMicroseconds(50)); + main_thread->PostTask(FROM_HERE, DoNothing()); + }); + spamming_thread.task_runner()->PostTask(FROM_HERE, repeating_spam_task); + + // Start a repeating delayed task. + int count = 0; + RepeatingClosure repeating_delayed_task = BindLambdaForTesting([&]() { + main_thread->PostDelayedTask(FROM_HERE, repeating_delayed_task, + TimeDelta::FromSeconds(1)); + + count++; + }); + main_thread->PostDelayedTask(FROM_HERE, repeating_delayed_task, + TimeDelta::FromSeconds(1)); + + scoped_task_environment.FastForwardBy(TimeDelta::FromSeconds(10000)); + + // If this test flakes it's because there's an error with MockTimeDomain. + EXPECT_EQ(count, 10000); + + stop_spamming.Set(); + spamming_thread.Stop(); } #if defined(OS_WIN)
diff --git a/base/threading/scoped_blocking_call.cc b/base/threading/scoped_blocking_call.cc index f5fcad0..a548e12 100644 --- a/base/threading/scoped_blocking_call.cc +++ b/base/threading/scoped_blocking_call.cc
@@ -121,7 +121,7 @@ tls_blocking_observer.Get().Set(blocking_observer); } -void ClearBlockingObserverForTesting() { +void ClearBlockingObserverForCurrentThread() { tls_blocking_observer.Get().Set(nullptr); }
diff --git a/base/threading/scoped_blocking_call.h b/base/threading/scoped_blocking_call.h index 9161f20..4b3666b 100644 --- a/base/threading/scoped_blocking_call.h +++ b/base/threading/scoped_blocking_call.h
@@ -160,7 +160,7 @@ BASE_EXPORT void SetBlockingObserverForCurrentThread( BlockingObserver* blocking_observer); -BASE_EXPORT void ClearBlockingObserverForTesting(); +BASE_EXPORT void ClearBlockingObserverForCurrentThread(); // Unregisters the |blocking_observer| on the current thread within its scope. // Used in ThreadPool tests to prevent calls to //base sync primitives from
diff --git a/base/threading/scoped_blocking_call_unittest.cc b/base/threading/scoped_blocking_call_unittest.cc index 3ddf07bb..4c703b5 100644 --- a/base/threading/scoped_blocking_call_unittest.cc +++ b/base/threading/scoped_blocking_call_unittest.cc
@@ -34,7 +34,7 @@ } ~ScopedBlockingCallTest() override { - internal::ClearBlockingObserverForTesting(); + internal::ClearBlockingObserverForCurrentThread(); } testing::StrictMock<MockBlockingObserver> observer_;
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py index 3f2f5df..3766bbb 100755 --- a/build/android/gyp/compile_resources.py +++ b/build/android/gyp/compile_resources.py
@@ -15,6 +15,7 @@ import argparse import collections import contextlib +import filecmp import multiprocessing.pool import os import re @@ -64,20 +65,20 @@ input_opts.add_argument( '--aapt2-path', required=True, help='Path to the Android aapt2 tool.') - input_opts.add_argument('--android-manifest', required=True, - help='AndroidManifest.xml path') input_opts.add_argument( + '--android-manifest', required=True, help='AndroidManifest.xml path.') + group = input_opts.add_mutually_exclusive_group() + group.add_argument( '--shared-resources', action='store_true', help='Make all resources in R.java non-final and allow the resource IDs ' - 'to be reset to a different package index when the apk is loaded by ' - 'another application at runtime.') - - input_opts.add_argument( + 'to be reset to a different package index when the apk is loaded by ' + 'another application at runtime.') + group.add_argument( '--app-as-shared-lib', action='store_true', help='Same as --shared-resources, but also ensures all resource IDs are ' - 'directly usable from the APK loaded as an application.') + 'directly usable from the APK loaded as an application.') input_opts.add_argument( '--package-id', @@ -94,7 +95,8 @@ help='Package name that will be used to determine package ID.') input_opts.add_argument( - '--arsc-package-name', help='Package name to use for resources.arsc file') + '--arsc-package-name', + help='Package name to use for resources.arsc file.') input_opts.add_argument( '--shared-resources-whitelist', @@ -112,27 +114,22 @@ input_opts.add_argument( '--use-resource-ids-path', - help='Use resource IDs generated by aapt --emit-ids') + help='Use resource IDs generated by aapt --emit-ids.') - input_opts.add_argument('--proto-format', action='store_true', - help='Compile resources to protocol buffer format.') + input_opts.add_argument( + '--support-zh-hk', + action='store_true', + help='Use zh-rTW resources for zh-rHK.') - input_opts.add_argument('--support-zh-hk', action='store_true', - help='Use zh-rTW resources for zh-rHK.') - - input_opts.add_argument('--debuggable', - action='store_true', - help='Whether to add android:debuggable="true"') + input_opts.add_argument( + '--debuggable', + action='store_true', + help='Whether to add android:debuggable="true".') input_opts.add_argument('--version-code', help='Version code for apk.') input_opts.add_argument('--version-name', help='Version name for apk.') input_opts.add_argument( - '--no-compress', - help='disables compression for the given comma-separated list of ' - 'extensions') - - input_opts.add_argument( '--locale-whitelist', default='[]', help='GN list of languages to include. All other language configs will ' @@ -154,21 +151,25 @@ input_opts.add_argument('--webp-binary', default='', help='Path to the cwebp binary.') - input_opts.add_argument('--no-xml-namespaces', - action='store_true', - help='Whether to strip xml namespaces from processed ' - 'xml resources') + input_opts.add_argument( + '--no-xml-namespaces', + action='store_true', + help='Whether to strip xml namespaces from processed xml resources.') + + output_opts.add_argument('--arsc-path', help='Apk output for arsc format.') + output_opts.add_argument('--proto-path', help='Apk output for proto format.') + group = input_opts.add_mutually_exclusive_group() + group.add_argument( + '--optimized-arsc-path', + help='Output for `aapt2 optimize` for arsc format (enables the step).') + group.add_argument( + '--optimized-proto-path', + help='Output for `aapt2 optimize` for proto format (enables the step).') input_opts.add_argument( '--resources-config-path', help='Path to aapt2 resources config file.') - input_opts.add_argument( - '--optimized-resources-path', - help='Output for `aapt2 optimize` (also enables the step).') - output_opts.add_argument('--apk-path', required=True, - help='Path to output (partial) apk.') - - output_opts.add_argument('--apk-info-path', required=True, - help='Path to output info file for the partial apk.') + output_opts.add_argument( + '--info-path', help='Path to output info file for the partial apk.') output_opts.add_argument('--srcjar-out', help='Path to srcjar to contain generated R.java.') @@ -176,17 +177,15 @@ output_opts.add_argument('--r-text-out', help='Path to store the generated R.txt file.') - output_opts.add_argument('--proguard-file', - help='Path to proguard.txt generated file') + output_opts.add_argument( + '--proguard-file', help='Path to proguard.txt generated file.') output_opts.add_argument( '--proguard-file-main-dex', - help='Path to proguard.txt generated file for main dex') + help='Path to proguard.txt generated file for main dex.') output_opts.add_argument( - '--emit-ids-out', - help= - 'Path to file produced by aapt2 --emit-ids (for use with --stable-ids)') + '--emit-ids-out', help='Path to file produced by aapt2 --emit-ids.') options = parser.parse_args(args) @@ -198,9 +197,12 @@ options.resource_blacklist_exceptions = build_utils.ParseGnList( options.resource_blacklist_exceptions) - if options.shared_resources and options.app_as_shared_lib: - raise Exception('Only one of --app-as-shared-lib or --shared-resources ' - 'can be used.') + if options.optimized_proto_path and not options.proto_path: + # We could write to a temp file, but it's simpler to require it. + parser.error('--optimized-proto-path requires --proto-path') + + if not options.arsc_path and not options.proto_path: + parser.error('One of --arsc-path or --proto-path is required.') if options.package_name_to_id_mapping: package_names_list = build_utils.ParseGnList( @@ -372,54 +374,6 @@ return package_id -def _CreateLinkApkArgs(options): - """Create command-line arguments list to invoke 'aapt2 link'. - - Args: - options: The command-line options tuple. - Returns: - A list of strings corresponding to the command-line invokation for - the command, matching the arguments from |options|. - """ - link_command = [ - options.aapt2_path, - 'link', - '--version-code', options.version_code, - '--version-name', options.version_name, - '--auto-add-overlay', - '--no-version-vectors', - ] - - for j in options.include_resources: - link_command += ['-I', j] - if options.proguard_file: - link_command += ['--proguard', options.proguard_file] - if options.proguard_file_main_dex: - link_command += ['--proguard-main-dex', options.proguard_file_main_dex] - if options.emit_ids_out: - link_command += ['--emit-ids', options.emit_ids_out] - - if options.no_compress: - for ext in options.no_compress.split(','): - link_command += ['-0', ext] - - # Note: only one of --proto-format, --shared-lib or --app-as-shared-lib - # can be used with recent versions of aapt2. - if options.proto_format: - link_command.append('--proto-format') - elif options.shared_resources: - link_command.append('--shared-lib') - - if options.no_xml_namespaces: - link_command.append('--no-xml-namespaces') - - package_id = _PackageIdFromOptions(options) - if package_id is not None: - link_command += ['--package-id', package_id, '--allow-reserved-package-id'] - - return link_command - - def _FixManifest(options, temp_dir): """Fix the APK's AndroidManifest.xml. @@ -433,7 +387,7 @@ Returns: Tuple of: * Manifest path within |temp_dir|. - * Original package_name (if different from arsc_package_name). + * Original package_name. """ def maybe_extract_version(j): try: @@ -582,8 +536,7 @@ return partials -def _CreateResourceInfoFile( - renamed_paths, apk_info_path, dependencies_res_zips): +def _CreateResourceInfoFile(renamed_paths, info_path, dependencies_res_zips): lines = set() for zip_file in dependencies_res_zips: zip_info_file_path = zip_file + '.info' @@ -592,7 +545,7 @@ lines.update(zip_info_file.readlines()) for dest, source in renamed_paths.iteritems(): lines.add('Rename:{},{}\n'.format(dest, source)) - with build_utils.AtomicOutput(apk_info_path) as info_file: + with open(info_path, 'w') as info_file: info_file.writelines(sorted(lines)) @@ -661,19 +614,15 @@ path, lambda x: x not in shared_names_whitelist) -def _PackageApk(options, dep_subdirs, temp_dir, gen_dir, r_txt_path): - """Compile resources with aapt2 and generate intermediate .ap_ file. +def _PackageApk(options, build): + """Compile and link resources with aapt2. Args: - options: The command-line options tuple. E.g. the generated apk - will be written to |options.apk_path|. - dep_subdirs: The list of directories where dependency resource zips - were extracted (its content will be altered by this function). - temp_dir: A temporary directory. - gen_dir: Another temp directory where some intermediate files are - generated. - r_txt_path: The path where the R.txt file will written to. + options: The command-line options. + build: BuildContext object. """ + dep_subdirs = resource_utils.ExtractDeps(options.dependencies_res_zips, + build.deps_dir) renamed_paths = dict() renamed_paths.update(_DuplicateZhResources(dep_subdirs)) renamed_paths.update(_RenameLocaleResourceDirs(dep_subdirs)) @@ -698,47 +647,89 @@ for directory in dep_subdirs: renamed_paths.update(_MoveImagesToNonMdpiFolders(directory)) - link_command = _CreateLinkApkArgs(options) - # TODO(digit): Is this below actually required for R.txt generation? - link_command += ['--java', gen_dir] + _CreateResourceInfoFile(renamed_paths, build.info_path, + options.dependencies_res_zips) - fixed_manifest, orig_package = _FixManifest(options, temp_dir) + link_command = [ + options.aapt2_path, + 'link', + '--version-code', + options.version_code, + '--version-name', + options.version_name, + '--auto-add-overlay', + '--no-version-vectors', + ] + + for j in options.include_resources: + link_command += ['-I', j] + if options.proguard_file: + link_command += ['--proguard', build.proguard_path] + if options.proguard_file_main_dex: + link_command += ['--proguard-main-dex', build.proguard_main_dex_path] + if options.emit_ids_out: + link_command += ['--emit-ids', build.emit_ids_path] + if options.r_text_in: + shutil.copyfile(options.r_text_in, build.r_txt_path) + else: + link_command += ['--output-text-symbols', build.r_txt_path] + + # Note: only one of --proto-format, --shared-lib or --app-as-shared-lib + # can be used with recent versions of aapt2. + if options.shared_resources and not options.proto_path: + link_command.append('--shared-lib') + + if options.no_xml_namespaces: + link_command.append('--no-xml-namespaces') + + package_id = _PackageIdFromOptions(options) + if package_id is not None: + link_command += ['--package-id', package_id, '--allow-reserved-package-id'] + + fixed_manifest, orig_package = _FixManifest(options, build.temp_dir) link_command += [ '--manifest', fixed_manifest, '--rename-manifest-package', orig_package ] - partials = _CompileDeps(options.aapt2_path, dep_subdirs, temp_dir) + # Creates a .zip with AndroidManifest.xml, resources.arsc, res/* + # Also creates R.txt + if options.use_resource_ids_path: + _CreateStableIdsFile(options.use_resource_ids_path, build.stable_ids_path, + orig_package) + link_command += ['--stable-ids', build.stable_ids_path] + + partials = _CompileDeps(options.aapt2_path, dep_subdirs, build.temp_dir) for partial in partials: link_command += ['-R', partial] - # Creates a .zip with AndroidManifest.xml, resources.arsc, res/* - # Also creates R.txt - with build_utils.AtomicOutput(options.apk_path) as unoptimized, \ - build_utils.AtomicOutput(r_txt_path) as r_txt, \ - _MaybeCreateStableIdsFile(options) as stable_ids: - if stable_ids: - link_command += ['--stable-ids', stable_ids.name] - link_command += ['-o', unoptimized.name] - link_command += ['--output-text-symbols', r_txt.name] - build_utils.CheckOutput( - link_command, print_stdout=False, print_stderr=False) + if options.proto_path: + link_command += ['--proto-format', '-o', build.proto_path] + else: + link_command += ['-o', build.arsc_path] - if options.optimized_resources_path: - with build_utils.AtomicOutput(options.optimized_resources_path) as opt: - _OptimizeApk(opt.name, options, temp_dir, unoptimized.name, r_txt.name) + build_utils.CheckOutput(link_command, print_stdout=False, print_stderr=False) - _CreateResourceInfoFile( - renamed_paths, options.apk_info_path, options.dependencies_res_zips) + if options.proto_path and options.arsc_path: + build_utils.CheckOutput([ + options.aapt2_path, 'convert', '-o', build.arsc_path, build.proto_path + ]) + + if options.optimized_proto_path: + _OptimizeApk(build.optimized_proto_path, options, build.temp_dir, + build.proto_path, build.r_txt_path) + elif options.optimized_arsc_path: + _OptimizeApk(build.optimized_arsc_path, options, build.temp_dir, + build.arsc_path, build.r_txt_path) -def _OptimizeApk(output, options, temp_dir, unoptimized_apk_path, r_txt_path): +def _OptimizeApk(output, options, temp_dir, unoptimized_path, r_txt_path): """Optimize intermediate .ap_ file with aapt2. Args: output: Path to write to. options: The command-line options. temp_dir: A temporary directory. - unoptimized_apk_path: path of the apk to optimize. + unoptimized_path: path of the apk to optimize. r_txt_path: path to the R.txt file of the unoptimized apk. """ # Resources of type ID are references to UI elements/views. They are used by @@ -763,7 +754,7 @@ output, '--resources-config-path', gen_config_path, - unoptimized_apk_path, + unoptimized_path, ] build_utils.CheckOutput( optimize_command, print_stdout=False, print_stderr=False) @@ -787,7 +778,7 @@ @contextlib.contextmanager -def _MaybeCreateStableIdsFile(options): +def _CreateStableIdsFile(in_path, out_path, package_name): """Transforms a file generated by --emit-ids from another package. --stable-ids is generally meant to be used by different versions of the same @@ -797,55 +788,35 @@ Note: This will fail if the package ID of the resources in |options.use_resource_ids_path| does not match the package ID of the resources being linked. - - Args: - options: The command-line options - Yields: - Path to the transformed resource IDs file (lines formatted like - package:type/name = 0xPPTTEEEE) or None """ - if options.use_resource_ids_path: - package_name = options.package_name - if not package_name: - package_name = resource_utils.ExtractPackageFromManifest( - options.android_manifest) - with open(options.use_resource_ids_path) as stable_ids_file: - with tempfile.NamedTemporaryFile() as output_ids_file: - output_stable_ids = re.sub( - r'^.*?:', - package_name + ':', - stable_ids_file.read(), - flags=re.MULTILINE) - output_ids_file.write(output_stable_ids) - output_ids_file.flush() - yield output_ids_file - else: - yield None + with open(in_path) as stable_ids_file: + with open(out_path, 'w') as output_ids_file: + output_stable_ids = re.sub( + r'^.*?:', + package_name + ':', + stable_ids_file.read(), + flags=re.MULTILINE) + output_ids_file.write(output_stable_ids) -def _WriteFinalRTxtFile(options, aapt_r_txt_path): - """Determine final R.txt and return its location. +def _WriteOutputs(options, build): + possible_outputs = [ + (options.srcjar_out, build.srcjar_path), + (options.r_text_out, build.r_txt_path), + (options.arsc_path, build.arsc_path), + (options.proto_path, build.proto_path), + (options.optimized_arsc_path, build.optimized_arsc_path), + (options.optimized_proto_path, build.optimized_proto_path), + (options.proguard_file, build.proguard_path), + (options.proguard_file_main_dex, build.proguard_main_dex_path), + (options.emit_ids_out, build.emit_ids_path), + (options.info_path, build.info_path), + ] - This handles --r-text-in and --r-text-out options at the same time. - - Args: - options: The command-line options tuple. - aapt_r_txt_path: The path to the R.txt generated by aapt. - Returns: - Path to the final R.txt file. - """ - if options.r_text_in: - r_txt_file = options.r_text_in - else: - # When an empty res/ directory is passed, aapt does not write an R.txt. - r_txt_file = aapt_r_txt_path - if not os.path.exists(r_txt_file): - build_utils.Touch(r_txt_file) - - if options.r_text_out: - shutil.copyfile(r_txt_file, options.r_text_out) - - return r_txt_file + for final, temp in possible_outputs: + # Write file only if it's changed. + if final and not (os.path.exists(final) and filecmp.cmp(final, temp)): + shutil.move(temp, final) def main(args): @@ -855,18 +826,12 @@ debug_temp_resources_dir = os.environ.get(_ENV_DEBUG_VARIABLE) if debug_temp_resources_dir: debug_temp_resources_dir = os.path.join(debug_temp_resources_dir, - os.path.basename(options.apk_path)) + os.path.basename(options.arsc_path)) build_utils.DeleteDirectory(debug_temp_resources_dir) build_utils.MakeDirectory(debug_temp_resources_dir) with resource_utils.BuildContext(debug_temp_resources_dir) as build: - dep_subdirs = resource_utils.ExtractDeps(options.dependencies_res_zips, - build.deps_dir) - - _PackageApk(options, dep_subdirs, build.temp_dir, build.gen_dir, - build.r_txt_path) - - r_txt_path = _WriteFinalRTxtFile(options, build.r_txt_path) + _PackageApk(options, build) # If --shared-resources-whitelist is used, the all resources listed in # the corresponding R.txt file will be non-final, and an onResourcesLoaded() @@ -887,27 +852,30 @@ rjava_build_options.GenerateOnResourcesLoaded() resource_utils.CreateRJavaFiles( - build.srcjar_dir, None, r_txt_path, options.extra_res_packages, + build.srcjar_dir, None, build.r_txt_path, options.extra_res_packages, options.extra_r_text_files, rjava_build_options) if options.srcjar_out: - build_utils.ZipDir(options.srcjar_out, build.srcjar_dir) + build_utils.ZipDir(build.srcjar_path, build.srcjar_dir) # Sanity check that the created resources have the expected package ID. expected_id = _PackageIdFromOptions(options) if expected_id is None: expected_id = '0x00' if options.shared_resources else '0x7f' expected_id = int(expected_id, 16) - _, package_id = resource_utils.ExtractArscPackage(options.aapt2_path, - options.apk_path) + _, package_id = resource_utils.ExtractArscPackage( + options.aapt2_path, + build.arsc_path if options.arsc_path else build.proto_path) if package_id != expected_id: raise Exception( 'Invalid package ID 0x%x (expected 0x%x)' % (package_id, expected_id)) + _WriteOutputs(options, build) + if options.depfile: build_utils.WriteDepfile( options.depfile, - options.apk_path, + options.arsc_path or options.proto_path, inputs=options.dependencies_res_zips + options.extra_r_text_files, add_pydeps=False)
diff --git a/build/android/gyp/create_size_info_files.py b/build/android/gyp/create_size_info_files.py index 5b248e4..381a23b 100755 --- a/build/android/gyp/create_size_info_files.py +++ b/build/android/gyp/create_size_info_files.py
@@ -127,11 +127,10 @@ action='append', help='Same as --assets, except disables compression.') parser.add_argument( - '--resource-apk', - dest='resource_apks', + '--in-res-info-path', required=True, action='append', - help='An .ap_ file built using aapt') + help='Paths to .ap_.info files') options = parser.parse_args(args) @@ -143,7 +142,7 @@ jar_inputs = _FindJarInputs(set(options.jar_files)) pak_inputs = _PakInfoPathsForAssets(options.assets + options.uncompressed_assets) - res_inputs = [p + '.info' for p in options.resource_apks] + res_inputs = options.in_res_info_path # Don't bother re-running if no .info files have changed (saves ~250ms). md5_check.CallAndRecordIfStale(
diff --git a/build/android/gyp/util/resource_utils.py b/build/android/gyp/util/resource_utils.py index 61a4f3c..fc6249a 100644 --- a/build/android/gyp/util/resource_utils.py +++ b/build/android/gyp/util/resource_utils.py
@@ -599,11 +599,21 @@ # A location to place aapt-generated files. self.gen_dir = os.path.join(self.temp_dir, 'gen') os.mkdir(self.gen_dir) - # Location of the generated R.txt file. - self.r_txt_path = os.path.join(self.gen_dir, 'R.txt') # A location to place generated R.java files. self.srcjar_dir = os.path.join(self.temp_dir, 'java') os.mkdir(self.srcjar_dir) + # Temporary file locacations. + self.r_txt_path = os.path.join(self.gen_dir, 'R.txt') + self.srcjar_path = os.path.join(self.temp_dir, 'R.srcjar') + self.info_path = os.path.join(self.temp_dir, 'size.info') + self.stable_ids_path = os.path.join(self.temp_dir, 'in_ids.txt') + self.emit_ids_path = os.path.join(self.temp_dir, 'out_ids.txt') + self.proguard_path = os.path.join(self.temp_dir, 'keeps.flags') + self.proguard_main_dex_path = os.path.join(self.temp_dir, 'maindex.flags') + self.arsc_path = os.path.join(self.temp_dir, 'out.ap_') + self.proto_path = os.path.join(self.temp_dir, 'out.proto.ap_') + self.optimized_arsc_path = os.path.join(self.temp_dir, 'out.opt.ap_') + self.optimized_proto_path = os.path.join(self.temp_dir, 'out.opt.proto.ap_') def Close(self): """Close the context and destroy all temporary files."""
diff --git a/build/android/gyp/write_build_config.py b/build/android/gyp/write_build_config.py index 68dfac4..a0cd13f 100755 --- a/build/android/gyp/write_build_config.py +++ b/build/android/gyp/write_build_config.py
@@ -924,6 +924,7 @@ parser.add_option('--final-dex-path', help='Path to final input classes.dex (or classes.zip) to ' 'use in final apk.') + parser.add_option('--res-size-info', help='Path to .ap_.info') parser.add_option('--apk-proto-resources', help='Path to resources compiled in protocol buffer format ' ' for this apk.') @@ -962,7 +963,7 @@ 'android_apk': ['build_config', 'dex_path', 'final_dex_path'] + \ jar_path_options, 'android_app_bundle_module': ['build_config', 'dex_path', - 'final_dex_path'] + jar_path_options, + 'final_dex_path', 'res_size_info'] + jar_path_options, 'android_assets': ['build_config'], 'android_resources': ['build_config', 'resources_zip'], 'dist_aar': ['build_config'], @@ -1277,6 +1278,8 @@ if options.type == 'android_apk' and options.tested_apk_config: config['resources']['arsc_package_name'] = ( tested_apk_config['package_name']) + if options.res_size_info: + config['resources']['size_info'] = options.res_size_info if is_apk_or_module_target: deps_dex_files = [c['dex_path'] for c in all_library_deps]
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index 264514a..e77a245 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -313,18 +313,21 @@ rebase_path(invoker.r_text, root_build_dir), ] } - + if (defined(invoker.res_size_info_path)) { + args += [ + "--res-size-info", + rebase_path(invoker.res_size_info_path, root_build_dir), + ] + } if (defined(invoker.resource_dirs)) { resource_dirs = rebase_path(invoker.resource_dirs, root_build_dir) args += [ "--resource-dirs=$resource_dirs" ] } - if (defined(invoker.proto_resources_path)) { _rebased_proto_resources = rebase_path(invoker.proto_resources_path, root_build_dir) args += [ "--apk-proto-resources=$_rebased_proto_resources" ] } - if (defined(invoker.module_rtxt_path)) { _rebased_rtxt_path = rebase_path(invoker.module_rtxt_path, root_build_dir) args += [ "--module-rtxt-path=$_rebased_rtxt_path" ] @@ -2076,9 +2079,6 @@ # # post_process_script: (optional) # - # proto_format: (optional). If true, compiles resources into protocol - # buffer format. - # # package_name: (optional) # Name of the package for the purpose of assigning package ID. # @@ -2097,7 +2097,13 @@ # used in AndroidManifest.xml. # # Output variables: - # output: Path to a zip file containing the compiled resources. + # arsc_output: Path to output .ap_ file (optional). + # + # proto_output: Path to output .proto.ap_ file (optional). + # + # optimized_arsc_output: Path to optimized .ap_ file (optional). + # + # optimized_proto_output: Path to optimized .proto.ap_ file (optional). # # r_text_out_path: (optional): # Path for the corresponding generated R.txt file. @@ -2111,24 +2117,30 @@ # # proguard_file_main_dex: (optional) # - # template("compile_resources") { _compile_resources_target_name = target_name - _compiled_resources_path = invoker.output - + if (defined(invoker.arsc_output)) { + _arsc_output = invoker.arsc_output + } + if (defined(invoker.optimized_arsc_output)) { + _optimized_arsc_output = invoker.optimized_arsc_output + } if (defined(invoker.srcjar_path)) { _srcjar_path = invoker.srcjar_path } if (defined(invoker.post_process_script)) { _compile_resources_target_name = "${target_name}__intermediate" - _compiled_resources_path = - get_path_info(_compiled_resources_path, "dir") + "/" + - get_path_info(_compiled_resources_path, "name") + ".intermediate.ap_" _srcjar_path = "${_srcjar_path}.intermediate.srcjar" + _intermediate_path = + get_path_info(_arsc_output, "dir") + "/" + + get_path_info(_arsc_output, "name") + ".intermediate.ap_" + if (defined(_optimized_arsc_output)) { + _optimized_arsc_output = _intermediate_path + } else { + _arsc_output = _intermediate_path + } } - _proto_format = defined(invoker.proto_format) && invoker.proto_format - # NOTE: Regarding the names of the depfiles used by this template: # They all have the same prefix, related to invoker.target_name, # instead of $target_name, so it is important they have different @@ -2138,7 +2150,6 @@ # # _1.d for the unprocessed compiled resources. # _2.d for the optional processed compiled resources. - # _3.d for the proto-compiled resources. action_with_pydeps(_compile_resources_target_name) { set_sources_assignment_filter([]) @@ -2153,16 +2164,9 @@ depfile = "$target_gen_dir/${invoker.target_name}_1.d" outputs = [] - _android_aapt_path = android_default_aapt_path - _android_aapt2_path = android_sdk_tools_bundle_aapt2 - if (_proto_format) { - depfile = "$target_gen_dir/${invoker.target_name}_3.d" - } - inputs = [ invoker.build_config, - _android_aapt_path, - _android_aapt2_path, + android_sdk_tools_bundle_aapt2, ] _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) @@ -2172,7 +2176,7 @@ rebase_path(depfile, root_build_dir), "--include-resources=@FileArg($_rebased_build_config:android:sdk_jars)", "--aapt2-path", - rebase_path(_android_aapt2_path, root_build_dir), + rebase_path(android_sdk_tools_bundle_aapt2, root_build_dir), "--dependencies-res-zips=@FileArg($_rebased_build_config:resources:dependency_zips)", "--extra-res-packages=@FileArg($_rebased_build_config:resources:extra_package_names)", "--extra-r-text-files=@FileArg($_rebased_build_config:resources:extra_r_text_files)", @@ -2183,11 +2187,9 @@ "--android-manifest", rebase_path(invoker.android_manifest, root_build_dir), ] - if (defined(invoker.no_xml_namespaces) && invoker.no_xml_namespaces) { args += [ "--no-xml-namespaces" ] } - if (defined(invoker.version_code)) { args += [ "--version-code", @@ -2200,34 +2202,47 @@ invoker.version_name, ] } - if (defined(_compiled_resources_path)) { - _info_path = invoker.output + ".info" - outputs += [ - _compiled_resources_path, - _info_path, - ] + if (defined(_arsc_output)) { + outputs += [ _arsc_output ] args += [ - "--apk-path", - rebase_path(_compiled_resources_path, root_build_dir), - "--apk-info-path", - rebase_path(_info_path, root_build_dir), + "--arsc-path", + rebase_path(_arsc_output, root_build_dir), ] } - - if (defined(invoker.optimized_resources_path)) { + if (defined(invoker.proto_output)) { + outputs += [ invoker.proto_output ] args += [ - "--optimized-resources-path", - rebase_path(invoker.optimized_resources_path, root_build_dir), + "--proto-path", + rebase_path(invoker.proto_output, root_build_dir), ] - outputs += [ invoker.optimized_resources_path ] - - if (defined(invoker.resources_config_path)) { - inputs += [ invoker.resources_config_path ] - args += [ - "--resources-config-path", - rebase_path(invoker.resources_config_path, root_build_dir), - ] - } + } + if (defined(invoker.size_info_path)) { + outputs += [ invoker.size_info_path ] + args += [ + "--info-path", + rebase_path(invoker.size_info_path, root_build_dir), + ] + } + if (defined(_optimized_arsc_output)) { + outputs += [ _optimized_arsc_output ] + args += [ + "--optimized-arsc-path", + rebase_path(_optimized_arsc_output, root_build_dir), + ] + } + if (defined(invoker.optimized_proto_output)) { + outputs += [ invoker.optimized_proto_output ] + args += [ + "--optimized-proto-path", + rebase_path(invoker.optimized_proto_output, root_build_dir), + ] + } + if (defined(invoker.resources_config_path)) { + inputs += [ invoker.resources_config_path ] + args += [ + "--resources-config-path", + rebase_path(invoker.resources_config_path, root_build_dir), + ] } # Useful to have android:debuggable in the manifest even for Release @@ -2259,10 +2274,6 @@ ] } - if (_proto_format) { - args += [ "--proto-format" ] - } - # Define the flags related to shared resources. # # Note the small sanity check to ensure that the package ID of the @@ -2382,15 +2393,24 @@ args = [ "--depfile", rebase_path(depfile, root_build_dir), - "--apk-path", - rebase_path(_compiled_resources_path, root_build_dir), - "--output", - rebase_path(invoker.output, root_build_dir), "--srcjar-in", rebase_path(_srcjar_path, root_build_dir), "--srcjar-out", rebase_path(invoker.srcjar_path, root_build_dir), ] + if (defined(_optimized_arsc_output)) { + _input_apk = _optimized_arsc_output + _output_apk = invoker.optimized_arsc_output + } else { + _input_apk = _arsc_output + _output_apk = invoker.arsc_output + } + args += [ + "--apk-path", + rebase_path(_input_apk, root_build_dir), + "--output", + rebase_path(_output_apk, root_build_dir), + ] if (defined(invoker.shared_resources_whitelist)) { args += [ "--r-text-whitelist", @@ -2400,14 +2420,14 @@ ] } inputs = [ + _input_apk, _srcjar_path, - _compiled_resources_path, ] if (defined(invoker.post_process_script_inputs)) { inputs += invoker.post_process_script_inputs } outputs = [ - invoker.output, + _output_apk, invoker.srcjar_path, ] public_deps = [ @@ -2423,7 +2443,7 @@ # build_config: Path to APK's build config file. Used to extract the # list of input .jar files from its dependencies. # name: Name of the apk or app bundle (e.g. "Foo.apk"). - # packaged_resources_path: Path to .ap_ file. + # res_size_info_path: Path to input .ap_.info file (for apks). # template("create_size_info_files") { action_with_pydeps(target_name) { @@ -2460,7 +2480,7 @@ args += [ "--jar-files=@FileArg($_rebased_build_config:deps_info:unprocessed_jar_path)", "--jar-files=@FileArg($_rebased_build_config:deps_info:javac_full_classpath)", - "--resource-apk=@FileArg($_rebased_build_config:deps_info:proto_resources_path)", + "--in-res-info-path=@FileArg($_rebased_build_config:resources:size_info)", "--assets=@FileArg($_rebased_build_config:assets)", "--uncompressed-assets=@FileArg($_rebased_build_config:uncompressed_assets)", ] @@ -2468,15 +2488,15 @@ } else { inputs = [ invoker.build_config, - invoker.packaged_resources_path, + invoker.res_size_info_path, ] _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) args += [ "--jar-files=@FileArg($_rebased_build_config:deps_info:jar_path)", "--jar-files=@FileArg($_rebased_build_config:deps_info:javac_full_classpath)", - "--resource-apk", - rebase_path(invoker.packaged_resources_path, root_build_dir), + "--in-res-info-path", + rebase_path(invoker.res_size_info_path, root_build_dir), "--assets=@FileArg($_rebased_build_config:assets)", "--uncompressed-assets=@FileArg($_rebased_build_config:uncompressed_assets)", ] @@ -3341,6 +3361,7 @@ "extra_shared_libraries", "final_dex_path", "native_lib_placeholders", + "res_size_info_path", "secondary_abi_shared_libraries_runtime_deps_file", "secondary_native_lib_placeholders", "shared_libraries_runtime_deps_file",
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index f0f1b5f..d309275 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni
@@ -2070,7 +2070,10 @@ _is_bundle_module = defined(invoker.is_bundle_module) && invoker.is_bundle_module - _is_base_module = defined(invoker.is_base_module) && invoker.is_base_module + if (_is_bundle_module) { + _is_base_module = + defined(invoker.is_base_module) && invoker.is_base_module + } _enable_multidex = !defined(invoker.enable_multidex) || invoker.enable_multidex @@ -2084,34 +2087,36 @@ if (!_is_bundle_module) { _final_rtxt_path = "${_final_apk_path}.R.txt" } + _res_size_info_path = "$target_out_dir/$target_name.ap_.info" _final_apk_path_no_ext_list = process_file_template([ _final_apk_path ], "{{source_dir}}/{{source_name_part}}") _final_apk_path_no_ext = _final_apk_path_no_ext_list[0] assert(_final_apk_path_no_ext != "") # Mark as used. + _optimize_resources = + defined(invoker.optimize_resources) && invoker.optimize_resources + # Non-base bundle modules create only proto resources. if (!_is_bundle_module || _is_base_module) { - _packaged_resources_path = "$target_out_dir/$target_name.ap_" + _arsc_resources_path = "$target_out_dir/$target_name.ap_" } if (_is_bundle_module) { # Path to the intermediate proto-format resources zip file. - _proto_resources_path = "$target_gen_dir/$target_name.proto.ap_" + _proto_resources_path = "$target_out_dir/$target_name.proto.ap_" + if (_optimize_resources) { + _optimized_proto_resources_path = + "$target_out_dir/$target_name.optimized.proto.ap_" + } } else { # resource_sizes.py needs to be able to find the unpacked resources.arsc # file based on apk name to compute normatlized size. _resource_sizes_arsc_path = "$root_out_dir/arsc/" + rebase_path(_final_apk_path_no_ext, root_build_dir) + ".ap_" - } - _optimize_resources = - defined(invoker.optimize_resources) && invoker.optimize_resources - if (_optimize_resources) { - _optimized_resources_path = "$target_out_dir/$_template_name.optimized." - if (_is_bundle_module) { - _optimized_resources_path += ".proto.ap_" - } else { - _optimized_resources_path += ".ap_" + if (_optimize_resources) { + _optimized_arsc_resources_path = + "$target_out_dir/$target_name.optimized.ap_" } } @@ -2358,6 +2363,7 @@ srcjar_path = "${target_gen_dir}/${target_name}.srcjar" r_text_out_path = _compile_resources_rtxt_out emit_ids_out_path = _compile_resources_emit_ids_out + size_info_path = _res_size_info_path proguard_file = _generated_proguard_config if (_enable_main_dex_list) { proguard_file_main_dex = _generated_proguard_main_dex_config @@ -2382,28 +2388,37 @@ assert(!defined(resource_ids_provider_dep)) resource_ids_provider_dep = invoker.apk_under_test - deps += [ "${invoker.apk_under_test}__compile_resources" ] include_resource = get_label_info(invoker.apk_under_test, "target_out_dir") + "/" + get_label_info(invoker.apk_under_test, "name") + ".ap_" + _link_against = invoker.apk_under_test } if (_is_bundle_module) { - proto_format = true - output = _proto_resources_path + proto_output = _proto_resources_path + if (_optimize_resources) { + optimized_proto_output = _optimized_proto_resources_path + } if (defined(invoker.base_module_target)) { - deps += [ "${invoker.base_module_target}__compile_arsc_resources" ] include_resource = get_label_info(invoker.base_module_target, "target_out_dir") + "/" + get_label_info(invoker.base_module_target, "name") + ".ap_" + _link_against = invoker.base_module_target } - } else { - output = _packaged_resources_path + } else if (_optimize_resources) { + optimized_arsc_output = _optimized_arsc_resources_path } - if (_optimize_resources) { - optimized_resources_path = _optimized_resources_path + if (defined(_link_against)) { + deps += [ "${_link_against}__compile_resources" ] + include_resource = get_label_info(_link_against, "target_out_dir") + + "/" + get_label_info(_link_against, "name") + ".ap_" + } + + # Bundle modules have to reference resources from the base module. + if (!_is_bundle_module || _is_base_module) { + arsc_output = _arsc_resources_path } if (defined(invoker.shared_resources_whitelist_target)) { @@ -2422,7 +2437,7 @@ # resource_sizes.py doesn't care if it gets the optimized .arsc. sources = [ - _packaged_resources_path, + _arsc_resources_path, ] outputs = [ _resource_sizes_arsc_path, @@ -2453,38 +2468,6 @@ _final_deps += [ ":$_copy_rtxt_target" ] } - if (_is_base_module && _is_bundle_module) { - # Bundle modules have to reference resources from the base module. - # However, to compile the bundle module's resources we have to give it an - # arsc resource to link against (aapt2 fails with proto resources). Thus, - # add an arsc resource compilation step to make the bundle module's link - # step work. - compile_resources("${_template_name}__compile_arsc_resources") { - forward_variables_from(invoker, - [ - "support_zh_hk", - "aapt_locale_whitelist", - "resource_blacklist_regex", - "resource_blacklist_exceptions", - "png_to_webp", - "no_xml_namespaces", - ]) - android_manifest = _android_manifest - version_code = _version_code - version_name = _version_name - - proto_format = false - output = _packaged_resources_path - - build_config = _build_config - deps = _deps + [ - ":$_merge_manifest_target", - ":$_build_config_target", - _android_sdk_dep, - ] - } - } - _srcjar_deps += [ ":$_compile_resources_target" ] if (_native_libs_deps != [] || _secondary_abi_native_libs_deps != []) { @@ -2642,6 +2625,7 @@ ]) if (_is_bundle_module) { type = "android_app_bundle_module" + res_size_info_path = _res_size_info_path } else { type = "android_apk" } @@ -2817,7 +2801,7 @@ create_size_info_files(_size_info_target) { name = "${invoker.name}.apk" build_config = _build_config - packaged_resources_path = _packaged_resources_path + res_size_info_path = _res_size_info_path deps = _deps + [ ":$_build_config_target", ":$_compile_resources_target", @@ -2852,9 +2836,12 @@ "write_asset_list", "uncompress_dex", ]) - packaged_resources_path = _packaged_resources_path - if (_optimize_resources) { - optimized_resources_path = _optimized_resources_path + packaged_resources_path = _arsc_resources_path + + if (_optimize_resources && _is_bundle_module) { + optimized_resources_path = _optimized_proto_resources_path + } else if (_optimize_resources) { + optimized_resources_path = _optimized_arsc_resources_path } apk_path = _final_apk_path
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 4ba6bc4..051e431 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -8915396245975155376 \ No newline at end of file +8915367507034027888 \ No newline at end of file
diff --git a/cc/animation/animation.cc b/cc/animation/animation.cc index 3974409..2e4c5eb6 100644 --- a/cc/animation/animation.cc +++ b/cc/animation/animation.cc
@@ -41,16 +41,6 @@ return Animation::Create(id()); } -ElementId Animation::element_id_of_keyframe_effect( - KeyframeEffectId keyframe_effect_id) const { - DCHECK(GetKeyframeEffectById(keyframe_effect_id)); - return GetKeyframeEffectById(keyframe_effect_id)->element_id(); -} - -bool Animation::IsElementAttached(ElementId id) const { - return base::ContainsKey(element_to_keyframe_effect_id_map_, id); -} - void Animation::SetAnimationHost(AnimationHost* animation_host) { animation_host_ = animation_host; }
diff --git a/cc/animation/animation.h b/cc/animation/animation.h index feb3302..14a988505 100644 --- a/cc/animation/animation.h +++ b/cc/animation/animation.h
@@ -47,9 +47,6 @@ int id() const { return id_; } typedef size_t KeyframeEffectId; - ElementId element_id_of_keyframe_effect( - KeyframeEffectId keyframe_effect_id) const; - bool IsElementAttached(ElementId id) const; // Parent AnimationHost. Animation can be detached from AnimationTimeline. AnimationHost* animation_host() { return animation_host_; }
diff --git a/cc/animation/animation_unittest.cc b/cc/animation/animation_unittest.cc index 273491d0..037fd24 100644 --- a/cc/animation/animation_unittest.cc +++ b/cc/animation/animation_unittest.cc
@@ -55,8 +55,9 @@ timeline_->AttachAnimation(animation_); EXPECT_FALSE(animation_->element_animations(keyframe_effect_id_)); - EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id_)); EXPECT_TRUE(timeline_->needs_push_properties()); + EXPECT_FALSE( + animation_->GetKeyframeEffectById(keyframe_effect_id_)->element_id()); EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_) ->needs_push_properties()); @@ -70,8 +71,8 @@ EXPECT_TRUE(animation_impl_); EXPECT_FALSE(animation_impl_->element_animations(keyframe_effect_id_)); - EXPECT_FALSE( - animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id_)); + EXPECT_FALSE(animation_impl_->GetKeyframeEffectById(keyframe_effect_id_) + ->element_id()); EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_) ->needs_push_properties()); EXPECT_FALSE(timeline_->needs_push_properties()); @@ -80,8 +81,9 @@ EXPECT_EQ(animation_->GetKeyframeEffectById(keyframe_effect_id_), GetKeyframeEffectForElementId(element_id_)); EXPECT_TRUE(animation_->element_animations(keyframe_effect_id_)); - EXPECT_EQ(animation_->element_id_of_keyframe_effect(keyframe_effect_id_), - element_id_); + EXPECT_EQ( + animation_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(), + element_id_); CheckKeyframeEffectAndTimelineNeedsPushProperties(true, keyframe_effect_id_); host_->PushPropertiesTo(host_impl_); @@ -89,28 +91,31 @@ EXPECT_EQ(animation_impl_->GetKeyframeEffectById(keyframe_effect_id_), GetImplKeyframeEffectForLayerId(element_id_)); EXPECT_TRUE(animation_impl_->element_animations(keyframe_effect_id_)); - EXPECT_EQ(animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id_), - element_id_); + EXPECT_EQ( + animation_impl_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(), + element_id_); CheckKeyframeEffectAndTimelineNeedsPushProperties(false, keyframe_effect_id_); animation_->DetachElement(); EXPECT_FALSE(GetKeyframeEffectForElementId(element_id_)); EXPECT_FALSE(animation_->element_animations(keyframe_effect_id_)); - EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id_)); + EXPECT_FALSE( + animation_->GetKeyframeEffectById(keyframe_effect_id_)->element_id()); CheckKeyframeEffectAndTimelineNeedsPushProperties(true, keyframe_effect_id_); host_->PushPropertiesTo(host_impl_); EXPECT_FALSE(GetImplKeyframeEffectForLayerId(element_id_)); EXPECT_FALSE(animation_impl_->element_animations(keyframe_effect_id_)); - EXPECT_FALSE( - animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id_)); + EXPECT_FALSE(animation_impl_->GetKeyframeEffectById(keyframe_effect_id_) + ->element_id()); CheckKeyframeEffectAndTimelineNeedsPushProperties(false, keyframe_effect_id_); timeline_->DetachAnimation(animation_); EXPECT_FALSE(animation_->animation_timeline()); EXPECT_FALSE(animation_->element_animations(keyframe_effect_id_)); - EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id_)); + EXPECT_FALSE( + animation_->GetKeyframeEffectById(keyframe_effect_id_)->element_id()); EXPECT_TRUE(timeline_->needs_push_properties()); EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_) ->needs_push_properties()); @@ -612,8 +617,10 @@ timeline_->AttachAnimation(animation_); EXPECT_FALSE(animation_->element_animations(keyframe_effect_id1)); EXPECT_FALSE(animation_->element_animations(keyframe_effect_id2)); - EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id1)); - EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id2)); + EXPECT_FALSE( + animation_->GetKeyframeEffectById(keyframe_effect_id1)->element_id()); + EXPECT_FALSE( + animation_->GetKeyframeEffectById(keyframe_effect_id2)->element_id()); EXPECT_TRUE(timeline_->needs_push_properties()); EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1) ->needs_push_properties()); @@ -629,14 +636,16 @@ animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id1); EXPECT_TRUE(animation_->element_animations(keyframe_effect_id1)); - EXPECT_EQ(animation_->element_id_of_keyframe_effect(keyframe_effect_id1), - element_id_); + EXPECT_EQ( + animation_->GetKeyframeEffectById(keyframe_effect_id1)->element_id(), + element_id_); EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id1) ->needs_push_properties()); EXPECT_FALSE(animation_->element_animations(keyframe_effect_id2)); - EXPECT_NE(animation_->element_id_of_keyframe_effect(keyframe_effect_id2), - element_id_); + EXPECT_NE( + animation_->GetKeyframeEffectById(keyframe_effect_id2)->element_id(), + element_id_); EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id2) ->needs_push_properties()); @@ -649,8 +658,9 @@ animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id2); EXPECT_TRUE(animation_->element_animations(keyframe_effect_id2)); - EXPECT_EQ(animation_->element_id_of_keyframe_effect(keyframe_effect_id2), - element_id_); + EXPECT_EQ( + animation_->GetKeyframeEffectById(keyframe_effect_id2)->element_id(), + element_id_); EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id2) ->needs_push_properties()); @@ -667,20 +677,24 @@ animation_impl_->GetKeyframeEffectById(keyframe_effect_id2))); EXPECT_TRUE(animation_impl_->element_animations(keyframe_effect_id1)); - EXPECT_EQ(animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id1), - element_id_); + EXPECT_EQ( + animation_impl_->GetKeyframeEffectById(keyframe_effect_id1)->element_id(), + element_id_); EXPECT_TRUE(animation_impl_->element_animations(keyframe_effect_id2)); - EXPECT_EQ(animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id2), - element_id_); + EXPECT_EQ( + animation_impl_->GetKeyframeEffectById(keyframe_effect_id2)->element_id(), + element_id_); animation_->DetachElement(); EXPECT_FALSE(animation_->element_animations(keyframe_effect_id1)); - EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id1)); + EXPECT_FALSE( + animation_->GetKeyframeEffectById(keyframe_effect_id1)->element_id()); EXPECT_FALSE(element_animations->HasKeyframeEffectForTesting( animation_->GetKeyframeEffectById(keyframe_effect_id1))); EXPECT_FALSE(animation_->element_animations(keyframe_effect_id2)); - EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id2)); + EXPECT_FALSE( + animation_->GetKeyframeEffectById(keyframe_effect_id2)->element_id()); EXPECT_FALSE(element_animations->HasKeyframeEffectForTesting( animation_->GetKeyframeEffectById(keyframe_effect_id2))); @@ -692,13 +706,13 @@ host_->PushPropertiesTo(host_impl_); EXPECT_FALSE(animation_impl_->element_animations(keyframe_effect_id1)); - EXPECT_FALSE( - animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id1)); + EXPECT_FALSE(animation_impl_->GetKeyframeEffectById(keyframe_effect_id1) + ->element_id()); EXPECT_FALSE(element_animations_impl->HasKeyframeEffectForTesting( animation_impl_->GetKeyframeEffectById(keyframe_effect_id1))); EXPECT_FALSE(animation_impl_->element_animations(keyframe_effect_id2)); - EXPECT_FALSE( - animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id2)); + EXPECT_FALSE(animation_impl_->GetKeyframeEffectById(keyframe_effect_id2) + ->element_id()); EXPECT_FALSE(element_animations_impl->HasKeyframeEffectForTesting( animation_impl_->GetKeyframeEffectById(keyframe_effect_id2))); @@ -706,9 +720,11 @@ EXPECT_FALSE(animation_->animation_timeline()); EXPECT_FALSE(animation_->element_animations(keyframe_effect_id1)); - EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id1)); + EXPECT_FALSE( + animation_->GetKeyframeEffectById(keyframe_effect_id1)->element_id()); EXPECT_FALSE(animation_->element_animations(keyframe_effect_id2)); - EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id2)); + EXPECT_FALSE( + animation_->GetKeyframeEffectById(keyframe_effect_id2)->element_id()); EXPECT_TRUE(timeline_->needs_push_properties()); EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1) @@ -738,8 +754,10 @@ EXPECT_FALSE(animation_->element_animations(keyframe_effect_id1)); EXPECT_FALSE(animation_->element_animations(keyframe_effect_id2)); - EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id1)); - EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id2)); + EXPECT_FALSE( + animation_->GetKeyframeEffectById(keyframe_effect_id1)->element_id()); + EXPECT_FALSE( + animation_->GetKeyframeEffectById(keyframe_effect_id2)->element_id()); EXPECT_TRUE(timeline_->needs_push_properties()); EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1) ->needs_push_properties());
diff --git a/cc/animation/single_keyframe_effect_animation.cc b/cc/animation/single_keyframe_effect_animation.cc index d102c39..a467e5ee 100644 --- a/cc/animation/single_keyframe_effect_animation.cc +++ b/cc/animation/single_keyframe_effect_animation.cc
@@ -62,7 +62,7 @@ } ElementId SingleKeyframeEffectAnimation::element_id() const { - return element_id_of_keyframe_effect(GetKeyframeEffect()->id()); + return GetKeyframeEffect()->element_id(); } void SingleKeyframeEffectAnimation::AttachElement(ElementId element_id) {
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 99d9d51..011c7e0e 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -2453,6 +2453,7 @@ "java/src/org/chromium/chrome/browser/omnibox/OmniboxUrlEmphasizer.java", "java/src/org/chromium/chrome/browser/omnibox/OmniboxViewUtil.java", "java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java", + "java/src/org/chromium/chrome/browser/omnibox/suggestions/AnswersImageFetcher.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java", "java/src/org/chromium/chrome/browser/page_info/CertificateChainHelper.java", "java/src/org/chromium/chrome/browser/page_info/CertificateViewer.java",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index 1f9f85aa..b583775 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -1141,6 +1141,7 @@ "java/src/org/chromium/chrome/browser/omnibox/status/StatusViewBinder.java", "java/src/org/chromium/chrome/browser/omnibox/status/StatusProperties.java", "java/src/org/chromium/chrome/browser/omnibox/status/StatusViewCoordinator.java", + "java/src/org/chromium/chrome/browser/omnibox/suggestions/AnswersImageFetcher.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java",
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_id.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_id.xtb index 0ae0c4e..97604d0 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_id.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_id.xtb
@@ -2,18 +2,18 @@ <!DOCTYPE translationbundle> <translationbundle lang="id"> <translation id="1135993792949700405">Chrome akan mengirimkan data pribadi yang Anda pilih ke <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation> -<translation id="1625889395409731085">Buka tautan eksternal</translation> +<translation id="1625889395409731085">Buka link eksternal?</translation> <translation id="3604604794717279723">Saya setuju</translation> -<translation id="4437727785356380473">Google Assistant in Chrome closed.</translation> +<translation id="4437727785356380473">Asisten Google di Chrome ditutup.</translation> <translation id="4850886885716139402">Lihat</translation> <translation id="5014174725590676422">Layar penggunaan pertama Asisten Google di Chrome ditampilkan</translation> <translation id="5188078772080029703">Chrome akan mengirimkan URL dan konten situs serta email dan jenis kartu kredit Anda yang tersimpan di Chrome ke Google. Anda dapat menonaktifkan opsi ini di setelan Chrome. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation> -<translation id="5267269112080050255">Google Assistant in Chrome opened at full height.</translation> -<translation id="6555233628095991027">Google Assistant in Chrome opened at half height.</translation> +<translation id="5267269112080050255">Asisten Google di Chrome terbuka dengan ketinggian penuh.</translation> +<translation id="6555233628095991027">Asisten Google di Chrome terbuka dengan ketinggian separuh.</translation> <translation id="6973932557599545801">Maaf, saya tidak bisa membantu lagi. Silakan lanjutkan sendiri.</translation> <translation id="7658239707568436148">Batal</translation> <translation id="7871791972254842204">Baca dan setujui persyaratan & ketentuan pada <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> nanti</translation> -<translation id="8253702004019660079">Asisten Google di Chrome</translation> +<translation id="8253702004019660079">Asisten Google di Chrome.</translation> <translation id="8723954843026426558">Saya menyetujui persyaratan & ketentuan, kebijakan privasi, dan hak untuk menarik diri dari <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation> <translation id="9138504265731110181">Asisten Google menghemat waktu Anda dengan membantu melakukan pembayaran di web</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lt.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lt.xtb index 29b780d..79b9170 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lt.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lt.xtb
@@ -2,13 +2,18 @@ <!DOCTYPE translationbundle> <translationbundle lang="lt"> <translation id="1135993792949700405">„Chrome“ siųs pasirinktus asmens duomenis į <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation> +<translation id="1625889395409731085">Atidaryti išorinę nuorodą?</translation> <translation id="3604604794717279723">Sutinku</translation> +<translation id="4437727785356380473">Programa „Google Assistant“ sistemoje „Chrome“ uždaryta.</translation> <translation id="4850886885716139402">Žiūrėti</translation> <translation id="5014174725590676422">Rodomas „Google“ padėjėjo sistemoje „Chrome“ pirmosios paleisties ekranas</translation> <translation id="5188078772080029703">„Chrome“ siųs „Google“ svetainės URL ir turinį bei jūsų el. pašto adresą ir kredito kortelės tipą, išsaugotus sistemoje „Chrome“. Šią funkciją galite išjungti „Chrome“ nustatymuose. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation> +<translation id="5267269112080050255">Programa „Google Assistant“ naršyklėje „Chrome“ atidaryta viso aukščio.</translation> +<translation id="6555233628095991027">Programa „Google Assistant“ naršyklėje „Chrome“ atidaryta pusės aukščio.</translation> <translation id="6973932557599545801">Deja, negaliu padėti, tolesnius veiksmus atlikite patys.</translation> <translation id="7658239707568436148">Atšaukti</translation> <translation id="7871791972254842204">Vėliau perskaityti <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> taisykles ir nuostatas ir su jomis sutikti</translation> +<translation id="8253702004019660079">„Google Assistant“ sistemoje „Chrome“.</translation> <translation id="8723954843026426558">Sutinku su taisyklėmis ir nuostatoms, privatumo politika ir teise atsisakyti <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation> <translation id="9138504265731110181">„Google“ padėjėjas padeda sutaupyti laiko padėdamas apdoroti mokėjimą žiniatinklyje</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_nl.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_nl.xtb index 34be721..06fb1ea 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_nl.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_nl.xtb
@@ -2,13 +2,18 @@ <!DOCTYPE translationbundle> <translationbundle lang="nl"> <translation id="1135993792949700405">Chrome verzendt de persoonsgegevens die je hebt geselecteerd naar <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation> +<translation id="1625889395409731085">Externe link openen?</translation> <translation id="3604604794717279723">Ik ga akkoord</translation> +<translation id="4437727785356380473">De Google Assistent in Chrome is gesloten.</translation> <translation id="4850886885716139402">Weergave</translation> <translation id="5014174725590676422">Het eerste uitvoeringsscherm van de Google Assistent in Chrome wordt weergegeven</translation> <translation id="5188078772080029703">Chrome verzendt zowel de URL en content van de URL als je e-mailadres en type creditcard die zijn opgeslagen in Chrome naar Google. Je kunt dit uitschakelen in de Chrome-instellingen. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation> +<translation id="5267269112080050255">De Google Assistent is op volledige hoogte geopend in Chrome.</translation> +<translation id="6555233628095991027">De Google Assistent is op halve hoogte geopend in Chrome.</translation> <translation id="6973932557599545801">Ik kan je helaas niet helpen. Ga zelf verder.</translation> <translation id="7658239707568436148">Annuleren</translation> <translation id="7871791972254842204">De algemene voorwaarden voor <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> later lezen en ermee akkoord gaan</translation> +<translation id="8253702004019660079">De Google Assistent in Chrome.</translation> <translation id="8723954843026426558">Ik ga akkoord met de algemene voorwaarden, het privacybeleid en het herroepingsrecht van <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation> <translation id="9138504265731110181">De Google Assistent helpt je sneller te betalen op internet</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uk.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uk.xtb index 93258b1..ac31431 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uk.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uk.xtb
@@ -2,13 +2,18 @@ <!DOCTYPE translationbundle> <translationbundle lang="uk"> <translation id="1135993792949700405">Chrome надсилатиме вибрані персональні дані на веб-сайт <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation> +<translation id="1625889395409731085">Відкрити зовнішнє посилання?</translation> <translation id="3604604794717279723">Прийняти</translation> +<translation id="4437727785356380473">Google Асистент у Chrome закрито.</translation> <translation id="4850886885716139402">Перегляд</translation> <translation id="5014174725590676422">Показано екран першого запуску Google Асистента в Chrome</translation> <translation id="5188078772080029703">Chrome надсилатиме в Google URL-адресу та вміст сайту, а також електронну адресу й тип кредитної картки, збереженої у веб-переглядачі. Ви можете вимкнути цю функцію в налаштуваннях Chrome. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation> +<translation id="5267269112080050255">Google Асистент відкрито в Chrome на повну висоту.</translation> +<translation id="6555233628095991027">Google Асистент відкрито в Chrome на половину висоти.</translation> <translation id="6973932557599545801">На жаль, я не можу допомогти. Продовжуйте самостійно.</translation> <translation id="7658239707568436148">Скасувати</translation> <translation id="7871791972254842204">Прийняти умови використання для <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> пізніше</translation> +<translation id="8253702004019660079">Google Асистент у Chrome.</translation> <translation id="8723954843026426558">Я приймаю умови використання, політику конфіденційності й право на відмову від <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation> <translation id="9138504265731110181">Google Асистент заощаджує ваш час, допомагаючи з оплатою в Інтернеті</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml index b658a52..174ce3e 100644 --- a/chrome/android/java/res/values/ids.xml +++ b/chrome/android/java/res/values/ids.xml
@@ -134,4 +134,5 @@ <item type="id" name="highlight_state" /> <item type="id" name="item_animator" /> <item type="id" name="highlight_color" /> + <item type="id" name="context_menu_delegate" /> </resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BitmapCache.java b/chrome/android/java/src/org/chromium/chrome/browser/BitmapCache.java index 67b9806..d7b2d53 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/BitmapCache.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/BitmapCache.java
@@ -121,14 +121,6 @@ sDeduplicationCache.put(key, new WeakReference<>(bitmap)); } - /** - * Evict all bitmaps from the cache. - */ - public void clear() { - getBitmapCache().evictAll(); - scheduleDeduplicationCache(); - } - /** @return The total number of bytes taken by the bitmaps in this cache. */ public int size() { return getBitmapCache().size();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContentCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContentCoordinator.java index a5a53e24e..a2233b5b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContentCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/ContentCoordinator.java
@@ -83,7 +83,7 @@ mAdapter = new ContextualSuggestionsAdapter( profile, mUiConfig, uiDelegate, mContextMenuManager, clusterList); mRecyclerView.setAdapter(mAdapter); - mRecyclerView.init(mUiConfig, mContextMenuManager); + mRecyclerView.init(mUiConfig, closeContextMenuCallback); Resources resources = context.getResources(); int defaultMargin =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcher.java index 96f6eeb..d351d36d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcher.java
@@ -112,9 +112,6 @@ } @Override - public void clear() {} - - @Override public @ImageFetcherConfig int getConfig() { return ImageFetcherConfig.DISK_CACHE_ONLY; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcher.java index 114652c..d05a052 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcher.java
@@ -19,7 +19,6 @@ */ public abstract class ImageFetcher { // All UMA client names collected here to prevent duplicates. - public static final String ANSWER_SUGGESTIONS_UMA_CLIENT_NAME = "AnswerSuggestions"; public static final String ASSISTANT_DETAILS_UMA_CLIENT_NAME = "AssistantDetails"; public static final String ASSISTANT_INFO_BOX_UMA_CLIENT_NAME = "AssistantInfoBox"; public static final String CONTEXTUAL_SUGGESTIONS_UMA_CLIENT_NAME = "ContextualSuggestions"; @@ -101,11 +100,6 @@ } /** - * Clear the cache of any bitmaps that may be in-memory. - */ - public abstract void clear(); - - /** * Returns the type of Image Fetcher this is based on class arrangements. See * image_fetcher_service.h for a detailed description of the available configurations. *
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherFactory.java index 14b76ab3..748fd4a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherFactory.java
@@ -16,28 +16,25 @@ /** * Alias for createImageFetcher below. + * + * @param config The type of ImageFetcher you need. + * @return The correct ImageFetcher according to the provided config. */ public static ImageFetcher createImageFetcher(@ImageFetcherConfig int config) { - return createImageFetcher(config, ImageFetcherBridge.getInstance(), null, - InMemoryCachedImageFetcher.DEFAULT_CACHE_SIZE); + return createImageFetcher(config, null); } /** * Alias for createImageFetcher below. + * + * @param config The type of ImageFetcher you need. + * @param discardableReferencePool Used to store images in-memory. + * @return The correct ImageFetcher according to the provided config. */ public static ImageFetcher createImageFetcher( @ImageFetcherConfig int config, DiscardableReferencePool discardableReferencePool) { - return createImageFetcher(config, ImageFetcherBridge.getInstance(), - discardableReferencePool, InMemoryCachedImageFetcher.DEFAULT_CACHE_SIZE); - } - - /** - * Alias for createImageFetcher below. - */ - public static ImageFetcher createImageFetcher(@ImageFetcherConfig int config, - DiscardableReferencePool discardableReferencePool, int inMemoryCacheSize) { - return createImageFetcher(config, ImageFetcherBridge.getInstance(), - discardableReferencePool, inMemoryCacheSize); + return createImageFetcher( + config, discardableReferencePool, ImageFetcherBridge.getInstance()); } /** @@ -45,14 +42,13 @@ * config that you must destroy. * * @param config The type of ImageFetcher you need. - * @param imageFetcherBridge Bridge to use. * @param discardableReferencePool Used to store images in-memory. - * @param inMemoryCacheSize The size of the in memory cache (in bytes). + * @param imageFetcherBridge Bridge to use. * @return The correct ImageFetcher according to the provided config. */ public static ImageFetcher createImageFetcher(@ImageFetcherConfig int config, - ImageFetcherBridge imageFetcherBridge, - DiscardableReferencePool discardableReferencePool, int inMemoryCacheSize) { + DiscardableReferencePool discardableReferencePool, + ImageFetcherBridge imageFetcherBridge) { // TODO(crbug.com/947191):Allow server-side configuration image fetcher clients. switch (config) { case ImageFetcherConfig.NETWORK_ONLY: @@ -68,15 +64,15 @@ case ImageFetcherConfig.IN_MEMORY_ONLY: assert discardableReferencePool != null; return new InMemoryCachedImageFetcher( - createImageFetcher(ImageFetcherConfig.NETWORK_ONLY, imageFetcherBridge, - discardableReferencePool, inMemoryCacheSize), - discardableReferencePool, inMemoryCacheSize); + createImageFetcher( + ImageFetcherConfig.NETWORK_ONLY, null, imageFetcherBridge), + discardableReferencePool); case ImageFetcherConfig.IN_MEMORY_WITH_DISK_CACHE: assert discardableReferencePool != null; return new InMemoryCachedImageFetcher( - createImageFetcher(ImageFetcherConfig.DISK_CACHE_ONLY, imageFetcherBridge, - discardableReferencePool, inMemoryCacheSize), - discardableReferencePool, inMemoryCacheSize); + createImageFetcher( + ImageFetcherConfig.DISK_CACHE_ONLY, null, imageFetcherBridge), + discardableReferencePool); default: return null; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcher.java index 2cecdfe..e1bc4b8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcher.java
@@ -19,7 +19,7 @@ * ImageFetcher implementation with an in-memory cache. Can also be configured to use a disk cache. */ public class InMemoryCachedImageFetcher extends ImageFetcher { - public static final int DEFAULT_CACHE_SIZE = 20 * ConversionUtils.BYTES_PER_MEGABYTE; // 20mb + private static final int DEFAULT_CACHE_SIZE = 20 * ConversionUtils.BYTES_PER_MEGABYTE; // 20mb private static final float PORTION_OF_AVAILABLE_MEMORY = 1.f / 8.f; // Will do the work if the image isn't cached in memory. @@ -111,11 +111,6 @@ } @Override - public void clear() { - mBitmapCache.clear(); - } - - @Override public @ImageFetcherConfig int getConfig() { return mConfig; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/NetworkImageFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/NetworkImageFetcher.java index aae248a..52b4f31 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/NetworkImageFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/image_fetcher/NetworkImageFetcher.java
@@ -43,9 +43,6 @@ } @Override - public void clear() {} - - @Override public @ImageFetcherConfig int getConfig() { return ImageFetcherConfig.NETWORK_ONLY; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/ContextMenuManager.java b/chrome/android/java/src/org/chromium/chrome/browser/native_page/ContextMenuManager.java index 000c8061..1c1a10f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/native_page/ContextMenuManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/native_page/ContextMenuManager.java
@@ -53,7 +53,7 @@ private final TouchEnabledDelegate mTouchEnabledDelegate; private final Runnable mCloseContextMenuCallback; private final String mUserActionPrefix; - private boolean mContextMenuOpen; + private View mAnchorView; /** Defines callback to configure the context menu and respond to user interaction. */ public interface Delegate { @@ -108,8 +108,7 @@ * are tapped. */ public void createContextMenu(ContextMenu menu, View associatedView, Delegate delegate) { - OnMenuItemClickListener listener = - new ItemClickListener(delegate, mNavigationDelegate, mUserActionPrefix); + OnMenuItemClickListener listener = new ItemClickListener(delegate); boolean hasItems = false; for (@ContextMenuItemId int itemId = 0; itemId < ContextMenuItemId.NUM_ENTRIES; itemId++) { @@ -122,42 +121,68 @@ // No item added. We won't show the menu, so we can skip the rest. if (!hasItems) return; - delegate.onContextMenuCreated(); - - associatedView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { - @Override - public void onViewAttachedToWindow(View view) {} - - @Override - public void onViewDetachedFromWindow(View view) { - closeContextMenu(); - view.removeOnAttachStateChangeListener(this); - } - }); - // Touch events must be disabled on the outer view while the context menu is open. This is // to prevent the user long pressing to get the context menu then on the same press // scrolling or swiping to dismiss an item (eg. https://crbug.com/638854, // https://crbug.com/638555, https://crbug.com/636296). mTouchEnabledDelegate.setTouchEnabled(false); - mContextMenuOpen = true; + mAnchorView = associatedView; + mAnchorView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View view) {} - RecordUserAction.record(mUserActionPrefix + ".ContextMenu.Shown"); + @Override + public void onViewDetachedFromWindow(View view) { + if (view == mAnchorView) { + mCloseContextMenuCallback.run(); + view.removeOnAttachStateChangeListener(this); + } + } + }); + + notifyContextMenuShown(delegate); } @Override public void onContextMenuClosed() { - if (!mContextMenuOpen) return; + if (mAnchorView == null) return; + mAnchorView = null; mTouchEnabledDelegate.setTouchEnabled(true); - mContextMenuOpen = false; } - /** Closes the context menu, if open. */ - public void closeContextMenu() { - mCloseContextMenuCallback.run(); + /** + * Preserves delegate's reference in View's tag so it can later be retrieved from focused view. + */ + public static void registerViewForTouchlessContextMenu(View view, Delegate delegate) { + if (FeatureUtilities.isNoTouchModeEnabled()) { + view.setTag(R.id.context_menu_delegate, delegate); + } } - private boolean shouldShowItem(@ContextMenuItemId int itemId, Delegate delegate) { + /** + * Given currently focused view this function retrieves associated Delegate. + */ + public static Delegate getDelegateFromFocusedView(View view) { + return (Delegate) view.getTag(R.id.context_menu_delegate); + } + + /** + * notifyContextMenuShown is called right before context menu is shown. It allows delegate to + * record statistics about user action. + * + * @param delegate Delegate for which context menu is shown. + */ + protected void notifyContextMenuShown(Delegate delegate) { + delegate.onContextMenuCreated(); + RecordUserAction.record(mUserActionPrefix + ".ContextMenu.Shown"); + } + + /** + * Given context menu item id and delegate of an element for which context menu is shown, + * decides if the menu item should be displayed. Takes other features' state into consideration + * (multiwindow, offline). + */ + protected boolean shouldShowItem(@ContextMenuItemId int itemId, Delegate delegate) { if (!delegate.isItemSupported(itemId)) return false; switch (itemId) { @@ -181,7 +206,10 @@ } } - private @StringRes int getResourceIdForMenuItem(@ContextMenuItemId int id) { + /** + * Returns resource id of a string that should be displayed for menu item with given item id. + */ + protected @StringRes int getResourceIdForMenuItem(@ContextMenuItemId int id) { switch (id) { case ContextMenuItemId.OPEN_IN_NEW_WINDOW: return R.string.contextmenu_open_in_other_window; @@ -205,49 +233,53 @@ return 0; } - private static class ItemClickListener implements OnMenuItemClickListener { - private final Delegate mDelegate; - private final NativePageNavigationDelegate mNavigationDelegate; - private final String mUserActionPrefix; + /** + * Performs an action corresponding to menu item selected by user. + * @param itemId Id of menu item selected by user. + * @param delegate Delegate of an element, for which context menu was shown. + * @return true if user selection was handled. + */ + protected boolean handleMenuItemClick(@ContextMenuItemId int itemId, Delegate delegate) { + switch (itemId) { + case ContextMenuItemId.OPEN_IN_NEW_WINDOW: + delegate.openItem(WindowOpenDisposition.NEW_WINDOW); + RecordUserAction.record(mUserActionPrefix + ".ContextMenu.OpenItemInNewWindow"); + return true; + case ContextMenuItemId.OPEN_IN_NEW_TAB: + delegate.openItem(WindowOpenDisposition.NEW_BACKGROUND_TAB); + RecordUserAction.record(mUserActionPrefix + ".ContextMenu.OpenItemInNewTab"); + return true; + case ContextMenuItemId.OPEN_IN_INCOGNITO_TAB: + delegate.openItem(WindowOpenDisposition.OFF_THE_RECORD); + RecordUserAction.record(mUserActionPrefix + ".ContextMenu.OpenItemInIncognitoTab"); + return true; + case ContextMenuItemId.SAVE_FOR_OFFLINE: + delegate.openItem(WindowOpenDisposition.SAVE_TO_DISK); + RecordUserAction.record(mUserActionPrefix + ".ContextMenu.DownloadItem"); + return true; + case ContextMenuItemId.REMOVE: + delegate.removeItem(); + RecordUserAction.record(mUserActionPrefix + ".ContextMenu.RemoveItem"); + return true; + case ContextMenuItemId.LEARN_MORE: + mNavigationDelegate.navigateToHelpPage(); + RecordUserAction.record(mUserActionPrefix + ".ContextMenu.LearnMore"); + return true; + default: + return false; + } + } - ItemClickListener(Delegate delegate, NativePageNavigationDelegate navigationDelegate, - String userActionPrefix) { + private class ItemClickListener implements OnMenuItemClickListener { + private final Delegate mDelegate; + + ItemClickListener(Delegate delegate) { mDelegate = delegate; - mNavigationDelegate = navigationDelegate; - mUserActionPrefix = userActionPrefix; } @Override public boolean onMenuItemClick(MenuItem item) { - switch (item.getItemId()) { - case ContextMenuItemId.OPEN_IN_NEW_WINDOW: - mDelegate.openItem(WindowOpenDisposition.NEW_WINDOW); - RecordUserAction.record(mUserActionPrefix + ".ContextMenu.OpenItemInNewWindow"); - return true; - case ContextMenuItemId.OPEN_IN_NEW_TAB: - mDelegate.openItem(WindowOpenDisposition.NEW_BACKGROUND_TAB); - RecordUserAction.record(mUserActionPrefix + ".ContextMenu.OpenItemInNewTab"); - return true; - case ContextMenuItemId.OPEN_IN_INCOGNITO_TAB: - mDelegate.openItem(WindowOpenDisposition.OFF_THE_RECORD); - RecordUserAction.record( - mUserActionPrefix + ".ContextMenu.OpenItemInIncognitoTab"); - return true; - case ContextMenuItemId.SAVE_FOR_OFFLINE: - mDelegate.openItem(WindowOpenDisposition.SAVE_TO_DISK); - RecordUserAction.record(mUserActionPrefix + ".ContextMenu.DownloadItem"); - return true; - case ContextMenuItemId.REMOVE: - mDelegate.removeItem(); - RecordUserAction.record(mUserActionPrefix + ".ContextMenu.RemoveItem"); - return true; - case ContextMenuItemId.LEARN_MORE: - mNavigationDelegate.navigateToHelpPage(); - RecordUserAction.record(mUserActionPrefix + ".ContextMenu.LearnMore"); - return true; - default: - return false; - } + return handleMenuItemClick(item.getItemId(), mDelegate); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java index e109aff0..fe28a9d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java
@@ -112,6 +112,7 @@ public void destroy() { assert !ViewCompat .isAttachedToWindow(getView()) : "Destroy called before removed from window"; + super.destroy(); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java index 91232c37..4e47184 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
@@ -180,7 +180,7 @@ initializeLayoutChangeListener(); mNewTabPageLayout.setSearchProviderInfo(searchProviderHasLogo, searchProviderIsGoogle); - mRecyclerView.init(mUiConfig, mContextMenuManager); + mRecyclerView.init(mUiConfig, closeContextMenuCallback); // Set up snippets NewTabPageAdapter newTabPageAdapter = new NewTabPageAdapter(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java index 60aedfa..b6e7836 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java
@@ -57,6 +57,7 @@ (menu, view, menuInfo) -> contextMenuManager.createContextMenu( menu, itemView, CardViewHolder.this)); + ContextMenuManager.registerViewForTouchlessContextMenu(itemView, this); mUiConfig = uiConfig; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBar.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBar.java index 0b07d9d..03cee93 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBar.java
@@ -25,11 +25,6 @@ */ public interface LocationBar extends UrlBarDelegate { /** - * Cleanup resources when this goes out of scope. - */ - void destroy(); - - /** * Handles native dependent initialization for this class. */ void onNativeLibraryReady();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index 01fcafd3..fa9fd26 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -193,12 +193,6 @@ } @Override - public void destroy() { - mAutocompleteCoordinator.destroy(); - mAutocompleteCoordinator = null; - } - - @Override protected void onFinishInflate() { super.onFinishInflate();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AnswersImageFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AnswersImageFetcher.java new file mode 100644 index 0000000..39a6122 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AnswersImageFetcher.java
@@ -0,0 +1,104 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.omnibox.suggestions; + +import android.graphics.Bitmap; +import android.support.v4.util.LruCache; + +import org.chromium.base.annotations.CalledByNative; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.util.ConversionUtils; + +/** + * Provides access to images used by Answers in Suggest. + */ +public class AnswersImageFetcher { + // Matches the value in BitmapFetcherService. + private static final int INVALID_IMAGE_REQUEST_ID = 0; + private static final int MAX_CACHE_SIZE = 500 * ConversionUtils.BYTES_PER_KILOBYTE; + + /** + * Observer for updating an image when it is available. + */ + public interface AnswersImageObserver { + /** + * Called when the image is updated. + * + * @param bitmap the image + */ + @CalledByNative("AnswersImageObserver") + void onAnswersImageChanged(Bitmap bitmap); + } + + // Intentionally not using BitmapCache as that does not cache for low end devices (it ensures + // the bitmaps are de-dups across instances, but discards them if there is not an active + // reference to one). + private final LruCache<String, Bitmap> mBitmapCache = + new LruCache<String, Bitmap>(MAX_CACHE_SIZE) { + @Override + protected int sizeOf(String key, Bitmap value) { + return value.getByteCount(); + } + }; + + /** + * Clears the cached answer images. + */ + public void clearCache() { + mBitmapCache.evictAll(); + } + + /** + * Request image, observer is notified when image is loaded. + * @param profile Profile that the request is for. + * @param imageUrl URL for image data. + * @param observer Observer to be notified when image is updated. The C++ side will hold a + * strong reference to this. + * @return A request_id. + */ + public int requestAnswersImage( + Profile profile, String imageUrl, AnswersImageObserver observer) { + if (!profile.isOffTheRecord()) { + Bitmap bitmap = mBitmapCache.get(imageUrl); + if (bitmap != null) { + observer.onAnswersImageChanged(bitmap); + return INVALID_IMAGE_REQUEST_ID; + } + } + AnswersImageObserver cacheObserver = observer; + if (!profile.isOffTheRecord()) { + cacheObserver = new AnswersImageObserver() { + @Override + public void onAnswersImageChanged(Bitmap bitmap) { + if (bitmap == null) return; + mBitmapCache.put(imageUrl, bitmap); + observer.onAnswersImageChanged(bitmap); + } + }; + } + return nativeRequestAnswersImage(profile, imageUrl, cacheObserver); + } + + /** + * Cancel a pending image request. + * @param profile Profile the request was issued for. + * @param requestId The ID of the request to be cancelled. + */ + public void cancelAnswersImageRequest(Profile profile, int requestId) { + nativeCancelAnswersImageRequest(profile, requestId); + } + + /** + * Requests an image at |imageUrl| for the given |profile| with |observer| being notified. + * @returns an AnswersImageRequest + */ + private static native int nativeRequestAnswersImage( + Profile profile, String imageUrl, AnswersImageObserver observer); + + /** + * Cancels a pending request. + */ + private static native void nativeCancelAnswersImageRequest(Profile profile, int requestId); +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java index 74624f95..a77cf3d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java
@@ -50,7 +50,7 @@ */ public class AutocompleteCoordinator implements UrlFocusChangeListener, UrlTextChangeListener { private final ViewGroup mParent; - private AutocompleteMediator mMediator; + private final AutocompleteMediator mMediator; private ListView mListView; @@ -170,11 +170,6 @@ new AutocompleteMediator(context, delegate, urlBarEditingTextProvider, listModel); } - public void destroy() { - mMediator.destroy(); - mMediator = null; - } - private ViewProvider<SuggestionListViewHolder> createViewProvider(Context context) { return new ViewProvider<SuggestionListViewHolder>() { private List<Callback<SuggestionListViewHolder>> mCallbacks = new ArrayList<>();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java index e63d273..77d63a4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
@@ -93,7 +93,7 @@ private final Handler mHandler; private final BasicSuggestionProcessor mBasicSuggestionProcessor; private EditUrlSuggestionProcessor mEditUrlProcessor; - private AnswerSuggestionProcessor mAnswerSuggestionProcessor; + private final AnswerSuggestionProcessor mAnswerSuggestionProcessor; private ToolbarDataProvider mDataProvider; private boolean mNativeInitialized; @@ -157,11 +157,6 @@ delegate, (suggestion) -> onSelection(suggestion, 0)); } - public void destroy() { - mAnswerSuggestionProcessor.destroy(); - mAnswerSuggestionProcessor = null; - } - @Override public void onStartWithNative() {}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessor.java index 4be65e7..7ddabaed 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessor.java
@@ -11,13 +11,10 @@ import android.view.View; import org.chromium.base.ThreadUtils; -import org.chromium.chrome.browser.ChromeApplication; import org.chromium.chrome.browser.ChromeFeatureList; -import org.chromium.chrome.browser.image_fetcher.ImageFetcher; -import org.chromium.chrome.browser.image_fetcher.ImageFetcherConfig; -import org.chromium.chrome.browser.image_fetcher.ImageFetcherFactory; import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider; +import org.chromium.chrome.browser.omnibox.suggestions.AnswersImageFetcher; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator.SuggestionProcessor; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionUiType; @@ -27,7 +24,6 @@ import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewProperties; import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewProperties.SuggestionIcon; import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewProperties.SuggestionTextContainer; -import org.chromium.chrome.browser.util.ConversionUtils; import org.chromium.components.omnibox.AnswerType; import org.chromium.components.omnibox.SuggestionAnswer; import org.chromium.ui.modelutil.PropertyModel; @@ -39,12 +35,10 @@ /** A class that handles model and view creation for the most commonly used omnibox suggestion. */ public class AnswerSuggestionProcessor implements SuggestionProcessor { - private static final int MAX_CACHE_SIZE = 500 * ConversionUtils.BYTES_PER_KILOBYTE; - private final Map<String, List<PropertyModel>> mPendingAnswerRequestUrls; private final Context mContext; private final SuggestionHost mSuggestionHost; - private ImageFetcher mImageFetcher; + private final AnswersImageFetcher mImageFetcher; private final UrlBarEditingTextStateProvider mUrlBarEditingTextProvider; private boolean mEnableNewAnswerLayout; @@ -57,16 +51,10 @@ mContext = context; mSuggestionHost = suggestionHost; mPendingAnswerRequestUrls = new HashMap<>(); + mImageFetcher = new AnswersImageFetcher(); mUrlBarEditingTextProvider = editingTextProvider; } - public void destroy() { - if (mImageFetcher != null) { - mImageFetcher.destroy(); - mImageFetcher = null; - } - } - @Override public boolean doesProcessSuggestion(OmniboxSuggestion suggestion) { // Calculation answers are specific in a way that these are basic suggestions, but processed @@ -108,10 +96,7 @@ @Override public void onUrlFocusChange(boolean hasFocus) { - // This clear is necessary for memory as well as clearing when switching to/from incognito. - if (!hasFocus && mImageFetcher != null) { - mImageFetcher.clear(); - } + if (!hasFocus) mImageFetcher.clearCache(); } private void maybeFetchAnswerIcon(OmniboxSuggestion suggestion, PropertyModel model) { @@ -132,35 +117,30 @@ return; } - if (mImageFetcher == null) { - mImageFetcher = ImageFetcherFactory.createImageFetcher( - ImageFetcherConfig.IN_MEMORY_ONLY, - ((ChromeApplication) mContext.getApplicationContext()).getReferencePool(), - MAX_CACHE_SIZE); - } - List<PropertyModel> models = new ArrayList<>(); models.add(model); mPendingAnswerRequestUrls.put(url, models); + mImageFetcher.requestAnswersImage(mSuggestionHost.getCurrentProfile(), url, + new AnswersImageFetcher.AnswersImageObserver() { + @Override + public void onAnswersImageChanged(Bitmap bitmap) { + ThreadUtils.assertOnUiThread(); - mImageFetcher.fetchImage( - url, ImageFetcher.ANSWER_SUGGESTIONS_UMA_CLIENT_NAME, (Bitmap bitmap) -> { - ThreadUtils.assertOnUiThread(); + List<PropertyModel> models = mPendingAnswerRequestUrls.remove(url); + boolean didUpdate = false; + for (int i = 0; i < models.size(); i++) { + PropertyModel model = models.get(i); + if (!mSuggestionHost.isActiveModel(model)) continue; - List<PropertyModel> currentModels = mPendingAnswerRequestUrls.remove(url); - boolean didUpdate = false; - for (int i = 0; i < currentModels.size(); i++) { - PropertyModel currentModel = currentModels.get(i); - if (!mSuggestionHost.isActiveModel(currentModel)) continue; - - if (mEnableNewAnswerLayout) { - model.set(AnswerSuggestionViewProperties.ANSWER_IMAGE, bitmap); - } else { - model.set(SuggestionViewProperties.ANSWER_IMAGE, bitmap); + if (mEnableNewAnswerLayout) { + model.set(AnswerSuggestionViewProperties.ANSWER_IMAGE, bitmap); + } else { + model.set(SuggestionViewProperties.ANSWER_IMAGE, bitmap); + } + didUpdate = true; } - didUpdate = true; + if (didUpdate) mSuggestionHost.notifyPropertyModelsChanged(); } - if (didUpdate) mSuggestionHost.notifyPropertyModelsChanged(); }); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java index 33062b4..eccd21e1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java
@@ -9,7 +9,6 @@ import org.chromium.chrome.browser.share.ShareActivity; import org.chromium.chrome.browser.tab.Tab; import org.chromium.content_public.browser.NavigationEntry; -import org.chromium.content_public.browser.NavigationHistory; import org.chromium.ui.widget.Toast; /** @@ -19,10 +18,10 @@ @Override protected void handleShareAction(ChromeActivity triggeringActivity) { Tab tab = triggeringActivity.getActivityTabProvider().get(); + if (tab == null) return; - NavigationHistory history = - tab.getWebContents().getNavigationController().getNavigationHistory(); - NavigationEntry entry = history.getEntryAtIndex(history.getCurrentEntryIndex()); + NavigationEntry entry = tab.getWebContents().getNavigationController().getVisibleEntry(); + if (entry == null) return; // TODO(crbug/946808) Add actual target device cache GUID. String targetDeviceSyncCacheGuid = "";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsMetrics.java index b9d3c8a..78b7274 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsMetrics.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsMetrics.java
@@ -6,8 +6,6 @@ import android.support.v7.widget.RecyclerView; -import com.google.android.libraries.feed.host.logging.SpinnerType; - import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.ntp.NewTabPage; @@ -173,7 +171,7 @@ */ public static class SpinnerDurationTracker { private long mTrackingStartTimeMs; - private @SpinnerType int mSpinnerType; + private @State int mSpinnerType; private SpinnerDurationTracker() { mTrackingStartTimeMs = 0; @@ -188,16 +186,11 @@ if (isTracking()) return; - if (state == State.INITIAL_LOADING) { - mSpinnerType = SpinnerType.INITIAL_LOAD; - } else if (state == State.MORE_BUTTON_LOADING) { - mSpinnerType = SpinnerType.MORE_BUTTON; + if (state == State.INITIAL_LOADING || state == State.MORE_BUTTON_LOADING) { + mSpinnerType = state; } mTrackingStartTimeMs = System.currentTimeMillis(); - - RecordHistogram.recordEnumeratedHistogram( - "ContentSuggestions.Feed.FetchPendingSpinner.Shown", mSpinnerType, - SpinnerType.NEXT_VALUE); + recordSpinnerShowUMA(state); } /** @@ -225,12 +218,36 @@ long duration = System.currentTimeMillis() - mTrackingStartTimeMs; RecordHistogram.recordTimesHistogram(baseName, duration); - if (mSpinnerType == SpinnerType.INITIAL_LOAD) { + if (mSpinnerType == State.INITIAL_LOADING) { RecordHistogram.recordTimesHistogram(baseName + ".InitialLoad", duration); - } else if (mSpinnerType == SpinnerType.MORE_BUTTON) { + } else if (mSpinnerType == State.MORE_BUTTON_LOADING) { RecordHistogram.recordTimesHistogram(baseName + ".MoreButton", duration); } mTrackingStartTimeMs = 0; } + + private void recordSpinnerShowUMA(@State int state) { + int feedSpinnerType; + + // Here is convert the to {@link SpinnerType} in /third_party/feed/src/main/java/com/ + // google/android/libraries/feed/host/logging/SpinnerType.java. + // {@link SpinnerType} cannot be directly used here since feed libraries are not always + // compiled. + switch (state) { + case State.INITIAL_LOADING: + feedSpinnerType = /*SpinnerType.INITIAL_LOAD=*/1; + break; + case State.MORE_BUTTON_LOADING: + feedSpinnerType = /*SpinnerType.MORE_BUTTON=*/3; + break; + default: + // This is not a spinner type, so do not record it. + return; + } + + RecordHistogram.recordEnumeratedHistogram( + "ContentSuggestions.Feed.FetchPendingSpinner.Shown", feedSpinnerType, + /*SpinnerType.NEXT_VALUE=*/6); + } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsRecyclerView.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsRecyclerView.java index 8eb7172..c9eb3e4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsRecyclerView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsRecyclerView.java
@@ -31,7 +31,6 @@ import android.view.inputmethod.InputConnection; import org.chromium.chrome.R; -import org.chromium.chrome.browser.native_page.ContextMenuManager; import org.chromium.chrome.browser.ntp.cards.CardViewHolder; import org.chromium.chrome.browser.ntp.cards.NewTabPageAdapter; import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder; @@ -80,8 +79,7 @@ /** The ui config for this view. */ private UiConfig mUiConfig; - /** The context menu manager for this view. */ - private ContextMenuManager mContextMenuManager; + private Runnable mCloseContextMenuCallback; private boolean mIsCardBeingSwiped; @@ -214,7 +212,7 @@ if (mUiConfig != null) mUiConfig.updateDisplayStyle(); // Close the Context Menu as it may have moved (https://crbug.com/642688). - if (mContextMenuManager != null) mContextMenuManager.closeContextMenu(); + if (mCloseContextMenuCallback != null) mCloseContextMenuCallback.run(); } @Override @@ -227,9 +225,9 @@ super.onLayout(changed, l, t, r, b); } - public void init(UiConfig uiConfig, ContextMenuManager contextMenuManager) { + public void init(UiConfig uiConfig, Runnable closeContextMenuCallback) { mUiConfig = uiConfig; - mContextMenuManager = contextMenuManager; + mCloseContextMenuCallback = closeContextMenuCallback; } public NewTabPageAdapter getNewTabPageAdapter() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java index fa02707..34311da 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java
@@ -198,9 +198,6 @@ } @Override - public void destroy() {} - - @Override void initialize(ToolbarDataProvider toolbarDataProvider, ToolbarTabController tabController, AppMenuButtonHelper appMenuButtonHelper) { super.initialize(toolbarDataProvider, tabController, appMenuButtonHelper);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java index b5d5327..e2d5d0c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
@@ -137,8 +137,6 @@ mThemeColorProvider.removeThemeColorObserver(this); mThemeColorProvider = null; } - - getLocationBar().destroy(); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java index ec7af72..29a0560 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -392,9 +392,6 @@ void destroy() { super.destroy(); if (mHomeButton != null) mHomeButton.destroy(); - if (mUrlFocusLayoutAnimator != null && mUrlFocusLayoutAnimator.isRunning()) { - mUrlFocusLayoutAnimator.cancel(); - } } /**
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb index 309d6eb..b6fe55e 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -903,7 +903,7 @@ <translation id="756809126120519699">Data Chrome telah dihapus</translation> <translation id="757524316907819857">Blokir situs agar tidak memutar konten yang dilindungi</translation> <translation id="757855969265046257">{FILES,plural, =1{<ph name="FILES_DOWNLOADED_ONE" /> file didownload}other{<ph name="FILES_DOWNLOADED_MANY" /> file didownload}}</translation> -<translation id="7588219262685291874">Aktifkan tema gelap saat Penghemat Daya di perangkat diaktifkan</translation> +<translation id="7588219262685291874">Aktifkan tema gelap saat mode Penghemat Baterai perangkat aktif</translation> <translation id="7589445247086920869">Blokir mesin telusur saat ini</translation> <translation id="7593557518625677601">Buka setelan Android dan aktifkan kembali sinkronisasi sistem Android untuk memulai Sinkronisasi Chrome</translation> <translation id="7596558890252710462">Sistem operasi</translation> @@ -1002,7 +1002,7 @@ <translation id="8266862848225348053">Lokasi download</translation> <translation id="8274165955039650276">Lihat hasil download</translation> <translation id="8283853025636624853">Menyinkronkan dengan <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> -<translation id="8300705686683892304">Managed by app</translation> +<translation id="8300705686683892304">Dikelola oleh aplikasi</translation> <translation id="8310344678080805313">Tab standar</translation> <translation id="8313455859591948645">Edit halaman awal</translation> <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> dan situs lainnya</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb index c00098f5..2967d083 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -45,6 +45,7 @@ <translation id="1285320974508926690">Niekada neversti šios svetainės</translation> <translation id="1291207594882862231">Išvalykite istoriją, slapukus, svetainės duomenis, talpyklą…</translation> <translation id="129553762522093515">Neseniai uždarytas</translation> +<translation id="1303507811548703290"><ph name="DOMAIN" /> – išsiųsta iš „<ph name="DEVICE_NAME" />“</translation> <translation id="1326317727527857210">Prisijunkite prie „Chrome“, kad pasiektumėte skirtukus iš kitų įrenginių.</translation> <translation id="1331212799747679585">Nepavyksta atnaujinti „Chrome“. Daugiau parinkčių.</translation> <translation id="1332501820983677155">„Google Chrome“ funkcijų spartieji klavišai</translation> @@ -170,6 +171,7 @@ <translation id="2154484045852737596">Kortelės informacijos redagavimas</translation> <translation id="2154710561487035718">Kopijuoti URL adresą</translation> <translation id="2156074688469523661">Likusios svetainės (<ph name="NUMBER_OF_SITES" />)</translation> +<translation id="218608176142494674">Bendrinimas</translation> <translation id="2206488550163399966">„<ph name="APP_NAME" />“, žiniatinklio programa. <ph name="APP_URL" /></translation> <translation id="2227444325776770048">Tęsti kaip <ph name="USER_FULL_NAME" /></translation> <translation id="2234876718134438132">Sinchron. ir „Google“ paslaugos</translation> @@ -648,6 +650,7 @@ <translation id="5797070761912323120">„Google“ gali naudoti jūsų istoriją, kad suasmenintų Paiešką, skelbimus ir kitas „Google“ paslaugas</translation> <translation id="5804241973901381774">Leidimai</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Prieš 1 valandą}one{Prieš # valandą}few{Prieš # valandas}many{Prieš # valandos}other{Prieš # valandų}}</translation> +<translation id="5810288467834065221">Autorių teisės „Google LLC.“, <ph name="YEAR" /> m. Visos teisės saugomos.</translation> <translation id="5817918615728894473">Susieti</translation> <translation id="583281660410589416">Nežinoma</translation> <translation id="5833984609253377421">Bendrinti nuorodą</translation> @@ -900,6 +903,7 @@ <translation id="756809126120519699">Išvalyti „Chrome“ duomenys</translation> <translation id="757524316907819857">Užblokuoti svetaines, kad neleistų apsaugoto turinio</translation> <translation id="757855969265046257">{FILES,plural, =1{Atsisiųstas <ph name="FILES_DOWNLOADED_ONE" /> failas}one{Atsisiųstas <ph name="FILES_DOWNLOADED_MANY" /> failas}few{Atsisiųsti <ph name="FILES_DOWNLOADED_MANY" /> failai}many{Atsisiųsta <ph name="FILES_DOWNLOADED_MANY" /> failo}other{Atsisiųsta <ph name="FILES_DOWNLOADED_MANY" /> failų}}</translation> +<translation id="7588219262685291874">Įjungti tamsiąją temą, kai įjungta įrenginio akumuliatoriaus tausojimo priemonė</translation> <translation id="7589445247086920869">Blokuoti dabartiniam paieškos varikliui</translation> <translation id="7593557518625677601">Atid. „Android“ nust. ir iš n. įgal. „Android“ sist., kad prad. „Chrome“ sinchr.</translation> <translation id="7596558890252710462">Operacinė sistema</translation> @@ -998,6 +1002,7 @@ <translation id="8266862848225348053">Atsisiuntimo vieta</translation> <translation id="8274165955039650276">Peržiūrėti atsisiuntimus</translation> <translation id="8283853025636624853">Sinchronizuojama su <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> +<translation id="8300705686683892304">Valdo programa</translation> <translation id="8310344678080805313">Įprasti skirtukai</translation> <translation id="8313455859591948645">Paleidimo puslapio redagavimas</translation> <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> ir daugiau svetainių</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb index 01364c9..92f89b3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -45,6 +45,7 @@ <translation id="1285320974508926690">Deze site nooit vertalen</translation> <translation id="1291207594882862231">Geschiedenis, cookies, sitegegevens, cachegeheugen wissen</translation> <translation id="129553762522093515">Recent gesloten</translation> +<translation id="1303507811548703290"><ph name="DOMAIN" />: verzonden vanaf <ph name="DEVICE_NAME" /></translation> <translation id="1326317727527857210">Log in bij Chrome om de tabbladen van je andere apparaten te bekijken.</translation> <translation id="1331212799747679585">Chrome kan niet updaten. Meer opties</translation> <translation id="1332501820983677155">Functiesneltoetsen in Google Chrome</translation> @@ -170,6 +171,7 @@ <translation id="2154484045852737596">Pas bewerken</translation> <translation id="2154710561487035718">URL kopiëren</translation> <translation id="2156074688469523661">Resterende sites (<ph name="NUMBER_OF_SITES" />)</translation> +<translation id="218608176142494674">Delen</translation> <translation id="2206488550163399966"><ph name="APP_NAME" />, webapp. <ph name="APP_URL" /></translation> <translation id="2227444325776770048">Doorgaan als <ph name="USER_FULL_NAME" /></translation> <translation id="2234876718134438132">Synchronisatie & Google-services</translation> @@ -648,6 +650,7 @@ <translation id="5797070761912323120">Google kan je geschiedenis gebruiken om Google Zoeken, advertenties en andere Google-services te personaliseren</translation> <translation id="5804241973901381774">Rechten</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# uur geleden}other{# uur geleden}}</translation> +<translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Alle rechten voorbehouden.</translation> <translation id="5817918615728894473">Koppelen</translation> <translation id="583281660410589416">Onbekend</translation> <translation id="5833984609253377421">Link delen</translation> @@ -900,6 +903,7 @@ <translation id="756809126120519699">Chrome-gegevens gewist</translation> <translation id="757524316907819857">Blokkeren dat sites beschermde content kunnen afspelen</translation> <translation id="757855969265046257">{FILES,plural, =1{<ph name="FILES_DOWNLOADED_ONE" /> bestand gedownload}other{<ph name="FILES_DOWNLOADED_MANY" /> bestanden gedownload}}</translation> +<translation id="7588219262685291874">Het donkere thema inschakelen wanneer de batterijbesparing van je apparaat is ingeschakeld</translation> <translation id="7589445247086920869">Blokkeren voor huidige zoekmachine</translation> <translation id="7593557518625677601">Open Android-instellingen en schakel Android-systeemsynchronisatie weer in om Chrome-synchronisatie te starten</translation> <translation id="7596558890252710462">Besturingssysteem</translation> @@ -998,6 +1002,7 @@ <translation id="8266862848225348053">Downloadlocatie</translation> <translation id="8274165955039650276">Downloads bekijken</translation> <translation id="8283853025636624853">Synchroniseren met <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> +<translation id="8300705686683892304">Beheerd door app</translation> <translation id="8310344678080805313">Standaardtabbladen</translation> <translation id="8313455859591948645">Startpagina bewerken</translation> <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> en meer sites</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb index ffe8a7c..9741d890 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
@@ -118,6 +118,7 @@ <translation id="1891331835972267886">Chrome இல் <ph name="APP_NAME" /> திறக்கும். தொடர்வதன் மூலம், Chrome இன் <ph name="BEGIN_LINK1" />சேவை விதிமுறைகள்<ph name="END_LINK1" /> மற்றும் <ph name="BEGIN_LINK2" />தனியுரிமை அறிக்கையை<ph name="END_LINK2" /> ஏற்கிறீர்கள்.</translation> <translation id="1919345977826869612">விளம்பரங்கள்</translation> <translation id="1919950603503897840">தொடர்புகளைத் தேர்ந்தெடுக்கவும்</translation> +<translation id="1922076542920281912">Chrome உங்கள் இருப்பிடத் தகவலை அணுக அனுமதிப்பதற்கு <ph name="BEGIN_LINK" />Android அமைப்புகளிலும்<ph name="END_LINK" /> இருப்பிடத்தை இயக்கவும்.</translation> <translation id="1923695749281512248"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / <ph name="FILE_SIZE_WITH_UNITS" /></translation> <translation id="19288952978244135">Chromeமை மீண்டும் திறக்கவும்.</translation> <translation id="1933845786846280168">தேர்ந்தெடுத்த தாவல்</translation> @@ -143,9 +144,11 @@ <translation id="2018707881002649255">கீழே நீங்கள் தேர்ந்தெடுக்கும் தொடர்புகள் <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> இணையதளத்துடன் பகிரப்படும்.</translation> <translation id="2021896219286479412">முழுத் திரை தளக் கட்டுப்பாடுகள்</translation> <translation id="2038563949887743358">டெஸ்க்டாப் தளத்தைக் கோரு என்பதை இயக்கு</translation> +<translation id="2041019821020695769">Chrome உங்களுக்கு அறிவிப்புகளை அனுப்ப அனுமதிப்பதற்கு<ph name="BEGIN_LINK" />Android அமைப்புகளிலும்<ph name="END_LINK" /> அறிவிப்புகளை இயக்கவும்.</translation> <translation id="204321170514947529"><ph name="APP_NAME" /> ஆப்ஸின் தரவும் Chromeமில் உள்ளது</translation> <translation id="2045104531052923016">பிற பயன்பாடுகள் பயன்படுத்தும் அளவு: <ph name="GIGABYTES" /> ஜி.பை.</translation> <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> +<translation id="2049961518639794558">கோப்பின் நீட்டிப்பை மாற்றினால் எதிர்பாராத செயல்பாடு ஏற்படுவதோடு உங்கள் சாதனத்திற்கும் தீங்கிழைக்கக்கூடும்.</translation> <translation id="2056878612599315956">தளம் இடைநிறுத்தப்பட்டுள்ளது</translation> <translation id="2063713494490388661">தேடத் தட்டுக</translation> <translation id="2079545284768500474">செயல்தவிர்</translation> @@ -244,6 +247,7 @@ <translation id="2810645512293415242">தரவைச் சேமித்து, வேகமாக ஏற்றுவதற்கு எளிதாக்கப்பட்ட பக்கம்.</translation> <translation id="281504910091592009">உங்கள் <ph name="BEGIN_LINK" />Google கணக்கில்<ph name="END_LINK" /> சேமிக்கப்பட்ட கடவுச்சொற்களைப் பார்த்து, நிர்வகிக்கவும்</translation> <translation id="2818669890320396765">உங்கள் அனைத்துச் சாதனங்களிலும் புத்தகக்குறிகளைப் பெற, உள்நுழைந்து, ஒத்திசைவை இயக்கவும்</translation> +<translation id="2822354292072154809"><ph name="CHOSEN_OBJECT_NAME" />க்கான தள அனுமதிகள் அனைத்தையும் நிச்சயமாக மீட்டமைக்க விரும்புகிறீர்களா?</translation> <translation id="2836148919159985482">முழுத்திரையிலிருந்து வெளியேற, "முந்தையது" பொத்தானைத் தொடவும்.</translation> <translation id="2842985007712546952">மூலக் கோப்புறை</translation> <translation id="2845873210977809562">திறந்துள்ள தாவல்கள் மூடப்பட்டன</translation> @@ -352,6 +356,7 @@ <translation id="3712575778697986964">டேட்டா சேமிப்பானை மீட்டமைக்கவா?</translation> <translation id="3714981814255182093">கண்டறி பட்டியைத் திறக்கும்</translation> <translation id="3716182511346448902">இந்தப் பக்கம் அதிகளவு நினைவகத்தைப் பயன்படுத்துவதால், Chrome அதை இடைநிறுத்தியுள்ளது.</translation> +<translation id="3730075448226062617">Chrome உங்கள் மைக்ரோஃபோனை அணுக அனுமதிப்பதற்கு <ph name="BEGIN_LINK" />Android அமைப்புகளிலும்<ph name="END_LINK" /> மைக்ரோஃபோனை இயக்கவும்.</translation> <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> இல் புத்தகக்குறியிடப்பட்டது</translation> <translation id="3744111309925758534">பிற பயன்பாடுகள் பயன்படுத்தும் அளவு: <ph name="MEGABYTES" /> மெ.பை.</translation> <translation id="3744111561329211289">பின்புல ஒத்திசைவு</translation> @@ -473,6 +478,7 @@ <translation id="4634124774493850572">கடவுச்சொல்லைப் பயன்படுத்து</translation> <translation id="4645575059429386691">உங்கள் பெற்றோரால் நிர்வகிக்கப்படுகிறது</translation> <translation id="4648718555153979859">உங்கள் தாவல்கள் இங்கு குழுவாக்கப்பட்டுள்ளன</translation> +<translation id="4650364565596261010">சிஸ்டத்தின் இயல்புநிலை</translation> <translation id="4660011489602794167">விசைப்பலகையைக் காட்டு</translation> <translation id="4663756553811254707"><ph name="NUMBER_OF_BOOKMARKS" /> புக்மார்க்குகள் நீக்கப்பட்டன</translation> <translation id="4665282149850138822"><ph name="NAME" /> உங்கள் முகப்புத் திரையில் சேர்க்கப்பட்டது</translation> @@ -512,6 +518,7 @@ <translation id="488187801263602086">கோப்பின் பெயரை மாற்றவும்</translation> <translation id="4882831918239250449">தேடல், விளம்பரங்கள் மற்றும் பலவற்றைத் தனிப்பயனாக்க உங்கள் உலாவல் வரலாறு எப்படிப் பயன்படுத்தப்படுகிறது என்பதைக் கட்டுப்படுத்துதல்</translation> <translation id="4883379392681899581">மறைநிலையை விட்டு வெளியேறும்</translation> +<translation id="4883854917563148705">நிர்வகிக்கப்பட்ட அமைப்புகளை மீட்டமைக்க முடியாது</translation> <translation id="4885273946141277891">ஆதரிக்கப்படாத Chrome நிகழ்வுகளின் எண்ணிக்கை.</translation> <translation id="4910889077668685004">கட்டணம் செலுத்துவதற்கான பயன்பாடுகள்</translation> <translation id="4913161338056004800">புள்ளிவிவரங்களை மீட்டமை</translation> @@ -523,6 +530,7 @@ <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> உங்கள் திரையைப் பகிர்கிறது</translation> <translation id="4961107849584082341">இந்தப் பக்கத்தை எந்தவொரு மொழியிலும் மொழிபெயர்க்கலாம்</translation> <translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" /> நிர்வகிக்கும் கணக்கிலிருந்து வெளியேறுகிறீர்கள். இவ்வாறு செய்வதால், இந்தச் சாதனத்திலிருந்து Chrome தரவு நீக்கப்படும், எனினும் உங்கள் Google கணக்கில் தரவு தொடர்ந்து இருக்கும்.</translation> +<translation id="4962975101802056554">சாதனத்திற்கான அனைத்து அனுமதிகளையும் ரத்துசெய்யும்</translation> <translation id="4970824347203572753">உங்கள் நாட்டில் இல்லை</translation> <translation id="497421865427891073">முன் செல்க</translation> <translation id="4988210275050210843">கோப்பைப் பதிவிறக்குகிறது (<ph name="MEGABYTES" />).</translation> @@ -661,6 +669,7 @@ <translation id="5937580074298050696"><ph name="AMOUNT" /> சேமிக்கப்பட்டது</translation> <translation id="5939518447894949180">மீட்டமை</translation> <translation id="5942872142862698679">தேடலுக்கு Googleளைப் பயன்படுத்துகிறீர்கள்</translation> +<translation id="5944669582486359588">’லைட்’ பயன்முறையில் பக்கங்களை Chrome வேகமாக ஏற்றுவதோடு டேட்டாவை 60 சதவீதம் குறைவாகவும் பயன்படுத்தும். Google கிளவுட் தொழில்நுட்பம் நீங்கள் பார்க்கும் பக்கத்தை மேம்படுத்தும்.</translation> <translation id="5952764234151283551">நீங்கள் செல்ல முயலும் பக்கத்தின் URLலை Googleளுக்கு அனுப்பும்</translation> <translation id="5956665950594638604">Chrome உதவி மையத்தைப் புதிய தாவலில் திறக்கும்</translation> <translation id="5958275228015807058">பதிவிறக்கங்கள் என்பதில் கோப்புகளையும் பக்கங்களையும் கண்டறியலாம்</translation> @@ -690,6 +699,7 @@ <translation id="618993374665929060">‘இது போன்று மேலும்’ தாள், முழு உயரத்தில் திறக்கப்பட்டுள்ளது</translation> <translation id="6192333916571137726">கோப்பைப் பதிவிறக்கவும்</translation> <translation id="6192792657125177640">விதிவிலக்குகள்</translation> +<translation id="6194112207524046168">உங்கள் கேமராவை அணுக Chromeமை அனுமதிப்பதற்கு <ph name="BEGIN_LINK" />Android அமைப்புகளிலும்<ph name="END_LINK" /> கேமராவை இயக்கவும்.</translation> <translation id="6196640612572343990">மூன்றாம் தரப்புக் குக்கீகளைத் தடு</translation> <translation id="6206551242102657620">பாதுகாப்பான இணைப்பு. தளத் தகவல்</translation> <translation id="6210748933810148297"><ph name="EMAIL" /> இல்லையா?</translation> @@ -915,6 +925,7 @@ <translation id="7765158879357617694">நகர்த்து</translation> <translation id="7769602470925380267">சரி, வெளியேறு</translation> <translation id="7772032839648071052">கடவுச்சொற்றொடரை உறுதி செய்க</translation> +<translation id="7772375229873196092"><ph name="APP_NAME" />ஐ மூடு</translation> <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 மற்றும் <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> கட்டண முறை}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 மற்றும் <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> கட்டண முறைகள்}}</translation> <translation id="7781829728241885113">நேற்று</translation> <translation id="7791543448312431591">சேர்</translation> @@ -922,6 +933,7 @@ <translation id="7810647596859435254">இதன் மூலம் திற…</translation> <translation id="7821588508402923572">உங்கள் டேட்டா சேமிப்புகள் இங்கே தோன்றும்</translation> <translation id="7837721118676387834">ஒலியடக்கிய வீடியோக்களைத் தானாக இயக்க, குறிப்பிட்ட தளத்தை அனுமதி.</translation> +<translation id="7838340937077326045">கோப்பின் நீட்டிப்பை நிச்சயமாக மாற்ற விரும்புகிறீர்களா?</translation> <translation id="7846076177841592234">தேர்வை ரத்துசெய்</translation> <translation id="784934925303690534">நேர வரம்பு</translation> <translation id="7851858861565204677">பிற சாதனங்கள்</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb index 9040751..4167df8 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -45,6 +45,7 @@ <translation id="1285320974508926690">Ніколи не перекладати цей сайт</translation> <translation id="1291207594882862231">Очистити історію, файли cookie, дані сайтів, кеш…</translation> <translation id="129553762522093515">Нещодавно закриті</translation> +<translation id="1303507811548703290"><ph name="DOMAIN" /> – Надіслано з пристрою "<ph name="DEVICE_NAME" />"</translation> <translation id="1326317727527857210">Щоб мати доступ до вкладок з інших пристроїв, увійдіть в обліковий запис Chrome.</translation> <translation id="1331212799747679585">Неможливо оновити Chrome. Більше опцій</translation> <translation id="1332501820983677155">Комбінації клавіш для функцій Google Chrome</translation> @@ -170,6 +171,7 @@ <translation id="2154484045852737596">Редагувати картку</translation> <translation id="2154710561487035718">Копіювати URL-адресу</translation> <translation id="2156074688469523661">Інші сайти (<ph name="NUMBER_OF_SITES" />)</translation> +<translation id="218608176142494674">Спільний доступ</translation> <translation id="2206488550163399966">Веб-додаток <ph name="APP_NAME" />: <ph name="APP_URL" /></translation> <translation id="2227444325776770048">Продовжити як <ph name="USER_FULL_NAME" /></translation> <translation id="2234876718134438132">Синхронізація та сервіси Google</translation> @@ -648,6 +650,7 @@ <translation id="5797070761912323120">Google може використовувати вашу історію, щоб персоналізувати Пошук, оголошення й інші сервіси Google</translation> <translation id="5804241973901381774">Дозволи</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# годину тому}one{# годину тому}few{# години тому}many{# годин тому}other{# години тому}}</translation> +<translation id="5810288467834065221">Авторське право <ph name="YEAR" /> Google LLC. Усі права захищено.</translation> <translation id="5817918615728894473">Підключити</translation> <translation id="583281660410589416">Невідомий</translation> <translation id="5833984609253377421">Поділитися посиланням</translation> @@ -900,6 +903,7 @@ <translation id="756809126120519699">Дані Chrome видалено</translation> <translation id="757524316907819857">Заборонити сайтам відтворювати захищений вміст</translation> <translation id="757855969265046257">{FILES,plural, =1{Завантажено <ph name="FILES_DOWNLOADED_ONE" /> файл}one{Завантажено <ph name="FILES_DOWNLOADED_MANY" /> файл}few{Завантажено <ph name="FILES_DOWNLOADED_MANY" /> файли}many{Завантажено <ph name="FILES_DOWNLOADED_MANY" /> файлів}other{Завантажено <ph name="FILES_DOWNLOADED_MANY" /> файлу}}</translation> +<translation id="7588219262685291874">Показувати темну тему, коли на пристрої ввімкнено режим енергозбереження</translation> <translation id="7589445247086920869">Заблокувати для поточної пошукової системи</translation> <translation id="7593557518625677601">Щоб почати синхронізацію Chrome, відкрийте параметри Android і знову ввімкніть синхронізацію системи</translation> <translation id="7596558890252710462">Операційна система</translation> @@ -998,6 +1002,7 @@ <translation id="8266862848225348053">Папка для завантажень</translation> <translation id="8274165955039650276">Переглянути завантаження</translation> <translation id="8283853025636624853">Синхронізація з обліковим записом <ph name="SYNC_ACCOUNT_USER_NAME" /></translation> +<translation id="8300705686683892304">Керуються додатком</translation> <translation id="8310344678080805313">Стандартні вкладки</translation> <translation id="8313455859591948645">Редагувати стартову сторінку</translation> <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> та інші сайти</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/NavigationPopupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/NavigationPopupTest.java index bd78420bc..4fb3620 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/NavigationPopupTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/NavigationPopupTest.java
@@ -181,6 +181,11 @@ } @Override + public NavigationEntry getVisibleEntry() { + return null; + } + + @Override public NavigationEntry getPendingEntry() { return null; }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java index bb2549c..5d48faa36 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
@@ -143,7 +143,7 @@ mContextMenuManager = new ContextMenuManager(mUiDelegate.getNavigationDelegate(), mRecyclerView::setTouchEnabled, activity::closeContextMenu, NewTabPage.CONTEXT_MENU_USER_ACTION_PREFIX); - mRecyclerView.init(mUiConfig, mContextMenuManager); + mRecyclerView.init(mUiConfig, activity::closeContextMenu); mSuggestion = new SnippetArticleViewHolder(mRecyclerView, mContextMenuManager, mUiDelegate, mUiConfig, /* offlinePageBridge = */ null);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java index 6cd37b3..fbf35d4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
@@ -29,6 +29,7 @@ import org.chromium.base.StrictModeContext; import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.Restriction; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeSwitches; @@ -176,6 +177,7 @@ @Test @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM_OR_STANDALONE) @MediumTest + @DisableIf.Build(sdk_is_greater_than = 27, message = "crbug.com/955516") public void test2dIntentExitsVrShell() { TestVrShellDelegate.getInstance().setAllow2dIntents(true); String url = testVrEntryIntentInternal();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextual_suggestions/GoogleSearchRestrictionTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextual_suggestions/GoogleSearchRestrictionTest.java index 667cbc5..a2fc9f7b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/contextual_suggestions/GoogleSearchRestrictionTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextual_suggestions/GoogleSearchRestrictionTest.java
@@ -358,6 +358,11 @@ public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange) {} @Override + public NavigationEntry getVisibleEntry() { + return null; + } + + @Override public NavigationEntry getPendingEntry() { return null; }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherFactoryTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherFactoryTest.java index 4c3aae3..3c115c1 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherFactoryTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherFactoryTest.java
@@ -39,24 +39,23 @@ public void testGetImageFetcher() { assertEquals(ImageFetcherConfig.NETWORK_ONLY, ImageFetcherFactory - .createImageFetcher(ImageFetcherConfig.NETWORK_ONLY, mImageFetcherBridge, - mReferencePool, InMemoryCachedImageFetcher.DEFAULT_CACHE_SIZE) + .createImageFetcher(ImageFetcherConfig.NETWORK_ONLY, mReferencePool, + mImageFetcherBridge) .getConfig()); assertEquals(ImageFetcherConfig.DISK_CACHE_ONLY, ImageFetcherFactory - .createImageFetcher(ImageFetcherConfig.DISK_CACHE_ONLY, mImageFetcherBridge, - mReferencePool, InMemoryCachedImageFetcher.DEFAULT_CACHE_SIZE) + .createImageFetcher(ImageFetcherConfig.DISK_CACHE_ONLY, mReferencePool, + mImageFetcherBridge) .getConfig()); assertEquals(ImageFetcherConfig.IN_MEMORY_ONLY, ImageFetcherFactory - .createImageFetcher(ImageFetcherConfig.IN_MEMORY_ONLY, mImageFetcherBridge, - mReferencePool, InMemoryCachedImageFetcher.DEFAULT_CACHE_SIZE) + .createImageFetcher(ImageFetcherConfig.IN_MEMORY_ONLY, mReferencePool, + mImageFetcherBridge) .getConfig()); assertEquals(ImageFetcherConfig.IN_MEMORY_WITH_DISK_CACHE, ImageFetcherFactory .createImageFetcher(ImageFetcherConfig.IN_MEMORY_WITH_DISK_CACHE, - mImageFetcherBridge, mReferencePool, - InMemoryCachedImageFetcher.DEFAULT_CACHE_SIZE) + mReferencePool, mImageFetcherBridge) .getConfig()); } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherTest.java index 0c1c454..60be0f4 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherTest.java
@@ -45,9 +45,6 @@ String url, String clientName, int width, int height, Callback<Bitmap> callback) {} @Override - public void clear() {} - - @Override public int getConfig() { return 0; }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java index 1894a26..ba64465 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java
@@ -29,7 +29,6 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.content_public.browser.NavigationController; import org.chromium.content_public.browser.NavigationEntry; -import org.chromium.content_public.browser.NavigationHistory; import org.chromium.content_public.browser.WebContents; /** Tests for SendTabToSelfAndroidBridge */ @@ -54,8 +53,6 @@ @Mock private NavigationController mNavigationController; @Mock - private NavigationHistory mNavigationHistory; - @Mock private NavigationEntry mNavigationEntry; private Profile mProfile; @@ -94,9 +91,7 @@ // Setup the mocked object chain to get to the url, title and timestamp. when(mTab.getWebContents()).thenReturn(mWebContents); when(mWebContents.getNavigationController()).thenReturn(mNavigationController); - when(mNavigationController.getNavigationHistory()).thenReturn(mNavigationHistory); - when(mNavigationHistory.getCurrentEntryIndex()).thenReturn(1); - when(mNavigationHistory.getEntryAtIndex(anyInt())).thenReturn(mNavigationEntry); + when(mNavigationController.getVisibleEntry()).thenReturn(mNavigationEntry); when(mNavigationEntry.getUrl()).thenReturn(URL); when(mNavigationEntry.getTitle()).thenReturn(TITLE); when(mNavigationEntry.getTimestamp()).thenReturn(TIMESTAMP);
diff --git a/chrome/android/touchless/java/res/layout/new_tab_page_touchless.xml b/chrome/android/touchless/java/res/layout/new_tab_page_touchless.xml index edf3bc2..fba9de4c 100644 --- a/chrome/android/touchless/java/res/layout/new_tab_page_touchless.xml +++ b/chrome/android/touchless/java/res/layout/new_tab_page_touchless.xml
@@ -7,6 +7,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/above_the_fold_bottom_margin" android:orientation="vertical" android:gravity="center">
diff --git a/chrome/android/touchless/java/res/values-v17/dimens.xml b/chrome/android/touchless/java/res/values-v17/dimens.xml index 65c00369..b737caa9 100644 --- a/chrome/android/touchless/java/res/values-v17/dimens.xml +++ b/chrome/android/touchless/java/res/values-v17/dimens.xml
@@ -29,4 +29,7 @@ <dimen name="most_likely_tile_focus_stroke_width">2dp</dimen> <dimen name="most_likely_tile_horizontal_spacer">6dp</dimen> <dimen name="most_likely_carousel_edge_spacer">8dp</dimen> + <!-- Desired 24dp, but the edge spacer is also in effect. 8 + 16 = 24 --> + <dimen name="above_the_fold_bottom_margin">16dp</dimen> + </resources>
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java index f0ebc57..6f7d558 100644 --- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java +++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java
@@ -6,6 +6,7 @@ import static org.chromium.chrome.browser.touchless.SiteSuggestionsCoordinator.CURRENT_INDEX_KEY; import static org.chromium.chrome.browser.touchless.SiteSuggestionsCoordinator.ITEM_COUNT_KEY; +import static org.chromium.chrome.browser.touchless.SiteSuggestionsCoordinator.REMOVAL_KEY; import static org.chromium.chrome.browser.touchless.SiteSuggestionsCoordinator.SUGGESTIONS_KEY; import android.support.annotation.IntDef; @@ -54,7 +55,7 @@ implements ContextMenuManager.Delegate, View.OnCreateContextMenuListener { private PropertyModel mSuggestion; - public SiteSuggestionInteractionDelegate(PropertyModel model) { + SiteSuggestionInteractionDelegate(PropertyModel model) { mSuggestion = model; } @@ -72,7 +73,12 @@ @Override public void removeItem() { - // TODO(chili): Show a toast with message. + // Remove the suggestion, which requests layout. + mModel.get(SUGGESTIONS_KEY).remove(mSuggestion); + // Notify about removal. + mModel.set(REMOVAL_KEY, mSuggestion.get(SiteSuggestionModel.URL_KEY)); + // Force-trigger rebind of current_index to update text. + onPropertyChanged(mModel, CURRENT_INDEX_KEY); } @Override @@ -82,8 +88,7 @@ @Override public boolean isItemSupported(int menuItemId) { - // TODO(chili): add context menu items. - return false; + return menuItemId == ContextMenuManager.ContextMenuItemId.REMOVE; } @Override @@ -167,14 +172,15 @@ tile.updateIcon(item.get(SiteSuggestionModel.ICON_KEY), item.get(SiteSuggestionModel.TITLE_KEY)); - tile.setOnClickListener((View v) - -> mNavDelegate.navigateToSuggestionUrl( - WindowOpenDisposition.CURRENT_TAB, - item.get(SiteSuggestionModel.URL_KEY))); - SiteSuggestionInteractionDelegate interactionDelegate = new SiteSuggestionInteractionDelegate(item); + + tile.setOnClickListener( + (View v) + -> interactionDelegate.openItem(WindowOpenDisposition.CURRENT_TAB)); + tile.setOnCreateContextMenuListener(interactionDelegate); + ContextMenuManager.registerViewForTouchlessContextMenu(tile, interactionDelegate); } } } @@ -204,9 +210,14 @@ // we would change from non-scrolling to infinite-scrolling. super.notifyItemRangeInserted(1, Integer.MAX_VALUE - 1); } else { - // Otherwise we are already infinite-scrolling, so just tell recyclerview - // that everything changed. - super.notifyItemRangeChanged(0, Integer.MAX_VALUE, null); + // Otherwise, rebind the visible spectrum. + // Account for edge conditions so we don't crash in the impossible case. + int start = mLayoutManager.findFirstVisibleItemPosition(); + int itemCount = mModel.get(ITEM_COUNT_KEY); + int newCount = Integer.MAX_VALUE - 1 - start >= (itemCount * 2) + ? itemCount * 2 + : Integer.MAX_VALUE - 1 - start; + super.notifyItemRangeChanged(start, newCount, null); } } @@ -217,41 +228,33 @@ // back to non-scrolling. Notify Recyclerview to remove everything. super.notifyItemRangeRemoved(1, Integer.MAX_VALUE - 1); } else { - // Otherwise we are already infinite-scrolling, so just tell recyclerview that - // everything has changed. - super.notifyItemRangeChanged(0, Integer.MAX_VALUE, null); + // Otherwise, rebind the visible spectrum. + // Account for edge conditions so we don't crash in the impossible case. + int start = mLayoutManager.findFirstVisibleItemPosition(); + int itemCount = mModel.get(ITEM_COUNT_KEY); + int newCount = Integer.MAX_VALUE - 1 - start >= (itemCount * 2) + ? itemCount * 2 + : Integer.MAX_VALUE - 1 - start; + super.notifyItemRangeChanged(start, newCount, null); } } @Override public void notifyItemRangeChanged(int index, int count, @Nullable PropertyKey payload) { - if (count > 1) { - // If more than 1 item was changed, then assume everything was changed. This should - // only happen if we are infinite-scrolling. - super.notifyItemRangeChanged(0, Integer.MAX_VALUE, payload); - } else if (mModel.get(SUGGESTIONS_KEY).size() == 0) { + if (mModel.get(SUGGESTIONS_KEY).size() == 0) { // If itemCount is 1, then notify super. // This should only happen if "All apps" icon has changed in some way and we aren't // infinite-scrolling. super.notifyItemRangeChanged(index, count, payload); } else { - // Otherwise, count = 1 and we have an infinite list. We will only notify that items - // near the currently visible area has changed. - // beginIndex at the layoutManager's firstVisibleItemPosition, with buffer. - int beginIndex = - mLayoutManager.findFirstVisibleItemPosition() - mModel.get(ITEM_COUNT_KEY); - // endIndex at the lastVisibleItemPosition, with buffer. - int endIndex = - mLayoutManager.findLastVisibleItemPosition() + mModel.get(ITEM_COUNT_KEY); - // Find elements between begin and end such that (i % itemCount) - 1 == index. - // Subtract 1 because itemRangeChanged is called from the listObserver which does not - // have "All apps". However, i is calculated from layoutManager, which includes "All - // apps" - for (int i = beginIndex; i < endIndex; i++) { - if (i % mModel.get(ITEM_COUNT_KEY) - 1 == index) { - super.notifyItemRangeChanged(i, 1, payload); - } - } + // Otherwise, rebind the visible spectrum. + // Account for edge conditions so we don't crash in the impossible case. + int start = mLayoutManager.findFirstVisibleItemPosition(); + int itemCount = mModel.get(ITEM_COUNT_KEY); + int newCount = Integer.MAX_VALUE - 1 - start >= (itemCount * 2) + ? itemCount * 2 + : Integer.MAX_VALUE - 1 - start; + super.notifyItemRangeChanged(start, newCount, payload); } } }
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsCoordinator.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsCoordinator.java index 3e2cb04..a828407 100644 --- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsCoordinator.java +++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsCoordinator.java
@@ -34,6 +34,8 @@ SUGGESTIONS_KEY = new PropertyModel.ReadableObjectPropertyKey<>(); static final PropertyModel.WritableIntPropertyKey ITEM_COUNT_KEY = new PropertyModel.WritableIntPropertyKey(); + static final PropertyModel.WritableObjectPropertyKey<String> REMOVAL_KEY = + new PropertyModel.WritableObjectPropertyKey<>(); private SiteSuggestionsMediator mMediator; @@ -41,7 +43,8 @@ SuggestionsNavigationDelegate navigationDelegate, ContextMenuManager contextMenuManager, ImageFetcher imageFetcher) { PropertyModel model = - new PropertyModel.Builder(CURRENT_INDEX_KEY, SUGGESTIONS_KEY, ITEM_COUNT_KEY) + new PropertyModel + .Builder(CURRENT_INDEX_KEY, SUGGESTIONS_KEY, ITEM_COUNT_KEY, REMOVAL_KEY) .with(SUGGESTIONS_KEY, new PropertyListModel<>()) .with(ITEM_COUNT_KEY, 1) .build();
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsMediator.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsMediator.java index 9371076..cf7cdd9 100644 --- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsMediator.java +++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsMediator.java
@@ -8,6 +8,7 @@ import android.graphics.BitmapFactory; import android.support.annotation.Nullable; +import org.chromium.base.ContextUtils; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.task.AsyncTask; import org.chromium.chrome.browser.explore_sites.ExploreSitesBridge; @@ -18,10 +19,13 @@ import org.chromium.chrome.browser.suggestions.MostVisitedSites; import org.chromium.chrome.browser.suggestions.SiteSuggestion; import org.chromium.chrome.browser.suggestions.SuggestionsDependencyFactory; -import org.chromium.ui.modelutil.ListObservable; +import org.chromium.chrome.touchless.R; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.PropertyObservable; +import org.chromium.ui.widget.Toast; +import java.util.HashSet; import java.util.List; /** @@ -29,14 +33,14 @@ * suggestions when needed. */ class SiteSuggestionsMediator - implements MostVisitedSites.Observer, ListObservable.ListObserver<PropertyKey> { + implements MostVisitedSites.Observer, PropertyObservable.PropertyObserver<PropertyKey> { private static final int NUM_FETCHED_SITES = 8; // The ML tiles could show anywhere between 2-5 tiles. To ensure that the initial index // would land on % n == 0 and be roughly Integer.MAX / 2, where n could be [2,5], // we divide by 240 (which is 5!) before multiplying by 120. // TODO(chili): Maybe better formula for if this needs to be more generic. private static final int INITIAL_SCROLLED_POSITION = Integer.MAX_VALUE / 240 * 120; - private static final int MAX_DISPLAYED_TILES = 4; + private static final int MAX_DISPLAYED_TILES = 5; private PropertyModel mModel; private ImageFetcher mImageFetcher; @@ -53,14 +57,22 @@ mMostVisitedSites = SuggestionsDependencyFactory.getInstance().createMostVisitedSites(mProfile); mMostVisitedSites.setObserver(this, NUM_FETCHED_SITES); - mModel.get(SiteSuggestionsCoordinator.SUGGESTIONS_KEY).addObserver(this); + mModel.addObserver(this); ExploreSitesBridge.getEspCatalog(mProfile, this::onGetEspCatalog); } @Override public void onSiteSuggestionsAvailable(List<SiteSuggestion> siteSuggestions) { + HashSet<String> urls = new HashSet<>(); + for (PropertyModel model : mModel.get(SiteSuggestionsCoordinator.SUGGESTIONS_KEY)) { + urls.add(model.get(SiteSuggestionModel.URL_KEY)); + } + // Map each SiteSuggestion into a PropertyModel representation and fetch the icon. for (SiteSuggestion suggestion : siteSuggestions) { + // Do not put duplicates. + if (urls.contains(suggestion.url)) continue; + PropertyModel siteSuggestion = SiteSuggestionModel.getSiteSuggestionModel(suggestion); mModel.get(SiteSuggestionsCoordinator.SUGGESTIONS_KEY).add(siteSuggestion); if (suggestion.whitelistIconPath.isEmpty()) { @@ -80,7 +92,7 @@ } } // Total item count is 1 more than number of site suggestions to account for "all apps". - mModel.set(SiteSuggestionsCoordinator.ITEM_COUNT_KEY, getItemCount() + 1); + mModel.set(SiteSuggestionsCoordinator.ITEM_COUNT_KEY, getItemCount()); // If we fetched site suggestions the first time, set initial scrolled position. // We don't want to set scrolled position if we've already set position before. @@ -101,37 +113,39 @@ } @Override - public void onItemRangeInserted(ListObservable source, int index, int count) {} + public void onPropertyChanged( + PropertyObservable<PropertyKey> source, @Nullable PropertyKey propertyKey) { + if (propertyKey == SiteSuggestionsCoordinator.REMOVAL_KEY) { + String removalUrl = mModel.get(SiteSuggestionsCoordinator.REMOVAL_KEY); + mMostVisitedSites.addBlacklistedUrl(removalUrl); - @Override - public void onItemRangeRemoved(ListObservable source, int index, int count) { - // When we remove an item, reset the item count key. - int itemCount = getItemCount(); - // Total item count is 1 more to account for "all apps". - mModel.set(SiteSuggestionsCoordinator.ITEM_COUNT_KEY, itemCount + 1); - // When removal of a site causes us to have fewer sites than we want to display, fetch - // again. - // TODO(chili): check if this causes us to have duplicates. - if (itemCount < MAX_DISPLAYED_TILES) { - mMostVisitedSites.setObserver(this, NUM_FETCHED_SITES); + Toast.makeText(ContextUtils.getApplicationContext(), R.string.most_visited_item_removed, + Toast.LENGTH_SHORT) + .show(); + + // When we remove an item, reset the item count key. + int itemCount = getItemCount(); + // Total item count is 1 more to account for "all apps". + mModel.set(SiteSuggestionsCoordinator.ITEM_COUNT_KEY, itemCount); + // When removal of a site causes us to have fewer sites than we want to display, fetch + // again. + if (itemCount < MAX_DISPLAYED_TILES) { + mMostVisitedSites.setObserver(this, NUM_FETCHED_SITES); + } } } - @Override - public void onItemRangeChanged(ListObservable<PropertyKey> source, int index, int count, - @Nullable PropertyKey payload) { - // Do nothing. - } - public void destroy() { mMostVisitedSites.destroy(); } private int getItemCount() { - // Item count is number of site suggestions available, up to MAX_DISPLAYED_TILES. - return mModel.get(SiteSuggestionsCoordinator.SUGGESTIONS_KEY).size() > MAX_DISPLAYED_TILES - ? MAX_DISPLAYED_TILES - : mModel.get(SiteSuggestionsCoordinator.SUGGESTIONS_KEY).size(); + // Item count is number of site suggestions available, up to MAX_DISPLAYED_TILES, + 1 for + // "All apps". + return (mModel.get(SiteSuggestionsCoordinator.SUGGESTIONS_KEY).size() > MAX_DISPLAYED_TILES + ? MAX_DISPLAYED_TILES + : mModel.get(SiteSuggestionsCoordinator.SUGGESTIONS_KEY).size()) + + 1; } private void makeIconRequest(PropertyModel suggestion) {
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessActionItemViewHolder.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessActionItemViewHolder.java index ed3a5c0..b422d48 100644 --- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessActionItemViewHolder.java +++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessActionItemViewHolder.java
@@ -38,6 +38,8 @@ mTextView.setText(itemView.getResources().getString(R.string.more_articles)); mImageView.setImageDrawable( ApiCompatibilityUtils.getDrawable(itemView.getResources(), R.drawable.ic_note_add)); + // Image view defaults to GONE. + mImageView.setVisibility(View.VISIBLE); } @Override
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java new file mode 100644 index 0000000..1e0790e --- /dev/null +++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java
@@ -0,0 +1,120 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.touchless; + +import android.content.Context; +import android.support.annotation.StringRes; +import android.view.View; +import android.view.View.OnClickListener; + +import org.chromium.chrome.browser.native_page.ContextMenuManager; +import org.chromium.chrome.browser.native_page.NativePageNavigationDelegate; +import org.chromium.chrome.browser.touchless.dialog.TouchlessDialogProperties; +import org.chromium.chrome.browser.touchless.dialog.TouchlessDialogProperties.DialogListItemProperties; +import org.chromium.ui.modaldialog.ModalDialogManager; +import org.chromium.ui.modaldialog.ModalDialogProperties; +import org.chromium.ui.modelutil.PropertyModel; + +import java.util.ArrayList; + +/** + * Handles context menu creation for native pages on touchless devices. Utilizes functionality in + * ContextMenuManager and Delegate to select items to show and lookup their labels. + */ +public class TouchlessContextMenuManager extends ContextMenuManager { + private PropertyModel mTouchlessMenuModel; + private ModalDialogManager mModalDialogManager; + + public TouchlessContextMenuManager(NativePageNavigationDelegate navigationDelegate, + TouchEnabledDelegate touchEnabledDelegate, Runnable closeContextMenuCallback, + String userActionPrefix) { + super(navigationDelegate, touchEnabledDelegate, closeContextMenuCallback, userActionPrefix); + } + + /** + * Creates PropertyModel for touchless context menu and displays it through modalDialogManager. + * + * @param modalDialogManager The ModalDialogManager to display context menu. + * @param context The Context used for loading resources (strings, drawables). + * @param delegate Delegate defines filter for displayed menu items and behavior for selects + * item. + */ + public void showTouchlessContextMenu( + ModalDialogManager modalDialogManager, Context context, Delegate delegate) { + ArrayList<PropertyModel> menuItems = new ArrayList(); + for (@ContextMenuItemId int itemId = 0; itemId < ContextMenuItemId.NUM_ENTRIES; itemId++) { + if (!shouldShowItem(itemId, delegate)) continue; + + // Each menu item is assigned its own instance of TouchlessItemClickListener where + // itemId of this item is maintained. + PropertyModel menuItem = buildMenuItem(context, getResourceIdForMenuItem(itemId), + new TouchlessItemClickListener(delegate, itemId)); + menuItems.add(menuItem); + } + if (menuItems.size() == 0) return; + + PropertyModel[] menuItemsArray = new PropertyModel[menuItems.size()]; + menuItemsArray = menuItems.toArray(menuItemsArray); + mTouchlessMenuModel = buildMenuModel(context, menuItemsArray); + mModalDialogManager = modalDialogManager; + mModalDialogManager.showDialog(mTouchlessMenuModel, ModalDialogManager.ModalDialogType.APP); + + notifyContextMenuShown(delegate); + } + + /** + * Builds PropertyModel for individual menu item. String for item's label is loaded from + * resources by PropertyModel.Builder. + */ + private PropertyModel buildMenuItem( + Context context, @StringRes int itemTextId, OnClickListener listener) { + return new PropertyModel.Builder(DialogListItemProperties.ALL_KEYS) + .with(DialogListItemProperties.TEXT, context.getResources(), itemTextId) + .with(DialogListItemProperties.CLICK_LISTENER, listener) + .build(); + } + + /** Builds PropertyModel for context menu from list of PropertyModels for individual items. */ + private PropertyModel buildMenuModel(Context context, PropertyModel[] menuItems) { + return new PropertyModel.Builder(TouchlessDialogProperties.ALL_DIALOG_KEYS) + .with(ModalDialogProperties.CONTROLLER, + new ModalDialogProperties.Controller() { + @Override + public void onClick(PropertyModel model, int buttonType) {} + + @Override + public void onDismiss(PropertyModel model, int dismissalCause) {} + }) + .with(TouchlessDialogProperties.ALT_NAME, "") + .with(TouchlessDialogProperties.SELECT_NAME, context.getResources(), + org.chromium.chrome.R.string.select) + .with(TouchlessDialogProperties.CANCEL_NAME, context.getResources(), + org.chromium.chrome.R.string.cancel) + .with(TouchlessDialogProperties.CANCEL_ACTION, (v) -> closeTouchlessContextMenu()) + .with(TouchlessDialogProperties.LIST_MODELS, menuItems) + .with(TouchlessDialogProperties.PRIORITY, TouchlessDialogProperties.Priority.HIGH) + .build(); + } + + private void closeTouchlessContextMenu() { + mModalDialogManager.dismissDialog(mTouchlessMenuModel, 0); + } + + private class TouchlessItemClickListener implements OnClickListener { + private final Delegate mDelegate; + private final @ContextMenuItemId int mItemId; + + public TouchlessItemClickListener(Delegate delegate, @ContextMenuItemId int itemId) { + mDelegate = delegate; + mItemId = itemId; + } + + @Override + public void onClick(View view) { + closeTouchlessContextMenu(); + handleMenuItemClick(mItemId, mDelegate); + } + } +}
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPage.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPage.java index a30cf13..5dc0dd2e 100644 --- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPage.java +++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPage.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.touchless; +import android.content.Context; import android.support.v4.view.ViewCompat; import android.view.LayoutInflater; import android.view.View; @@ -31,6 +32,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.widget.displaystyle.UiConfig; import org.chromium.chrome.touchless.R; +import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; /** @@ -44,6 +46,8 @@ public class TouchlessNewTabPage extends BasicNativePage { private static final String TAG = "TouchlessNewTabPage"; + private Context mContext; + private ModalDialogManager mModalDialogManager; private String mTitle; private int mBackgroundColor; @@ -54,7 +58,7 @@ private TouchlessNewTabPageTopLayout mRecyclerTopmostView; private SuggestionsRecyclerView mRecyclerView; private Tab mTab; - private ContextMenuManager mContextMenuManager; + private TouchlessContextMenuManager mContextMenuManager; private SiteSuggestionsCoordinator mSiteSuggestionsCoordinator; public TouchlessNewTabPage(ChromeActivity activity, NativePageHost host) { @@ -65,6 +69,8 @@ protected void initialize(ChromeActivity activity, NativePageHost nativePageHost) { TraceEvent.begin(TAG); + mContext = activity; + mModalDialogManager = activity.getModalDialogManager(); mTab = activity.getActivityTab(); Profile profile = mTab.getProfile(); @@ -121,13 +127,13 @@ // Don't store a direct reference to the activity, because it might change later if the tab // is reparented. Runnable closeContextMenuCallback = () -> mTab.getActivity().closeContextMenu(); - mContextMenuManager = new ContextMenuManager(suggestionsUiDelegate.getNavigationDelegate(), - mRecyclerView::setTouchEnabled, closeContextMenuCallback, - NewTabPage.CONTEXT_MENU_USER_ACTION_PREFIX); + mContextMenuManager = new TouchlessContextMenuManager( + suggestionsUiDelegate.getNavigationDelegate(), mRecyclerView::setTouchEnabled, + closeContextMenuCallback, NewTabPage.CONTEXT_MENU_USER_ACTION_PREFIX); mTab.getWindowAndroid().addContextMenuCloseListener(mContextMenuManager); UiConfig uiConfig = new UiConfig(mRecyclerView); - mRecyclerView.init(uiConfig, mContextMenuManager); + mRecyclerView.init(uiConfig, closeContextMenuCallback); // Infinite scrolling view for site suggestions. mSiteSuggestionsCoordinator = new SiteSuggestionsCoordinator(mRecyclerTopmostView, profile, @@ -181,4 +187,13 @@ super.destroy(); } + + public void showContextMenu() { + View focusedView = getView().findFocus(); + if (focusedView == null) return; + ContextMenuManager.Delegate delegate = + ContextMenuManager.getDelegateFromFocusedView(focusedView); + if (delegate == null) return; + mContextMenuManager.showTouchlessContextMenu(mModalDialogManager, mContext, delegate); + } }
diff --git a/chrome/android/touchless/touchless_java_sources.gni b/chrome/android/touchless/touchless_java_sources.gni index c952aa7..7fe3770 100644 --- a/chrome/android/touchless/touchless_java_sources.gni +++ b/chrome/android/touchless/touchless_java_sources.gni
@@ -21,6 +21,7 @@ "touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsTileView.java", "touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsViewHolderFactory.java", "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessActionItemViewHolder.java", + "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java", "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessDelegate.java", "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPage.java", "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageAdapter.java",
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb index c6135976..d08cc33 100644 --- a/chrome/app/resources/chromium_strings_ta.xtb +++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -30,6 +30,7 @@ <translation id="1929939181775079593">Chromium பதிலளிக்கவில்லை. இப்போது மீண்டும் தொடங்கவா?</translation> <translation id="1966382378801805537">இயல்புநிலை உலாவியைக் கண்டறியவோ அமைக்கவோ Chromium ஆல் முடியவில்லை</translation> <translation id="2008474315282236005">வெளியேறினால், இந்தச் சாதனத்திலிருந்து ஓர் உருப்படி நீக்கப்படும். பின்னர் தரவை மீட்டமைக்க, Chromium இல் <ph name="USER_EMAIL" /> எனும் முகவரியின் மூலம் உள்நுழையவும்.</translation> +<translation id="2037988709973327241"><ph name="FILE_NAME" /> எனும் கோப்பு ஆபத்தானது என்பதால் அதை Chromium தடுத்துள்ளது. மேம்பட்ட பாதுகாப்பின் மூலம் பாதுகாக்கப்பட்டுள்ளீர்கள்.</translation> <translation id="2117378023188580026">இந்தப் புதுப்பிப்பைப் பயன்படுத்த, Chromiumஐ மீண்டும் தொடங்கும்படி உங்கள் நிர்வாகி பரிந்துரைக்கிறார்</translation> <translation id="2119636228670142020">&Chromium OS அறிமுகம்</translation> <translation id="2178765360243863853">இப்போது Chromiumமை மீண்டும் தொடங்க வேண்டும்</translation> @@ -61,6 +62,7 @@ <translation id="3068515742935458733">சிதைவு அறிக்கைகளையும் <ph name="UMA_LINK" /> உம் Google க்கு அனுப்புவதன் மூலம் Chromium ஐ மேலும் சிறப்பானதாக்க உதவவும்</translation> <translation id="3103660991484857065">காப்பகத்தைச் சுருக்குவதில் நிறுவி தோல்வியடைந்தது. Chromium ஐ மீண்டும் பதிவிறக்குக.</translation> <translation id="3130323860337406239">Chromium உங்கள் மைக்ரோஃபோனைப் பயன்படுத்துகிறது.</translation> +<translation id="3154325651427862069"><ph name="FILE_NAME" /> எனும் கோப்பு ஆபத்தானது என்பதால் Chromium அதைத் தடுத்துள்ளது. மேம்பட்ட பாதுகாப்பின் மூலம் பாதுகாக்கப்பட்டுள்ளீர்கள்.</translation> <translation id="3155163173539279776">Chromium ஐ மீண்டும் தொடங்கு</translation> <translation id="3179665906251668410">Chromium மறை&நிலை சாளரத்தில் இணைப்பைத் திற</translation> <translation id="3190315855212034486">ஓ! Chromium செயலிழந்தது. இப்போது மீண்டும் தொடங்கவா?</translation> @@ -88,6 +90,7 @@ <translation id="388648406173476553">Chromiumமைத் தேவைக்கேற்ப மாற்றி கட்டுப்படுத்தும். சிலவற்றை நீங்கள் கவனிக்க வேண்டும் - விவரங்களுக்கு, கிளிக் செய்யவும்.</translation> <translation id="3889543394854987837">Chromium ஐத் திறந்து, உலாவலைத் தொடங்க உங்கள் பெயரைக் கிளிக் செய்யவும்.</translation> <translation id="3898493977366060150">Google ஸ்மார்ட்ஸ் மூலம் இணையத்தில் உலாவுதல்</translation> +<translation id="3931244652999881512">இந்தக் கோப்பு ஆபத்தானது என்பதால் அதை Chromium தடுத்துள்ளது. மேம்பட்ட பாதுகாப்பின் மூலம் பாதுகாக்கப்பட்டுள்ளீர்கள்.</translation> <translation id="3965668104013180445">{0,plural, =1{1 மணிநேரத்தில் Chromium OS மீண்டும் தொடங்கும்}other{# மணிநேரத்தில் Chromium OS மீண்டும் தொடங்கும்}}</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />தற்போதைய அமைப்புகளைப்<ph name="END_LINK" /> பற்றிய அறிக்கையை அனுப்பி, Chromiumஐ இன்னும் சிறந்ததாக்க உதவவும்</translation> <translation id="4050175100176540509">முக்கியப் பாதுகாப்பு மேம்பாடுகளும், புதிய அம்சங்களும் சமீபத்திய பதிப்பில் கிடைக்கின்றன.</translation> @@ -138,6 +141,7 @@ <translation id="5680901439334282664">Chromium இல் உள்நுழைக</translation> <translation id="5698481217667032250">Chromiumஐ இந்த மொழியில் காட்டு</translation> <translation id="5712253116097046984">இந்தப் புதுப்பிப்பைப் பயன்படுத்த, Chromium OSஸை மீண்டும் தொடங்குமாறு உங்கள் நிர்வாகி கோருகிறார்</translation> +<translation id="5726979195371243087">இந்தக் கோப்பு ஆபத்தானதாக இருக்கக்கூடும் என்பதால் அதை Chromium தடுத்துள்ளது. மேம்பட்ட பாதுகாப்பின் மூலம் பாதுகாக்கப்பட்டுள்ளீர்கள்.</translation> <translation id="5756484659843248772">Chromium OS UIயைக் காட்ட இந்த மொழி பயன்படுத்தப்படும்</translation> <translation id="5768914737813585044">Chromium OSஐ இந்த மொழியில் காட்டு</translation> <translation id="5796460469508169315">Chromium கிட்டத்தட்ட தயாராகிவிட்டது.</translation> @@ -252,6 +256,7 @@ <translation id="8667808506758191620">உங்கள் <ph name="DEVICE_TYPE" /> புதுப்பித்த நிலையில் உள்ளது.</translation> <translation id="8697124171261953979">Chromiumமைத் தொடங்கும்போது அல்லது சர்வபுலத்திலிருந்து தேடலை மேற்கொள்ளும்போது காண்பிக்கப்படும் பக்கத்தையும் இது கட்டுப்படுத்துகிறது.</translation> <translation id="8704119203788522458">இது உங்கள் Chromium ஆகும்</translation> +<translation id="8704255848199359374">இது Google தேடலில் பயன்படுத்தப்படும் அதே எழுத்துப் பிழை சரிபார்ப்பானைப் பயன்படுத்துகிறது. உலாவியில் நீங்கள் உள்ளிடும் உரை Googleளுக்கு அனுப்பப்படும். இதை அமைப்புகளில் எப்போது வேண்டுமானாலும் மாற்றலாம்.</translation> <translation id="8796602469536043152">இந்தத் தளத்திற்காகக் கேமராவையும் மைக்ரோஃபோனையும் அணுக, Chromiumக்கு அனுமதி தேவை</translation> <translation id="8803635938069941624">Chromium OS விதிமுறைகள்</translation> <translation id="8821041990367117597">உங்கள் கணக்கின் உள்நுழைவு விவரங்கள் காலாவதியாகிவிட்டதால், உங்கள் தரவை Chromium ஆல் ஒத்திசைக்க முடியவில்லை.</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index eaee95c..a45ba7e 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -3060,7 +3060,7 @@ <translation id="5858490737742085133">Terminal</translation> <translation id="585979798156957858">مفتاح Meta الخارجي</translation> <translation id="5860033963881614850">غير مفعّل</translation> -<translation id="5860491529813859533">تشغيل</translation> +<translation id="5860491529813859533">تفعيل</translation> <translation id="5860494867054883682">جارٍ تحديث جهازك إلى قناة <ph name="CHANNEL_NAME" /> (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="5862109781435984885">عرض أدوات قلم الشاشة في الرف</translation> <translation id="5863445608433396414">تفعيل ميزات تصحيح الأخطاء</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 0803056..d255d176 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -2168,6 +2168,7 @@ <translation id="438503109373656455">Brauner</translation> <translation id="4387004326333427325">Remote-Ablehnung des Authentifizierungszertifikats</translation> <translation id="4389091756366370506">Nutzer <ph name="VALUE" /></translation> +<translation id="4390000551125140321">{0,plural, =1{Inkognito}other{# Anzahl offener Inkognitofenster}}</translation> <translation id="439266289085815679">Die Bluetooth-Konfiguration wird von <ph name="USER_EMAIL" /> festgelegt.</translation> <translation id="4394049700291259645">Deaktivieren</translation> <translation id="4400367121200150367">Hier werden Websites angezeigt, für die keine Passwörter gespeichert werden</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 478af44..622fb3a 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -2582,7 +2582,7 @@ <translation id="5111646998522066203">गुप्त मोड से बाहर निकलें</translation> <translation id="5111692334209731439">&बुकमार्क प्रबंधक</translation> <translation id="5112577000029535889">&डेवलपर टूल</translation> -<translation id="5113739826273394829">अगर आप इस आइकॉन पर क्लिक करते हैं, तो आप इस <ph name="DEVICE_TYPE" /> को मैन्युअल रूप से लॉक कर लेंगे. अगली बार, अनलॉक करने के लिए आपको अपना पासवर्ड डालना होगा.</translation> +<translation id="5113739826273394829">अगर आप इस आइकॉन पर क्लिक करते हैं तो, आप इस <ph name="DEVICE_TYPE" /> को मैन्युअल रूप से लॉक कर लेंगे. अगली बार, अनलॉक करने के लिए आपको अपना पासवर्ड डालना होगा.</translation> <translation id="51143538739122961">अपनी सुरक्षा कुंजी लगाएं और उसे छुएं</translation> <translation id="5115309401544567011">कृपया अपने <ph name="DEVICE_TYPE" /> को पावर स्रोत में प्लग करें.</translation> <translation id="5115338116365931134">एसएसओ (SSO)</translation> @@ -2603,7 +2603,7 @@ <translation id="5138227688689900538">कम दिखाएं</translation> <translation id="5139955368427980650">&खोलें</translation> <translation id="5142961317498132443">पहचान करना</translation> -<translation id="5143374789336132547">एक्सटेंशन <ph name="EXTENSION_NAME" /> ने यह बदल दिया है कि जब आप होम बटन क्लिक करते हैं तब कौन सा पेज दिखाया जाए.</translation> +<translation id="5143374789336132547">एक्सटेंशन "<ph name="EXTENSION_NAME" />" ने यह बदल दिया है कि जब आप होम बटन क्लिक करते हैं तब कौनसा पेज दिखाया जाए.</translation> <translation id="5143712164865402236">पूर्ण स्क्रीन में प्रवेश करें</translation> <translation id="514575469079499857">जगह तय करने के लिए अपने आईपी पते का इस्तेमाल करें (डिफ़ॉल्ट)</translation> <translation id="5150254825601720210">Netscape प्रमाणपत्र SSL सर्वर नाम</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index bbc94b6..52971856 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -31,7 +31,7 @@ <translation id="1036982837258183574">Tekan |<ph name="ACCELERATOR" />| untuk keluar dari mode layar penuh</translation> <translation id="1038168778161626396">Khusus Penyandi</translation> <translation id="1039337018183941703">File tidak valid atau rusak</translation> -<translation id="1041175011127912238">This page isn't responding</translation> +<translation id="1041175011127912238">Halaman ini tidak merespons</translation> <translation id="1042174272890264476">Komputer Anda juga dilengkapi dengan perpustakaan RLZ <ph name="SHORT_PRODUCT_NAME" /> yang tertanam di dalamnya. RLZ menetapkan tag tak unik dan tidak dapat diidentifikasi secara pribadi untuk mengukur penelusuran dan penggunaan <ph name="SHORT_PRODUCT_NAME" /> yang didorong oleh kampanye promosi tertentu. Biasanya label ini muncul di kueri Google Penelusuran di <ph name="PRODUCT_NAME" />.</translation> <translation id="1046059554679513793">Ups, nama ini sudah digunakan!</translation> <translation id="1046635659603195359">Sepertinya Anda sudah menyiapkan Voice Match dengan Asisten Google di perangkat lainnya. Rekaman sebelumnya tersebut dapat digunakan untuk membuat model suara di perangkat ini. Tindakan ini perlu waktu kurang dari satu menit.</translation> @@ -150,7 +150,7 @@ <translation id="1211364473545090084">Gunakan web tanpa menyimpan histori browsing dengan jendela samaran</translation> <translation id="1213037489357051291"><ph name="NUM_FINGERPRINTS" /> sidik jari disiapkan</translation> <translation id="1215411991991485844">Apl latar belakang yang baru telah ditambahkan</translation> -<translation id="1217483152325416304">Your local data will soon be deleted</translation> +<translation id="1217483152325416304">Data lokal Anda akan segera dihapus</translation> <translation id="1217668622537098248">Kembali ke klik kiri setelah tindakan</translation> <translation id="121783623783282548">Sandi tidak cocok.</translation> <translation id="1218839827383191197"><ph name="BEGIN_PARAGRAPH1" />Layanan lokasi Google menggunakan sumber seperti Wi‑Fi, jaringan seluler, dan sensor untuk membantu memperkirakan lokasi perangkat ini.<ph name="END_PARAGRAPH1" /> @@ -311,7 +311,7 @@ <translation id="1478340334823509079">Detail: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">Penginstalan tidak diaktifkan</translation> <translation id="1483493594462132177">Kirim</translation> -<translation id="1484979925941077974">Situs sedang menggunakan bluetooth</translation> +<translation id="1484979925941077974">Situs menggunakan Bluetooth</translation> <translation id="1485015260175968628">Sekarang aplikasi/ekstensi dapat:</translation> <translation id="1485141095922496924">Versi <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation> <translation id="1486096554574027028">Telusuri sandi</translation> @@ -462,7 +462,7 @@ <translation id="1708338024780164500">(Tidak aktif)</translation> <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation> <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Asli)</translation> -<translation id="1711401317189798723">Backup currently in progress for <ph name="CONTAINER_ID" /></translation> +<translation id="1711401317189798723">Backup sedang berlangsung untuk <ph name="CONTAINER_ID" /></translation> <translation id="1712349894969001173">Dapatkan sandi ini di iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> ingin menyimpan data di komputer lokal Anda secara permanen</translation> <translation id="1718835860248848330">1 jam terakhir</translation> @@ -612,7 +612,7 @@ <translation id="1932026958134051332">Opsi tombol akses</translation> <translation id="1932098463447129402">Tidak Sebelum</translation> <translation id="1933809209549026293">Sambungkan mouse atau keyboard. Jika Anda menggunakan perangkat Bluetooth, pastikan perangkat siap disandingkan.</translation> -<translation id="1937774647013465102">Tidak dapat mengimpor jenis arsitektur container <ph name="ARCHITECTURE_CONTAINER" /> dengan perangkat ini yaitu <ph name="ARCHITECTURE_DEVICE" />. Anda dapat mencoba memulihkan container ini ke dalam perangkat yang berbeda, atau Anda dapat mengakses file di dalam gambar container ini dengan membuka di aplikasi File.</translation> +<translation id="1937774647013465102">Tidak dapat mengimpor jenis arsitektur container <ph name="ARCHITECTURE_CONTAINER" /> dengan perangkat ini yang menggunakan arsitektur <ph name="ARCHITECTURE_DEVICE" />. Anda dapat mencoba memulihkan container ini ke dalam perangkat berbeda, atau mengakses file di dalam gambar container ini dengan membukanya di aplikasi File.</translation> <translation id="1938351510777341717">External Command</translation> <translation id="1940546824932169984">Perangkat yang terhubung</translation> <translation id="1944921356641260203">Pembaruan ditemukan</translation> @@ -901,7 +901,7 @@ <translation id="2408955596600435184">Masukkan PIN</translation> <translation id="241082044617551207">Plugin tidak dikenal</translation> <translation id="2413749388954403953">Mengubah antarmuka pengguna bookmark</translation> -<translation id="241639282915300771">Pemulihan saat ini sedang berlangsung untuk <ph name="CONTAINER_ID" /></translation> +<translation id="241639282915300771">Pemulihan <ph name="CONTAINER_ID" /> sedang berlangsung</translation> <translation id="241727068219398187">Data dienkripsi dengan sandi Google Anda mulai tanggal <ph name="TIME" />. Data ini tidak mencakup alamat dan metode pembayaran dari Google Pay.</translation> <translation id="2419706071571366386">Untuk keamanan, logout jika komputer tidak digunakan.</translation> @@ -994,7 +994,7 @@ <translation id="2538361623464451692">Sinkronisasi dinonaktifkan</translation> <translation id="2540449034743108469">Tekan "Mulai" untuk mendengarkan aktivitas ekstensi</translation> <translation id="2541002089857695151">Optimalkan transmisi layar penuh?</translation> -<translation id="2541706104884128042">Setel waktu tidur baru</translation> +<translation id="2541706104884128042">Waktu tidur baru disetel</translation> <translation id="2544853746127077729">Sertifikat autentikasi ditolak oleh jaringan</translation> <translation id="2549985041256363841">Mulai merekam</translation> <translation id="2550212893339833758">Memori yang ditukar</translation> @@ -1120,7 +1120,7 @@ <translation id="2731392572903530958">Buka K&embali Jendela yang Tertutup</translation> <translation id="2731700343119398978">Harap tunggu...</translation> <translation id="2731710757838467317">Membuat akun Anda yang diawasi. Proses ini membutuhkan beberapa saat.</translation> -<translation id="2731971182069536520">The next time you restart your device, your administrator will perform a one-time update that will delete your local data.</translation> +<translation id="2731971182069536520">Saat berikutnya Anda memulai ulang perangkat, administrator Anda akan menjalankan update satu kali yang akan menghapus data lokal Anda.</translation> <translation id="2734760316755174687">Situs pada <ph name="SITE_GROUP_NAME" /> juga akan disetel ulang.</translation> <translation id="2735438478659026460">Klik secara otomatis saat kursor berhenti</translation> <translation id="2735712963799620190">Jadwal</translation> @@ -1324,7 +1324,7 @@ <translation id="304747341537320566">Mesin Ucapan</translation> <translation id="3047644958362961983">Informasi ini membantu kami memahami masalah Asisten dengan lebih baik. Informasi tersebut disimpan selama 90 hari dan hanya dapat diakses oleh tim teknis dan masukan yang terkait.</translation> <translation id="3053013834507634016">Penggunaan Kunci Sertifikat</translation> -<translation id="3053273573829329829">Enable user pin</translation> +<translation id="3053273573829329829">Aktifkan PIN pengguna</translation> <translation id="3058498974290601450">Anda dapat mengaktifkan sinkronisasi kapan saja di setelan</translation> <translation id="3060379269883947824">Aktifkan fitur klik untuk diucapkan</translation> <translation id="3061707000357573562">Layanan Patch</translation> @@ -1344,7 +1344,7 @@ <translation id="3084771660770137092">Chrome kehabisan memori atau proses untuk halaman web dihentikan karena beberapa alasan lain. Untuk melanjutkan, muat ulang atau buka halaman lain.</translation> <translation id="3085412380278336437">Situs dapat menggunakan kamera Anda</translation> <translation id="3085752524577180175">Host SOCKS</translation> -<translation id="3088052000289932193">Site is using MIDI</translation> +<translation id="3088052000289932193">Situs menggunakan MIDI</translation> <translation id="3088325635286126843">&Ubah nama...</translation> <translation id="3089137131053189723">Penelusuran dihapus</translation> <translation id="3090193911106258841">Mengakses masukan audio dan video</translation> @@ -1857,7 +1857,7 @@ <translation id="3869917919960562512">Indeks salah.</translation> <translation id="3870931306085184145">Tidak ada sandi yang tersimpan untuk <ph name="DOMAIN" /></translation> <translation id="3871092408932389764">Terendah</translation> -<translation id="3871350334636688135">After 24 hours, your administrator will perform a one-time update that will delete your local data when you restart your device. Save any local data you need to cloud storage within 24 hours.</translation> +<translation id="3871350334636688135">Setelah 24 jam, administrator akan menjalankan update satu kali yang akan menghapus data lokal Anda saat Anda memulai ulang perangkat. Simpan semua data lokal yang Anda perlukan ke penyimpanan cloud dalam waktu 24 jam.</translation> <translation id="3872220884670338524">Tindakan lainnya, akun yang disimpan untuk <ph name="USERNAME" /> di <ph name="DOMAIN" /></translation> <translation id="3872991219937722530">Kosongkan ruang disk atau perangkat akan lambat merespons.</translation> <translation id="3873315167136380065">Untuk mengaktifkannya, <ph name="BEGIN_LINK" />setel ulang sinkronisasi<ph name="END_LINK" /> untuk menghapus frasa sandi sinkronisasi</translation> @@ -1937,7 +1937,7 @@ <translation id="3983400541576569538">Data dari beberapa aplikasi mungkin akan hilang</translation> <translation id="3983586614702900908">perangkat dari vendor tak dikenal</translation> <translation id="3984159763196946143">Tidak dapat memulai mode demo</translation> -<translation id="3984431586879874039">Allow this site to see your security key?</translation> +<translation id="3984431586879874039">Izinkan situs ini melihat kunci keamanan Anda?</translation> <translation id="3987348946546879621">Lebih hemat kuota</translation> <translation id="3987938432087324095">Maaf, kurang jelas.</translation> <translation id="3988996860813292272">Pilih zona waktu</translation> @@ -2652,8 +2652,8 @@ <translation id="5187295959347858724">Sekarang Anda masuk pada <ph name="SHORT_PRODUCT_NAME" />. Bookmark, histori, dan setelan lainnya sedang disinkronkan ke Akun Google Anda.</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> ingin mendownload beberapa file</translation> -<translation id="5192316339598592690">Switch accounts quickly and sign in to apps and websites all at once. - Aplikasi dan situs dapat meminta izin Anda untuk menggunakan beberapa info Akun Google Anda. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> +<translation id="5192316339598592690">Lakukan peralihan akun dengan cepat dan login ke aplikasi dan situs sekaligus. + Aplikasi dan situs dapat meminta izin Anda untuk menggunakan sebagian info Akun Google Anda. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="5204673965307125349">Harap powerwash perangkat, lalu coba lagi.</translation> <translation id="5204967432542742771">Masukkan sandi</translation> <translation id="5206215183583316675">Hapus "<ph name="CERTIFICATE_NAME" />"?</translation> @@ -3538,7 +3538,7 @@ <translation id="6547354035488017500">Kosongkan ruang penyimpanan minimal 512 MB atau perangkat tidak akan merespons. Untuk mengosongkan ruang penyimpanan, hapus file dari penyimpanan perangkat.</translation> <translation id="6550675742724504774">Opsi</translation> <translation id="6551508934388063976">Perintah tidak tersedia. Tekan Control-N untuk membuka jendela baru.</translation> -<translation id="6551612971599078809">Site is using USB</translation> +<translation id="6551612971599078809">Situs menggunakan USB</translation> <translation id="655384502888039633"><ph name="USER_COUNT" /> pengguna</translation> <translation id="655483977608336153">Coba lagi</translation> <translation id="6555432686520421228">Hapus semua akun pengguna dan setel ulang perangkat <ph name="IDS_SHORT_PRODUCT_NAME" /> Anda agar menjadi seperti baru.</translation> @@ -3763,7 +3763,7 @@ <translation id="692114467174262153"><ph name="ALTERNATIVE_BROWSER_NAME" /> tidak dapat dibuka</translation> <translation id="6921709132208495314">Berhenti menggunakan data di halaman ini</translation> <translation id="6922128026973287222">Hemat data dan jelajahi dengan lebih cepat menggunakan Penghemat Kuota Internet Google. Klik untuk mempelajari lebih lanjut.</translation> -<translation id="6922745772873733498">Enter a pin to print</translation> +<translation id="6922745772873733498">Masukkan PIN untuk mencetak</translation> <translation id="6923132443355966645">Scroll / Klik</translation> <translation id="6923633482430812883">Terjadi error saat memasang URL berbagi. Harap periksa bahwa server file yang Anda sambungkan mendukung SMBv2 atau yang lebih baru.</translation> <translation id="6930036377490597025">Kunci keamanan eksternal atau sensor dalam perangkat</translation> @@ -3818,7 +3818,7 @@ <translation id="7003339318920871147">Basis data web</translation> <translation id="7003723821785740825">Menyiapkan cara tercepat untuk membuka kunci perangkat</translation> <translation id="7003844668372540529">Produk <ph name="PRODUCT_ID" /> tak dikenal dari <ph name="VENDOR_NAME" /></translation> -<translation id="7004402701596653846">Site can use MIDI</translation> +<translation id="7004402701596653846">Situs dapat menggunakan MIDI</translation> <translation id="7004499039102548441">Tab Baru-baru Ini</translation> <translation id="7005848115657603926">Rentang halaman tidak valid, gunakan <ph name="EXAMPLE_PAGE_RANGE" /></translation> <translation id="7006634003215061422">Batas bawah</translation> @@ -3860,7 +3860,7 @@ <translation id="706626672220389329">Error saat memasang URL berbagi. URL berbagi yang ditentukan sudah dipasang.</translation> <translation id="7066944511817949584">Gagal tersambung ke "<ph name="DEVICE_NAME" />".</translation> <translation id="7067725467529581407">Jangan tampilkan ini lagi.</translation> -<translation id="7069811530847688087"><ph name="WEBSITE" /> may require a newer or different kind of security key</translation> +<translation id="7069811530847688087"><ph name="WEBSITE" /> mungkin memerlukan jenis kunci keamanan yang lebih baru atau berbeda</translation> <translation id="7070484045139057854">Ekstensi Ini Dapat Membaca dan Mengubah Data Situs</translation> <translation id="7072010813301522126">Nama pintasan</translation> <translation id="707392107419594760">Pilih keyboard Anda:</translation> @@ -4364,7 +4364,7 @@ <ph name="BR" /> <ph name="BEGIN_BOLD" />Catatan:<ph name="END_BOLD" /> Sistem akan reboot selama proses berlangsung.</translation> <translation id="7829298379596169484">Mengakses masukan audio</translation> -<translation id="7830594666202422257">Sambungkan ke Linux</translation> +<translation id="7830594666202422257">Sambungkan ke Linux</translation> <translation id="7831491651892296503">Terjadi error saat mengonfigurasi jaringan</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Waktu berakhir</translation> @@ -4394,7 +4394,7 @@ <translation id="7877451762676714207">Kesalahan server tidak diketahui. Coba lagi, atau hubungi administrator server.</translation> <translation id="7877680364634660272">Tur</translation> <translation id="7878562273885520351">Sandi Anda mungkin disusupi</translation> -<translation id="7880823633812189969">Local data will be deleted when you restart</translation> +<translation id="7880823633812189969">Data lokal akan dihapus saat Anda memulai ulang</translation> <translation id="7881483672146086348">Lihat Akun</translation> <translation id="7882358943899516840">Jenis penyedia</translation> <translation id="7885253890047913815">Tujuan Saat Ini</translation> @@ -4733,7 +4733,7 @@ <translation id="8426713856918551002">Mengaktifkan</translation> <translation id="8427292751741042100">disematkan di host mana saja</translation> <translation id="8428213095426709021">Setelan</translation> -<translation id="8428628598981198790">Your security key can't be used with this site</translation> +<translation id="8428628598981198790">Kunci keamanan Anda tidak dapat digunakan dengan situs ini</translation> <translation id="84297032718407999">Anda akan logout dalam <ph name="LOGOUT_TIME_LEFT" /></translation> <translation id="8431190899827883166">Show taps</translation> <translation id="8431909052837336408">Ubah PIN SIM</translation> @@ -4938,7 +4938,7 @@ <translation id="8732212173949624846">Membaca dan mengubah histori penjelajahan Anda di semua perangkat tempat Anda masuk</translation> <translation id="8732844209475700754">Setelan lain yang berkaitan dengan privasi, keamanan, dan pengumpulan data</translation> <translation id="8734073480934656039">Dengan mengaktifkan setelan ini, Anda memungkinkan aplikasi kios diluncurkan secara otomatis saat memulai.</translation> -<translation id="8734671092194994316">This will leave a record of your visit to <ph name="WEBSITE" /> on your security key.</translation> +<translation id="8734671092194994316">Tindakan ini akan meninggalkan data kunjungan Anda ke <ph name="WEBSITE" /> pada kunci keamanan.</translation> <translation id="873545264931343897">Setelah <ph name="PLUGIN_NAME" /> selesai diperbarui, muat ulang halaman untuk mengaktifkannya</translation> <translation id="8736288397686080465">Situs ini diperbarui di latar belakang.</translation> <translation id="8737685506611670901">Membuka link <ph name="PROTOCOL" /> sebagai ganti <ph name="REPLACED_HANDLER_TITLE" /></translation> @@ -5037,7 +5037,7 @@ <translation id="8877448029301136595">[direktori induk]</translation> <translation id="8879284080359814990">Tampilkan &Sebagai Tab</translation> <translation id="8883847527783433352">Sinkronkan ke Akun Lain</translation> -<translation id="8884570509232205463">Perangkat Anda sekarang terkunci pada <ph name="UNLOCK_TIME" /></translation> +<translation id="8884570509232205463">Sekarang perangkat akan terkunci pukul <ph name="UNLOCK_TIME" />.</translation> <translation id="8885197664446363138">Smart Lock tidak tersedia</translation> <translation id="8888253246822647887">Aplikasi Anda akan terbuka setelah proses upgrade selesai. Proses upgrade dapat memerlukan waktu beberapa menit.</translation> <translation id="8888432776533519951">Warna:</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index a947ca5f..f8b74dc 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -3244,7 +3244,7 @@ <translation id="6122095009389448667">המשך חסימת הגישה של האתר הזה ללוח</translation> <translation id="6122875415561139701">פעולת כתיבה אסורה במכשיר: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">התוספים הבאים תלויים בתוסף הזה:</translation> -<translation id="6124698108608891449">האתר הזה צריך עוד הרשאות.</translation> +<translation id="6124698108608891449">האתר הזה צריך הרשאות נוספות.</translation> <translation id="6125479973208104919">תצטרך להוסיף את החשבון שלך ב-<ph name="DEVICE_TYPE" /> פעם נוספת.</translation> <translation id="6129691635767514872">הנתונים שבחרת הוסרו מ-Chrome ומהמכשירים המסונכרנים. ייתכן שבכתובת <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> עדיין יתאפשר לך לגשת לסוגים אחרים של היסטוריית גלישה בחשבון Google, כמו חיפושים ופעילות משירותים אחרים של Google.</translation> <translation id="6129938384427316298">הערה לאישור Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index cb533af..e999cf9 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -8,6 +8,7 @@ <translation id="1007408791287232274">Nepavyko kelti įrenginių.</translation> <translation id="1008186147501209563">Žymių eksportavimas</translation> <translation id="1008557486741366299">Ne dabar</translation> +<translation id="1010498023906173788">Šis skirtukas prijungtas prie nuosekliojo prievado.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Puslapis nereaguoja}one{Puslapiai nereaguoja}few{Puslapiai nereaguoja}many{Puslapiai nereaguoja}other{Puslapiai nereaguoja}}</translation> <translation id="1012794136286421601">Dokumentų, Skaičiuoklių, Skaidrių ir Piešinių failai sinchronizuojami. Atidarykite „Google“ disko programą, kad juos pasiektumėte prisijungę arba neprisijungę.</translation> <translation id="1012876632442809908">USB-C įrenginys (prievadas priekyje)</translation> @@ -30,6 +31,7 @@ <translation id="1036982837258183574">Paspauskite |<ph name="ACCELERATOR" />|, kad išeitumėte iš viso ekrano režimo</translation> <translation id="1038168778161626396">Tik šifruoti</translation> <translation id="1039337018183941703">Netinkamas arba sugadintas failas</translation> +<translation id="1041175011127912238">Šis puslapis neatsako</translation> <translation id="1042174272890264476">Jūsų kompiuteryje taip pat įdiegta „<ph name="SHORT_PRODUCT_NAME" />“ RLZ biblioteka. RLZ priskiria neunikalią, asmens neidentifikuojančią žymą, kad įvertintų tam tikros reklamos kampanijos paieškas ir „<ph name="SHORT_PRODUCT_NAME" />“ naudojimą. Šios etiketės kartais rodomos „Google“ paieškos užklausose „<ph name="PRODUCT_NAME" />“.</translation> <translation id="1046059554679513793">Oi! Šis vardas jau naudojamas!</translation> <translation id="1046635659603195359">Atrodo, kad jau esate nustatę funkciją „Voice Match“ naudodami „Google“ padėjėją kitame įrenginyje. Ankstesnius įrašus galima naudoti kuriant balso modelį šiame įrenginyje. Tai turėtų užtrukti mažiau nei minutę.</translation> @@ -148,6 +150,7 @@ <translation id="1211364473545090084">Naršykite žiniatinklį neišsaugodami naršymo istorijos inkognito lange</translation> <translation id="1213037489357051291">Nustatyta kontrolinių kodų: <ph name="NUM_FINGERPRINTS" /></translation> <translation id="1215411991991485844">Pridėta nauja foninė programa</translation> +<translation id="1217483152325416304">Jūsų vietiniai duomenys netrukus bus ištrinti</translation> <translation id="1217668622537098248">Grąžinti kairįjį paspaudimą po veiksmo</translation> <translation id="121783623783282548">Slaptažodžiai neatitinka.</translation> <translation id="1218839827383191197"><ph name="BEGIN_PARAGRAPH1" />„Google“ vietovės paslauga naudoja įvairius šaltinius, pvz., „Wi‑Fi“, mobiliojo ryšio tinklus ir jutiklius, šio įrenginio vietovei nustatyti.<ph name="END_PARAGRAPH1" /> @@ -308,6 +311,7 @@ <translation id="1478340334823509079">Išsami informacija: „<ph name="FILE_NAME" />“</translation> <translation id="1478607704480248626">Diegimas neįgalintas</translation> <translation id="1483493594462132177">Siųsti</translation> +<translation id="1484979925941077974">Svetainė naudoja „Bluetooth“</translation> <translation id="1485015260175968628">Dabar leidžiama:</translation> <translation id="1485141095922496924"><ph name="PRODUCT_VERSION" /> versija (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation> <translation id="1486096554574027028">Ieškoti slaptažodžių</translation> @@ -458,6 +462,7 @@ <translation id="1708338024780164500">(Neaktyvus)</translation> <translation id="1708713382908678956">„<ph name="NAME_PH" />“ (ID: <ph name="ID_PH" />)</translation> <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (savoji)</translation> +<translation id="1711401317189798723">Šiuo metu kuriama atsarginė <ph name="CONTAINER_ID" /> kopija</translation> <translation id="1712349894969001173">Gaukite šį slaptažodį „iPhone“ įrenginyje</translation> <translation id="1712552549805331520"><ph name="URL" /> prašo leidimo nuolat saugoti duomenis vietiniame kompiuteryje</translation> <translation id="1718835860248848330">Paskutinė valanda</translation> @@ -607,6 +612,7 @@ <translation id="1932026958134051332">Prieigos jungikliu parinktys</translation> <translation id="1932098463447129402">Nuo</translation> <translation id="1933809209549026293">Prijunkite pelę ar klaviatūrą. Jei naudojate „Bluetooth“ įrenginį, įsitikinkite, kad jis paruoštas susieti.</translation> +<translation id="1937774647013465102">Nepavyko importuoti sudėtinio rodinio architektūros tipo „<ph name="ARCHITECTURE_CONTAINER" />“ naudojant šį įrenginį, kuris yra „<ph name="ARCHITECTURE_DEVICE" />“. Galite pabandyti atkurti šį sudėtinį rodinį naudodami kitą įrenginį arba galite pasiekti failus šiame sudėtinio rodinio vaizde atidarę Failų programą.</translation> <translation id="1938351510777341717">Išorinė komanda</translation> <translation id="1940546824932169984">Prijungti įrenginiai</translation> <translation id="1944921356641260203">Naujinys rastas</translation> @@ -891,9 +897,11 @@ <translation id="2392369802118427583">Suaktyvinti</translation> <translation id="2394566832561516196">Nustatymai bus išvalyti kitą kartą iš naujo įkeliant.</translation> <translation id="2395616325548404795">„<ph name="DEVICE_TYPE" />“ sėkmingai užregistruotas kaip tvarkomas įmonėje, bet nepavyko išsiųsti jo išteklių ir vietovės informacijos. Įveskite šią informaciją neautomatiškai įrenginio skiltyje „Admin console“.</translation> +<translation id="2396783860772170191">Įveskite 4 skaitmenų PIN kodą (0000-9999)</translation> <translation id="2408955596600435184">Įveskite PIN kodą</translation> <translation id="241082044617551207">Nežinomas papildinys</translation> <translation id="2413749388954403953">Keisti žymių naudotojo sąsają</translation> +<translation id="241639282915300771">Šiuo metu vykdomas <ph name="CONTAINER_ID" /> atkūrimas</translation> <translation id="241727068219398187">Nuo <ph name="TIME" /> duomenys užšifruoti naudojant „Google“ slaptažodį. Neįtraukiami mokėjimo metodai ir adresai iš „Google Pay“.</translation> <translation id="2419706071571366386">Saugos sumetimais baigę naudoti kompiuterį atsijunkite.</translation> @@ -986,6 +994,7 @@ <translation id="2538361623464451692">Sinchronizavimas išjungtas</translation> <translation id="2540449034743108469">Paspauskite „Pradėti“ ir klausykitės plėtinių veiklos</translation> <translation id="2541002089857695151">Optimizuoti perdavimą viso ekrano režimu?</translation> +<translation id="2541706104884128042">Nustatytas naujas laikas eiti miegoti</translation> <translation id="2544853746127077729">Autentifikavimo sertifikatą atmetė tinklas</translation> <translation id="2549985041256363841">Pradėti įrašymą</translation> <translation id="2550212893339833758">Sukeista atmintis</translation> @@ -1077,6 +1086,7 @@ <translation id="2677748264148917807">Išeiti</translation> <translation id="2678063897982469759">Iš naujo įgalinti</translation> <translation id="268053382412112343">Is&torija</translation> +<translation id="2682498795777673382">Vieno iš tėvų naujinys</translation> <translation id="2683638487103917598">Aplankas surūšiuotas</translation> <translation id="2684004000387153598">Jei norite tęsti, spustelėkite „Gerai“, tada – „Pridėti asmenį“, kad sukurtumėte naują profilį naudodami savo el. pašto adresą.</translation> <translation id="2688196195245426394">Įrenginio registravimo serveryje klaida: <ph name="CLIENT_ERROR" />.</translation> @@ -1110,6 +1120,7 @@ <translation id="2731392572903530958">I&š naujo atidaryti uždarytą langą</translation> <translation id="2731700343119398978">Palaukite...</translation> <translation id="2731710757838467317">Kuriamas prižiūrimas naudotojas. Tai gali šiek tiek užtrukti.</translation> +<translation id="2731971182069536520">Kai kitą kartą iš naujo paleisite įrenginį, administratorius pritaikys vienkartinį naujinį ir bus ištrinti jūsų vietiniai duomenys.</translation> <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> svetainės taip pat bus nustatytos iš naujo.</translation> <translation id="2735438478659026460">Automatiškai spustelėti sustojus pelės žymekliui</translation> <translation id="2735712963799620190">Tvarkaraštis</translation> @@ -1313,6 +1324,7 @@ <translation id="304747341537320566">Kalbų varikliai</translation> <translation id="3047644958362961983">Ši informacija padeda mums geriau suprasti jums iškilusią „Assistant“ problemą. Ji saugoma iki 90 dienų ir ją gali pasiekti tik atitinkami inžinierių ir atsiliepimų komandų nariai.</translation> <translation id="3053013834507634016">Sertifikato rakto naudojimas</translation> +<translation id="3053273573829329829">Įgalinti naudotojo PIN kodą</translation> <translation id="3058498974290601450">Galite bet kada įjungti sinchronizavimą „Nustatymų“ skiltyje</translation> <translation id="3060379269883947824">Įgalinti funkciją „Teksto ištarimas“</translation> <translation id="3061707000357573562">Pataisos paslauga</translation> @@ -1332,6 +1344,7 @@ <translation id="3084771660770137092">Nebėra laisvos „Chrome“ atminties vietos arba tinklalapio procesas buvo nutrauktas dėl kitos priežasties. Jei norite tęsti, įkelkite iš naujo arba eikite į kitą puslapį.</translation> <translation id="3085412380278336437">Svetainė gali naudoti jūsų fotoaparatą</translation> <translation id="3085752524577180175">SOCKS priegloba</translation> +<translation id="3088052000289932193">Svetainėje naudojamas MIDI įrenginys</translation> <translation id="3088325635286126843">&Pervardyti...</translation> <translation id="3089137131053189723">Paieška išvalyta</translation> <translation id="3090193911106258841">Pasiekiama garso ir vaizdo įrašų įvestis</translation> @@ -1471,6 +1484,7 @@ <translation id="3317459757438853210">Dvipusis</translation> <translation id="3317678681329786349">Fotoaparatas ir mikrofonas užblokuoti</translation> <translation id="3319048459796106952">Naujas &nežinomas langas</translation> +<translation id="3323521181261657960">Premija! Galite ilgiau naudoti įrenginį</translation> <translation id="3325910708063135066">Fotoaparatas ir mikrofonas išjungti „Mac“ sistemos nuostatose</translation> <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation> <translation id="3331974543021145906">Programos informacija</translation> @@ -1766,6 +1780,7 @@ <translation id="3765246971671567135">Nepavyko nuskaityti neprisijungus pasiekiamos demonstracinio režimo politikos.</translation> <translation id="3766223500670287046">Nuotolinio valdymo ekranas</translation> <translation id="3768037234834996183">Sinchronizuojamos nuostatos...</translation> +<translation id="377050016711188788">Ledai</translation> <translation id="3771294271822695279">Vaizdo įrašų failai</translation> <translation id="3775432569830822555">SSL serverio sertifikatas</translation> <translation id="3775705724665058594">Išsiųsta į jūsų įrenginius</translation> @@ -1844,6 +1859,7 @@ <translation id="3869917919960562512">Neteisingas indeksas.</translation> <translation id="3870931306085184145">Nėra išsaugotų <ph name="DOMAIN" /> slaptažodžių</translation> <translation id="3871092408932389764">Žemiausias</translation> +<translation id="3871350334636688135">Po 24 valandų administratorius pritaikys vienkartinį naujinį ir bus ištrinti jūsų vietiniai duomenys, kai iš naujo paleisite įrenginį. Visus reikalingus duomenis išsaugokite saugykloje debesyje per 24 valandas.</translation> <translation id="3872220884670338524">Daugiau veiksmų, išsaugota <ph name="USERNAME" /> (<ph name="DOMAIN" />) paskyra</translation> <translation id="3872991219937722530">Atlaisvinkite vietos diske arba įrenginys nebeatsakys.</translation> <translation id="3873315167136380065">Norėdami tai įjungti <ph name="BEGIN_LINK" />nustatykite sinchronizavimą iš naujo<ph name="END_LINK" />, kad pašalintumėte sinchronizavimo slaptafrazę</translation> @@ -1923,6 +1939,7 @@ <translation id="3983400541576569538">Galite prarasti kai kurių programų duomenis</translation> <translation id="3983586614702900908">nežinomų tiekėjų įrenginiai</translation> <translation id="3984159763196946143">Nepavyko paleisti demonstracinės būsenos</translation> +<translation id="3984431586879874039">Leisti šiai svetainei peržiūrėti jūsų saugos raktą?</translation> <translation id="3987348946546879621">Išsaugoti duomenys</translation> <translation id="3987938432087324095">Deja, suprasti nepavyko.</translation> <translation id="3988996860813292272">Pasirinkite laiko juostą</translation> @@ -1999,6 +2016,7 @@ <translation id="4099060993766194518">Atkurti numatytąjį paieškos variklį?</translation> <translation id="4099874310852108874">Įvyko tinklo klaida.</translation> <translation id="4100733287846229632">Labai mažai vietos įrenginyje</translation> +<translation id="4100853287411968461">Naujas įrenginio naudojimo laiko apribojimas</translation> <translation id="4103091233824664032">Įveskite slaptažodį ir konfigūruokite ekrano užraktą bei prisijungimą</translation> <translation id="4104163789986725820">Eksportuoti...</translation> <translation id="4107048419833779140">Identifikuoti ir pašalinti saugyklos įrenginius</translation> @@ -2119,6 +2137,7 @@ <translation id="4324577459193912240">Failas neužbaigtas</translation> <translation id="4325237902968425115">Pašalinama „<ph name="LINUX_APP_NAME" />“...</translation> <translation id="4328203388435897516">Kai „Chromebook“ nustatytas, norėdami bet kuriuo metu gauti pagalbos, paspauskite Padėjėjo mygtuką arba pasakykite „Ok Google“. Jei norite atlikti pakeitimų, eikite į Padėjėjo nustatymų skiltį.</translation> +<translation id="4330191372652740264">Ledinis vanduo</translation> <translation id="4330387663455830245">Niekada neversti <ph name="LANGUAGE" /> k.</translation> <translation id="4333854382783149454">PKCS Nr. 1 SHA-1 su RSA šifruote</translation> <translation id="4336979451636460645">Tinklo žurnalus rasite adresu <ph name="DEVICE_LOG_LINK" /></translation> @@ -2154,6 +2173,7 @@ <translation id="438503109373656455">Mūšis</translation> <translation id="4387004326333427325">Autentifikavimo sertifikatas atmestas nuotoliniu būdu</translation> <translation id="4389091756366370506"><ph name="VALUE" /> naudotojas</translation> +<translation id="4390000551125140321">{0,plural, =1{Inkognito}one{# atidarytas inkognito langas}few{# atidaryti inkognito langai}many{# atidaryto inkognito lango}other{# atidarytų inkognito langų}}</translation> <translation id="439266289085815679">„Bluetooth“ konfigūravimą valdo <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Neleisti</translation> <translation id="4400367121200150367">Svetainės, kuriose niekada nesaugomi slaptažodžiai, bus rodomos čia</translation> @@ -2302,6 +2322,7 @@ <translation id="4648499713050786492">Prieš pridėdami asmenį atrakinkite savo profilį.</translation> <translation id="4651484272688821107">Nepavyko įkelti prisijungus pasiekiamo komponento naudojant demonstracinio režimo šaltinius.</translation> <translation id="465878909996028221">Į kitą naršyklę galima peradresuoti tik „http“, „https“ ir failų protokolus.</translation> +<translation id="4659077111144409915">Pagrindinė paskyra</translation> <translation id="4660476621274971848">Versija turėjo būti <ph name="EXPECTED_VERSION" />, o buvo pateikta <ph name="NEW_ID" /></translation> <translation id="4662788913887017617">Bendrinkite šią žymę su „iPhone“</translation> <translation id="4663373278480897665">Fotoaparatas leidžiamas</translation> @@ -2347,6 +2368,7 @@ <translation id="4724450788351008910">Ryšys pakeistas</translation> <translation id="4725511304875193254">Korgis</translation> <translation id="4726710629007580002">Bandant įdiegti šį plėtinį buvo pateikti šie įspėjimai:</translation> +<translation id="4727847987444062305">Valdoma svečio sesija</translation> <translation id="4728558894243024398">Platforma</translation> <translation id="4733082559415072992"><ph name="URL" /> nori naudoti įrenginio vietovę</translation> <translation id="4733793249294335256">Vieta</translation> @@ -2456,6 +2478,7 @@ <translation id="488785315393301722">Rodyti išsamią informaciją</translation> <translation id="4890773143211625964">Rodyti išplėstines spausdintuvo parinktis</translation> <translation id="4891089016822695758">Beta forumas</translation> +<translation id="4892229439761351791">Svetainė gali naudoti „Bluetooth“</translation> <translation id="4893336867552636863">Atlikus šį veiksmą bus visam laikui ištrinti naršymo duomenys iš šio įrenginio.</translation> <translation id="4893522937062257019">Užrakinimo ekrane</translation> <translation id="4898011734382862273">Sertifikatas „<ph name="CERTIFICATE_NAME" />“ nurodo sertifikavimo instituciją</translation> @@ -2631,6 +2654,8 @@ <translation id="5187295959347858724">Dabar esate prisijungę prie „<ph name="SHORT_PRODUCT_NAME" />“. Žymės, istorija ir kiti nustatymai sinchronizuojami su „Google“ paskyra.</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> nori atsisiųsti kelis failus</translation> +<translation id="5192316339598592690">Sparčiai perjunkite paskyras ir prisijunkite iš karto prie visų programų ir svetainių. + Programose ir svetainėse gali būti prašoma jūsų leidimo naudoti tam tikrą „Google“ paskyros informaciją. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="5204673965307125349">Vykdykite „Powerwash“ ir bandykite dar kartą.</translation> <translation id="5204967432542742771">Įveskite slaptažodį</translation> <translation id="5206215183583316675">Ištrinti „<ph name="CERTIFICATE_NAME" />“?</translation> @@ -3516,6 +3541,7 @@ <translation id="6547354035488017500">Atlaisvinkite bent 512 MB vietos arba jūsų įrenginys nebeatsakys. Norėdami atlaisvinti vietos, ištrinkite failus iš įrenginio saugyklos.</translation> <translation id="6550675742724504774">Parinktys</translation> <translation id="6551508934388063976">Komanda negalima. Paspauskite „Control“ – N, kad atidarytumėte naują langą.</translation> +<translation id="6551612971599078809">Svetainėje naudojamas USB</translation> <translation id="655384502888039633">Naudotojų: <ph name="USER_COUNT" /></translation> <translation id="655483977608336153">Bandyti dar kartą</translation> <translation id="6555432686520421228">Pašalinamos visos naudotojų paskyros ir „<ph name="IDS_SHORT_PRODUCT_NAME" />“ įrenginys nustatomas iš naujo, kad būtų kaip naujas.</translation> @@ -3740,6 +3766,7 @@ <translation id="692114467174262153">Nepavyko atidaryti „<ph name="ALTERNATIVE_BROWSER_NAME" />“</translation> <translation id="6921709132208495314">Nebenaudoti duomenų šiame puslapyje</translation> <translation id="6922128026973287222">Taupykite duomenis ir naršykite greičiau naudodami „Google“ duomenų taupymo priemonę. Jei norite sužinoti daugiau, spustelėkite.</translation> +<translation id="6922745772873733498">Įveskite PIN kodą, kad galėtumėte spausdinti</translation> <translation id="6923132443355966645">Slinkti / spustelėti</translation> <translation id="6923633482430812883">Klaida įdedant bendrinamą objektą. Patikrinkite, ar failo serveris, prie kurio prisijungiate, palaiko SMBv2 arba naujesnę versiją.</translation> <translation id="6930036377490597025">Išorinis saugos raktas arba integruotas jutiklis</translation> @@ -3794,6 +3821,7 @@ <translation id="7003339318920871147">Žiniatinklio duomenys</translation> <translation id="7003723821785740825">Nustatykite, kad galėtumėte greičiau atrakinti įrenginį</translation> <translation id="7003844668372540529">Nežinomas produktas „<ph name="PRODUCT_ID" />“ iš „<ph name="VENDOR_NAME" />“</translation> +<translation id="7004402701596653846">Svetainėje gali būti naudojamas MIDI įrenginys</translation> <translation id="7004499039102548441">Naujausi skirtukai</translation> <translation id="7005848115657603926">Neteisingas puslapių diapazonas, naudokite <ph name="EXAMPLE_PAGE_RANGE" /></translation> <translation id="7006634003215061422">Apatinė paraštė</translation> @@ -3806,9 +3834,11 @@ <translation id="7017480957358237747">leisti arba drausti konkrečias svetaines</translation> <translation id="7018275672629230621">Skaityti ir keisti naršymo istoriją</translation> <translation id="7019805045859631636">Greitas</translation> +<translation id="702252130983202758">Jūsų programos</translation> <translation id="7022562585984256452">Pagrindinis puslapis nustatytas.</translation> <translation id="7025190659207909717">Duomenų mobiliesiems paslaugos valdymas</translation> <translation id="7029809446516969842">Slaptažodžiai</translation> +<translation id="7031608529463141342">„<ph name="WINDOW_TITLE" />“ – nuoseklusis prievadas prijungtas</translation> <translation id="7031962166228839643">Ruošiamas TPM; palaukite (tai gali užtrukti kelias minutes)...</translation> <translation id="7037509989619051237">Tekstas, kurį galima išklausyti</translation> <translation id="7039326228527141150">Pasiekti „<ph name="VENDOR_NAME" />“ USB įrenginius</translation> @@ -3833,6 +3863,7 @@ <translation id="706626672220389329">Klaida įdedant bendrinamą objektą. Nurodytas bendrinamas objektas jau įdėtas.</translation> <translation id="7066944511817949584">Nepavyko prisijungti prie „<ph name="DEVICE_NAME" />“.</translation> <translation id="7067725467529581407">Niekada daugiau nerodyti.</translation> +<translation id="7069811530847688087"><ph name="WEBSITE" /> gali reikėti naujesnio arba kitokio saugos rakto</translation> <translation id="7070484045139057854">Gali būti skaitomi ir keičiami svetainės duomenys</translation> <translation id="7072010813301522126">Sparčiojo klavišo pavadinimas</translation> <translation id="707392107419594760">Pasirinkite klaviatūrą:</translation> @@ -3913,6 +3944,7 @@ <translation id="7189234443051076392">Įsitikinkite, kad įrenginyje yra pakankamai vietos</translation> <translation id="7189965711416741966">Piršto antspaudas pridėtas.</translation> <translation id="7191159667348037">Nežinomas spausdintuvas (USB)</translation> +<translation id="7193051357671784796">Šią programą pridėjo jūsų organizacija. Paleiskite programą iš naujo, kad baigtumėte ją diegti.</translation> <translation id="7193374945610105795">Nėra išsaugotų <ph name="ORIGIN" /> slaptažodžių</translation> <translation id="7196913789568937443">Sukurkite atsarginę kopiją „Google“ diske. Lengvai bet kada atkurkite duomenis arba perjunkite įrenginį. Į atsarginę kopiją įtraukiami programų duomenys. Atsarginės kopijos įkeliamos į sistemą „Google“ ir šifruojamos naudojant „Google“ paskyros slaptažodį. <ph name="BEGIN_LINK1" />Sužinokite daugiau<ph name="END_LINK1" /></translation> <translation id="7197190419934240522">Naudokitės „Google“ paieška ir „Google“ išmaniosiomis funkcijomis kiekvieną kartą naršydami</translation> @@ -4335,6 +4367,7 @@ <ph name="BR" /> <ph name="BEGIN_BOLD" />Pastaba:<ph name="END_BOLD" /> vykdant procesą sistema bus paleista iš naujo.</translation> <translation id="7829298379596169484">Pasiekiama garso įrašų įvestis</translation> +<translation id="7830594666202422257">Prijungti prie „Linux“</translation> <translation id="7831491651892296503">Klaida konfigūruojant tinklą</translation> <translation id="7831754656372780761">„<ph name="TAB_TITLE" />“ <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Pabaigos laikas</translation> @@ -4364,6 +4397,7 @@ <translation id="7877451762676714207">Nežinoma serverio klaida. Bandykite dar kartą arba susisiekite su serverio administratoriumi.</translation> <translation id="7877680364634660272">Apžvalga</translation> <translation id="7878562273885520351">Jūsų slaptažodis gali būti pažeistas</translation> +<translation id="7880823633812189969">Vietiniai duomenys bus ištrinti paleidus iš naujo</translation> <translation id="7881483672146086348">Žiūrėti paskyrą</translation> <translation id="7882358943899516840">Teikėjo tipas</translation> <translation id="7885253890047913815">Naujausios paskirties vietos</translation> @@ -4702,6 +4736,7 @@ <translation id="8426713856918551002">Įgalinama</translation> <translation id="8427292751741042100">įterpta bet kurioje priegloboje</translation> <translation id="8428213095426709021">Nustatymai</translation> +<translation id="8428628598981198790">Saugos rakto negalima naudoti šioje svetainėje</translation> <translation id="84297032718407999">Būsite atjungti po <ph name="LOGOUT_TIME_LEFT" /></translation> <translation id="8431190899827883166">Rodyti palietimus</translation> <translation id="8431909052837336408">SIM kortelės PIN kodo pakeitimas</translation> @@ -4906,6 +4941,7 @@ <translation id="8732212173949624846">Skaityti ir keisti naršymo istoriją visuose įrenginiuose, kuriuose esate prisijungę</translation> <translation id="8732844209475700754">Daugiau nustatymų, susijusių su privatumu, sauga ir duomenų rinkimu</translation> <translation id="8734073480934656039">Įgalinus šį nustatymą, paleidus operacinę sistemą leidžiama automatiškai paleisti viešojo terminalo programas.</translation> +<translation id="8734671092194994316">Jūsų apsilankymas svetainėje <ph name="WEBSITE" /> bus įrašytas saugos rakte.</translation> <translation id="873545264931343897">Kai „<ph name="PLUGIN_NAME" />“ bus atnaujintas, iš naujo įkelkite puslapį, kad suaktyvintumėte</translation> <translation id="8736288397686080465">Ši svetainė atnaujinta fone.</translation> <translation id="8737685506611670901">Atidaryti „<ph name="PROTOCOL" />“ nuorodas vietoje „<ph name="REPLACED_HANDLER_TITLE" />“</translation> @@ -5004,6 +5040,7 @@ <translation id="8877448029301136595">[parent directory]</translation> <translation id="8879284080359814990">&Rodyti kaip skirtuką</translation> <translation id="8883847527783433352">Sinchronizuoti su kita paskyra</translation> +<translation id="8884570509232205463">Jūsų įrenginys dabar užrakinamas <ph name="UNLOCK_TIME" />.</translation> <translation id="8885197664446363138">„Smart Lock“ nepasiekiama</translation> <translation id="8888253246822647887">Programa bus atidaryta baigus naujovinti. Naujovinimas gali užtrukti keletą minučių.</translation> <translation id="8888432776533519951">Spalva:</translation> @@ -5097,6 +5134,7 @@ <translation id="9026852570893462412">Šis procesas gali užtrukti kelias minutes. Atsisiunčiamas virtualus įrenginys.</translation> <translation id="9027459031423301635">Atidaryti nuorodą naujame &skirtuke</translation> <translation id="9030515284705930323">Organizacija jūsų paskyroje neįgalino „Google Play“ parduotuvės. Jei reikia daugiau informacijos, susisiekite su administratoriumi.</translation> +<translation id="9030785788945687215">Gmail</translation> <translation id="9033857511263905942">&Įklijuoti</translation> <translation id="9037965129289936994">Rodyti originalą</translation> <translation id="9038649477754266430">Naudokite numatymo paslaugą, kad puslapiai būtų įkeliami greičiau</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index ba190d6..76497780 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -8,6 +8,7 @@ <translation id="1007408791287232274">Kan apparaten niet laden.</translation> <translation id="1008186147501209563">Bladwijzers exporteren</translation> <translation id="1008557486741366299">Niet nu</translation> +<translation id="1010498023906173788">Dit tabblad is gekoppeld aan een seriële poort.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Pagina reageert niet}other{Pagina's reageren niet}}</translation> <translation id="1012794136286421601">Je bestanden van Google Documenten, Spreadsheets, Presentaties en Tekeningen worden gesynchroniseerd. Open de Google Drive-app om ze online of offline te openen.</translation> <translation id="1012876632442809908">USB-C-apparaat (poort aan voorkant)</translation> @@ -30,6 +31,7 @@ <translation id="1036982837258183574">Druk op |<ph name="ACCELERATOR" />| om het volledige scherm te sluiten</translation> <translation id="1038168778161626396">Alleen coderen</translation> <translation id="1039337018183941703">Ongeldig of beschadigd bestand</translation> +<translation id="1041175011127912238">Deze pagina reageert niet</translation> <translation id="1042174272890264476">Je computer is ook uitgerust met de RLZ-bibliotheek van <ph name="SHORT_PRODUCT_NAME" />. RLZ wijst een niet-unieke, niet-persoonlijke tag toe om de zoekopdrachten en het gebruik van <ph name="SHORT_PRODUCT_NAME" /> te meten als gevolg van een bepaalde promotiecampagne. Deze labels worden soms weergegeven in Google-zoekopdrachten in <ph name="PRODUCT_NAME" />.</translation> <translation id="1046059554679513793">Deze naam wordt al gebruikt.</translation> <translation id="1046635659603195359">Het lijkt erop dat je Voice Match al hebt ingesteld met de Google Assistent op een ander apparaat. Deze eerdere opnamen kunnen worden gebruikt om een spraakmodel te maken op dit apparaat. Dit zou minder dan een minuut moeten duren.</translation> @@ -148,6 +150,7 @@ <translation id="1211364473545090084">Gebruik een incognitovenster om te internetten zonder dat je browsegeschiedenis wordt opgeslagen</translation> <translation id="1213037489357051291"><ph name="NUM_FINGERPRINTS" /> vingerafdrukken ingesteld</translation> <translation id="1215411991991485844">Nieuwe achtergrondapp toegevoegd</translation> +<translation id="1217483152325416304">Je lokale gegevens worden binnenkort verwijderd.</translation> <translation id="1217668622537098248">Terugzetten naar klikken met linkermuisknop na actie</translation> <translation id="121783623783282548">De wachtwoorden komen niet overeen.</translation> <translation id="1218839827383191197"><ph name="BEGIN_PARAGRAPH1" />De locatieservice van Google gebruikt bronnen zoals wifi, mobiele netwerken en sensoren om de locatie van dit apparaat te schatten.<ph name="END_PARAGRAPH1" /> @@ -308,6 +311,7 @@ <translation id="1478340334823509079">Details: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">Installatie is niet ingeschakeld</translation> <translation id="1483493594462132177">Verzenden</translation> +<translation id="1484979925941077974">Site gebruikt Bluetooth</translation> <translation id="1485015260175968628">De app/extensie kan nu het volgende doen:</translation> <translation id="1485141095922496924">Versie <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation> <translation id="1486096554574027028">Zoek in wachtwoorden</translation> @@ -458,6 +462,7 @@ <translation id="1708338024780164500">(Inactief)</translation> <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation> <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (native)</translation> +<translation id="1711401317189798723">Er wordt momenteel een back-up gemaakt van <ph name="CONTAINER_ID" /></translation> <translation id="1712349894969001173">Dit wachtwoord gebruiken op je iPhone</translation> <translation id="1712552549805331520"><ph name="URL" /> vraagt toestemming om permanent gegevens op je lokale computer op te slaan</translation> <translation id="1718835860248848330">Afgelopen uur</translation> @@ -607,6 +612,7 @@ <translation id="1932026958134051332">Toegangsopties wijzigen</translation> <translation id="1932098463447129402">Niet vóór</translation> <translation id="1933809209549026293">Sluit een muis of een toetsenbord aan. Als je een Bluetooth-apparaat gebruikt, zorg je ervoor dat dit kan worden gekoppeld.</translation> +<translation id="1937774647013465102">Kan type containerarchitectuur <ph name="ARCHITECTURE_CONTAINER" /> niet importeren met dit apparaat. Dit apparaat is <ph name="ARCHITECTURE_DEVICE" />. Je kunt proberen deze container te herstellen op een ander apparaat of je kunt toegang krijgen tot bestanden in deze containerimage door ze te openen in de app Bestanden.</translation> <translation id="1938351510777341717">Externe opdracht</translation> <translation id="1940546824932169984">Verbonden apparaten</translation> <translation id="1944921356641260203">Update gevonden</translation> @@ -891,9 +897,11 @@ <translation id="2392369802118427583">Activeren</translation> <translation id="2394566832561516196">De instellingen worden gewist bij opnieuw laden.</translation> <translation id="2395616325548404795">Je <ph name="DEVICE_TYPE" /> is aangemeld voor bedrijfsbeheer, maar kan de item- en locatiegegevens niet verzenden. Voer deze gegevens handmatig in via je Beheerdersconsole voor dit apparaat.</translation> +<translation id="2396783860772170191">Voer een viercijferige pincode in (0000-9999)</translation> <translation id="2408955596600435184">Je pincode opgeven</translation> <translation id="241082044617551207">Onbekende plug-in</translation> <translation id="2413749388954403953">De gebruikersinterface voor bladwijzers wijzigen</translation> +<translation id="241639282915300771">Herstel wordt momenteel uitgevoerd voor <ph name="CONTAINER_ID" /></translation> <translation id="241727068219398187">Je gegevens zijn vanaf <ph name="TIME" /> versleuteld met je Google-wachtwoord. Hieronder vallen geen betaalmethoden en adressen van Google Pay.</translation> <translation id="2419706071571366386">Log om veiligheidsredenen uit wanneer je computer niet wordt gebruikt.</translation> @@ -986,6 +994,7 @@ <translation id="2538361623464451692">Synchroniseren uitgeschakeld</translation> <translation id="2540449034743108469">Druk op Starten om extensie-activiteit te beluisteren</translation> <translation id="2541002089857695151">Casten op volledig scherm optimaliseren?</translation> +<translation id="2541706104884128042">Nieuwe bedtijd ingesteld</translation> <translation id="2544853746127077729">Verificatiecertificaat geweigerd door netwerk</translation> <translation id="2549985041256363841">Opname starten</translation> <translation id="2550212893339833758">Wisselgeheugen</translation> @@ -1077,6 +1086,7 @@ <translation id="2677748264148917807">Verlaten</translation> <translation id="2678063897982469759">Opnieuw inschakelen</translation> <translation id="268053382412112343">Geschi&edenis</translation> +<translation id="2682498795777673382">Update van je ouder</translation> <translation id="2683638487103917598">Map gesorteerd</translation> <translation id="2684004000387153598">Als je verder wilt gaan, klik je op 'OK' en vervolgens op 'Persoon toevoegen' om een nieuw profiel te maken voor je e-mailadres.</translation> <translation id="2688196195245426394">Fout bij het registreren van het apparaat bij de server: <ph name="CLIENT_ERROR" />.</translation> @@ -1110,6 +1120,7 @@ <translation id="2731392572903530958">G&esloten venster opnieuw openen</translation> <translation id="2731700343119398978">Even geduld...</translation> <translation id="2731710757838467317">Je gebruiker met beperkte rechten wordt gemaakt. Dit kan even duren.</translation> +<translation id="2731971182069536520">De volgende keer dat je je apparaat opnieuw start, voert je beheerder een update uit waarmee je lokale gegevens worden verwijderd.</translation> <translation id="2734760316755174687">Sites onder <ph name="SITE_GROUP_NAME" /> worden ook gereset.</translation> <translation id="2735438478659026460">Automatisch klikken wanneer de muisaanwijzer stopt</translation> <translation id="2735712963799620190">Schema</translation> @@ -1313,6 +1324,7 @@ <translation id="304747341537320566">Spraakengines</translation> <translation id="3047644958362961983">Deze informatie biedt ons meer inzicht in je probleem met de Assistent. De informatie wordt maximaal negentig dagen opgeslagen en de toegang is beperkt tot de toepasselijke technische en feedbackteams.</translation> <translation id="3053013834507634016">Sleutelgebruik voor certificaat</translation> +<translation id="3053273573829329829">Gebruikerspincode inschakelen</translation> <translation id="3058498974290601450">Je kunt synchronisatie op elk gewenst moment inschakelen via de instellingen</translation> <translation id="3060379269883947824">'Selecteer om uitgesproken te worden' inschakelen</translation> <translation id="3061707000357573562">Patchservice</translation> @@ -1332,6 +1344,7 @@ <translation id="3084771660770137092">Chrome beschikt over onvoldoende geheugen of het webpaginaproces is om een andere reden beëindigd. Laad de pagina opnieuw of ga naar een andere pagina om door te gaan.</translation> <translation id="3085412380278336437">Site kan je camera gebruiken</translation> <translation id="3085752524577180175">SOCKS-host</translation> +<translation id="3088052000289932193">De site gebruikt MIDI</translation> <translation id="3088325635286126843">&Naam wijzigen...</translation> <translation id="3089137131053189723">Zoekopdracht gewist</translation> <translation id="3090193911106258841">Audio- en video-invoer openen</translation> @@ -1471,6 +1484,7 @@ <translation id="3317459757438853210">Dubbelzijdig</translation> <translation id="3317678681329786349">Camera en microfoon geblokkeerd</translation> <translation id="3319048459796106952">Nieuw &incognitovenster</translation> +<translation id="3323521181261657960">Bonus! Je hebt meer schermtijd gekregen</translation> <translation id="3325910708063135066">Camera en microfoon zijn uitgeschakeld in Mac-systeemvoorkeuren</translation> <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation> <translation id="3331974543021145906">App-informatie</translation> @@ -1766,6 +1780,7 @@ <translation id="3765246971671567135">Kan beleid voor offline demomodus niet lezen.</translation> <translation id="3766223500670287046">Extern scherm</translation> <translation id="3768037234834996183">Je voorkeuren worden gesynchroniseerd…</translation> +<translation id="377050016711188788">IJs</translation> <translation id="3771294271822695279">Videobestanden</translation> <translation id="3775432569830822555">SSL-servercertificaat</translation> <translation id="3775705724665058594">Verzenden naar je apparaten</translation> @@ -1844,6 +1859,7 @@ <translation id="3869917919960562512">Verkeerde index.</translation> <translation id="3870931306085184145">Geen opgeslagen wachtwoorden voor <ph name="DOMAIN" /></translation> <translation id="3871092408932389764">Laagste</translation> +<translation id="3871350334636688135">Na 24 uur voert je beheerder een update uit waarmee je lokale gegevens worden verwijderd wanneer je het apparaat opnieuw opstart. Sla lokale gegevens die je nodig hebt, binnen 24 uur op in de cloudopslag.</translation> <translation id="3872220884670338524">Meer acties, opgeslagen account voor <ph name="USERNAME" /> op <ph name="DOMAIN" /></translation> <translation id="3872991219937722530">Maak schijfruimte vrij om te voorkomen dat het apparaat niet meer reageert.</translation> <translation id="3873315167136380065">Als je dit wilt inschakelen, <ph name="BEGIN_LINK" />reset je de synchronisatie<ph name="END_LINK" /> om de wachtwoordzin voor synchronisatie te verwijderen</translation> @@ -1923,6 +1939,7 @@ <translation id="3983400541576569538">Gegevens van sommige apps kunnen verloren gaan</translation> <translation id="3983586614702900908">apparaten van een onbekende leverancier</translation> <translation id="3984159763196946143">Kan demomodus niet starten</translation> +<translation id="3984431586879874039">Deze site toestaan je beveiligingssleutel te bekijken?</translation> <translation id="3987348946546879621">Mobiel dataverbruik bespaard</translation> <translation id="3987938432087324095">Sorry, dat heb ik niet verstaan.</translation> <translation id="3988996860813292272">Tijdzone selecteren</translation> @@ -1999,6 +2016,7 @@ <translation id="4099060993766194518">Standaardzoekmachine herstellen?</translation> <translation id="4099874310852108874">Er is een netwerkfout opgetreden.</translation> <translation id="4100733287846229632">Er is zeer weinig ruimte beschikbaar op het apparaat</translation> +<translation id="4100853287411968461">Nieuwe schermtijdlimiet</translation> <translation id="4103091233824664032">Geef je wachtwoord op om de schermvergrendeling in te stellen en in te loggen</translation> <translation id="4104163789986725820">E&xporteren...</translation> <translation id="4107048419833779140">Opslagapparaten identificeren en verwijderen</translation> @@ -2119,6 +2137,7 @@ <translation id="4324577459193912240">Bestand onvolledig</translation> <translation id="4325237902968425115"><ph name="LINUX_APP_NAME" /> verwijderen...</translation> <translation id="4328203388435897516">Wanneer je Chromebook is ingesteld, kun je op elk gewenst moment op de Assistent-knop drukken of 'Oké Google' zeggen om hulp te krijgen. Ga naar de Assistent-instellingen om wijzigingen aan te brengen.</translation> +<translation id="4330191372652740264">IJswater</translation> <translation id="4330387663455830245"><ph name="LANGUAGE" /> nooit vertalen</translation> <translation id="4333854382783149454">PKCS nr. 1 SHA-1 met RSA-encryptie</translation> <translation id="4336979451636460645">Zie voor netwerklogboeken: <ph name="DEVICE_LOG_LINK" /></translation> @@ -2154,6 +2173,7 @@ <translation id="438503109373656455">Salinero</translation> <translation id="4387004326333427325">Verificatiecertificaat afgewezen op afstand</translation> <translation id="4389091756366370506">Gebruiker <ph name="VALUE" /></translation> +<translation id="4390000551125140321">{0,plural, =1{Incognito}other{# geopende incognitovensters}}</translation> <translation id="439266289085815679">Bluetooth-configuratie wordt beheerd door <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Uitschakelen</translation> <translation id="4400367121200150367">Sites die nooit wachtwoorden opslaan, worden hier weergegeven</translation> @@ -2302,6 +2322,7 @@ <translation id="4648499713050786492">Ontgrendel je profiel voordat je een persoon toevoegt.</translation> <translation id="4651484272688821107">Kan online component niet laden met bronnen van demomodus.</translation> <translation id="465878909996028221">Alleen http- en https-bestandsprotocollen worden ondersteund voor browseromleidingen.</translation> +<translation id="4659077111144409915">Primair account</translation> <translation id="4660476621274971848">Verwachte versie '<ph name="EXPECTED_VERSION" />', maar versie is '<ph name="NEW_ID" />'</translation> <translation id="4662788913887017617">Deze bladwijzer delen met je iPhone</translation> <translation id="4663373278480897665">Camera toegestaan</translation> @@ -2347,6 +2368,7 @@ <translation id="4724450788351008910">Relatie is gewijzigd</translation> <translation id="4725511304875193254">Corgi</translation> <translation id="4726710629007580002">Er zijn waarschuwingen weergegeven tijdens een poging deze extensie te installeren:</translation> +<translation id="4727847987444062305">Beheerde gastsessie</translation> <translation id="4728558894243024398">Platform</translation> <translation id="4733082559415072992"><ph name="URL" /> wil de locatie van je apparaat gebruiken</translation> <translation id="4733793249294335256">Locatie</translation> @@ -2456,6 +2478,7 @@ <translation id="488785315393301722">Details weergeven</translation> <translation id="4890773143211625964">Geavanceerde printeropties weergeven</translation> <translation id="4891089016822695758">Bètaforum</translation> +<translation id="4892229439761351791">Site kan Bluetooth gebruiken</translation> <translation id="4893336867552636863">Hiermee worden je browsegegevens op dit apparaat definitief verwijderd.</translation> <translation id="4893522937062257019">Op het vergrendelingsscherm</translation> <translation id="4898011734382862273">Het certificaat '<ph name="CERTIFICATE_NAME" />' vertegenwoordigt een certificeringsinstantie.</translation> @@ -2631,6 +2654,8 @@ <translation id="5187295959347858724">Je bent nu ingelogd bij <ph name="SHORT_PRODUCT_NAME" />. Je bladwijzers, geschiedenis en andere instellingen worden gesynchroniseerd met je Google-account.</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> wil meerdere bestanden downloaden</translation> +<translation id="5192316339598592690">Schakel snel tussen accounts en log in één keer in bij apps en websites. + Apps en sites kunnen je toestemming vragen om bepaalde Google-accountgegevens te gebruiken. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation> <translation id="5204673965307125349">Voer een powerwash uit op het apparaat en probeer het opnieuw.</translation> <translation id="5204967432542742771">Wachtwoord invoeren</translation> <translation id="5206215183583316675"><ph name="CERTIFICATE_NAME" /> verwijderen?</translation> @@ -3515,6 +3540,7 @@ <translation id="6547354035488017500">Je moet minimaal 512 MB aan ruimte vrijmaken om ervoor te zorgen dat het apparaat blijft reageren. Verwijder bestanden uit de opslag van het apparaat om ruimte vrij te maken.</translation> <translation id="6550675742724504774">Opties</translation> <translation id="6551508934388063976">Opdracht niet beschikbaar. Druk op Ctrl-N om een nieuw venster te openen.</translation> +<translation id="6551612971599078809">De site gebruikt een USB-apparaat</translation> <translation id="655384502888039633"><ph name="USER_COUNT" /> gebruikers</translation> <translation id="655483977608336153">Opnieuw</translation> <translation id="6555432686520421228">Alle gebruikersaccounts verwijderen en je <ph name="IDS_SHORT_PRODUCT_NAME" />-apparaat opnieuw instellen.</translation> @@ -3739,6 +3765,7 @@ <translation id="692114467174262153"><ph name="ALTERNATIVE_BROWSER_NAME" /> kan niet worden geopend</translation> <translation id="6921709132208495314">Geen data meer gebruiken op deze pagina</translation> <translation id="6922128026973287222">Sla gegevens op en surf sneller met Databesparing van Google. Klik voor meer informatie.</translation> +<translation id="6922745772873733498">Geef een pincode op om af te drukken</translation> <translation id="6923132443355966645">Scroll/klik</translation> <translation id="6923633482430812883">Fout bij het activeren van de fileshare. Controleer of de bestandsserver waarmee je verbinding maakt, SMBv2 of hoger ondersteunt.</translation> <translation id="6930036377490597025">Externe beveiligingssleutel of ingebouwde sensor</translation> @@ -3793,6 +3820,7 @@ <translation id="7003339318920871147">Webdatabases</translation> <translation id="7003723821785740825">Stel een snellere manier in om je apparaat te ontgrendelen</translation> <translation id="7003844668372540529">Onbekend product <ph name="PRODUCT_ID" /> van <ph name="VENDOR_NAME" /></translation> +<translation id="7004402701596653846">De site kan MIDI gebruiken.</translation> <translation id="7004499039102548441">Recent gebruikte tabbladen</translation> <translation id="7005848115657603926">Ongeldig paginabereik, gebruik <ph name="EXAMPLE_PAGE_RANGE" /></translation> <translation id="7006634003215061422">Marge onderkant</translation> @@ -3805,9 +3833,11 @@ <translation id="7017480957358237747">bepaalde websites toestaan of verbieden,</translation> <translation id="7018275672629230621">Je browsegeschiedenis lezen en wijzigen</translation> <translation id="7019805045859631636">Snel</translation> +<translation id="702252130983202758">Je apps</translation> <translation id="7022562585984256452">Je homepage is ingesteld.</translation> <translation id="7025190659207909717">Beheer van mobiele netwerken</translation> <translation id="7029809446516969842">Wachtwoorden</translation> +<translation id="7031608529463141342"><ph name="WINDOW_TITLE" />: seriële poort verbonden</translation> <translation id="7031962166228839643">TPM wordt voorbereid, even geduld (dit kan een paar minuten duren)...</translation> <translation id="7037509989619051237">Tekst voor voorbeeld</translation> <translation id="7039326228527141150">Toegang verkrijgen tot USB-apparaten van <ph name="VENDOR_NAME" /></translation> @@ -3832,6 +3862,7 @@ <translation id="706626672220389329">Fout bij het activeren van de fileshare. De opgegeven fileshare is al geactiveerd.</translation> <translation id="7066944511817949584">Verbinding maken met '<ph name="DEVICE_NAME" />' mislukt.</translation> <translation id="7067725467529581407">Nooit meer weergeven.</translation> +<translation id="7069811530847688087"><ph name="WEBSITE" /> vereist mogelijk een nieuwere of een ander type beveiligingssleutel</translation> <translation id="7070484045139057854">Hiermee kun je sitegegevens lezen en wijzigen</translation> <translation id="7072010813301522126">Naam van snelkoppeling</translation> <translation id="707392107419594760">Selecteer je toetsenbord:</translation> @@ -3912,6 +3943,7 @@ <translation id="7189234443051076392">Zorg dat er voldoende ruimte op je apparaat beschikbaar is</translation> <translation id="7189965711416741966">Vingerafdruk is toegevoegd.</translation> <translation id="7191159667348037">Onbekende printer (USB)</translation> +<translation id="7193051357671784796">Deze app is toegevoegd door je organisatie. Start de app opnieuw om de installatie te voltooien.</translation> <translation id="7193374945610105795">Geen wachtwoorden opgeslagen voor <ph name="ORIGIN" /></translation> <translation id="7196913789568937443">Een back-up maken op Google Drive. Gemakkelijk je gegevens herstellen of op elk gewenst moment van apparaat wisselen. Je back-up omvat app-gegevens. Je back-ups worden geüpload naar Google en versleuteld met het wachtwoord van je Google-account. <ph name="BEGIN_LINK1" />Meer informatie<ph name="END_LINK1" /></translation> <translation id="7197190419934240522">Google Zoeken en slimme Google-functies standaard instellen voor browsen</translation> @@ -4333,6 +4365,7 @@ <ph name="BR" /> <ph name="BEGIN_BOLD" />Opmerking:<ph name="END_BOLD" /> Het systeem wordt opnieuw opgestart tijdens het proces.</translation> <translation id="7829298379596169484">Audio-invoer openen</translation> +<translation id="7830594666202422257">Verbinden met Linux</translation> <translation id="7831491651892296503">Fout bij configureren van netwerk</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Eindtijd</translation> @@ -4362,6 +4395,7 @@ <translation id="7877451762676714207">Onbekende serverfout. Probeer het opnieuw of neem contact op met de serverbeheerder.</translation> <translation id="7877680364634660272">Rondleiding</translation> <translation id="7878562273885520351">Je wachtwoord is mogelijk gehackt</translation> +<translation id="7880823633812189969">Lokale gegevens worden verwijderd wanneer je opnieuw opstart</translation> <translation id="7881483672146086348">Account bekijken</translation> <translation id="7882358943899516840">Type provider</translation> <translation id="7885253890047913815">Recente bestemmingen</translation> @@ -4700,6 +4734,7 @@ <translation id="8426713856918551002">Inschakelen</translation> <translation id="8427292751741042100">ingesloten in een host</translation> <translation id="8428213095426709021">Instellingen</translation> +<translation id="8428628598981198790">Je beveiligingssleutel kan niet worden gebruikt voor deze site</translation> <translation id="84297032718407999">Je wordt uitgelogd over <ph name="LOGOUT_TIME_LEFT" /></translation> <translation id="8431190899827883166">Tikken weergeven</translation> <translation id="8431909052837336408">Pincode van simkaart wijzigen</translation> @@ -4904,6 +4939,7 @@ <translation id="8732212173949624846">Je browsegeschiedenis lezen en wijzigen voor alle ingelogde apparaten</translation> <translation id="8732844209475700754">Meer instellingen die verband houden met privacy, beveiliging en gegevensverzameling</translation> <translation id="8734073480934656039">Door deze instelling in te schakelen, kunnen kiosk-apps tijdens het starten automatisch worden gestart.</translation> +<translation id="8734671092194994316">Hiermee wordt je bezoek aan <ph name="WEBSITE" /> geregistreerd in je beveiligingssleutel.</translation> <translation id="873545264931343897">Wanneer het updaten van <ph name="PLUGIN_NAME" /> is voltooid, laad je de pagina opnieuw om de plug-in te activeren</translation> <translation id="8736288397686080465">Deze site is geüpdatet op de achtergrond.</translation> <translation id="8737685506611670901">Links voor <ph name="PROTOCOL" /> openen in plaats van <ph name="REPLACED_HANDLER_TITLE" /></translation> @@ -5003,6 +5039,7 @@ <translation id="8877448029301136595">[hoofddirectory]</translation> <translation id="8879284080359814990">Weergeven al&s tabblad</translation> <translation id="8883847527783433352">Synchroniseren met een ander account</translation> +<translation id="8884570509232205463">Je apparaat wordt nu vergrendeld om <ph name="UNLOCK_TIME" />.</translation> <translation id="8885197664446363138">Smart Lock is niet beschikbaar</translation> <translation id="8888253246822647887">Je app wordt geopend wanneer de upgrade is voltooid. Upgrades kunnen enkele minuten duren.</translation> <translation id="8888432776533519951">Kleur:</translation> @@ -5096,6 +5133,7 @@ <translation id="9026852570893462412">Dit proces kan enkele minuten duren. De virtuele machine wordt gedownload.</translation> <translation id="9027459031423301635">Link openen op nieuw &tabblad</translation> <translation id="9030515284705930323">Je organisatie heeft de Google Play Store niet ingeschakeld voor jouw account. Neem contact op met je beheerder voor meer informatie.</translation> +<translation id="9030785788945687215">Gmail</translation> <translation id="9033857511263905942">&Plakken</translation> <translation id="9037965129289936994">Origineel weergeven</translation> <translation id="9038649477754266430">Een voorspellingsservice gebruiken om pagina's sneller te laden</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index a9191a6..969871e 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -92,6 +92,7 @@ <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">தேடல் இன்ஜினை மாற்று</translation> <translation id="1134009406053225289">மறைநிலை சாளரத்தில் திற</translation> +<translation id="1136712381129578788">தவறான பின் பல முறை உள்ளிடப்பட்டதால் பாதுகாப்பு விசை பூட்டப்பட்டது. திறப்பதற்கு அதை அகற்றி மீண்டும் செருகவும்.</translation> <translation id="1137673463384776352"><ph name="APP" /> இல் இணைப்பைத் திற</translation> <translation id="1140351953533677694">உங்கள் Bluetooth மற்றும் தொடர் சாதனங்களை அணுகலாம்</translation> <translation id="1140610710803014750">உங்கள் எல்லா சாதனங்களிலும் புத்தகக்குறிகளைப் பெற, உள்நுழைந்து, ஒத்திசைவை இயக்கவும்.</translation> @@ -160,6 +161,7 @@ <translation id="1227507814927581609">"<ph name="DEVICE_NAME" />" உடன் இணைக்கும்போது அங்கீகரிப்புத் தோல்வியடைந்தது.</translation> <translation id="1231733316453485619">ஒத்திசைவை இயக்கவா?</translation> <translation id="1232569758102978740">தலைப்பிடாதது</translation> +<translation id="1233497634904001272">கோரிக்கையை நிறைவுசெய்ய பாதுகாப்பு விசையை மீண்டும் தொடவும்.</translation> <translation id="1233721473400465416">மொழி</translation> <translation id="1234808891666923653">சேவைப் பணியாளர்கள்</translation> <translation id="1235458158152011030">தெரிந்த நெட்வொர்க்குகள்autof</translation> @@ -201,6 +203,7 @@ <translation id="1303671224831497365">புளூடூத் சாதனங்கள் இல்லை</translation> <translation id="130491383855577612">Linux ஆப்ஸ் & கோப்புகள் வெற்றிகரமாக மாற்றப்பட்டன</translation> <translation id="1306606229401759371">அமைப்புகளை மாற்று</translation> +<translation id="1307165550267142340">உங்கள் பின் உருவாக்கப்பட்டது</translation> <translation id="1307559529304613120">அச்சச்சோ! இந்தச் சாதனத்திற்கான, நீண்டகால API அணுகல் டோக்கனை சேமிப்பதில் முறைமை தோல்வியடைந்தது.</translation> <translation id="1313405956111467313">தானியங்கு ப்ராக்ஸி உள்ளமைவு</translation> <translation id="131364520783682672">Caps Lock</translation> @@ -255,6 +258,7 @@ <translation id="1399511500114202393">பயனர் சான்றிதழ் இல்லை</translation> <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (மேற்பார்வையிடப்படும் பயனர்)</translation> <translation id="1406500794671479665">சரிபார்க்கிறது...</translation> +<translation id="140723521119632973">செல்லுலார் செயல்படுத்தல்</translation> <translation id="1407489512183974736">மையமாக வெட்டப்பட்டது</translation> <translation id="1408504635543854729">கோப்புகள் பயன்பாட்டில் சாதனத்தின் உள்ளடக்கத்தைத் தேடவும். உள்ளடக்கத்தை நிர்வாகி கட்டுப்படுத்துவதால் அதைத் திருத்த முடியாது.</translation> <translation id="1408789165795197664">மேம்பட்டவை...</translation> @@ -272,6 +276,7 @@ <translation id="1426870617281699524">மீண்டும் முயலவும் என்பதைக் கிளிக் செய்து, உங்கள் கணினியில் தோன்றும் அறிவிப்பை ஏற்கவும்</translation> <translation id="1427269577154060167">நாடு</translation> <translation id="142758023928848008">ஸ்டிக்கி விசைகளை இயக்கவும் (வரிசையாக தட்டச்சு செய்வதன் மூலம் விசைப்பலகை குறுக்குவழிகளை செயல்படுத்த)</translation> +<translation id="1429300045468813835">அனைத்தும் அழிக்கப்பட்டன</translation> <translation id="143027896309062157">உங்கள் கணினி மற்றும் நீங்கள் பார்வையிடும் இணையதளங்களில் உங்கள் எல்லா தரவையும் படிக்கலாம் மற்றும் திருத்தலாம்</translation> <translation id="1430915738399379752">அச்சிடுக</translation> <translation id="1432581352905426595">தேடல் இன்ஜின்களை நிர்வகி</translation> @@ -440,6 +445,7 @@ <translation id="1688935057616748272">ஓர் எழுத்தை உள்ளிடவும்</translation> <translation id="168991973552362966">அருகிலுள்ள பிரிண்டரைச் சேர்</translation> <translation id="1689945336726856614">&URLஐ நகலெடு</translation> +<translation id="1692109533452028989">உலாவியில் நீங்கள் உள்ளிடும் உரையை Chrome Googleளுக்கு அனுப்பும்</translation> <translation id="1692115862433274081">வேறொரு கணக்கைப் பயன்படுத்து</translation> <translation id="1692602667007917253">அச்சச்சோ, ஏதோ தவறு ஏற்பட்டது</translation> <translation id="1692799361700686467">பல தளங்களிலிருந்து வரும் குக்கீகள் அனுமதிக்கப்படுகின்றன.</translation> @@ -723,6 +729,7 @@ <translation id="2154710561487035718">URL ஐ நகலெடு</translation> <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> போல் தெரிகிறது</translation> <translation id="2156283799932971644">Googleளுக்குச் சில சாதனத் தகவல்களையும் பக்க உள்ளடக்கத்தையும் அனுப்புவதன் மூலம் பாதுகாப்பான உலாவலை மேம்படுத்த உதவலாம்.</translation> +<translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation> <translation id="215753907730220065">முழுத்திரையிலிருந்து வெளியேறு</translation> <translation id="2157875535253991059">இந்தப் பக்கம் இப்போது முழுத் திரையில்.</translation> <translation id="216169395504480358">வைஃபை ஐச் சேர்...</translation> @@ -730,6 +737,7 @@ <translation id="2163470535490402084">உங்கள் <ph name="DEVICE_TYPE" /> இல் உள்நுழைய இணையத்துடன் இணைக்கவும்.</translation> <translation id="2166369534954157698">அகர முதல எழுத்தெல்லாம் ஆதிபகவன் முதற்றே உலகு</translation> <translation id="2169062631698640254">எப்படியேனும் உள்நுழை</translation> +<translation id="2172784515318616985">தொடர்க</translation> <translation id="2173801458090845390">இந்தச் சாதனத்தில் கோரிக்கை ஐடியைச் சேர்</translation> <translation id="2175042898143291048">எப்போதும் இதைச் செய்</translation> <translation id="2175607476662778685">விரைவு தொடக்கப் பட்டி</translation> @@ -921,6 +929,7 @@ <translation id="2464089476039395325">HTTP ப்ராக்ஸி</translation> <translation id="2468205691404969808">அந்தப் பக்கங்களுக்குச் சென்றதில்லை என்றாலும், உங்கள் விருப்பத்தேர்வுகளை நினைவில்கொள்ள, குக்கீகளைப் பயன்படுத்தும்</translation> <translation id="2468402215065996499">தாமகோட்சி</translation> +<translation id="2469375675106140201">எழுத்துப்பிழைச் சரிபார்ப்பைத் தனிப்பயனாக்கு</translation> <translation id="247051149076336810">கோப்புப் பகிர்வு URL</translation> <translation id="2470702053775288986">ஆதரிக்கப்படாத நீட்டிப்புகள் முடக்கப்பட்டன</translation> <translation id="2473195200299095979">இந்தப் பக்கத்தை மொழிபெயர்</translation> @@ -935,6 +944,8 @@ <translation id="2487067538648443797">புதிய புத்தகக்குறியைச் சேர்</translation> <translation id="2489829450872380594">அடுத்த முறை, இந்த <ph name="DEVICE_TYPE" /> சாதனத்தை புதிய ஃபோன் திறக்கும். அமைப்புகளில் Smart Lockகை முடக்கலாம்.</translation> <translation id="2489918096470125693">&கோப்புறையைச் சேர்...</translation> +<translation id="2490481887078769936">பட்டியலிலிருந்து '<ph name="FILE_NAME" />' அகற்றப்பட்டது</translation> +<translation id="2490782392574942205">உங்கள் அனைத்துச் கணிணிகளிலும் நீட்டிப்புகளைப் பெற உள்நுழைந்து ஒத்திசைவை இயக்கவும்</translation> <translation id="249113932447298600">இந்த நேரத்தில் <ph name="DEVICE_LABEL" /> சாதனத்தை ஆதரிக்க முடியவில்லை. மன்னிக்கவும்.</translation> <translation id="249303669840926644">பதிவுசெய்தலை நிறைவுசெய்ய முடியவில்லை</translation> <translation id="2495777824269688114">அதிகமான அம்சங்களைப் பற்றி தெரிந்துகொள்ளுங்கள் அல்லது பதில்களைப் பெறுங்கள். உதவிக்கு, “?”ஐத் தேர்ந்தெடுக்கவும்.</translation> @@ -971,6 +982,7 @@ <translation id="253434972992662860">&இடைநிறுத்து</translation> <translation id="2534460670861217804">பாதுகாப்பான HTTP ப்ராக்ஸி</translation> <translation id="253557089021624350">கீப்அலைவ் கவுண்ட்</translation> +<translation id="2535799430745250929">செல்லுலார் நெட்வொர்க் எதுவுமில்லை</translation> <translation id="2538361623464451692">ஒத்திசைவு முடக்கப்பட்டது</translation> <translation id="2540449034743108469">நீட்டிப்பு நடவடிக்கைகளை கவனிக்க "தொடங்கு" என்பதை அழுத்தவும்</translation> <translation id="2541002089857695151">முழுத்திரை அலைபரப்பலை மேம்படுத்தவா?</translation> @@ -1035,6 +1047,7 @@ <translation id="2635094637295383009">Twitter</translation> <translation id="2635276683026132559">உள்நுழைகிறது</translation> <translation id="2636625531157955190">Chrome ஆல் படத்தை அணுக முடியாது.</translation> +<translation id="2637400434494156704">தவறான பின். இன்னும் ஒருமுறை முயலலாம்.</translation> <translation id="2638087589890736295">ஒத்திசைவைத் தொடங்க, கடவுச்சொற்றொடர் வேண்டும்</translation> <translation id="2642111877055905627">கால்பந்து</translation> <translation id="2643698698624765890">சாளரத்தின் மெனுவிலுள்ள நீட்டிப்புகள் என்பதைக் கிளிக் செய்து நீட்டிப்புகளை நிர்வகிக்கவும்.</translation> @@ -1146,6 +1159,7 @@ <translation id="2800760947029405028">படத்தை ஏற்று</translation> <translation id="2803375539583399270">பின்னை உள்ளிடவும்</translation> <translation id="2804043232879091219">மாற்று உலாவியைத் திறக்க முடியவில்லை</translation> +<translation id="2804680522274557040">கேமரா முடக்கப்பட்டுள்ளது</translation> <translation id="2805646850212350655">Microsoft Encrypting File System</translation> <translation id="2805756323405976993">ஆப்ஸ்</translation> <translation id="2806891468525657116">ஷார்ட்கட் ஏற்கனவே உள்ளது</translation> @@ -1457,11 +1471,13 @@ <translation id="3317459757438853210">இரு-பக்கம்</translation> <translation id="3317678681329786349">கேமராவும் மைக்ரோஃபோனும் தடுக்கப்பட்டன</translation> <translation id="3319048459796106952">புதிய &மறைநிலை சாளரம்</translation> +<translation id="3325910708063135066">Mac சிஸ்டம் விருப்பத்தேர்வுகளில் மைக்ரோஃபோன் மற்றும் கேமரா முடக்கப்பட்டுள்ளது</translation> <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation> <translation id="3331974543021145906">பயன்பாட்டுத் தகவல்</translation> <translation id="3334632933872291866"><ph name="WINDOW_TITLE" /> - பிக்ச்சர்-இன்-பிக்ச்சர் பயன்முறையில் வீடியோவை இயக்குகிறது</translation> <translation id="3335947283844343239">மூடப்பட்ட தாவலை மீண்டும் திற</translation> <translation id="3336664756920573711"><ph name="DEVICE_TYPE" /> சாதனத்தை உங்கள் Android ஃபோனைப் பயன்படுத்தித் திறக்கலாம்</translation> +<translation id="3341699307020049241">தவறான பின். இன்னும் <ph name="RETRIES" /> முறை முயலலாம்.</translation> <translation id="3341703758641437857">கோப்பு URLகளுக்கு அணுகலை அனுமதி</translation> <translation id="3342361181740736773">இந்த நீட்டிப்பை அகற்ற, "<ph name="TRIGGERING_EXTENSION_NAME" />" விரும்புகிறது</translation> <translation id="3345886924813989455">ஆதரிக்கின்ற உலாவி கிடைக்கவில்லை</translation> @@ -1488,6 +1504,7 @@ <translation id="3382200254148930874">கண்காணிப்பை நிறுத்துகிறது...</translation> <translation id="3385092118218578224"><ph name="DISPLAY_ZOOM" />%</translation> <translation id="338583716107319301">பிரிப்பான்</translation> +<translation id="3387614642886316601">மேம்பட்ட எழுத்துப் பிழை சரிபார்ப்பானைப் பயன்படுத்து</translation> <translation id="3389312115541230716">பணிப்பட்டியில் உள்ள <ph name="SMALL_PRODUCT_LOGO" /> ஐகானை வலது கிளிக் செய்யவும்</translation> <translation id="3393352139658145068">எவரேனும் “Ok Google” என்று சொல்லும்போது அசிஸ்டண்ட் செயல்படத் தொடங்கும். பேட்டரியைச் சேமிக்க, சாதனம் சார்ஜ் செய்யப்படும்போது மட்டும் “Ok Google” வசதி இயக்கப்பட்டிருக்கும்.</translation> <translation id="3396800784455899911">"ஏற்றுக்கொண்டு, தொடர்க" பட்டனைக் கிளிக் செய்வதன் மூலம், இந்த Google சேவைகளுக்காக மேலே விவரிக்கப்பட்டுள்ள செயலாக்க நடைமுறைகளை ஏற்கிறீர்கள்.</translation> @@ -1722,6 +1739,7 @@ <translation id="3729506734996624908">அனுமதிக்கப்பட்ட தளங்கள்</translation> <translation id="3731997362820527097">பாதுகாப்பு விசையைத் தேர்ந்தெடுத்தல்</translation> <translation id="3732078975418297900"><ph name="ERROR_LINE" />வது வரியில் பிழை</translation> +<translation id="3732530910372558017">பின்னில் அதிகப்பட்சம் 63 எழுத்துகள் வரை இருக்க வேண்டும்</translation> <translation id="3733127536501031542">அதிகமாக்குதலுடனான SSL சேவையகம்</translation> <translation id="3735740477244556633">இதன்படி வரிசைப்படுத்து</translation> <translation id="3737274407993947948">Linuxஸை நிறுவும்போது பிழை ஏற்பட்டது...</translation> @@ -1754,6 +1772,7 @@ <translation id="3776796446459804932">Chrome இணைய அங்காடிக் கொள்கையை இந்த நீட்டிப்பு மீறுகிறது.</translation> <translation id="3777806571986431400">நீட்டிப்பு இயக்கப்பட்டது</translation> <translation id="3778152852029592020">பதிவிறக்கம் ரத்துசெய்யப்பட்டது.</translation> +<translation id="3778208826288864398">தவறான பின் பல முறை உள்ளிடப்பட்டதால் பாதுகாப்பு விசை பூட்டப்பட்டது. பாதுகாப்பு விசையை மீட்டமைக்க வேண்டியிருக்கும்.</translation> <translation id="3778740492972734840">&டெவெலப்பர் கருவிகள்</translation> <translation id="3778868487658107119">அதனிடம் கேள்விகளைக் கேட்கலாம். பணிகளைச் செய்யும்படி சொல்லலாம். இது உங்கள் தனிப்பட்ட Google, உங்களுக்கு உதவுவதற்காக எப்போதும் தயாராக இருக்கும்.</translation> <translation id="378312418865624974">இந்தக் கணினிக்கான தனிப்பட்ட அடையாளங்காட்டியைப் படிக்கலாம்</translation> @@ -1764,6 +1783,7 @@ <translation id="3789841737615482174">நிறுவுக</translation> <translation id="379082410132524484">கார்டு காலாவதியாகிவிட்டது</translation> <translation id="3792890930871100565">பிரிண்டர்களைத் துண்டி</translation> +<translation id="3792938779249970121">கணக்கைத் தேர்ந்தெடுக்கவும்</translation> <translation id="3796648294839530037">பிடித்த நெட்வொர்க்குகள்:</translation> <translation id="3797739167230984533">உங்கள் நிறுவனம் உங்களுடைய <ph name="BEGIN_LINK" /><ph name="DEVICE_TYPE" /> சாதனத்தை நிர்வகிக்கிறது<ph name="END_LINK" /></translation> <translation id="3797900183766075808"><ph name="SEARCH_ENGINE" /> இல் “<ph name="SEARCH_TERMS" />” எனத் &தேடு</translation> @@ -1852,6 +1872,7 @@ <translation id="3915280005470252504">குரலினால் தேடு</translation> <translation id="3916445069167113093">இவ்வகையான கோப்பு உங்கள் கணினியைப் பாதிக்கக்கூடும். இருப்பினும் <ph name="FILE_NAME" /> ஐ வைத்திருக்க வேண்டுமா?</translation> <translation id="3918972485393593704">Googleக்கு விவரங்களை அனுப்பு</translation> +<translation id="3919145445993746351">உங்கள் அனைத்துக் கணிணிகளிலும் நீட்டிப்புகளைப் பெற, ஒத்திசைவை இயக்கவும்</translation> <translation id="3920504717067627103">சான்றிதழ் கொள்கைகள்</translation> <translation id="392089482157167418">ChromeVox (பேச்சுவடிவ கருத்து) ஐ இயக்கு</translation> <translation id="3924145049010392604">Meta</translation> @@ -1954,6 +1975,7 @@ <translation id="407520071244661467">அளவு</translation> <translation id="4075639477629295004"><ph name="FILE_NAME" />ஐ அலைபரப்ப முடியவில்லை.</translation> <translation id="4077917118009885966">இந்தத் தளத்தில் விளம்பரங்கள் தடுக்கப்பட்டன</translation> +<translation id="4079140982534148664">மேம்பட்ட எழுத்துப் பிழை சரிபார்ப்பானைப் பயன்படுத்து</translation> <translation id="4081242589061676262">கோப்பை அலைபரப்ப முடியவில்லை.</translation> <translation id="4084682180776658562">புக்மார்க்</translation> <translation id="4084835346725913160"><ph name="TAB_NAME" />ஐ மூடு</translation> @@ -1969,6 +1991,7 @@ <translation id="4090947011087001172"><ph name="SITE" />க்கான தள அனுமதிகளை மீட்டமைக்கவா?</translation> <translation id="4091434297613116013">தாள்கள்</translation> <translation id="4093955363990068916">அகக் கோப்பு:</translation> +<translation id="4095264805865317199">செல்லுலார் செயல்படுத்தலுக்கான UIயைத் திற</translation> <translation id="4095507791297118304">முதன்மைத் திரை</translation> <translation id="409579654357498729">கிளவுடு அச்சில் சேர்</translation> <translation id="4096508467498758490">டெவெலப்பர் பயன்முறை நீட்டிப்புகளை முடக்கவும்</translation> @@ -1986,8 +2009,10 @@ <translation id="4115002065223188701">நெட்வொர்க் தொடர்பு எல்லைக்கு வெளியே உள்ளது</translation> <translation id="4115080753528843955">பாதுகாக்கப்பட்ட உள்ளடக்கத்திற்கான அணுகலை அங்கீகரிக்கும் நோக்கங்களுக்காக, சில உள்ளடக்கச் சேவைகள் தனித்துவ அடையாளங்காட்டிகளைப் பயன்படுத்துகின்றன</translation> <translation id="4118579674665737931">சாதனத்தை மீண்டும் தொடங்கி, அமைக்க முயலவும்.</translation> +<translation id="4120388883569225797">இந்தப் பாதுகாப்பு விசையை மீட்டமைக்க முடியவில்லை</translation> <translation id="4120817667028078560">பாதை மிக நீளம்</translation> <translation id="4121428309786185360">அன்று காலாவதியாகிறது</translation> +<translation id="4124823734405044952">உங்கள் பாதுகாப்பு விசை மீட்டமைக்கப்பட்டது</translation> <translation id="4124935795427217608">கொம்புக் குதிரை</translation> <translation id="412730574613779332">ஸ்பான்டெக்ஸ்</translation> <translation id="412940972494182898">இந்த முறை Flashஐ இயக்கு</translation> @@ -2029,6 +2054,7 @@ <translation id="4206323443866416204">கருத்து அறிக்கை</translation> <translation id="4208390505124702064"><ph name="SITE_NAME" /> இல் தேடு</translation> <translation id="4209092469652827314">பெரிய</translation> +<translation id="4209251085232852247">முடக்கப்பட்டுள்ளது</translation> <translation id="4209464433672152343">ஆவணங்களை அச்சிடுவதற்குத் தயார்படுத்த, அவை <ph name="BEGIN_LINK_HELP" />Googleளுக்கு அனுப்பப்படும்<ph name="END_LINK_HELP" />. <ph name="BEGIN_LINK_DASHBOARD" />Google கிளவுட் பிரிண்ட் டாஷ்போர்டில்<ph name="END_LINK_DASHBOARD" /> உங்கள் பிரிண்டர்களையும் பிரிண்டர் வரலாற்றையும் பார்க்கலாம், திருத்தலாம் மற்றும் நிர்வகிக்கலாம்.</translation> <translation id="421182450098841253">புக்மார்க்ஸ் பட்டியைக் &காட்டு</translation> <translation id="4211851069413100178">உபயோகம் & கண்டறிதல் தரவை அனுப்புக. கண்டறிதல் தரவு, சாதனம் மற்றும் ஆப்ஸ் உபயோகத் தரவு போன்றவற்றை Googleளுக்குத் தானாக அனுப்புவதன் மூலம் உங்கள் Android அனுபவத்தை மேம்படுத்த உதவுக. இது சிஸ்டம் மற்றும் ஆப்ஸின் நிலைத்தன்மையை மேம்படுத்தவும் பிற மேம்பாடுகளைச் செய்யவும் உதவும். ஒருங்கிணைக்கப்பட்ட சில தரவுகள், Google ஆப்ஸ் மற்றும் Android டெவெலப்பர்கள் போன்ற கூட்டாளர்களுக்கும் உதவும். உரிமையாளர் இந்த <ph name="BEGIN_LINK1" />அமைப்பைச்<ph name="END_LINK1" /> செயல்படுத்தியுள்ளார். உரிமையாளர் இந்தச் சாதனத்தின் கண்டறிதல் தரவையும் உபயோகத் தரவையும் Googleளுக்கு அனுப்புவதற்குத் தேர்வுசெய்யலாம். கூடுதல் ’இணையம் & ஆப்ஸ் செயல்பாடு’ அமைப்பு இயக்கப்பட்டிருந்தால், இந்தத் தரவு உங்கள் Google கணக்கில் சேமிக்கப்படலாம். <ph name="BEGIN_LINK2" />மேலும் அறிக<ph name="END_LINK2" /></translation> @@ -2216,6 +2242,7 @@ <translation id="4546308221697447294">Google Chromeஐப் பயன்படுத்தி, விரைவாக உலாவவும்</translation> <translation id="4547659257713117923">பிற சாதனங்களின் தாவல்கள் எதுவுமில்லை</translation> <translation id="4547672827276975204">தானாக அமை</translation> +<translation id="4551763574344810652">செயல்தவிர்க்க <ph name="MODIFIER_KEY_DESCRIPTION" />ஐ அழுத்தவும்</translation> <translation id="4552089082226364758">ஃப்ளாஷ்</translation> <translation id="4554591392113183336">ஏற்கனவே இருப்பதுடன் ஒப்பிடும் போது வெளிப்புற நீட்டிப்பு ஒரே அல்லது குறைவான பதிப்பைக் கொண்டுள்ளது.</translation> <translation id="4555769855065597957">நிழல்</translation> @@ -2312,6 +2339,7 @@ <translation id="4711638718396952945">அமைப்புகளை மீட்டெடு</translation> <translation id="4715553623069266137">மிகவும் குறுகியது (0.8வி)</translation> <translation id="4716483597559580346">கூடுதல் பாதுகாப்பிற்கு, பவர்வாஷ் செய்யவும்</translation> +<translation id="4718490098585891067">உள்நுழைய கணக்கைத் தேர்ந்தெடுக்கவும்:</translation> <translation id="4720113199587244118">சாதனங்களைச் சேர்</translation> <translation id="4720185134442950733">மொபைல் டேட்டா நெட்வொர்க்</translation> <translation id="4722735765955348426"><ph name="USERNAME" /> இன் கடவுச்சொல்</translation> @@ -2556,6 +2584,7 @@ <translation id="5111692334209731439">&புக்மார்க் மேனேஜர்</translation> <translation id="5112577000029535889">&டெவலப்பர் கருவிகள்</translation> <translation id="5113739826273394829">இந்த ஐகானைக் கிளிக் செய்தால், இந்த <ph name="DEVICE_TYPE" />ஐக் கைமுறையாகப் பூட்ட வேண்டும். அடுத்த முறை, திறப்பதற்கு உங்கள் கடவுச்சொல்லை உள்ளிட வேண்டும்.</translation> +<translation id="51143538739122961">பாதுகாப்பு விசையைச் செருகி அதைத் தட்டவும்</translation> <translation id="5115309401544567011"><ph name="DEVICE_TYPE" /> சாதனத்தைச் சார்ஜ் செய்யவும்.</translation> <translation id="5115338116365931134">SSO</translation> <translation id="5116628073786783676">ஆடியோவை இவ்வாறு சே&மி...</translation> @@ -2642,6 +2671,7 @@ <translation id="52550593576409946">கியோஸ்க் பயன்பாட்டைத் தொடங்க முடியவில்லை.</translation> <translation id="5255859108402770436">மீண்டும் உள்நுழைக</translation> <translation id="5256861893479663409">எல்லாத் தளங்களிலும்</translation> +<translation id="5258992782919386492">இந்தச் சாதனத்தில் நிறுவு</translation> <translation id="5260508466980570042">மன்னிக்கவும், உங்கள் மின்னஞ்சலையும் கடவுச்சொல்லையும் சரிபார்க்க முடியவில்லை. தயவுசெய்து மீண்டும் முயற்சி செய்க.</translation> <translation id="5261683757250193089">இணைய அங்காடியில் திற</translation> <translation id="5264148714798105376">இதற்கு ஒரு நிமிடம் அல்லது அதற்கும் மேல் ஆகலாம்.</translation> @@ -2679,6 +2709,7 @@ <translation id="5305688511332277257">எதுவும் நிறுவப்படவில்லை</translation> <translation id="5307030433605830021">மூல உள்ளடக்கம் ஆதரிக்கப்படவில்லை</translation> <translation id="5308380583665731573">இணை</translation> +<translation id="5310281978693206542">எனது சாதனங்களுக்கு இணைப்பை அனுப்பு</translation> <translation id="5311304534597152726">பின்வரும் முகவரி மூலம் உள்நுழைகிறீர்கள்:</translation> <translation id="5315873049536339193">அடையாளம்</translation> <translation id="5317780077021120954">சேமி</translation> @@ -2720,6 +2751,7 @@ <translation id="537813040452600081">இந்தச் சாளரத்தில் நீங்கள் பார்க்கும் பக்கங்கள், உலாவி வரலாற்றில் தோன்றாது, மேலும் நீங்கள் வெளியேறிய பிறகு, பிற தடங்களான குக்கீகள் போன்றவற்றை கணினியில் விட்டுச் செல்லாது. நீங்கள் பதிவிறக்கிய கோப்புகள் மற்றும் உருவாக்கிய புக்மார்க்குகள் பாதுகாக்கப்படாது.</translation> <translation id="5379140238605961210">மைக்ரோஃபோன் அணுகலை தொடர்ந்து தடு</translation> <translation id="5382591305415226340">ஆதரிக்கப்படும் இணைப்புகளை நிர்வகி</translation> +<translation id="5383377866517186886">Mac சிஸ்டம் விருப்பத்தேர்வுகளில் கேமரா முடக்கப்பட்டுள்ளது</translation> <translation id="5384883051496921101">இந்தத் தளமானது மறைநிலைக்கு வெளியே உள்ள பயன்பாட்டுடன் தகவலைப் பகிரவிருக்கிறது.</translation> <translation id="5388885445722491159">சேர்க்கப்பட்டவை</translation> <translation id="5389237414310520250">புதிய பயனரை உருவாக்க முடியவில்லை. உங்கள் ஹார்ட் டிரைவில் உள்ள இடத்தையும் அனுமதிகளையும் சரிபார்த்து மீண்டும் முயலவும்.</translation> @@ -2739,6 +2771,7 @@ <translation id="5420438158931847627">உரை மற்றும் படங்களின் கூர்மையைத் தீர்மானிக்கிறது</translation> <translation id="5422221874247253874">ஆக்சஸ் பாயிண்ட்</translation> <translation id="5422781158178868512">வெளிப்புற சேகரிப்பு சாதனத்தை அறிய முடியவில்லை. மன்னிக்கவும்.</translation> +<translation id="5423829801105537712">அடிப்படை எழுத்துப்பிழைச் சரிபார்ப்பு</translation> <translation id="5423849171846380976">செயலாக்கப்பட்டது</translation> <translation id="5425042808445046667">பதிவிறக்கத்தைத் தொடர்க</translation> <translation id="5425722269016440406">Smart Lockகை முடக்க ஆன்லைனில் இருப்பது அவசியம். ஏனெனில் இந்த அமைப்பு உங்கள் மொபைலிலும் பிற சாதனங்களிலும் ஒத்திசைக்கப்பட்டுள்ளது. முதலில் நெட்வொர்க்குடன் இணைக்கவும்.</translation> @@ -3114,6 +3147,7 @@ <translation id="5973605538625120605">பின்னை மாற்றுதல்</translation> <translation id="5975792506968920132">பேட்டரி சார்ஜ் சதவீதம்</translation> <translation id="5976160379964388480">மற்றவை</translation> +<translation id="5978277834170881274">&அடிப்படை எழுத்துப் பிழை சரிபார்ப்பானைப் பயன்படுத்து</translation> <translation id="5979421442488174909"><ph name="LANGUAGE" /> க்கு &மொழிபெயர்</translation> <translation id="5979469435153841984">பக்கங்களைப் புத்தகக்குறியிட, முகவரிப் பட்டியிலுள்ள நட்சத்திரத்தைக் கிளிக் செய்யவும்</translation> <translation id="5984222099446776634">சமீபத்தில் பார்த்தவை</translation> @@ -3170,6 +3204,7 @@ <translation id="6057381398996433816">நகர்வு மற்றும் ஒளி சென்சார்களைப் பயன்படுத்துவதிலிருந்து இந்தத் தளம் தடைசெய்யப்பட்டுள்ளது.</translation> <translation id="6059652578941944813">சான்றிதழ் படிநிலை</translation> <translation id="6059925163896151826">USB சாதனங்கள்</translation> +<translation id="6061882183774845124">எனது சாதனங்களுக்கு இணைப்பை அனுப்பு</translation> <translation id="6064217302520318294">திரைப் பூட்டு</translation> <translation id="6065289257230303064">சான்றிதழ் பொருள் கோப்பக பண்புக்கூறுகள்</translation> <translation id="6069671174561668781">வால்பேப்பரை அமை</translation> @@ -3213,7 +3248,7 @@ <translation id="6122095009389448667">இந்தத் தளம், கிளிப்போர்டைப் பார்ப்பதைத் தொடர்ந்து தடைசெய்</translation> <translation id="6122875415561139701">எழுதுதல் செயல்பாடு இந்தச் சாதனத்தில் அனுமதிக்கப்படவில்லை: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">பின்வரும் நீட்டிப்புகள் இந்த நீட்டிப்பைச் சார்ந்தவை:</translation> -<translation id="6124698108608891449">இந்த இணையதளத்திற்குக் கூடுதல் அனுமதிகள் தேவை.</translation> +<translation id="6124698108608891449">இந்தத் தளத்திற்குக் கூடுதல் அனுமதிகள் தேவை.</translation> <translation id="6125479973208104919"><ph name="DEVICE_TYPE" /> இல் உங்கள் கணக்கை மீண்டும் சேர்க்க வேண்டும்.</translation> <translation id="6129691635767514872">தேர்ந்தெடுத்த தரவு, Chrome மற்றும் ஒத்திசைக்கப்பட்ட சாதனங்களிலிருந்து அகற்றப்பட்டது. உங்கள் Google கணக்கு <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> எனும் தளத்தில் பிற Google சேவைகளிலிருந்து தேடல்கள், செயல்பாடு போன்ற உலாவல் வரலாறு தொடர்பான பிற தகவல்களைக் கொண்டிருக்கலாம்.</translation> <translation id="6129938384427316298">Netscape சான்றிதழ் கருத்துரை</translation> @@ -3328,6 +3363,7 @@ <translation id="6305607932814307878">ஒட்டுமொத்தக் கொள்கை:</translation> <translation id="6307990684951724544">கணினி பணிமிகுதியில் உள்ளது</translation> <translation id="6308937455967653460">இணை&ப்பை இவ்வாறு சேமி…</translation> +<translation id="6309510305002439352">மைக்ரோஃபோன் முடக்கப்பட்டுள்ளது</translation> <translation id="6311220991371174222">Chromeஐத் தொடங்க முடியவில்லை. ஏனெனில், சுயவிவரத்தைத் திறக்கும் போது ஏதோ தவறாகிவிட்டது. Chromeஐ மீண்டும் தொடங்கவும்.</translation> <translation id="6312403991423642364">அறியப்படாத நெட்வொர்க் பிழை</translation> <translation id="6313641880021325787">VR இலிருந்து வெளியேறு</translation> @@ -3475,6 +3511,7 @@ <translation id="6544215763872433504">Google உங்களுக்காக வழங்கும் இணைய உலாவி</translation> <translation id="6545665334409411530">மீண்டும் இயக்குவதன் வீதம்</translation> <translation id="6545834809683560467">தேடல்களையும், முகவரிப் பட்டி அல்லது ஆப்ஸ் துவக்கியின் தேடல் பெட்டியில் தட்டச்சு செய்யப்பட்ட URLகளையும் நிறைவு செய்ய யூகச் சேவையைப் பயன்படுத்தவும்</translation> +<translation id="6545867563032584178">Mac சிஸ்டம் விருப்பத்தேர்வுகளில் மைக்ரோஃபோன் முடக்கப்பட்டுள்ளது</translation> <translation id="6547316139431024316">இந்த நீட்டிப்புக்காக மீண்டும் எச்சரிக்க வேண்டாம்</translation> <translation id="6547354035488017500">குறைந்தது 512 மெ.பை. இடத்தைக் காலியாக்கவும் அல்லது உங்கள் சாதனம் இயங்காது. இடத்தைக் காலியாக்க, சாதனத்தின் சேமிப்பகத்தில் இருந்து கோப்புகளை நீக்கவும்.</translation> <translation id="6550675742724504774">விருப்பத்தேர்வுகள்</translation> @@ -3490,6 +3527,7 @@ <translation id="6564072216966459757"><ph name="DEVICE_TYPE" /> சாதனத்தின் Linux ஆப்ஸை அகற்று</translation> <translation id="6567688344210276845">பக்கச் செயல்பாட்டிற்காக படவுரு '<ph name="ICON" />' ஐ ஏற்ற முடியவில்லை.</translation> <translation id="6571979863037191371">Chromebookகிலிருந்து உங்கள் ஃபோனின் இணைப்பை துண்டிக்கவும். அவை இனி தானாக இணைக்கப்படாது.</translation> +<translation id="6573998787994398565">பொதுவாக <ph name="FILE_NAME" /> பதிவிறக்கப்படாது அத்துடன் இது ஆபத்துக்குரியதாக இருக்கலாம். மேம்பட்ட பாதுகாப்பின் மூலம் பாதுகாக்கப்பட்டுள்ளீர்கள்.</translation> <translation id="657402800789773160">&இந்த பக்கத்தை மீண்டும் ஏற்றுக</translation> <translation id="6577284282025554716">பதிவிறக்கம் ரத்துசெய்யப்பட்டது: <ph name="FILE_NAME" /></translation> <translation id="6578664922716508575">ஒத்திசைக்கப்பட்ட கடவுச்சொற்களை எனது Google பயனர்பெயர் மற்றும் கடவுச்சொல் மூலம் என்கிரிப்ட் செய்</translation> @@ -3719,6 +3757,7 @@ <translation id="6951153907720526401">பேமண்ட் ஹேண்ட்லர்கள்</translation> <translation id="6953878494808481632">தொடர்புடைய தகவல்</translation> <translation id="6955446738988643816">பாப்அப் கண்காணிப்பு</translation> +<translation id="6957044667612803194">இந்தப் பாதுகாப்பு விசை பின்களை ஆதரிக்கவில்லை</translation> <translation id="6957231940976260713">சேவைப் பெயர்</translation> <translation id="6964390816189577014">நாயகன்</translation> <translation id="6964760285928603117">குழுவிலிருந்து அகற்று</translation> @@ -3744,6 +3783,7 @@ <translation id="6985607387932385770">பிரிண்டர்கள்</translation> <translation id="6990778048354947307">அடர்த்தியான தீம்</translation> <translation id="6991665348624301627">இலக்கைத் தேர்ந்தெடு</translation> +<translation id="6992554835374084304">மேம்பட்ட எழுத்துப் பிழை சரிபார்ப்பானை இயக்கு</translation> <translation id="6997642619627518301"><ph name="NAME_PH" /> - செயல்பாட்டுப் பதிவு</translation> <translation id="6997707937646349884">உங்கள் சாதனங்களில்:</translation> <translation id="6998793565256476099">வீடியோ கலந்துரையாடலுக்கு, சாதனத்தைப் பதிவுசெய்</translation> @@ -3885,6 +3925,7 @@ <translation id="720715819012336933">{NUM_PAGES,plural, =1{பக்கத்திலிருந்து வெளியேறு}other{பக்கங்களிலிருந்து வெளியேறு}}</translation> <translation id="7207631048330366454">ஆப்ஸில் தேடுக</translation> <translation id="7210499381659830293">நீட்டிப்பு பிரிண்டர்கள்</translation> +<translation id="7212097698621322584">தற்போதைய பின்னை மாற்ற அதை உள்ளிடவும். பின் தெரியவில்லை என்றால் புதிய பின்னை உருவாக்க பாதுகாப்பு விசையை மீட்டமைக்க வேண்டும்.</translation> <translation id="721467499098558573">உங்கள் பாதுகாப்பு விசையில் உள்ள பட்டனைக் குறைந்தது 5 வினாடிகளுக்கு அழுத்திப் பிடித்திருக்கவும்</translation> <translation id="7216409898977639127">செல்லுலார் வழங்குநர்</translation> <translation id="7216595297012131718">உங்கள் விருப்பத்தேர்வின் அடிப்படையில் மொழிகளை வரிசைப்படுத்தவும்</translation> @@ -3892,6 +3933,7 @@ <translation id="722055596168483966">Google சேவைகளைத் தனிப்பயனாக்கு</translation> <translation id="7221855153210829124">அறிவிப்புகளைக் காட்டுதல்</translation> <translation id="7221869452894271364">இந்தப் பக்கத்தை மீண்டும் ஏற்று</translation> +<translation id="7222204278952406003">Chrome உங்களது இயல்பான உலாவியாகும்</translation> <translation id="7222232353993864120">மின்னஞ்சல் முகவரி</translation> <translation id="7225179976675429563">நெட்வொர்க் வகை இல்லை</translation> <translation id="7228479291753472782">புவி இருப்பிடம், மைக்ரோஃபோன், கேமரா போன்ற அம்சங்களை, இணையதளங்கள் பயன்படுத்தலாமா வேண்டாமா என்பதைக் குறிக்கும் அமைப்புகளை மாற்றலாம்.</translation> @@ -3907,6 +3949,7 @@ <translation id="7241443820034350811">உங்கள் பாதுகாப்பு விசை பட்டியலிடப்படவில்லை என்றால், அதன் பட்டனை குறைந்தது 5 வினாடிகளுக்கு அழுத்தவும்.</translation> <translation id="7243632151880336635">அழித்து, வெளியேறு</translation> <translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (சிறந்தது)</translation> +<translation id="7246230585855757313">உங்கள் பாதுகாப்பு விசையை மீண்டும் செருகி முயலவும்</translation> <translation id="7246947237293279874">FTP ப்ராக்ஸி</translation> <translation id="725109152065019550">மன்னிக்கவும், உங்கள் கணக்கில் வெளிப்புறச் சேமிப்பை நிர்வாகி முடக்கியுள்ளார்.</translation> <translation id="7251346854160851420">இயல்பு வால்பேப்பர்</translation> @@ -3954,6 +3997,7 @@ <translation id="7309257895202129721">&கட்டுப்பாடுகளைக் காண்பி</translation> <translation id="7310598146671372464">உள்நுழைய முடியவில்லை. குறிப்பிடப்பட்டுள்ள Kerberos என்க்ரிப்ஷன் வகைகளைச் சேவையகம் ஆதரிக்கவில்லை. உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation> <translation id="7311079019872751559">சாண்ட்பாக்ஸ் செய்யப்படாத செருகுநிரல் அணுகல்</translation> +<translation id="73174032666024687"><ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation> <translation id="7321545336522791733">சேவையகத்தைத் தொடர்புகொள்ள முடியவில்லை</translation> <translation id="7324297612904500502">பீட்டா மன்றம்</translation> <translation id="7325437708553334317">உயர் நிறமாறுபாடு நீட்டிப்பு</translation> @@ -3962,6 +4006,7 @@ <translation id="7329154610228416156">பாதுகாப்பற்ற URLஐப் (<ph name="BLOCKED_URL" />) பயன்படுத்தும்படி உள்ளமைக்கப்பட்டதால் உள்நுழைவு தோல்வியானது. உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation> <translation id="7334190995941642545">தற்போது Smart Lock கிடைக்கவில்லை. பின்னர் முயற்சிக்கவும்.</translation> <translation id="7334274148831027933">டாக் செய்யப்பட்ட பெரிதாக்கியை இயக்கு</translation> +<translation id="7335974957018254119">எழுத்துப்பிழைச் சரிபார்ப்பை இதற்குப் பயன்படுத்தவும்</translation> <translation id="7338630283264858612">சாதன வரிசை எண் தவறானது.</translation> <translation id="7339763383339757376">PKCS #7, ஒற்றைச் சான்றிதழ்</translation> <translation id="7339785458027436441">Check Spelling While Typing</translation> @@ -4038,6 +4083,7 @@ <translation id="7453008956351770337">இந்தப் பிரிண்டரைத் தேர்ந்தெடுப்பதன் மூலம், பின்வரும் நீட்டிப்பு உங்கள் பிரிண்டரை அணுகுவதற்கான அனுமதியை வழங்குகிறீர்கள்:</translation> <translation id="7456142309650173560">dev</translation> <translation id="7456847797759667638">இருப்பிடத்தைத் திற...</translation> +<translation id="7458168200501453431">Google தேடலில் பயன்படுத்தப்படும் அதே பிழைத்திருத்தியைப் பயன்படுத்தும். உலாவியில் நீங்கள் உள்ளிடும் உரை Googleளுக்கு அனுப்பப்படும்.</translation> <translation id="7461924472993315131">நிலையாக வை</translation> <translation id="746216226901520237">அடுத்த முறை, உங்கள் ஃபோன் <ph name="DEVICE_TYPE" /> சாதனத்தைத் திறக்கும். அமைப்புகளில் Smart Lockகை முடக்கலாம்.</translation> <translation id="7463006580194749499">நபரைச் சேர்</translation> @@ -4053,6 +4099,7 @@ <translation id="748138892655239008">சான்றிதழ் அடிப்படை கட்டுப்பாடுகள்</translation> <translation id="7487067081878637334">தொழில்நுட்பம்</translation> <translation id="7487099628810939106">கிளிக் செய்யுமுன் தாமதிக்க:</translation> +<translation id="7487141338393529395">மேம்பட்ட எழுத்துப் பிழை சரிபார்ப்பானை இயக்கு</translation> <translation id="7487969577036436319">கூறுகள் எதுவும் நிறுவப்படவில்லை</translation> <translation id="7489355918927585587">{COUNT,plural, =0{&எல்லாம் திற}=1{&புத்தகக்குறியைத் திற}other{&எல்லாவற்றையும் (#) திற}}</translation> <translation id="749028671485790643">நபர் <ph name="VALUE" /></translation> @@ -4138,6 +4185,7 @@ <translation id="7631887513477658702">&எப்போதும் இந்த வகை கோப்புகளைத் திற</translation> <translation id="7632948528260659758">பின்வரும் கியோஸ்க் பயன்பாடுகளைப் புதுப்பிப்பதில் தோல்வி:</translation> <translation id="763632859238619983">பேமண்ட் ஹேண்ட்லர்களை நிறுவுவதற்கு எந்தத் தளத்தையும் அனுமதிக்காதே</translation> +<translation id="7636919061354591437">இந்தச் சாதனத்தில் நிறுவு</translation> <translation id="7638605456503525968">சீரியல் போர்ட்டுகள்</translation> <translation id="7639178625568735185">புரிந்தது!</translation> <translation id="764017888128728"><ph name="PASSWORD_MANAGER_BRAND" /> நீங்கள் சேமித்த கடவுச்சொற்களைப் பயன்படுத்தி தகுதியுள்ள தளங்களில் உங்களைத் தானாக உள்நுழையச் செய்யும்.</translation> @@ -4160,9 +4208,11 @@ <translation id="7663719505383602579">ரிசீவர்: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="7664620655576155379">ஆதரிக்கப்படாத புளூடூத் சாதனம்: "<ph name="DEVICE_NAME" />".</translation> <translation id="7665369617277396874">கணக்கைச் சேர்</translation> +<translation id="7669825497510425694">{NUM_ATTEMPTS,plural, =1{தவறான பின். இன்னும் ஒருமுறை முயலலாம்.}other{தவறான பின். இன்னும் # முறை முயலலாம்.}}</translation> <translation id="7671130400130574146">முறைமை தலைப்புப் பட்டியையும் கரைகளையும் பயன்படுத்து</translation> <translation id="7672520070349703697"><ph name="PAGE_TITLE" /> இல் <ph name="HUNG_IFRAME_URL" />.</translation> <translation id="7676867886086876795">உரை புலங்களில் நீங்கள் சொல்வதை எழுதும் வசதியை அனுமதிக்க, Googleளுக்கு உங்கள் குரலை அனுப்பும்.</translation> +<translation id="7678280409648629969">மறைநிலையை விட்டு வெளியேறிய பிறகு உள்நுழைவு பற்றிய தரவு Chromeமில் சேமிக்கப்படும். இந்த இணையதளத்தில் Touch IDயைப் பின்னர் பயன்படுத்த இது உங்களை அனுமதிக்கும்.</translation> <translation id="7681095912841365527">தளத்தால் புளூடூத்தைப் பயன்படுத்த முடியும்</translation> <translation id="7683373461016844951">தொடர, சரி என்பதைக் கிளிக் செய்யவும், உங்கள் <ph name="DOMAIN" /> மின்னஞ்சல் முகவரிக்குப் புதிய சுயவிவரத்தை உருவாக்க, நபரைச் சேர் என்பதைக் கிளிக் செய்யவும்.</translation> <translation id="7684212569183643648">உங்கள் நிர்வாகி நிறுவினார்</translation> @@ -4173,6 +4223,7 @@ <translation id="7690294790491645610">புதிய கடவுச்சொல்லை உறுதிப்படுத்துக</translation> <translation id="7690378713476594306">பட்டியலில் இருந்து தேர்வு செய்யவும்</translation> <translation id="7690853182226561458">&கோப்புறையைச் சேர்...</translation> +<translation id="7691077781194517083">இந்தப் பாதுகாப்பு விசையை மீட்டமைக்க முடியவில்லை. பிழை <ph name="ERROR_CODE" />.</translation> <translation id="769569204874261517"><ph name="USER_DISPLAY_NAME" /> (ஏற்கனவே இந்தச் சாதனத்தில் உள்ளார்)</translation> <translation id="7696063401938172191">உங்கள் '<ph name="PHONE_NAME" />' இல்:</translation> <translation id="7698408911093959127">{COUNT,plural, =1{புத்தகக்குறிப் பட்டியலில் 1 புத்தகக்குறி உள்ளது}other{புத்தகக்குறிப் பட்டியலில் # புக்மார்க்குகள் உள்ளன}}</translation> @@ -4390,6 +4441,7 @@ <translation id="7982083145464587921">இந்தப் பிழையைச் சரிசெய்ய உங்கள் சாதனத்தை மறுதொடக்கம் செய்யவும்.</translation> <translation id="7982789257301363584">நெட்வொர்க்</translation> <translation id="7984068253310542383"><ph name="DISPLAY_NAME" />ஐப் பிரதிபலி</translation> +<translation id="7985283639530788531"><ph name="APP_NAME" />ல் Touch IDயை மறைநிலையில் பயன்படுத்த விரும்புகிறீர்களா?</translation> <translation id="7986295104073916105">சேமித்த கடவுச்சொல் அமைப்புகளைப் படித்தல், மாற்றுதல்</translation> <translation id="7987814697832569482">எப்போதும் இந்த VPN மூலம் இணை</translation> <translation id="798835209536175951">உங்கள் Chromebookகில் இருந்து மெசேஜ்களை அனுப்பலாம், பெறலாம். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> @@ -4487,6 +4539,7 @@ <translation id="8131740175452115882">உறுதிப்படுத்து</translation> <translation id="8133676275609324831">கோப்புறையில் &காண்பி</translation> <translation id="8135557862853121765"><ph name="NUM_KILOBYTES" />K</translation> +<translation id="8136269678443988272">உள்ளிட்ட பின்கள் பொருந்தவில்லை</translation> <translation id="8137559199583651773">நீட்டிப்புகளை நிர்வகிக்கவும்</translation> <translation id="8138082791834443598">விருப்பத்தேர்வுக்குரியது — புதிய தகவலை உள்ளிடவும் அல்லது இந்தச் சாதனத்துடன் தொடர்புடைய ஏற்கனவேயுள்ள தகவலைப் புதுப்பிக்கவும்.</translation> <translation id="813913629614996137">துவக்குகிறது...</translation> @@ -4550,6 +4603,7 @@ <translation id="8242426110754782860">தொடருக</translation> <translation id="8244514732452879619">தூங்கும் நேரம் வந்துவிட்டது</translation> <translation id="8246209727385807362">அறியப்படாத தொலைத்தொடர்பு நிறுவனம்</translation> +<translation id="8246776524656196770">பின் (தனிப்பட்ட அடையாள எண்) மூலம் உங்கள் பாதுகாப்பு விசையைப் பாதுகாக்கலாம்</translation> <translation id="8248050856337841185">&ஒட்டு</translation> <translation id="8249048954461686687">OEM கோப்புறை</translation> <translation id="8249615410597138718">உங்கள் சாதனங்களுக்கு அனுப்புதல்</translation> @@ -4779,6 +4833,7 @@ <translation id="8642171459927087831">அணுகல் டோக்கன்</translation> <translation id="8642947597466641025">உரையை இன்னும் பெரிதாக்கு</translation> <translation id="8643418457919840804">தொடர, விருப்பத்தைத் தேர்வுசெய்யவும்:</translation> +<translation id="8644655801811752511">இந்தப் பாதுகாப்பு விசையை மீட்டமைக்க முடியவில்லை. விசையைச் செருகிய உடனே அதை மீட்டமைக்க முயலவும்.</translation> <translation id="8645354835496065562">தொடர்ந்து சென்சார் அணுகலை அனுமதி</translation> <translation id="8647834505253004544">சரியான இணைய முகவரி அல்ல</translation> <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> அல்லது <ph name="RE_SCAN_LINK" /></translation> @@ -4959,6 +5014,7 @@ <translation id="8893801527741465188">நிறுவல் நீக்கப்பட்டது</translation> <translation id="8893928184421379330"><ph name="DEVICE_LABEL" /> சாதனத்தை அறிய முடியவில்லை. மன்னிக்கவும்.</translation> <translation id="8895454554629927345">புத்தகக்குறிப் பட்டியல்</translation> +<translation id="8896022254727357590">பின் குறைந்தது 4 எழுத்துகளைக் கொண்டிருக்க வேண்டும்</translation> <translation id="8898786835233784856">அடுத்த தாவலைத் தேர்ந்தெடு</translation> <translation id="8898840733695078011">சிக்னலின் வலிமை</translation> <translation id="8899851313684471736">இணைப்பை புதிய &சாளரத்தில் திற</translation> @@ -4993,6 +5049,7 @@ <translation id="8944964446326379280"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> உடன் சாளரத்தைப் பகிர்கிறது.</translation> <translation id="8946359700442089734">இந்த <ph name="IDS_SHORT_PRODUCT_NAME" /> சாதனத்தில் பிழைத் திருத்த அம்சங்கள் முழுமையாக இயக்கப்படவில்லை.</translation> <translation id="894871326938397531">மறைநிலையிலிருந்து வெளியேறவா?</translation> +<translation id="8948939328578167195">உங்கள் பாதுகாப்பு விசையின் உற்பத்தியாளர் மற்றும் மாடலைத் தெரிந்துகொள்ள <ph name="WEBSITE" /> விரும்புகிறது</translation> <translation id="8951256747718668828">பிழை காரணமாக மீட்டமைக்க முடியவில்லை</translation> <translation id="895347679606913382">தொடங்குகிறது...</translation> <translation id="895944840846194039">JavaScript நினைவகம்</translation> @@ -5048,6 +5105,7 @@ <translation id="9039663905644212491">PEAP</translation> <translation id="9040661932550800571"><ph name="ORIGIN" />க்கான கடவுச்சொல்லைப் புதுப்பிக்கவா?</translation> <translation id="9041692268811217999">உங்கள் கணினியில் இருக்கும் அகக் கோப்புகளுக்கான அணுகலை நிர்வாகி முடக்கியுள்ளார்</translation> +<translation id="9041909613332246191">பொதுவாக இந்தக் கோப்பு பதிவிறக்கப்படுவதில்லை, மேலும் ஆபத்தானதாக இருக்கக்கூடும். மேம்பட்ட பாதுகாப்பின் மூலம் பாதுகாக்கப்பட்டுள்ளீர்கள்.</translation> <translation id="9042893549633094279">தனியுரிமை மற்றும் பாதுகாப்பு</translation> <translation id="904451693890288097">"<ph name="DEVICE_NAME" />" க்கான கடவுக்குறியீட்டை உள்ளிடுக:</translation> <translation id="9044646465488564462">நெட்வொர்க்குடன் இணைப்பதில் தோல்வி: <ph name="DETAILS" /></translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index a3589dc..3f884f6e 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -8,6 +8,7 @@ <translation id="1007408791287232274">Не вдалося завантажити пристрої.</translation> <translation id="1008186147501209563">Експортувати закладки</translation> <translation id="1008557486741366299">Не зараз</translation> +<translation id="1010498023906173788">Цю вкладку підключено до послідовного порту</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Сторінка не відповідає}one{Сторінки не відповідають}few{Сторінки не відповідають}many{Сторінки не відповідають}other{Сторінки не відповідають}}</translation> <translation id="1012794136286421601">Ваші файли Документів, Таблиць, Презентацій і Малюнків синхронізуються. Відкрийте програму Диск Google, щоб отримати до них доступ онлайн чи офлайн.</translation> <translation id="1012876632442809908">Пристрій із портом USB типу C (на передній панелі)</translation> @@ -30,6 +31,7 @@ <translation id="1036982837258183574">Натисніть |<ph name="ACCELERATOR" />|, щоб вийти з повноекранного режиму</translation> <translation id="1038168778161626396">Тільки шифрувати</translation> <translation id="1039337018183941703">Недійсний або пошкоджений файл</translation> +<translation id="1041175011127912238">Ця сторінка не відповідає</translation> <translation id="1042174272890264476">Ваш комп’ютер також має вбудовану бібліотеку RLZ у <ph name="SHORT_PRODUCT_NAME" />. Параметр RLZ призначає неунікальний тег, який не містить особисті дані, проте дозволяє вимірювати пошуки й користування <ph name="SHORT_PRODUCT_NAME" /> у рамках певної рекламної кампанії. Ці мітки інколи з’являються в пошукових запитах Google у <ph name="PRODUCT_NAME" />.</translation> <translation id="1046059554679513793">На жаль, це ім’я вже використовується.</translation> <translation id="1046635659603195359">Схоже, ви вже налаштували Voice Match для Google Асистента на іншому пристрої. За допомогою попередніх записів можна створити зразок голосу на цьому пристрої. Це займе менше хвилини.</translation> @@ -148,6 +150,7 @@ <translation id="1211364473545090084">Відкрийте анонімне вікно й користуйтесь Інтернетом, не зберігаючи історію веб-перегляду</translation> <translation id="1213037489357051291">Налаштовано відбитків пальців: <ph name="NUM_FINGERPRINTS" /></translation> <translation id="1215411991991485844">Додано нову фонову програму</translation> +<translation id="1217483152325416304">Ваші локальні дані невдовзі буде видалено</translation> <translation id="1217668622537098248">Після дії повернутися до натискання лівою кнопкою</translation> <translation id="121783623783282548">Паролі не збігаються.</translation> <translation id="1218839827383191197"><ph name="BEGIN_PARAGRAPH1" />Служба локації Google використовує такі джерела, як Wi-Fi, мобільні мережі та датчики, щоб визначати місцезнаходження цього пристрою.<ph name="END_PARAGRAPH1" /> @@ -308,6 +311,7 @@ <translation id="1478340334823509079">Деталі: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">Встановлення не підтримується</translation> <translation id="1483493594462132177">Надіслати</translation> +<translation id="1484979925941077974">Сайт використовує Bluetooth</translation> <translation id="1485015260175968628">Тепер може:</translation> <translation id="1485141095922496924">Версія <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation> <translation id="1486096554574027028">Пошук паролів</translation> @@ -458,6 +462,7 @@ <translation id="1708338024780164500">(Неактивне)</translation> <translation id="1708713382908678956"><ph name="NAME_PH" /> (ідентифікатор: <ph name="ID_PH" />)</translation> <translation id="1709106626015023981"><ph name="WIDTH" />x<ph name="HEIGHT" /> (оригінальна)</translation> +<translation id="1711401317189798723">Триває резервне копіювання контейнера <ph name="CONTAINER_ID" /></translation> <translation id="1712349894969001173">Отримайте цей пароль на своєму пристрої iPhone</translation> <translation id="1712552549805331520">Сайт <ph name="URL" /> хоче постійно зберігати дані на вашому локальному комп’ютері</translation> <translation id="1718835860248848330">Остання година</translation> @@ -607,6 +612,7 @@ <translation id="1932026958134051332">Опції кнопкового доступу</translation> <translation id="1932098463447129402">Не раніше</translation> <translation id="1933809209549026293">Підключіть мишу чи клавіатуру. Якщо ви користуєтеся пристроєм Bluetooth, перевірте, чи він готовий до підключення.</translation> +<translation id="1937774647013465102">Не вдається імпортувати контейнер архітектури<ph name="ARCHITECTURE_CONTAINER" /> на пристрій з архітектурою<ph name="ARCHITECTURE_DEVICE" />. Ви можете спробувати відновити цей контейнер на іншому пристрої або отримати доступ до його вмісту в додатку Файли.</translation> <translation id="1938351510777341717">Зовнішня клавіша Command</translation> <translation id="1940546824932169984">Під’єднані пристрої</translation> <translation id="1944921356641260203">Знайдено оновлення</translation> @@ -891,9 +897,11 @@ <translation id="2392369802118427583">Активувати</translation> <translation id="2394566832561516196">Налаштування буде видалено після перезавантаження.</translation> <translation id="2395616325548404795">Ваш пристрій <ph name="DEVICE_TYPE" /> зареєстровано для корпоративного керування, однак ми не отримали інформацію про його об’єкти та місцезнаходження. Введіть ці дані вручну на Консолі адміністратора.</translation> +<translation id="2396783860772170191">Введіть 4-значний PIN-код (0000–9999)</translation> <translation id="2408955596600435184">Введіть PIN-код</translation> <translation id="241082044617551207">Невідомий плагін</translation> <translation id="2413749388954403953">Змінювати інтерфейс користувача для закладок</translation> +<translation id="241639282915300771">Триває відновлення контейнера<ph name="CONTAINER_ID" /></translation> <translation id="241727068219398187">Дані зашифровано паролем Google від <ph name="TIME" />. Це не стосується способів оплати й адрес із Google Pay.</translation> <translation id="2419706071571366386">З міркувань безпеки виходьте з облікового запису, коли не використовуєте комп’ютер.</translation> @@ -986,6 +994,7 @@ <translation id="2538361623464451692">Синхронізацію вимкнено</translation> <translation id="2540449034743108469">Натисніть "Почати", щоб прослухати дії розширення</translation> <translation id="2541002089857695151">Оптимізувати трансляцію на повний екран?</translation> +<translation id="2541706104884128042">Налаштовано новий час сну</translation> <translation id="2544853746127077729">Сертифікат автентифікації відхилений мережею</translation> <translation id="2549985041256363841">Почати запис</translation> <translation id="2550212893339833758">Змінна пам’ять</translation> @@ -1077,6 +1086,7 @@ <translation id="2677748264148917807">Вийти</translation> <translation id="2678063897982469759">Знову ввімкнути</translation> <translation id="268053382412112343">Іс&торія</translation> +<translation id="2682498795777673382">Батьки змінили налаштування</translation> <translation id="2683638487103917598">Папку відсортовано</translation> <translation id="2684004000387153598">Натисніть OK і виберіть "Додати користувача", щоб створити новий профіль для своєї електронної адреси.</translation> <translation id="2688196195245426394">Помилка під час реєстрації пристрою на сервері: <ph name="CLIENT_ERROR" />.</translation> @@ -1110,6 +1120,7 @@ <translation id="2731392572903530958">В&ідкрити закрите вікно знову</translation> <translation id="2731700343119398978">Зачекайте...</translation> <translation id="2731710757838467317">Створення контрольованого користувача. Це може тривати якийсь час.</translation> +<translation id="2731971182069536520">Під час наступного перезапуску пристрою адміністратор виконає одноразове оновлення, що призведе до видалення локальних даних.</translation> <translation id="2734760316755174687">Дозволи сайтів групи <ph name="SITE_GROUP_NAME" /> також буде скинуто.</translation> <translation id="2735438478659026460">Автоматично натискати, коли курсор миші зупиняється</translation> <translation id="2735712963799620190">Графік</translation> @@ -1313,6 +1324,7 @@ <translation id="304747341537320566">Системи синтезу мовлення</translation> <translation id="3047644958362961983">Ця інформація допоможе нам краще зрозуміти проблему з Асистентом. Дані зберігаються впродовж 90 днів і доступні лише відповідним командам розробників та спеціалістів із відгуків.</translation> <translation id="3053013834507634016">Використання ключа сертифіката</translation> +<translation id="3053273573829329829">Увімкнути PIN-код користувача</translation> <translation id="3058498974290601450">Ви можете будь-коли ввімкнути синхронізацію в налаштуваннях</translation> <translation id="3060379269883947824">Увімкнути службу Читання з екрана</translation> <translation id="3061707000357573562">Служба виправлень</translation> @@ -1332,6 +1344,7 @@ <translation id="3084771660770137092">Недостатньо пам'яті Chrome або процес для веб-сторінки припинено з іншої причини. Щоб продовжити, перезавантажте цю сторінку чи перейдіть на іншу.</translation> <translation id="3085412380278336437">Сайт може використовувати камеру</translation> <translation id="3085752524577180175">Хост SOCKS</translation> +<translation id="3088052000289932193">Сайт використовує MIDI</translation> <translation id="3088325635286126843">&Перейменувати...</translation> <translation id="3089137131053189723">Пошук очищено</translation> <translation id="3090193911106258841">Отримання доступу до аудіо- й відеовходу</translation> @@ -1471,6 +1484,7 @@ <translation id="3317459757438853210">Двосторонній</translation> <translation id="3317678681329786349">Заборонено використовувати камеру та мікрофон</translation> <translation id="3319048459796106952">Нове &анонімне вікно</translation> +<translation id="3323521181261657960">Бонус! Подовжено час використання пристрою</translation> <translation id="3325910708063135066">Камеру та мікрофон вимкнено в параметрах системи Mac</translation> <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation> <translation id="3331974543021145906">Про додаток</translation> @@ -1766,6 +1780,7 @@ <translation id="3765246971671567135">Не вдалося прочитати політику демо-режиму офлайн.</translation> <translation id="3766223500670287046">Віддалений екран</translation> <translation id="3768037234834996183">Синхронізація налаштувань…</translation> +<translation id="377050016711188788">Морозиво</translation> <translation id="3771294271822695279">Відеофайли</translation> <translation id="3775432569830822555">Сертифікат SSL-сервера</translation> <translation id="3775705724665058594">Надіслати на пристрої</translation> @@ -1844,6 +1859,7 @@ <translation id="3869917919960562512">Неправильний індекс.</translation> <translation id="3870931306085184145">Немає збережених паролів для <ph name="DOMAIN" /></translation> <translation id="3871092408932389764">Найнижчий</translation> +<translation id="3871350334636688135">Через 24 години адміністратор виконає одноразове оновлення, що призведе до видалення локальних даних під час наступного перезапуску пристрою. Збережіть потрібні локальні дані в хмарному сховищі впродовж 24 годин.</translation> <translation id="3872220884670338524">Додаткові дії, збережено обліковий запис користувача <ph name="USERNAME" /> у домені <ph name="DOMAIN" /></translation> <translation id="3872991219937722530">Звільніть місце на диску. Інакше пристрій перестане відповідати.</translation> <translation id="3873315167136380065">Щоб увімкнути цю функцію, видаліть парольну фразу синхронізації, <ph name="BEGIN_LINK" />скинувши синхронізацію<ph name="END_LINK" />.</translation> @@ -1923,6 +1939,7 @@ <translation id="3983400541576569538">Дані з деяких додатків може бути втрачено</translation> <translation id="3983586614702900908">пристрої від невідомого постачальника</translation> <translation id="3984159763196946143">Не вдалося запустити демонстраційний режим</translation> +<translation id="3984431586879874039">Показувати цьому сайту ваш ключ безпеки?</translation> <translation id="3987348946546879621">Заощаджено трафік</translation> <translation id="3987938432087324095">Незрозуміло.</translation> <translation id="3988996860813292272">Вибір часового поясу</translation> @@ -1999,6 +2016,7 @@ <translation id="4099060993766194518">Відновити пошукову систему за умовчанням?</translation> <translation id="4099874310852108874">Сталася помилка мережі.</translation> <translation id="4100733287846229632">На пристрої дуже мало вільного місця</translation> +<translation id="4100853287411968461">Нове обмеження часу використання пристрою</translation> <translation id="4103091233824664032">Введіть пароль, щоб налаштувати блокування екрана та вхід</translation> <translation id="4104163789986725820">Е&кспортувати...</translation> <translation id="4107048419833779140">Виявляти й вилучати пристрої пам’яті</translation> @@ -2119,6 +2137,7 @@ <translation id="4324577459193912240">Файл неповний</translation> <translation id="4325237902968425115">Видаляється <ph name="LINUX_APP_NAME" />…</translation> <translation id="4328203388435897516">Налаштувавши Chromebook, натисніть кнопку Асистента чи скажіть "Ok Google", щоб отримати допомогу. Щоб внести зміни, перейдіть у налаштування Асистента.</translation> +<translation id="4330191372652740264">Крижана вода</translation> <translation id="4330387663455830245">Ніколи не перекладати з такої мови: <ph name="LANGUAGE" /></translation> <translation id="4333854382783149454">PKCS #1 SHA-1 із шифруванням RSA</translation> <translation id="4336979451636460645">Журнали мережі можна переглянути на сторінці <ph name="DEVICE_LOG_LINK" /></translation> @@ -2154,6 +2173,7 @@ <translation id="438503109373656455">Жокей</translation> <translation id="4387004326333427325">Сертифікат автентифікації відхилений дистанційно</translation> <translation id="4389091756366370506">Користувач <ph name="VALUE" /></translation> +<translation id="4390000551125140321">{0,plural, =1{Режим анонімного перегляду}one{У режимі анонімного перегляду відкрито # вікно}few{У режимі анонімного перегляду відкрито # вікна}many{У режимі анонімного перегляду відкрито # вікон}other{У режимі анонімного перегляду відкрито # вікна}}</translation> <translation id="439266289085815679">Налаштуваннями Bluetooth керує <ph name="USER_EMAIL" />.</translation> <translation id="4394049700291259645">Вимкнути</translation> <translation id="4400367121200150367">Тут відображатимуться сайти, які ніколи не зберігають паролі</translation> @@ -2302,6 +2322,7 @@ <translation id="4648499713050786492">Перш ніж додати особу, розблокуйте свій профіль.</translation> <translation id="4651484272688821107">Не вдалося завантажити онлайн-компонент із ресурсами демо-режиму.</translation> <translation id="465878909996028221">Для переспрямування у веб-переглядачі підтримуються лише http, https і протоколи файлів.</translation> +<translation id="4659077111144409915">Основний обліковий запис</translation> <translation id="4660476621274971848">Очікувалася версія <ph name="EXPECTED_VERSION" />, але отримано <ph name="NEW_ID" /></translation> <translation id="4662788913887017617">Надішліть цю закладку на iPhone</translation> <translation id="4663373278480897665">Дозволено використовувати камеру</translation> @@ -2347,6 +2368,7 @@ <translation id="4724450788351008910">Зміна приналежності</translation> <translation id="4725511304875193254">Коргі</translation> <translation id="4726710629007580002">Під час спроби встановити це розширення з’являлися застереження.</translation> +<translation id="4727847987444062305">Керований сеанс у режимі "Гість"</translation> <translation id="4728558894243024398">Платформа</translation> <translation id="4733082559415072992">Сайт <ph name="URL" /> хоче отримати доступ до геоданих вашого пристрою</translation> <translation id="4733793249294335256">Розташування</translation> @@ -2456,6 +2478,7 @@ <translation id="488785315393301722">Показати деталі</translation> <translation id="4890773143211625964">Показати розширені налаштування принтера</translation> <translation id="4891089016822695758">Форум бета-версії</translation> +<translation id="4892229439761351791">Сайт може використовувати Bluetooth</translation> <translation id="4893336867552636863">Дані веб-перегляду буде видалено з цього пристрою назавжди.</translation> <translation id="4893522937062257019">На екрані блокування</translation> <translation id="4898011734382862273">Сертифікат "<ph name="CERTIFICATE_NAME" />" представляє Центр сертифікації</translation> @@ -2631,6 +2654,8 @@ <translation id="5187295959347858724">Зараз ви ввійшли в <ph name="SHORT_PRODUCT_NAME" />. Ваші закладки, історія й інші налаштування синхронізуються з обліковим записом Google.</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> хоче завантажити кілька файлів</translation> +<translation id="5192316339598592690">Швидко переходьте між обліковими записами й миттєво входьте в додатки та на веб-сайти. + Додатки й сайти можуть запитувати дозвіл на використання певних даних облікового запису Google. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> <translation id="5204673965307125349">Виконайте Powerwash на пристрої та повторіть спробу.</translation> <translation id="5204967432542742771">Введіть пароль</translation> <translation id="5206215183583316675">Видалити сертифікат "<ph name="CERTIFICATE_NAME" />"?</translation> @@ -3515,6 +3540,7 @@ <translation id="6547354035488017500">Звільніть принаймні 512 МБ пам’яті, інакше пристрій перестане відповідати. Щоб звільнити місце, видаліть файли з пам’яті пристрою.</translation> <translation id="6550675742724504774">Параметри</translation> <translation id="6551508934388063976">Команда недоступна. Натисніть клавіші Ctrl+N, щоб відкрити нове вікно.</translation> +<translation id="6551612971599078809">Сайт використовує USB</translation> <translation id="655384502888039633">Користувачів: <ph name="USER_COUNT" /></translation> <translation id="655483977608336153">Повторити</translation> <translation id="6555432686520421228">Видаліть усі облікові записи користувача та відновіть заводські налаштування пристрою <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> @@ -3739,6 +3765,7 @@ <translation id="692114467174262153">Не вдалося відкрити <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> <translation id="6921709132208495314">Припинити використання даних на цій сторінці</translation> <translation id="6922128026973287222">Зменшіть обсяг завантажених даних і відкривайте веб-сторінки швидше з Google Заощадження трафіку. Натисніть, щоб дізнатися більше.</translation> +<translation id="6922745772873733498">Щоб друкувати, введіть PIN-код</translation> <translation id="6923132443355966645">Прокрутіть або натисніть</translation> <translation id="6923633482430812883">Помилка підключення спільного доступу. Перевірте, чи файловий сервер, до якого ви підключаєтеся, підтримує SMBv2 або новіших версій.</translation> <translation id="6930036377490597025">Внутрішній ключ безпеки або вбудований датчик</translation> @@ -3793,6 +3820,7 @@ <translation id="7003339318920871147">Онлайнові бази даних</translation> <translation id="7003723821785740825">Налаштуйте швидше розблокування пристрою</translation> <translation id="7003844668372540529">Невідомий продукт <ph name="PRODUCT_ID" /> від постачальника <ph name="VENDOR_NAME" /></translation> +<translation id="7004402701596653846">Сайт може використовувати MIDI</translation> <translation id="7004499039102548441">Останні вкладки</translation> <translation id="7005848115657603926">Недійсний діапазон сторінок, використовуйте <ph name="EXAMPLE_PAGE_RANGE" /></translation> <translation id="7006634003215061422">Нижнє поле</translation> @@ -3805,9 +3833,11 @@ <translation id="7017480957358237747">дозволяти чи забороняти певні веб-сайти;</translation> <translation id="7018275672629230621">Читати й змінювати історію веб-перегляду</translation> <translation id="7019805045859631636">Швидка</translation> +<translation id="702252130983202758">Ваші додатки</translation> <translation id="7022562585984256452">Вашу домашню сторінку налаштовано.</translation> <translation id="7025190659207909717">Керування службою пересилання мобільних даних</translation> <translation id="7029809446516969842">Паролі</translation> +<translation id="7031608529463141342"><ph name="WINDOW_TITLE" />: підключено послідовний порт</translation> <translation id="7031962166228839643">Триває підготовка модуля TPM, зачекайте (це може тривати декілька хвилин)...</translation> <translation id="7037509989619051237">Текст для попереднього прослуховування</translation> <translation id="7039326228527141150">Отримувати доступ до пристроїв USB від постачальника <ph name="VENDOR_NAME" /></translation> @@ -3832,6 +3862,7 @@ <translation id="706626672220389329">Помилка підключення спільного доступу. Указаний пристрій уже підключено.</translation> <translation id="7066944511817949584">Не вдалося під’єднатися до пристрою "<ph name="DEVICE_NAME" />".</translation> <translation id="7067725467529581407">Більше не показувати.</translation> +<translation id="7069811530847688087">Сайт <ph name="WEBSITE" /> може попросити новіший або інший ключ безпеки</translation> <translation id="7070484045139057854">Може переглядати й змінювати дані сайту</translation> <translation id="7072010813301522126">Назва ярлика</translation> <translation id="707392107419594760">Виберіть свою клавіатуру:</translation> @@ -3912,6 +3943,7 @@ <translation id="7189234443051076392">Переконайтеся, що на пристрої достатньо вільного місця</translation> <translation id="7189965711416741966">Відбиток додано.</translation> <translation id="7191159667348037">Невідомий принтер (USB)</translation> +<translation id="7193051357671784796">Цей додаток вніс адміністратор вашої організації. Щоб завершити встановлення, перезапустіть його.</translation> <translation id="7193374945610105795">Немає збережених паролів для <ph name="ORIGIN" /></translation> <translation id="7196913789568937443">Створення резервних копій на Google Диску. Легко відновлюйте дані та переносьте їх на інші пристрої. Резервна копія містить дані додатків. Ваші резервні копії завантажуються в Google і шифруються за допомогою пароля облікового запису Google. <ph name="BEGIN_LINK1" />Докладніше<ph name="END_LINK1" /></translation> <translation id="7197190419934240522">Отримуйте результати пошуку й розумні функції від Google під час перегляду сторінок</translation> @@ -4334,6 +4366,7 @@ <ph name="BR" /> <ph name="BEGIN_BOLD" />Примітка.<ph name="END_BOLD" /> Під час процедури система перезавантажиться.</translation> <translation id="7829298379596169484">Отримання доступу до аудіовходу</translation> +<translation id="7830594666202422257">Підключити до Linux</translation> <translation id="7831491651892296503">Помилка налаштування мережі</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> <translation id="7832084384634357321">Час завершення</translation> @@ -4363,6 +4396,7 @@ <translation id="7877451762676714207">Невідома помилка сервера. Повторіть спробу чи зв’яжіться з адміністратором сервера.</translation> <translation id="7877680364634660272">Огляд</translation> <translation id="7878562273885520351">Ваш пароль можуть зламати</translation> +<translation id="7880823633812189969">Локальні дані буде видалено під час перезапуску</translation> <translation id="7881483672146086348">Переглянути обліковий запис</translation> <translation id="7882358943899516840">Тип постачальника</translation> <translation id="7885253890047913815">Останні місця призначення</translation> @@ -4701,6 +4735,7 @@ <translation id="8426713856918551002">Увімкнення</translation> <translation id="8427292751741042100">вбудовано на будь-якому хості</translation> <translation id="8428213095426709021">Налаштування</translation> +<translation id="8428628598981198790">Ваші ключі безпеки не можна використовувати на цьому сайті</translation> <translation id="84297032718407999">Ви вийдете через <ph name="LOGOUT_TIME_LEFT" /></translation> <translation id="8431190899827883166">Показувати дотики</translation> <translation id="8431909052837336408">Змінити PIN-код SIM-карти</translation> @@ -4905,6 +4940,7 @@ <translation id="8732212173949624846">Читати й змінювати історію веб-перегляду на всіх пристроях, на яких ви ввійшли</translation> <translation id="8732844209475700754">Інші налаштування конфіденційності, безпеки та збору даних</translation> <translation id="8734073480934656039">Якщо ввімкнути це налаштування, додатки для терміналів запускатимуться автоматично під час запуску комп’ютера.</translation> +<translation id="8734671092194994316">На ключі безпеки збережеться запис про те, що ви відвідували сайт <ph name="WEBSITE" />.</translation> <translation id="873545264931343897">Коли оновлення плагіна <ph name="PLUGIN_NAME" /> закінчиться, оновіть сторінку, щоб активувати його</translation> <translation id="8736288397686080465">Цей сайт оновлено у фоновому режимі.</translation> <translation id="8737685506611670901">Відкривати посилання протоколу <ph name="PROTOCOL" />, а не обробника <ph name="REPLACED_HANDLER_TITLE" /></translation> @@ -5003,6 +5039,7 @@ <translation id="8877448029301136595">[батьківський каталог]</translation> <translation id="8879284080359814990">&Показати як вкладку</translation> <translation id="8883847527783433352">Синхронізувати з іншим обліковим записом</translation> +<translation id="8884570509232205463">Тепер пристрій блокується о <ph name="UNLOCK_TIME" />.</translation> <translation id="8885197664446363138">Функція Smart Lock недоступна</translation> <translation id="8888253246822647887">Додаток відкриється, коли завершиться оновлення. Воно може тривати кілька хвилин.</translation> <translation id="8888432776533519951">Колір:</translation> @@ -5096,6 +5133,7 @@ <translation id="9026852570893462412">Це може тривати кілька хвилин. Завантажується віртуальна машина.</translation> <translation id="9027459031423301635">Відкрити посилання в новій &вкладці</translation> <translation id="9030515284705930323">У вашій організації не ввімкнено магазин Google Play для вашого облікового запису. Зв’яжіться з адміністратором, щоб дізнатися більше.</translation> +<translation id="9030785788945687215">Gmail</translation> <translation id="9033857511263905942">&Вставити</translation> <translation id="9037965129289936994">Показати оригінал</translation> <translation id="9038649477754266430">Користуйтеся службою передбачення, щоб сторінки завантажувалися швидше</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index 8ba1d178..56ff6ac 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -177,6 +177,7 @@ <translation id="5566025111015594046">„Google Chrome“ (mDNS-In)</translation> <translation id="565744775970812598">Failas „<ph name="FILE_NAME" />“ gali būti pavojingas, todėl „Chrome“ jį užblokavo.</translation> <translation id="5686916850681061684">Tinkinkite ir valdykite „Google Chrome“. Reikia atkreipti dėmesį – spustelėkite ir peržiūrėkite išsamią informaciją.</translation> +<translation id="5690427481109656848">Google LLC</translation> <translation id="5715063361988620182">{SECONDS,plural, =1{„Google Chrome“ bus paleista iš naujo po 1 sekundės}one{„Google Chrome“ bus paleista iš naujo po # sekundės}few{„Google Chrome“ bus paleista iš naujo po # sekundžių}many{„Google Chrome“ bus paleista iš naujo po # sekundės}other{„Google Chrome“ bus paleista iš naujo po # sekundžių}}</translation> <translation id="573759479754913123">Apie „Chrome“ OS</translation> <translation id="5795887333006832406">„<ph name="PAGE_TITLE" />“ – „Google Chrome Canary“</translation> @@ -269,6 +270,7 @@ <translation id="8286862437124483331">„Google Chrome“ bando rodyti slaptažodžius. Įveskite „Windows“ slaptažodį, kad tai leistumėte.</translation> <translation id="8290100596633877290">Oi! „Google Chrome“ užstrigo. Paleisti iš naujo dabar?</translation> <translation id="8342675569599923794">Šis failas pavojingas, todėl „Chrome“ jį užblokavo.</translation> +<translation id="8370517070665726704">Autorių teisės „Google LLC.“, <ph name="YEAR" /> m. Visos teisės saugomos.</translation> <translation id="8380166467911888159">Kad ištaisytų rašybos klaidas, „Chrome“ siunčia „Google“ tekstą, kurį įvedate teksto laukuose</translation> <translation id="840084489713044809">„Google Chrome“ nori eksportuoti jūsų slaptažodžius.</translation> <translation id="8406086379114794905">Padėkite tobulinti „Chrome“</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb index cc2ec9b4..d2dc38f 100644 --- a/chrome/app/resources/google_chrome_strings_nl.xtb +++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -174,6 +174,7 @@ <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> kan gevaarlijk zijn en is daarom door Chrome geblokkeerd.</translation> <translation id="5686916850681061684">Pas Google Chrome aan en beheer de instellingen. Je aandacht is vereist. Klik voor meer informatie.</translation> +<translation id="5690427481109656848">Google LLC</translation> <translation id="5715063361988620182">{SECONDS,plural, =1{Google Chrome wordt over één seconde opnieuw gestart}other{Google Chrome wordt over # seconden opnieuw gestart}}</translation> <translation id="573759479754913123">Over Chrome OS</translation> <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation> @@ -266,6 +267,7 @@ <translation id="8286862437124483331">Google Chrome probeert wachtwoorden weer te geven. Geef je Windows-wachtwoord op om dit toe te staan.</translation> <translation id="8290100596633877290">Oeps! Google Chrome is vastgelopen. Nu opnieuw starten?</translation> <translation id="8342675569599923794">Dit bestand is gevaarlijk en is daarom door Chrome geblokkeerd.</translation> +<translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Alle rechten voorbehouden.</translation> <translation id="8380166467911888159">Chrome verzendt de tekst die je in tekstvelden typt naar Google om spelfouten te corrigeren</translation> <translation id="840084489713044809">Google Chrome wil je wachtwoorden exporteren.</translation> <translation id="8406086379114794905">Help ons Chrome te verbeteren</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb index 29e7612..0d07066 100644 --- a/chrome/app/resources/google_chrome_strings_ta.xtb +++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -38,6 +38,7 @@ <translation id="1773601347087397504">Chrome OS ஐப் பயன்படுத்தி உதவி பெறுக</translation> <translation id="1795405610103747296">உங்கள் மொபைலில் Chromeஐ நிறுவவும். மொபைல் எண்ணுக்கு SMS ஒன்றை அனுப்புவோம்: <ph name="PHONE_NUMBER" /></translation> <translation id="1812689907177901597">இதை முடக்கினால், நீங்கள் Chromeமில் உள்நுழையாமலேயே Gmail போன்ற Google தளங்களில் உள்நுழையலாம்</translation> +<translation id="1815759068706561639"><ph name="FILE_NAME" /> எனும் கோப்பு ஆபத்தானது என்பதால், அதை Chrome தடுத்துள்ளது. மேம்பட்ட பாதுகாப்பின் மூலம் பாதுகாக்கப்பட்டுள்ளீர்கள்.</translation> <translation id="1860536484129686729">இந்தத் தளத்திற்காகக் கேமராவை அணுக, Chromeக்கு அனுமதி தேவை</translation> <translation id="1873233029667955273">Google Chrome உங்கள் இயல்புநிலை உலாவி அல்ல</translation> <translation id="1874309113135274312">Google Chrome பீட்டா (mDNS-In)</translation> @@ -63,6 +64,7 @@ <translation id="2429317896000329049">உங்கள் களத்திற்கு ஒத்திசைவு இல்லாததால், Google Chrome ஆல் உங்கள் தரவை ஒத்திசைக்க முடியவில்லை.</translation> <translation id="2467438592969358367">Google Chrome உங்கள் கடவுச்சொற்களை ஏற்ற விரும்புகிறது. இதை அனுமதிக்க, உங்கள் Windows கடவுச்சொல்லை உள்ளிடவும்.</translation> <translation id="2485422356828889247">நிறுவல் நீக்கு</translation> +<translation id="2521856951867783208">இந்தக் கோப்பு ஆபத்தானதாக இருக்கக்கூடும் என்பதால் அதை Chrome தடுத்துள்ளது. மேம்பட்ட பாதுகாப்பின் மூலம் பாதுகாக்கப்பட்டுள்ளீர்கள்.</translation> <translation id="2534507159460261402">Google Pay (Chromeக்கு நகலெடுக்கப்பட்டது)</translation> <translation id="2535429035253759792">இந்தப் புதுப்பிப்பைப் பயன்படுத்த, Chromeஐ மீண்டும் தொடங்கும்படி உங்கள் நிர்வாகி பரிந்துரைக்கிறார்</translation> <translation id="2580411288591421699">நடப்பில் இயங்கிக்கொண்டிருக்கும் அதே Google Chrome பதிப்பை நிறுவ முடியாது. Google Chrome ஐ மூடிவிட்டு மீண்டும் முயற்சி செய்க.</translation> @@ -99,6 +101,7 @@ <translation id="3451115285585441894">Chrome இல் சேர்க்கிறது...</translation> <translation id="345171907106878721">உங்களை Chrome இல் சேர்க்கவும்</translation> <translation id="3479552764303398839">இப்பொழுது இல்லை</translation> +<translation id="3481286511616257896"><ph name="FILE_NAME" /> எனும் கோப்பு ஆபத்தானது என்பதால் Chrome அதைத் தடுத்துள்ளது. மேம்பட்ட பாதுகாப்பின் மூலம் பாதுகாக்கப்பட்டுள்ளீர்கள்.</translation> <translation id="34857402635545079">Chromeமிலிருந்தும் தரவை அழி (<ph name="URL" />)</translation> <translation id="3503306920980160878">இந்தத் தளத்துடன் இருப்பிடத்தைப் பகிர, Chromeக்கு உங்கள் இருப்பிடத்திற்கான அணுகல் தேவை</translation> <translation id="3576528680708590453"><ph name="TARGET_URL_HOSTNAME" />ஐ அணுக Google Chrome அதை மாற்று உலாவியில் திறக்கும்படி உங்கள் சிஸ்டம் நிர்வாகி உள்ளமைத்துள்ளார்.</translation> @@ -219,12 +222,14 @@ <translation id="7459554271817304652">உங்கள் தனிப்பயனாக்கப்பட்ட உலாவி அம்சங்களை வலையில் சேமிக்க, ஒத்திசைவை அமைத்து, எந்த கணினியில் உள்ள Google Chromium இலிருந்தும் அவற்றை அணுகலாம்.</translation> <translation id="7473136999113284234">Chrome தானாகவே புதுப்பித்துக்கொள்வதால், எப்போதுமே புதிய பதிப்பைப் பெறுவீர்கள்.</translation> <translation id="7486227612705979895">முகவரிப் பட்டியில் பரிந்துரைகளை வழங்க, Chrome உங்கள் இயக்ககத்தை அணுகும்</translation> +<translation id="748945194546522577">இந்தக் கோப்பு ஆபத்தானது என்பதால் அதை Chrome தடுத்துள்ளது. மேம்பட்ட பாதுகாப்பின் மூலம் பாதுகாக்கப்பட்டுள்ளீர்கள்.</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7552219221109926349">Chrome OSஐ இந்த மொழியில் காட்டு</translation> <translation id="7561940363513215021">{0,plural, =1{1 நிமிடத்தில் Chrome மீண்டும் தொடங்கும்}other{# நிமிடங்களில் Chrome மீண்டும் தொடங்கும்}}</translation> <translation id="7589360514048265910">Mac OS X 10.9 இனி ஆதரிக்கப்படாது என்பதால், இந்தக் கணினி இனி Google Chrome புதுப்பிப்புகளைப் பெறாது.</translation> <translation id="7592736734348559088">உங்கள் கணக்கின் உள்நுழைவு விவரங்கள் காலாவதியாகிவிட்டதால் உங்கள் தரவை Google Chrome ஆல் ஒத்திசைக்க முடியவில்லை.</translation> <translation id="7626032353295482388">Chrome க்கு வருக</translation> +<translation id="7636297873481318396">இந்தக் கோப்பு ஆபத்தானது என்பதால் அதை Chrome தடுத்துள்ளது. மேம்பட்ட பாதுகாப்பின் மூலம் பாதுகாக்கப்பட்டுள்ளீர்கள்.</translation> <translation id="7641148173327520642"><ph name="ALTERNATIVE_BROWSER_NAME" /> மூலம் <ph name="TARGET_URL_HOSTNAME" /> இணைப்பைப் பார்ப்பதற்கு உங்கள் சிஸ்டம் நிர்வாகி Google Chromeமை உள்ளமைத்துள்ளார்.</translation> <translation id="7651907282515937834">Chrome Enterprise லோகோ</translation> <translation id="7747138024166251722">தற்காலிக டைரக்டரியை நிறுவியால் உருவாக்க முடியவில்லை. வட்டு இடம் காலியாக உள்ளதா, மென்பொருளை நிறுவுவதற்கு தகுந்த அனுமதி உள்ளதா என்பதை சரிபார்க்கவும்.</translation> @@ -273,6 +278,7 @@ <translation id="8669527147644353129">Google Chrome உதவி</translation> <translation id="8679801911857917785">Chrome ஐத் தொடங்கும்போது காண்பிக்கப்படும் பக்கத்தையும் இது கட்டுப்படுத்துகிறது.</translation> <translation id="870251953148363156">&Google Chrome ஐப் புதுப்பி</translation> +<translation id="8704255848199359374">இது Google தேடலில் பயன்படுத்தப்படும் அதே எழுத்துப் பிழை சரிபார்ப்பானைப் பயன்படுத்துகிறது. உலாவியில் நீங்கள் உள்ளிடும் உரை Googleளுக்கு அனுப்பப்படும். இதை அமைப்புகளில் எப்போது வேண்டுமானாலும் மாற்றலாம்.</translation> <translation id="873133009373065397">இயல்புநிலை உலாவியைக் கண்டறியவோ அமைக்கவோ Google Chrome ஆல் முடியவில்லை</translation> <translation id="8736674169840206667">புதுப்பிப்பைப் பயன்படுத்த, Chromeஐ மீண்டும் தொடங்கும்படி உங்கள் நிர்வாகி சொல்கிறார்</translation> <translation id="8788264404293392165">Chrome OS UIயைக் காட்ட இந்த மொழி பயன்படுத்தப்படும்</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb index d224b77..e1637db 100644 --- a/chrome/app/resources/google_chrome_strings_uk.xtb +++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -168,6 +168,7 @@ <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> <translation id="565744775970812598">Файл <ph name="FILE_NAME" /> може бути небезпечним, тому Chrome заблокував його.</translation> <translation id="5686916850681061684">Налаштовуйте й керуйте Google Chrome. Якщо з’явиться сповіщення, натисніть його, щоб дізнатися більше.</translation> +<translation id="5690427481109656848">Google LLC</translation> <translation id="5715063361988620182">{SECONDS,plural, =1{Google Chrome перезапуститься через 1 секунду}one{Google Chrome перезапуститься через # секунду}few{Google Chrome перезапуститься через # секунди}many{Google Chrome перезапуститься через # секунд}other{Google Chrome перезапуститься через # секунди}}</translation> <translation id="573759479754913123">Про ОС Chrome</translation> <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation> @@ -260,6 +261,7 @@ <translation id="8286862437124483331">Google Chrome намагається показати паролі. Щоб дозволити, введіть свій пароль Windows.</translation> <translation id="8290100596633877290">Відбулося аварійне завершення роботи Google Chrome. Перезапустити зараз?</translation> <translation id="8342675569599923794">Цей файл небезпечний, тому Chrome заблокував його.</translation> +<translation id="8370517070665726704">Авторське право <ph name="YEAR" /> Google LLC. Усі права захищено.</translation> <translation id="8380166467911888159">Щоб виправляти орфографічні помилки, Chrome надсилає введений текст у Google</translation> <translation id="840084489713044809">Google Chrome хоче експортувати ваші паролі.</translation> <translation id="8406086379114794905">Допоможіть покращити Chrome</translation>
diff --git a/chrome/app/resources/locale_settings_chromiumos.grd b/chrome/app/resources/locale_settings_chromiumos.grd index 28b2fee..77cd8fa0 100644 --- a/chrome/app/resources/locale_settings_chromiumos.grd +++ b/chrome/app/resources/locale_settings_chromiumos.grd
@@ -271,16 +271,6 @@ Noto Sans CJK TC </message> - <!-- The default value for |WebPreference::default_font_size| --> - <message name="IDS_DEFAULT_FONT_SIZE" use_name_for_id="true"> - 16 - </message> - - <!-- The default value for |WebPreference::default_fixed_font_size| --> - <message name="IDS_DEFAULT_FIXED_FONT_SIZE" use_name_for_id="true"> - 13 - </message> - <!-- The default value for |WebPreference::minimum_font_size| --> <message name="IDS_MINIMUM_FONT_SIZE" use_name_for_id="true"> 0
diff --git a/chrome/app/resources/locale_settings_google_chromeos.grd b/chrome/app/resources/locale_settings_google_chromeos.grd index 07a9b75..427a0ab 100644 --- a/chrome/app/resources/locale_settings_google_chromeos.grd +++ b/chrome/app/resources/locale_settings_google_chromeos.grd
@@ -271,16 +271,6 @@ Noto Sans CJK TC </message> - <!-- The default value for |WebPreference::default_font_size| --> - <message name="IDS_DEFAULT_FONT_SIZE" use_name_for_id="true"> - 16 - </message> - - <!-- The default value for |WebPreference::default_fixed_font_size| --> - <message name="IDS_DEFAULT_FIXED_FONT_SIZE" use_name_for_id="true"> - 13 - </message> - <!-- The default value for |WebPreference::minimum_font_size| --> <message name="IDS_MINIMUM_FONT_SIZE" use_name_for_id="true"> 0
diff --git a/chrome/app/resources/locale_settings_ko.xtb b/chrome/app/resources/locale_settings_ko.xtb index 23c3669..d1e836e 100644 --- a/chrome/app/resources/locale_settings_ko.xtb +++ b/chrome/app/resources/locale_settings_ko.xtb
@@ -1,8 +1,6 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ko"> -<translation id="IDS_DEFAULT_FONT_SIZE">16</translation> -<translation id="IDS_DEFAULT_FIXED_FONT_SIZE">13</translation> <translation id="IDS_MINIMUM_FONT_SIZE">10</translation> <translation id="IDS_MINIMUM_LOGICAL_FONT_SIZE">10</translation> <translation id="IDS_SPELLCHECK_DICTIONARY">en-US</translation>
diff --git a/chrome/app/resources/locale_settings_linux.grd b/chrome/app/resources/locale_settings_linux.grd index 059abab..dd165c5 100644 --- a/chrome/app/resources/locale_settings_linux.grd +++ b/chrome/app/resources/locale_settings_linux.grd
@@ -157,16 +157,6 @@ Times New Roman </message> - <!-- The default value for |WebPreference::default_font_size| --> - <message name="IDS_DEFAULT_FONT_SIZE" use_name_for_id="true"> - 16 - </message> - - <!-- The default value for |WebPreference::default_fixed_font_size| --> - <message name="IDS_DEFAULT_FIXED_FONT_SIZE" use_name_for_id="true"> - 13 - </message> - <!-- The default value for |WebPreference::minimum_font_size| --> <message name="IDS_MINIMUM_FONT_SIZE" use_name_for_id="true"> 0
diff --git a/chrome/app/resources/locale_settings_mac.grd b/chrome/app/resources/locale_settings_mac.grd index c8578f9a..93687a3 100644 --- a/chrome/app/resources/locale_settings_mac.grd +++ b/chrome/app/resources/locale_settings_mac.grd
@@ -247,16 +247,6 @@ Kaiti TC </message> - <!-- The default value for |WebPreference::default_font_size| --> - <message name="IDS_DEFAULT_FONT_SIZE" use_name_for_id="true"> - 16 - </message> - - <!-- The default value for |WebPreference::default_fixed_font_size| --> - <message name="IDS_DEFAULT_FIXED_FONT_SIZE" use_name_for_id="true"> - 13 - </message> - <!-- The default value for |WebPreference::minimum_font_size| --> <message name="IDS_MINIMUM_FONT_SIZE" use_name_for_id="true"> 0
diff --git a/chrome/app/resources/locale_settings_win.grd b/chrome/app/resources/locale_settings_win.grd index 7dce373..5f63863 100644 --- a/chrome/app/resources/locale_settings_win.grd +++ b/chrome/app/resources/locale_settings_win.grd
@@ -337,16 +337,6 @@ DFKai-SB </message> - <!-- The default value for |WebPreference::default_font_size| --> - <message name="IDS_DEFAULT_FONT_SIZE" use_name_for_id="true"> - 16 - </message> - - <!-- The default value for |WebPreference::default_fixed_font_size| --> - <message name="IDS_DEFAULT_FIXED_FONT_SIZE" use_name_for_id="true"> - 13 - </message> - <!-- The default value for |WebPreference::minimum_font_size| --> <message name="IDS_MINIMUM_FONT_SIZE" use_name_for_id="true"> 0
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 52b1c4b..57419b2 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -2430,6 +2430,7 @@ "android/ntp/recent_tabs_page_prefs.cc", "android/ntp/recent_tabs_page_prefs.h", "android/ntp/suggestions_event_reporter_bridge.cc", + "android/omnibox/answers_image_bridge.cc", "android/omnibox/autocomplete_controller_android.cc", "android/omnibox/autocomplete_controller_android.h", "android/omnibox/omnibox_prerender.cc", @@ -4851,8 +4852,6 @@ "supervised_user/legacy/custodian_profile_downloader_service.h", "supervised_user/legacy/custodian_profile_downloader_service_factory.cc", "supervised_user/legacy/custodian_profile_downloader_service_factory.h", - "supervised_user/supervised_user_theme.cc", - "supervised_user/supervised_user_theme.h", ] }
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 866a4c2e..360cb63 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2244,6 +2244,10 @@ flag_descriptions::kArcNativeBridgeExperimentName, flag_descriptions::kArcNativeBridgeExperimentDescription, kOsCrOS, FEATURE_VALUE_TYPE(arc::kNativeBridgeExperimentFeature)}, + {"arc-print-spooler-experiment", + flag_descriptions::kArcPrintSpoolerExperimentName, + flag_descriptions::kArcPrintSpoolerExperimentDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kPrintSpoolerExperimentFeature)}, {"arc-usb-host", flag_descriptions::kArcUsbHostName, flag_descriptions::kArcUsbHostDescription, kOsCrOS, FEATURE_VALUE_TYPE(arc::kUsbHostFeature)}, @@ -2363,12 +2367,6 @@ kOsDesktop, FEATURE_VALUE_TYPE( autofill::features::kAutofillSaveCardImprovedUserConsent)}, - {"enable-autofill-save-card-sign-in-after-local-save", - flag_descriptions::kEnableAutofillSaveCardSignInAfterLocalSaveName, - flag_descriptions::kEnableAutofillSaveCardSignInAfterLocalSaveDescription, - kOsDesktop, - FEATURE_VALUE_TYPE( - autofill::features::kAutofillSaveCardSignInAfterLocalSave)}, {"enable-autofill-save-credit-card-uses-strike-system", flag_descriptions::kEnableAutofillSaveCreditCardUsesStrikeSystemName, flag_descriptions:: @@ -3347,10 +3345,6 @@ features::kProactiveTabFreezeAndDiscard, kProactiveTabFreezeAndDiscardVariations, resource_coordinator::kProactiveTabFreezeAndDiscardFeatureName)}, - {"site-characteristics-database", - flag_descriptions::kSiteCharacteristicsDatabaseName, - flag_descriptions::kSiteCharacteristicsDatabaseDescription, kOsDesktop, - FEATURE_VALUE_TYPE(features::kSiteCharacteristicsDatabase)}, #endif #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/android/omnibox/answers_image_bridge.cc b/chrome/browser/android/omnibox/answers_image_bridge.cc new file mode 100644 index 0000000..9ce2b252 --- /dev/null +++ b/chrome/browser/android/omnibox/answers_image_bridge.cc
@@ -0,0 +1,77 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/android/jni_android.h" +#include "base/android/jni_string.h" +#include "base/android/scoped_java_ref.h" +#include "base/bind.h" +#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h" +#include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_android.h" +#include "jni/AnswersImageFetcher_jni.h" +#include "net/traffic_annotation/network_traffic_annotation.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "ui/gfx/android/java_bitmap.h" +#include "url/gurl.h" + +using base::android::JavaParamRef; +using base::android::ScopedJavaLocalRef; +using base::android::ConvertUTF8ToJavaString; + +namespace { + +class AnswersImageObserverAndroid : public BitmapFetcherService::Observer { + public: + explicit AnswersImageObserverAndroid(JNIEnv* env, + jobject java_answers_image_observer) { + java_answers_image_observer_.Reset(env, java_answers_image_observer); + } + + ~AnswersImageObserverAndroid() override {} + + // AnswersImageObserver: + void OnImageChanged(BitmapFetcherService::RequestId request_id, + const SkBitmap& answers_image) override { + DCHECK(!answers_image.empty()); + + JNIEnv* env = base::android::AttachCurrentThread(); + ScopedJavaLocalRef<jobject> java_bitmap = + gfx::ConvertToJavaBitmap(&answers_image); + Java_AnswersImageObserver_onAnswersImageChanged( + env, java_answers_image_observer_, java_bitmap); + } + + private: + base::android::ScopedJavaGlobalRef<jobject> java_answers_image_observer_; +}; + +} // namespace + +static void JNI_AnswersImageFetcher_CancelAnswersImageRequest( + JNIEnv* env, + const JavaParamRef<jobject>& java_profile, + jint java_request_id) { + Profile* profile = ProfileAndroid::FromProfileAndroid(java_profile); + DCHECK(profile); + BitmapFetcherService* bitmap_fetcher_service = + BitmapFetcherServiceFactory::GetForBrowserContext(profile); + bitmap_fetcher_service->CancelRequest(java_request_id); +} + +static int JNI_AnswersImageFetcher_RequestAnswersImage( + JNIEnv* env, + const JavaParamRef<jobject>& java_profile, + const JavaParamRef<jstring>& java_url, + const JavaParamRef<jobject>& java_callback) { + Profile* profile = ProfileAndroid::FromProfileAndroid(java_profile); + DCHECK(profile); + BitmapFetcherService* bitmap_fetcher_service = + BitmapFetcherServiceFactory::GetForBrowserContext(profile); + std::string url; + base::android::ConvertJavaStringToUTF8(env, java_url, &url); + return bitmap_fetcher_service->RequestImage( + GURL(url), new AnswersImageObserverAndroid(env, java_callback), + TRAFFIC_ANNOTATION_WITHOUT_PROTO("Omnibox answers image")); +}
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 0000c47..729b986 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -164,7 +164,6 @@ <if expr="optimize_webui"> <then> <include name="IDR_DOWNLOADS_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\downloads\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> - <include name="IDR_DOWNLOADS_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\downloads\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> <include name="IDR_DOWNLOADS_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\downloads\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" /> </then> <else> @@ -288,7 +287,6 @@ <if expr="optimize_webui"> <then> <include name="IDR_BOOKMARKS_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\bookmarks\vulcanized.html" use_base_dir="false" preprocess="true" type="BINDATA" compress="gzip" /> - <include name="IDR_BOOKMARKS_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\bookmarks\vulcanized.p2.html" use_base_dir="false" preprocess="true" type="BINDATA" compress="gzip" /> <include name="IDR_BOOKMARKS_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\bookmarks\crisper.js" use_base_dir="false" preprocess="true" type="BINDATA" compress="gzip" /> </then> <else> @@ -349,10 +347,8 @@ <if expr="optimize_webui"> <then> <include name="IDR_HISTORY_APP_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\history\app.vulcanized.html" preprocess="true" type="BINDATA" compress="gzip" use_base_dir="false" /> - <include name="IDR_HISTORY_APP_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\history\app.vulcanized.p2.html" preprocess="true" type="BINDATA" compress="gzip" use_base_dir="false" /> <include name="IDR_HISTORY_APP_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\history\app.crisper.js" preprocess="true" type="BINDATA" compress="gzip" use_base_dir="false" /> <include name="IDR_HISTORY_LAZY_LOAD_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\history\lazy_load.vulcanized.html" preprocess="true" type="BINDATA" compress="gzip" use_base_dir="false" /> - <include name="IDR_HISTORY_LAZY_LOAD_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\history\lazy_load.vulcanized.p2.html" preprocess="true" type="BINDATA" compress="gzip" use_base_dir="false" /> <include name="IDR_HISTORY_LAZY_LOAD_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\history\lazy_load.crisper.js" preprocess="true" type="BINDATA" compress="gzip" use_base_dir="false" /> </then> <else> @@ -497,7 +493,6 @@ <if expr="optimize_webui"> <then> <include name="IDR_BLUETOOTH_PAIRING_DIALOG_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\chromeos\bluetooth_pairing_dialog\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> - <include name="IDR_BLUETOOTH_PAIRING_DIALOG_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\chromeos\bluetooth_pairing_dialog\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> <include name="IDR_BLUETOOTH_PAIRING_DIALOG_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\bluetooth_pairing_dialog\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" /> </then> <else> @@ -536,10 +531,8 @@ <if expr="optimize_webui"> <then> <include name="IDR_INTERNET_CONFIG_DIALOG_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\chromeos\internet_config_dialog\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> - <include name="IDR_INTERNET_CONFIG_DIALOG_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\chromeos\internet_config_dialog\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> <include name="IDR_INTERNET_CONFIG_DIALOG_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\internet_config_dialog\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" /> <include name="IDR_INTERNET_DETAIL_DIALOG_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\chromeos\internet_detail_dialog\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> - <include name="IDR_INTERNET_DETAIL_DIALOG_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\chromeos\internet_detail_dialog\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> <include name="IDR_INTERNET_DETAIL_DIALOG_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\internet_detail_dialog\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" /> </then> <else>
diff --git a/chrome/browser/chromeos/login/easy_unlock/OWNERS b/chrome/browser/chromeos/login/easy_unlock/OWNERS index 92384b5..8947f4e 100644 --- a/chrome/browser/chromeos/login/easy_unlock/OWNERS +++ b/chrome/browser/chromeos/login/easy_unlock/OWNERS
@@ -1,4 +1,4 @@ hansberry@chromium.org jhawkins@chromium.org -# COMPONENT: UI>SmartLock +# COMPONENT: OS>Systems>Multidevice>SmartLock
diff --git a/chrome/browser/chromeos/night_light/night_light_client.cc b/chrome/browser/chromeos/night_light/night_light_client.cc index 636f608c..61c93a5 100644 --- a/chrome/browser/chromeos/night_light/night_light_client.cc +++ b/chrome/browser/chromeos/night_light/night_light_client.cc
@@ -40,9 +40,15 @@ backoff_delay_(kMinimumDelayAfterFailure), timer_(std::make_unique<base::OneShotTimer>()) {} -NightLightClient::~NightLightClient() {} +NightLightClient::~NightLightClient() { + chromeos::system::TimezoneSettings::GetInstance()->RemoveObserver(this); +} void NightLightClient::Start() { + auto* timezone_settings = chromeos::system::TimezoneSettings::GetInstance(); + current_timezone_id_ = timezone_settings->GetCurrentTimezoneID(); + timezone_settings->AddObserver(this); + if (!night_light_controller_) { service_manager::Connector* connector = content::ServiceManagerConnection::GetForProcess()->GetConnector(); @@ -82,6 +88,21 @@ last_successful_geo_request_time_ + kNextRequestDelayAfterSuccess - now)); } +void NightLightClient::TimezoneChanged(const icu::TimeZone& timezone) { + const base::string16 timezone_id = + chromeos::system::TimezoneSettings::GetTimezoneID(timezone); + if (current_timezone_id_ == timezone_id) + return; + + current_timezone_id_ = timezone_id; + + if (!using_geoposition_) + return; + + // On timezone changes, request an immediate geoposition. + ScheduleNextRequest(base::TimeDelta::FromSeconds(0)); +} + // static base::TimeDelta NightLightClient::GetNextRequestDelayAfterSuccessForTesting() { return kNextRequestDelayAfterSuccess; @@ -105,6 +126,11 @@ clock_ = clock; } +void NightLightClient::SetCurrentTimezoneIdForTesting( + const base::string16& timezone_id) { + current_timezone_id_ = timezone_id; +} + void NightLightClient::OnGeoposition(const chromeos::Geoposition& position, bool server_error, const base::TimeDelta elapsed) {
diff --git a/chrome/browser/chromeos/night_light/night_light_client.h b/chrome/browser/chromeos/night_light/night_light_client.h index c4c9f4d..d6f144c 100644 --- a/chrome/browser/chromeos/night_light/night_light_client.h +++ b/chrome/browser/chromeos/night_light/night_light_client.h
@@ -10,8 +10,10 @@ #include "ash/public/interfaces/night_light_controller.mojom.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/strings/string16.h" #include "base/timer/timer.h" #include "chromeos/geolocation/simple_geolocation_provider.h" +#include "chromeos/settings/timezone_settings.h" #include "mojo/public/cpp/bindings/binding.h" namespace base { @@ -24,7 +26,8 @@ // Periodically requests the IP-based geolocation and provides it to the // NightLightController running in ash. -class NightLightClient : public ash::mojom::NightLightClient { +class NightLightClient : public ash::mojom::NightLightClient, + public chromeos::system::TimezoneSettings::Observer { public: explicit NightLightClient( scoped_refptr<network::SharedURLLoaderFactory> factory); @@ -39,12 +42,19 @@ void OnScheduleTypeChanged( ash::mojom::NightLightController::ScheduleType new_type) override; + // chromeos::system::TimezoneSettings::Observer: + void TimezoneChanged(const icu::TimeZone& timezone) override; + const base::OneShotTimer& timer() const { return *timer_; } base::Time last_successful_geo_request_time() const { return last_successful_geo_request_time_; } + const base::string16& current_timezone_id() const { + return current_timezone_id_; + } + bool using_geoposition() const { return using_geoposition_; } static base::TimeDelta GetNextRequestDelayAfterSuccessForTesting(); @@ -58,6 +68,8 @@ void SetClockForTesting(base::Clock* clock); + void SetCurrentTimezoneIdForTesting(const base::string16& timezone_id); + protected: void OnGeoposition(const chromeos::Geoposition& position, bool server_error, @@ -94,6 +106,9 @@ double latitude_ = 0.0; double longitude_ = 0.0; + // The ID of the current timezone in the fromat similar to "America/Chicago". + base::string16 current_timezone_id_; + // True as long as the schedule type is set to "sunset to sunrise", which // means this client will be retrieving the IP-based geoposition once per day. bool using_geoposition_ = false;
diff --git a/chrome/browser/chromeos/night_light/night_light_client_unittest.cc b/chrome/browser/chromeos/night_light/night_light_client_unittest.cc index cdeda65..db2e911 100644 --- a/chrome/browser/chromeos/night_light/night_light_client_unittest.cc +++ b/chrome/browser/chromeos/night_light/night_light_client_unittest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/chromeos/night_light/night_light_client.h" #include "ash/public/interfaces/night_light_controller.mojom.h" +#include "base/strings/utf_string_conversions.h" #include "base/test/scoped_task_environment.h" #include "base/time/clock.h" #include "base/time/tick_clock.h" @@ -12,11 +13,23 @@ #include "mojo/public/cpp/bindings/binding.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/icu/source/common/unicode/unistr.h" +#include "third_party/icu/source/i18n/unicode/timezone.h" namespace { using ScheduleType = ash::mojom::NightLightController::ScheduleType; +// Constructs a TimeZone object from the given |timezone_id|. +std::unique_ptr<icu::TimeZone> CreateTimezone(const char* timezone_id) { + return base::WrapUnique(icu::TimeZone::createTimeZone( + icu::UnicodeString(timezone_id, -1, US_INV))); +} + +base::string16 GetTimezoneId(const icu::TimeZone& timezone) { + return chromeos::system::TimezoneSettings::GetTimezoneID(timezone); +} + // A fake implementation of NightLightController for testing. class FakeNightLightController : public ash::mojom::NightLightController { public: @@ -222,4 +235,58 @@ EXPECT_EQ(expected_delay, client_.timer().GetCurrentDelay()); } +// Tests that timezone changes result in new geoposition requests only if the +// schedule type is sunset to sunrise. +TEST_F(NightLightClientTest, TestTimezoneChanges) { + EXPECT_EQ(0, controller_.position_pushes_num()); + client_.SetCurrentTimezoneIdForTesting( + base::ASCIIToUTF16("America/Los_Angeles")); + + // When schedule type is not sunset to sunrise, timezone changes do not result + // in geoposition requests. + controller_.NotifyScheduleTypeChanged(ScheduleType::kNone); + scoped_task_environment_.RunUntilIdle(); + client_.FlushNightLightControllerForTesting(); + EXPECT_FALSE(client_.using_geoposition()); + auto timezone = CreateTimezone("Africa/Cairo"); + client_.TimezoneChanged(*timezone); + scoped_task_environment_.RunUntilIdle(); + EXPECT_EQ(0, controller_.position_pushes_num()); + EXPECT_EQ(0, client_.geoposition_requests_num()); + EXPECT_EQ(GetTimezoneId(*timezone), client_.current_timezone_id()); + + // Prepare a valid geoposition. + chromeos::Geoposition position; + position.latitude = 32.0; + position.longitude = 31.0; + position.status = chromeos::Geoposition::STATUS_OK; + position.accuracy = 10; + position.timestamp = base::Time::Now(); + client_.set_position_to_send(position); + + // Change the schedule type to sunset to sunrise, and expect the geoposition + // will be pushed. + controller_.NotifyScheduleTypeChanged(ScheduleType::kSunsetToSunrise); + scoped_task_environment_.RunUntilIdle(); + client_.FlushNightLightControllerForTesting(); + EXPECT_EQ(1, controller_.position_pushes_num()); + EXPECT_EQ(1, client_.geoposition_requests_num()); + + // Updates with the same timezone does not result in new requests. + timezone = CreateTimezone("Africa/Cairo"); + client_.TimezoneChanged(*timezone); + scoped_task_environment_.RunUntilIdle(); + EXPECT_EQ(1, controller_.position_pushes_num()); + EXPECT_EQ(1, client_.geoposition_requests_num()); + EXPECT_EQ(GetTimezoneId(*timezone), client_.current_timezone_id()); + + // Only new timezones results in new geoposition requests. + timezone = CreateTimezone("Asia/Tokyo"); + client_.TimezoneChanged(*timezone); + scoped_task_environment_.RunUntilIdle(); + EXPECT_EQ(2, controller_.position_pushes_num()); + EXPECT_EQ(2, client_.geoposition_requests_num()); + EXPECT_EQ(GetTimezoneId(*timezone), client_.current_timezone_id()); +} + } // namespace
diff --git a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc index 1a8c3a5..aa9fedb4 100644 --- a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc +++ b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
@@ -2748,6 +2748,54 @@ WaitForSessionStart(); } +IN_PROC_BROWSER_TEST_P(TermsOfServiceDownloadTest, DeclineTermsOfService) { + // Specify Terms of Service URL. + ASSERT_TRUE(embedded_test_server()->Start()); + device_local_account_policy_.payload().mutable_termsofserviceurl()->set_value( + embedded_test_server() + ->GetURL(std::string("/") + (GetParam() + ? kExistentTermsOfServicePath + : kNonexistentTermsOfServicePath)) + .spec()); + UploadAndInstallDeviceLocalAccountPolicy(); + AddPublicSessionToDevicePolicy(kAccountId1); + + WaitForPolicy(); + + ASSERT_NO_FATAL_FAILURE(StartLogin(std::string(), std::string())); + + // Set up an observer that will quit the message loop when login has succeeded + // and the first wizard screen, if any, is being shown. + base::RunLoop login_wait_run_loop; + chromeos::MockAuthStatusConsumer login_status_consumer( + login_wait_run_loop.QuitClosure()); + EXPECT_CALL(login_status_consumer, OnAuthSuccess(_)) + .Times(1) + .WillOnce(InvokeWithoutArgs(&login_wait_run_loop, &base::RunLoop::Quit)); + + // Spin the loop until the observer fires. Then, unregister the observer. + chromeos::ExistingUserController* controller = + chromeos::ExistingUserController::current_controller(); + ASSERT_TRUE(controller); + controller->set_login_status_consumer(&login_status_consumer); + login_wait_run_loop.Run(); + controller->set_login_status_consumer(NULL); + + // Verify that the Terms of Service screen is being shown. + chromeos::WizardController* wizard_controller = + chromeos::WizardController::default_controller(); + ASSERT_TRUE(wizard_controller); + ASSERT_TRUE(wizard_controller->current_screen()); + EXPECT_EQ(chromeos::OobeScreen::SCREEN_TERMS_OF_SERVICE, + wizard_controller->current_screen()->screen_id()); + + // Click the back button. + ASSERT_TRUE( + content::ExecuteScript(contents_, "$('tos-back-button').click();")); + + EXPECT_TRUE(session_manager_client()->session_stopped()); +} + INSTANTIATE_TEST_SUITE_P(TermsOfServiceDownloadTestInstance, TermsOfServiceDownloadTest, testing::Bool());
diff --git a/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc b/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc index 539c1a8..116d11b8 100644 --- a/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc +++ b/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc
@@ -528,7 +528,6 @@ bool using_spdy, net::NextProto negotiated_protocol, net::ProxyDelegate* proxy_delegate, - bool is_https_proxy, const net::NetworkTrafficAnnotationTag& traffic_annotation) override { NOTIMPLEMENTED(); return nullptr;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 99ce4d44..b81ff4f 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -131,6 +131,11 @@ "expiry_milestone": 76 }, { + "name": "arc-print-spooler-experiment", + "owners": [ "jschettler@google.com", "bmgordon@google.com" ], + "expiry_milestone": 80 + }, + { "name": "arc-usb-host", "owners": [ "lgcheng" ], "expiry_milestone": 76 @@ -623,8 +628,8 @@ }, { "name": "double-tap-to-zoom-in-tablet-mode", - // "owners": [ "your-team" ], - "expiry_milestone": 76 + "owners": [ "afakhry" ], + "expiry_milestone": 80 }, { "name": "download-home-v2", @@ -850,11 +855,6 @@ "expiry_milestone": 73 }, { - "name": "enable-autofill-save-card-sign-in-after-local-save", - "owners": [ "manasverma@google.com" ], - "expiry_milestone": 76 - }, - { "name": "enable-autofill-save-credit-card-uses-strike-system", "owners": [ "annelim@google.com", "jsaul@google.com" ], "expiry_milestone": 76 @@ -2794,8 +2794,8 @@ }, { "name": "silent-debugger-extension-api", - // "owners": [ "your-team" ], - "expiry_milestone": 76 + "owners": [ "//extensions/OWNERS" ], + "expiry_milestone": 77 }, { "name": "simplify-https-indicator", @@ -2808,11 +2808,6 @@ "expiry_milestone": 76 }, { - "name": "site-characteristics-database", - // "owners": [ "your-team" ], - "expiry_milestone": 76 - }, - { "_comment1": "Shipping some form of Site Isolation to Android is tracked", "_comment2": "in https://crbug.com/849815.", "name": "site-isolation-trial-opt-out",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index ee4ff3a..4b1cadaf 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -472,13 +472,6 @@ "If enabled, adds a [No thanks] button to credit card save bubbles and " "updates their title headers."; -const char kEnableAutofillSaveCardSignInAfterLocalSaveName[] = - "Show Sign-In/Sync promo after saving a card locally"; -const char kEnableAutofillSaveCardSignInAfterLocalSaveDescription[] = - "If enabled, shows a sign in prompt to the user after the user " - "saves a card locally. This also introduces a Manage Cards bubble " - "which you can access from the card icon after saving a card."; - const char kEnableAutofillSaveCreditCardUsesStrikeSystemName[] = "Enable limit on offering to save the same credit card repeatedly"; const char kEnableAutofillSaveCreditCardUsesStrikeSystemDescription[] = @@ -2768,12 +2761,6 @@ "Enabled/disable showing enterprise users a 'Managed by your organization' " "message in the app menu and on some chrome:// pages."; -const char kSiteCharacteristicsDatabaseName[] = "Site Characteristics database"; -const char kSiteCharacteristicsDatabaseDescription[] = - "Records usage of some features in a database while a tab is in background " - "(title/favicon update, audio playback or usage of non-persistent " - "notifications)."; - const char kUseGoogleLocalNtpName[] = "Enable using the Google local NTP"; const char kUseGoogleLocalNtpDescription[] = "Use the local New Tab page if Google is the default search engine."; @@ -2956,6 +2943,11 @@ const char kArcNativeBridgeExperimentDescription[] = "Enables experimental native bridge feature."; +const char kArcPrintSpoolerExperimentName[] = + "Enable print spooler experiment for ARC"; +const char kArcPrintSpoolerExperimentDescription[] = + "Enables using Chrome OS print system and print preview in ARC."; + const char kArcUsbHostName[] = "Enable ARC USB host integration"; const char kArcUsbHostDescription[] = "Allow Android apps to use USB host feature on ChromeOS devices.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 9db74f7..32d9acb 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -316,9 +316,6 @@ extern const char kEnableAutofillSaveCardDialogUnlabeledExpirationDateDescription[]; -extern const char kEnableAutofillSaveCardSignInAfterLocalSaveName[]; -extern const char kEnableAutofillSaveCardSignInAfterLocalSaveDescription[]; - extern const char kEnableAutofillSendExperimentIdsInPaymentsRPCsName[]; extern const char kEnableAutofillSendExperimentIdsInPaymentsRPCsDescription[]; @@ -1647,9 +1644,6 @@ extern const char kShowManagedUiName[]; extern const char kShowManagedUiDescription[]; -extern const char kSiteCharacteristicsDatabaseName[]; -extern const char kSiteCharacteristicsDatabaseDescription[]; - extern const char kUseGoogleLocalNtpName[]; extern const char kUseGoogleLocalNtpDescription[]; @@ -1777,6 +1771,9 @@ extern const char kArcNativeBridgeExperimentName[]; extern const char kArcNativeBridgeExperimentDescription[]; +extern const char kArcPrintSpoolerExperimentName[]; +extern const char kArcPrintSpoolerExperimentDescription[]; + extern const char kArcUsbHostName[]; extern const char kArcUsbHostDescription[];
diff --git a/chrome/browser/history/redirect_browsertest.cc b/chrome/browser/history/redirect_browsertest.cc index bc313f9..6d49b95 100644 --- a/chrome/browser/history/redirect_browsertest.cc +++ b/chrome/browser/history/redirect_browsertest.cc
@@ -145,11 +145,10 @@ file_redirect_contents.data(), file_redirect_contents.size())); - // Navigate to the file through the browser. The client redirect will appear - // as two page visits in the browser. + // Navigate to the file through the browser. GURL first_url = net::FilePathToFileURL(temp_file); - ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( - browser(), first_url, 2); + ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), + first_url, 1); std::vector<GURL> redirects = GetRedirects(first_url); ASSERT_EQ(1U, redirects.size()); @@ -178,10 +177,10 @@ std::vector<GURL> redirects = GetRedirects(first_url); - // There should be no redirects from first_url, because the anchor location - // change that occurs should not be flagged as a redirect and the meta-refresh + // There should be 1 redirect from first_url, because the anchor location + // change that occurs should be flagged as a redirect but the meta-refresh // won't have fired yet. - ASSERT_EQ(0U, redirects.size()); + ASSERT_EQ(1U, redirects.size()); EXPECT_EQ("myanchor", web_contents->GetURL().ref()); }
diff --git a/chrome/browser/media/android/cdm/media_drm_origin_id_manager_unittest.cc b/chrome/browser/media/android/cdm/media_drm_origin_id_manager_unittest.cc index 2237821..13968cd19 100644 --- a/chrome/browser/media/android/cdm/media_drm_origin_id_manager_unittest.cc +++ b/chrome/browser/media/android/cdm/media_drm_origin_id_manager_unittest.cc
@@ -151,6 +151,8 @@ EXPECT_FALSE( base::FeatureList::IsEnabled(media::kMediaDrmPreprovisioningAtStartup)); + EXPECT_FALSE( + base::FeatureList::IsEnabled(media::kFailUrlProvisionFetcherForTesting)); test_browser_thread_bundle_.RunUntilIdle();
diff --git a/chrome/browser/notifications/notification_platform_bridge_win.cc b/chrome/browser/notifications/notification_platform_bridge_win.cc index 5a1adbf9..bb18548 100644 --- a/chrome/browser/notifications/notification_platform_bridge_win.cc +++ b/chrome/browser/notifications/notification_platform_bridge_win.cc
@@ -520,7 +520,7 @@ notifications; for (uint32_t index = 0; index < size; ++index) { mswr::ComPtr<winui::Notifications::IToastNotification> tn; - hr = list->GetAt(0U, &tn); + hr = list->GetAt(index, &tn); if (FAILED(hr)) { status = GetDisplayedStatus::SUCCESS_WITH_GET_AT_FAILURE; DLOG(ERROR) << "Failed to get notification " << index << " of " << size @@ -851,20 +851,19 @@ return false; } - if (launch_id.is_for_dismiss_button()) { - LogActivationStatus(ActivationStatus::SUCCESS); - return true; // We're done! The toast has already dismissed. - } - base::Optional<base::string16> reply; base::string16 inline_reply = command_line.GetSwitchValueNative(switches::kNotificationInlineReply); if (!inline_reply.empty()) reply = inline_reply; - NotificationCommon::Operation operation = - launch_id.is_for_context_menu() ? NotificationCommon::OPERATION_SETTINGS - : NotificationCommon::OPERATION_CLICK; + NotificationCommon::Operation operation; + if (launch_id.is_for_dismiss_button()) + operation = NotificationCommon::OPERATION_CLOSE; + else if (launch_id.is_for_context_menu()) + operation = NotificationCommon::OPERATION_SETTINGS; + else + operation = NotificationCommon::OPERATION_CLICK; base::Optional<int> action_index; if (launch_id.button_index() != -1)
diff --git a/chrome/browser/notifications/notification_platform_bridge_win_interactive_uitest.cc b/chrome/browser/notifications/notification_platform_bridge_win_interactive_uitest.cc index 61ef5f2..9d67cf93 100644 --- a/chrome/browser/notifications/notification_platform_bridge_win_interactive_uitest.cc +++ b/chrome/browser/notifications/notification_platform_bridge_win_interactive_uitest.cc
@@ -324,6 +324,33 @@ EXPECT_EQ(base::nullopt, last_by_user_); } +IN_PROC_BROWSER_TEST_F(NotificationPlatformBridgeWinUITest, HandleClose) { + if (base::win::GetVersion() < kMinimumWindowsVersion) + return; + + base::RunLoop run_loop; + display_service_tester_->SetProcessNotificationOperationDelegate( + base::BindRepeating(&NotificationPlatformBridgeWinUITest::HandleOperation, + base::Unretained(this), run_loop.QuitClosure())); + + // Simulate notification close. + base::CommandLine command_line(base::CommandLine::NO_PROGRAM); + command_line.AppendSwitchNative( + switches::kNotificationLaunchId, + L"3|0|Default|0|https://example.com/|notification_id"); + NotificationPlatformBridgeWin::HandleActivation(command_line); + run_loop.Run(); + + // Validate the values. + EXPECT_EQ(NotificationCommon::OPERATION_CLOSE, last_operation_); + EXPECT_EQ(NotificationHandler::Type::WEB_PERSISTENT, last_notification_type_); + EXPECT_EQ(GURL("https://example.com/"), last_origin_); + EXPECT_EQ("notification_id", last_notification_id_); + EXPECT_EQ(base::nullopt, last_action_index_); + EXPECT_EQ(base::nullopt, last_reply_); + EXPECT_EQ(true, last_by_user_); +} + IN_PROC_BROWSER_TEST_F(NotificationPlatformBridgeWinUITest, GetDisplayed) { if (base::win::GetVersion() < kMinimumWindowsVersion) return;
diff --git a/chrome/browser/permissions/chooser_context_base.cc b/chrome/browser/permissions/chooser_context_base.cc index 67ac2de..5d3a831 100644 --- a/chrome/browser/permissions/chooser_context_base.cc +++ b/chrome/browser/permissions/chooser_context_base.cc
@@ -8,6 +8,7 @@ #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "components/content_settings/core/browser/host_content_settings_map.h" +#include "url/origin.h" const char kObjectListKey[] = "chosen-objects"; @@ -54,40 +55,42 @@ } bool ChooserContextBase::CanRequestObjectPermission( - const GURL& requesting_origin, - const GURL& embedding_origin) { + const url::Origin& requesting_origin, + const url::Origin& embedding_origin) { ContentSetting content_setting = host_content_settings_map_->GetContentSetting( - requesting_origin, embedding_origin, guard_content_settings_type_, - std::string()); + requesting_origin.GetURL(), embedding_origin.GetURL(), + guard_content_settings_type_, std::string()); DCHECK(content_setting == CONTENT_SETTING_ASK || content_setting == CONTENT_SETTING_BLOCK); return content_setting == CONTENT_SETTING_ASK; } std::vector<std::unique_ptr<ChooserContextBase::Object>> -ChooserContextBase::GetGrantedObjects(const GURL& requesting_origin, - const GURL& embedding_origin) { - DCHECK_EQ(requesting_origin, requesting_origin.GetOrigin()); - DCHECK_EQ(embedding_origin, embedding_origin.GetOrigin()); - std::vector<std::unique_ptr<Object>> results; +ChooserContextBase::GetGrantedObjects(const GURL& requesting_origin_url, + const GURL& embedding_origin_url) { + const auto requesting_origin = url::Origin::Create(requesting_origin_url); + DCHECK_EQ(requesting_origin_url, requesting_origin.GetURL()); + const auto embedding_origin = url::Origin::Create(embedding_origin_url); + DCHECK_EQ(embedding_origin_url, embedding_origin.GetURL()); if (!CanRequestObjectPermission(requesting_origin, embedding_origin)) - return results; + return {}; content_settings::SettingInfo info; base::Value setting = - GetWebsiteSetting(requesting_origin, embedding_origin, &info); + GetWebsiteSetting(requesting_origin_url, embedding_origin_url, &info); base::Value* objects = setting.FindListKey(kObjectListKey); if (!objects) - return results; + return {}; + std::vector<std::unique_ptr<Object>> results; for (auto& object : objects->GetList()) { if (IsValidObject(object)) { results.push_back(std::make_unique<Object>( - requesting_origin, embedding_origin, std::move(object), info.source, - host_content_settings_map_->is_incognito())); + requesting_origin_url, embedding_origin_url, std::move(object), + info.source, host_content_settings_map_->is_incognito())); } } return results; @@ -101,17 +104,19 @@ std::vector<std::unique_ptr<Object>> results; for (const ContentSettingPatternSource& content_setting : content_settings) { - GURL requesting_origin(content_setting.primary_pattern.ToString()); - GURL embedding_origin(content_setting.secondary_pattern.ToString()); - if (!requesting_origin.is_valid() || !embedding_origin.is_valid()) + GURL requesting_origin_url(content_setting.primary_pattern.ToString()); + GURL embedding_origin_url(content_setting.secondary_pattern.ToString()); + if (!requesting_origin_url.is_valid() || !embedding_origin_url.is_valid()) continue; + const auto requesting_origin = url::Origin::Create(requesting_origin_url); + const auto embedding_origin = url::Origin::Create(embedding_origin_url); if (!CanRequestObjectPermission(requesting_origin, embedding_origin)) continue; content_settings::SettingInfo info; base::Value setting = - GetWebsiteSetting(requesting_origin, embedding_origin, &info); + GetWebsiteSetting(requesting_origin_url, embedding_origin_url, &info); base::Value* objects = setting.FindListKey(kObjectListKey); if (!objects) continue; @@ -122,8 +127,8 @@ } results.push_back(std::make_unique<Object>( - requesting_origin, embedding_origin, std::move(object), info.source, - content_setting.incognito)); + requesting_origin_url, embedding_origin_url, std::move(object), + info.source, content_setting.incognito)); } }
diff --git a/chrome/browser/permissions/chooser_context_base.h b/chrome/browser/permissions/chooser_context_base.h index 4ec269f..098caf2 100644 --- a/chrome/browser/permissions/chooser_context_base.h +++ b/chrome/browser/permissions/chooser_context_base.h
@@ -20,6 +20,10 @@ class HostContentSettingsMap; class Profile; +namespace url { +class Origin; +} + // This is the base class for services that manage any type of permission that // is granted through a chooser-style UI instead of a simple allow/deny prompt. // Subclasses must define the structure of the objects that are stored. @@ -68,8 +72,8 @@ // when embedded within |embedding_origin|. This is done by checking // |guard_content_settings_type_| which will usually be "ask" by default but // could be set by the user or group policy. - bool CanRequestObjectPermission(const GURL& requesting_origin, - const GURL& embedding_origin); + bool CanRequestObjectPermission(const url::Origin& requesting_origin, + const url::Origin& embedding_origin); // Returns the list of objects that |requesting_origin| has been granted // permission to access when embedded within |embedding_origin|.
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc index 7d6dfc0..432e9cf4 100644 --- a/chrome/browser/policy/policy_browsertest.cc +++ b/chrome/browser/policy/policy_browsertest.cc
@@ -6388,28 +6388,28 @@ #endif // !defined(OS_ANDROID) IN_PROC_BROWSER_TEST_F(PolicyTest, WebUsbDefault) { - const GURL kTestUrl("https://foo.com:443"); + const auto kTestOrigin = url::Origin::Create(GURL("https://foo.com:443")); // Expect the default permission value to be 'ask'. auto* context = UsbChooserContextFactory::GetForProfile(browser()->profile()); - EXPECT_TRUE(context->CanRequestObjectPermission(kTestUrl, kTestUrl)); + EXPECT_TRUE(context->CanRequestObjectPermission(kTestOrigin, kTestOrigin)); // Update policy to change the default permission value to 'block'. PolicyMap policies; SetPolicy(&policies, key::kDefaultWebUsbGuardSetting, std::make_unique<base::Value>(2)); UpdateProviderPolicy(policies); - EXPECT_FALSE(context->CanRequestObjectPermission(kTestUrl, kTestUrl)); + EXPECT_FALSE(context->CanRequestObjectPermission(kTestOrigin, kTestOrigin)); // Update policy to change the default permission value to 'ask'. SetPolicy(&policies, key::kDefaultWebUsbGuardSetting, std::make_unique<base::Value>(3)); UpdateProviderPolicy(policies); - EXPECT_TRUE(context->CanRequestObjectPermission(kTestUrl, kTestUrl)); + EXPECT_TRUE(context->CanRequestObjectPermission(kTestOrigin, kTestOrigin)); } IN_PROC_BROWSER_TEST_F(PolicyTest, WebUsbAllowDevicesForUrls) { - const GURL kTestUrl("https://foo.com:443"); + const auto kTestOrigin = url::Origin::Create(GURL("https://foo.com:443")); scoped_refptr<device::UsbDevice> device = base::MakeRefCounted<device::MockUsbDevice>(0, 0, "Google", "Gizmo", "123ABC"); @@ -6417,10 +6417,11 @@ // Expect the default permission value to be empty. auto* context = UsbChooserContextFactory::GetForProfile(browser()->profile()); - EXPECT_FALSE(context->HasDevicePermission(kTestUrl, kTestUrl, *device_info)); + EXPECT_FALSE( + context->HasDevicePermission(kTestOrigin, kTestOrigin, *device_info)); - // Update policy to add an entry to the permission value to allow |kTestUrl| - // to access the device described by |device_info|. + // Update policy to add an entry to the permission value to allow + // |kTestOrigin| to access the device described by |device_info|. PolicyMap policies; base::Value device_value(base::Value::Type::DICTIONARY); @@ -6444,14 +6445,16 @@ std::move(policy_value)); UpdateProviderPolicy(policies); - EXPECT_TRUE(context->HasDevicePermission(kTestUrl, kTestUrl, *device_info)); + EXPECT_TRUE( + context->HasDevicePermission(kTestOrigin, kTestOrigin, *device_info)); // Remove the policy to ensure that it can be dynamically updated. SetPolicy(&policies, key::kWebUsbAllowDevicesForUrls, std::make_unique<base::Value>(base::Value::Type::LIST)); UpdateProviderPolicy(policies); - EXPECT_FALSE(context->HasDevicePermission(kTestUrl, kTestUrl, *device_info)); + EXPECT_FALSE( + context->HasDevicePermission(kTestOrigin, kTestOrigin, *device_info)); } // Handler for embedded http-server, returns a small page with javascript
diff --git a/chrome/browser/resources/bookmarks/BUILD.gn b/chrome/browser/resources/bookmarks/BUILD.gn index c405c90..84672ac 100644 --- a/chrome/browser/resources/bookmarks/BUILD.gn +++ b/chrome/browser/resources/bookmarks/BUILD.gn
@@ -9,7 +9,6 @@ host = "bookmarks" html_in_files = [ "bookmarks.html" ] html_out_files = [ "vulcanized.html" ] - html_out_files_polymer2 = [ "vulcanized.p2.html" ] input = rebase_path(".", root_build_dir) js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn index 8a5a05a..571af2a3 100644 --- a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn +++ b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn
@@ -9,7 +9,6 @@ host = "bluetooth_pairing_dialog" html_in_files = [ "bluetooth_pairing_dialog.html" ] html_out_files = [ "vulcanized.html" ] - html_out_files_polymer2 = [ "vulcanized.p2.html" ] input = rebase_path(".", root_build_dir) js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ta.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ta.xtb index 84f7fd1..f3720a49 100644 --- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ta.xtb +++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_ta.xtb
@@ -21,9 +21,11 @@ <translation id="3081586908890909590">வீடியோவைப் பதிவுசெய்யும் பயன்முறைக்கு மாறு</translation> <translation id="3183731565330012717">கட்ட வகை</translation> <translation id="3227137524299004712">மைக்ரோஃபோன்</translation> +<translation id="3517926952904427380">படத்தை நீளவாக்கில் எடுக்க முடியவில்லை</translation> <translation id="3569311554794739032"><ph name="FILE" /> கோப்பை நிச்சயமாக அகற்ற விரும்புகிறீர்களா?</translation> <translation id="3810838688059735925">வீடியோ</translation> <translation id="4279490309300973883">பிரதிபலிக்கிறது</translation> +<translation id="4329152592498422850">சதுர வடிவத்தில் படமெடுக்குமாறு மாற்றவும்</translation> <translation id="4445542136948522167">படமெடுப்பதை நிறுத்து</translation> <translation id="4628948037717959914">படம்</translation> <translation id="4649291346448517080">கோப்பைச் சேமிக்க முடியவில்லை</translation> @@ -50,6 +52,7 @@ <translation id="8145038249676204903">படமெடுக்கும் பயன்முறைக்கு மாறு</translation> <translation id="8261506727792406068">நீக்கு</translation> <translation id="8428213095426709021">அமைப்புகள்</translation> +<translation id="8815966864175525708">நீளவாக்கில் படமெடுக்குமாறு மாற்றவும்</translation> <translation id="8870695351537079478">பதிவுசெய்வதைத் தொடங்க முடியவில்லை</translation> <translation id="9045155556724273246">10 விநாடிகள்</translation> <translation id="945522503751344254">பின்னூட்டம் அனுப்புக</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb index d119dda6..b27927e 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
@@ -326,7 +326,7 @@ <translation id="3312997241656799641">Enllaç visitat següent</translation> <translation id="3313245066383501820">Tecla modificadora de ChromeVox</translation> <translation id="3317212938060708859">Un control lliscant</translation> -<translation id="3321460131042519426">Activa l'ajust de la paraula a la línia</translation> +<translation id="3321460131042519426">Activa l'ajust de paraules</translation> <translation id="3322936298410871309">Capçalera del nivell 1 anterior</translation> <translation id="3323447499041942178">Quadre de text</translation> <translation id="3324983252691184275">Carmesí</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb index 70ec4ae..ab6c329 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
@@ -214,6 +214,7 @@ <translation id="2626530649491650971">dapat diklik</translation> <translation id="2628764385451019380">Tidak ada kotak kombo sebelumnya.</translation> <translation id="2637227747952042642">Matematika</translation> +<translation id="2638785836053527382">Download <ph name="FILE_NAME" /> dilanjutkan</translation> <translation id="2639750663247012216">Pengubah ChromeVox</translation> <translation id="2644542693584024604">salah eja</translation> <translation id="2661530546602071611">Pemberitahuan</translation> @@ -622,7 +623,7 @@ <translation id="5349770431644471053">Back link</translation> <translation id="536031132345979795">Lompat ke belakang selama proses membaca berlangsung</translation> <translation id="5368000168321181111">Earcons tidak aktif</translation> -<translation id="5368505757342402527">Download <ph name="PROGRESS" />% complete <ph name="FILE_NAME" />. About <ph name="TIME" /> <ph name="UNITS" /> remaining.</translation> +<translation id="5368505757342402527">Download <ph name="FILE_NAME" /> <ph name="PROGRESS" />% selesai. Sekitar <ph name="TIME" /> <ph name="UNITS" /> lagi.</translation> <translation id="5374320867641260420">Tidak ada tombol berikutnya.</translation> <translation id="5376407118396657359">Tekan Search+Ctrl+Alt dengan tanda panah untuk memilih sel.</translation> <translation id="5382299583965267720">Tidak ada judul tingkat 1 berikutnya.</translation> @@ -1002,7 +1003,7 @@ <translation id="8096975275316362544">Mint Cream</translation> <translation id="8098587210054821856">Slate Grey</translation> <translation id="8110647606445335195">Tidak ada bangunan terkenal ARIA.</translation> -<translation id="812886159861361726">Download stopped <ph name="FILE_NAME" /></translation> +<translation id="812886159861361726">Download <ph name="FILE_NAME" /> dihentikan</translation> <translation id="8138880386467279117">Sentuh</translation> <translation id="8153880621934657047">Tidak ada di dalam tabel.</translation> <translation id="817440585505441544">{COUNT,plural, =1{garis bawah}other{# garis bawah}}</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb index 24ab9f7d..0af23de 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
@@ -214,6 +214,7 @@ <translation id="2626530649491650971">spustelėjamas</translation> <translation id="2628764385451019380">Nėra ankstesnio išskleidžiamojo laukelio.</translation> <translation id="2637227747952042642">Matematika</translation> +<translation id="2638785836053527382">„<ph name="FILE_NAME" />“ atsisiuntimas atnaujintas</translation> <translation id="2639750663247012216">„ChromeVox“ modifikatorius</translation> <translation id="2644542693584024604">netaisyklingai parašyta</translation> <translation id="2661530546602071611">Pranešimas</translation> @@ -253,6 +254,7 @@ <translation id="287383510823843610">Tamsiai oranžinė spalva</translation> <translation id="2879867157561757640">Perbraukite trim pirštais žemyn</translation> <translation id="288178314850623291">Jei norite praleisti konkrečių tipų elementus, naudokite nukreipimo komandas. Kad pereitumėte pirmyn nuo vienos antraštės prie kitos, paspauskite „Search“ ir H. Kad pereitumėte atgal, paspauskite „Search“ + „Shift“ + H.</translation> +<translation id="2885764457467528513">{COUNT,plural, =1{minutė}one{minutės}few{minutės}many{minutės}other{minutės}}</translation> <translation id="2894654529758326923">Informacija</translation> <translation id="2899328121302785497">{COUNT,plural, =1{atidaromasis riestinis skliaustas}one{# atidaromasis riestinis skliaustas}few{# atidaromieji riestiniai skliaustai}many{# left braces}other{# atidaromųjų riestinių skliaustų}}</translation> <translation id="2911433807131383493">Atidaryti „ChromeVox“ mokymo programą</translation> @@ -287,6 +289,7 @@ <translation id="3084806535845658316">nėra įvedimo aido</translation> <translation id="3086746722712840547">pastaba</translation> <translation id="308895241372589742">Nėra kitos matematinės išraiškos.</translation> +<translation id="3090227230165225418">Pateikti atsisiuntimo pranešimus</translation> <translation id="3090532668523289635">grp</translation> <translation id="3093176084511590672">Kitas orientyras</translation> <translation id="3096671415663099226">cbo</translation> @@ -439,6 +442,7 @@ <translation id="4148180433151187540">{COUNT,plural, =1{uždaromasis riestinis skliaustas}one{# uždaromasis riestinis skliaustas}few{# uždaromieji riestiniai skliaustas}many{# right braces}other{# uždaromųjų riestinių skliaustų}}</translation> <translation id="4158704014418536539">Skirti didžiąsias ir mažąsias raides.</translation> <translation id="4159784952369912983">Violetinė</translation> +<translation id="4161104397932142764">{COUNT,plural, =1{sekundė}one{sekundės}few{sekundės}many{sekundės}other{sekundės}}</translation> <translation id="4161663686871496107">„ChromeVox“ ekrano skaitymas balsu parengtas</translation> <translation id="4173994908659439270">Nėra kito redaguotino teksto lauko.</translation> <translation id="4176463684765177261">Neleista</translation> @@ -619,6 +623,7 @@ <translation id="5349770431644471053">Atgalinė nuoroda</translation> <translation id="536031132345979795">Praleisti atgal nepertraukiamai skaitant</translation> <translation id="5368000168321181111">Garsiniai ženkleliai išjungti</translation> +<translation id="5368505757342402527">Atsisiųsta <ph name="PROGRESS" /> proc. failo „<ph name="FILE_NAME" />“. Liko apie <ph name="TIME" /> <ph name="UNITS" />.</translation> <translation id="5374320867641260420">Nėra kito mygtuko.</translation> <translation id="5376407118396657359">Jei norite naršyti po vieną langelį, paspauskite paieškos + „Ctrl“ + „Alt“ ir rodyklių klavišus.</translation> <translation id="5382299583965267720">Nėra kitos 1 lygio antraštės.</translation> @@ -801,6 +806,7 @@ <translation id="667999046851023355">Dokumentas</translation> <translation id="6688209025607531203">Ne modalinis įspėjimas</translation> <translation id="6689672606256159458">Tamsi rausvai oranžinė spalva</translation> +<translation id="669617842401078250">„<ph name="FILE_NAME" />“ atsisiuntimas pristabdytas</translation> <translation id="6696967141280706829">Įvadas</translation> <translation id="6697092096875747123">Ankstesnis išskleidžiamasis sąrašas</translation> <translation id="6702609185760332517">{COUNT,plural, =1{šauktukas}one{# šauktukas}few{# šauktukai}many{# šauktuko}other{# šauktukų}}</translation> @@ -939,6 +945,7 @@ <translation id="7641134354185483015">Nėra ankstesnės 3 lygio antraštės.</translation> <translation id="7659376057562985921"><ph name="VALUE" />, <ph name="NAME" />, teksto laukelis</translation> <translation id="7663318257180412551">2 antraštė</translation> +<translation id="7668307052366682650">{COUNT,plural, =1{valanda}one{valandos}few{valandos}many{valandos}other{valandos}}</translation> <translation id="7674576868851035240">Kita nuoroda</translation> <translation id="7674768236845044097">žymėjimas</translation> <translation id="7684431668231950609">Teksto redagavimas, URL įrašas</translation> @@ -953,6 +960,7 @@ <ph name="LINE_THROUGH_STRING" /> <ph name="FONT_FAMILY_STRING" /></translation> <translation id="7701196182766842984">autolst</translation> +<translation id="7763537600611320912">„<ph name="FILE_NAME" />“ atsisiuntimo procesas pradėtas</translation> <translation id="7770823902658038748"><ph name="VALUE" />, <ph name="NAME" />, slaptažodžio teksto laukelis</translation> <translation id="7776293189010177726">Atidaryti „ChromeVox“ meniu</translation> <translation id="7800558923657349506">Epilogas</translation> @@ -1077,6 +1085,7 @@ <translation id="8096975275316362544">Šviesi mėtų spalva</translation> <translation id="8098587210054821856">Pilka spalva su melsvu atspalviu</translation> <translation id="8110647606445335195">Nėra ARIA orientyrų.</translation> +<translation id="812886159861361726">„<ph name="FILE_NAME" />“ atsisiuntimas sustabdytas</translation> <translation id="8138880386467279117">Jutiklinis</translation> <translation id="8153880621934657047">Ne lentelės viduje.</translation> <translation id="817440585505441544">{COUNT,plural, =1{apatinis brūkšnys}one{# apatinis brūkšnys}few{# apatiniai brūkšniai}many{# underscores}other{# apatinių brūkšnių}}</translation> @@ -1146,6 +1155,7 @@ <translation id="8743786158317878347">įveskite struktūrinį turinį, pvz., lenteles</translation> <translation id="8747966237988593539">Rūšiuotas sąrašas</translation> <translation id="8749988712346667988">Sidabrinė spalva</translation> +<translation id="875769700429317857">„<ph name="FILE_NAME" />“ atsisiuntimo procesas baigtas</translation> <translation id="8759334257841767240">Nėra kitos nuorodos.</translation> <translation id="8767968232364267681">Kita 4 lygio antraštė</translation> <translation id="8770473310765924354">išeiti iš struktūrinio turinio, pvz., lentelių</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb index 52e5c09..66777d2 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
@@ -213,6 +213,7 @@ <translation id="2626530649491650971">klikbaar</translation> <translation id="2628764385451019380">Geen vorige keuzelijst met invoervak.</translation> <translation id="2637227747952042642">Wiskunde</translation> +<translation id="2638785836053527382">Download van <ph name="FILE_NAME" /> is hervat</translation> <translation id="2639750663247012216">ChromeVox-functietoets</translation> <translation id="2644542693584024604">spelfout</translation> <translation id="2661530546602071611">Kennisgeving</translation> @@ -252,6 +253,7 @@ <translation id="287383510823843610">Donkeroranje</translation> <translation id="2879867157561757640">Veeg met drie vingers omlaag</translation> <translation id="288178314850623291">Gebruik de springopdrachten om naar specifieke typen elementen te springen. Druk op Zoeken + H om naar de volgende kop te springen of druk op Zoeken + Shift + H om naar de vorige kop te springen.</translation> +<translation id="2885764457467528513">{COUNT,plural, =1{minuut}other{minuten}}</translation> <translation id="2894654529758326923">Informatie</translation> <translation id="2899328121302785497">{COUNT,plural, =1{accolade links}other{# accolades links}}</translation> <translation id="2911433807131383493">ChromeVox-handleiding openen</translation> @@ -286,6 +288,7 @@ <translation id="3084806535845658316">geen typecho</translation> <translation id="3086746722712840547">opmerking</translation> <translation id="308895241372589742">Geen volgende wiskundige uitdrukking.</translation> +<translation id="3090227230165225418">Downloadmeldingen aankondigen</translation> <translation id="3090532668523289635">groep</translation> <translation id="3093176084511590672">Volgend oriëntatiepunt</translation> <translation id="3096671415663099226">cbo</translation> @@ -438,6 +441,7 @@ <translation id="4148180433151187540">{COUNT,plural, =1{accolade rechts}other{# accolades rechts}}</translation> <translation id="4158704014418536539">Hoofdlettergevoelig</translation> <translation id="4159784952369912983">Paars</translation> +<translation id="4161104397932142764">{COUNT,plural, =1{seconde}other{seconden}}</translation> <translation id="4161663686871496107">Gesproken ChromeVox-feedback is gereed</translation> <translation id="4173994908659439270">Geen volgend bewerkbaar tekstveld.</translation> <translation id="4176463684765177261">Uitgeschakeld</translation> @@ -618,6 +622,7 @@ <translation id="5349770431644471053">Back link</translation> <translation id="536031132345979795">Achteruit springen tijdens doorlopend lezen</translation> <translation id="5368000168321181111">Earcons uit</translation> +<translation id="5368505757342402527">Download van <ph name="FILE_NAME" /> is <ph name="PROGRESS" />% voltooid. Het duurt nog ongeveer <ph name="TIME" /> <ph name="UNITS" />.</translation> <translation id="5374320867641260420">Geen volgende knop.</translation> <translation id="5376407118396657359">Druk op de zoektoets en Ctrl+Alt in combinatie met de pijltoetsen om van cel naar cel te navigeren.</translation> <translation id="5382299583965267720">Geen volgende kop voor niveau 1.</translation> @@ -800,6 +805,7 @@ <translation id="667999046851023355">Document</translation> <translation id="6688209025607531203">Een melding die niet in een modaal dialoogvenster wordt weergegeven</translation> <translation id="6689672606256159458">Donker zalmroze</translation> +<translation id="669617842401078250">Download van <ph name="FILE_NAME" /> is onderbroken</translation> <translation id="6696967141280706829">Voorwoord</translation> <translation id="6697092096875747123">Vorige keuzelijst met invoervak</translation> <translation id="6702609185760332517">{COUNT,plural, =1{uitroepteken}other{# uitroeptekens}}</translation> @@ -937,6 +943,7 @@ <translation id="7641134354185483015">Geen vorige kop voor niveau 3.</translation> <translation id="7659376057562985921"><ph name="VALUE" />, <ph name="NAME" />, tekstvak</translation> <translation id="7663318257180412551">Kop 2</translation> +<translation id="7668307052366682650">{COUNT,plural, =1{uur}other{uur}}</translation> <translation id="7674576868851035240">Volgende link</translation> <translation id="7674768236845044097">markeren</translation> <translation id="7684431668231950609">Tekst bewerken, URL-invoer</translation> @@ -951,6 +958,7 @@ <ph name="LINE_THROUGH_STRING" /> <ph name="FONT_FAMILY_STRING" /></translation> <translation id="7701196182766842984">autolst</translation> +<translation id="7763537600611320912">Download van <ph name="FILE_NAME" /> is gestart</translation> <translation id="7770823902658038748"><ph name="VALUE" />, <ph name="NAME" />, tekstvak voor wachtwoord</translation> <translation id="7776293189010177726">ChromeVox-menu's openen</translation> <translation id="7800558923657349506">Epiloog</translation> @@ -1075,6 +1083,7 @@ <translation id="8096975275316362544">Pastelmint</translation> <translation id="8098587210054821856">Leisteengrijs</translation> <translation id="8110647606445335195">Geen ARIA-oriëntatiepunten.</translation> +<translation id="812886159861361726">Download van <ph name="FILE_NAME" /> is gestopt</translation> <translation id="8138880386467279117">Touch</translation> <translation id="8153880621934657047">Niet in tabel.</translation> <translation id="817440585505441544">{COUNT,plural, =1{underscore}other{# underscores}}</translation> @@ -1144,6 +1153,7 @@ <translation id="8743786158317878347">gestructureerde content openen, zoals tabellen</translation> <translation id="8747966237988593539">Geordende lijst</translation> <translation id="8749988712346667988">Zilver</translation> +<translation id="875769700429317857"><ph name="FILE_NAME" /> is gedownload</translation> <translation id="8759334257841767240">Geen volgende link.</translation> <translation id="8767968232364267681">Volgende kop voor niveau 4</translation> <translation id="8770473310765924354">gestructureerde content verlaten, zoals tabellen</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb index aa8eb9af..1edf8671 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
@@ -99,6 +99,7 @@ <translation id="1616111909442424068">ஒயிட்</translation> <translation id="1618597272655350600">தற்போதைய நிலையின் முழு விளக்கத்தை அறிவிக்கிறது</translation> <translation id="1627222324347828322">கோஸ்ட் ஓயிட்</translation> +<translation id="1630688379087270943">சாய்வானவற்றைக் குறி:</translation> <translation id="1639634871799530612">{COUNT,plural, =1{அதிகத்திற்கான குறி}other{# அதிகத்திற்கான குறிகள்}}</translation> <translation id="1653266918374749391">முந்தைய, 3 ஆம் படிநிலை தலைப்பு</translation> <translation id="1657616855184033958">நிகழ்வு வரிசை வடிப்பான்களைக் காட்டு</translation> @@ -320,6 +321,7 @@ <translation id="3286390186030710347">ஸ்லைடர்</translation> <translation id="3299925995433437805">அடுத்ததாக பார்வையிட்ட இணைப்பு இல்லை.</translation> <translation id="3300348286427369683">உயர் உரை ஆதரவு. இப்போது உரையில் தாவுவதற்கான கட்டளைகள், பிரெய்ல் கர்சர் ரூட்டிங், தேர்ந்தெடுத்தல் மற்றும் பல அம்சங்கள் உட்பட உயர் உரைப் புலங்களை ChromeVox ஆதரிக்கிறது.</translation> +<translation id="3304756947457041303">உயர் உரை இண்டிகேஷனைத் தனிப்பயனாக்கு</translation> <translation id="3307886118343381874">அட்டவணையின் இறுதிக்குச் செல்</translation> <translation id="3311969765485641742">விழிப்பூட்டல்களைப் பார்க்க Alt+Shift+A ஐ அழுத்தவும்</translation> <translation id="3312997241656799641">அடுத்ததாக பார்வையிட்ட இணைப்பு</translation> @@ -406,6 +408,7 @@ <translation id="3930498801443296724">Pullquote</translation> <translation id="3936394396199829062">லாவெண்டர் பிளஷ்</translation> <translation id="3941269780691800708">மவுஸை நகர்த்துகையில் கர்சர் காண்பிக்கும் உரையைப் பேசு.</translation> +<translation id="394953087167197343">எழுத்துப்பிழையைக் குறிக்கும்:</translation> <translation id="3962990492275676168">நடப்பு இருப்பிடத்திலிருந்து படிக்கத் தொடங்கு</translation> <translation id="3970951409746498040">சாண்டி பிரவுன்</translation> <translation id="3989324057180830702">tgl btn</translation> @@ -452,6 +455,7 @@ <translation id="42164919740161077">காடெட் புளூ</translation> <translation id="4218529045364428769">{COUNT,plural, =1{சிறுகோடு}other{# சிறுகோடுகள்}}</translation> <translation id="421884353938374759">வண்ணத் தேர்வி</translation> +<translation id="4221071177874897997">தடிமனானவற்றைக் குறி:</translation> <translation id="4229646983878045487">date time</translation> <translation id="4230834257931120629">லைட் ஸ்லேட் கிரே</translation> <translation id="4231102694147661229">‘டெவெலப்பர் விருப்பங்களை’ இயக்கு</translation> @@ -754,6 +758,7 @@ <translation id="6348869651006731065">டிம் கிரே</translation> <translation id="6350358010104919766">{COUNT,plural, =1{பொட்டுக்குறி}other{# பொட்டுக்குறிகள்}}</translation> <translation id="6355910664415701303">முந்தைய பட்டியல் உருப்படி இல்லை.</translation> +<translation id="6360318852623800555">உயர் உரை பண்புக் கூறுகள்</translation> <translation id="6364795331201459219">h6</translation> <translation id="6368143427468974988">முந்தைய தலைப்பு</translation> <translation id="6376999910001533545">மரூன்</translation> @@ -929,6 +934,7 @@ <translation id="762020119231868829">தற்போது இயங்கும் எல்லா ஊடக விட்ஜெட்டுகளையும் இடைநிறுத்தும்</translation> <translation id="7625690649919402823">அடுத்த அட்டவணை</translation> <translation id="7628927569678398026"><ph name="LOCALE" /> (<ph name="VARIANT" />), தரம் <ph name="GRADE" /></translation> +<translation id="763535765081585392">அடிகோடிட்டவற்றைக் குறி:</translation> <translation id="7639968568612851608">அடர்ந்த சாம்பல்</translation> <translation id="7641134354185483015">முந்தைய 3 ஆம் படிநிலை தலைப்பு இல்லை.</translation> <translation id="7659376057562985921"><ph name="VALUE" />, <ph name="NAME" />, உரைப் பெட்டி</translation> @@ -1164,6 +1170,7 @@ <translation id="8943175951035496220">வலப்புறத்தில் கலம் இல்லை.</translation> <translation id="8943282376843390568">சுண்ணாம்பு நிறம்</translation> <translation id="8946628535652548639"><ph name="TABLECELLROWINDEX" />வரி.<ph name="TABLECELLCOLUMNINDEX" />நெடு.</translation> +<translation id="8957142051395645063">அறிவி</translation> <translation id="8978496506222343566">tltip</translation> <translation id="8986362086234534611">மற</translation> <translation id="900114243503212879">கோப்பு</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb index 4846df04..7458c904 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
@@ -213,6 +213,7 @@ <translation id="2626530649491650971">інтерактивний</translation> <translation id="2628764385451019380">Немає попереднього комбінованого вікна.</translation> <translation id="2637227747952042642">Матем.</translation> +<translation id="2638785836053527382">Завантаження файлу <ph name="FILE_NAME" /> відновлено</translation> <translation id="2639750663247012216">Модифікатор ChromeVox</translation> <translation id="2644542693584024604">орфографічна помилка</translation> <translation id="2661530546602071611">Примітка</translation> @@ -252,6 +253,7 @@ <translation id="287383510823843610">Темно-оранжевий</translation> <translation id="2879867157561757640">Проведіть трьома пальцями вниз</translation> <translation id="288178314850623291">Щоб переходити до елементів певного типу, використовуйте команди переходу. Наприклад, щоб переходити між заголовками, натискайте Search+H (уперед) або Search+Shift+H (назад).</translation> +<translation id="2885764457467528513">{COUNT,plural, =1{хвилина}one{хвилина}few{хвилини}many{хвилин}other{хвилини}}</translation> <translation id="2894654529758326923">Інформація</translation> <translation id="2899328121302785497">{COUNT,plural, =1{ліва фігурна дужка}one{# ліва фігурна дужка}few{# ліві фігурні дужки}many{# лівих фігурних дужок}other{# left braces}}</translation> <translation id="2911433807131383493">Відкрити навчальний посібник ChromeVox</translation> @@ -286,6 +288,7 @@ <translation id="3084806535845658316">без озвучення введення тексту</translation> <translation id="3086746722712840547">примітка</translation> <translation id="308895241372589742">Немає наступного математичного виразу.</translation> +<translation id="3090227230165225418">Сповіщати про завантаження</translation> <translation id="3090532668523289635">група</translation> <translation id="3093176084511590672">Наступний орієнтир</translation> <translation id="3096671415663099226">комбіноване вікно</translation> @@ -438,6 +441,7 @@ <translation id="4148180433151187540">{COUNT,plural, =1{права фігурна дужка}one{# права фігурна дужка}few{# праві фігурні дужки}many{# правих фігурних дужок}other{# right braces}}</translation> <translation id="4158704014418536539">Ураховується регістр.</translation> <translation id="4159784952369912983">Пурпуровий</translation> +<translation id="4161104397932142764">{COUNT,plural, =1{секунда}one{секунда}few{секунди}many{секунд}other{секунди}}</translation> <translation id="4161663686871496107">Голосові підказки ChromeVox активовано</translation> <translation id="4173994908659439270">Немає наступного текстового поля для редагування.</translation> <translation id="4176463684765177261">Вимкнено</translation> @@ -618,6 +622,7 @@ <translation id="5349770431644471053">Зворотне посилання</translation> <translation id="536031132345979795">Перехід назад під час безперервного читання</translation> <translation id="5368000168321181111">Звуковий ефект вимкнено</translation> +<translation id="5368505757342402527">Файл <ph name="FILE_NAME" /> завантажено на <ph name="PROGRESS" />%. Залишилося приблизно <ph name="TIME" /> <ph name="UNITS" />.</translation> <translation id="5374320867641260420">Немає наступної кнопки.</translation> <translation id="5376407118396657359">Натискайте клавішу пошуку + Ctrl + Alt і клавіші зі стрілками, щоб переходити між клітинками.</translation> <translation id="5382299583965267720">Немає наступного заголовка рівня 1.</translation> @@ -800,6 +805,7 @@ <translation id="667999046851023355">Документ</translation> <translation id="6688209025607531203">Сповіщення в немодальному вікні</translation> <translation id="6689672606256159458">Темно-лососевий</translation> +<translation id="669617842401078250">Завантаження файлу <ph name="FILE_NAME" /> призупинено</translation> <translation id="6696967141280706829">Передмова</translation> <translation id="6697092096875747123">Попереднє комбіноване вікно</translation> <translation id="6702609185760332517">{COUNT,plural, =1{знак оклику}one{# знак оклику}few{# знаки оклику}many{# знаків оклику}other{# знаку оклику}}</translation> @@ -938,6 +944,7 @@ <translation id="7641134354185483015">Немає попереднього заголовка рівня 3.</translation> <translation id="7659376057562985921"><ph name="VALUE" />, <ph name="NAME" />, текстове поле</translation> <translation id="7663318257180412551">Заголовок 2</translation> +<translation id="7668307052366682650">{COUNT,plural, =1{година}one{година}few{години}many{годин}other{години}}</translation> <translation id="7674576868851035240">Наступне посилання</translation> <translation id="7674768236845044097">виділений текст</translation> <translation id="7684431668231950609">Редагування введеного тексту, URL-адреси</translation> @@ -952,6 +959,7 @@ <ph name="LINE_THROUGH_STRING" /> <ph name="FONT_FAMILY_STRING" /></translation> <translation id="7701196182766842984">список автозавершення</translation> +<translation id="7763537600611320912">Почато завантаження файлу<ph name="FILE_NAME" /></translation> <translation id="7770823902658038748"><ph name="VALUE" />, <ph name="NAME" />, текстове поле пароля</translation> <translation id="7776293189010177726">Відкрити меню ChromeVox</translation> <translation id="7800558923657349506">Епілог</translation> @@ -1076,6 +1084,7 @@ <translation id="8096975275316362544">М’ятно-кремовий</translation> <translation id="8098587210054821856">Грифельний-сірий</translation> <translation id="8110647606445335195">Немає орієнтирів ARIA.</translation> +<translation id="812886159861361726">Завантаження файлу <ph name="FILE_NAME" /> припинено</translation> <translation id="8138880386467279117">Торкнутися</translation> <translation id="8153880621934657047">Не всередині таблиці.</translation> <translation id="817440585505441544">{COUNT,plural, =1{підкреслення}one{# підкреслення}few{# підкреслення}many{# підкреслень}other{# underscores}}</translation> @@ -1145,6 +1154,7 @@ <translation id="8743786158317878347">відкрити структурований вміст, як-от таблиці</translation> <translation id="8747966237988593539">Нумерований список</translation> <translation id="8749988712346667988">Срібний</translation> +<translation id="875769700429317857">Завантаження файлу <ph name="FILE_NAME" /> завершено</translation> <translation id="8759334257841767240">Немає наступного посилання.</translation> <translation id="8767968232364267681">Наступний заголовок рівня 4</translation> <translation id="8770473310765924354">закрити структурований вміст, як-от таблиці</translation>
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn index e830c7e..02db372 100644 --- a/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn +++ b/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn
@@ -2,14 +2,13 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("../../optimize_webui.gni") import("//third_party/closure_compiler/compile_js.gni") +import("../../optimize_webui.gni") optimize_webui("build") { host = "internet_config_dialog" html_in_files = [ "internet_config_dialog.html" ] html_out_files = [ "vulcanized.html" ] - html_out_files_polymer2 = [ "vulcanized.p2.html" ] input = rebase_path(".", root_build_dir) js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn index b171f205..5223452 100644 --- a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn +++ b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
@@ -2,14 +2,13 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("../../optimize_webui.gni") import("//third_party/closure_compiler/compile_js.gni") +import("../../optimize_webui.gni") optimize_webui("build") { host = "internet_detail_dialog" html_in_files = [ "internet_detail_dialog.html" ] html_out_files = [ "vulcanized.html" ] - html_out_files_polymer2 = [ "vulcanized.p2.html" ] input = rebase_path(".", root_build_dir) js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/downloads/BUILD.gn b/chrome/browser/resources/downloads/BUILD.gn index 312cc0a..f111ccb 100644 --- a/chrome/browser/resources/downloads/BUILD.gn +++ b/chrome/browser/resources/downloads/BUILD.gn
@@ -10,7 +10,6 @@ host = "downloads" html_in_files = [ "downloads.html" ] html_out_files = [ "vulcanized.html" ] - html_out_files_polymer2 = [ "vulcanized.p2.html" ] input = rebase_path(".", root_build_dir) insert_in_head = "<base href=chrome://downloads>" js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/extensions/BUILD.gn b/chrome/browser/resources/extensions/BUILD.gn index 8e92d58..63c9202 100644 --- a/chrome/browser/resources/extensions/BUILD.gn +++ b/chrome/browser/resources/extensions/BUILD.gn
@@ -14,7 +14,6 @@ host = "extensions" html_in_files = [ "extensions.html" ] html_out_files = [ "vulcanized.html" ] - html_out_files_polymer2 = [ "vulcanized.p2.html" ] insert_in_head = "<base href=\"chrome://extensions\">" input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir) js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/extensions/extensions_resources_vulcanized.grd b/chrome/browser/resources/extensions/extensions_resources_vulcanized.grd index 185e7b1..2a3c0c6c 100644 --- a/chrome/browser/resources/extensions/extensions_resources_vulcanized.grd +++ b/chrome/browser/resources/extensions/extensions_resources_vulcanized.grd
@@ -19,13 +19,6 @@ allowexternalscript="true" type="BINDATA" compress="gzip" /> - <include name="IDR_EXTENSIONS_VULCANIZED_P2_HTML" - file="${root_gen_dir}\chrome\browser\resources\extensions\vulcanized.p2.html" - use_base_dir="false" - flattenhtml="true" - allowexternalscript="true" - type="BINDATA" - compress="gzip" /> <include name="IDR_EXTENSIONS_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\extensions\crisper.js" use_base_dir="false"
diff --git a/chrome/browser/resources/history/BUILD.gn b/chrome/browser/resources/history/BUILD.gn index 01c8b6de5..7bf036c 100644 --- a/chrome/browser/resources/history/BUILD.gn +++ b/chrome/browser/resources/history/BUILD.gn
@@ -15,10 +15,6 @@ "app.vulcanized.html", "lazy_load.vulcanized.html", ] - html_out_files_polymer2 = [ - "app.vulcanized.p2.html", - "lazy_load.vulcanized.p2.html", - ] input = rebase_path(".", root_build_dir) js_out_files = [
diff --git a/chrome/browser/resources/history/history_item.js b/chrome/browser/resources/history/history_item.js index 6bdf7f52..ec89a426 100644 --- a/chrome/browser/resources/history/history_item.js +++ b/chrome/browser/resources/history/history_item.js
@@ -87,6 +87,10 @@ this.unlisten(this.$.checkbox, 'keydown', 'onCheckboxKeydown_'); }, + focusOnMenuButton: function() { + cr.ui.focusWithoutInk(this.$['menu-button']); + }, + /** @param {!KeyboardEvent} e */ onCheckboxKeydown_: function(e) { if (e.shiftKey && e.key === 'Tab') {
diff --git a/chrome/browser/resources/history/history_list.js b/chrome/browser/resources/history/history_list.js index a220efa..18805d5 100644 --- a/chrome/browser/resources/history/history_list.js +++ b/chrome/browser/resources/history/history_list.js
@@ -385,6 +385,13 @@ if (index == undefined) { return; } + setTimeout(() => { + this.$['infinite-list'].focusItem(index); + const item = getDeepActiveElement(); + if (item) { + item.focusOnMenuButton(); + } + }); const browserService = history.BrowserService.getInstance(); browserService.recordHistogram(
diff --git a/chrome/browser/resources/optimize_webui.gni b/chrome/browser/resources/optimize_webui.gni index 2db654b..b8c0cb9c 100644 --- a/chrome/browser/resources/optimize_webui.gni +++ b/chrome/browser/resources/optimize_webui.gni
@@ -40,11 +40,6 @@ foreach(_out, invoker.html_out_files) { outputs += [ "$target_gen_dir/$_out" ] } - if (defined(invoker.html_out_files_polymer2)) { - foreach(_out, invoker.html_out_files_polymer2) { - outputs += [ "$target_gen_dir/$_out" ] - } - } foreach(_out, invoker.js_out_files) { outputs += [ "$target_gen_dir/$_out" ] } @@ -67,9 +62,6 @@ args += [ "--html_in_files" ] + invoker.html_in_files args += [ "--html_out_files" ] + invoker.html_out_files - if (defined(invoker.html_out_files_polymer2)) { - args += [ "--html_out_files_polymer2" ] + invoker.html_out_files_polymer2 - } args += [ "--js_out_files" ] + invoker.js_out_files if (defined(invoker.excludes)) {
diff --git a/chrome/browser/resources/optimize_webui.py b/chrome/browser/resources/optimize_webui.py index 124f7481..8a8265d 100755 --- a/chrome/browser/resources/optimize_webui.py +++ b/chrome/browser/resources/optimize_webui.py
@@ -202,29 +202,17 @@ # Run polymer-css-build and write the output HTML files to their final # destination. - # TODO(dpapad): Remove this when Polymer 2 migration has completed. - _polymer_css_build(out_path, crisper_html_out_paths, args.html_out_files, 1) - - if args.html_out_files_polymer2: - # Run polymer-css-build again with --polymer-version=2. This is - # necessary so that the runtime --enable-features=WebUIPolymer2 works - # with optimized builds. - _polymer_css_build(out_path, crisper_html_out_paths, - args.html_out_files_polymer2, 2) + html_out_paths = [ + os.path.join(out_path, f) for f in args.html_out_files] + node.RunNode([node_modules.PathToPolymerCssBuild()] + + ['--polymer-version', '2'] + + ['--no-inline-includes', '-f'] + + crisper_html_out_paths + ['-o'] + html_out_paths) finally: shutil.rmtree(tmp_out_dir) return manifest_out_path -def _polymer_css_build(out_path, html_in_paths, html_out_files, version): - html_out_paths = [ - os.path.join(out_path, f) for f in html_out_files] - node.RunNode([node_modules.PathToPolymerCssBuild()] + - ['--polymer-version', str(version)] + - ['--no-inline-includes', '-f'] + - html_in_paths + ['-o'] + html_out_paths) - - def main(argv): parser = argparse.ArgumentParser() parser.add_argument('--depfile', required=True) @@ -232,7 +220,6 @@ parser.add_argument('--host', required=True) parser.add_argument('--html_in_files', nargs='*', required=True) parser.add_argument('--html_out_files', nargs='*', required=True) - parser.add_argument('--html_out_files_polymer2', nargs='*') parser.add_argument('--input', required=True) parser.add_argument('--insert_in_head') parser.add_argument('--js_out_files', nargs='*', required=True)
diff --git a/chrome/browser/resources/optimize_webui_test.py b/chrome/browser/resources/optimize_webui_test.py index 6ce29d3..77e917d2 100755 --- a/chrome/browser/resources/optimize_webui_test.py +++ b/chrome/browser/resources/optimize_webui_test.py
@@ -44,8 +44,7 @@ assert self._out_folder return open(os.path.join(self._out_folder, file_name), 'r').read() - def _run_optimize(self, depfile, html_in_file, html_out_file, - html_out_file_polymer2, js_out_file): + def _run_optimize(self, depfile, html_in_file, html_out_file, js_out_file): # TODO(dbeam): make it possible to _run_optimize twice? Is that useful? assert not self._out_folder self._out_folder = self._create_tmp_dir() @@ -53,7 +52,6 @@ '--depfile', os.path.join(self._out_folder,'depfile.d'), '--html_in_files', html_in_file, '--html_out_files', html_out_file, - '--html_out_files_polymer2', html_out_file_polymer2, '--host', 'fake-host', '--input', self._tmp_src_dir, '--js_out_files', js_out_file, @@ -77,7 +75,6 @@ self._run_optimize(depfile='depfile.d', html_in_file='ui.html', html_out_file='fast.html', - html_out_file_polymer2='fast.p2.html', js_out_file='fast.js') fast_html = self._read_out_file('fast.html')
diff --git a/chrome/browser/resources/print_preview/BUILD.gn b/chrome/browser/resources/print_preview/BUILD.gn index 618c7a9..5835dfa8 100644 --- a/chrome/browser/resources/print_preview/BUILD.gn +++ b/chrome/browser/resources/print_preview/BUILD.gn
@@ -15,7 +15,6 @@ host = "print" html_in_files = [ "print_preview_new.html" ] html_out_files = [ "vulcanized.html" ] - html_out_files_polymer2 = [ "vulcanized.p2.html" ] insert_in_head = "<base href=\"chrome://print\">" input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir) js_out_files = [ "crisper.js" ]
diff --git a/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd b/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd index 56ade76..7a8b0f8 100644 --- a/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd +++ b/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd
@@ -13,7 +13,6 @@ <release seq="1"> <includes> <include name="IDR_PRINT_PREVIEW_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\print_preview\vulcanized.html" use_base_dir="false" preprocess="true" compress="gzip" type="BINDATA" /> - <include name="IDR_PRINT_PREVIEW_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\print_preview\vulcanized.p2.html" use_base_dir="false" preprocess="true" compress="gzip" type="BINDATA" /> <include name="IDR_PRINT_PREVIEW_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\print_preview\crisper.js" use_base_dir="false" preprocess="true" compress="gzip" type="BINDATA" /> </includes> </release>
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn index 8acfedc..6fe0589 100644 --- a/chrome/browser/resources/settings/BUILD.gn +++ b/chrome/browser/resources/settings/BUILD.gn
@@ -22,10 +22,6 @@ "vulcanized.html", "lazy_load.vulcanized.html", ] - html_out_files_polymer2 = [ - "vulcanized.p2.html", - "lazy_load.vulcanized.p2.html", - ] insert_in_head = "<base href=\"chrome://settings\">" input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir) js_out_files = [
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn index 0eef6d0..ae79929 100644 --- a/chrome/browser/resources/settings/chromeos/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -22,10 +22,6 @@ "vulcanized.html", "lazy_load.vulcanized.html", ] - html_out_files_polymer2 = [ - "vulcanized.p2.html", - "lazy_load.vulcanized.p2.html", - ] insert_in_head = "<base href=\"chrome://os-settings\">" input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir) js_out_files = [
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html index 8a4c9d9..bdcb4c2 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html
@@ -57,7 +57,8 @@ <div>$i18nRaw{searchNoResultsHelp}</div> </div> <template is="dom-if" - if="[[showManagedHeader_(inSearchMode_, showingSubpage_)]]"> + if="[[showManagedHeader_(inSearchMode_, showingSubpage_, + showPages_.about)]]"> <managed-footnote></managed-footnote> </template> <template is="dom-if" if="[[showPages_.settings]]">
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.js b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.js index d1ce4483..5b79332 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.js +++ b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.js
@@ -237,6 +237,7 @@ * @private */ showManagedHeader_: function() { - return !this.inSearchMode_ && !this.showingSubpage_; + return !this.inSearchMode_ && !this.showingSubpage_ && + !this.showPages_.about; }, });
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html b/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html index b2ab1a4..33317f0 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html
@@ -132,11 +132,6 @@ <iron-icon icon="cr:info"></iron-icon> $i18n{pluginVmPageTitle} </a> - <a id="onStartup" href="/onStartup" - hidden="[[!pageVisibility.onStartup]]"> - <iron-icon icon="settings:power-settings-new"></iron-icon> - $i18n{onStartup} - </a> <paper-button toggles id="advancedButton" aria-active-attribute="aria-expanded" active="{{advancedOpened}}" hidden="[[!pageVisibility.advancedSettings]]">
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html index e5f2a9e..7464f6c 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
@@ -6,7 +6,6 @@ <link rel="import" href="../../appearance_page/appearance_page.html"> <link rel="import" href="../../change_password_page/change_password_page.html"> <link rel="import" href="../../controls/settings_idle_load.html"> -<link rel="import" href="../../on_startup_page/on_startup_page.html"> <link rel="import" href="../../people_page/people_page.html"> <link rel="import" href="../../reset_page/reset_profile_banner.html"> <link rel="import" href="../../search_page/search_page.html"> @@ -190,13 +189,6 @@ </settings-plugin-vm-page> </settings-section> </template> - <template is="dom-if" if="[[showPage_(pageVisibility.onStartup)]]" - restamp> - <settings-section page-title="$i18n{onStartup}" section="onStartup"> - <settings-on-startup-page prefs="{{prefs}}"> - </settings-on-startup-page> - </settings-section> - </template> </div> </template>
diff --git a/chrome/browser/resources/settings/os_settings_resources.grd b/chrome/browser/resources/settings/os_settings_resources.grd index 2c59cad..22d802b 100644 --- a/chrome/browser/resources/settings/os_settings_resources.grd +++ b/chrome/browser/resources/settings/os_settings_resources.grd
@@ -184,47 +184,9 @@ file="lifetime_browser_proxy.js" type="chrome_html" preprocess="true" /> - <structure name="IDR_OS_SETTINGS_ON_STARTUP_BROWSER_PROXY_HTML" - file="on_startup_page/on_startup_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_OS_SETTINGS_ON_STARTUP_BROWSER_PROXY_JS" - file="on_startup_page/on_startup_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_OS_SETTINGS_ON_STARTUP_PAGE_HTML" - file="on_startup_page/on_startup_page.html" - type="chrome_html" /> - <structure name="IDR_OS_SETTINGS_ON_STARTUP_PAGE_JS" - file="on_startup_page/on_startup_page.js" - type="chrome_html" /> <structure name="IDR_OS_SETTINGS_SEARCH_SETTINGS_JS" file="search_settings.js" type="chrome_html" /> - <structure name="IDR_OS_SETTINGS_STARTUP_URLS_PAGE_HTML" - file="on_startup_page/startup_urls_page.html" - type="chrome_html" /> - <structure name="IDR_OS_SETTINGS_STARTUP_URLS_PAGE_JS" - file="on_startup_page/startup_urls_page.js" - type="chrome_html" /> - <structure name="IDR_OS_SETTINGS_STARTUP_URLS_PAGE_BROWSER_PROXY_JS" - file="on_startup_page/startup_urls_page_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_OS_SETTINGS_STARTUP_URLS_PAGE_BROWSER_PROXY_HTML" - file="on_startup_page/startup_urls_page_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_OS_SETTINGS_STARTUP_URL_DIALOG_JS" - file="on_startup_page/startup_url_dialog.js" - type="chrome_html" /> - <structure name="IDR_OS_SETTINGS_STARTUP_URL_DIALOG_HTML" - file="on_startup_page/startup_url_dialog.html" - type="chrome_html" - allowexternalscript="true" /> - <structure name="IDR_OS_SETTINGS_STARTUP_URL_ENTRY_JS" - file="on_startup_page/startup_url_entry.js" - type="chrome_html" /> - <structure name="IDR_OS_SETTINGS_STARTUP_URL_ENTRY_HTML" - file="on_startup_page/startup_url_entry.html" - type="chrome_html" - allowexternalscript="true" /> <structure name="IDR_OS_SETTINGS_CR_OS_SETTINGS_MAIN_HTML" file="chromeos/os_settings_main/os_settings_main.html" type="chrome_html"
diff --git a/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd b/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd index 93e5894..04aae4ac 100644 --- a/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd +++ b/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd
@@ -19,13 +19,6 @@ allowexternalscript="true" type="BINDATA" compress="gzip" /> - <include name="IDR_OS_SETTINGS_VULCANIZED_P2_HTML" - file="${root_gen_dir}\chrome\browser\resources\settings\chromeos\vulcanized.p2.html" - use_base_dir="false" - flattenhtml="true" - allowexternalscript="true" - type="BINDATA" - compress="gzip" /> <include name="IDR_OS_SETTINGS_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\settings\chromeos\crisper.js" use_base_dir="false" @@ -39,13 +32,6 @@ allowexternalscript="true" type="BINDATA" compress="gzip" /> - <include name="IDR_OS_SETTINGS_LAZY_LOAD_VULCANIZED_P2_HTML" - file="${root_gen_dir}\chrome\browser\resources\settings\chromeos\lazy_load.vulcanized.p2.html" - use_base_dir="false" - flattenhtml="true" - allowexternalscript="true" - type="BINDATA" - compress="gzip" /> <include name="IDR_OS_SETTINGS_LAZY_LOAD_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\settings\chromeos\lazy_load.crisper.js" use_base_dir="false"
diff --git a/chrome/browser/resources/settings/settings_resources_vulcanized.grd b/chrome/browser/resources/settings/settings_resources_vulcanized.grd index 5420b5ed..61b333f 100644 --- a/chrome/browser/resources/settings/settings_resources_vulcanized.grd +++ b/chrome/browser/resources/settings/settings_resources_vulcanized.grd
@@ -13,10 +13,8 @@ <release seq="1"> <includes> <include name="IDR_SETTINGS_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\settings\vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> - <include name="IDR_SETTINGS_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\settings\vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> <include name="IDR_SETTINGS_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\settings\crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" /> <include name="IDR_SETTINGS_LAZY_LOAD_VULCANIZED_HTML" file="${root_gen_dir}\chrome\browser\resources\settings\lazy_load.vulcanized.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> - <include name="IDR_SETTINGS_LAZY_LOAD_VULCANIZED_P2_HTML" file="${root_gen_dir}\chrome\browser\resources\settings\lazy_load.vulcanized.p2.html" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> <include name="IDR_SETTINGS_LAZY_LOAD_CRISPER_JS" file="${root_gen_dir}\chrome\browser\resources\settings\lazy_load.crisper.js" use_base_dir="false" flattenhtml="true" type="BINDATA" compress="gzip" /> <include name="IDR_SETTINGS_MANIFEST" file="manifest.json" type="BINDATA" compress="gzip" /> </includes>
diff --git a/chrome/browser/serial/chrome_serial_delegate.cc b/chrome/browser/serial/chrome_serial_delegate.cc index 4bbe706..18f9064 100644 --- a/chrome/browser/serial/chrome_serial_delegate.cc +++ b/chrome/browser/serial/chrome_serial_delegate.cc
@@ -47,8 +47,8 @@ Profile::FromBrowserContext(web_contents->GetBrowserContext()); auto* chooser_context = SerialChooserContextFactory::GetForProfile(profile); return chooser_context->CanRequestObjectPermission( - frame->GetLastCommittedURL().GetOrigin(), - web_contents->GetMainFrame()->GetLastCommittedURL().GetOrigin()); + frame->GetLastCommittedOrigin(), + web_contents->GetMainFrame()->GetLastCommittedOrigin()); } bool ChromeSerialDelegate::HasPortPermission(
diff --git a/chrome/browser/serial/serial_chooser_context.cc b/chrome/browser/serial/serial_chooser_context.cc index 7a9c7a9..877f62f 100644 --- a/chrome/browser/serial/serial_chooser_context.cc +++ b/chrome/browser/serial/serial_chooser_context.cc
@@ -73,14 +73,15 @@ } std::vector<std::unique_ptr<ChooserContextBase::Object>> -SerialChooserContext::GetGrantedObjects(const GURL& requesting_origin, - const GURL& embedding_origin) { +SerialChooserContext::GetGrantedObjects(const GURL& requesting_origin_url, + const GURL& embedding_origin_url) { + auto requesting_origin = url::Origin::Create(requesting_origin_url); + auto embedding_origin = url::Origin::Create(embedding_origin_url); if (!CanRequestObjectPermission(requesting_origin, embedding_origin)) return {}; auto origin_it = ephemeral_ports_.find( - std::make_pair(url::Origin::Create(requesting_origin), - url::Origin::Create(embedding_origin))); + std::make_pair(requesting_origin, embedding_origin)); if (origin_it == ephemeral_ports_.end()) return {}; const std::set<base::UnguessableToken> ports = origin_it->second; @@ -92,7 +93,7 @@ continue; objects.push_back(std::make_unique<Object>( - requesting_origin, embedding_origin, it->second.Clone(), + requesting_origin_url, embedding_origin_url, it->second.Clone(), content_settings::SettingSource::SETTING_SOURCE_USER, is_incognito_)); } @@ -103,8 +104,8 @@ SerialChooserContext::GetAllGrantedObjects() { std::vector<std::unique_ptr<Object>> objects; for (const auto& map_entry : ephemeral_ports_) { - GURL requesting_origin = map_entry.first.first.GetURL(); - GURL embedding_origin = map_entry.first.second.GetURL(); + const url::Origin& requesting_origin = map_entry.first.first; + const url::Origin& embedding_origin = map_entry.first.second; if (!CanRequestObjectPermission(requesting_origin, embedding_origin)) continue; @@ -115,7 +116,8 @@ continue; objects.push_back(std::make_unique<Object>( - requesting_origin, embedding_origin, it->second.Clone(), + requesting_origin.GetURL(), embedding_origin.GetURL(), + it->second.Clone(), content_settings::SettingSource::SETTING_SOURCE_USER, is_incognito_)); } } @@ -154,8 +156,7 @@ const url::Origin& requesting_origin, const url::Origin& embedding_origin, const device::mojom::SerialPortInfo& port) { - if (!CanRequestObjectPermission(requesting_origin.GetURL(), - embedding_origin.GetURL())) { + if (!CanRequestObjectPermission(requesting_origin, embedding_origin)) { return false; }
diff --git a/chrome/browser/supervised_user/supervised_user_theme.cc b/chrome/browser/supervised_user/supervised_user_theme.cc deleted file mode 100644 index bf8ecadd..0000000 --- a/chrome/browser/supervised_user/supervised_user_theme.cc +++ /dev/null
@@ -1,69 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/supervised_user/supervised_user_theme.h" - -#include "chrome/browser/themes/theme_properties.h" -#include "chrome/grit/theme_resources.h" -#include "ui/base/resource/resource_bundle.h" -#include "ui/gfx/image/image.h" - -namespace { - -const SkColor kDefaultColorFrameSupervisedUser = SkColorSetRGB(165, 197, 225); -const SkColor kDefaultColorFrameSupervisedUserInactive = - SkColorSetRGB(180, 225, 247); -const SkColor kDefaultColorSupervisedUserLabelBackground = - SkColorSetRGB(108, 167, 210); - -// Map resource ids to the supervised user resource ids. -int MapToSupervisedUserResourceIds(int id) { - switch (id) { - case IDR_THEME_FRAME: - return IDR_SUPERVISED_USER_THEME_FRAME; - case IDR_THEME_FRAME_INACTIVE: - return IDR_SUPERVISED_USER_THEME_FRAME_INACTIVE; - case IDR_THEME_TAB_BACKGROUND: - case IDR_THEME_TAB_BACKGROUND_V: - return IDR_SUPERVISED_USER_THEME_TAB_BACKGROUND; - } - return id; -} - -} // namespace - -SupervisedUserTheme::SupervisedUserTheme() - : CustomThemeSupplier(SUPERVISED_USER_THEME) {} - -SupervisedUserTheme::~SupervisedUserTheme() {} - -bool SupervisedUserTheme::GetColor(int id, SkColor* color) const { - switch (id) { - case ThemeProperties::COLOR_FRAME: - *color = kDefaultColorFrameSupervisedUser; - return true; - case ThemeProperties::COLOR_FRAME_INACTIVE: - *color = kDefaultColorFrameSupervisedUserInactive; - return true; - case ThemeProperties::COLOR_SUPERVISED_USER_LABEL: - *color = SK_ColorWHITE; - return true; - case ThemeProperties::COLOR_SUPERVISED_USER_LABEL_BACKGROUND: - *color = kDefaultColorSupervisedUserLabelBackground; - return true; - } - return false; -} - -gfx::Image SupervisedUserTheme::GetImageNamed(int id) { - if (!HasCustomImage(id)) - return gfx::Image(); - - id = MapToSupervisedUserResourceIds(id); - return ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(id); -} - -bool SupervisedUserTheme::HasCustomImage(int id) const { - return id != MapToSupervisedUserResourceIds(id); -}
diff --git a/chrome/browser/supervised_user/supervised_user_theme.h b/chrome/browser/supervised_user/supervised_user_theme.h deleted file mode 100644 index 1209062..0000000 --- a/chrome/browser/supervised_user/supervised_user_theme.h +++ /dev/null
@@ -1,33 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_THEME_H_ -#define CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_THEME_H_ - -#include "base/macros.h" -#include "chrome/browser/supervised_user/supervised_users.h" -#include "chrome/browser/themes/custom_theme_supplier.h" - -namespace gfx { -class Image; -} - -// This theme is used as a default theme for supervised users. It uses a light -// blue as frame color, and defines color properties for the avatar label. -class SupervisedUserTheme : public CustomThemeSupplier { - public: - SupervisedUserTheme(); - - // Overridden from CustomThemeSupplier: - bool GetColor(int id, SkColor* color) const override; - gfx::Image GetImageNamed(int id) override; - bool HasCustomImage(int id) const override; - - private: - ~SupervisedUserTheme() override; - - DISALLOW_COPY_AND_ASSIGN(SupervisedUserTheme); -}; - -#endif // CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_THEME_H_
diff --git a/chrome/browser/themes/custom_theme_supplier.h b/chrome/browser/themes/custom_theme_supplier.h index ff6612a..7ad355e 100644 --- a/chrome/browser/themes/custom_theme_supplier.h +++ b/chrome/browser/themes/custom_theme_supplier.h
@@ -33,7 +33,6 @@ enum ThemeType { EXTENSION, NATIVE_X11, - SUPERVISED_USER_THEME, INCREASED_CONTRAST, AUTOGENERATED, };
diff --git a/chrome/browser/themes/theme_properties.h b/chrome/browser/themes/theme_properties.h index dc432e8..92cd7ef9 100644 --- a/chrome/browser/themes/theme_properties.h +++ b/chrome/browser/themes/theme_properties.h
@@ -146,11 +146,6 @@ // These colors don't have constant default values. They are derived from // the runtime value of other colors. COLOR_NTP_TEXT_LIGHT, -#if BUILDFLAG(ENABLE_SUPERVISED_USERS) - COLOR_SUPERVISED_USER_LABEL, - COLOR_SUPERVISED_USER_LABEL_BACKGROUND, - COLOR_SUPERVISED_USER_LABEL_BORDER, -#endif #if defined(OS_WIN) // The color of the 1px border around the window on Windows 10.
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc index d4b35e9..b9032fe2 100644 --- a/chrome/browser/themes/theme_service.cc +++ b/chrome/browser/themes/theme_service.cc
@@ -61,10 +61,6 @@ #include "extensions/browser/extension_registry_observer.h" #endif -#if BUILDFLAG(ENABLE_SUPERVISED_USERS) -#include "chrome/browser/supervised_user/supervised_user_theme.h" -#endif - using base::UserMetricsAction; using content::BrowserThread; using extensions::Extension; @@ -408,12 +404,7 @@ void ThemeService::UseDefaultTheme() { if (ready_) base::RecordAction(UserMetricsAction("Themes_Reset")); -#if BUILDFLAG(ENABLE_SUPERVISED_USERS) - if (IsSupervisedUser()) { - SetSupervisedUserTheme(); - return; - } -#endif + ui::NativeTheme* native_theme = ui::NativeTheme::GetInstanceForNativeUi(); if (native_theme && native_theme->UsesHighContrastColors()) SetCustomDefaultTheme(new IncreasedContrastThemeSupplier( @@ -575,8 +566,6 @@ // For backward compat with older themes, some newer colors are generated from // older ones if they are missing. const int kNtpText = ThemeProperties::COLOR_NTP_TEXT; - const int kLabelBackground = - ThemeProperties::COLOR_SUPERVISED_USER_LABEL_BACKGROUND; switch (id) { case ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON: return color_utils::HSLShift( @@ -626,17 +615,6 @@ color_utils::HSL hsl = GetTint(ThemeProperties::TINT_BUTTONS, incognito); return color_utils::HSLShift(base_color, hsl); } -#if BUILDFLAG(ENABLE_SUPERVISED_USERS) - case ThemeProperties::COLOR_SUPERVISED_USER_LABEL: - return color_utils::GetColorWithMaxContrast( - GetColor(kLabelBackground, incognito)); - case ThemeProperties::COLOR_SUPERVISED_USER_LABEL_BACKGROUND: - return color_utils::BlendTowardMaxContrast( - GetColor(ThemeProperties::COLOR_FRAME, incognito), 0x80); - case ThemeProperties::COLOR_SUPERVISED_USER_LABEL_BORDER: - return color_utils::AlphaBlend(GetColor(kLabelBackground, incognito), - SK_ColorBLACK, 0.9f); -#endif } // Always fall back to the non-incognito color when there's a custom theme @@ -681,14 +659,6 @@ std::string current_id = GetThemeID(); if (current_id == kDefaultThemeID) { -#if BUILDFLAG(ENABLE_SUPERVISED_USERS) - // Supervised users have a different default theme. - if (IsSupervisedUser()) { - SetSupervisedUserTheme(); - set_ready(); - return; - } -#endif if (UsingAutogenerated()) { BuildFromColor(GetThemeColor()); } else if (ShouldInitWithSystemTheme()) { @@ -1034,18 +1004,6 @@ building_extension_id_.clear(); } -#if BUILDFLAG(ENABLE_SUPERVISED_USERS) -bool ThemeService::IsSupervisedUser() const { - // Do not treat child users as supervised users, so they get the same theme as the parent account - // instead of getting the default theme. - return profile_->IsLegacySupervised(); -} - -void ThemeService::SetSupervisedUserTheme() { - SetCustomDefaultTheme(new SupervisedUserTheme); -} -#endif - void ThemeService::ClearThemePrefs() { profile_->GetPrefs()->ClearPref(prefs::kCurrentThemePackFilename); profile_->GetPrefs()->ClearPref(prefs::kAutogeneratedThemeColor);
diff --git a/chrome/browser/themes/theme_service_unittest.cc b/chrome/browser/themes/theme_service_unittest.cc index 0671b79..dbd6e01 100644 --- a/chrome/browser/themes/theme_service_unittest.cc +++ b/chrome/browser/themes/theme_service_unittest.cc
@@ -43,15 +43,13 @@ class ThemeServiceTest : public extensions::ExtensionServiceTestBase { public: - ThemeServiceTest() : is_supervised_(false), - registry_(NULL) {} + ThemeServiceTest() : registry_(NULL) {} ~ThemeServiceTest() override {} void SetUp() override { extensions::ExtensionServiceTestBase::SetUp(); extensions::ExtensionServiceTestBase::ExtensionServiceInitParams params = CreateDefaultInitParams(); - params.profile_is_supervised = is_supervised_; InitializeExtensionService(params); service_->Init(); registry_ = ExtensionRegistry::Get(profile_.get()); @@ -131,7 +129,6 @@ } protected: - bool is_supervised_; ExtensionRegistry* registry_; }; @@ -453,65 +450,4 @@ EXPECT_TRUE(path.empty()); } -#if BUILDFLAG(ENABLE_SUPERVISED_USERS) -class ThemeServiceSupervisedUserTest : public ThemeServiceTest { - public: - ThemeServiceSupervisedUserTest() {} - ~ThemeServiceSupervisedUserTest() override {} - - void SetUp() override { - is_supervised_ = true; - ThemeServiceTest::SetUp(); - } -}; - -// Checks that supervised users have their own default theme. -TEST_F(ThemeServiceSupervisedUserTest, - SupervisedUserThemeReplacesDefaultTheme) { - ThemeService* theme_service = - ThemeServiceFactory::GetForProfile(profile_.get()); - theme_service->UseDefaultTheme(); - EXPECT_TRUE(theme_service->UsingDefaultTheme()); - EXPECT_TRUE(get_theme_supplier(theme_service)); - EXPECT_EQ(get_theme_supplier(theme_service)->get_theme_type(), - CustomThemeSupplier::SUPERVISED_USER_THEME); -} - -#if defined(OS_LINUX) && !defined(OS_CHROMEOS) -// Checks that supervised users don't use the system theme even if it is the -// default. The system theme is only available on Linux. -TEST_F(ThemeServiceSupervisedUserTest, SupervisedUserThemeReplacesNativeTheme) { - profile_->GetPrefs()->SetBoolean(prefs::kUsesSystemTheme, true); - ThemeService* theme_service = - ThemeServiceFactory::GetForProfile(profile_.get()); - theme_service->UseDefaultTheme(); - EXPECT_TRUE(theme_service->UsingDefaultTheme()); - EXPECT_TRUE(get_theme_supplier(theme_service)); - EXPECT_EQ(get_theme_supplier(theme_service)->get_theme_type(), - CustomThemeSupplier::SUPERVISED_USER_THEME); -} - -TEST_F(ThemeServiceTest, UserThemeTakesPrecedenceOverSystemTheme) { - ThemeService* theme_service = - ThemeServiceFactory::GetForProfile(profile_.get()); - - base::ScopedTempDir temp_dir; - ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); - const std::string& extension_id = - LoadUnpackedMinimalThemeAt(temp_dir.GetPath()); - ASSERT_EQ(extension_id, theme_service->GetThemeID()); - - // Set preference |prefs::kUsesSystemTheme| to true which conflicts with - // having a user theme selected. - profile_->GetPrefs()->SetBoolean(prefs::kUsesSystemTheme, true); - EXPECT_TRUE(profile_->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme)); - - // Initialization should fix the preference inconsistency. - theme_service->Init(profile_.get()); - ASSERT_EQ(extension_id, theme_service->GetThemeID()); - EXPECT_FALSE(profile_->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme)); -} -#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS) -#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS) - } // namespace theme_service_internal
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc index cf9fbe66..a0a9988 100644 --- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc +++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
@@ -270,8 +270,7 @@ } bool SaveCardBubbleControllerImpl::ShouldShowSignInPromo() const { - if (is_upload_save_ || !base::FeatureList::IsEnabled( - features::kAutofillSaveCardSignInAfterLocalSave)) + if (is_upload_save_) return false; const syncer::SyncService* sync_service = @@ -328,8 +327,7 @@ DCHECK(!local_save_card_prompt_callback_.is_null()); // Show an animated card saved confirmation message next time // UpdateSaveCardIcon() is called. - can_animate_ = base::FeatureList::IsEnabled( - features::kAutofillSaveCardSignInAfterLocalSave); + can_animate_ = true; std::move(local_save_card_prompt_callback_).Run(AutofillClient::ACCEPTED); break; @@ -349,11 +347,8 @@ // promo or a manage cards view. If we need to show a sign-in promo, that // will be handled by OnAnimationEnded(), otherwise clicking the icon again // will show the MANAGE_CARDS bubble, which is set here. - if (previous_bubble_type == BubbleType::LOCAL_SAVE && - base::FeatureList::IsEnabled( - features::kAutofillSaveCardSignInAfterLocalSave)) { + if (previous_bubble_type == BubbleType::LOCAL_SAVE) current_bubble_type_ = BubbleType::MANAGE_CARDS; - } if (previous_bubble_type == BubbleType::LOCAL_SAVE || previous_bubble_type == BubbleType::UPLOAD_SAVE) {
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_browsertest.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_browsertest.cc index 5a3023d..54ad16c 100644 --- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_browsertest.cc +++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_browsertest.cc
@@ -9,7 +9,6 @@ #include "base/bind_helpers.h" #include "base/json/json_reader.h" #include "base/macros.h" -#include "base/test/scoped_feature_list.h" #include "base/values.h" #include "chrome/browser/ui/autofill/payments/save_card_ui.h" #include "chrome/browser/ui/browser.h" @@ -19,8 +18,6 @@ #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/autofill/core/browser/autofill_test_utils.h" -#include "components/autofill/core/common/autofill_features.h" -#include "components/autofill/core/common/autofill_payments_features.h" #include "testing/gtest/include/gtest/gtest.h" namespace autofill { @@ -31,11 +28,6 @@ void SetUpCommandLine(base::CommandLine* command_line) override { DialogBrowserTest::SetUpCommandLine(command_line); - scoped_feature_list_.InitWithFeatures( - // Enabled. - {features::kAutofillSaveCardSignInAfterLocalSave}, - // Disabled. - {}); } std::unique_ptr<base::DictionaryValue> GetTestLegalMessage() { @@ -114,7 +106,6 @@ private: SaveCardBubbleControllerImpl* controller_ = nullptr; - base::test::ScopedFeatureList scoped_feature_list_; DISALLOW_COPY_AND_ASSIGN(SaveCardBubbleControllerImplTest); };
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc index 1362065..c087130 100644 --- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc +++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc
@@ -1633,9 +1633,6 @@ TEST_F(SaveCardBubbleControllerImplTest, Local_FirstShow_SaveButton_SigninPromo) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - ShowLocalBubble(); ClickSaveButton(); @@ -1644,41 +1641,10 @@ EXPECT_NE(nullptr, controller()->save_card_bubble_view()); } -TEST_F(SaveCardBubbleControllerImplTest, Local_FirstShow_SaveButton_NoBubble) { - scoped_feature_list_.InitAndDisableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - - ShowLocalBubble(); - ClickSaveButton(); - - // When this flag is disabled, no promo should appear and - // the icon should go away. - EXPECT_FALSE(controller()->IsIconVisible()); - EXPECT_EQ(nullptr, controller()->save_card_bubble_view()); -} - -TEST_F(SaveCardBubbleControllerImplTest, - Metrics_Local_FirstShow_SaveButton_NoBubble) { - scoped_feature_list_.InitAndDisableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - base::HistogramTester histogram_tester; - - ShowLocalBubble(); - controller()->OnSaveButton({}); - - // No other bubbles should have popped up. - histogram_tester.ExpectTotalCount("Autofill.SignInPromo", 0); - histogram_tester.ExpectTotalCount("Autofill.ManageCardsPrompt.Local", 0); - histogram_tester.ExpectTotalCount("Autofill.ManageCardsPrompt.Upload", 0); -} - // Tests for Manage Cards. TEST_F(SaveCardBubbleControllerImplTest, Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_ManageCards) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - ShowLocalBubble(); ClickSaveButton(); CloseAndReshowBubble(); @@ -1692,8 +1658,6 @@ TEST_F( SaveCardBubbleControllerImplTest, Metrics_Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_ManageCards) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); base::HistogramTester histogram_tester; ShowLocalBubble(); @@ -1710,8 +1674,6 @@ TEST_F( SaveCardBubbleControllerImplTest, Metrics_Local_FirstShow_SaveButton_Close_Reshow_Close_Reshow_ManageCards) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); base::HistogramTester histogram_tester; ShowLocalBubble(); @@ -1728,9 +1690,6 @@ TEST_F(SaveCardBubbleControllerImplTest, Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_Close_Navigate) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - ShowLocalBubble(); ClickSaveButton(); CloseAndReshowBubble(); @@ -1746,8 +1705,6 @@ TEST_F(SaveCardBubbleControllerImplTest, Metrics_Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_Navigate) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); base::HistogramTester histogram_tester; ShowLocalBubble(); @@ -1765,8 +1722,6 @@ TEST_F( SaveCardBubbleControllerImplTest, Metrics_Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_Close_Navigate) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); base::HistogramTester histogram_tester; ShowLocalBubble(); @@ -1784,8 +1739,6 @@ TEST_F(SaveCardBubbleControllerImplTest, Metrics_Local_ClickManageCardsDoneButton) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); base::HistogramTester histogram_tester; ShowLocalBubble(); @@ -1801,8 +1754,6 @@ TEST_F(SaveCardBubbleControllerImplTest, Metrics_Local_ClickManageCardsManageCardsButton) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); base::HistogramTester histogram_tester; ShowLocalBubble(); @@ -1818,9 +1769,6 @@ TEST_F(SaveCardBubbleControllerImplTest, Upload_FirstShow_SaveButton_NoSigninPromo) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - ShowUploadBubble(); ClickSaveButton(); @@ -1832,8 +1780,6 @@ TEST_F(SaveCardBubbleControllerImplTest, Metrics_Upload_FirstShow_SaveButton_NoSigninPromo) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); base::HistogramTester histogram_tester; ShowUploadBubble(); @@ -1846,8 +1792,6 @@ } TEST_F(SaveCardBubbleControllerImplTest, Metrics_Upload_FirstShow_ManageCards) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); base::HistogramTester histogram_tester; ShowUploadBubble();
diff --git a/chrome/browser/ui/blocked_content/safe_browsing_triggered_popup_blocker.cc b/chrome/browser/ui/blocked_content/safe_browsing_triggered_popup_blocker.cc index 90be2db..a422524 100644 --- a/chrome/browser/ui/blocked_content/safe_browsing_triggered_popup_blocker.cc +++ b/chrome/browser/ui/blocked_content/safe_browsing_triggered_popup_blocker.cc
@@ -29,19 +29,6 @@ SafeBrowsingTriggeredPopupBlocker::Action::kCount); } -subresource_filter::ActivationPosition GetActivationPosition( - size_t match_index, - size_t num_checks) { - DCHECK_GT(num_checks, 0u); - if (num_checks == 1) - return subresource_filter::ActivationPosition::kOnly; - if (match_index == 0) - return subresource_filter::ActivationPosition::kFirst; - if (match_index == num_checks - 1) - return subresource_filter::ActivationPosition::kLast; - return subresource_filter::ActivationPosition::kMiddle; -} - } // namespace using safe_browsing::SubresourceFilterLevel; @@ -169,9 +156,6 @@ if (match_level.has_value()) { level_for_next_committed_navigation_ = match_level; - UMA_HISTOGRAM_ENUMERATION( - "ContentSettings.Popups.StrongBlockerActivationPosition", - GetActivationPosition(match_index.value(), results.size())); } }
diff --git a/chrome/browser/ui/blocked_content/safe_browsing_triggered_popup_blocker_unittest.cc b/chrome/browser/ui/blocked_content/safe_browsing_triggered_popup_blocker_unittest.cc index 2d40cb4..0dcc3856 100644 --- a/chrome/browser/ui/blocked_content/safe_browsing_triggered_popup_blocker_unittest.cc +++ b/chrome/browser/ui/blocked_content/safe_browsing_triggered_popup_blocker_unittest.cc
@@ -470,7 +470,7 @@ EXPECT_FALSE(popup_blocker()->ShouldApplyAbusivePopupBlocker()); } -TEST_F(SafeBrowsingTriggeredPopupBlockerTest, ActivationPosition) { +TEST_F(SafeBrowsingTriggeredPopupBlockerTest, EnforcementRedirectPosition) { // Turn on the feature to perform safebrowsing on redirects. base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature( @@ -481,29 +481,27 @@ MarkUrlAsAbusiveEnforce(enforce_url); MarkUrlAsAbusiveWarning(warn_url); - using subresource_filter::ActivationPosition; + using subresource_filter::RedirectPosition; struct { std::vector<const char*> urls; - base::Optional<ActivationPosition> expected_position; + base::Optional<RedirectPosition> last_enforcement_position; } kTestCases[] = { {{"https://normal.test/"}, base::nullopt}, - {{"https://enforce.test/"}, ActivationPosition::kOnly}, - {{"https://warn.test/"}, ActivationPosition::kOnly}, + {{"https://enforce.test/"}, RedirectPosition::kOnly}, + {{"https://warn.test/"}, base::nullopt}, - {{"https://normal.test/", "https://warn.test/"}, - ActivationPosition::kLast}, + {{"https://normal.test/", "https://warn.test/"}, base::nullopt}, {{"https://normal.test/", "https://normal.test/", "https://enforce.test/"}, - ActivationPosition::kLast}, + RedirectPosition::kLast}, {{"https://enforce.test", "https://normal.test/", "https://warn.test/"}, - ActivationPosition::kFirst}, - {{"https://warn.test/", "https://normal.test/"}, - ActivationPosition::kFirst}, + RedirectPosition::kFirst}, + {{"https://warn.test/", "https://normal.test/"}, base::nullopt}, {{"https://normal.test/", "https://enforce.test/", "https://normal.test/"}, - base::nullopt}, + RedirectPosition::kMiddle}, }; for (const auto& test_case : kTestCases) { @@ -518,12 +516,12 @@ navigation_simulator->Commit(); histograms.ExpectTotalCount( - "ContentSettings.Popups.StrongBlockerActivationPosition", - test_case.expected_position.has_value() ? 1 : 0); - if (test_case.expected_position.has_value()) { + "SubresourceFilter.PageLoad.Activation.RedirectPosition2.Enforcement", + test_case.last_enforcement_position.has_value() ? 1 : 0); + if (test_case.last_enforcement_position.has_value()) { histograms.ExpectUniqueSample( - "ContentSettings.Popups.StrongBlockerActivationPosition", - static_cast<int>(test_case.expected_position.value()), 1); + "SubresourceFilter.PageLoad.Activation.RedirectPosition2.Enforcement", + static_cast<int>(test_case.last_enforcement_position.value()), 1); } } }
diff --git a/chrome/browser/ui/page_info/page_info.cc b/chrome/browser/ui/page_info/page_info.cc index 5e23f325..97a8230 100644 --- a/chrome/browser/ui/page_info/page_info.cc +++ b/chrome/browser/ui/page_info/page_info.cc
@@ -897,11 +897,6 @@ ChooserContextBase* context = ui_info.get_context(profile_); const GURL origin = site_url_.GetOrigin(); - // Hide individual object permissions because when the chooser is blocked - // previously granted device permissions are also ignored. - if (!context->CanRequestObjectPermission(origin, origin)) - continue; - auto chosen_objects = context->GetGrantedObjects(origin, origin); for (std::unique_ptr<ChooserContextBase::Object>& object : chosen_objects) { chosen_object_info_list.push_back(
diff --git a/chrome/browser/ui/page_info/page_info_unittest.cc b/chrome/browser/ui/page_info/page_info_unittest.cc index 16bf4093..74266986 100644 --- a/chrome/browser/ui/page_info/page_info_unittest.cc +++ b/chrome/browser/ui/page_info/page_info_unittest.cc
@@ -44,6 +44,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" +#include "url/origin.h" #if defined(OS_ANDROID) #include "chrome/browser/android/android_theme_resources.h" @@ -121,7 +122,7 @@ class PageInfoTest : public ChromeRenderViewHostTestHarness { public: - PageInfoTest() : url_("http://www.example.com") {} + PageInfoTest() { SetURL("http://www.example.com"); } ~PageInfoTest() override {} @@ -156,7 +157,10 @@ EXPECT_CALL(*mock_ui, SetCookieInfo(_)); } - void SetURL(const std::string& url) { url_ = GURL(url); } + void SetURL(const std::string& url) { + url_ = GURL(url); + origin_ = url::Origin::Create(url_); + } void SetPermissionInfo(const PermissionInfoList& permission_info_list, ChosenObjectInfoList chosen_object_info_list) { @@ -184,6 +188,7 @@ } const GURL& url() const { return url_; } + const url::Origin& origin() const { return origin_; } scoped_refptr<net::X509Certificate> cert() { return cert_; } MockPageInfoUI* mock_ui() { return mock_ui_.get(); } security_state::SecurityLevel security_level() { return security_level_; } @@ -221,6 +226,7 @@ std::unique_ptr<MockPageInfoUI> mock_ui_; scoped_refptr<net::X509Certificate> cert_; GURL url_; + url::Origin origin_; std::vector<std::unique_ptr<PageInfoUI::ChosenObjectInfo>> last_chosen_object_info_; PermissionInfoList last_permission_info_list_; @@ -406,7 +412,7 @@ auto device_info = usb_device_manager.CreateAndAddDevice( 0, 0, "Google", "Gizmo", "1234567890"); - store->GrantDevicePermission(url(), url(), *device_info); + store->GrantDevicePermission(origin(), origin(), *device_info); EXPECT_CALL(*mock_ui(), SetIdentityInfo(_)); EXPECT_CALL(*mock_ui(), SetCookieInfo(_)); @@ -422,7 +428,7 @@ page_info()->OnSiteChosenObjectDeleted(info->ui_info, info->chooser_object->value); - EXPECT_FALSE(store->HasDevicePermission(url(), url(), *device_info)); + EXPECT_FALSE(store->HasDevicePermission(origin(), origin(), *device_info)); EXPECT_EQ(0u, last_chosen_object_info().size()); }
diff --git a/chrome/browser/ui/prefs/prefs_tab_helper.cc b/chrome/browser/ui/prefs/prefs_tab_helper.cc index 678686c..976e9e51 100644 --- a/chrome/browser/ui/prefs/prefs_tab_helper.cc +++ b/chrome/browser/ui/prefs/prefs_tab_helper.cc
@@ -411,10 +411,8 @@ #if !defined(OS_ANDROID) RegisterFontFamilyPrefs(registry, fonts_with_defaults); - RegisterLocalizedFontPref(registry, prefs::kWebKitDefaultFontSize, - IDS_DEFAULT_FONT_SIZE); - RegisterLocalizedFontPref(registry, prefs::kWebKitDefaultFixedFontSize, - IDS_DEFAULT_FIXED_FONT_SIZE); + registry->RegisterIntegerPref(prefs::kWebKitDefaultFontSize, 16); + registry->RegisterIntegerPref(prefs::kWebKitDefaultFixedFontSize, 13); RegisterLocalizedFontPref(registry, prefs::kWebKitMinimumFontSize, IDS_MINIMUM_FONT_SIZE); RegisterLocalizedFontPref(registry, prefs::kWebKitMinimumLogicalFontSize,
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc index 4e5e4ab..cf4fdeb9 100644 --- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc +++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views_unittest.cc
@@ -59,7 +59,7 @@ explicit AppInfoDialogTestApi(AppInfoDialog* dialog) : dialog_(dialog) {} AppInfoHeaderPanel* header_panel() { - return static_cast<AppInfoHeaderPanel*>(dialog_->child_at(0)); + return static_cast<AppInfoHeaderPanel*>(dialog_->children().front()); } views::Link* view_in_store_link() {
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc index 0a0ac65..f17871d 100644 --- a/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc +++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc
@@ -784,10 +784,10 @@ EXPECT_TRUE(card_list_view->visible()); ASSERT_EQ(2u, card_list_view->children().size()); // Cards will be added to database in a reversed order. - EXPECT_EQ(static_cast<MigratableCardView*>(card_list_view->child_at(0)) + EXPECT_EQ(static_cast<MigratableCardView*>(card_list_view->children()[0]) ->GetNetworkAndLastFourDigits(), second_card.NetworkAndLastFourDigits()); - EXPECT_EQ(static_cast<MigratableCardView*>(card_list_view->child_at(1)) + EXPECT_EQ(static_cast<MigratableCardView*>(card_list_view->children()[1]) ->GetNetworkAndLastFourDigits(), first_card.NetworkAndLastFourDigits()); }
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc index 5e13279..72bf3db 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
@@ -766,10 +766,6 @@ // successfully causes the bubble to go away. IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, Local_ClickingSaveClosesBubble) { - // Disable the sign-in promo. - scoped_feature_list_.InitAndDisableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - // Submitting the form without signed in user should show the local save // bubble. ResetEventWaiterForSequence({DialogEvent::OFFERED_LOCAL_SAVE}); @@ -788,12 +784,10 @@ "Autofill.SaveCreditCardPrompt.Local.FirstShow", AutofillMetrics::SAVE_CARD_PROMPT_END_ACCEPTED, 1); - // No bubble should be showing and no sign-in impression should have been - // recorded. + // The local save bubble should not be visible, but the card icon should + // remain visible for the clickable [Manage cards] option. EXPECT_EQ(nullptr, GetSaveCardBubbleViews()); - EXPECT_FALSE(GetSaveCardIconView()->visible()); - EXPECT_EQ(0, user_action_tester.GetActionCount( - "Signin_Impression_FromSaveCardBubble")); + EXPECT_TRUE(GetSaveCardIconView()->visible()); } // Tests the local save bubble. Ensures that clicking the [No thanks] button @@ -833,10 +827,6 @@ #if !defined(OS_CHROMEOS) IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, Local_ClickingSaveShowsSigninPromo) { - // Enable the sign-in promo. - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - // Submitting the form without signed in user should show the local save // bubble. ResetEventWaiterForSequence({DialogEvent::OFFERED_LOCAL_SAVE}); @@ -871,13 +861,7 @@ // bubble is shown. IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, Local_NoSigninPromoShowsWhenUserIsSyncing) { - // Enable the sign-in promo. - scoped_feature_list_.InitWithFeatures( - // Enabled - {features::kAutofillUpstream, - features::kAutofillSaveCardSignInAfterLocalSave}, - // Disabled - {}); + scoped_feature_list_.InitAndEnableFeature(features::kAutofillUpstream); // Start sync. harness_->SetupSync(); @@ -915,10 +899,6 @@ #if !defined(OS_CHROMEOS) IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, Local_Metrics_SigninImpressionSigninPromo) { - // Enable the sign-in promo. - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - // Submitting the form without signed in user should show the local save // bubble. ResetEventWaiterForSequence({DialogEvent::OFFERED_LOCAL_SAVE}); @@ -950,10 +930,6 @@ #if BUILDFLAG(ENABLE_DICE_SUPPORT) IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, Local_Metrics_AcceptingSigninPromo) { - // Enable the sign-in promo. - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - // Submitting the form without signed in user should show the local save // bubble. ResetEventWaiterForSequence({DialogEvent::OFFERED_LOCAL_SAVE}); @@ -991,10 +967,6 @@ // credit card icon. IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, Local_ClickingIconShowsManageCards) { - // Enable the sign-in promo. - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - // Submitting the form without signed in user should show the local save // bubble. ResetEventWaiterForSequence({DialogEvent::OFFERED_LOCAL_SAVE}); @@ -1038,10 +1010,6 @@ // button redirects properly. IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, Local_ManageCardsButtonRedirects) { - // Enable the sign-in promo. - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - // Submitting the form without signed in user should show the local save // bubble. ResetEventWaiterForSequence({DialogEvent::OFFERED_LOCAL_SAVE}); @@ -1099,10 +1067,6 @@ // button closes the bubble. IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, Local_ManageCardsDoneButtonClosesBubble) { - // Enable the sign-in promo. - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - // Submitting the form without signed in user should show the local save // bubble. ResetEventWaiterForSequence({DialogEvent::OFFERED_LOCAL_SAVE}); @@ -1152,10 +1116,6 @@ #if !defined(OS_CHROMEOS) IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, Local_Metrics_SigninImpressionManageCards) { - // Enable the sign-in promo. - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - // Submitting the form without signed in user should show the local save // bubble. ResetEventWaiterForSequence({DialogEvent::OFFERED_LOCAL_SAVE}); @@ -1195,10 +1155,6 @@ #if BUILDFLAG(ENABLE_DICE_SUPPORT) IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, Local_Metrics_AcceptingFootnotePromoManageCards) { - // Enable the sign-in promo. - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillSaveCardSignInAfterLocalSave); - // Submitting the form without signed in user should show the local save // bubble. ResetEventWaiterForSequence({DialogEvent::OFFERED_LOCAL_SAVE});
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc index 2cd39c0b7..2394836 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -1999,18 +1999,18 @@ // they're not visible. The order should be: [Apps shortcut] [Managed bookmark // button] ..bookmark buttons.. [Overflow chevron] [Other bookmarks] #if DCHECK_IS_ON() - int view_index = 0; - DCHECK_EQ(child_at(view_index++), apps_page_shortcut_); - DCHECK_EQ(child_at(view_index++), managed_bookmarks_button_); - views::View* child = nullptr; - do { - child = child_at(view_index++); - } while ((child->GetClassName() == BookmarkButton::kViewClassName || - child->GetClassName() == BookmarkFolderButton::kViewClassName) - // Overflow and Other Bookmarks are folder buttons - && (child != overflow_button_ && child != other_bookmarks_button_)); - DCHECK_EQ(child, overflow_button_); - DCHECK_EQ(child_at(view_index++), other_bookmarks_button_); + auto i = children().cbegin(); + DCHECK_EQ(*i++, apps_page_shortcut_); + DCHECK_EQ(*i++, managed_bookmarks_button_); + const auto is_bookmark_button = [this](const auto* v) { + const char* class_name = v->GetClassName(); + return (class_name == BookmarkButton::kViewClassName || + class_name == BookmarkFolderButton::kViewClassName) && + v != overflow_button_ && v != other_bookmarks_button_; + }; + i = std::find_if_not(i, children().cend(), is_bookmark_button); + DCHECK_EQ(*i++, overflow_button_); + DCHECK_EQ(*i++, other_bookmarks_button_); #endif AddChildViewAt(button, GetIndexOf(managed_bookmarks_button_) + 1 + index); }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc index f502154..4507cf6 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc
@@ -993,7 +993,7 @@ ASSERT_TRUE(scroll_container != NULL); scroll_container = scroll_container->parent(); ASSERT_TRUE(scroll_container != NULL); - views::View* scroll_down_button = scroll_container->child_at(1); + views::View* scroll_down_button = scroll_container->children()[1]; ASSERT_TRUE(scroll_down_button); gfx::Point loc(scroll_down_button->width() / 2, scroll_down_button->height() / 2); @@ -1901,8 +1901,8 @@ ASSERT_TRUE(submenu->IsShowing()); ASSERT_EQ(1u, submenu->children().size()); - views::View* view = submenu->child_at(0); - ASSERT_TRUE(view != NULL); + views::View* view = submenu->children().front(); + ASSERT_NE(nullptr, view); EXPECT_EQ(views::MenuItemView::kEmptyMenuItemViewID, view->id()); // Right click on the first child to get its context menu.
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_list_view.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_list_view.cc index 46b9cb9..07d331f 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_list_view.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_list_view.cc
@@ -88,19 +88,19 @@ } void DesktopMediaListView::Layout() { - int x = 0; - int y = 0; - - for (size_t i = 0; i < children().size(); ++i) { - if (i > 0 && i % active_style_->columns == 0) { - x = 0; - y += active_style_->item_size.height(); + // Children lay out in a grid, all with the same size and without padding. + const int width = active_style_->item_size.width(); + const int height = active_style_->item_size.height(); + auto i = children().begin(); + // Child order is left-to-right, top-to-bottom, so lay out row-major. The + // last row may not be full, so the inner loop will need to be careful about + // the child count anyway, so don't bother to compute a row count. + for (int y = 0;; y += height) { + for (int x = 0, col = 0; col < active_style_->columns; ++col, x += width) { + if (i == children().end()) + return; + (*i++)->SetBounds(x, y, width, height); } - - child_at(i)->SetBounds(x, y, active_style_->item_size.width(), - active_style_->item_size.height()); - - x += active_style_->item_size.width(); } } @@ -134,9 +134,9 @@ int new_index = base::ClampToRange(index + position_increment, 0, int{children().size()} - 1); if (index != new_index) - new_selected = child_at(new_index); + new_selected = children()[size_t{new_index}]; } else if (!children().empty()) { - new_selected = child_at(0); + new_selected = children().front(); } if (new_selected) @@ -210,7 +210,7 @@ } void DesktopMediaListView::OnSourceMoved(size_t old_index, size_t new_index) { - ReorderChildView(child_at(old_index), new_index); + ReorderChildView(children()[old_index], new_index); PreferredSizeChanged(); }
diff --git a/chrome/browser/ui/views/device_chooser_content_view_unittest.cc b/chrome/browser/ui/views/device_chooser_content_view_unittest.cc index 45e7517..2566feb 100644 --- a/chrome/browser/ui/views/device_chooser_content_view_unittest.cc +++ b/chrome/browser/ui/views/device_chooser_content_view_unittest.cc
@@ -266,8 +266,8 @@ EXPECT_CALL(*controller(), OpenHelpCenterUrl()).Times(1); // The content view doesn't have a direct reference to the help button, so we // need to find it. It's on the left (in LTR) so it should be the first child. - views::ImageButton* help_button = - static_cast<views::ImageButton*>(extra_views_container_->child_at(0)); + auto* help_button = static_cast<views::ImageButton*>( + extra_views_container_->children().front()); const gfx::Point point(10, 10); const ui::MouseEvent event(ui::ET_MOUSE_PRESSED, point, point, ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
diff --git a/chrome/browser/ui/views/extensions/extension_popup.cc b/chrome/browser/ui/views/extensions/extension_popup.cc index db05a2b..a97884a 100644 --- a/chrome/browser/ui/views/extensions/extension_popup.cc +++ b/chrome/browser/ui/views/extensions/extension_popup.cc
@@ -66,9 +66,7 @@ void ExtensionPopup::AddedToWidget() { BubbleDialogDelegateView::AddedToWidget(); - - const int radius = - GetBubbleFrameView()->bubble_border()->GetBorderCornerRadius(); + const int radius = GetBubbleFrameView()->corner_radius(); const bool contents_has_rounded_corners = GetExtensionView()->holder()->SetCornerRadius(radius); SetBorder(views::CreateEmptyBorder(
diff --git a/chrome/browser/ui/views/extensions/request_file_system_dialog_view.cc b/chrome/browser/ui/views/extensions/request_file_system_dialog_view.cc index 4b4dc45d..3b6d04e 100644 --- a/chrome/browser/ui/views/extensions/request_file_system_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/request_file_system_dialog_view.cc
@@ -83,7 +83,7 @@ gfx::Size RequestFileSystemDialogView::CalculatePreferredSize() const { return gfx::Size(kDialogMaxWidth, - child_at(0)->GetHeightForWidth(kDialogMaxWidth)); + children().front()->GetHeightForWidth(kDialogMaxWidth)); } RequestFileSystemDialogView::RequestFileSystemDialogView(
diff --git a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc index 86f1d92..3585e03f 100644 --- a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc +++ b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc
@@ -111,7 +111,7 @@ views::Widget* widget = views::BubbleDialogDelegateView::CreateBubble(this); - GetBubbleFrameView()->bubble_border()->SetCornerRadius( + GetBubbleFrameView()->SetCornerRadius( ChromeLayoutProvider::Get()->GetCornerRadiusMetric(views::EMPHASIS_HIGH)); widget->Show();
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc index cf670e9..836c67a 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc
@@ -43,6 +43,7 @@ #include "chrome/browser/ui/views/tab_icon_view.h" #include "chrome/browser/ui/views/tabs/tab_strip.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" +#include "chromeos/constants/chromeos_features.h" #include "content/public/browser/web_contents.h" #include "content/public/common/service_manager_connection.h" #include "services/service_manager/public/cpp/connector.h" @@ -58,6 +59,7 @@ #include "ui/base/ui_base_features.h" #include "ui/events/gestures/gesture_recognizer.h" #include "ui/gfx/canvas.h" +#include "ui/gfx/color_palette.h" #include "ui/gfx/image/image_skia.h" #include "ui/gfx/scoped_canvas.h" #include "ui/views/controls/label.h" @@ -74,7 +76,10 @@ // The color used for the frame when showing a non-tabbed WebUI, such as // the Settings window. +// TODO(hsuregan): Replace kMdWebUiFrameColor's value with +// kUpdatedMdWebUiFrameColor's value once complete. constexpr SkColor kMdWebUiFrameColor = SkColorSetARGB(0xff, 0x25, 0x4f, 0xae); +constexpr SkColor kUpdatedMdWebUiFrameColor = gfx::kGoogleGrey100; // Color for the window title text. constexpr SkColor kNormalWindowTitleTextColor = SkColorSetRGB(40, 40, 40); @@ -812,7 +817,10 @@ active_color = browser_view()->browser()->web_app_controller()->GetThemeColor(); } else if (!browser_view()->browser()->is_app()) { - active_color = kMdWebUiFrameColor; + active_color = + base::FeatureList::IsEnabled(chromeos::features::kSplitSettings) + ? kUpdatedMdWebUiFrameColor + : kMdWebUiFrameColor; } if (active_color) {
diff --git a/chrome/browser/ui/views/infobars/infobar_container_view.cc b/chrome/browser/ui/views/infobars/infobar_container_view.cc index 81419b9..c05b0c69 100644 --- a/chrome/browser/ui/views/infobars/infobar_container_view.cc +++ b/chrome/browser/ui/views/infobars/infobar_container_view.cc
@@ -134,7 +134,7 @@ // doing unnecessary work on the second infobar in those cases is harmless. if (!is_animating && children().size() > 2) { // Dropping the separator may change the height. - auto* infobar = static_cast<InfoBarView*>(child_at(1)); + auto* infobar = static_cast<InfoBarView*>(children()[1]); infobar->RecalculateHeight(); // We need to force a paint whether or not the height actually changed.
diff --git a/chrome/browser/ui/views/infobars/infobar_view.cc b/chrome/browser/ui/views/infobars/infobar_view.cc index 30e6adb..d9ab3ba 100644 --- a/chrome/browser/ui/views/infobars/infobar_view.cc +++ b/chrome/browser/ui/views/infobars/infobar_view.cc
@@ -357,7 +357,7 @@ // There will be no parent when this infobar is not in a container, e.g. if // it's in a background tab. It's still possible to reach here in that case, // e.g. if ElevationIconSetter triggers a Layout(). - return parent() && parent()->child_at(0) != this; + return parent() && parent()->children().front() != this; } int InfoBarView::GetSeparatorHeightDip() const {
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view.cc b/chrome/browser/ui/views/intent_picker_bubble_view.cc index 70dee53..2f24b8ad 100644 --- a/chrome/browser/ui/views/intent_picker_bubble_view.cc +++ b/chrome/browser/ui/views/intent_picker_bubble_view.cc
@@ -408,12 +408,12 @@ IntentPickerLabelButton* IntentPickerBubbleView::GetIntentPickerLabelButtonAt( size_t index) { - views::View* temp_contents = scroll_view_->contents(); - return static_cast<IntentPickerLabelButton*>(temp_contents->child_at(index)); + const auto& children = scroll_view_->contents()->children(); + return static_cast<IntentPickerLabelButton*>(children[index]); } bool IntentPickerBubbleView::HasCandidates() const { - return app_info_.size() > 0; + return !app_info_.empty(); } void IntentPickerBubbleView::RunCallback(
diff --git a/chrome/browser/ui/views/menu_view_drag_and_drop_test.cc b/chrome/browser/ui/views/menu_view_drag_and_drop_test.cc index 6137c44..95e548c 100644 --- a/chrome/browser/ui/views/menu_view_drag_and_drop_test.cc +++ b/chrome/browser/ui/views/menu_view_drag_and_drop_test.cc
@@ -216,7 +216,7 @@ ASSERT_EQ(3u, submenu->GetMenuItems().size()); const views::View* first_view = submenu->GetMenuItemAt(0); ASSERT_EQ(1u, first_view->children().size()); - const views::View* child_view = first_view->child_at(0); + const views::View* child_view = first_view->children().front(); EXPECT_EQ(child_view, target_view_); // The menu is showing, so it has a widget we can observe now. @@ -393,7 +393,7 @@ views::Widget* widget) { // Enqueue an event to drag the target's first child to its second, which // should result in calling OnDragEntered(). - const views::View* drop_target_view = target_view()->child_at(1); + const views::View* drop_target_view = target_view()->children()[1]; const gfx::Point target = ui_test_utils::GetCenterInScreenCoordinates(drop_target_view); GetDragTaskRunner()->PostTask( @@ -425,10 +425,10 @@ // Cause the target's second child to trigger a mouse up when dragged over. ASSERT_EQ(2u, target_view()->children().size()); - SetStopDraggingView(target_view()->child_at(1)); + SetStopDraggingView(target_view()->children()[1]); // We're going to drag the target's first child. - views::View* drag_view = target_view()->child_at(0); + views::View* drag_view = target_view()->children()[0]; ASSERT_NE(nullptr, drag_view); ui_test_utils::MoveMouseToCenterAndPress( drag_view, ui_controls::LEFT, ui_controls::DOWN, @@ -445,7 +445,7 @@ void MenuViewDragAndDropTestNestedDrag::StartDrag() { // Begin dragging the target's first child, which should result in calling // OnWidgetDragWillStart(). - const views::View* drag_view = target_view()->child_at(0); + const views::View* drag_view = target_view()->children().front(); const gfx::Point current_position = ui_test_utils::GetCenterInScreenCoordinates(drag_view); EXPECT_TRUE(ui_controls::SendMouseMove(current_position.x() + 10,
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc index 33815c8..3d9e323 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h" #include <memory> +#include <numeric> #include "base/bind.h" #include "build/build_config.h" @@ -268,8 +269,8 @@ } } - for (size_t i = result_size; i < AutocompleteResult::GetMaxMatches(); ++i) - child_at(i)->SetVisible(false); + for (auto i = children().begin() + result_size; i != children().end(); ++i) + (*i)->SetVisible(false); gfx::Rect new_target_bounds = GetTargetBounds(); @@ -387,9 +388,11 @@ gfx::Rect OmniboxPopupContentsView::GetTargetBounds() { DCHECK_GE(children().size(), model_->result().size()); - int popup_height = 0; - for (size_t i = 0; i < model_->result().size(); ++i) - popup_height += child_at(i)->GetPreferredSize().height(); + int popup_height = std::accumulate( + children().cbegin(), children().cbegin() + model_->result().size(), 0, + [](int height, const auto* v) { + return height + v->GetPreferredSize().height(); + }); // Add enough space on the top and bottom so it looks like there is the same // amount of space between the text and the popup border as there is in the // interior between each row of text. @@ -417,8 +420,7 @@ void OmniboxPopupContentsView::LayoutChildren() { gfx::Rect contents_rect = GetContentsBounds(); int top = contents_rect.y(); - for (size_t i = 0; i < AutocompleteResult::GetMaxMatches(); ++i) { - View* v = child_at(i); + for (View* v : children()) { if (v->visible()) { v->SetBounds(contents_rect.x(), top, contents_rect.width(), v->GetPreferredSize().height()); @@ -453,7 +455,7 @@ } OmniboxResultView* OmniboxPopupContentsView::result_view_at(size_t i) { - return static_cast<OmniboxResultView*>(child_at(static_cast<int>(i))); + return static_cast<OmniboxResultView*>(children()[i]); } void OmniboxPopupContentsView::GetAccessibleNodeData(
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc index 9412f318..50b3335 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc
@@ -9,6 +9,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" +#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/chrome_test_extension_loader.h" #include "chrome/browser/themes/theme_service.h" @@ -40,9 +41,13 @@ // A View that positions itself over another View to intercept clicks. class ClickTrackingOverlayView : public views::View { public: - explicit ClickTrackingOverlayView(views::View* over) { - SetBoundsRect(over->bounds()); - over->parent()->AddChildView(this); + explicit ClickTrackingOverlayView(OmniboxResultView* result) { + // |result|'s parent is the OmniboxPopupContentsView, which expects that all + // its children are OmniboxResultViews. So skip over it and add this to the + // OmniboxPopupContentsView's parent. + auto* contents = result->parent(); + SetBoundsRect(contents->ConvertRectToParent(result->bounds())); + contents->parent()->AddChildView(this); } // views::View: @@ -90,9 +95,8 @@ } LocationBarView* location_bar() { - return BrowserView::GetBrowserViewForBrowser(browser()) - ->toolbar() - ->location_bar(); + auto* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); + return browser_view->toolbar()->location_bar(); } OmniboxViewViews* omnibox_view() { return location_bar()->omnibox_view(); } OmniboxEditModel* edit_model() { return omnibox_view()->model(); } @@ -113,7 +117,11 @@ EXPECT_FALSE(GetPopupWidget()); edit_model()->SetUserText(base::ASCIIToUTF16("foo")); - edit_model()->StartAutocomplete(false, false); + AutocompleteInput input( + base::ASCIIToUTF16("foo"), metrics::OmniboxEventProto::BLANK, + ChromeAutocompleteSchemeClassifier(browser()->profile())); + input.set_want_asynchronous_matches(false); + popup_model()->autocomplete_controller()->Start(input); EXPECT_FALSE(popup_model()->result().empty()); EXPECT_TRUE(popup_view()->IsOpen());
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc index 6b5ee47..6fed4fe 100644 --- a/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc +++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc
@@ -282,7 +282,7 @@ constexpr size_t kExpectedChildren = 0; EXPECT_EQ(kExpectedChildren, api_->permissions_view()->children().size()); - const GURL origin = GURL(kUrl).GetOrigin(); + const auto origin = url::Origin::Create(GURL(kUrl)); // Connect the UsbChooserContext with FakeUsbDeviceManager. device::FakeUsbDeviceManager usb_device_manager; @@ -302,22 +302,17 @@ ChosenObjectView* object_view = static_cast<ChosenObjectView*>( api_->permissions_view()->children()[kExpectedChildren]); - EXPECT_EQ(4u, object_view->children().size()); + const auto& children = object_view->children(); + EXPECT_EQ(4u, children.size()); - constexpr int kLabelIndex = 1; - views::Label* label = - static_cast<views::Label*>(object_view->child_at(kLabelIndex)); + views::Label* label = static_cast<views::Label*>(children[1]); EXPECT_EQ(base::ASCIIToUTF16("Gizmo"), label->text()); - constexpr int kButtonIndex = 2; - views::Button* button = - static_cast<views::Button*>(object_view->child_at(kButtonIndex)); - + views::Button* button = static_cast<views::Button*>(children[2]); const ui::MouseEvent event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(), 0, 0); - views::ButtonListener* button_listener = - static_cast<views::ButtonListener*>(object_view); - button_listener->ButtonPressed(button, event); + static_cast<views::ButtonListener*>(object_view) + ->ButtonPressed(button, event); api_->SetPermissionInfo(list); EXPECT_EQ(kExpectedChildren, api_->permissions_view()->children().size()); EXPECT_FALSE(store->HasDevicePermission(origin, origin, *device_info)); @@ -357,22 +352,17 @@ ChosenObjectView* object_view = static_cast<ChosenObjectView*>( api_->permissions_view()->children()[kExpectedChildren]); - EXPECT_EQ(4u, object_view->children().size()); + const auto& children = object_view->children(); + EXPECT_EQ(4u, children.size()); - constexpr int kLabelIndex = 1; - views::Label* label = - static_cast<views::Label*>(object_view->child_at(kLabelIndex)); + views::Label* label = static_cast<views::Label*>(children[1]); EXPECT_EQ(base::ASCIIToUTF16("Unknown product 0x162E from Google Inc."), label->text()); - constexpr int kButtonIndex = 2; - views::Button* button = - static_cast<views::Button*>(object_view->child_at(kButtonIndex)); + views::Button* button = static_cast<views::Button*>(children[2]); EXPECT_EQ(button->state(), views::Button::STATE_DISABLED); - constexpr int kDescIndex = 3; - views::Label* desc_label = - static_cast<views::Label*>(object_view->child_at(kDescIndex)); + views::Label* desc_label = static_cast<views::Label*>(children[3]); EXPECT_EQ(base::ASCIIToUTF16("USB device allowed by your administrator"), desc_label->text()); @@ -392,7 +382,7 @@ constexpr size_t kExpectedChildren = 0; EXPECT_EQ(kExpectedChildren, api_->permissions_view()->children().size()); - const GURL origin = GURL(kUrl).GetOrigin(); + const auto origin = url::Origin::Create(GURL(kUrl)); // Add the policy setting to prefs. Profile* profile = web_contents_helper_.profile(); @@ -410,63 +400,67 @@ 0, 0, "Google", "Gizmo", "1234567890"); store->GrantDevicePermission(origin, origin, *device_info); - auto objects = store->GetGrantedObjects(origin, origin); + auto objects = store->GetGrantedObjects(origin.GetURL(), origin.GetURL()); EXPECT_EQ(objects.size(), 2u); PermissionInfoList list; api_->SetPermissionInfo(list); EXPECT_EQ(kExpectedChildren + 2, api_->permissions_view()->children().size()); - // The first object is the user granted permission for the "Gizmo" device. - ChosenObjectView* object_view = static_cast<ChosenObjectView*>( - api_->permissions_view()->children()[kExpectedChildren]); - EXPECT_EQ(4u, object_view->children().size()); - - constexpr int kLabelIndex = 1; - views::Label* label = - static_cast<views::Label*>(object_view->child_at(kLabelIndex)); - EXPECT_EQ(base::ASCIIToUTF16("Gizmo"), label->text()); - - constexpr int kButtonIndex = 2; - views::Button* button = - static_cast<views::Button*>(object_view->child_at(kButtonIndex)); - EXPECT_NE(button->state(), views::Button::STATE_DISABLED); - - constexpr int kDescIndex = 3; - views::Label* desc_label = - static_cast<views::Label*>(object_view->child_at(kDescIndex)); - EXPECT_EQ(base::ASCIIToUTF16("USB device"), desc_label->text()); - const ui::MouseEvent event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(), 0, 0); - views::ButtonListener* button_listener = - static_cast<views::ButtonListener*>(object_view); - button_listener->ButtonPressed(button, event); - api_->SetPermissionInfo(list); - EXPECT_EQ(kExpectedChildren + 1, api_->permissions_view()->children().size()); - EXPECT_FALSE(store->HasDevicePermission(origin, origin, *device_info)); + + // The first object is the user granted permission for the "Gizmo" device. + { + ChosenObjectView* object_view = static_cast<ChosenObjectView*>( + api_->permissions_view()->children()[kExpectedChildren]); + const auto& children = object_view->children(); + EXPECT_EQ(4u, children.size()); + + views::Label* label = static_cast<views::Label*>(children[1]); + EXPECT_EQ(base::ASCIIToUTF16("Gizmo"), label->text()); + + views::Button* button = static_cast<views::Button*>(children[2]); + EXPECT_NE(button->state(), views::Button::STATE_DISABLED); + + views::Label* desc_label = static_cast<views::Label*>(children[3]); + EXPECT_EQ(base::ASCIIToUTF16("USB device"), desc_label->text()); + + views::ButtonListener* button_listener = + static_cast<views::ButtonListener*>(object_view); + button_listener->ButtonPressed(button, event); + api_->SetPermissionInfo(list); + EXPECT_EQ(kExpectedChildren + 1, + api_->permissions_view()->children().size()); + EXPECT_FALSE(store->HasDevicePermission(origin, origin, *device_info)); + } // The policy granted permission should now be the first child, since the user // permission was deleted. - object_view = static_cast<ChosenObjectView*>( - api_->permissions_view()->children()[kExpectedChildren]); - EXPECT_EQ(4u, object_view->children().size()); + { + ChosenObjectView* object_view = static_cast<ChosenObjectView*>( + api_->permissions_view()->children()[kExpectedChildren]); + const auto& children = object_view->children(); + EXPECT_EQ(4u, children.size()); - label = static_cast<views::Label*>(object_view->child_at(kLabelIndex)); - EXPECT_EQ(base::ASCIIToUTF16("Unknown product 0x162E from Google Inc."), - label->text()); + views::Label* label = static_cast<views::Label*>(children[1]); + EXPECT_EQ(base::ASCIIToUTF16("Unknown product 0x162E from Google Inc."), + label->text()); - button = static_cast<views::Button*>(object_view->child_at(kButtonIndex)); - EXPECT_EQ(button->state(), views::Button::STATE_DISABLED); + views::Button* button = static_cast<views::Button*>(children[2]); + EXPECT_EQ(button->state(), views::Button::STATE_DISABLED); - desc_label = static_cast<views::Label*>(object_view->child_at(kDescIndex)); - EXPECT_EQ(base::ASCIIToUTF16("USB device allowed by your administrator"), - desc_label->text()); + views::Label* desc_label = static_cast<views::Label*>(children[3]); + EXPECT_EQ(base::ASCIIToUTF16("USB device allowed by your administrator"), + desc_label->text()); - button_listener = static_cast<views::ButtonListener*>(object_view); - button_listener->ButtonPressed(button, event); - api_->SetPermissionInfo(list); - EXPECT_EQ(kExpectedChildren + 1, api_->permissions_view()->children().size()); + views::ButtonListener* button_listener = + static_cast<views::ButtonListener*>(object_view); + button_listener->ButtonPressed(button, event); + api_->SetPermissionInfo(list); + EXPECT_EQ(kExpectedChildren + 1, + api_->permissions_view()->children().size()); + } } TEST_F(PageInfoBubbleViewTest, SetPermissionInfoForUsbGuard) { @@ -577,21 +571,18 @@ // Check the Flash permission is now showing since it's non-default. api_->CreateView(); - constexpr int kPermissionLabelIndex = 1; - views::Label* label = static_cast<views::Label*>( - api_->permissions_view()->child_at(kPermissionLabelIndex)); + const auto& children = api_->permissions_view()->children(); + views::Label* label = static_cast<views::Label*>(children[1]); EXPECT_EQ(base::ASCIIToUTF16("Flash"), label->text()); // Change the Flash setting back to the default. map->SetContentSettingDefaultScope(url, url, CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), CONTENT_SETTING_DEFAULT); - EXPECT_EQ(kViewsPerPermissionRow, - api_->permissions_view()->children().size()); + EXPECT_EQ(kViewsPerPermissionRow, children.size()); // Check the Flash permission is still showing since the user changed it // previously. - label = static_cast<views::Label*>( - api_->permissions_view()->child_at(kPermissionLabelIndex)); + label = static_cast<views::Label*>(children[1]); EXPECT_EQ(base::ASCIIToUTF16("Flash"), label->text()); } #endif
diff --git a/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc index 97b0ba26..b53ff7a 100644 --- a/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc
@@ -189,7 +189,7 @@ views::View* list_view = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::CONTACT_INFO_SHEET_LIST_VIEW)); DCHECK(list_view); - ClickOnDialogViewAndWait(list_view->child_at(0)); + ClickOnDialogViewAndWait(list_view->children().front()); // Do not set name: This should have been populated when opening the screen. EXPECT_EQ(base::ASCIIToUTF16(kNameFull), @@ -249,7 +249,7 @@ views::View* list_view = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::CONTACT_INFO_SHEET_LIST_VIEW)); DCHECK(list_view); - ClickOnDialogViewAndWait(list_view->child_at(1)); + ClickOnDialogViewAndWait(list_view->children()[1]); SetEditorTextfieldValue(base::ASCIIToUTF16(kPhoneNumber), autofill::PHONE_HOME_WHOLE_NUMBER);
diff --git a/chrome/browser/ui/views/payments/credit_card_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/credit_card_editor_view_controller_browsertest.cc index 15c4220..4d08650 100644 --- a/chrome/browser/ui/views/payments/credit_card_editor_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/credit_card_editor_view_controller_browsertest.cc
@@ -252,7 +252,7 @@ EXPECT_TRUE(list_view); EXPECT_EQ(1u, list_view->children().size()); - views::View* edit_button = list_view->child_at(0)->GetViewByID( + views::View* edit_button = list_view->children().front()->GetViewByID( static_cast<int>(DialogViewID::EDIT_ITEM_BUTTON)); ResetEventWaiter(DialogEvent::CREDIT_CARD_EDITOR_OPENED); @@ -337,7 +337,7 @@ EXPECT_TRUE(list_view); EXPECT_EQ(1u, list_view->children().size()); - views::View* edit_button = list_view->child_at(0)->GetViewByID( + views::View* edit_button = list_view->children().front()->GetViewByID( static_cast<int>(DialogViewID::EDIT_ITEM_BUTTON)); ResetEventWaiter(DialogEvent::CREDIT_CARD_EDITOR_OPENED); @@ -551,7 +551,7 @@ EXPECT_TRUE(list_view); EXPECT_EQ(1u, list_view->children().size()); - views::View* edit_button = list_view->child_at(0)->GetViewByID( + views::View* edit_button = list_view->children().front()->GetViewByID( static_cast<int>(DialogViewID::EDIT_ITEM_BUTTON)); ResetEventWaiter(DialogEvent::CREDIT_CARD_EDITOR_OPENED);
diff --git a/chrome/browser/ui/views/payments/editor_view_controller.cc b/chrome/browser/ui/views/payments/editor_view_controller.cc index 4557672..5730a15c 100644 --- a/chrome/browser/ui/views/payments/editor_view_controller.cc +++ b/chrome/browser/ui/views/payments/editor_view_controller.cc
@@ -493,7 +493,7 @@ } else { // The error view is the only child, and has a Label as only child itself. static_cast<views::Label*>( - label_view_it->second->child_at(0)->child_at(0)) + label_view_it->second->children().front()->children().front()) ->SetText(error_message); } }
diff --git a/chrome/browser/ui/views/payments/payment_method_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/payment_method_view_controller_browsertest.cc index 4532dc4..7c53f93 100644 --- a/chrome/browser/ui/views/payments/payment_method_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_method_view_controller_browsertest.cc
@@ -42,7 +42,7 @@ EXPECT_EQ(request->state()->available_instruments().front().get(), request->state()->selected_instrument()); - views::View* checkmark_view = list_view->child_at(0)->GetViewByID( + views::View* checkmark_view = list_view->children().front()->GetViewByID( static_cast<int>(DialogViewID::CHECKMARK_VIEW)); EXPECT_TRUE(checkmark_view->visible()); } @@ -82,17 +82,17 @@ EXPECT_EQ(request->state()->available_instruments().front().get(), request->state()->selected_instrument()); - views::View* checkmark_view = list_view->child_at(0)->GetViewByID( + views::View* checkmark_view = list_view->children()[0]->GetViewByID( static_cast<int>(DialogViewID::CHECKMARK_VIEW)); EXPECT_TRUE(checkmark_view->visible()); - views::View* checkmark_view2 = list_view->child_at(1)->GetViewByID( + views::View* checkmark_view2 = list_view->children()[1]->GetViewByID( static_cast<int>(DialogViewID::CHECKMARK_VIEW)); EXPECT_FALSE(checkmark_view2->visible()); ResetEventWaiter(DialogEvent::BACK_NAVIGATION); // Simulate selecting the second card. - ClickOnDialogViewAndWait(list_view->child_at(1)); + ClickOnDialogViewAndWait(list_view->children()[1]); EXPECT_EQ(request->state()->available_instruments().back().get(), request->state()->selected_instrument()); @@ -104,7 +104,7 @@ ResetEventWaiter(DialogEvent::BACK_NAVIGATION); // Clicking on the second card again should not modify any state, and should // return to the main payment sheet. - ClickOnDialogViewAndWait(list_view->child_at(1)); + ClickOnDialogViewAndWait(list_view->children()[1]); EXPECT_EQ(request->state()->available_instruments().back().get(), request->state()->selected_instrument()); @@ -122,7 +122,7 @@ EXPECT_TRUE(list_view); EXPECT_EQ(1u, list_view->children().size()); - views::View* edit_button = list_view->child_at(0)->GetViewByID( + views::View* edit_button = list_view->children().front()->GetViewByID( static_cast<int>(DialogViewID::EDIT_ITEM_BUTTON)); ResetEventWaiter(DialogEvent::CREDIT_CARD_EDITOR_OPENED);
diff --git a/chrome/browser/ui/views/payments/payment_request_payment_response_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_payment_response_browsertest.cc index 3c50c08..57c9b6db 100644 --- a/chrome/browser/ui/views/payments/payment_request_payment_response_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_payment_response_browsertest.cc
@@ -170,7 +170,7 @@ views::View* list_view = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::CONTACT_INFO_SHEET_LIST_VIEW)); DCHECK(list_view); - ClickOnDialogViewAndWait(list_view->child_at(1)); + ClickOnDialogViewAndWait(list_view->children()[1]); ExpectBodyContains({"\"payerName\": \"Jane A. Smith\"", "\"payerEmail\": \"jsmith@example.com\"",
diff --git a/chrome/browser/ui/views/payments/profile_list_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/profile_list_view_controller_browsertest.cc index 53cddb92..b453767b 100644 --- a/chrome/browser/ui/views/payments/profile_list_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/profile_list_view_controller_browsertest.cc
@@ -63,15 +63,12 @@ views::View* sheet = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW)); ASSERT_EQ(2u, sheet->children().size()); - views::View* first_label = sheet->child_at(0)->GetViewByID( - static_cast<int>(DialogViewID::PROFILE_LABEL_LINE_1)); - views::View* second_label = sheet->child_at(1)->GetViewByID( - static_cast<int>(DialogViewID::PROFILE_LABEL_LINE_1)); - - EXPECT_EQ(base::ASCIIToUTF16("John H. Doe"), - static_cast<views::Label*>(first_label)->text()); - EXPECT_EQ(base::ASCIIToUTF16("Jane A. Smith"), - static_cast<views::Label*>(second_label)->text()); + const auto get_label = [sheet](size_t num) { + constexpr int kId = static_cast<int>(DialogViewID::PROFILE_LABEL_LINE_1); + return static_cast<views::Label*>(sheet->children()[num]->GetViewByID(kId)); + }; + EXPECT_EQ(base::ASCIIToUTF16("John H. Doe"), get_label(0)->text()); + EXPECT_EQ(base::ASCIIToUTF16("Jane A. Smith"), get_label(1)->text()); } } // namespace payments
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc index b7690d8..d0f1f39 100644 --- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
@@ -742,7 +742,7 @@ static_cast<int>(DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW)); EXPECT_TRUE(list_view); EXPECT_EQ(1u, list_view->children().size()); - views::View* edit_button = list_view->child_at(0)->GetViewByID( + views::View* edit_button = list_view->children().front()->GetViewByID( static_cast<int>(DialogViewID::EDIT_ITEM_BUTTON)); ResetEventWaiter(DialogEvent::SHIPPING_ADDRESS_EDITOR_OPENED); ClickOnDialogViewAndWait(edit_button); @@ -802,7 +802,7 @@ views::View* sheet = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW)); ASSERT_EQ(1u, sheet->children().size()); - EXPECT_EQ(nullptr, sheet->child_at(0)->GetViewByID( + EXPECT_EQ(nullptr, sheet->children().front()->GetViewByID( static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR))); } @@ -825,7 +825,7 @@ views::View* sheet = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW)); ASSERT_EQ(1u, sheet->children().size()); - EXPECT_EQ(nullptr, sheet->child_at(0)->GetViewByID( + EXPECT_EQ(nullptr, sheet->children().front()->GetViewByID( static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR))); } @@ -847,7 +847,7 @@ views::View* sheet = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW)); ASSERT_EQ(1u, sheet->children().size()); - views::View* error_label = sheet->child_at(0)->GetViewByID( + views::View* error_label = sheet->children().front()->GetViewByID( static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR)); EXPECT_EQ(base::ASCIIToUTF16("Phone number required"), static_cast<views::Label*>(error_label)->text()); @@ -874,7 +874,7 @@ views::View* sheet = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW)); ASSERT_EQ(1u, sheet->children().size()); - views::View* error_label = sheet->child_at(0)->GetViewByID( + views::View* error_label = sheet->children().front()->GetViewByID( static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR)); EXPECT_EQ(base::ASCIIToUTF16("Enter a valid address"), static_cast<views::Label*>(error_label)->text()); @@ -921,7 +921,7 @@ views::View* sheet = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW)); ASSERT_EQ(1u, sheet->children().size()); - EXPECT_EQ(nullptr, sheet->child_at(0)->GetViewByID( + EXPECT_EQ(nullptr, sheet->children().front()->GetViewByID( static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR))); } @@ -949,7 +949,7 @@ views::View* sheet = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW)); ASSERT_EQ(1u, sheet->children().size()); - views::View* error_label = sheet->child_at(0)->GetViewByID( + views::View* error_label = sheet->children().front()->GetViewByID( static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR)); EXPECT_EQ(base::ASCIIToUTF16("Enter a valid address"), static_cast<views::Label*>(error_label)->text()); @@ -999,7 +999,7 @@ views::View* sheet = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW)); ASSERT_EQ(1u, sheet->children().size()); - views::View* error_label = sheet->child_at(0)->GetViewByID( + views::View* error_label = sheet->children().front()->GetViewByID( static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR)); EXPECT_EQ(base::ASCIIToUTF16("Enter a valid address"), static_cast<views::Label*>(error_label)->text()); @@ -1054,7 +1054,7 @@ views::View* sheet = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW)); ASSERT_EQ(1u, sheet->children().size()); - views::View* error_label = sheet->child_at(0)->GetViewByID( + views::View* error_label = sheet->children().front()->GetViewByID( static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR)); EXPECT_EQ(base::ASCIIToUTF16("Enter a valid address"), static_cast<views::Label*>(error_label)->text()); @@ -1101,7 +1101,7 @@ views::View* sheet = dialog_view()->GetViewByID( static_cast<int>(DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW)); ASSERT_EQ(1u, sheet->children().size()); - views::View* error_label = sheet->child_at(0)->GetViewByID( + views::View* error_label = sheet->children().front()->GetViewByID( static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR)); EXPECT_EQ(base::ASCIIToUTF16("Enter a valid address"), static_cast<views::Label*>(error_label)->text());
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc index 8a65dc4..dafe0ee 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc +++ b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
@@ -254,7 +254,7 @@ views::BubbleFrameView::PreferredArrowAdjustment::kOffset); if (CustomShadowsSupported()) - GetBubbleFrameView()->bubble_border()->SetCornerRadius( + GetBubbleFrameView()->SetCornerRadius( ChromeLayoutProvider::Get()->GetCornerRadiusMetric( views::EMPHASIS_HIGH)); }
diff --git a/chrome/browser/ui/views/test/view_event_test_base.cc b/chrome/browser/ui/views/test/view_event_test_base.cc index 6c60e713..546a558 100644 --- a/chrome/browser/ui/views/test/view_event_test_base.cc +++ b/chrome/browser/ui/views/test/view_event_test_base.cc
@@ -42,11 +42,8 @@ // Permit a test to remove the view being tested from the hierarchy, then // still handle a _NET_WM_STATE event on Linux during teardown that triggers // layout. - if (children().empty()) - return; - - View* child_view = child_at(0); - child_view->SetBounds(0, 0, width(), height()); + if (!children().empty()) + children().front()->SetBoundsRect(GetLocalBounds()); } private: @@ -57,7 +54,7 @@ } // namespace -ViewEventTestBase::ViewEventTestBase() : window_(NULL), content_view_(NULL) { +ViewEventTestBase::ViewEventTestBase() { // The TestingBrowserProcess must be created in the constructor because there // are tests that require it before SetUp() is called. TestingBrowserProcess::CreateInstance();
diff --git a/chrome/browser/ui/views/test/view_event_test_base.h b/chrome/browser/ui/views/test/view_event_test_base.h index a3fc4c84..fd67aef 100644 --- a/chrome/browser/ui/views/test/view_event_test_base.h +++ b/chrome/browser/ui/views/test/view_event_test_base.h
@@ -119,7 +119,7 @@ // Returns a task runner to use for drag-related mouse events. scoped_refptr<base::SingleThreadTaskRunner> GetDragTaskRunner(); - views::Widget* window_; + views::Widget* window_ = nullptr; private: // Callback from CreateEventTask. Runs the supplied task and if there are @@ -127,7 +127,7 @@ void RunTestMethod(base::OnceClosure task); // The content of the Window. - views::View* content_view_; + views::View* content_view_ = nullptr; // Thread for posting background drag events. std::unique_ptr<base::Thread> drag_event_thread_;
diff --git a/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc b/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc index 17dca376..24d9a13 100644 --- a/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc +++ b/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc
@@ -51,12 +51,10 @@ ->toolbar()->browser_actions(); // The order of the child views should be the same. - EXPECT_EQ(container->GetViewForId(extension_a()->id()), - container->child_at(0)); - EXPECT_EQ(container->GetViewForId(extension_b()->id()), - container->child_at(1)); - EXPECT_EQ(container->GetViewForId(extension_c()->id()), - container->child_at(2)); + const auto& children = container->children(); + EXPECT_EQ(container->GetViewForId(extension_a()->id()), children[0]); + EXPECT_EQ(container->GetViewForId(extension_b()->id()), children[1]); + EXPECT_EQ(container->GetViewForId(extension_c()->id()), children[2]); // Simulate a drag and drop to the right. ui::OSExchangeData drop_data; @@ -77,12 +75,9 @@ EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(0)); EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(1)); EXPECT_EQ(extension_c()->id(), browser_actions_bar()->GetExtensionId(2)); - EXPECT_EQ(container->GetViewForId(extension_b()->id()), - container->child_at(0)); - EXPECT_EQ(container->GetViewForId(extension_a()->id()), - container->child_at(1)); - EXPECT_EQ(container->GetViewForId(extension_c()->id()), - container->child_at(2)); + EXPECT_EQ(container->GetViewForId(extension_b()->id()), children[0]); + EXPECT_EQ(container->GetViewForId(extension_a()->id()), children[1]); + EXPECT_EQ(container->GetViewForId(extension_c()->id()), children[2]); const extensions::ExtensionSet& extension_set = extensions::ExtensionRegistry::Get(profile())->enabled_extensions(); @@ -112,12 +107,9 @@ EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(0)); EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(1)); EXPECT_EQ(extension_c()->id(), browser_actions_bar()->GetExtensionId(2)); - EXPECT_EQ(container->GetViewForId(extension_a()->id()), - container->child_at(0)); - EXPECT_EQ(container->GetViewForId(extension_b()->id()), - container->child_at(1)); - EXPECT_EQ(container->GetViewForId(extension_c()->id()), - container->child_at(2)); + EXPECT_EQ(container->GetViewForId(extension_a()->id()), children[0]); + EXPECT_EQ(container->GetViewForId(extension_b()->id()), children[1]); + EXPECT_EQ(container->GetViewForId(extension_c()->id()), children[2]); // Shrink the size of the container so we have an overflow menu. toolbar_model()->SetVisibleIconCount(2u);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views_unittest.cc b/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views_unittest.cc index 4bef431..0ce83fa 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views_unittest.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views_unittest.cc
@@ -434,17 +434,16 @@ std::unique_ptr<views::View> extra_view(TestCreateExtraView()); ASSERT_TRUE(extra_view); - EXPECT_EQ("View", std::string(extra_view->GetClassName())); - ASSERT_EQ(2u, extra_view->children().size()); + EXPECT_STREQ("View", extra_view->GetClassName()); + EXPECT_EQ(2u, extra_view->children().size()); - for (int i = 0; i < 2; i++) { - const views::View* v = extra_view->child_at(i); + for (const views::View* v : extra_view->children()) { std::string class_name = v->GetClassName(); - ASSERT_TRUE(class_name == "Label" || class_name == "ImageView"); if (class_name == "Label") { EXPECT_EQ(l10n_util::GetStringUTF16(IDS_EXTENSIONS_INSTALLED_BY_ADMIN), static_cast<const views::Label*>(v)->text()); } else { + ASSERT_EQ("ImageView", class_name); EXPECT_TRUE(gfx::test::AreImagesEqual( gfx::Image(static_cast<const views::ImageView*>(v)->GetImage()), gfx::Image(gfx::CreateVectorIcon(vector_icons::kBusinessIcon,
diff --git a/chrome/browser/ui/views/try_chrome_dialog_win/button_layout.cc b/chrome/browser/ui/views/try_chrome_dialog_win/button_layout.cc index 8cd99845..7dd43a24 100644 --- a/chrome/browser/ui/views/try_chrome_dialog_win/button_layout.cc +++ b/chrome/browser/ui/views/try_chrome_dialog_win/button_layout.cc
@@ -25,19 +25,20 @@ // The buttons are all equal-sized. const gfx::Size max_child_size = GetMaxChildPreferredSize(host); gfx::Size button_size(host_size.width(), max_child_size.height()); + const auto& children = host->children(); if (UseWideButtons(host_size.width(), max_child_size.width())) { - host->child_at(0)->SetBoundsRect({gfx::Point(), button_size}); - if (host->children().size() > 1) { + children[0]->SetBoundsRect({gfx::Point(), button_size}); + if (children.size() > 1) { int bottom_y = button_size.height() + kPaddingBetweenButtons; - host->child_at(1)->SetBoundsRect({{0, bottom_y}, button_size}); + children[1]->SetBoundsRect({{0, bottom_y}, button_size}); } } else { button_size.set_width((host_size.width() - kPaddingBetweenButtons) / 2); // The offset of the right-side narrow button. const int right_x = button_size.width() + kPaddingBetweenButtons; - auto right_button = host->children().begin(); - if (host->children().size() > 1) { - host->child_at(0)->SetBoundsRect({gfx::Point(), button_size}); + auto right_button = children.begin(); + if (children.size() > 1) { + children[0]->SetBoundsRect({gfx::Point(), button_size}); ++right_button; } (*right_button)->SetBoundsRect({{right_x, 0}, button_size}); @@ -62,9 +63,10 @@ // static gfx::Size ButtonLayout::GetMaxChildPreferredSize(const views::View* host) { - gfx::Size max_child_size = host->child_at(0)->GetPreferredSize(); - if (host->children().size() > 1) - max_child_size.SetToMax(host->child_at(1)->GetPreferredSize()); + const auto& children = host->children(); + gfx::Size max_child_size = children[0]->GetPreferredSize(); + if (children.size() > 1) + max_child_size.SetToMax(children[1]->GetPreferredSize()); return max_child_size; }
diff --git a/chrome/browser/ui/views/try_chrome_dialog_win/button_layout_unittest.cc b/chrome/browser/ui/views/try_chrome_dialog_win/button_layout_unittest.cc index 2586e71..0b4919d8 100644 --- a/chrome/browser/ui/views/try_chrome_dialog_win/button_layout_unittest.cc +++ b/chrome/browser/ui/views/try_chrome_dialog_win/button_layout_unittest.cc
@@ -173,9 +173,9 @@ host()->SetBounds(0, 0, GetExpectedWidth(), GetExpectedHeight()); layout()->Layout(host()); - ExpectViewBoundsEquals(host()->child_at(0), GetExpectedButtonBounds(1)); + ExpectViewBoundsEquals(host()->children()[0], GetExpectedButtonBounds(1)); if (has_two_buttons()) - ExpectViewBoundsEquals(host()->child_at(1), GetExpectedButtonBounds(2)); + ExpectViewBoundsEquals(host()->children()[1], GetExpectedButtonBounds(2)); } // Test all combinations of one or two buttons at many sizes.
diff --git a/chrome/browser/ui/webui/bookmarks/bookmarks_ui.cc b/chrome/browser/ui/webui/bookmarks/bookmarks_ui.cc index 7f6629a1..41650fda 100644 --- a/chrome/browser/ui/webui/bookmarks/bookmarks_ui.cc +++ b/chrome/browser/ui/webui/bookmarks/bookmarks_ui.cc
@@ -141,7 +141,7 @@ source->AddResourcePath("images/folder.svg", IDR_BOOKMARKS_IMAGES_FOLDER_SVG); #if BUILDFLAG(OPTIMIZE_WEBUI) source->AddResourcePath("crisper.js", IDR_BOOKMARKS_CRISPER_JS); - source->SetDefaultResource(IDR_BOOKMARKS_VULCANIZED_P2_HTML); + source->SetDefaultResource(IDR_BOOKMARKS_VULCANIZED_HTML); source->UseGzip(base::BindRepeating([](const std::string& path) { return path != "images/folder_open.svg" && path != "images/folder.svg"; }));
diff --git a/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc b/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc index b0d625e..363c7c50 100644 --- a/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc +++ b/chrome/browser/ui/webui/chromeos/bluetooth_pairing_dialog.cc
@@ -106,7 +106,7 @@ source->SetJsonPath("strings.js"); #if BUILDFLAG(OPTIMIZE_WEBUI) source->UseGzip(); - source->SetDefaultResource(IDR_BLUETOOTH_PAIRING_DIALOG_VULCANIZED_P2_HTML); + source->SetDefaultResource(IDR_BLUETOOTH_PAIRING_DIALOG_VULCANIZED_HTML); source->AddResourcePath("crisper.js", IDR_BLUETOOTH_PAIRING_DIALOG_CRISPER_JS); #else
diff --git a/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc b/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc index 9c254bd..f294399 100644 --- a/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc +++ b/chrome/browser/ui/webui/chromeos/internet_config_dialog.cc
@@ -145,7 +145,7 @@ source->SetJsonPath("strings.js"); #if BUILDFLAG(OPTIMIZE_WEBUI) source->UseGzip(); - source->SetDefaultResource(IDR_INTERNET_CONFIG_DIALOG_VULCANIZED_P2_HTML); + source->SetDefaultResource(IDR_INTERNET_CONFIG_DIALOG_VULCANIZED_HTML); source->AddResourcePath("crisper.js", IDR_INTERNET_CONFIG_DIALOG_CRISPER_JS); #else source->SetDefaultResource(IDR_INTERNET_CONFIG_DIALOG_HTML);
diff --git a/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc b/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc index 434f30b5..f76c602 100644 --- a/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc +++ b/chrome/browser/ui/webui/chromeos/internet_detail_dialog.cc
@@ -143,7 +143,7 @@ source->SetJsonPath("strings.js"); #if BUILDFLAG(OPTIMIZE_WEBUI) source->UseGzip(); - source->SetDefaultResource(IDR_INTERNET_DETAIL_DIALOG_VULCANIZED_P2_HTML); + source->SetDefaultResource(IDR_INTERNET_DETAIL_DIALOG_VULCANIZED_HTML); source->AddResourcePath("crisper.js", IDR_INTERNET_DETAIL_DIALOG_CRISPER_JS); #else source->SetDefaultResource(IDR_INTERNET_DETAIL_DIALOG_HTML);
diff --git a/chrome/browser/ui/webui/downloads/downloads_ui.cc b/chrome/browser/ui/webui/downloads/downloads_ui.cc index 7d62ef9..4413068 100644 --- a/chrome/browser/ui/webui/downloads/downloads_ui.cc +++ b/chrome/browser/ui/webui/downloads/downloads_ui.cc
@@ -146,7 +146,7 @@ })); source->AddResourcePath("crisper.js", IDR_DOWNLOADS_CRISPER_JS); - source->SetDefaultResource(IDR_DOWNLOADS_VULCANIZED_P2_HTML); + source->SetDefaultResource(IDR_DOWNLOADS_VULCANIZED_HTML); #else source->AddResourcePath("browser_proxy.html", IDR_DOWNLOADS_BROWSER_PROXY_HTML);
diff --git a/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chrome/browser/ui/webui/extensions/extensions_ui.cc index 9705e694..bb84e898 100644 --- a/chrome/browser/ui/webui/extensions/extensions_ui.cc +++ b/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -340,7 +340,7 @@ #if BUILDFLAG(OPTIMIZE_WEBUI) source->AddResourcePath("crisper.js", IDR_EXTENSIONS_CRISPER_JS); - source->SetDefaultResource(IDR_EXTENSIONS_VULCANIZED_P2_HTML); + source->SetDefaultResource(IDR_EXTENSIONS_VULCANIZED_HTML); source->UseGzip(); #else // Add all MD Extensions resources.
diff --git a/chrome/browser/ui/webui/history_ui.cc b/chrome/browser/ui/webui/history_ui.cc index 69e41910..9db3939 100644 --- a/chrome/browser/ui/webui/history_ui.cc +++ b/chrome/browser/ui/webui/history_ui.cc
@@ -174,10 +174,10 @@ std::move(exclude_from_gzip))); #if BUILDFLAG(OPTIMIZE_WEBUI) - source->AddResourcePath("app.html", IDR_HISTORY_APP_VULCANIZED_P2_HTML); + source->AddResourcePath("app.html", IDR_HISTORY_APP_VULCANIZED_HTML); source->AddResourcePath("app.crisper.js", IDR_HISTORY_APP_CRISPER_JS); source->AddResourcePath("lazy_load.html", - IDR_HISTORY_LAZY_LOAD_VULCANIZED_P2_HTML); + IDR_HISTORY_LAZY_LOAD_VULCANIZED_HTML); source->AddResourcePath("lazy_load.crisper.js", IDR_HISTORY_LAZY_LOAD_CRISPER_JS); #endif
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc index 587996ec..efb11ef 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -443,7 +443,7 @@ source->SetJsonPath("strings.js"); #if BUILDFLAG(OPTIMIZE_WEBUI) source->AddResourcePath("crisper.js", IDR_PRINT_PREVIEW_CRISPER_JS); - source->SetDefaultResource(IDR_PRINT_PREVIEW_VULCANIZED_P2_HTML); + source->SetDefaultResource(IDR_PRINT_PREVIEW_VULCANIZED_HTML); std::vector<std::string> exclude_from_gzip = SetupPrintPreviewPlugin(source); source->UseGzip(base::BindRepeating( [](const std::vector<std::string>& excluded_paths,
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc index 7e17c7e3..03050df 100644 --- a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc +++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
@@ -26,7 +26,6 @@ #include "chrome/browser/ui/webui/settings/extension_control_handler.h" #include "chrome/browser/ui/webui/settings/font_handler.h" #include "chrome/browser/ui/webui/settings/languages_handler.h" -#include "chrome/browser/ui/webui/settings/on_startup_handler.h" #include "chrome/browser/ui/webui/settings/people_handler.h" #include "chrome/browser/ui/webui/settings/profile_info_handler.h" #include "chrome/browser/ui/webui/settings/protocol_handlers_handler.h" @@ -38,7 +37,6 @@ #include "chrome/browser/ui/webui/settings/settings_localized_strings_provider.h" #include "chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.h" #include "chrome/browser/ui/webui/settings/settings_security_key_handler.h" -#include "chrome/browser/ui/webui/settings/settings_startup_pages_handler.h" #include "chrome/browser/ui/webui/settings/settings_ui.h" #include "chrome/browser/ui/webui/settings/site_settings_handler.h" #include "chrome/browser/web_applications/system_web_app_manager.h" @@ -103,8 +101,6 @@ AddSettingsPageUIHandler( std::make_unique<::settings::MediaDevicesSelectionHandler>(profile)); AddSettingsPageUIHandler( - std::make_unique<::settings::OnStartupHandler>(profile)); - AddSettingsPageUIHandler( std::make_unique<::settings::PeopleHandler>(profile)); AddSettingsPageUIHandler( std::make_unique<::settings::ProfileInfoHandler>(profile)); @@ -114,8 +110,6 @@ std::make_unique<::settings::SearchEnginesHandler>(profile)); AddSettingsPageUIHandler( std::make_unique<::settings::SiteSettingsHandler>(profile)); - AddSettingsPageUIHandler( - std::make_unique<::settings::StartupPagesHandler>(web_ui)); AddSettingsPageUIHandler(std::make_unique<::settings::SecurityKeysHandler>()); bool password_protection_available = false; @@ -161,8 +155,8 @@ html_source->AddResourcePath("lazy_load.crisper.js", IDR_OS_SETTINGS_LAZY_LOAD_CRISPER_JS); html_source->AddResourcePath("lazy_load.html", - IDR_OS_SETTINGS_LAZY_LOAD_VULCANIZED_P2_HTML); - html_source->SetDefaultResource(IDR_OS_SETTINGS_VULCANIZED_P2_HTML); + IDR_OS_SETTINGS_LAZY_LOAD_VULCANIZED_HTML); + html_source->SetDefaultResource(IDR_OS_SETTINGS_VULCANIZED_HTML); html_source->UseGzip(base::BindRepeating( [](const std::vector<std::string>& excluded_paths, const std::string& path) {
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc index d82673f..22b404d3 100644 --- a/chrome/browser/ui/webui/settings/settings_ui.cc +++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -316,8 +316,8 @@ html_source->AddResourcePath("lazy_load.crisper.js", IDR_SETTINGS_LAZY_LOAD_CRISPER_JS); html_source->AddResourcePath("lazy_load.html", - IDR_SETTINGS_LAZY_LOAD_VULCANIZED_P2_HTML); - html_source->SetDefaultResource(IDR_SETTINGS_VULCANIZED_P2_HTML); + IDR_SETTINGS_LAZY_LOAD_VULCANIZED_HTML); + html_source->SetDefaultResource(IDR_SETTINGS_VULCANIZED_HTML); html_source->UseGzip(base::BindRepeating( [](const std::vector<std::string>& excluded_paths, const std::string& path) {
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc index 096e057..27a5fce 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -1444,9 +1444,9 @@ namespace { -const GURL kAndroidOrigin("https://android.com"); -const GURL kChromiumOrigin("https://chromium.org"); -const GURL kGoogleOrigin("https://google.com"); +const GURL kAndroidUrl("https://android.com"); +const GURL kChromiumUrl("https://chromium.org"); +const GURL kGoogleUrl("https://google.com"); constexpr char kUsbPolicySetting[] = R"( [ @@ -1506,6 +1506,10 @@ base::DoNothing::Once<std::vector<device::mojom::UsbDeviceInfoPtr>>()); base::RunLoop().RunUntilIdle(); + const auto kAndroidOrigin = url::Origin::Create(kAndroidUrl); + const auto kChromiumOrigin = url::Origin::Create(kChromiumUrl); + const auto kGoogleOrigin = url::Origin::Create(kGoogleUrl); + // Add the user granted permissions for testing. // These two persistent device permissions should be lumped together with // the policy permissions, since they apply to the same device and URL. @@ -1544,6 +1548,8 @@ base::DoNothing::Once<std::vector<device::mojom::UsbDeviceInfoPtr>>()); base::RunLoop().RunUntilIdle(); + const auto kAndroidOrigin = url::Origin::Create(kAndroidUrl); + const auto kChromiumOrigin = url::Origin::Create(kChromiumUrl); chooser_context->GrantDevicePermission(kChromiumOrigin, kAndroidOrigin, *off_the_record_device_); @@ -1708,8 +1714,8 @@ const std::string kUsbChooserGroupName = site_settings::ContentSettingsTypeToGroupName( CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA); - const std::string kAndroidOriginStr = kAndroidOrigin.GetOrigin().spec(); - const std::string kChromiumOriginStr = kChromiumOrigin.GetOrigin().spec(); + const std::string kAndroidOriginStr = kAndroidUrl.GetOrigin().spec(); + const std::string kChromiumOriginStr = kChromiumUrl.GetOrigin().spec(); { const base::Value& exceptions = GetChooserExceptionListFromWebUiCallData( @@ -1730,7 +1736,7 @@ EXPECT_CALL(observer_, OnChooserObjectPermissionChanged( CONTENT_SETTINGS_TYPE_USB_GUARD, CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA)); - EXPECT_CALL(observer_, OnPermissionRevoked(kAndroidOrigin, kChromiumOrigin)); + EXPECT_CALL(observer_, OnPermissionRevoked(kAndroidUrl, kChromiumUrl)); handler()->HandleResetChooserExceptionForSite(&args); // The HandleResetChooserExceptionForSite() method should have also caused the @@ -1777,7 +1783,7 @@ EXPECT_CALL(observer_, OnChooserObjectPermissionChanged( CONTENT_SETTINGS_TYPE_USB_GUARD, CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA)); - EXPECT_CALL(observer_, OnPermissionRevoked(kChromiumOrigin, kChromiumOrigin)); + EXPECT_CALL(observer_, OnPermissionRevoked(kChromiumUrl, kChromiumUrl)); handler()->HandleResetChooserExceptionForSite(&args); // The HandleResetChooserExceptionForSite() method should have also caused the @@ -1818,7 +1824,7 @@ EXPECT_CALL(observer_, OnChooserObjectPermissionChanged( CONTENT_SETTINGS_TYPE_USB_GUARD, CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA)); - EXPECT_CALL(observer_, OnPermissionRevoked(kAndroidOrigin, kAndroidOrigin)); + EXPECT_CALL(observer_, OnPermissionRevoked(kAndroidUrl, kAndroidUrl)); handler()->HandleResetChooserExceptionForSite(&args); // The HandleResetChooserExceptionForSite() method should have also caused the
diff --git a/chrome/browser/ui/webui/site_settings_helper_unittest.cc b/chrome/browser/ui/webui/site_settings_helper_unittest.cc index cc1285f..3eba406e 100644 --- a/chrome/browser/ui/webui/site_settings_helper_unittest.cc +++ b/chrome/browser/ui/webui/site_settings_helper_unittest.cc
@@ -235,9 +235,9 @@ namespace { // Test GURLs -const GURL kGoogleOrigin("https://google.com"); -const GURL kChromiumOrigin("https://chromium.org"); -const GURL kAndroidOrigin("https://android.com"); +const GURL kGoogleUrl("https://google.com"); +const GURL kChromiumUrl("https://chromium.org"); +const GURL kAndroidUrl("https://android.com"); void ExpectValidChooserExceptionObject( const base::Value& actual_exception_object, @@ -330,9 +330,8 @@ // Add a user permission for a requesting origin of |kGoogleOrigin| and an // embedding origin of |kChromiumOrigin|. - exception_details[std::make_pair(kGoogleOrigin.GetOrigin(), - kPreferenceSource)] - .insert(std::make_pair(kChromiumOrigin.GetOrigin(), /*incognito=*/false)); + exception_details[std::make_pair(kGoogleUrl.GetOrigin(), kPreferenceSource)] + .insert(std::make_pair(kChromiumUrl.GetOrigin(), /*incognito=*/false)); { auto exception = CreateChooserExceptionObject( @@ -346,17 +345,16 @@ const auto& sites_list = exception.FindKey(kSites)->GetList(); ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[0], - /*origin=*/kGoogleOrigin, - /*embedding_origin=*/kChromiumOrigin, + /*origin=*/kGoogleUrl, + /*embedding_origin=*/kChromiumUrl, /*source=*/kPreferenceSource, /*incognito=*/false); } // Add a user permissions for a requesting and embedding origin pair of // |kAndroidOrigin| granted in an off the record profile. - exception_details[std::make_pair(kAndroidOrigin.GetOrigin(), - kPreferenceSource)] - .insert(std::make_pair(kAndroidOrigin.GetOrigin(), /*incognito=*/true)); + exception_details[std::make_pair(kAndroidUrl.GetOrigin(), kPreferenceSource)] + .insert(std::make_pair(kAndroidUrl.GetOrigin(), /*incognito=*/true)); { auto exception = CreateChooserExceptionObject( @@ -373,20 +371,20 @@ // be first, followed by the origin pair (kGoogleOrigin, kChromiumOrigin). const auto& sites_list = exception.FindKey(kSites)->GetList(); ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[0], - /*origin=*/kAndroidOrigin, - /*embedding_origin=*/kAndroidOrigin, + /*origin=*/kAndroidUrl, + /*embedding_origin=*/kAndroidUrl, /*source=*/kPreferenceSource, /*incognito=*/true); ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[1], - /*origin=*/kGoogleOrigin, - /*embedding_origin=*/kChromiumOrigin, + /*origin=*/kGoogleUrl, + /*embedding_origin=*/kChromiumUrl, /*source=*/kPreferenceSource, /*incognito=*/false); } // Add a policy permission for a requesting origin of |kGoogleOrigin| with a // wildcard embedding origin. - exception_details[std::make_pair(kGoogleOrigin.GetOrigin(), kPolicySource)] + exception_details[std::make_pair(kGoogleUrl.GetOrigin(), kPolicySource)] .insert(std::make_pair(GURL::EmptyGURL(), /*incognito=*/false)); { auto exception = CreateChooserExceptionObject( @@ -405,18 +403,18 @@ // sites. const auto& sites_list = exception.FindKey(kSites)->GetList(); ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[0], - /*origin=*/kGoogleOrigin, + /*origin=*/kGoogleUrl, /*embedding_origin=*/GURL::EmptyGURL(), /*source=*/kPolicySource, /*incognito=*/false); ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[1], - /*origin=*/kAndroidOrigin, - /*embedding_origin=*/kAndroidOrigin, + /*origin=*/kAndroidUrl, + /*embedding_origin=*/kAndroidUrl, /*source=*/kPreferenceSource, /*incognito=*/true); ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[2], - /*origin=*/kGoogleOrigin, - /*embedding_origin=*/kChromiumOrigin, + /*origin=*/kGoogleUrl, + /*embedding_origin=*/kChromiumUrl, /*source=*/kPreferenceSource, /*incognito=*/false); } @@ -466,6 +464,10 @@ base::DoNothing::Once<std::vector<device::mojom::UsbDeviceInfoPtr>>()); base::RunLoop().RunUntilIdle(); + const auto kAndroidOrigin = url::Origin::Create(kAndroidUrl); + const auto kChromiumOrigin = url::Origin::Create(kChromiumUrl); + const auto kGoogleOrigin = url::Origin::Create(kGoogleUrl); + // Add the user granted permissions for testing. // These two persistent device permissions should be lumped together with // the policy permissions, since they apply to the same device and URL. @@ -536,8 +538,8 @@ const auto& sites_list = exception.FindKey(kSites)->GetList(); ASSERT_EQ(sites_list.size(), 1u); ExpectValidSiteExceptionObject(sites_list[0], - /*origin=*/kGoogleOrigin, - /*embedding_origin=*/kAndroidOrigin, + /*origin=*/kGoogleUrl, + /*embedding_origin=*/kAndroidUrl, /*source=*/kPolicySource, /*incognito=*/false); } @@ -554,8 +556,8 @@ const auto& sites_list = exception.FindKey(kSites)->GetList(); ASSERT_EQ(sites_list.size(), 1u); ExpectValidSiteExceptionObject(sites_list[0], - /*origin=*/kGoogleOrigin, - /*embedding_origin=*/kGoogleOrigin, + /*origin=*/kGoogleUrl, + /*embedding_origin=*/kGoogleUrl, /*source=*/kPolicySource, /*incognito=*/false); } @@ -573,7 +575,7 @@ const auto& sites_list = exception.FindKey(kSites)->GetList(); ASSERT_EQ(sites_list.size(), 1u); ExpectValidSiteExceptionObject(sites_list[0], - /*origin=*/kAndroidOrigin, + /*origin=*/kAndroidUrl, /*source=*/kPolicySource, /*incognito=*/false); } @@ -598,12 +600,12 @@ const auto& sites_list = exception.FindKey(kSites)->GetList(); ASSERT_EQ(sites_list.size(), 2u); ExpectValidSiteExceptionObject(sites_list[0], - /*origin=*/kChromiumOrigin, + /*origin=*/kChromiumUrl, /*source=*/kPolicySource, /*incognito=*/false); ExpectValidSiteExceptionObject(sites_list[1], - /*origin=*/kAndroidOrigin, - /*embedding_origin=*/kChromiumOrigin, + /*origin=*/kAndroidUrl, + /*embedding_origin=*/kChromiumUrl, /*source=*/kPreferenceSource, /*incognito=*/false); }
diff --git a/chrome/browser/unified_consent/unified_consent_browsertest.cc b/chrome/browser/unified_consent/unified_consent_browsertest.cc index 31cfa85..caa7078 100644 --- a/chrome/browser/unified_consent/unified_consent_browsertest.cc +++ b/chrome/browser/unified_consent/unified_consent_browsertest.cc
@@ -118,8 +118,9 @@ "UnifiedConsent.SyncAndGoogleServicesSettings", 1); } +// Flakes on all platforms. http://crbug.com/954167 IN_PROC_BROWSER_TEST_F(UnifiedConsentBrowserTest, - SettingsOptInTakeOverServicePrefChanges) { + DISABLED_SettingsOptInTakeOverServicePrefChanges) { std::string pref_A = prefs::kSearchSuggestEnabled; std::string pref_B = prefs::kAlternateErrorPagesEnabled;
diff --git a/chrome/browser/usb/usb_chooser_context.cc b/chrome/browser/usb/usb_chooser_context.cc index b1860dc..5abc9e3 100644 --- a/chrome/browser/usb/usb_chooser_context.cc +++ b/chrome/browser/usb/usb_chooser_context.cc
@@ -208,12 +208,14 @@ } std::vector<std::unique_ptr<ChooserContextBase::Object>> -UsbChooserContext::GetGrantedObjects(const GURL& requesting_origin, - const GURL& embedding_origin) { +UsbChooserContext::GetGrantedObjects(const GURL& requesting_origin_url, + const GURL& embedding_origin_url) { std::vector<std::unique_ptr<ChooserContextBase::Object>> objects = - ChooserContextBase::GetGrantedObjects(requesting_origin, - embedding_origin); + ChooserContextBase::GetGrantedObjects(requesting_origin_url, + embedding_origin_url); + const auto requesting_origin = url::Origin::Create(requesting_origin_url); + const auto embedding_origin = url::Origin::Create(embedding_origin_url); if (CanRequestObjectPermission(requesting_origin, embedding_origin)) { auto it = ephemeral_devices_.find( std::make_pair(requesting_origin, embedding_origin)); @@ -227,7 +229,7 @@ // class. DCHECK(base::ContainsKey(devices_, guid)); objects.push_back(std::make_unique<ChooserContextBase::Object>( - requesting_origin, embedding_origin, + requesting_origin_url, embedding_origin_url, DeviceInfoToValue(*devices_[guid]), content_settings::SettingSource::SETTING_SOURCE_USER, is_incognito_)); @@ -247,7 +249,7 @@ auto device_ids = GetDeviceIds(object); if (usb_policy_allowed_devices_->IsDeviceAllowed( - requesting_origin, embedding_origin, device_ids)) { + requesting_origin_url, embedding_origin_url, device_ids)) { device_ids_to_object_map[device_ids] = std::move(object); it = objects.erase(it); } else { @@ -262,13 +264,13 @@ for (const auto& url_pair : allowed_devices_entry.second) { // Skip entries that do not match the |requesting_origin|. - if (url_pair.first.GetOrigin() != requesting_origin.GetOrigin()) + if (url_pair.first.GetOrigin() != requesting_origin_url.GetOrigin()) continue; // Skip entries that have a non-empty embedding origin that does not match // the given |embedding_origin|. if (!url_pair.second.is_empty() && - url_pair.second.GetOrigin() != embedding_origin.GetOrigin()) { + url_pair.second.GetOrigin() != embedding_origin_url.GetOrigin()) { continue; } @@ -299,8 +301,8 @@ ChooserContextBase::GetAllGrantedObjects(); for (const auto& map_entry : ephemeral_devices_) { - const GURL& requesting_origin = map_entry.first.first; - const GURL& embedding_origin = map_entry.first.second; + const url::Origin& requesting_origin = map_entry.first.first; + const url::Origin& embedding_origin = map_entry.first.second; if (!CanRequestObjectPermission(requesting_origin, embedding_origin)) continue; @@ -308,7 +310,7 @@ for (const std::string& guid : map_entry.second) { DCHECK(base::ContainsKey(devices_, guid)); objects.push_back(std::make_unique<ChooserContextBase::Object>( - requesting_origin, embedding_origin, + requesting_origin.GetURL(), embedding_origin.GetURL(), DeviceInfoToValue(*devices_[guid]), content_settings::SETTING_SOURCE_USER, is_incognito_)); } @@ -376,7 +378,8 @@ } auto it = ephemeral_devices_.find( - std::make_pair(requesting_origin, embedding_origin)); + std::make_pair(url::Origin::Create(requesting_origin), + url::Origin::Create(embedding_origin))); if (it != ephemeral_devices_.end()) { it->second.erase(*guid); if (it->second.empty()) @@ -388,11 +391,11 @@ } void UsbChooserContext::GrantDevicePermission( - const GURL& requesting_origin, - const GURL& embedding_origin, + const url::Origin& requesting_origin, + const url::Origin& embedding_origin, const device::mojom::UsbDeviceInfo& device_info) { if (CanStorePersistentEntry(device_info)) { - GrantObjectPermission(requesting_origin, embedding_origin, + GrantObjectPermission(requesting_origin.GetURL(), embedding_origin.GetURL(), DeviceInfoToValue(device_info)); } else { ephemeral_devices_[std::make_pair(requesting_origin, embedding_origin)] @@ -402,14 +405,16 @@ } bool UsbChooserContext::HasDevicePermission( - const GURL& requesting_origin, - const GURL& embedding_origin, + const url::Origin& requesting_origin, + const url::Origin& embedding_origin, const device::mojom::UsbDeviceInfo& device_info) { if (UsbBlocklist::Get().IsExcluded(device_info)) return false; + const GURL requesting_origin_url = requesting_origin.GetURL(); + const GURL embedding_origin_url = embedding_origin.GetURL(); if (usb_policy_allowed_devices_->IsDeviceAllowed( - requesting_origin, embedding_origin, device_info)) { + requesting_origin_url, embedding_origin_url, device_info)) { return true; } @@ -424,7 +429,7 @@ } std::vector<std::unique_ptr<ChooserContextBase::Object>> object_list = - GetGrantedObjects(requesting_origin, embedding_origin); + GetGrantedObjects(requesting_origin_url, embedding_origin_url); for (const auto& object : object_list) { const base::Value& device = object->value; DCHECK(IsValidObject(device)); @@ -536,7 +541,7 @@ return; } - std::vector<std::pair<GURL, GURL>> revoked_url_pairs; + std::vector<std::pair<url::Origin, url::Origin>> revoked_url_pairs; for (auto& map_entry : ephemeral_devices_) { if (map_entry.second.erase(device_info->guid) > 0) revoked_url_pairs.push_back(map_entry.first); @@ -545,8 +550,10 @@ for (auto& observer : permission_observer_list_) { observer.OnChooserObjectPermissionChanged(guard_content_settings_type_, data_content_settings_type_); - for (auto& url_pair : revoked_url_pairs) - observer.OnPermissionRevoked(url_pair.first, url_pair.second); + for (auto& url_pair : revoked_url_pairs) { + observer.OnPermissionRevoked(url_pair.first.GetURL(), + url_pair.second.GetURL()); + } } } @@ -557,7 +564,7 @@ is_initialized_ = false; // Store the revoked URLs to notify observers of the revoked permissions. - std::vector<std::pair<GURL, GURL>> revoked_url_pairs; + std::vector<std::pair<url::Origin, url::Origin>> revoked_url_pairs; for (auto& map_entry : ephemeral_devices_) revoked_url_pairs.push_back(map_entry.first); ephemeral_devices_.clear(); @@ -570,8 +577,10 @@ for (auto& observer : permission_observer_list_) { observer.OnChooserObjectPermissionChanged(guard_content_settings_type_, data_content_settings_type_); - for (auto& url_pair : revoked_url_pairs) - observer.OnPermissionRevoked(url_pair.first, url_pair.second); + for (auto& url_pair : revoked_url_pairs) { + observer.OnPermissionRevoked(url_pair.first.GetURL(), + url_pair.second.GetURL()); + } } }
diff --git a/chrome/browser/usb/usb_chooser_context.h b/chrome/browser/usb/usb_chooser_context.h index 9bd6f159..d7d5f09 100644 --- a/chrome/browser/usb/usb_chooser_context.h +++ b/chrome/browser/usb/usb_chooser_context.h
@@ -21,6 +21,7 @@ #include "device/usb/public/mojom/device_manager.mojom.h" #include "device/usb/public/mojom/device_manager_client.mojom.h" #include "mojo/public/cpp/bindings/associated_binding.h" +#include "url/origin.h" class UsbChooserContext : public ChooserContextBase, public device::mojom::UsbDeviceManagerClient { @@ -52,14 +53,14 @@ const base::Value& object) override; // Grants |requesting_origin| access to the USB device. - void GrantDevicePermission(const GURL& requesting_origin, - const GURL& embedding_origin, + void GrantDevicePermission(const url::Origin& requesting_origin, + const url::Origin& embedding_origin, const device::mojom::UsbDeviceInfo& device_info); // Checks if |requesting_origin| (when embedded within |embedding_origin| has // access to a device with |device_info|. - bool HasDevicePermission(const GURL& requesting_origin, - const GURL& embedding_origin, + bool HasDevicePermission(const url::Origin& requesting_origin, + const url::Origin& embedding_origin, const device::mojom::UsbDeviceInfo& device_info); void AddObserver(DeviceObserver* observer); @@ -101,7 +102,8 @@ base::queue<device::mojom::UsbDeviceManager::GetDevicesCallback> pending_get_devices_requests_; - std::map<std::pair<GURL, GURL>, std::set<std::string>> ephemeral_devices_; + std::map<std::pair<url::Origin, url::Origin>, std::set<std::string>> + ephemeral_devices_; std::map<std::string, device::mojom::UsbDeviceInfoPtr> devices_; std::unique_ptr<UsbPolicyAllowedDevices> usb_policy_allowed_devices_;
diff --git a/chrome/browser/usb/usb_chooser_context_unittest.cc b/chrome/browser/usb/usb_chooser_context_unittest.cc index 5bc10e1..614a46c 100644 --- a/chrome/browser/usb/usb_chooser_context_unittest.cc +++ b/chrome/browser/usb/usb_chooser_context_unittest.cc
@@ -90,7 +90,8 @@ } // namespace TEST_F(UsbChooserContextTest, CheckGrantAndRevokePermission) { - GURL origin("https://www.google.com"); + GURL url("https://www.google.com"); + const auto origin = url::Origin::Create(url); UsbDeviceInfoPtr device_info = device_manager_.CreateAndAddDevice(0, 0, "Google", "Gizmo", "123ABC"); UsbChooserContext* store = GetChooserContext(profile()); @@ -110,15 +111,15 @@ store->GrantDevicePermission(origin, origin, *device_info); EXPECT_TRUE(store->HasDevicePermission(origin, origin, *device_info)); std::vector<std::unique_ptr<ChooserContextBase::Object>> objects = - store->GetGrantedObjects(origin, origin); + store->GetGrantedObjects(url, url); ASSERT_EQ(1u, objects.size()); EXPECT_EQ(object, objects[0]->value); std::vector<std::unique_ptr<ChooserContextBase::Object>> all_origin_objects = store->GetAllGrantedObjects(); ASSERT_EQ(1u, all_origin_objects.size()); - EXPECT_EQ(origin, all_origin_objects[0]->requesting_origin); - EXPECT_EQ(origin, all_origin_objects[0]->embedding_origin); + EXPECT_EQ(url, all_origin_objects[0]->requesting_origin); + EXPECT_EQ(url, all_origin_objects[0]->embedding_origin); EXPECT_EQ(object, all_origin_objects[0]->value); EXPECT_FALSE(all_origin_objects[0]->incognito); @@ -126,12 +127,12 @@ mock_permission_observer_, OnChooserObjectPermissionChanged(CONTENT_SETTINGS_TYPE_USB_GUARD, CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA)); - EXPECT_CALL(mock_permission_observer_, OnPermissionRevoked(origin, origin)); + EXPECT_CALL(mock_permission_observer_, OnPermissionRevoked(url, url)); - store->RevokeObjectPermission(origin, origin, objects[0]->value); + store->RevokeObjectPermission(url, url, objects[0]->value); EXPECT_FALSE(store->HasDevicePermission(origin, origin, *device_info)); - objects = store->GetGrantedObjects(origin, origin); + objects = store->GetGrantedObjects(url, url); EXPECT_EQ(0u, objects.size()); all_origin_objects = store->GetAllGrantedObjects(); @@ -139,7 +140,8 @@ } TEST_F(UsbChooserContextTest, CheckGrantAndRevokeEphemeralPermission) { - GURL origin("https://www.google.com"); + GURL url("https://www.google.com"); + const auto origin = url::Origin::Create(url); UsbDeviceInfoPtr device_info = device_manager_.CreateAndAddDevice(0, 0, "Google", "Gizmo", ""); UsbDeviceInfoPtr other_device_info = @@ -164,15 +166,15 @@ EXPECT_FALSE(store->HasDevicePermission(origin, origin, *other_device_info)); std::vector<std::unique_ptr<ChooserContextBase::Object>> objects = - store->GetGrantedObjects(origin, origin); + store->GetGrantedObjects(url, url); EXPECT_EQ(1u, objects.size()); EXPECT_EQ(object, objects[0]->value); std::vector<std::unique_ptr<ChooserContextBase::Object>> all_origin_objects = store->GetAllGrantedObjects(); EXPECT_EQ(1u, all_origin_objects.size()); - EXPECT_EQ(origin, all_origin_objects[0]->requesting_origin); - EXPECT_EQ(origin, all_origin_objects[0]->embedding_origin); + EXPECT_EQ(url, all_origin_objects[0]->requesting_origin); + EXPECT_EQ(url, all_origin_objects[0]->embedding_origin); EXPECT_EQ(object, all_origin_objects[0]->value); EXPECT_FALSE(all_origin_objects[0]->incognito); @@ -180,19 +182,20 @@ mock_permission_observer_, OnChooserObjectPermissionChanged(CONTENT_SETTINGS_TYPE_USB_GUARD, CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA)); - EXPECT_CALL(mock_permission_observer_, OnPermissionRevoked(origin, origin)); + EXPECT_CALL(mock_permission_observer_, OnPermissionRevoked(url, url)); - store->RevokeObjectPermission(origin, origin, objects[0]->value); + store->RevokeObjectPermission(url, url, objects[0]->value); EXPECT_FALSE(store->HasDevicePermission(origin, origin, *device_info)); - objects = store->GetGrantedObjects(origin, origin); + objects = store->GetGrantedObjects(url, url); EXPECT_EQ(0u, objects.size()); all_origin_objects = store->GetAllGrantedObjects(); EXPECT_EQ(0u, all_origin_objects.size()); } TEST_F(UsbChooserContextTest, DisconnectDeviceWithPermission) { - GURL origin("https://www.google.com"); + GURL url("https://www.google.com"); + const auto origin = url::Origin::Create(url); UsbDeviceInfoPtr device_info = device_manager_.CreateAndAddDevice(0, 0, "Google", "Gizmo", "123ABC"); @@ -208,7 +211,7 @@ EXPECT_TRUE(store->HasDevicePermission(origin, origin, *device_info)); std::vector<std::unique_ptr<ChooserContextBase::Object>> objects = - store->GetGrantedObjects(origin, origin); + store->GetGrantedObjects(url, url); EXPECT_EQ(1u, objects.size()); std::vector<std::unique_ptr<ChooserContextBase::Object>> all_origin_objects = @@ -220,7 +223,7 @@ base::RunLoop().RunUntilIdle(); EXPECT_TRUE(store->HasDevicePermission(origin, origin, *device_info)); - objects = store->GetGrantedObjects(origin, origin); + objects = store->GetGrantedObjects(url, url); EXPECT_EQ(1u, objects.size()); all_origin_objects = store->GetAllGrantedObjects(); EXPECT_EQ(1u, all_origin_objects.size()); @@ -230,14 +233,15 @@ EXPECT_TRUE( store->HasDevicePermission(origin, origin, *reconnected_device_info)); - objects = store->GetGrantedObjects(origin, origin); + objects = store->GetGrantedObjects(url, url); EXPECT_EQ(1u, objects.size()); all_origin_objects = store->GetAllGrantedObjects(); EXPECT_EQ(1u, all_origin_objects.size()); } TEST_F(UsbChooserContextTest, DisconnectDeviceWithEphemeralPermission) { - GURL origin("https://www.google.com"); + GURL url("https://www.google.com"); + const auto origin = url::Origin::Create(url); UsbDeviceInfoPtr device_info = device_manager_.CreateAndAddDevice(0, 0, "Google", "Gizmo", ""); @@ -253,7 +257,7 @@ EXPECT_TRUE(store->HasDevicePermission(origin, origin, *device_info)); std::vector<std::unique_ptr<ChooserContextBase::Object>> objects = - store->GetGrantedObjects(origin, origin); + store->GetGrantedObjects(url, url); EXPECT_EQ(1u, objects.size()); std::vector<std::unique_ptr<ChooserContextBase::Object>> all_origin_objects = @@ -269,7 +273,7 @@ base::RunLoop().RunUntilIdle(); EXPECT_FALSE(store->HasDevicePermission(origin, origin, *device_info)); - objects = store->GetGrantedObjects(origin, origin); + objects = store->GetGrantedObjects(url, url); EXPECT_EQ(0u, objects.size()); all_origin_objects = store->GetAllGrantedObjects(); EXPECT_EQ(0u, all_origin_objects.size()); @@ -279,14 +283,15 @@ EXPECT_FALSE( store->HasDevicePermission(origin, origin, *reconnected_device_info)); - objects = store->GetGrantedObjects(origin, origin); + objects = store->GetGrantedObjects(url, url); EXPECT_EQ(0u, objects.size()); all_origin_objects = store->GetAllGrantedObjects(); EXPECT_EQ(0u, all_origin_objects.size()); } TEST_F(UsbChooserContextTest, GrantPermissionInIncognito) { - GURL origin("https://www.google.com"); + GURL url("https://www.google.com"); + const auto origin = url::Origin::Create(url); UsbDeviceInfoPtr device_info_1 = device_manager_.CreateAndAddDevice(0, 0, "Google", "Gizmo", ""); UsbDeviceInfoPtr device_info_2 = @@ -320,7 +325,7 @@ { std::vector<std::unique_ptr<ChooserContextBase::Object>> objects = - store->GetGrantedObjects(origin, origin); + store->GetGrantedObjects(url, url); EXPECT_EQ(1u, objects.size()); std::vector<std::unique_ptr<ChooserContextBase::Object>> all_origin_objects = store->GetAllGrantedObjects(); @@ -329,7 +334,7 @@ } { std::vector<std::unique_ptr<ChooserContextBase::Object>> objects = - incognito_store->GetGrantedObjects(origin, origin); + incognito_store->GetGrantedObjects(url, url); EXPECT_EQ(1u, objects.size()); std::vector<std::unique_ptr<ChooserContextBase::Object>> all_origin_objects = incognito_store->GetAllGrantedObjects(); @@ -339,15 +344,17 @@ } TEST_F(UsbChooserContextTest, UsbGuardPermission) { - const GURL kFooOrigin("https://foo.com"); - const GURL kBarOrigin("https://bar.com"); + const GURL kFooUrl("https://foo.com"); + const auto kFooOrigin = url::Origin::Create(kFooUrl); + const GURL kBarUrl("https://bar.com"); + const auto kBarOrigin = url::Origin::Create(kBarUrl); UsbDeviceInfoPtr device_info = device_manager_.CreateAndAddDevice(0, 0, "Google", "Gizmo", "ABC123"); UsbDeviceInfoPtr ephemeral_device_info = device_manager_.CreateAndAddDevice(0, 0, "Google", "Gizmo", ""); auto* map = HostContentSettingsMapFactory::GetForProfile(profile()); - map->SetContentSettingDefaultScope(kFooOrigin, kFooOrigin, + map->SetContentSettingDefaultScope(kFooUrl, kFooUrl, CONTENT_SETTINGS_TYPE_USB_GUARD, std::string(), CONTENT_SETTING_BLOCK); @@ -363,17 +370,17 @@ store->GrantDevicePermission(kBarOrigin, kBarOrigin, *ephemeral_device_info); std::vector<std::unique_ptr<ChooserContextBase::Object>> objects = - store->GetGrantedObjects(kFooOrigin, kFooOrigin); + store->GetGrantedObjects(kFooUrl, kFooUrl); EXPECT_EQ(0u, objects.size()); - objects = store->GetGrantedObjects(kBarOrigin, kBarOrigin); + objects = store->GetGrantedObjects(kBarUrl, kBarUrl); EXPECT_EQ(2u, objects.size()); std::vector<std::unique_ptr<ChooserContextBase::Object>> all_origin_objects = store->GetAllGrantedObjects(); for (const auto& object : all_origin_objects) { - EXPECT_EQ(object->requesting_origin, kBarOrigin); - EXPECT_EQ(object->embedding_origin, kBarOrigin); + EXPECT_EQ(object->requesting_origin, kBarUrl); + EXPECT_EQ(object->embedding_origin, kBarUrl); } EXPECT_EQ(2u, all_origin_objects.size()); @@ -387,7 +394,8 @@ } TEST_F(UsbChooserContextTest, GetObjectNameForNamelessDevice) { - const GURL kGoogleOrigin("https://google.com"); + const GURL kGoogleUrl("https://www.google.com"); + const auto kGoogleOrigin = url::Origin::Create(kGoogleUrl); UsbDeviceInfoPtr device_info = device_manager_.CreateAndAddDevice(6353, 5678, "", "", ""); @@ -402,6 +410,13 @@ namespace { +// Test URLs +const GURL kAnyDeviceUrl("https://anydevice.com"); +const GURL kVendorUrl("https://vendor.com"); +const GURL kProductVendorUrl("https://product.vendor.com"); +const GURL kGadgetUrl("https://gadget.com"); +const GURL kCoolUrl("https://cool.com"); + constexpr char kPolicySetting[] = R"( [ { @@ -419,17 +434,17 @@ } ])"; -const GURL kPolicyOrigins[] = { - GURL("https://product.vendor.com"), GURL("https://vendor.com"), - GURL("https://anydevice.com"), GURL("https://gadget.com"), - GURL("https://cool.com")}; +const GURL kPolicyOrigins[] = {kProductVendorUrl, kVendorUrl, kAnyDeviceUrl, + kGadgetUrl, kCoolUrl}; void ExpectNoPermissions(UsbChooserContext* store, const device::mojom::UsbDeviceInfo& device_info) { - for (const auto& kRequestingOrigin : kPolicyOrigins) { - for (const auto& kEmbeddingOrigin : kPolicyOrigins) { - EXPECT_FALSE(store->HasDevicePermission(kRequestingOrigin, - kEmbeddingOrigin, device_info)); + for (const auto& requesting_origin_url : kPolicyOrigins) { + const auto requesting_origin = url::Origin::Create(requesting_origin_url); + for (const auto& embedding_origin : kPolicyOrigins) { + EXPECT_FALSE(store->HasDevicePermission( + requesting_origin, url::Origin::Create(embedding_origin), + device_info)); } } } @@ -441,15 +456,18 @@ const device::mojom::UsbDeviceInfo& device_info) { // Ensure that only |kValidRequestingOrigin| as the requesting origin has // permission to access the device described by |device_info|. - for (const auto& kEmbeddingOrigin : kPolicyOrigins) { - for (const auto& kValidRequestingOrigin : kValidRequestingOrigins) { - EXPECT_TRUE(store->HasDevicePermission(kValidRequestingOrigin, - kEmbeddingOrigin, device_info)); + for (const auto& embedding_origin_url : kPolicyOrigins) { + const auto embedding_origin = url::Origin::Create(embedding_origin_url); + for (const auto& valid_requesting_origin : kValidRequestingOrigins) { + EXPECT_TRUE(store->HasDevicePermission( + url::Origin::Create(valid_requesting_origin), embedding_origin, + device_info)); } - for (const auto& kInvalidRequestingOrigin : kInvalidRequestingOrigins) { - EXPECT_FALSE(store->HasDevicePermission(kInvalidRequestingOrigin, - kEmbeddingOrigin, device_info)); + for (const auto& invalid_requesting_origin : kInvalidRequestingOrigins) { + EXPECT_FALSE(store->HasDevicePermission( + url::Origin::Create(invalid_requesting_origin), embedding_origin, + device_info)); } } } @@ -458,11 +476,9 @@ TEST_F(UsbChooserContextTest, UsbAllowDevicesForUrlsPermissionForSpecificDevice) { - const std::vector<GURL> kValidRequestingOrigins = { - GURL("https://product.vendor.com"), GURL("https://vendor.com"), - GURL("https://anydevice.com")}; - const std::vector<GURL> kInvalidRequestingOrigins = { - GURL("https://gadget.com"), GURL("https://cool.com")}; + const std::vector<GURL> kValidRequestingOrigins = {kProductVendorUrl, + kVendorUrl, kAnyDeviceUrl}; + const std::vector<GURL> kInvalidRequestingOrigins = {kGadgetUrl, kCoolUrl}; UsbDeviceInfoPtr specific_device_info = device_manager_.CreateAndAddDevice( 6353, 5678, "Google", "Gizmo", "ABC123"); @@ -480,11 +496,9 @@ TEST_F(UsbChooserContextTest, UsbAllowDevicesForUrlsPermissionForVendorRelatedDevice) { - const std::vector<GURL> kValidRequestingOrigins = { - GURL("https://vendor.com"), GURL("https://anydevice.com")}; - const std::vector<GURL> kInvalidRequestingOrigins = { - GURL("https://product.vendor.com"), GURL("https://gadget.com"), - GURL("https://cool.com")}; + const std::vector<GURL> kValidRequestingOrigins = {kVendorUrl, kAnyDeviceUrl}; + const std::vector<GURL> kInvalidRequestingOrigins = {kProductVendorUrl, + kGadgetUrl, kCoolUrl}; UsbDeviceInfoPtr vendor_related_device_info = device_manager_.CreateAndAddDevice(6353, 8765, "Google", "Widget", @@ -504,13 +518,11 @@ TEST_F(UsbChooserContextTest, UsbAllowDevicesForUrlsPermissionForUnrelatedDevice) { - const std::vector<GURL> kValidRequestingOrigins = { - GURL("https://anydevice.com")}; - const std::vector<GURL> kInvalidRequestingOrigins = { - GURL("https://product.vendor.com"), GURL("https://vendor.com"), - GURL("https://cool.com")}; - const GURL kGadgetOrigin("https://gadget.com"); - const GURL& kCoolOrigin = kInvalidRequestingOrigins[2]; + const std::vector<GURL> kValidRequestingOrigins = {kAnyDeviceUrl}; + const std::vector<GURL> kInvalidRequestingOrigins = {kProductVendorUrl, + kVendorUrl, kCoolUrl}; + const auto kGadgetOrigin = url::Origin::Create(kGadgetUrl); + const auto kCoolOrigin = url::Origin::Create(kInvalidRequestingOrigins[2]); UsbDeviceInfoPtr unrelated_device_info = device_manager_.CreateAndAddDevice( 6354, 1357, "Cool", "Gadget", "4W350M3"); @@ -524,9 +536,10 @@ EXPECT_TRUE(store->HasDevicePermission(kGadgetOrigin, kCoolOrigin, *unrelated_device_info)); - for (const auto& kEmbeddingOrigin : kPolicyOrigins) { - if (kEmbeddingOrigin != kCoolOrigin) { - EXPECT_FALSE(store->HasDevicePermission(kGadgetOrigin, kEmbeddingOrigin, + for (const auto& embedding_origin_url : kPolicyOrigins) { + const auto embedding_origin = url::Origin::Create(embedding_origin_url); + if (embedding_origin != kCoolOrigin) { + EXPECT_FALSE(store->HasDevicePermission(kGadgetOrigin, embedding_origin, *unrelated_device_info)); } } @@ -536,9 +549,9 @@ TEST_F(UsbChooserContextTest, UsbAllowDevicesForUrlsPermissionOverrulesUsbGuardPermission) { - const GURL kProductVendorOrigin("https://product.vendor.com"); - const GURL kGadgetOrigin("https://gadget.com"); - const GURL kCoolOrigin("https://cool.com"); + const auto kProductVendorOrigin = url::Origin::Create(kProductVendorUrl); + const auto kGadgetOrigin = url::Origin::Create(kGadgetUrl); + const auto kCoolOrigin = url::Origin::Create(kCoolUrl); UsbDeviceInfoPtr specific_device_info = device_manager_.CreateAndAddDevice( 6353, 5678, "Google", "Gizmo", "ABC123"); @@ -551,10 +564,10 @@ ExpectNoPermissions(store, *unrelated_device_info); auto* map = HostContentSettingsMapFactory::GetForProfile(profile()); - map->SetContentSettingDefaultScope(kProductVendorOrigin, kProductVendorOrigin, + map->SetContentSettingDefaultScope(kProductVendorUrl, kProductVendorUrl, CONTENT_SETTINGS_TYPE_USB_GUARD, std::string(), CONTENT_SETTING_BLOCK); - map->SetContentSettingDefaultScope(kGadgetOrigin, kCoolOrigin, + map->SetContentSettingDefaultScope(kGadgetUrl, kCoolUrl, CONTENT_SETTINGS_TYPE_USB_GUARD, std::string(), CONTENT_SETTING_BLOCK); EXPECT_FALSE(store->HasDevicePermission( @@ -581,13 +594,6 @@ namespace { -// Test URLs -const GURL kAnyDeviceOrigin("https://anydevice.com"); -const GURL kVendorOrigin("https://vendor.com"); -const GURL kProductVendorOrigin("https://product.vendor.com"); -const GURL kGadgetOrigin("https://gadget.com"); -const GURL kCoolOrigin("https://cool.com"); - void ExpectDeviceObjectInfo(const base::Value& actual, int vendor_id, int product_id, @@ -640,11 +646,11 @@ profile()->GetPrefs()->Set(prefs::kManagedWebUsbAllowDevicesForUrls, *base::JSONReader::ReadDeprecated(kPolicySetting)); - auto objects = store->GetGrantedObjects(kVendorOrigin, kVendorOrigin); + auto objects = store->GetGrantedObjects(kVendorUrl, kVendorUrl); ASSERT_EQ(objects.size(), 1u); ExpectChooserObjectInfo(objects[0].get(), - /*requesting_origin=*/kVendorOrigin, + /*requesting_origin=*/kVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, @@ -664,12 +670,13 @@ auto* store = GetChooserContext(profile()); + const auto kVendorOrigin = url::Origin::Create(kVendorUrl); store->GrantDevicePermission(kVendorOrigin, kVendorOrigin, *persistent_device_info); store->GrantDevicePermission(kVendorOrigin, kVendorOrigin, *ephemeral_device_info); - auto objects = store->GetGrantedObjects(kVendorOrigin, kVendorOrigin); + auto objects = store->GetGrantedObjects(kVendorUrl, kVendorUrl); ASSERT_EQ(objects.size(), 3u); // The user granted permissions appear before the policy granted permissions. @@ -679,23 +686,23 @@ // (vendor_id, product_id) representing the device IDs. Wildcard IDs are // represented by a value of -1, so they appear first. ExpectChooserObjectInfo(objects[0].get(), - /*requesting_origin=*/kVendorOrigin, - /*embedding_origin=*/kVendorOrigin, + /*requesting_origin=*/kVendorUrl, + /*embedding_origin=*/kVendorUrl, /*source=*/content_settings::SETTING_SOURCE_USER, /*incognito=*/false, /*vendor_id=*/1000, /*product_id=*/1, /*name=*/"Gizmo"); ExpectChooserObjectInfo(objects[1].get(), - /*requesting_origin=*/kVendorOrigin, - /*embedding_origin=*/kVendorOrigin, + /*requesting_origin=*/kVendorUrl, + /*embedding_origin=*/kVendorUrl, /*source=*/content_settings::SETTING_SOURCE_USER, /*incognito=*/false, /*vendor_id=*/1000, /*product_id=*/2, /*name=*/"Gadget"); ExpectChooserObjectInfo(objects[2].get(), - /*requesting_origin=*/kVendorOrigin, + /*requesting_origin=*/kVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, @@ -712,19 +719,18 @@ 6353, 5678, "Google", "Gizmo", "123ABC"); auto* store = GetChooserContext(profile()); - + const auto kProductVendorOrigin = url::Origin::Create(kProductVendorUrl); store->GrantDevicePermission(kProductVendorOrigin, kProductVendorOrigin, *persistent_device_info); - auto objects = - store->GetGrantedObjects(kProductVendorOrigin, kProductVendorOrigin); + auto objects = store->GetGrantedObjects(kProductVendorUrl, kProductVendorUrl); ASSERT_EQ(objects.size(), 1u); // User granted permissions for a device that is also granted by a specific // device policy will be replaced by the policy permission. The object should // still retain the name of the device. ExpectChooserObjectInfo(objects[0].get(), - /*requesting_origin=*/kProductVendorOrigin, + /*requesting_origin=*/kProductVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, @@ -741,16 +747,17 @@ profile()->GetPrefs()->Set(prefs::kManagedWebUsbAllowDevicesForUrls, *base::JSONReader::ReadDeprecated(kPolicySetting)); + const auto kVendorOrigin = url::Origin::Create(kVendorUrl); store->GrantDevicePermission(kVendorOrigin, kVendorOrigin, *persistent_device_info); - auto objects = store->GetGrantedObjects(kVendorOrigin, kVendorOrigin); + auto objects = store->GetGrantedObjects(kVendorUrl, kVendorUrl); ASSERT_EQ(objects.size(), 1u); // User granted permissions for a device that is also granted by a vendor // device policy will be replaced by the policy permission. ExpectChooserObjectInfo(objects[0].get(), - /*requesting_origin=*/kVendorOrigin, + /*requesting_origin=*/kVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, @@ -767,16 +774,17 @@ profile()->GetPrefs()->Set(prefs::kManagedWebUsbAllowDevicesForUrls, *base::JSONReader::ReadDeprecated(kPolicySetting)); + const auto kAnyDeviceOrigin = url::Origin::Create(kAnyDeviceUrl); store->GrantDevicePermission(kAnyDeviceOrigin, kAnyDeviceOrigin, *persistent_device_info); - auto objects = store->GetGrantedObjects(kAnyDeviceOrigin, kAnyDeviceOrigin); + auto objects = store->GetGrantedObjects(kAnyDeviceUrl, kAnyDeviceUrl); ASSERT_EQ(objects.size(), 1u); // User granted permissions for a device that is also granted by a wildcard // vendor policy will be replaced by the policy permission. ExpectChooserObjectInfo(objects[0].get(), - /*requesting_origin=*/kAnyDeviceOrigin, + /*requesting_origin=*/kAnyDeviceUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/kDeviceIdWildcard, @@ -797,29 +805,29 @@ // ordered by the tuple (vendor_id, product_id) representing the device IDs. // Wildcard IDs are represented by a value of -1, so they appear first. ExpectChooserObjectInfo(objects[0].get(), - /*requesting_origin=*/kAnyDeviceOrigin, + /*requesting_origin=*/kAnyDeviceUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/kDeviceIdWildcard, /*product_id=*/kDeviceIdWildcard, /*name=*/"Devices from any vendor"); ExpectChooserObjectInfo(objects[1].get(), - /*requesting_origin=*/kVendorOrigin, + /*requesting_origin=*/kVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, /*product_id=*/kDeviceIdWildcard, /*name=*/"Devices from Google Inc."); ExpectChooserObjectInfo(objects[2].get(), - /*requesting_origin=*/kProductVendorOrigin, + /*requesting_origin=*/kProductVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, /*product_id=*/5678, /*name=*/"Unknown product 0x162E from Google Inc."); ExpectChooserObjectInfo(objects[3].get(), - /*requesting_origin=*/kGadgetOrigin, - /*embedding_origin=*/kCoolOrigin, + /*requesting_origin=*/kGadgetUrl, + /*embedding_origin=*/kCoolUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6354, @@ -832,7 +840,8 @@ profile()->GetPrefs()->Set(prefs::kManagedWebUsbAllowDevicesForUrls, *base::JSONReader::ReadDeprecated(kPolicySetting)); - const GURL kGoogleOrigin("https://www.google.com"); + const GURL kGoogleUrl("https://www.google.com"); + const auto kGoogleOrigin = url::Origin::Create(kGoogleUrl); UsbDeviceInfoPtr persistent_device_info = device_manager_.CreateAndAddDevice(1000, 1, "Google", "Gizmo", "123ABC"); UsbDeviceInfoPtr ephemeral_device_info = @@ -861,45 +870,45 @@ // Within the user granted permissions, the persistent device permissions // are added to the vector before ephemeral device permissions. ExpectChooserObjectInfo(objects[0].get(), - /*requesting_origin=*/kGoogleOrigin, - /*embedding_origin=*/kGoogleOrigin, + /*requesting_origin=*/kGoogleUrl, + /*embedding_origin=*/kGoogleUrl, /*source=*/content_settings::SETTING_SOURCE_USER, /*incognito=*/false, /*vendor_id=*/1000, /*product_id=*/1, /*name=*/"Gizmo"); ExpectChooserObjectInfo(objects[1].get(), - /*requesting_origin=*/kGoogleOrigin, - /*embedding_origin=*/kGoogleOrigin, + /*requesting_origin=*/kGoogleUrl, + /*embedding_origin=*/kGoogleUrl, /*source=*/content_settings::SETTING_SOURCE_USER, /*incognito=*/false, /*vendor_id=*/1000, /*product_id=*/2, /*name=*/"Gadget"); ExpectChooserObjectInfo(objects[2].get(), - /*requesting_origin=*/kAnyDeviceOrigin, + /*requesting_origin=*/kAnyDeviceUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/kDeviceIdWildcard, /*product_id=*/kDeviceIdWildcard, /*name=*/"Devices from any vendor"); ExpectChooserObjectInfo(objects[3].get(), - /*requesting_origin=*/kVendorOrigin, + /*requesting_origin=*/kVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, /*product_id=*/kDeviceIdWildcard, /*name=*/"Devices from Google Inc."); ExpectChooserObjectInfo(objects[4].get(), - /*requesting_origin=*/kProductVendorOrigin, + /*requesting_origin=*/kProductVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, /*product_id=*/5678, /*name=*/"Unknown product 0x162E from Google Inc."); ExpectChooserObjectInfo(objects[5].get(), - /*requesting_origin=*/kGadgetOrigin, - /*embedding_origin=*/kCoolOrigin, + /*requesting_origin=*/kGadgetUrl, + /*embedding_origin=*/kCoolUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6354, @@ -913,7 +922,6 @@ profile()->GetPrefs()->Set(prefs::kManagedWebUsbAllowDevicesForUrls, *base::JSONReader::ReadDeprecated(kPolicySetting)); - const GURL kProductVendorOrigin("https://product.vendor.com"); UsbDeviceInfoPtr persistent_device_info = device_manager_.CreateAndAddDevice( 6353, 5678, "Specific", "Product", "123ABC"); @@ -921,6 +929,7 @@ mock_permission_observer_, OnChooserObjectPermissionChanged(CONTENT_SETTINGS_TYPE_USB_GUARD, CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA)); + const auto kProductVendorOrigin = url::Origin::Create(kProductVendorUrl); store->GrantDevicePermission(kProductVendorOrigin, kProductVendorOrigin, *persistent_device_info); @@ -932,29 +941,29 @@ } ExpectChooserObjectInfo(objects[0].get(), - /*requesting_origin=*/kAnyDeviceOrigin, + /*requesting_origin=*/kAnyDeviceUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/kDeviceIdWildcard, /*product_id=*/kDeviceIdWildcard, /*name=*/"Devices from any vendor"); ExpectChooserObjectInfo(objects[1].get(), - /*requesting_origin=*/kVendorOrigin, + /*requesting_origin=*/kVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, /*product_id=*/kDeviceIdWildcard, /*name=*/"Devices from Google Inc."); ExpectChooserObjectInfo(objects[2].get(), - /*requesting_origin=*/kProductVendorOrigin, + /*requesting_origin=*/kProductVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, /*product_id=*/5678, /*name=*/"Product"); ExpectChooserObjectInfo(objects[3].get(), - /*requesting_origin=*/kGadgetOrigin, - /*embedding_origin=*/kCoolOrigin, + /*requesting_origin=*/kGadgetUrl, + /*embedding_origin=*/kCoolUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6354, @@ -967,7 +976,6 @@ TEST_F(UsbChooserContextTest, GetAllGrantedObjectsWithVendorPolicyAndUserGrantedDevice) { - const GURL kVendorOrigin("https://vendor.com"); UsbDeviceInfoPtr persistent_device_info = device_manager_.CreateAndAddDevice( 6353, 1000, "Vendor", "Product", "123ABC"); @@ -979,6 +987,7 @@ mock_permission_observer_, OnChooserObjectPermissionChanged(CONTENT_SETTINGS_TYPE_USB_GUARD, CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA)); + const auto kVendorOrigin = url::Origin::Create(kVendorUrl); store->GrantDevicePermission(kVendorOrigin, kVendorOrigin, *persistent_device_info); @@ -990,29 +999,29 @@ } ExpectChooserObjectInfo(objects[0].get(), - /*requesting_origin=*/kAnyDeviceOrigin, + /*requesting_origin=*/kAnyDeviceUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/kDeviceIdWildcard, /*product_id=*/kDeviceIdWildcard, /*name=*/"Devices from any vendor"); ExpectChooserObjectInfo(objects[1].get(), - /*requesting_origin=*/kVendorOrigin, + /*requesting_origin=*/kVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, /*product_id=*/kDeviceIdWildcard, /*name=*/"Devices from Google Inc."); ExpectChooserObjectInfo(objects[2].get(), - /*requesting_origin=*/kProductVendorOrigin, + /*requesting_origin=*/kProductVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, /*product_id=*/5678, /*name=*/"Unknown product 0x162E from Google Inc."); ExpectChooserObjectInfo(objects[3].get(), - /*requesting_origin=*/kGadgetOrigin, - /*embedding_origin=*/kCoolOrigin, + /*requesting_origin=*/kGadgetUrl, + /*embedding_origin=*/kCoolUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6354, @@ -1022,7 +1031,6 @@ TEST_F(UsbChooserContextTest, GetAllGrantedObjectsWithAnyPolicyAndUserGrantedDevice) { - const GURL kAnyDeviceOrigin("https://anydevice.com"); UsbDeviceInfoPtr persistent_device_info = device_manager_.CreateAndAddDevice( 1123, 5813, "Some", "Product", "123ABC"); @@ -1034,6 +1042,7 @@ mock_permission_observer_, OnChooserObjectPermissionChanged(CONTENT_SETTINGS_TYPE_USB_GUARD, CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA)); + const auto kAnyDeviceOrigin = url::Origin::Create(kAnyDeviceUrl); store->GrantDevicePermission(kAnyDeviceOrigin, kAnyDeviceOrigin, *persistent_device_info); @@ -1045,29 +1054,29 @@ } ExpectChooserObjectInfo(objects[0].get(), - /*requesting_origin=*/kAnyDeviceOrigin, + /*requesting_origin=*/kAnyDeviceUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/kDeviceIdWildcard, /*product_id=*/kDeviceIdWildcard, /*name=*/"Devices from any vendor"); ExpectChooserObjectInfo(objects[1].get(), - /*requesting_origin=*/kVendorOrigin, + /*requesting_origin=*/kVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, /*product_id=*/kDeviceIdWildcard, /*name=*/"Devices from Google Inc."); ExpectChooserObjectInfo(objects[2].get(), - /*requesting_origin=*/kProductVendorOrigin, + /*requesting_origin=*/kProductVendorUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6353, /*product_id=*/5678, /*name=*/"Unknown product 0x162E from Google Inc."); ExpectChooserObjectInfo(objects[3].get(), - /*requesting_origin=*/kGadgetOrigin, - /*embedding_origin=*/kCoolOrigin, + /*requesting_origin=*/kGadgetUrl, + /*embedding_origin=*/kCoolUrl, /*source=*/content_settings::SETTING_SOURCE_POLICY, /*incognito=*/false, /*vendor_id=*/6354,
diff --git a/chrome/browser/usb/usb_chooser_controller.cc b/chrome/browser/usb/usb_chooser_controller.cc index c8e970f..323a505 100644 --- a/chrome/browser/usb/usb_chooser_controller.cc +++ b/chrome/browser/usb/usb_chooser_controller.cc
@@ -78,8 +78,8 @@ observer_(this), weak_factory_(this) { RenderFrameHost* main_frame = web_contents_->GetMainFrame(); - requesting_origin_ = render_frame_host->GetLastCommittedURL().GetOrigin(); - embedding_origin_ = main_frame->GetLastCommittedURL().GetOrigin(); + requesting_origin_ = render_frame_host->GetLastCommittedOrigin(); + embedding_origin_ = main_frame->GetLastCommittedOrigin(); Profile* profile = Profile::FromBrowserContext(web_contents_->GetBrowserContext()); chooser_context_ =
diff --git a/chrome/browser/usb/usb_chooser_controller.h b/chrome/browser/usb/usb_chooser_controller.h index 24989d78..29dd36b 100644 --- a/chrome/browser/usb/usb_chooser_controller.h +++ b/chrome/browser/usb/usb_chooser_controller.h
@@ -18,7 +18,7 @@ #include "chrome/browser/usb/usb_chooser_context.h" #include "device/usb/public/mojom/device.mojom.h" #include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h" -#include "url/gurl.h" +#include "url/origin.h" namespace content { class RenderFrameHost; @@ -59,8 +59,8 @@ std::vector<device::mojom::UsbDeviceFilterPtr> filters_; blink::mojom::WebUsbService::GetPermissionCallback callback_; - GURL requesting_origin_; - GURL embedding_origin_; + url::Origin requesting_origin_; + url::Origin embedding_origin_; content::WebContents* const web_contents_; base::WeakPtr<UsbChooserContext> chooser_context_;
diff --git a/chrome/browser/usb/web_usb_chooser.cc b/chrome/browser/usb/web_usb_chooser.cc index 09d01f4..9366a17 100644 --- a/chrome/browser/usb/web_usb_chooser.cc +++ b/chrome/browser/usb/web_usb_chooser.cc
@@ -28,10 +28,9 @@ blink::mojom::WebUsbService::GetPermissionCallback callback) { auto* web_contents = content::WebContents::FromRenderFrameHost(render_frame_host_); - GURL requesting_origin = - render_frame_host_->GetLastCommittedURL().GetOrigin(); - GURL embedding_origin = - web_contents->GetMainFrame()->GetLastCommittedURL().GetOrigin(); + url::Origin requesting_origin = render_frame_host_->GetLastCommittedOrigin(); + url::Origin embedding_origin = + web_contents->GetMainFrame()->GetLastCommittedOrigin(); auto* profile = Profile::FromBrowserContext(web_contents->GetBrowserContext()); auto* context = UsbChooserContextFactory::GetForProfile(profile);
diff --git a/chrome/browser/usb/web_usb_service_impl.cc b/chrome/browser/usb/web_usb_service_impl.cc index 586a6c6..8d6f429 100644 --- a/chrome/browser/usb/web_usb_service_impl.cc +++ b/chrome/browser/usb/web_usb_service_impl.cc
@@ -30,9 +30,8 @@ content::WebContents::FromRenderFrameHost(render_frame_host_); // This class is destroyed on cross-origin navigations and so it is safe to // cache these values. - requesting_origin_ = render_frame_host_->GetLastCommittedURL().GetOrigin(); - embedding_origin_ = - web_contents->GetMainFrame()->GetLastCommittedURL().GetOrigin(); + requesting_origin_ = render_frame_host_->GetLastCommittedOrigin(); + embedding_origin_ = web_contents->GetMainFrame()->GetLastCommittedOrigin(); Profile* profile = Profile::FromBrowserContext(web_contents->GetBrowserContext()); chooser_context_ = UsbChooserContextFactory::GetForProfile(profile); @@ -131,8 +130,8 @@ void WebUsbServiceImpl::OnPermissionRevoked(const GURL& requesting_origin, const GURL& embedding_origin) { - if (requesting_origin_ != requesting_origin || - embedding_origin_ != embedding_origin) { + if (requesting_origin_.GetURL() != requesting_origin || + embedding_origin_.GetURL() != embedding_origin) { return; }
diff --git a/chrome/browser/usb/web_usb_service_impl.h b/chrome/browser/usb/web_usb_service_impl.h index 4bd8d8f..120aa3a7 100644 --- a/chrome/browser/usb/web_usb_service_impl.h +++ b/chrome/browser/usb/web_usb_service_impl.h
@@ -20,6 +20,7 @@ #include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/interface_ptr_set.h" #include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h" +#include "url/origin.h" namespace content { class RenderFrameHost; @@ -81,8 +82,8 @@ content::RenderFrameHost* const render_frame_host_; base::WeakPtr<WebUsbChooser> usb_chooser_; UsbChooserContext* chooser_context_; - GURL requesting_origin_; - GURL embedding_origin_; + url::Origin requesting_origin_; + url::Origin embedding_origin_; // Used to bind with Blink. mojo::BindingSet<blink::mojom::WebUsbService> bindings_;
diff --git a/chrome/browser/usb/web_usb_service_impl_unittest.cc b/chrome/browser/usb/web_usb_service_impl_unittest.cc index 6a65735..9c3e8548 100644 --- a/chrome/browser/usb/web_usb_service_impl_unittest.cc +++ b/chrome/browser/usb/web_usb_service_impl_unittest.cc
@@ -141,7 +141,7 @@ } // namespace TEST_F(WebUsbServiceImplTest, NoPermissionDevice) { - GURL origin(kDefaultTestUrl); + const auto origin = url::Origin::Create(GURL(kDefaultTestUrl)); auto device1 = base::MakeRefCounted<FakeUsbDeviceInfo>( 0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF"); @@ -211,7 +211,7 @@ } TEST_F(WebUsbServiceImplTest, ReconnectDeviceManager) { - GURL origin(kDefaultTestUrl); + const auto origin = url::Origin::Create(GURL(kDefaultTestUrl)); auto* context = GetChooserContext(); auto device = base::MakeRefCounted<FakeUsbDeviceInfo>(0x1234, 0x5678, "ACME", @@ -289,7 +289,8 @@ } TEST_F(WebUsbServiceImplTest, RevokeDevicePermission) { - GURL origin(kDefaultTestUrl); + GURL url(kDefaultTestUrl); + const auto origin = url::Origin::Create(url); auto* context = GetChooserContext(); auto device_info = device_manager()->CreateAndAddDevice( @@ -316,8 +317,8 @@ device_ptr.set_connection_error_handler( base::BindLambdaForTesting([&]() { device_ptr.reset(); })); - auto objects = context->GetGrantedObjects(origin, origin); - context->RevokeObjectPermission(origin, origin, objects[0]->value); + auto objects = context->GetGrantedObjects(url, url); + context->RevokeObjectPermission(url, url, objects[0]->value); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(device_ptr);
diff --git a/chrome/browser/vr/model/capturing_state_model.h b/chrome/browser/vr/model/capturing_state_model.h index d1a8e927..3266c7e 100644 --- a/chrome/browser/vr/model/capturing_state_model.h +++ b/chrome/browser/vr/model/capturing_state_model.h
@@ -39,6 +39,18 @@ screen_capture_enabled || location_access_enabled || bluetooth_connected || usb_connected || midi_connected; } + + // Returns a model with only those flags set that were false in old but + // turned true in *this. + CapturingStateModel NewlyUpdatedPermissions(const CapturingStateModel& old) { + return {!old.audio_capture_enabled && audio_capture_enabled, + !old.video_capture_enabled && video_capture_enabled, + !old.screen_capture_enabled && screen_capture_enabled, + !old.location_access_enabled && location_access_enabled, + !old.bluetooth_connected && bluetooth_connected, + !old.usb_connected && usb_connected, + !old.midi_connected && midi_connected}; + } }; typedef bool CapturingStateModel::*CapturingStateModelMemberPtr;
diff --git a/chrome/browser/vr/ui_host/vr_ui_host_impl.cc b/chrome/browser/vr/ui_host/vr_ui_host_impl.cc index 795d8ff6..bb0537a 100644 --- a/chrome/browser/vr/ui_host/vr_ui_host_impl.cc +++ b/chrome/browser/vr/ui_host/vr_ui_host_impl.cc
@@ -50,10 +50,83 @@ const CapturingStateModel g_default_capturing_state; } // namespace +VRUiHostImpl::CapturingStateModelTransience::CapturingStateModelTransience( + CapturingStateModel* capturing_model) + : active_capture_state_model_(capturing_model) {} + +void VRUiHostImpl::CapturingStateModelTransience::ResetStartTimes() { + auto now = base::Time::Now(); + midi_indicator_start_ = now; + usb_indicator_start_ = now; + bluetooth_indicator_start_ = now; + location_indicator_start_ = now; + screen_capture_indicator_start_ = now; + video_indicator_start_ = now; + audio_indicator_start_ = now; +} + +void VRUiHostImpl::CapturingStateModelTransience:: + TurnFlagsOnBasedOnTriggeredState( + const CapturingStateModel& model_with_triggered_states) { + auto now = base::Time::Now(); + if (model_with_triggered_states.audio_capture_enabled) { + audio_indicator_start_ = now; + active_capture_state_model_->audio_capture_enabled = true; + } + if (model_with_triggered_states.video_capture_enabled) { + video_indicator_start_ = now; + active_capture_state_model_->video_capture_enabled = true; + } + if (model_with_triggered_states.screen_capture_enabled) { + screen_capture_indicator_start_ = now; + active_capture_state_model_->screen_capture_enabled = true; + } + if (model_with_triggered_states.location_access_enabled) { + location_indicator_start_ = now; + active_capture_state_model_->location_access_enabled = true; + } + if (model_with_triggered_states.bluetooth_connected) { + bluetooth_indicator_start_ = now; + active_capture_state_model_->bluetooth_connected = true; + } + if (model_with_triggered_states.usb_connected) { + usb_indicator_start_ = now; + active_capture_state_model_->usb_connected = true; + } + if (model_with_triggered_states.midi_connected) { + midi_indicator_start_ = now; + active_capture_state_model_->midi_connected = true; + } +} + +void VRUiHostImpl::CapturingStateModelTransience:: + TurnOffAllFlagsTogetherWhenAllTransiencesExpire( + const base::TimeDelta& transience_period) { + if (!active_capture_state_model_->IsAtleastOnePermissionGrantedOrInUse()) + return; + auto now = base::Time::Now(); + if ((!active_capture_state_model_->audio_capture_enabled || + now > audio_indicator_start_ + transience_period) && + (!active_capture_state_model_->video_capture_enabled || + now > video_indicator_start_ + transience_period) && + (!active_capture_state_model_->screen_capture_enabled || + now > screen_capture_indicator_start_ + transience_period) && + (!active_capture_state_model_->location_access_enabled || + now > location_indicator_start_ + transience_period) && + (!active_capture_state_model_->bluetooth_connected || + now > bluetooth_indicator_start_ + transience_period) && + (!active_capture_state_model_->usb_connected || + now > usb_indicator_start_ + transience_period) && + (!active_capture_state_model_->midi_connected || + now > midi_indicator_start_ + transience_period)) + *active_capture_state_model_ = CapturingStateModel(); +} + VRUiHostImpl::VRUiHostImpl(device::mojom::XRDeviceId device_id, device::mojom::XRCompositorHostPtr compositor) : compositor_(std::move(compositor)), main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()), + triggered_capturing_transience_(&triggered_capturing_state_model_), weak_ptr_factory_(this) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DVLOG(1) << __func__; @@ -334,6 +407,7 @@ indicators_shown_start_time_ = base::Time::Now(); indicators_visible_ = false; indicators_showing_first_time_ = true; + triggered_capturing_transience_.ResetStartTimes(); } void VRUiHostImpl::PollCapturingState() { @@ -391,13 +465,21 @@ DCHECK(usb_tab_helper != nullptr); active_capturing.usb_connected = usb_tab_helper->IsDeviceConnected(); - if (active_capturing_ != active_capturing) { + auto capturing_switched_on = + active_capturing.NewlyUpdatedPermissions(active_capturing_); + if (capturing_switched_on.IsAtleastOnePermissionGrantedOrInUse()) { indicators_shown_start_time_ = base::Time::Now(); + triggered_capturing_transience_.TurnFlagsOnBasedOnTriggeredState( + capturing_switched_on); + active_capturing_ = active_capturing; } + triggered_capturing_transience_ + .TurnOffAllFlagsTogetherWhenAllTransiencesExpire( + GetPermissionPromptTimeout(indicators_showing_first_time_)); - active_capturing_ = active_capturing; - ui_rendering_thread_->SetCapturingState( - active_capturing_, g_default_capturing_state, potential_capturing_); + ui_rendering_thread_->SetCapturingState(triggered_capturing_state_model_, + g_default_capturing_state, + potential_capturing_); if (indicators_shown_start_time_ + GetPermissionPromptTimeout(indicators_showing_first_time_) > @@ -408,6 +490,7 @@ } } else { indicators_showing_first_time_ = false; + potential_capturing_ = CapturingStateModel(); if (indicators_visible_) { indicators_visible_ = false; ui_rendering_thread_->SetIndicatorsVisible(false);
diff --git a/chrome/browser/vr/ui_host/vr_ui_host_impl.h b/chrome/browser/vr/ui_host/vr_ui_host_impl.h index f50344fb..e0ee1f7 100644 --- a/chrome/browser/vr/ui_host/vr_ui_host_impl.h +++ b/chrome/browser/vr/ui_host/vr_ui_host_impl.h
@@ -41,6 +41,34 @@ device::mojom::XRCompositorHostPtr compositor); private: + // This class manages the transience of each of a CapturingStateModel's flags. + class CapturingStateModelTransience { + public: + explicit CapturingStateModelTransience(CapturingStateModel* model); + + void ResetStartTimes(); + + // Turns the flags in |model| on immediately, based on the given + // triggered_state. + void TurnFlagsOnBasedOnTriggeredState( + const CapturingStateModel& triggered_state); + + // Any on flags stay on until every one of those flags has been on for + // longer than |period|. + void TurnOffAllFlagsTogetherWhenAllTransiencesExpire( + const base::TimeDelta& period); + + private: + base::Time audio_indicator_start_; + base::Time video_indicator_start_; + base::Time screen_capture_indicator_start_; + base::Time location_indicator_start_; + base::Time bluetooth_indicator_start_; + base::Time usb_indicator_start_; + base::Time midi_indicator_start_; + CapturingStateModel* active_capture_state_model_; // Not owned. + }; + // BrowserXRRuntimeObserver implementation. void SetWebXRWebContents(content::WebContents* contents) override; void SetVRDisplayInfo(device::mojom::VRDisplayInfoPtr display_info) override; @@ -84,12 +112,17 @@ CapturingStateModel active_capturing_; CapturingStateModel potential_capturing_; - device::mojom::GeolocationConfigPtr geolocation_config_; - base::CancelableClosure poll_capturing_state_task_; + // Keeps track of the state flags that were set to true between + // consecutive polls of active_capturing_ above. + CapturingStateModel triggered_capturing_state_model_; + CapturingStateModelTransience triggered_capturing_transience_; base::Time indicators_shown_start_time_; bool indicators_visible_ = false; bool indicators_showing_first_time_ = true; + device::mojom::GeolocationConfigPtr geolocation_config_; + base::CancelableClosure poll_capturing_state_task_; + THREAD_CHECKER(thread_checker_); base::WeakPtrFactory<VRUiHostImpl> weak_ptr_factory_;
diff --git a/chrome/browser/vr/ui_scene_creator.cc b/chrome/browser/vr/ui_scene_creator.cc index 19788aa..f0b98a9 100644 --- a/chrome/browser/vr/ui_scene_creator.cc +++ b/chrome/browser/vr/ui_scene_creator.cc
@@ -957,31 +957,6 @@ const CapturingStateModel active_capture = std::get<1>(value); const CapturingStateModel potential_capture = std::get<2>(value); - const CapturingStateModel last_active_capture = - last_value ? std::get<1>(last_value.value()) : CapturingStateModel(); - const CapturingStateModel last_potential_capture = - last_value ? std::get<2>(last_value.value()) : CapturingStateModel(); - - // Update the visibility state of the indicators based on the capturing state - // diff. potential_capture represents the permissions granted to the site - // before the presentation. active_capture members are set when a relevant - // device starts to get used. - // When the session starts, indicators display which permissions are granted - // upfront (struct potential_capture). Then, when a device gets accessed, - // an indicator notifies the user about its usage. - // The below logic tries to capture this logic. - bool initial_toasts = !active_capture.IsAtleastOnePermissionGrantedOrInUse(); - if (active_capture != last_active_capture || - potential_capture != last_potential_capture) { - auto specs = GetIndicatorSpecs(); - for (const auto& spec : specs) { - bool allowed = potential_capture.*spec.signal; - bool triggered = - !(last_active_capture.*spec.signal) && (active_capture.*spec.signal); - bool show_ui = initial_toasts ? allowed : triggered; - SetVisibleInLayout(scene->GetUiElementByName(spec.webvr_name), show_ui); - } - } if (!in_web_vr_presentation) { e->SetVisibleImmediately(false); @@ -990,9 +965,16 @@ e->SetVisible(true); e->RefreshVisible(); + SetVisibleInLayout(scene->GetUiElementByName(kWebVrExclusiveScreenToast), !model->browsing_disabled); + for (const auto& spec : GetIndicatorSpecs()) { + SetVisibleInLayout( + scene->GetUiElementByName(spec.webvr_name), + active_capture.*spec.signal || potential_capture.*spec.signal); + } + e->RemoveKeyframeModels(TRANSFORM); e->SetTranslate(0, kWebVrPermissionOffsetStart, 0);
diff --git a/chrome/chrome_repack_locales.gni b/chrome/chrome_repack_locales.gni index dd37d98..ba27920 100644 --- a/chrome/chrome_repack_locales.gni +++ b/chrome/chrome_repack_locales.gni
@@ -55,6 +55,12 @@ deps += invoker.deps } + # Omnibox resources are currently desktop-only, but this may change. + if (!is_android) { + source_patterns += + [ "${root_gen_dir}/components/omnibox/resources/omnibox_resources_" ] + deps += [ "//components/omnibox/resources:omnibox_resources" ] + } if (is_chromeos) { source_patterns += [ "${root_gen_dir}/ash/components/strings/ash_components_strings_",
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ta.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ta.xtb index 0666a99..de77e7e 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ta.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ta.xtb
@@ -1,11 +1,14 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ta"> +<translation id="1337821341856692531">தற்போதைய Windows கடவுச்சொல்லை உள்ளிடாமல் தொடர்வது மீட்க முடியாத தகவல் இழப்பை ஏற்படுத்தக்கூடும்.</translation> <translation id="1383286653814676580">Google அனுமதிச் சான்று வழங்குநர் உள்நுழைவுப் பக்கத்தை இயக்கப் பயன்படுத்தப்படுகிறது.</translation> <translation id="1894475569413661128">உங்கள் பணிக் கணக்கில் உள்நுழையவும்.</translation> +<translation id="2227020416206680836">உங்கள் அமர்வு காலாவதியானது. உங்கள் பணிக் கணக்கைப் பயன்படுத்தி உள்நுழையவும்.</translation> <translation id="2469311484561825731">உங்கள் பணிக் கணக்கில் உள்நுழைய முடியவில்லை. கம்ப்யூட்டரில் இணைய இணைப்பு உள்ளதா என்பதைச் சரிபார்த்து மீண்டும் முயலவும்.</translation> <translation id="2595469428674600431">உங்கள் Windows கடவுச்சொல்லைச் சரிபார்க்க முடியவில்லை. மீண்டும் முயலவும்.</translation> <translation id="3306357053520292004">இந்தக் கம்ப்யூட்டரில் இந்தக் கணக்கைப் பயன்படுத்தி ஏற்கனவே ஒரு பயனர் சேர்க்கப்பட்டுள்ளார். வேறொரு கணக்கில் உள்நுழையவும்.</translation> +<translation id="369030246015333661">உங்கள் கணக்கு பூட்டப்பட்டுள்ளது. சிஸ்டம் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation> <translation id="4057329986137569701">அகப்பிழை ஏற்பட்டது.</translation> <translation id="4300229033992784001">உங்கள் கணக்கின் கடவுச்சொல் மாற்றப்பட்டது. உங்கள் Windows கணக்கை பணிக் கணக்குடன் ஒத்திசைக்க உங்களின் தற்போதைய Windows கடவுச்சொல்லை உள்ளிடவும்.</translation> <translation id="4706454071748629324">புதிய பயனரைச் சேர்க்க முடியவில்லை. இந்தக் கம்ப்யூட்டர் பணிக் கணக்கைப் பயன்படுத்தி ஒரு பயனரை மட்டுமே உருவாக்க அனுமதிக்கும்.</translation> @@ -13,9 +16,14 @@ <translation id="6312494990035843744">இந்த டொமைனில் பணிக் கணக்கில் உள்நுழைய அனுமதியில்லை. வேறொரு கணக்கைப் பயன்படுத்திப் பார்க்கவும்.</translation> <translation id="6463752215771576050">நிறுவன மேலாண்மைக்கு இந்தக் கம்ப்யூட்டரைப் பதிவுசெய்ய முடியவில்லை. வேறொரு பணிக் கணக்கில் உள்நுழையவும்.</translation> <translation id="7135123390294776473">இந்தக் கம்ப்யூட்டரைப் பூட்டிய பயனர் மட்டுமே தற்போது உள்நுழைய அனுமதிக்கப்படுவார்.</translation> +<translation id="7209941495304122410">Windows கடவுச்சொல்லை உள்ளிடுக</translation> <translation id="7357241217513796177">இணைய இணைப்பு இருப்பதை உறுதிசெய்து மீண்டும் முயலவும்.</translation> +<translation id="7536769223115622137">பணிக் கணக்கைச் சேர்</translation> +<translation id="7856245195110636219">தற்போதைய Windows கடவுச்சொல்லை உள்ளிடாமல் தொடர முடியாது. சிஸ்டம் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation> <translation id="8474372283141585908">Google அனுமதிச் சான்று வழங்குநர்</translation> +<translation id="8639729688781680518">Windows கடவுச்சொல் மறந்துவிட்டது</translation> <translation id="866458870819756755">பயனரை உருவாக்க முடியவில்லை.</translation> <translation id="8860262547644202689">Google அனுமதிச் சான்று வழங்குநர் உதவி</translation> +<translation id="8875753657315897487">உங்கள் பணிக் கணக்கைப் பயன்படுத்தி உள்நுழையவும்</translation> <translation id="9135619837062629367">இந்தக் கணக்கில் உள்நுழைய அனுமதியில்லை. வேறொரு கணக்கைப் பயன்படுத்திப் பார்க்கவும்.</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/renderer/printing/chrome_print_render_frame_helper_delegate.cc b/chrome/renderer/printing/chrome_print_render_frame_helper_delegate.cc index e512109..bc632a1 100644 --- a/chrome/renderer/printing/chrome_print_render_frame_helper_delegate.cc +++ b/chrome/renderer/printing/chrome_print_render_frame_helper_delegate.cc
@@ -22,7 +22,7 @@ #if BUILDFLAG(ENABLE_EXTENSIONS) #include "chrome/common/extensions/extension_constants.h" #include "extensions/common/constants.h" -#include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_base.h" +#include "extensions/renderer/guest_view/mime_handler_view/post_message_support.h" #endif // BUILDFLAG(ENABLE_EXTENSIONS) ChromePrintRenderFrameHelperDelegate::ChromePrintRenderFrameHelperDelegate() = @@ -75,17 +75,15 @@ if (!frame->GetDocument().IsPluginDocument()) return false; - std::vector<extensions::MimeHandlerViewContainerBase*> mime_handlers = - extensions::MimeHandlerViewContainerBase::FromRenderFrame( - content::RenderFrame::FromWebFrame(frame)); - if (!mime_handlers.empty()) { + if (auto* post_message_support = + extensions::PostMessageSupport::FromWebLocalFrame(frame)) { // This message is handled in chrome/browser/resources/pdf/pdf_viewer.js and // instructs the PDF plugin to print. This is to make window.print() on a // PDF plugin document correctly print the PDF. See // https://crbug.com/448720. base::DictionaryValue message; message.SetString("type", "print"); - mime_handlers.front()->PostMessageFromValue(message); + post_message_support->PostMessageFromValue(message); return true; } #endif // BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/test/base/run_all_unittests.cc b/chrome/test/base/run_all_unittests.cc index a69c7eb..ea8716e8 100644 --- a/chrome/test/base/run_all_unittests.cc +++ b/chrome/test/base/run_all_unittests.cc
@@ -6,6 +6,7 @@ #include "base/command_line.h" #include "base/test/launcher/unit_test_launcher.h" #include "base/test/test_io_thread.h" +#include "base/threading/platform_thread.h" #include "build/build_config.h" #include "chrome/test/base/chrome_unit_test_suite.h" #include "content/public/test/unittest_test_suite.h" @@ -16,6 +17,8 @@ #endif int main(int argc, char **argv) { + base::PlatformThread::SetName("MainThread"); + content::UnitTestTestSuite test_suite(new ChromeUnitTestSuite(argc, argv)); base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
diff --git a/chrome/test/chromedriver/BUILD.gn b/chrome/test/chromedriver/BUILD.gn index adee0b4..ab46b4e2 100644 --- a/chrome/test/chromedriver/BUILD.gn +++ b/chrome/test/chromedriver/BUILD.gn
@@ -304,6 +304,7 @@ } executable("chromedriver") { + testonly = true sources = [ "server/chromedriver_server.cc", ] @@ -315,6 +316,8 @@ ":lib", "//build/win:default_exe_manifest", "//mojo/core/embedder", + "//net/server:http_server", + "//net/traffic_annotation:test_support", "//services/network/public/mojom", ] }
diff --git a/chrome/test/chromedriver/chrome_launcher.cc b/chrome/test/chromedriver/chrome_launcher.cc index 5188181f..fff7e05 100644 --- a/chrome/test/chromedriver/chrome_launcher.cc +++ b/chrome/test/chromedriver/chrome_launcher.cc
@@ -80,7 +80,6 @@ "disable-sync", "no-first-run", "disable-background-networking", - "disable-web-resources", "disable-client-side-phishing-detection", "disable-default-apps", "enable-logging",
diff --git a/chrome/test/data/extensions/api_test/activity_log_private/test/test.js b/chrome/test/data/extensions/api_test/activity_log_private/test/test.js index cc1dbc9..b93df94 100644 --- a/chrome/test/data/extensions/api_test/activity_log_private/test/test.js +++ b/chrome/test/data/extensions/api_test/activity_log_private/test/test.js
@@ -222,9 +222,13 @@ 'tabs.executeScript', // Location access 'blinkSetAttribute LocalDOMWindow url', + 'blinkRequestResource Main resource', 'blinkSetAttribute LocalDOMWindow url', + 'blinkRequestResource Main resource', 'blinkSetAttribute LocalDOMWindow url', + 'blinkRequestResource Main resource', 'blinkSetAttribute LocalDOMWindow url', + 'blinkRequestResource Main resource', // Dom mutations // Navigator access 'Window.navigator',
diff --git a/chrome/test/data/extensions/api_test/tabs/on_updated/test.js b/chrome/test/data/extensions/api_test/tabs/on_updated/test.js index 0399058..c2045c8 100644 --- a/chrome/test/data/extensions/api_test/tabs/on_updated/test.js +++ b/chrome/test/data/extensions/api_test/tabs/on_updated/test.js
@@ -39,7 +39,6 @@ // renderer-initiated navigation. expect([ { status: 'loading', url: getURL('browserThenRendererInitiated/a.html') }, - { status: 'complete' }, { status: 'loading', url: getURL('browserThenRendererInitiated/b.html') }, { status: 'complete' }, ]);
diff --git a/chrome/test/data/webui/cr_elements/cr_action_menu_test.js b/chrome/test/data/webui/cr_elements/cr_action_menu_test.js index 8a5fb38..d925165 100644 --- a/chrome/test/data/webui/cr_elements/cr_action_menu_test.js +++ b/chrome/test/data/webui/cr_elements/cr_action_menu_test.js
@@ -22,6 +22,15 @@ /** @type {HTMLElement} */ let container = null; + /** @type {Element} */ + let checkbox = null; + + /** @override */ + suiteSetup(() => { + return PolymerTest.importHtml( + 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html'); + }); + setup(function() { PolymerTest.clearBody(); @@ -31,13 +40,14 @@ <button class="dropdown-item">Un</button> <hr> <button class="dropdown-item">Dos</button> - <button class="dropdown-item">Tres</button> + <cr-checkbox class="dropdown-item">Tres</cr-checkbox> </cr-action-menu> `; menu = document.querySelector('cr-action-menu'); dialog = menu.getDialog(); items = menu.querySelectorAll('.dropdown-item'); + checkbox = items[2].getFocusableElement(); dots = document.querySelector('#dots'); assertEquals(3, items.length); }); @@ -72,19 +82,19 @@ test('hidden or disabled items', function() { menu.showAt(dots); down(); - assertEquals(getDeepActiveElement(), items[0]); + assertEquals(items[0], getDeepActiveElement()); menu.close(); items[0].hidden = true; menu.showAt(dots); down(); - assertEquals(getDeepActiveElement(), items[1]); + assertEquals(items[1], getDeepActiveElement()); menu.close(); items[1].disabled = true; menu.showAt(dots); down(); - assertEquals(getDeepActiveElement(), items[2]); + assertEquals(checkbox, getDeepActiveElement()); }); test('focus after down/up arrow', function() { @@ -94,24 +104,24 @@ assertEquals(menu, document.activeElement); assertNotEquals(items[0], getDeepActiveElement()); assertNotEquals(items[1], getDeepActiveElement()); - assertNotEquals(items[2], getDeepActiveElement()); + assertNotEquals(checkbox, getDeepActiveElement()); down(); assertEquals(items[0], getDeepActiveElement()); down(); assertEquals(items[1], getDeepActiveElement()); down(); - assertEquals(items[2], getDeepActiveElement()); + assertEquals(checkbox, getDeepActiveElement()); down(); assertEquals(items[0], getDeepActiveElement()); up(); - assertEquals(items[2], getDeepActiveElement()); + assertEquals(checkbox, getDeepActiveElement()); up(); assertEquals(items[1], getDeepActiveElement()); up(); assertEquals(items[0], getDeepActiveElement()); up(); - assertEquals(items[2], getDeepActiveElement()); + assertEquals(checkbox, getDeepActiveElement()); items[1].disabled = true; up(); @@ -123,7 +133,7 @@ assertEquals(menu, document.activeElement); up(); - assertEquals(items[items.length - 1], getDeepActiveElement()); + assertEquals(checkbox, getDeepActiveElement()); }); test('pressing enter when no focus', function() { @@ -163,7 +173,7 @@ up(); // Focus should have wrapped around to final item. - assertEquals(items[2], getDeepActiveElement()); + assertEquals(checkbox, getDeepActiveElement()); }); test('close on click away', function() { @@ -230,7 +240,7 @@ // Moving mouse on a disabled item should focus the menu. items[2].setAttribute('disabled', ''); makeMouseoverEvent(items[2]); - assertNotEquals(items[2], getDeepActiveElement()); + assertNotEquals(checkbox, getDeepActiveElement()); assertEquals(menu, document.activeElement); // Mouse movements should override keyboard focus.
diff --git a/chrome/test/data/webui/cr_focus_row_behavior_test.js b/chrome/test/data/webui/cr_focus_row_behavior_test.js index cc57bf9..39a2d35 100644 --- a/chrome/test/data/webui/cr_focus_row_behavior_test.js +++ b/chrome/test/data/webui/cr_focus_row_behavior_test.js
@@ -52,29 +52,17 @@ }); }); - /** - * @param {!HTMLElement} element - * @return {!Promise} Promise that resolves when an afterNextRender() - * callback on |element| is run. - */ - function afterNextRender(element) { - return new Promise(resolve => { - Polymer.RenderStatus.afterNextRender(element, resolve); - }); - } - - setup(function() { + setup(async function() { PolymerTest.clearBody(); testElement = document.createElement('focus-row-element'); document.body.appendChild(testElement); // Block so that FocusRowBehavior.attached can run. - return afterNextRender(testElement).then(() => { - // Wait one more time to ensure that async setup in FocusRowBehavior has - // executed. - return afterNextRender(testElement); - }); + await PolymerTest.afterNextRender(testElement); + // Wait one more time to ensure that async setup in FocusRowBehavior has + // executed. + await PolymerTest.afterNextRender(testElement); }); test('item passes focus to first focusable child', function() {
diff --git a/chrome/test/data/webui/history/history_focus_test.js b/chrome/test/data/webui/history/history_focus_test.js index 4056617c..0a23f83 100644 --- a/chrome/test/data/webui/history/history_focus_test.js +++ b/chrome/test/data/webui/history/history_focus_test.js
@@ -114,71 +114,65 @@ setup(function() { app = replaceApp(); element = app.$.history; + return PolymerTest.flushTasks(); }); - test('list focus and keyboard nav', function() { + test('list focus and keyboard nav', async () => { app.historyResult(createHistoryInfo(), TEST_HISTORY_RESULTS); let focused; let items; - return PolymerTest.flushTasks() - .then(function() { - Polymer.dom.flush(); - items = polymerSelectAll(element, 'history-item'); + await PolymerTest.flushTasks(); + Polymer.dom.flush(); + items = polymerSelectAll(element, 'history-item'); - focused = items[2].$.checkbox; - focused.focus(); + items[2].$.checkbox.focus(); + focused = items[2].$.checkbox.getFocusableElement(); - // Wait for next render to ensure that focus handlers have been - // registered (see HistoryItemElement.attached). - return new Promise(resolve => { - Polymer.RenderStatus.afterNextRender(this, resolve); - }); - }) - .then(() => { - MockInteractions.pressAndReleaseKeyOn( - focused, 39, [], 'ArrowRight'); - Polymer.dom.flush(); - focused = items[2].$.link; - assertEquals(focused, element.lastFocused_); - assertTrue(items[2].row_.isActive()); - assertFalse(items[3].row_.isActive()); + // Wait for next render to ensure that focus handlers have been + // registered (see HistoryItemElement.attached). + await PolymerTest.afterNextRender(this); - MockInteractions.pressAndReleaseKeyOn(focused, 40, [], 'ArrowDown'); - Polymer.dom.flush(); - focused = items[3].$.link; - assertEquals(focused, element.lastFocused_); - assertFalse(items[2].row_.isActive()); - assertTrue(items[3].row_.isActive()); + MockInteractions.pressAndReleaseKeyOn(focused, 39, [], 'ArrowRight'); + Polymer.dom.flush(); + focused = items[2].$.link; + assertEquals(focused, element.lastFocused_); + assertTrue(items[2].row_.isActive()); + assertFalse(items[3].row_.isActive()); - MockInteractions.pressAndReleaseKeyOn( - focused, 39, [], 'ArrowRight'); - Polymer.dom.flush(); - focused = items[3].$['menu-button']; - assertEquals(focused, element.lastFocused_); - assertFalse(items[2].row_.isActive()); - assertTrue(items[3].row_.isActive()); + MockInteractions.pressAndReleaseKeyOn(focused, 40, [], 'ArrowDown'); + Polymer.dom.flush(); + focused = items[3].$.link; + assertEquals(focused, element.lastFocused_); + assertFalse(items[2].row_.isActive()); + assertTrue(items[3].row_.isActive()); - MockInteractions.pressAndReleaseKeyOn(focused, 38, [], 'ArrowUp'); - Polymer.dom.flush(); - focused = items[2].$['menu-button']; - assertEquals(focused, element.lastFocused_); - assertTrue(items[2].row_.isActive()); - assertFalse(items[3].row_.isActive()); + MockInteractions.pressAndReleaseKeyOn(focused, 39, [], 'ArrowRight'); + Polymer.dom.flush(); + focused = items[3].$['menu-button']; + assertEquals(focused, element.lastFocused_); + assertFalse(items[2].row_.isActive()); + assertTrue(items[3].row_.isActive()); - MockInteractions.pressAndReleaseKeyOn(focused, 37, [], 'ArrowLeft'); - Polymer.dom.flush(); - focused = items[2].$$('#bookmark-star'); - assertEquals(focused, element.lastFocused_); - assertTrue(items[2].row_.isActive()); - assertFalse(items[3].row_.isActive()); + MockInteractions.pressAndReleaseKeyOn(focused, 38, [], 'ArrowUp'); + Polymer.dom.flush(); + focused = items[2].$['menu-button']; + assertEquals(focused, element.lastFocused_); + assertTrue(items[2].row_.isActive()); + assertFalse(items[3].row_.isActive()); - MockInteractions.pressAndReleaseKeyOn(focused, 40, [], 'ArrowDown'); - Polymer.dom.flush(); - focused = items[3].$.link; - assertEquals(focused, element.lastFocused_); - assertFalse(items[2].row_.isActive()); - assertTrue(items[3].row_.isActive()); - }); + MockInteractions.pressAndReleaseKeyOn(focused, 37, [], 'ArrowLeft'); + Polymer.dom.flush(); + focused = items[2].$$('#bookmark-star'); + assertEquals(focused, element.lastFocused_); + assertTrue(items[2].row_.isActive()); + assertFalse(items[3].row_.isActive()); + + MockInteractions.pressAndReleaseKeyOn(focused, 40, [], 'ArrowDown'); + Polymer.dom.flush(); + focused = items[3].$.link; + assertEquals(focused, element.lastFocused_); + assertFalse(items[2].row_.isActive()); + assertTrue(items[3].row_.isActive()); }); });
diff --git a/chrome/test/data/webui/polymer_browser_test_base.js b/chrome/test/data/webui/polymer_browser_test_base.js index 9569f2df..51fea46 100644 --- a/chrome/test/data/webui/polymer_browser_test_base.js +++ b/chrome/test/data/webui/polymer_browser_test_base.js
@@ -202,3 +202,14 @@ window.setTimeout(resolve, 0); }); }; + +/** + * @param {!HTMLElement} element + * @return {!Promise} Promise that resolves when an afterNextRender() + * callback on |element| is run. + */ +PolymerTest.afterNextRender = function(element) { + return new Promise(resolve => { + Polymer.RenderStatus.afterNextRender(element, resolve); + }); +};
diff --git a/chromecast/base/BUILD.gn b/chromecast/base/BUILD.gn index 306ad19..75645e4 100644 --- a/chromecast/base/BUILD.gn +++ b/chromecast/base/BUILD.gn
@@ -228,7 +228,7 @@ "//chromecast:chromecast_buildflags", "//chromecast/browser:jni_headers", ] - } else if (chromecast_branding == "public" || is_fuchsia) { + } else if (chromecast_branding == "public") { sources += [ "cast_sys_info_util_simple.cc" ] } } @@ -249,7 +249,7 @@ # Note: Android links //chromecast/base:cast_sys_info statically. cast_source_set("cast_sys_info_shlib") { - if (!is_android && !is_fuchsia) { + if (!is_android) { sources = [ "cast_sys_info_util_shlib.cc", ]
diff --git a/chromeos/components/proximity_auth/OWNERS b/chromeos/components/proximity_auth/OWNERS index 0fe5bd8..7897590 100644 --- a/chromeos/components/proximity_auth/OWNERS +++ b/chromeos/components/proximity_auth/OWNERS
@@ -1,3 +1,3 @@ file://chrome/browser/chromeos/login/easy_unlock/OWNERS -# COMPONENT: UI>SmartLock +# COMPONENT: OS>Systems>Multidevice>SmartLock
diff --git a/chromeos/dbus/power/power_policy_controller.cc b/chromeos/dbus/power/power_policy_controller.cc index 24c4e60d..c0445cd 100644 --- a/chromeos/dbus/power/power_policy_controller.cc +++ b/chromeos/dbus/power/power_policy_controller.cc
@@ -198,6 +198,10 @@ StringAppendF(&str, "boot_on_ac=%d ", policy.boot_on_ac()); } + if (policy.has_usb_power_share()) { + StringAppendF(&str, "usb_power_share=%d ", policy.usb_power_share()); + } + if (policy.has_reason()) StringAppendF(&str, "reason=\"%s\" ", policy.reason().c_str()); base::TrimWhitespaceASCII(str, base::TRIM_TRAILING, &str); @@ -340,6 +344,8 @@ prefs_policy_.set_boot_on_ac(values.boot_on_ac); + prefs_policy_.set_usb_power_share(values.usb_power_share); + prefs_were_set_ = true; SendCurrentPolicy(); }
diff --git a/chromeos/dbus/power/power_policy_controller.h b/chromeos/dbus/power/power_policy_controller.h index 2c6ef8f..87c69d78 100644 --- a/chromeos/dbus/power/power_policy_controller.h +++ b/chromeos/dbus/power/power_policy_controller.h
@@ -113,6 +113,7 @@ int peak_shift_battery_threshold = -1; std::vector<PeakShiftDayConfiguration> peak_shift_day_configurations; bool boot_on_ac = false; + bool usb_power_share = true; }; // Returns a string describing |policy|. Useful for tests.
diff --git a/chromeos/dbus/power/power_policy_controller_unittest.cc b/chromeos/dbus/power/power_policy_controller_unittest.cc index ee4bb6a..35787ad 100644 --- a/chromeos/dbus/power/power_policy_controller_unittest.cc +++ b/chromeos/dbus/power/power_policy_controller_unittest.cc
@@ -65,6 +65,7 @@ prefs.wait_for_initial_user_activity = true; prefs.force_nonzero_brightness_for_user_activity = false; prefs.boot_on_ac = true; + prefs.usb_power_share = false; policy_controller_->ApplyPrefs(prefs); power_manager::PowerManagementPolicy expected_policy; @@ -93,6 +94,7 @@ expected_policy.set_wait_for_initial_user_activity(true); expected_policy.set_force_nonzero_brightness_for_user_activity(false); expected_policy.set_boot_on_ac(true); + expected_policy.set_usb_power_share(false); expected_policy.set_reason(PowerPolicyController::kPrefsReason); EXPECT_EQ( PowerPolicyController::GetPolicyDebugString(expected_policy),
diff --git a/chromeos/dbus/session_manager/fake_session_manager_client.cc b/chromeos/dbus/session_manager/fake_session_manager_client.cc index 31b6ac0..cfc3e668 100644 --- a/chromeos/dbus/session_manager/fake_session_manager_client.cc +++ b/chromeos/dbus/session_manager/fake_session_manager_client.cc
@@ -283,7 +283,9 @@ user_sessions_[cryptohome_id.account_id()] = user_id_hash; } -void FakeSessionManagerClient::StopSession() {} +void FakeSessionManagerClient::StopSession() { + session_stopped_ = true; +} void FakeSessionManagerClient::StartDeviceWipe() { start_device_wipe_call_count_++;
diff --git a/chromeos/dbus/session_manager/fake_session_manager_client.h b/chromeos/dbus/session_manager/fake_session_manager_client.h index 64348a2..8bfc57be 100644 --- a/chromeos/dbus/session_manager/fake_session_manager_client.h +++ b/chromeos/dbus/session_manager/fake_session_manager_client.h
@@ -234,6 +234,8 @@ return container_instance_id_; } + bool session_stopped() const { return session_stopped_; } + private: bool supports_restart_to_apply_user_flags_ = false; @@ -278,6 +280,8 @@ StubDelegate* delegate_ = nullptr; + bool session_stopped_ = false; + // The last-set flags for user set through |SetFlagsForUser|. std::map<cryptohome::AccountIdentifier, std::vector<std::string>> flags_for_user_;
diff --git a/components/BUILD.gn b/components/BUILD.gn index 68e646f..6f9928c 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -391,12 +391,14 @@ repack("components_tests_pak") { sources = [ "$root_gen_dir/components/components_resources.pak", + "$root_gen_dir/components/omnibox/resources/omnibox_resources_en-US.pak", "$root_gen_dir/components/strings/components_locale_settings_en-US.pak", "$root_gen_dir/components/strings/components_strings_en-US.pak", ] output = "$root_out_dir/components_tests_resources.pak" deps = [ + "//components/omnibox/resources:omnibox_resources", "//components/resources", "//components/strings", ]
diff --git a/components/arc/arc_features.cc b/components/arc/arc_features.cc index 682d0022..9d9cced 100644 --- a/components/arc/arc_features.cc +++ b/components/arc/arc_features.cc
@@ -56,6 +56,10 @@ "ArcNativeBridgeExperiment", base::FEATURE_ENABLED_BY_DEFAULT }; +// Controls experimental print spooler feature for ARC. +const base::Feature kPrintSpoolerExperimentFeature{ + "ArcPrintSpoolerExperiment", base::FEATURE_DISABLED_BY_DEFAULT}; + // Controls Smart Text Selection for Chrome. // When enabled, the context menu will show contextual quick actions based on // the current text selection.
diff --git a/components/arc/arc_features.h b/components/arc/arc_features.h index bb40106..56af17d 100644 --- a/components/arc/arc_features.h +++ b/components/arc/arc_features.h
@@ -23,6 +23,7 @@ extern const base::Feature kFilePickerExperimentFeature; extern const base::Feature kGraphicBuffersVisualizationTool; extern const base::Feature kNativeBridgeExperimentFeature; +extern const base::Feature kPrintSpoolerExperimentFeature; extern const base::Feature kSmartTextSelectionFeature; extern const base::Feature kUsbHostFeature; extern const base::Feature kVpnFeature;
diff --git a/components/arc/session/arc_session_impl.cc b/components/arc/session/arc_session_impl.cc index 266ab13..d0f3875 100644 --- a/components/arc/session/arc_session_impl.cc +++ b/components/arc/session/arc_session_impl.cc
@@ -377,6 +377,8 @@ delegate_->GetChannel() != version_info::Channel::STABLE && delegate_->GetChannel() != version_info::Channel::BETA; request.set_arc_custom_tabs_experiment(is_custom_tab_enabled); + request.set_arc_print_spooler_experiment( + base::FeatureList::IsEnabled(arc::kPrintSpoolerExperimentFeature)); request.set_lcd_density(lcd_density); if (base::CommandLine::ForCurrentProcess()->HasSwitch(
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager.cc b/components/autofill/core/browser/payments/credit_card_save_manager.cc index b3505c6..284c607 100644 --- a/components/autofill/core/browser/payments/credit_card_save_manager.cc +++ b/components/autofill/core/browser/payments/credit_card_save_manager.cc
@@ -451,10 +451,14 @@ if (base::FeatureList::IsEnabled( features::kAutofillDoNotUploadSaveUnsupportedCards) && !supported_card_bin_ranges.empty() && - !IsCreditCardSupported(supported_card_bin_ranges)) { - AttemptToOfferCardLocalSave(from_dynamic_change_form_, - has_non_focusable_field_, - upload_request_.card); + !payments::IsCreditCardSupported(upload_request_.card, + supported_card_bin_ranges)) { + // Attempt local card save if card not already saved. + if (!uploading_local_card_) { + AttemptToOfferCardLocalSave(from_dynamic_change_form_, + has_non_focusable_field_, + upload_request_.card); + } upload_decision_metrics_ |= AutofillMetrics::UPLOAD_NOT_OFFERED_UNSUPPORTED_BIN_RANGE; LogCardUploadDecisions(upload_decision_metrics_); @@ -1080,28 +1084,4 @@ } } -bool CreditCardSaveManager::IsCreditCardSupported( - std::vector<std::pair<int, int>> supported_card_bin_ranges) { - base::string16 stripped_number = - CreditCard::StripSeparators(upload_request_.card.number()); - for (auto& bin_range : supported_card_bin_ranges) { - unsigned long range_num_of_digits = - base::NumberToString(bin_range.first).size(); - DCHECK_EQ(range_num_of_digits, - base::NumberToString(bin_range.second).size()); - // The first n digits of credit card number, where n is the number of - // digits in range's starting/ending number. - int first_digits_start, first_digits_end; - base::StringToInt(stripped_number.substr(0, range_num_of_digits), - &first_digits_start); - base::StringToInt(stripped_number.substr(0, range_num_of_digits), - &first_digits_end); - if (first_digits_start >= bin_range.first && - first_digits_end <= bin_range.second) { - return true; - } - } - return false; -} - } // namespace autofill
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager.h b/components/autofill/core/browser/payments/credit_card_save_manager.h index 3319c5f..9e51fa0 100644 --- a/components/autofill/core/browser/payments/credit_card_save_manager.h +++ b/components/autofill/core/browser/payments/credit_card_save_manager.h
@@ -270,13 +270,6 @@ // Logs the reason why expiration date was explicitly requested. void LogSaveCardRequestExpirationDateReasonMetric(); - // Checks if credit card matches one of the ranges in - // |supported_card_bin_ranges|, inclusive of the start and end boundaries. - // For example, if the range consists of std::pair<34, 36>, then all cards - // with first two digits of 34, 35 and 36 are supported. - bool IsCreditCardSupported( - std::vector<std::pair<int, int>> supported_card_bin_ranges); - // For testing. void SetEventObserverForTesting(ObserverForTest* observer) { observer_for_testing_ = observer;
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc index 3908993..ee7469c3 100644 --- a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc +++ b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
@@ -5538,6 +5538,40 @@ EXPECT_FALSE(credit_card_save_manager_->CreditCardWasUploaded()); } +// Tests that if a card doesn't fall in any of the supported bin ranges, but is +// already saved, then local save is not offered. +TEST_F(CreditCardSaveManagerTest, LocalSaveNotOfferedForSavedUnsupportedCard) { + scoped_feature_list_.InitAndEnableFeature( + features::kAutofillDoNotUploadSaveUnsupportedCards); + std::vector<std::pair<int, int>> supported_card_bin_ranges{ + std::make_pair(4111, 4113), std::make_pair(34, 34), + std::make_pair(300, 305)}; + payments_client_->SetSupportedBINRanges(supported_card_bin_ranges); + // Set up our credit card form data. + FormData credit_card_form; + CreateTestCreditCardFormData(&credit_card_form, true, false); + FormsSeen(std::vector<FormData>(1, credit_card_form)); + + // Add a local credit card whose number matches what we will + // enter below. + CreditCard local_card; + test::SetCreditCardInfo(&local_card, "Flo Master", "5454545454545454", + NextMonth().c_str(), NextYear().c_str(), "1"); + local_card.set_record_type(CreditCard::LOCAL_CARD); + personal_data_.AddCreditCard(local_card); + + // Edit the data, and submit. + credit_card_form.fields[0].value = ASCIIToUTF16("Flo Master"); + credit_card_form.fields[1].value = ASCIIToUTF16("5454545454545454"); + credit_card_form.fields[2].value = ASCIIToUTF16(NextMonth()); + credit_card_form.fields[3].value = ASCIIToUTF16(NextYear()); + credit_card_form.fields[4].value = ASCIIToUTF16("123"); + + // Since card is already saved, local save should not be offered. + FormSubmitted(credit_card_form); + EXPECT_FALSE(autofill_client_.ConfirmSaveCardLocallyWasCalled()); +} + // Tests that if a card falls in one of the supported bin ranges, upload save // is offered. TEST_F(CreditCardSaveManagerTest, UploadSaveOfferedForSupportedCard) {
diff --git a/components/autofill/core/browser/payments/payments_util.cc b/components/autofill/core/browser/payments/payments_util.cc index b577534..96e977b 100644 --- a/components/autofill/core/browser/payments/payments_util.cc +++ b/components/autofill/core/browser/payments/payments_util.cc
@@ -53,5 +53,30 @@ kCustomerHasNoBillingCustomerNumber; } +bool IsCreditCardSupported( + const CreditCard& credit_card, + const std::vector<std::pair<int, int>>& supported_card_bin_ranges) { + base::string16 stripped_number = + CreditCard::StripSeparators(credit_card.number()); + for (auto& bin_range : supported_card_bin_ranges) { + unsigned long range_num_of_digits = + base::NumberToString(bin_range.first).size(); + DCHECK_EQ(range_num_of_digits, + base::NumberToString(bin_range.second).size()); + // The first n digits of credit card number, where n is the number of + // digits in range's starting/ending number. + int first_digits_start, first_digits_end; + base::StringToInt(stripped_number.substr(0, range_num_of_digits), + &first_digits_start); + base::StringToInt(stripped_number.substr(0, range_num_of_digits), + &first_digits_end); + if (first_digits_start >= bin_range.first && + first_digits_end <= bin_range.second) { + return true; + } + } + return false; +} + } // namespace payments } // namespace autofill
diff --git a/components/autofill/core/browser/payments/payments_util.h b/components/autofill/core/browser/payments/payments_util.h index 31ca1053..8390b77 100644 --- a/components/autofill/core/browser/payments/payments_util.h +++ b/components/autofill/core/browser/payments/payments_util.h
@@ -6,6 +6,9 @@ #define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_PAYMENTS_UTIL_H_ #include <stdint.h> +#include <vector> + +#include "components/autofill/core/browser/credit_card.h" namespace autofill { @@ -23,6 +26,14 @@ // Returns if the customer has an existing Google payments account. bool HasGooglePaymentsAccount(PersonalDataManager* personal_data_manager); +// Checks if |credit_card| matches one of the ranges in +// |supported_card_bin_ranges|, inclusive of the start and end boundaries. +// For example, if the range consists of std::pair<34, 36>, then all cards +// with first two digits of 34, 35 and 36 are supported. +bool IsCreditCardSupported( + const CreditCard& credit_card, + const std::vector<std::pair<int, int>>& supported_card_bin_ranges); + } // namespace payments } // namespace autofill
diff --git a/components/autofill/core/browser/payments/payments_util_unittest.cc b/components/autofill/core/browser/payments/payments_util_unittest.cc index d2fb8504..27c59e8 100644 --- a/components/autofill/core/browser/payments/payments_util_unittest.cc +++ b/components/autofill/core/browser/payments/payments_util_unittest.cc
@@ -4,8 +4,10 @@ #include "components/autofill/core/browser/payments/payments_util.h" +#include "base/guid.h" #include "base/test/metrics/histogram_tester.h" #include "components/autofill/core/browser/autofill_metrics.h" +#include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/payments/payments_customer_data.h" #include "components/autofill/core/browser/test_personal_data_manager.h" #include "testing/gtest/include/gtest/gtest.h" @@ -18,6 +20,13 @@ PaymentsUtilTest() {} ~PaymentsUtilTest() override {} + CreditCard GetCreditCardWithSpecifiedCardNumber(const char* card_number) { + CreditCard credit_card(base::GenerateGUID(), /*origin=*/""); + test::SetCreditCardInfo(&credit_card, "Test User", card_number, "11", + test::NextYear().c_str(), "1"); + return credit_card; + } + protected: TestPersonalDataManager personal_data_manager_; @@ -77,5 +86,60 @@ EXPECT_FALSE(HasGooglePaymentsAccount(&personal_data_manager_)); } +TEST_F(PaymentsUtilTest, IsCreditCardSupported_EmptyBin) { + // Create empty supported card bin ranges. + std::vector<std::pair<int, int>> supported_card_bin_ranges; + CreditCard credit_card = + GetCreditCardWithSpecifiedCardNumber("4111111111111111"); + // Credit card is not supported since the supported bin range is empty. + EXPECT_FALSE(IsCreditCardSupported(credit_card, supported_card_bin_ranges)); +} + +TEST_F(PaymentsUtilTest, IsCreditCardSupported_SameStartAndEnd) { + std::vector<std::pair<int, int>> supported_card_bin_ranges{ + std::make_pair(411111, 411111)}; + CreditCard credit_card = + GetCreditCardWithSpecifiedCardNumber("4111111111111111"); + // Credit card is supported since the card number is within the range of the + // same start and end. + EXPECT_TRUE(IsCreditCardSupported(credit_card, supported_card_bin_ranges)); +} + +TEST_F(PaymentsUtilTest, IsCreditCardSupported_InsideRange) { + std::vector<std::pair<int, int>> supported_card_bin_ranges{ + std::make_pair(411110, 411112)}; + CreditCard credit_card = + GetCreditCardWithSpecifiedCardNumber("4111111111111111"); + // Credit card is supported since the card number is inside the range. + EXPECT_TRUE(IsCreditCardSupported(credit_card, supported_card_bin_ranges)); +} + +TEST_F(PaymentsUtilTest, IsCreditCardSupported_StartBoundary) { + std::vector<std::pair<int, int>> supported_card_bin_ranges{ + std::make_pair(411111, 422222)}; + CreditCard credit_card = + GetCreditCardWithSpecifiedCardNumber("4111111111111111"); + // Credit card is supported since the card number is at the start boundary. + EXPECT_TRUE(IsCreditCardSupported(credit_card, supported_card_bin_ranges)); +} + +TEST_F(PaymentsUtilTest, IsCreditCardSupported_EndBoundary) { + std::vector<std::pair<int, int>> supported_card_bin_ranges{ + std::make_pair(410000, 411111)}; + CreditCard credit_card = + GetCreditCardWithSpecifiedCardNumber("4111111111111111"); + // Credit card is supported since the card number is at the end boundary. + EXPECT_TRUE(IsCreditCardSupported(credit_card, supported_card_bin_ranges)); +} + +TEST_F(PaymentsUtilTest, IsCreditCardSupported_OutOfRange) { + std::vector<std::pair<int, int>> supported_card_bin_ranges{ + std::make_pair(2111, 2111), std::make_pair(412, 413), + std::make_pair(300, 305)}; + CreditCard credit_card = test::GetCreditCard(); + // Credit card is not supported since the card number is out of any range. + EXPECT_FALSE(IsCreditCardSupported(credit_card, supported_card_bin_ranges)); +} + } // namespace payments } // namespace autofill
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc index dbb507bc..615bf70 100644 --- a/components/autofill/core/browser/personal_data_manager.cc +++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -512,18 +512,6 @@ } void PersonalDataManager::OnStateChanged(syncer::SyncService* sync_service) { - // TODO(mastiz,jkrcal): Once AUTOFILL_WALLET is migrated to USS, it shouldn't - // be necessary anymore to implement SyncServiceObserver; instead the - // notification should flow through the payments sync bridge. - DCHECK_EQ(sync_service_, sync_service); - syncer::UploadState upload_state = syncer::GetUploadToGoogleState( - sync_service_, syncer::ModelType::AUTOFILL_WALLET_DATA); - UMA_HISTOGRAM_ENUMERATION( - "Autofill.ResetFullServerCards.SyncServiceStatusOnStateChanged", - upload_state); - if (upload_state == syncer::UploadState::NOT_ACTIVE) { - ResetFullServerCards(); - } if (base::FeatureList::IsEnabled( autofill::features::kAutofillEnableAccountWalletStorage)) { // Use the ephemeral account storage when the user didn't enable the sync @@ -1324,11 +1312,7 @@ } // Server cards should be suggested if the sync service is active. - // We check for persistent auth errors, because we don't want to offer server - // cards when the user is in the "sync paused" state. - return sync_service_->GetActiveDataTypes().Has( - syncer::AUTOFILL_WALLET_DATA) && - !sync_service_->GetAuthError().IsPersistentError(); + return sync_service_->GetActiveDataTypes().Has(syncer::AUTOFILL_WALLET_DATA); } std::string PersonalDataManager::CountryCodeForCurrentTimezone() const {
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc index 7dd4302b..2266125 100644 --- a/components/autofill/core/browser/personal_data_manager_unittest.cc +++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -6451,37 +6451,6 @@ // These tests are not applicable on Linux since it does not support full server // cards. #if !defined(OS_LINUX) || defined(OS_CHROMEOS) -// Make sure that an auth error masks all the server cards. -TEST_F(PersonalDataManagerTest, SyncAuthErrorMasksServerCards) { - base::HistogramTester histogram_tester; - SetUpThreeCardTypes(); - - // Set an auth error and inform the personal data manager. - sync_service_.SetAuthError( - GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)); - personal_data_->OnStateChanged(&sync_service_); - WaitForOnPersonalDataChanged(); - - // Remove the auth error to be able to get the server cards. - sync_service_.SetAuthError( - GoogleServiceAuthError(GoogleServiceAuthError::NONE)); - - // Check that cards were masked and other were untouched. - EXPECT_EQ(3U, personal_data_->GetCreditCards().size()); - std::vector<CreditCard*> server_cards = - personal_data_->GetServerCreditCards(); - EXPECT_EQ(2U, server_cards.size()); - for (CreditCard* card : server_cards) - EXPECT_TRUE(card->record_type() == CreditCard::MASKED_SERVER_CARD); - - // Check that the metrics are logged correctly. - histogram_tester.ExpectUniqueSample( - "Autofill.ResetFullServerCards.SyncServiceStatusOnStateChanged", - syncer::UploadState::NOT_ACTIVE, 1); - histogram_tester.ExpectUniqueSample( - "Autofill.ResetFullServerCards.NumberOfCardsReset", 1, 1); -} - // Test that calling OnSyncServiceInitialized with a null sync service remasks // full server cards. TEST_F(PersonalDataManagerTest, OnSyncServiceInitialized_NoSyncService) { @@ -6546,31 +6515,6 @@ #endif // !defined(OS_LINUX) || defined(OS_CHROMEOS) #if !defined(OS_ANDROID) -TEST_F(PersonalDataManagerTest, SyncAuthErrorHidesServerCards) { - SetUpThreeCardTypes(); - - // Set a persistent auth error. - sync_service_.SetAuthError( - GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)); - - // Check that no server cards are available for suggestion, but that the other - // calls to get the credit cards are unaffected. - EXPECT_EQ(3U, personal_data_->GetCreditCards().size()); - EXPECT_EQ(1U, personal_data_->GetCreditCardsToSuggest(true).size()); - EXPECT_EQ(1U, personal_data_->GetLocalCreditCards().size()); - EXPECT_EQ(2U, personal_data_->GetServerCreditCards().size()); - - // Remove error. - sync_service_.SetAuthError( - GoogleServiceAuthError(GoogleServiceAuthError::NONE)); - - // Check that all cards are available. - EXPECT_EQ(3U, personal_data_->GetCreditCards().size()); - EXPECT_EQ(3U, personal_data_->GetCreditCardsToSuggest(true).size()); - EXPECT_EQ(1U, personal_data_->GetLocalCreditCards().size()); - EXPECT_EQ(2U, personal_data_->GetServerCreditCards().size()); -} - TEST_F(PersonalDataManagerTest, ExcludeServerSideCards) { SetUpThreeCardTypes();
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc index 1a86966..27e9775 100644 --- a/components/autofill/core/common/autofill_payments_features.cc +++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -90,11 +90,6 @@ const base::Feature kAutofillSaveCardImprovedUserConsent{ "AutofillSaveCardImprovedUserConsent", base::FEATURE_DISABLED_BY_DEFAULT}; -// When enabled, a sign in promo will show up right after the user -// saves a card locally. This also introduces a "Manage Cards" bubble. -const base::Feature kAutofillSaveCardSignInAfterLocalSave{ - "AutofillSaveCardSignInAfterLocalSave", base::FEATURE_ENABLED_BY_DEFAULT}; - // Controls whether offering to save cards will consider data from the Autofill // strike database. const base::Feature kAutofillSaveCreditCardUsesStrikeSystem{
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h index b0062c96..3fd80fcd 100644 --- a/components/autofill/core/common/autofill_payments_features.h +++ b/components/autofill/core/common/autofill_payments_features.h
@@ -33,7 +33,6 @@ extern const base::Feature kAutofillNoLocalSaveOnUnmaskSuccess; extern const base::Feature kAutofillNoLocalSaveOnUploadSuccess; extern const base::Feature kAutofillSaveCardImprovedUserConsent; -extern const base::Feature kAutofillSaveCardSignInAfterLocalSave; extern const base::Feature kAutofillSaveCreditCardUsesStrikeSystem; extern const base::Feature kAutofillSaveCreditCardUsesStrikeSystemV2; extern const base::Feature kAutofillSendExperimentIdsInPaymentsRPCs;
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp index bc2d948..7b3b78a3 100644 --- a/components/autofill_payments_strings.grdp +++ b/components/autofill_payments_strings.grdp
@@ -44,9 +44,11 @@ <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_ACCEPT" desc="Text to show for the Autofill save credit card prompt accept button. The prompt can be either a bubble or an infobar."> Save </message> - <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_CONFIRM" desc="Text to show for the Autofill upload save credit card prompt accept button when more information (e.g., CVC) was needed in order to save the card and was entered." formatter_data="android_java"> - Confirm - </message> + <if expr="is_android"> + <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_CONFIRM" desc="Text to show for the Autofill upload save credit card prompt accept button when more information (e.g., CVC) was needed in order to save the card and was entered." formatter_data="android_java"> + Confirm + </message> + </if> <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_CONTINUE" desc="Text to show for the Autofill upload save credit card prompt accept button when more information (e.g., CVC) was needed in order to save the card and was entered."> Continue </message> @@ -191,18 +193,20 @@ <message name="IDS_AUTOFILL_CARD_UNMASK_PROMPT_ERROR_TRY_AGAIN_CVC" desc="Error message that encourages the user to try to re-enter their credit card CVC after a previous failed attempt." formatter_data="android_java"> Check your CVC and try again </message> - <message name="IDS_AUTOFILL_CARD_UNMASK_PROMPT_ERROR_TRY_AGAIN_EXPIRATION_DATE" desc="Error message that encourages the user to try to re-enter their credit card expiration date after a previous failed attempt." formatter_data="android_java"> - Check your expiration date and try again - </message> - <message name="IDS_AUTOFILL_CARD_UNMASK_PROMPT_ERROR_TRY_AGAIN_CVC_AND_EXPIRATION" desc="Error message that encourages the user to try to re-enter their credit card expiration date and CVC after a previous failed attempt." formatter_data="android_java"> - Check your expiration date and CVC and try again - </message> - <message name="IDS_AUTOFILL_CARD_UNMASK_PROMPT_ERROR_TRY_AGAIN_EXPIRATION_MONTH" desc="Error message that encourages the user to try to re-enter their credit card expiration month after a previous failed attempt." formatter_data="android_java"> - Check your expiration month and try again - </message> - <message name="IDS_AUTOFILL_CARD_UNMASK_PROMPT_ERROR_TRY_AGAIN_EXPIRATION_YEAR" desc="Error message that encourages the user to try to re-enter their credit card expiration year after a previous failed attempt." formatter_data="android_java"> - Check your expiration year and try again - </message> + <if expr="is_android"> + <message name="IDS_AUTOFILL_CARD_UNMASK_PROMPT_ERROR_TRY_AGAIN_EXPIRATION_DATE" desc="Error message that encourages the user to try to re-enter their credit card expiration date after a previous failed attempt." formatter_data="android_java"> + Check your expiration date and try again + </message> + <message name="IDS_AUTOFILL_CARD_UNMASK_PROMPT_ERROR_TRY_AGAIN_CVC_AND_EXPIRATION" desc="Error message that encourages the user to try to re-enter their credit card expiration date and CVC after a previous failed attempt." formatter_data="android_java"> + Check your expiration date and CVC and try again + </message> + <message name="IDS_AUTOFILL_CARD_UNMASK_PROMPT_ERROR_TRY_AGAIN_EXPIRATION_MONTH" desc="Error message that encourages the user to try to re-enter their credit card expiration month after a previous failed attempt." formatter_data="android_java"> + Check your expiration month and try again + </message> + <message name="IDS_AUTOFILL_CARD_UNMASK_PROMPT_ERROR_TRY_AGAIN_EXPIRATION_YEAR" desc="Error message that encourages the user to try to re-enter their credit card expiration year after a previous failed attempt." formatter_data="android_java"> + Check your expiration year and try again + </message> + </if> <message name="IDS_AUTOFILL_CARD_UNMASK_PROMPT_ERROR_PERMANENT" desc="Error message to show when a credit card cannot be verified and the user isn't allowed to retry."> This card can't be verified right now </message> @@ -246,7 +250,7 @@ <message name="IDS_AUTOFILL_CARD_UNMASK_PROMPT_STORAGE_CHECKBOX" desc="Text for checkbox in card unmasking dialog that allows user to store a Wallet card on their local device. If checked, the dialog won't show up again for the given credit card." formatter_data="android_java"> Keep a copy of this card on this device </message> - <if expr="not is_ios"> + <if expr="is_android"> <if expr="_google_chrome"> <message name="IDS_AUTOFILL_CARD_UNMASK_PROMPT_STORAGE_TOOLTIP" desc="Text that provides further explanation for checkbox in card unmasking dialog that allows user to store a Wallet card on their local device." formatter_data="android_java"> If checked, Chrome will store a copy of your card on this device for faster form filling.
diff --git a/components/autofill_strings.grdp b/components/autofill_strings.grdp index 453771e..545985b4 100644 --- a/components/autofill_strings.grdp +++ b/components/autofill_strings.grdp
@@ -14,9 +14,6 @@ <message name="IDS_AUTOFILL_CLEAR_LOCAL_COPY_BUTTON" desc="The label of the button that clears the local copy of a Wallet Credit Card." formatter_data="android_java"> Clear copy </message> - <message name="IDS_AUTOFILL_WARNING_PAYMENT_DISABLED" desc="Warning text to show when credit card autofill is disabled because the website is not using a secure connection. This warning text is shown below a separate warning indicating that the form is not secure, so this message indicates just that payment autofilling has been disabled (not why)."> - Payment autofilling disabled - </message> <message name="IDS_AUTOFILL_WARNING_INSECURE_CONNECTION" desc="Warning text to show when credit card autofill is disabled because the website is not using a secure connection."> Automatic credit card filling is disabled because this form does not use a secure connection. </message> @@ -178,9 +175,6 @@ <ph name="EXPIRATION_MONTH">$1<ex>06</ex></ph>/<ph name="EXPIRATION_YEAR">$2<ex>17</ex></ph> </message> - <message name="IDS_AUTOFILL_CREDIT_CARD_EXPIRATION_DATE_LABEL_AND_ABBR" desc="Text displayed in the Autofill Credit Card popup before the credit card expiration date and the abbreviated expiration date."> - , exp <ph name="EXPIRATION_DATE_ABBR">$1<ex>06/17</ex></ph> - </message> <message name="IDS_AUTOFILL_CREDIT_CARD_TWO_LINE_LABEL_FROM_NAME" desc="Second line label for the autofill credit card popup when the name is selected. This text will appear below the cardholder name. [CHAR-LIMIT=32]"> <ph name="CREDIT_CARD">$1<ex>Visa - ****5679</ex></ph>, expires on <ph name="EXPIRATION_DATE_ABBR">$2<ex>06/17</ex></ph> </message> @@ -191,9 +185,6 @@ <message name="IDS_AUTOFILL_LOADING_REGIONS" desc="The string to display in the regions combobox while loading the region data."> Loading... </message> - <message name="IDS_AUTOFILL_FAILED_LOADING_REGIONS" desc="The string to display in the regions combo box when loading the region data failed."> - Failed loading regions data - </message> <message name="IDS_AUTOFILL_SELECT" desc="The string to display in comboboxes when nothing got selected yet."> Select </message> @@ -219,12 +210,6 @@ <message name="IDS_AUTOFILL_PAYMENT_METHODS" desc="Title for the list of saved payment methods that can be used to fill in forms. Also used as the title for the Autofill settings page that allows user to manage their list of saved payment methods and Autofill preferences for payment methods. Sentence-Cased." formatter_data="android_java"> Payment methods </message> - <message name="IDS_AUTOFILL_LOCAL_PAYMENT_METHODS" desc="Title for the list of saved local payment methods that can be used to fill in forms. Sentence-Cased."> - On this device - </message> - <message name="IDS_AUTOFILL_SERVER_PAYMENT_METHODS" desc="Title for the list of saved server payment methods that can be used to fill in forms. Sentence-Cased."> - In your Google Account - </message> <message name="IDS_AUTOFILL_ENABLE_PROFILES_TOGGLE_LABEL" desc="Label for a toggle that allows users to control whether addresses should be saved and forms should be autofilled with them. Sentence-Cased." formatter_data="android_java"> Save and fill addresses </message>
diff --git a/components/cast_channel/cast_socket_unittest.cc b/components/cast_channel/cast_socket_unittest.cc index 3a4fb953..941e7c7 100644 --- a/components/cast_channel/cast_socket_unittest.cc +++ b/components/cast_channel/cast_socket_unittest.cc
@@ -345,7 +345,6 @@ bool using_spdy, net::NextProto negotiated_protocol, net::ProxyDelegate* proxy_delegate, - bool is_https_proxy, const net::NetworkTrafficAnnotationTag& traffic_annotation) override { NOTIMPLEMENTED(); return nullptr;
diff --git a/components/crash/content/app/crashpad_linux.cc b/components/crash/content/app/crashpad_linux.cc index 8e47645..8fdee23 100644 --- a/components/crash/content/app/crashpad_linux.cc +++ b/components/crash/content/app/crashpad_linux.cc
@@ -34,6 +34,7 @@ #include "third_party/crashpad/crashpad/client/simulate_crash_linux.h" #include "third_party/crashpad/crashpad/snapshot/sanitized/sanitization_information.h" #include "third_party/crashpad/crashpad/util/linux/exception_handler_client.h" +#include "third_party/crashpad/crashpad/util/linux/exception_handler_protocol.h" #include "third_party/crashpad/crashpad/util/linux/exception_information.h" #include "third_party/crashpad/crashpad/util/linux/scoped_pr_set_dumpable.h" #include "third_party/crashpad/crashpad/util/misc/from_pointer_cast.h" @@ -77,7 +78,7 @@ void SetClientInformation(ExceptionInformation* exception, SanitizationInformation* sanitization, - ClientInformation* info) { + ExceptionHandlerProtocol::ClientInformation* info) { info->exception_information_address = FromPointerCast<decltype(info->exception_information_address)>(exception); @@ -128,7 +129,7 @@ SetExceptionInformation(siginfo, static_cast<ucontext_t*>(context), &exception_information); - ClientInformation info; + ExceptionHandlerProtocol::ClientInformation info; SetClientInformation(&exception_information, &sanitization_, &info); ScopedPrSetDumpable set_dumpable(/* may_log= */ false); @@ -664,7 +665,7 @@ crashpad::ExceptionInformation exception; crashpad::SetExceptionInformation(&siginfo, &context, &exception); - crashpad::ClientInformation info; + crashpad::ExceptionHandlerProtocol::ClientInformation info; crashpad::SetClientInformation(&exception, &sanitization, &info); crashpad::ScopedPrSetDumpable set_dumpable(/* may_log= */ false);
diff --git a/components/cronet/cronet_prefs_manager.cc b/components/cronet/cronet_prefs_manager.cc index 51b3ebd..5d13983 100644 --- a/components/cronet/cronet_prefs_manager.cc +++ b/components/cronet/cronet_prefs_manager.cc
@@ -254,7 +254,6 @@ } { - SCOPED_UMA_HISTOGRAM_TIMER("Net.Cronet.PrefsInitTime"); base::ScopedAllowBlocking allow_blocking; pref_service_ = factory.Create(registry.get()); }
diff --git a/components/cronet/tools/cr_cronet.py b/components/cronet/tools/cr_cronet.py index cba2e20f..5c58e2d 100755 --- a/components/cronet/tools/cr_cronet.py +++ b/components/cronet/tools/cr_cronet.py
@@ -9,60 +9,74 @@ import argparse import os +import pipes +import subprocess import sys -def run(command, extra_options=''): + +def quoted_args(args): + return ' '.join([pipes.quote(arg) for arg in args]) + + +def run(command, **kwargs): + print command, kwargs + return subprocess.call(command, **kwargs) + + +def run_shell(command, extra_options=''): command = command + ' ' + extra_options print command return os.system(command) -def gn(out_dir, gn_args, gn_extra=''): - return run ('gn gen %s --args=\'%s\' %s' % (out_dir, gn_args, gn_extra)) +def gn(out_dir, gn_args, gn_extra=[]): + return run(['gn', 'gen', out_dir, "--args=%s" % gn_args] + gn_extra) -def build(out_dir, build_target, extra_options=''): - return run('ninja -C ' + out_dir + ' ' + build_target, - get_ninja_jobs_option() + extra_options) +def build(out_dir, build_target, extra_options=[]): + return run(['ninja', '-C', out_dir, build_target] + + get_ninja_jobs_options() + extra_options) def install(out_dir): - cmd = 'BUILDTYPE=' + out_dir[4:] + ' build/android/adb_install_apk.py {0}' - return run(cmd.format('CronetTestInstrumentation.apk')) or \ - run(cmd.format('ChromiumNetTestSupport.apk')) + cmd = ['build/android/adb_install_apk.py'] + env = {'BUILDTYPE': out_dir[4:]} + return run(cmd + ['CronetTestInstrumentation.apk'], env=env) or \ + run(cmd + ['ChromiumNetTestSupport.apk'], env=env) def test(out_dir, extra_options): - return run(out_dir + '/bin/run_cronet_test_instrumentation_apk ' + \ + return run([out_dir + '/bin/run_cronet_test_instrumentation_apk'] + extra_options) def unittest(out_dir, extra_options): - return run(out_dir + '/bin/run_cronet_unittests_android ' + \ + return run([out_dir + '/bin/run_cronet_unittests_android'] + extra_options) def test_ios(out_dir, extra_options): - return run(out_dir + '/iossim -c "' + extra_options + '" ' + \ - out_dir + '/cronet_test.app') + return run([out_dir + '/iossim', '-c', quoted_args(extra_options), + out_dir + '/cronet_test.app']) def unittest_ios(out_dir, extra_options): - return run(out_dir + '/iossim -c "' + extra_options + '" ' + \ - out_dir + '/cronet_unittests_ios.app') + return run([out_dir + '/iossim', '-c', quoted_args(extra_options), + out_dir + '/cronet_unittests_ios.app']) def debug(extra_options): - return run('build/android/adb_gdb --start ' + \ - '--activity=.CronetTestActivity ' + \ - '--program-name=CronetTest ' + \ - '--package-name=org.chromium.net', + return run(['build/android/adb_gdb', '--start', + '--activity=.CronetTestActivity', + '--program-name=CronetTest', + '--package-name=org.chromium.net'] + extra_options) def stack(out_dir): - return run('adb logcat -d | CHROMIUM_OUTPUT_DIR=' + out_dir + - ' third_party/android_platform/development/scripts/stack') + return run_shell( + 'adb logcat -d | CHROMIUM_OUTPUT_DIR=' + pipes.quote(out_dir) + + ' third_party/android_platform/development/scripts/stack') def use_goma(): @@ -73,10 +87,10 @@ return '' -def get_ninja_jobs_option(): +def get_ninja_jobs_options(): if use_goma(): - return " -j1000 " - return "" + return ["-j1000"] + return [] def get_default_gn_args(target_os, is_release): @@ -138,15 +152,15 @@ parser.add_argument('-a', '--asan', action='store_true', help='use address sanitizer') - options, extra_options_list = parser.parse_known_args() + options, extra_options = parser.parse_known_args() print options - print extra_options_list + print extra_options is_ios = (sys.platform == 'darwin') if is_ios: test_target = 'cronet_test' unit_target = 'cronet_unittests_ios' - gn_extra = '--ide=xcode' + gn_extra = ['--ide=xcode'] if options.iphoneos: gn_args = get_ios_gn_args(options.release, 'arm64') out_dir_suffix = '-iphoneos' @@ -162,7 +176,7 @@ gn_args = get_mobile_gn_args('android', options.release) + \ 'use_errorprone_java_compiler=true enable_reporting=true ' + \ 'use_hashed_jni_names=true ' - gn_extra = '' + gn_extra = [] out_dir_suffix = '' if options.x86: gn_args += 'target_cpu="x86" ' @@ -175,8 +189,6 @@ gn_args += 'is_asan=true is_clang=true is_debug=false ' out_dir_suffix += '-asan' - extra_options = ' '.join(extra_options_list) - if options.release: out_dir = 'out/Release' + out_dir_suffix else: @@ -188,14 +200,14 @@ if (options.command=='gn'): return gn(out_dir, gn_args, gn_extra) if (options.command=='sync'): - return run('git pull --rebase && gclient sync') + return run(['git', 'pull', '--rebase']) or run(['gclient', 'sync']) if (options.command=='build'): return build(out_dir, test_target, extra_options) if (not is_ios): if (options.command=='install'): return install(out_dir) if (options.command=='proguard'): - return build (out_dir, 'cronet_sample_proguard_apk') + return build(out_dir, 'cronet_sample_proguard_apk') if (options.command=='test'): return install(out_dir) or test(out_dir, extra_options) if (options.command=='build-test'):
diff --git a/components/ntp_tiles/OWNERS b/components/ntp_tiles/OWNERS index e5dfa00..91a328f 100644 --- a/components/ntp_tiles/OWNERS +++ b/components/ntp_tiles/OWNERS
@@ -1,4 +1,5 @@ fhorschig@chromium.org jkrcal@chromium.org +kristipark@chromium.org mastiz@chromium.org treib@chromium.org
diff --git a/components/omnibox/browser/BUILD.gn b/components/omnibox/browser/BUILD.gn index 2f15596..a8d2f28 100644 --- a/components/omnibox/browser/BUILD.gn +++ b/components/omnibox/browser/BUILD.gn
@@ -206,6 +206,7 @@ "//base", "//components/history/core/browser", "//components/omnibox/common", + "//components/omnibox/resources:omnibox_resources", "//components/security_state/core", "//third_party/metrics_proto", "//url",
diff --git a/components/omnibox/browser/omnibox_pedal_concepts.h b/components/omnibox/browser/omnibox_pedal_concepts.h index cff4d04..fb316dc 100644 --- a/components/omnibox/browser/omnibox_pedal_concepts.h +++ b/components/omnibox/browser/omnibox_pedal_concepts.h
@@ -8,7 +8,7 @@ #define COMPONENTS_OMNIBOX_BROWSER_OMNIBOX_PEDAL_CONCEPTS_H_ // The runtime loaded data must match this version exactly. -constexpr int OMNIBOX_PEDAL_CONCEPTS_DATA_VERSION = 14729733; +constexpr int OMNIBOX_PEDAL_CONCEPTS_DATA_VERSION = 14776860; // Unique identifiers for Pedals, used to bind loaded data to implementations. enum class OmniboxPedalId {
diff --git a/components/omnibox/browser/omnibox_pedal_implementations_unittest.cc b/components/omnibox/browser/omnibox_pedal_implementations_unittest.cc index 0b3fa75..777c470 100644 --- a/components/omnibox/browser/omnibox_pedal_implementations_unittest.cc +++ b/components/omnibox/browser/omnibox_pedal_implementations_unittest.cc
@@ -64,7 +64,7 @@ const std::vector<std::vector<const char*>> literal_concept_expressions = { // Note: The lists below are auto-generated from raw synonym group data. - // Clear Browsing Data + // CLEAR_BROWSING_DATA { "browser cache clear", "browser cache delete", @@ -96,11 +96,46 @@ "browser wipe cache", "browser wipe data", "browser wipe history", + "browsing cache clear", + "browsing cache delete", + "browsing cache erase", + "browsing cache remove", + "browsing cache wipe", + "browsing clear cache", + "browsing clear data", + "browsing clear history", + "browsing data clear", + "browsing data delete", + "browsing data erase", + "browsing data remove", + "browsing data wipe", + "browsing delete cache", + "browsing delete data", + "browsing delete history", + "browsing erase cache", + "browsing erase data", + "browsing erase history", + "browsing history clear", + "browsing history delete", + "browsing history erase", + "browsing history remove", + "browsing history wipe", + "browsing remove cache", + "browsing remove data", + "browsing remove history", + "browsing wipe cache", + "browsing wipe data", + "browsing wipe history", "cache browser clear", "cache browser delete", "cache browser erase", "cache browser remove", "cache browser wipe", + "cache browsing clear", + "cache browsing delete", + "cache browsing erase", + "cache browsing remove", + "cache browsing wipe", "cache chrome clear", "cache chrome delete", "cache chrome erase", @@ -108,14 +143,17 @@ "cache chrome wipe", "cache clear", "cache clear browser", + "cache clear browsing", "cache clear chrome", "cache clear google chrome", "cache delete", "cache delete browser", + "cache delete browsing", "cache delete chrome", "cache delete google chrome", "cache erase", "cache erase browser", + "cache erase browsing", "cache erase chrome", "cache erase google chrome", "cache google chrome clear", @@ -125,10 +163,12 @@ "cache google chrome wipe", "cache remove", "cache remove browser", + "cache remove browsing", "cache remove chrome", "cache remove google chrome", "cache wipe", "cache wipe browser", + "cache wipe browsing", "cache wipe chrome", "cache wipe google chrome", "chrome cache clear", @@ -164,8 +204,12 @@ "clear browser cache", "clear browser data", "clear browser history", + "clear browsing cache", + "clear browsing data", + "clear browsing history", "clear cache", "clear cache browser", + "clear cache browsing", "clear cache chrome", "clear cache google chrome", "clear chrome cache", @@ -173,6 +217,7 @@ "clear chrome history", "clear data", "clear data browser", + "clear data browsing", "clear data chrome", "clear data google chrome", "clear google chrome cache", @@ -180,6 +225,7 @@ "clear google chrome history", "clear history", "clear history browser", + "clear history browsing", "clear history chrome", "clear history google chrome", "data browser clear", @@ -187,6 +233,11 @@ "data browser erase", "data browser remove", "data browser wipe", + "data browsing clear", + "data browsing delete", + "data browsing erase", + "data browsing remove", + "data browsing wipe", "data chrome clear", "data chrome delete", "data chrome erase", @@ -194,14 +245,17 @@ "data chrome wipe", "data clear", "data clear browser", + "data clear browsing", "data clear chrome", "data clear google chrome", "data delete", "data delete browser", + "data delete browsing", "data delete chrome", "data delete google chrome", "data erase", "data erase browser", + "data erase browsing", "data erase chrome", "data erase google chrome", "data google chrome clear", @@ -211,17 +265,23 @@ "data google chrome wipe", "data remove", "data remove browser", + "data remove browsing", "data remove chrome", "data remove google chrome", "data wipe", "data wipe browser", + "data wipe browsing", "data wipe chrome", "data wipe google chrome", "delete browser cache", "delete browser data", "delete browser history", + "delete browsing cache", + "delete browsing data", + "delete browsing history", "delete cache", "delete cache browser", + "delete cache browsing", "delete cache chrome", "delete cache google chrome", "delete chrome cache", @@ -229,6 +289,7 @@ "delete chrome history", "delete data", "delete data browser", + "delete data browsing", "delete data chrome", "delete data google chrome", "delete google chrome cache", @@ -236,13 +297,18 @@ "delete google chrome history", "delete history", "delete history browser", + "delete history browsing", "delete history chrome", "delete history google chrome", "erase browser cache", "erase browser data", "erase browser history", + "erase browsing cache", + "erase browsing data", + "erase browsing history", "erase cache", "erase cache browser", + "erase cache browsing", "erase cache chrome", "erase cache google chrome", "erase chrome cache", @@ -250,6 +316,7 @@ "erase chrome history", "erase data", "erase data browser", + "erase data browsing", "erase data chrome", "erase data google chrome", "erase google chrome cache", @@ -257,6 +324,7 @@ "erase google chrome history", "erase history", "erase history browser", + "erase history browsing", "erase history chrome", "erase history google chrome", "google chrome cache clear", @@ -294,6 +362,11 @@ "history browser erase", "history browser remove", "history browser wipe", + "history browsing clear", + "history browsing delete", + "history browsing erase", + "history browsing remove", + "history browsing wipe", "history chrome clear", "history chrome delete", "history chrome erase", @@ -301,14 +374,17 @@ "history chrome wipe", "history clear", "history clear browser", + "history clear browsing", "history clear chrome", "history clear google chrome", "history delete", "history delete browser", + "history delete browsing", "history delete chrome", "history delete google chrome", "history erase", "history erase browser", + "history erase browsing", "history erase chrome", "history erase google chrome", "history google chrome clear", @@ -318,17 +394,23 @@ "history google chrome wipe", "history remove", "history remove browser", + "history remove browsing", "history remove chrome", "history remove google chrome", "history wipe", "history wipe browser", + "history wipe browsing", "history wipe chrome", "history wipe google chrome", "remove browser cache", "remove browser data", "remove browser history", + "remove browsing cache", + "remove browsing data", + "remove browsing history", "remove cache", "remove cache browser", + "remove cache browsing", "remove cache chrome", "remove cache google chrome", "remove chrome cache", @@ -336,6 +418,7 @@ "remove chrome history", "remove data", "remove data browser", + "remove data browsing", "remove data chrome", "remove data google chrome", "remove google chrome cache", @@ -343,13 +426,18 @@ "remove google chrome history", "remove history", "remove history browser", + "remove history browsing", "remove history chrome", "remove history google chrome", "wipe browser cache", "wipe browser data", "wipe browser history", + "wipe browsing cache", + "wipe browsing data", + "wipe browsing history", "wipe cache", "wipe cache browser", + "wipe cache browsing", "wipe cache chrome", "wipe cache google chrome", "wipe chrome cache", @@ -357,6 +445,7 @@ "wipe chrome history", "wipe data", "wipe data browser", + "wipe data browsing", "wipe data chrome", "wipe data google chrome", "wipe google chrome cache", @@ -364,11 +453,12 @@ "wipe google chrome history", "wipe history", "wipe history browser", + "wipe history browsing", "wipe history chrome", "wipe history google chrome", }, - // Change Search Engine + // CHANGE_SEARCH_ENGINE { "browser change default search engine", "browser change search", @@ -692,7 +782,7 @@ "switch standard search engine google chrome", }, - // Manage Passwords + // MANAGE_PASSWORDS { "browser change passwords", "browser manage passwords", @@ -776,7 +866,7 @@ "update passwords google chrome", }, - // Change Home Page + // CHANGE_HOME_PAGE { "browser change home page", "browser change homepage", @@ -900,7 +990,7 @@ "set homepage google chrome", }, - // Update Credit Card + // UPDATE_CREDIT_CARD { "browser card info edit", "browser card info update", @@ -1104,7 +1194,7 @@ "update google chrome credit cards", }, - // Launch Incognito + // LAUNCH_INCOGNITO { "browser enter incognito", "browser enter incognito mode", @@ -1668,7 +1758,7 @@ "start private window google chrome", }, - // Translate + // TRANSLATE { "browser change language page", "browser change language this", @@ -1792,7 +1882,7 @@ "translate this page google chrome", }, - // Update Chrome + // UPDATE_CHROME { "browser install", "browser update",
diff --git a/components/omnibox/browser/omnibox_pedal_provider.cc b/components/omnibox/browser/omnibox_pedal_provider.cc index 59e466ac..bdc335e5 100644 --- a/components/omnibox/browser/omnibox_pedal_provider.cc +++ b/components/omnibox/browser/omnibox_pedal_provider.cc
@@ -10,10 +10,10 @@ #include "base/strings/string_tokenizer.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" -#include "components/grit/components_resources.h" #include "components/omnibox/browser/autocomplete_provider_client.h" #include "components/omnibox/browser/omnibox_pedal.h" #include "components/omnibox/browser/omnibox_pedal_implementations.h" +#include "components/omnibox/resources/grit/omnibox_resources.h" #include "third_party/zlib/google/compression_utils.h" #include "ui/base/resource/resource_bundle.h" @@ -96,9 +96,11 @@ void OmniboxPedalProvider::LoadPedalConcepts() { // Get raw gzipped data, uncompress it, then parse to base::Value for loading. - base::StringPiece compressed_data = - ui::ResourceBundle::GetSharedInstance().GetRawDataResource( + scoped_refptr<base::RefCountedMemory> bytes = + ui::ResourceBundle::GetSharedInstance().LoadLocalizedResourceBytes( IDR_OMNIBOX_PEDAL_CONCEPTS); + DCHECK(bytes); + base::StringPiece compressed_data(bytes->front_as<char>(), bytes->size()); std::string uncompressed_data; uncompressed_data.resize(compression::GetUncompressedSize(compressed_data)); CHECK(compression::GzipUncompress(compressed_data, uncompressed_data));
diff --git a/components/omnibox/resources/BUILD.gn b/components/omnibox/resources/BUILD.gn new file mode 100644 index 0000000..aef773e3 --- /dev/null +++ b/components/omnibox/resources/BUILD.gn
@@ -0,0 +1,16 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/locales.gni") +import("//tools/grit/grit_rule.gni") + +grit("omnibox_resources") { + source = "omnibox_resources.grd" + outputs = [ + "grit/omnibox_resources.h", + ] + foreach(locale, locales_with_fake_bidi) { + outputs += [ "omnibox_resources_$locale.pak" ] + } +}
diff --git a/components/omnibox/resources/omnibox_pedal_concepts.json b/components/omnibox/resources/omnibox_pedal_concepts.json deleted file mode 100644 index 279038c..0000000 --- a/components/omnibox/resources/omnibox_pedal_concepts.json +++ /dev/null
@@ -1 +0,0 @@ -{"schema":"pedal_concepts_runtime","schema_version":1,"data_version":14729733,"tokenize_characters":" ","dictionary":["a","an","browser","cache","card","cards","change","choose","chrome","clear","credit","data","default","delete","do","edit","engine","enter","erase","for","google","history","home","homepage","how","i","in","incognito","info","inside","install","language","launch","manage","manager","mode","my","on","open","page","passwords","private","remove","search","select","set","standard","start","switch","tab","the","this","to","translate","update","upgrade","window","wipe","within"],"pedals":[{"name":"CLEAR_BROWSING_DATA","id":1,"groups":[{"required":false,"single":true,"synonyms":[[20,8],[2],[8]]},{"required":true,"single":true,"synonyms":[[13],[42],[18],[9],[57]]},{"required":true,"single":true,"synonyms":[[21],[3],[11]]}]},{"name":"CHANGE_SEARCH_ENGINE","id":2,"groups":[{"required":false,"single":true,"synonyms":[[20,8],[2],[8]]},{"required":true,"single":true,"synonyms":[[7],[6],[48],[44]]},{"required":true,"single":true,"synonyms":[[46,43,16],[12,43,16],[43,16],[43]]}]},{"name":"MANAGE_PASSWORDS","id":3,"groups":[{"required":false,"single":true,"synonyms":[[20,8],[2],[8]]},{"required":true,"single":true,"synonyms":[[34],[33],[54],[6]]},{"required":true,"single":true,"synonyms":[[40]]}]},{"name":"CHANGE_HOME_PAGE","id":4,"groups":[{"required":false,"single":true,"synonyms":[[20,8],[2],[8]]},{"required":true,"single":true,"synonyms":[[6],[7],[45]]},{"required":true,"single":true,"synonyms":[[22,39],[23]]}]},{"name":"UPDATE_CREDIT_CARD","id":5,"groups":[{"required":false,"single":true,"synonyms":[[20,8],[2],[8]]},{"required":true,"single":true,"synonyms":[[54],[15]]},{"required":true,"single":true,"synonyms":[[10,4,28],[10,5],[10,4],[4,28],[5]]}]},{"name":"LAUNCH_INCOGNITO","id":6,"groups":[{"required":false,"single":true,"synonyms":[[20,8],[2],[8]]},{"required":true,"single":true,"synonyms":[[32],[47],[17],[38]]},{"required":true,"single":true,"synonyms":[[27,56],[27,35],[41,56],[27,49],[41,35],[41,49],[27]]}]},{"name":"TRANSLATE","id":7,"groups":[{"required":false,"single":true,"synonyms":[[20,8],[2],[8]]},{"required":true,"single":true,"synonyms":[[6,31],[53]]},{"required":true,"single":true,"synonyms":[[51,39],[39],[51]]}]},{"name":"UPDATE_CHROME","id":8,"groups":[{"required":true,"single":true,"synonyms":[[20,8],[2],[8]]},{"required":true,"single":true,"synonyms":[[55],[30],[54]]}]}],"ignore_group":{"required":false,"single":false,"synonyms":[[29],[58],[19],[24],[50],[1],[14],[26],[36],[37],[52],[0],[25]]},"max_tokens":32} \ No newline at end of file
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_de.json b/components/omnibox/resources/omnibox_pedal_concepts_de.json new file mode 100644 index 0000000..6c53d2a --- /dev/null +++ b/components/omnibox/resources/omnibox_pedal_concepts_de.json
@@ -0,0 +1 @@ +{"schema":"pedal_concepts_runtime","schema_version":1,"data_version":14776860,"tokenize_characters":" -","dictionary":["aktualisieren","anschauen","anzeigen","arbeiten","aus","bearbeiten","browser","browserdaten","browserverlauf","cache","chrome","daten","den","die","diese","ein","einstellen","einstellungen","entfernen","fenster","google","ich","im","in","inkognito","inkognitofenster","inkognitomodus","installieren","kann","karte","kartendaten","kredit","kreditkarte","kreditkartendaten","leeren","löschen","man","mein","meine","meinem","meinen","mit","modus","passwort","passwörter","privat","privatmodus","sein","seine","seinem","seinen","seite","sprache","standard","standardeinstellung","standardsuche","standardsuchmaschine","start","starten","startseite","suche","sucheinstellung","suchmaschine","suchverlauf","surfen","umstellen","update","upgrade","upgraden","verlauf","verwalten","webseite","website","wechseln","wie","wo","ändern","öffnen","übersetzen"],"pedals":[{"name":"CLEAR_BROWSING_DATA","id":1,"groups":[{"required":false,"single":true,"synonyms":[[20,10],[6],[10]]},{"required":true,"single":true,"synonyms":[[18],[35],[34]]},{"required":true,"single":true,"synonyms":[[8],[7],[63],[69],[9],[11]]}]},{"name":"CHANGE_SEARCH_ENGINE","id":2,"groups":[{"required":false,"single":true,"synonyms":[[20,10],[6],[10],[20]]},{"required":true,"single":true,"synonyms":[[16],[65],[73],[76]]},{"required":true,"single":true,"synonyms":[[54,60],[53,62],[53,62],[17,60],[53,60],[56],[61],[55],[62]]}]},{"name":"MANAGE_PASSWORDS","id":3,"groups":[{"required":false,"single":true,"synonyms":[[20,10],[6],[10]]},{"required":true,"single":true,"synonyms":[[70],[1],[2],[76]]},{"required":true,"single":true,"synonyms":[[44],[43]]}]},{"name":"CHANGE_HOME_PAGE","id":4,"groups":[{"required":false,"single":true,"synonyms":[[20,10],[6],[10]]},{"required":true,"single":true,"synonyms":[[16],[65],[73],[76]]},{"required":true,"single":true,"synonyms":[[57,51],[59]]}]},{"name":"UPDATE_CREDIT_CARD","id":5,"groups":[{"required":false,"single":true,"synonyms":[[20,10],[6],[10]]},{"required":true,"single":true,"synonyms":[[0],[5],[76]]},{"required":true,"single":true,"synonyms":[[31,29],[33],[32],[30]]}]},{"name":"LAUNCH_INCOGNITO","id":6,"groups":[{"required":false,"single":true,"synonyms":[[20,10],[6],[10]]},{"required":true,"single":true,"synonyms":[[3],[58],[77],[64]]},{"required":true,"single":true,"synonyms":[[24,19],[24,42],[45,42],[25],[26],[46],[24],[45]]}]},{"name":"TRANSLATE","id":7,"groups":[{"required":false,"single":true,"synonyms":[[20,10],[6],[10]]},{"required":true,"single":true,"synonyms":[[52,76],[78]]},{"required":true,"single":true,"synonyms":[[14,71],[14,72],[14,51],[71],[72],[51]]},{"required":true,"single":true,"synonyms":[[14]]}]},{"name":"UPDATE_CHROME","id":8,"groups":[{"required":true,"single":true,"synonyms":[[20,10],[6],[10]]},{"required":true,"single":true,"synonyms":[[0],[27],[68],[67],[66]]}]}],"ignore_group":{"required":false,"single":false,"synonyms":[[39],[49],[50],[40],[38],[48],[28],[37],[47],[74],[21],[36],[13],[4],[41],[12],[15],[75],[23],[22]]},"max_tokens":32} \ No newline at end of file
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_en.json b/components/omnibox/resources/omnibox_pedal_concepts_en.json new file mode 100644 index 0000000..9d50e88 --- /dev/null +++ b/components/omnibox/resources/omnibox_pedal_concepts_en.json
@@ -0,0 +1 @@ +{"schema":"pedal_concepts_runtime","schema_version":1,"data_version":14776860,"tokenize_characters":" -","dictionary":["a","an","browser","browsing","cache","card","cards","change","choose","chrome","clear","credit","data","default","delete","do","edit","engine","enter","erase","for","google","history","home","homepage","how","i","in","incognito","info","inside","install","language","launch","manage","manager","mode","my","on","open","page","passwords","private","remove","search","select","set","standard","start","switch","tab","the","this","to","translate","update","upgrade","window","wipe","within"],"pedals":[{"name":"CLEAR_BROWSING_DATA","id":1,"groups":[{"required":false,"single":true,"synonyms":[[21,9],[3],[2],[9]]},{"required":true,"single":true,"synonyms":[[14],[43],[19],[10],[58]]},{"required":true,"single":true,"synonyms":[[22],[4],[12]]}]},{"name":"CHANGE_SEARCH_ENGINE","id":2,"groups":[{"required":false,"single":true,"synonyms":[[21,9],[2],[9]]},{"required":true,"single":true,"synonyms":[[8],[7],[49],[45]]},{"required":true,"single":true,"synonyms":[[47,44,17],[13,44,17],[44,17],[44]]}]},{"name":"MANAGE_PASSWORDS","id":3,"groups":[{"required":false,"single":true,"synonyms":[[21,9],[2],[9]]},{"required":true,"single":true,"synonyms":[[35],[34],[55],[7]]},{"required":true,"single":true,"synonyms":[[41]]}]},{"name":"CHANGE_HOME_PAGE","id":4,"groups":[{"required":false,"single":true,"synonyms":[[21,9],[2],[9]]},{"required":true,"single":true,"synonyms":[[7],[8],[46]]},{"required":true,"single":true,"synonyms":[[23,40],[24]]}]},{"name":"UPDATE_CREDIT_CARD","id":5,"groups":[{"required":false,"single":true,"synonyms":[[21,9],[2],[9]]},{"required":true,"single":true,"synonyms":[[55],[16]]},{"required":true,"single":true,"synonyms":[[11,5,29],[11,6],[11,5],[5,29],[6]]}]},{"name":"LAUNCH_INCOGNITO","id":6,"groups":[{"required":false,"single":true,"synonyms":[[21,9],[2],[9]]},{"required":true,"single":true,"synonyms":[[33],[48],[18],[39]]},{"required":true,"single":true,"synonyms":[[28,57],[28,36],[42,57],[28,50],[42,36],[42,50],[28]]}]},{"name":"TRANSLATE","id":7,"groups":[{"required":false,"single":true,"synonyms":[[21,9],[2],[9]]},{"required":true,"single":true,"synonyms":[[7,32],[54]]},{"required":true,"single":true,"synonyms":[[52,40],[40],[52]]}]},{"name":"UPDATE_CHROME","id":8,"groups":[{"required":true,"single":true,"synonyms":[[21,9],[2],[9]]},{"required":true,"single":true,"synonyms":[[56],[31],[55]]}]}],"ignore_group":{"required":false,"single":false,"synonyms":[[30],[59],[20],[25],[51],[1],[15],[27],[37],[38],[53],[0],[26]]},"max_tokens":32} \ No newline at end of file
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_fr.json b/components/omnibox/resources/omnibox_pedal_concepts_fr.json new file mode 100644 index 0000000..7465d15 --- /dev/null +++ b/components/omnibox/resources/omnibox_pedal_concepts_fr.json
@@ -0,0 +1 @@ +{"schema":"pedal_concepts_runtime","schema_version":1,"data_version":14776860,"tokenize_characters":" -","dictionary":["accueil","actualise","actualiser","autre","bancaire","bancaires","cache","carte","cartes","cette","change","changer","choisir","choisis","choisit","chrome","confidentialité","confidentielle","crédit","d'accueil","dans","de","dernière","des","données","défaut","définir","définis","définit","démarre","démarrer","efface","effacer","enlever","enlève","fenetre","fenêtre","gestionnaire","google","gère","gérer","historique","homepage","incognito","informations","infos","installe","installer","jour","la","lance","lancer","langue","le","les","met","mets","mettre","mode","modifie","modifier","mot","moteur","mots","navigateur","navigation","naviguer","niveau","onglet","ouvre","ouvrir","page","paiement","par","passe","passer","privé","privée","recherche","sans","standard","supprime","supprimer","sélectionne","sélectionner","traces","traduire","traduis","traduit","un","une","version","vide","vider","à"],"pedals":[{"name":"CLEAR_BROWSING_DATA","id":1,"groups":[{"required":false,"single":true,"synonyms":[[38,15],[64],[15]]},{"required":true,"single":true,"synonyms":[[82],[81],[32],[33],[34],[31],[93],[92]]},{"required":true,"single":true,"synonyms":[[44],[41],[65],[24],[85],[6],[45]]}]},{"name":"CHANGE_SEARCH_ENGINE","id":2,"groups":[{"required":false,"single":true,"synonyms":[[38,15],[64],[15]]},{"required":true,"single":true,"synonyms":[[84],[83],[2],[1],[60],[12],[11],[13],[14],[59],[75],[10],[74]]},{"required":true,"single":true,"synonyms":[[62,78,73,25],[62,78,80],[3,62,78],[62,78],[78]]}]},{"name":"MANAGE_PASSWORDS","id":3,"groups":[{"required":false,"single":true,"synonyms":[[38,15],[64],[15]]},{"required":true,"single":true,"synonyms":[[57,94,48],[56,94,48],[55,94,48],[55,94,48],[37],[2],[1],[60],[11],[59],[40],[10],[39]]},{"required":true,"single":true,"synonyms":[[63,74],[61,74]]}]},{"name":"CHANGE_HOME_PAGE","id":4,"groups":[{"required":false,"single":true,"synonyms":[[38,15],[64],[15]]},{"required":true,"single":true,"synonyms":[[2],[1],[26],[60],[27],[28],[11],[12],[13],[14],[59]]},{"required":true,"single":true,"synonyms":[[71,19],[71,0],[42]]}]},{"name":"UPDATE_CREDIT_CARD","id":5,"groups":[{"required":false,"single":true,"synonyms":[[38,15],[64],[15]]},{"required":true,"single":true,"synonyms":[[57,94,48],[56,94,48],[55,94,48],[2],[1],[60],[11],[59],[10]]},{"required":true,"single":true,"synonyms":[[45,7,18],[44,7],[8,72],[8,18],[7,72],[58,72],[44,5],[8,5],[45,5],[7,4],[8]]}]},{"name":"LAUNCH_INCOGNITO","id":6,"groups":[{"required":false,"single":true,"synonyms":[[38,15],[64],[15]]},{"required":true,"single":true,"synonyms":[[84],[83],[30],[66],[29],[12],[13],[14],[51],[75],[70],[50],[74],[69]]},{"required":true,"single":true,"synonyms":[[65,17],[36,17],[58,16],[65,77],[36,77],[68,43],[35,77],[58,43],[68,76],[58,76],[79,85],[16],[43]]}]},{"name":"TRANSLATE","id":7,"groups":[{"required":false,"single":true,"synonyms":[[38,15],[64],[15]]},{"required":true,"single":true,"synonyms":[[84,52],[83,52],[11,52],[10,52],[86],[87],[88]]},{"required":true,"single":true,"synonyms":[[9,71],[9,71],[71]]}]},{"name":"UPDATE_CHROME","id":8,"groups":[{"required":true,"single":true,"synonyms":[[38,15],[64],[15]]},{"required":true,"single":true,"synonyms":[[57,94,67],[57,94,48],[56,94,67],[55,94,67],[56,94,48],[55,94,48],[2],[47],[1],[46]]},{"required":true,"single":true,"synonyms":[[22,91]]}]}],"ignore_group":{"required":false,"single":false,"synonyms":[[20],[90],[23],[54],[89],[21],[53],[49]]},"max_tokens":32} \ No newline at end of file
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_ja.json b/components/omnibox/resources/omnibox_pedal_concepts_ja.json new file mode 100644 index 0000000..54cd856 --- /dev/null +++ b/components/omnibox/resources/omnibox_pedal_concepts_ja.json
@@ -0,0 +1 @@ +{"schema":"pedal_concepts_runtime","schema_version":1,"data_version":14776860,"tokenize_characters":"","dictionary":[" ","c","e","g","h","l","m","o","p","r","い","う","え","お","く","こ","す","で","の","ぶ","や","り","る","れ","を","ア","ィ","イ","ウ","エ","ォ","オ","カ","キ","ク","グ","サ","ザ","シ","ジ","ス","タ","ダ","チ","ッ","デ","ト","ド","パ","フ","ブ","プ","ベ","ペ","ホ","ム","モ","ャ","ュ","ラ","リ","ル","レ","ロ","ワ","ン","ー","仕","使","再","切","削","効","動","去","報","変","始","定","履","情","払","択","支","新","方","既","更","替","有","検","歴","法","消","理","管","索","編","翻","覧","言","設","訳","語","起","選","開","閲","除","集"],"pedals":[{"name":"CLEAR_BROWSING_DATA","id":1,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,9,7,6,2],[35,66,35,61,34,63,66,55],[50,59,28,39,65,35],[1,4,9,7,6,2],[50,59,28,37,66],[50,59,28,37],[34,63,66,55]]},{"required":true,"single":true,"synonyms":[[34,60,25],[93,16],[71,108],[93,74]]},{"required":true,"single":true,"synonyms":[[33,57,44,38,58],[107,99,79,91],[45,66,41],[79,91]]}]},{"name":"CHANGE_SEARCH_ENGINE","id":2,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,9,7,6,2],[35,66,35,61,34,63,66,55],[1,4,9,7,6,2],[50,59,28,37,66],[50,59,28,37],[34,63,66,55]]},{"required":true,"single":true,"synonyms":[[70,21,88,12],[76,12,22],[105,82],[76,87],[70,88],[95,94],[101,78]]},{"required":true,"single":true,"synonyms":[[45,49,30,61,46,90,96,29,65,39,65],[86,78,90,96,29,65,39,65],[36,66,43,29,65,39,65],[90,96,29,65,39,65]]}]},{"name":"MANAGE_PASSWORDS","id":3,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,9,7,6,2],[35,66,35,61,34,63,66,55],[1,4,9,7,6,2],[50,59,28,37,66],[50,59,28,37],[34,63,66,55]]},{"required":true,"single":true,"synonyms":[[25,44,51,45,66,46],[69,101,78],[76,12,22],[95,94],[87,84],[76,87]]},{"required":true,"single":true,"synonyms":[[48,40,64,66,47]]}]},{"name":"CHANGE_HOME_PAGE","id":4,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,9,7,6,2],[35,66,35,61,34,63,66,55],[1,4,9,7,6,2],[50,59,28,37,66],[50,59,28,37],[34,63,66,55]]},{"required":true,"single":true,"synonyms":[[76,12,22],[76,87],[105,82],[105,19],[101,78]]},{"required":true,"single":true,"synonyms":[[54,66,55,53,66,39],[4,8]]}]},{"name":"UPDATE_CREDIT_CARD","id":5,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,9,7,6,2],[35,66,35,61,34,63,66,55],[1,4,9,7,6,2],[50,59,28,37,66],[50,59,28,37],[34,63,66,55]]},{"required":true,"single":true,"synonyms":[[25,44,51,45,66,46],[76,12,22],[87,84],[97,109],[76,87]]},{"required":true,"single":true,"synonyms":[[34,62,39,44,46,32,66,47,80,75],[34,62,39,44,46,32,66,47],[13,83,81,10,80,75],[32,66,47,80,75],[83,81,10,80,75],[13,83,81,10],[32,66,47],[83,81,10]]}]},{"name":"LAUNCH_INCOGNITO","id":6,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,9,7,6,2],[35,66,35,61,34,63,66,55],[1,4,9,7,6,2],[50,59,28,37,66],[50,59,28,37],[34,63,66,55]]},{"required":true,"single":true,"synonyms":[[68,10,85],[104,73],[106,77],[106,14],[31,65],[89,72],[68,11]]},{"required":true,"single":true,"synonyms":[[51,59,27,52,66,46,50,59,28,39,65,35],[38,66,34,62,44,46,28,26,65,47,28],[38,66,34,62,44,46,56,66,47],[51,59,27,52,66,46,56,66,47],[38,66,34,62,44,46,41,50],[51,59,27,52,66,46,41,50],[38,66,34,62,44,46]]}]},{"name":"TRANSLATE","id":7,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,9,7,6,2],[35,66,35,61,34,63,66,55],[1,4,9,7,6,2],[50,59,28,37,66],[50,59,28,37],[34,63,66,55]]},{"required":true,"single":true,"synonyms":[[100,103,101,78],[100,103,70,88],[100,103,76,87],[98,102]]},{"required":true,"single":true,"synonyms":[[15,53,66,39],[53,66,39],[15,23],[15]]}]},{"name":"UPDATE_CHROME","id":8,"groups":[{"required":true,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,9,7,6,2],[35,66,35,61,34,63,66,55],[1,4,9,7,6,2],[50,59,28,37,66],[50,59,28,37],[34,63,66,55]]},{"required":true,"single":true,"synonyms":[[25,44,51,35,62,66,47],[27,65,40,46,66,61],[25,44,51,45,66,46],[42,28,65,63,66,47],[87,84]]}]}],"ignore_group":{"required":false,"single":false,"synonyms":[[20,21,85],[16,22],[85,92],[67,85],[18],[17],[24],[0]]},"max_tokens":32} \ No newline at end of file
diff --git a/components/omnibox/resources/omnibox_pedal_concepts_zh-CN.json b/components/omnibox/resources/omnibox_pedal_concepts_zh-CN.json new file mode 100644 index 0000000..f10d722 --- /dev/null +++ b/components/omnibox/resources/omnibox_pedal_concepts_zh-CN.json
@@ -0,0 +1 @@ +{"schema":"pedal_concepts_runtime","schema_version":1,"data_version":14776860,"tokenize_characters":"","dictionary":[" ","c","e","g","h","l","m","o","r","主","付","信","修","入","内","切","删","动","化","升","卡","历","去","变","口","句","史","启","器","始","存","安","容","密","开","式","引","录","打","换","据","搜","擎","擦","支","改","数","新","无","更","本","模","此","段","浏","清","理","用","痕","码","私","移","窗","管","索","级","缓","置","翻","行","装","览","言","认","记","设","访","译","话","语","身","转","这","进","银","问","除","隐","面","页","首","默"],"pedals":[{"name":"CLEAR_BROWSING_DATA","id":1,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,8,7,6,2],[1,4,8,7,6,2],[54,71,28],[54,71]]},{"required":true,"single":true,"synonyms":[[55,86],[16,86],[61,86],[22,86],[55,56],[43,86]]},{"required":true,"single":true,"synonyms":[[54,71,46,40],[54,71,21,26],[54,71,74,37],[76,85,74,37],[76,85,21,26],[46,40],[21,26],[74,37],[66,30]]}]},{"name":"CHANGE_SEARCH_ENGINE","id":2,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,8,7,6,2],[1,4,8,7,6,2],[54,71,28]]},{"required":true,"single":true,"synonyms":[[49,45],[49,39],[45,23],[15,39],[75,67],[39]]},{"required":true,"single":true,"synonyms":[[41,64,36,42],[91,73,41,64],[41,64,28],[41,64]]}]},{"name":"MANAGE_PASSWORDS","id":3,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,8,7,6,2],[1,4,8,7,6,2],[54,71,28]]},{"required":true,"single":true,"synonyms":[[63,56],[12,45],[49,47],[49,39],[49,45],[75,67]]},{"required":true,"single":true,"synonyms":[[33,59]]}]},{"name":"CHANGE_HOME_PAGE","id":4,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,8,7,6,2],[1,4,8,7,6,2],[54,71,28]]},{"required":true,"single":true,"synonyms":[[49,45],[49,39],[45,23],[15,39],[75,67],[12,45],[39]]},{"required":true,"single":true,"synonyms":[[9,89],[90,89]]}]},{"name":"UPDATE_CREDIT_CARD","id":5,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,8,7,6,2],[1,4,8,7,6,2],[54,71,28]]},{"required":true,"single":true,"synonyms":[[49,47],[49,45],[49,39],[12,45],[75,67]]},{"required":true,"single":true,"synonyms":[[11,57,20],[84,69,20],[44,10,20]]}]},{"name":"LAUNCH_INCOGNITO","id":6,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,8,7,6,2],[1,4,8,7,6,2],[54,71,28],[54,71]]},{"required":true,"single":true,"synonyms":[[27,17],[34,27],[38,34],[34,29],[27,57],[83,13]]},{"required":true,"single":true,"synonyms":[[48,58,51,35],[48,58,62,24],[60,33,51,35],[60,33,62,24],[87,80,51,35]]}]},{"name":"TRANSLATE","id":7,"groups":[{"required":false,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,8,7,6,2],[1,4,8,7,6,2],[54,71,28]]},{"required":true,"single":true,"synonyms":[[15,39,79,72],[68,77],[81,39],[15,39],[81,18]]},{"required":false,"single":true,"synonyms":[[82,25,78],[82,53,78],[52,14,32],[50,89,88]]}]},{"name":"UPDATE_CHROME","id":8,"groups":[{"required":true,"single":true,"synonyms":[[3,7,7,3,5,2,1,4,8,7,6,2],[1,4,8,7,6,2],[54,71,28]]},{"required":true,"single":true,"synonyms":[[49,47],[19,65],[31,70]]}]}],"ignore_group":{"required":false,"single":false,"synonyms":[[0]]},"max_tokens":32} \ No newline at end of file
diff --git a/components/omnibox/resources/omnibox_resources.grd b/components/omnibox/resources/omnibox_resources.grd new file mode 100644 index 0000000..ef18214 --- /dev/null +++ b/components/omnibox/resources/omnibox_resources.grd
@@ -0,0 +1,104 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Note: Got a string or any bit of user-facing UI text? Please use /components/omnibox_strings.grdp instead. + These resources are not processed by translation because the content is already localized. + See https://crbug.com/954348#c12 for links about why preprocessed resources are separated from strings. --> +<grit latest_public_release="0" current_release="1" + output_all_resource_defines="false" source_lang_id="en" enc_check="möl"> + <outputs> + <output filename="grit/omnibox_resources.h" type="rc_header"> + <emit emit_type='prepend'></emit> + </output> + <output filename="omnibox_resources_am.pak" type="data_package" lang="am" /> + <output filename="omnibox_resources_ar.pak" type="data_package" lang="ar" /> + <output filename="omnibox_resources_bg.pak" type="data_package" lang="bg" /> + <output filename="omnibox_resources_bn.pak" type="data_package" lang="bn" /> + <output filename="omnibox_resources_ca.pak" type="data_package" lang="ca" /> + <output filename="omnibox_resources_cs.pak" type="data_package" lang="cs" /> + <output filename="omnibox_resources_da.pak" type="data_package" lang="da" /> + <output filename="omnibox_resources_de.pak" type="data_package" lang="de" /> + <output filename="omnibox_resources_el.pak" type="data_package" lang="el" /> + <output filename="omnibox_resources_en-US.pak" type="data_package" lang="en" /> + <output filename="omnibox_resources_en-GB.pak" type="data_package" lang="en-GB" /> + <output filename="omnibox_resources_es.pak" type="data_package" lang="es" /> + <if expr="is_ios"> + <!-- iOS uses es-MX for es-419 --> + <output filename="omnibox_resources_es-MX.pak" type="data_package" lang="es-419" /> + </if> + <if expr="not is_ios"> + <output filename="omnibox_resources_es-419.pak" type="data_package" lang="es-419" /> + </if> + <output filename="omnibox_resources_et.pak" type="data_package" lang="et" /> + <output filename="omnibox_resources_fa.pak" type="data_package" lang="fa" /> + <output filename="omnibox_resources_fake-bidi.pak" type="data_package" lang="fake-bidi" /> + <output filename="omnibox_resources_fi.pak" type="data_package" lang="fi" /> + <output filename="omnibox_resources_fil.pak" type="data_package" lang="fil" /> + <output filename="omnibox_resources_fr.pak" type="data_package" lang="fr" /> + <output filename="omnibox_resources_gu.pak" type="data_package" lang="gu" /> + <output filename="omnibox_resources_he.pak" type="data_package" lang="he" /> + <output filename="omnibox_resources_hi.pak" type="data_package" lang="hi" /> + <output filename="omnibox_resources_hr.pak" type="data_package" lang="hr" /> + <output filename="omnibox_resources_hu.pak" type="data_package" lang="hu" /> + <output filename="omnibox_resources_id.pak" type="data_package" lang="id" /> + <output filename="omnibox_resources_it.pak" type="data_package" lang="it" /> + <output filename="omnibox_resources_ja.pak" type="data_package" lang="ja" /> + <output filename="omnibox_resources_kn.pak" type="data_package" lang="kn" /> + <output filename="omnibox_resources_ko.pak" type="data_package" lang="ko" /> + <output filename="omnibox_resources_lt.pak" type="data_package" lang="lt" /> + <output filename="omnibox_resources_lv.pak" type="data_package" lang="lv" /> + <output filename="omnibox_resources_ml.pak" type="data_package" lang="ml" /> + <output filename="omnibox_resources_mr.pak" type="data_package" lang="mr" /> + <output filename="omnibox_resources_ms.pak" type="data_package" lang="ms" /> + <output filename="omnibox_resources_nl.pak" type="data_package" lang="nl" /> + <!-- The translation console uses 'no' for Norwegian Bokmål. It should + be 'nb'. --> + <output filename="omnibox_resources_nb.pak" type="data_package" lang="no" /> + <output filename="omnibox_resources_pl.pak" type="data_package" lang="pl" /> + <if expr="is_ios"> + <!-- iOS uses pt for pt-BR --> + <output filename="omnibox_resources_pt.pak" type="data_package" lang="pt-BR" /> + </if> + <if expr="not is_ios"> + <output filename="omnibox_resources_pt-BR.pak" type="data_package" lang="pt-BR" /> + </if> + <output filename="omnibox_resources_pt-PT.pak" type="data_package" lang="pt-PT" /> + <output filename="omnibox_resources_ro.pak" type="data_package" lang="ro" /> + <output filename="omnibox_resources_ru.pak" type="data_package" lang="ru" /> + <output filename="omnibox_resources_sk.pak" type="data_package" lang="sk" /> + <output filename="omnibox_resources_sl.pak" type="data_package" lang="sl" /> + <output filename="omnibox_resources_sr.pak" type="data_package" lang="sr" /> + <output filename="omnibox_resources_sv.pak" type="data_package" lang="sv" /> + <output filename="omnibox_resources_sw.pak" type="data_package" lang="sw" /> + <output filename="omnibox_resources_ta.pak" type="data_package" lang="ta" /> + <output filename="omnibox_resources_te.pak" type="data_package" lang="te" /> + <output filename="omnibox_resources_th.pak" type="data_package" lang="th" /> + <output filename="omnibox_resources_tr.pak" type="data_package" lang="tr" /> + <output filename="omnibox_resources_uk.pak" type="data_package" lang="uk" /> + <output filename="omnibox_resources_vi.pak" type="data_package" lang="vi" /> + <output filename="omnibox_resources_zh-CN.pak" type="data_package" lang="zh-CN" /> + <output filename="omnibox_resources_zh-TW.pak" type="data_package" lang="zh-TW" /> + </outputs> + <release seq="1" allow_pseudo="false"> + <includes> + <!-- These resources do not require translation or further processing because they are already handled by a separate localization process. --> + <if expr="lang == 'de'"> + <include name="IDR_OMNIBOX_PEDAL_CONCEPTS" file="omnibox_pedal_concepts_de.json" type="BINDATA" compress="gzip" /> + </if> + <if expr="lang == 'en'"> + <include name="IDR_OMNIBOX_PEDAL_CONCEPTS" file="omnibox_pedal_concepts_en.json" type="BINDATA" compress="gzip" /> + </if> + <if expr="lang == 'fr'"> + <include name="IDR_OMNIBOX_PEDAL_CONCEPTS" file="omnibox_pedal_concepts_fr.json" type="BINDATA" compress="gzip" /> + </if> + <if expr="lang == 'ja'"> + <include name="IDR_OMNIBOX_PEDAL_CONCEPTS" file="omnibox_pedal_concepts_ja.json" type="BINDATA" compress="gzip" /> + </if> + <if expr="lang == 'zh-CN'"> + <include name="IDR_OMNIBOX_PEDAL_CONCEPTS" file="omnibox_pedal_concepts_zh-CN.json" type="BINDATA" compress="gzip" /> + </if> + <if expr="lang not in ['de', 'en', 'fr', 'ja', 'zh-CN']"> + <!-- Fall back to English for unsupported languages. --> + <include name="IDR_OMNIBOX_PEDAL_CONCEPTS" file="omnibox_pedal_concepts_en.json" type="BINDATA" compress="gzip" /> + </if> + </includes> + </release> +</grit>
diff --git a/components/policy/core/common/cloud/device_management_service.cc b/components/policy/core/common/cloud/device_management_service.cc index a22d894..ed5a9af 100644 --- a/components/policy/core/common/cloud/device_management_service.cc +++ b/components/policy/core/common/cloud/device_management_service.cc
@@ -64,7 +64,6 @@ case net::ERR_PROXY_CONNECTION_FAILED: case net::ERR_TUNNEL_CONNECTION_FAILED: case net::ERR_PROXY_AUTH_UNSUPPORTED: - case net::ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT: case net::ERR_MANDATORY_PROXY_CONFIGURATION_FAILED: case net::ERR_PROXY_CERTIFICATE_INVALID: case net::ERR_SOCKS_CONNECTION_FAILED:
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index c922981..c86bdc1 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -14531,7 +14531,6 @@ { 'id': 494, 'name': 'AlternativeBrowserPath', - 'future': True, 'type': 'string', 'schema': {'type': 'string'}, 'features': { @@ -14557,7 +14556,6 @@ { 'id': 495, 'name': 'AlternativeBrowserParameters', - 'future': True, 'type': 'list', 'schema': { 'type': 'array',
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index 7be79889..6370842d 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -3050,7 +3050,7 @@ इस नीति पर सिर्फ़ तभी विचार किया जाता है, जब'DefaultSearchProviderEnabled' नीति लागू हो.</translation> <translation id="6926703471186170050">बड़े किनारे के साथ डुप्लेक्स प्रिंटिंग चालू करें</translation> <translation id="6931242315485576290">Google के साथ डेटा का सिंक करना बंद करें</translation> -<translation id="6936894225179401731">प्रॉक्सी सर्वर के लिए निरंतर कनेक्शन की ज़्यादातम संख्या निर्दिष्ट करती है. +<translation id="6936894225179401731">प्रॉक्सी सर्वर के लिए निरंतर कनेक्शन कीअधिकतमसंख्या निर्दिष्ट करती है. कुछ प्रॉक्सी कनेक्शन प्रति क्लाइंट समवर्ती कनेक्शन की उच्च संख्या का प्रबंधन नहीं कर सकते हैं और इसका समाधान इस नीति को किसी कम मान पर सेट करके किया जा सकता है.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 44963b6..c00b115 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -51,13 +51,13 @@ <translation id="1049138910114524876">Mengonfigurasi lokal yang diterapkan pada layar login <ph name="PRODUCT_OS_NAME" />. Jika kebijakan ini disetel, layar login akan selalu ditampilkan dalam lokal yang diberikan oleh nilai pertama dari kebijakan ini (kebijakan didefinisikan sebagai daftar untuk kompatibilitas yang diteruskan). Jika kebijakan ini tidak disetel atau disetel ke daftar kosong, layar login akan ditampilkan dalam lokal sesi pengguna terakhir. Jika kebijakan ini disetel ke nilai lokal yang tidak valid, layar login akan ditampilkan di lokal alternatif (saat ini, en-US).</translation> -<translation id="1052499923181221200">This policy has no effect unless SamlInSessionPasswordChangeEnabled is true. - If that policy is true, and this policy is set to (for example) 14, that means SAML users will be notified 14 days in advance that their password is due to expire on a certain date. - Then they can deal with this immediately by doing an in-session password change and updating their password before it expires. - But, these notifications will only be shown if password expiry information is sent to the device by the SAML identity provider during the SAML login flow. - Setting this policy to zero means the users will not be notified in advance - they will only be notified once the password has already expired. +<translation id="1052499923181221200">Kebijakan ini tidak berpengaruh kecuali jika SamlInSessionPasswordChangeEnabled ditetapkan ke true. + Jika kebijakan tersebut ditetapkan ke true, dan kebijakan ini ditetapkan ke (misalnya) 14, berarti pengguna SAML akan diberi tahu 14 hari sebelumnya bahwa sandi mereka akan habis masa berlakunya pada tanggal tertentu. + Selanjutnya mereka dapat segera menangani hal tersebut dengan melakukan pengubahan sandi dalam-sesi dan memperbarui sandi sebelum habis masa berlakunya. + Namun, notifikasi ini hanya akan ditampilkan jika informasi masa berlaku sandi dikirimkan ke perangkat oleh penyedia identitas SAML selama alur login SAML. + Menetapkan kebijakan ini ke nol berarti pengguna tidak akan diberi tahu sebelumnya - mereka hanya akan diberi tahu saat sandi telah habis masa berlakunya. - If this policy is set, the user cannot change or override it.</translation> + Jika kebijakan ini ditetapkan, pengguna tidak dapat mengubah atau menggantinya.</translation> <translation id="1062011392452772310">Mengaktifkan pengesahan jarak jauh untuk perangkat tersebut</translation> <translation id="1062407476771304334">Ganti</translation> <translation id="1079801999187584280">Larang penggunaan Developer Tools</translation> @@ -206,7 +206,7 @@ Jika kebijakan ini diaktifkan, Asisten Google akan diizinkan untuk mengakses konteks layar. Jika kebijakan ini dinonaktifkan, Asisten Google tidak akan diizinkan untuk mengakses konteks layar. Jika tidak disetel, pengguna dapat memutuskan apakah akan mengizinkan Asisten Google untuk mengakses konteks layar atau tidak</translation> -<translation id="1376119291123231789">Enable advanced battery charge mode</translation> +<translation id="1376119291123231789">Mengaktifkan mode pengisian daya baterai lanjutan</translation> <translation id="1383493480903114193">Kebijakan ini memaksa kode jaringan untuk dijalankan dalam proses browser. Kebijakan ini dinonaktifkan secara default, dan jika diaktifkan, pengguna akan rentan terhadap masalah keamanan setelah proses jaringan masuk dalam sandbox. @@ -303,17 +303,17 @@ <translation id="1502843533062797703">Aktifkan pemblokiran injeksi software pihak ketiga</translation> <translation id="1504431521196476721">Pengesahan Jarak Jauh</translation> <translation id="1507382822467487898"> - Configures which MAC (media access control) address will be used when a dock is connected to the device. + Mengonfigurasi alamat MAC (kontrol akses media) mana yang akan digunakan saat dok terhubung ke perangkat. - When a dock is connected to some device models, the device's designated dock MAC address is used to identify the device on Ethernet by default. This policy allows the administrator to change the source of the MAC address while docked. + Saat dok terhubung ke model perangkat tertentu, alamat MAC dok yang ditetapkan untuk perangkat akan digunakan untuk mengidentifikasi perangkat di Ethernet secara default. Kebijakan ini memungkinkan administrator untuk mengubah sumber alamat MAC saat dipasang ke dok. - If 'DeviceDockMacAddress' is selected or the policy is left unset, the device's designated dock MAC address will be used. + Jika 'DeviceDockMacAddress' dipilih atau kebijakan ini tidak ditetapkan, alamat MAC dok yang ditetapkan untuk perangkat akan digunakan. - If 'DeviceNicMacAddress' is selected, the device's NIC (network interface controller) MAC address will be used. + Jika 'DeviceNicMacAddress' dipilih, alamat MAC NIC (pengontrol antarmuka jaringan) perangkat akan digunakan. - If 'DockNicMacAddress' is selected, the dock's NIC MAC address will be used. + Jika 'DockNicMacAddress' dipilih, alamat MAC NIC dok akan digunakan. - This setting can not be changed by the user.</translation> + Setelan ini tidak dapat diubah oleh pengguna.</translation> <translation id="1507957856411744193">Jika kebijakan ini disetel ke true, <ph name="PRODUCT_NAME" /> akan terhubung ke perangkat Cast di semua alamat IP, bukan hanya alamat pribadi RFC1918/RFC4913. Jika kebijakan ini disetel ke false, <ph name="PRODUCT_NAME" /> hanya akan terhubung ke perangkat Cast di alamat pribadi RFC1918/RFC4913. @@ -739,17 +739,17 @@ <translation id="2303795211377219696">Mengaktifkan IsiOtomatis untuk kartu kredit</translation> <translation id="2309390639296060546">Setelan geolokasi default</translation> <translation id="2327252517317514801">Menentukan domain yang diizinkan untuk mengakses G Suite</translation> -<translation id="2356878440219553005">Specifies battery charge mode power management policy. +<translation id="2356878440219553005">Menentukan kebijakan pengelolaan daya mode pengisian daya baterai. - Dynamically control battery charging to minimize battery wear-out due to battery stress and extend battery life. + Kontrol pengisian daya baterai secara dinamis untuk meminimalkan keausan baterai akibat ketegangan baterai dan memperpanjang masa pakai baterai. - If custom battery charge mode is selected then DeviceBatteryChargeCustomStartCharging and DeviceBatteryChargeCustomStopCharging must be specified. + Jika mode pengisian daya baterai kustom dipilih, maka DeviceBatteryChargeCustomStartCharging dan DeviceBatteryChargeCustomStopCharging harus ditentukan. - If this policy is set then battery charge mode will be applied if supported on the device. + Jika kebijakan ini ditetapkan, mode pengisian daya baterai akan diterapkan jika didukung di perangkat. - If this policy is left unset and policy is supported on the device, the standard battery charge mode will be applied and cannot be changed by the user. + Jika kebijakan ini tidak ditetapkan dan kebijakan didukung di perangkat, mode pengisian daya baterai standar akan diterapkan dan tidak dapat diubah oleh pengguna. - Catatan: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> overrides this policy if the former is specified.</translation> + Catatan: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> mengganti kebijakan ini jika kebijakan sebelumnya ditentukan.</translation> <translation id="237494535617297575">Memungkinkan Anda menyetel daftar pola url yang menentukan situs yang tidak diizinkan untuk menampilkan pemberitahuan. Jika kebijakan ini tidak disetel, nilai default global akan digunakan untuk semua situs, baik dari kebijakan 'DefaultNotificationsSetting', jika disetel, atau konfigurasi pribadi pengguna.</translation> <translation id="2386362615870139244">Izinkan penguncian layar saat bangun</translation> <translation id="2411817661175306360">Peringatan perlindungan sandi nonaktif</translation> @@ -785,7 +785,7 @@ Jika kebijakan ini disetel ke False, masuk otomatis tanpa penundaan (jika dikonfigurasi) tidak dapat dilewati.</translation> <translation id="2454228136871844693">Mengoptimalkan untuk stabilitas.</translation> -<translation id="2463034609187171371">Mengaktifkan cipher suite DHE di TLS</translation> +<translation id="2463034609187171371">Mengaktifkan paket penyandian DHE di TLS</translation> <translation id="2463365186486772703">Lokal aplikasi</translation> <translation id="2466131534462628618">Autentikasi portal tawanan mengabaikan proxy</translation> <translation id="2482676533225429905">Perpesanan Asli</translation> @@ -959,7 +959,7 @@ <translation id="2769952903507981510">Mengonfigurasi nama domain yang dibutuhkan untuk hosting akses jarak jauh</translation> <translation id="2787173078141616821">Informasi laporan tentang status Android</translation> <translation id="2799297758492717491">Izinkan pemutaran otomatis media pada pola URL yang diizinkan</translation> -<translation id="2801155097555584385">Set battery charge custom start charging in percent</translation> +<translation id="2801155097555584385">Menetapkan nilai awal pengisian daya baterai kustom dalam persen</translation> <translation id="2801230735743888564">Mengizinkan pengguna memainkan game dinosaur easter egg saat perangkat offline. Jika kebijakan ini disetel ke False, pengguna tidak dapat memainkan game dinosaur easter egg saat perangkat offline. Jika setelan ini disetel ke True, pengguna dapat memainkan game tersebut. Jika kebijakan ini tidak disetel, pengguna tidak dapat memainkan game dinosaur easter egg pada Chrome OS yang terdaftar, tapi pengguna dapat memainkannya dalam situasi tertentu.</translation> @@ -1185,7 +1185,7 @@ Jika kebijakan ini tidak disetel, nilai default global akan digunakan untuk semua situs yaitu dari kebijakan 'DefaultImagesSetting' jika disetel, atau dari konfigurasi pribadi pengguna. Perlu diperhatikan bahwa sebelumnya kebijakan ini diaktifkan secara keliru di Android, namun fungsi ini belum pernah sepenuhnya didukung di Android.</translation> -<translation id="3091832372132789233">Charge battery for devices that are primarily connected to an external power source.</translation> +<translation id="3091832372132789233">Mengisi daya baterai untuk perangkat yang terutama terhubung ke sumber daya eksternal.</translation> <translation id="3096595567015595053">Daftar plugin yang diaktifkan</translation> <translation id="3101501961102569744">Pilih cara menentukan setelan server proxy</translation> <translation id="3101709781009526431">Tanggal dan waktu</translation> @@ -1211,7 +1211,7 @@ Jika setelan ini dinonaktifkan, <ph name="PRODUCT_NAME" /> hanya akan menggunakan host Native Messaging yang diinstal pada level sistem. Jika setelan ini tidak ditetapkan, <ph name="PRODUCT_NAME" /> akan mengizinkan penggunaan host Native Messaging pada level pengguna.</translation> -<translation id="3177802893484440532">Require online OCSP/CRL checks for local trust anchors</translation> +<translation id="3177802893484440532">Mewajibkan pemeriksaan OCSP/CRL online untuk sumber tepercaya setempat</translation> <translation id="3185009703220253572">sejak versi <ph name="SINCE_VERSION" /></translation> <translation id="3187220842205194486">Aplikasi Android tidak bisa mendapat akses ke kunci perusahaan. Kebijakan ini tidak memengaruhinya.</translation> <translation id="3205825995289802549">Maksimalkan jendela browser pertama di percobaan pertama</translation> @@ -1221,7 +1221,7 @@ <translation id="3220624000494482595">Jika aplikasi kios adalah aplikasi Android, aplikasi tersebut tidak akan memiliki kontrol terhadap versi <ph name="PRODUCT_OS_NAME" />, meski kebijakan ini disetel ke <ph name="TRUE" />.</translation> <translation id="3236046242843493070">Pola URL untuk memungkinkan pemasangan skrip pengguna, aplikasi, dan ekstensi dari</translation> <translation id="3240609035816615922">Kebijakan akses konfigurasi untuk printer.</translation> -<translation id="3240655340884151271">Dock's built-in NIC MAC address</translation> +<translation id="3240655340884151271">Alamat MAC NIC bawaan dok</translation> <translation id="3243309373265599239">Menentukan panjang waktu tanpa masukan pengguna sebelum layar meredup saat menggunakan daya AC. Saat kebijakan ini desetel ke nilai lebih besar dari nol, kebijakan menentukan panjang waktu pengguna tetap menganggur sebelum <ph name="PRODUCT_OS_NAME" /> meredupkan layar. @@ -1243,12 +1243,12 @@ Jika setelan ini diaktifkan atau tidak dikonfigurasi, pengguna dapat mengaktifkan proxy cloud print lewat autentikasi dengan akun Google. Jika setelan ini dinonaktifkan, pengguna tidak dapat mengaktifkan proxy tersebut, dan komputer tidak akan diizinkan berbagi printernya dengan <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="3312206664202507568">Enables a page at chrome://password-change that lets SAML users change their SAML passwords while in-session, which ensures that the SAML password and the device lockscreen password are kept in-sync. +<translation id="3312206664202507568">Mengaktifkan halaman di chrome://password-change yang memungkinkan pengguna SAML untuk mengubah sandi SAML mereka selama dalam-sesi, yang memastikan bahwa sandi SAML dan sandi layar kunci perangkat selalu sinkron. - This policy also enables notifications that warn SAML users if their SAML passwords are soon to expire so that they can deal with this immediately by doing an in-session password change. - But, these notifications will only be shown if password expiry information is sent to the device by the SAML identity provider during the SAML login flow. + Kebijakan ini juga mengaktifkan notifikasi yang memperingatkan pengguna SAML jika sandi SAML mereka akan segera habis masa berlakunya sehingga mereka dapat segera menangani hal tersebut dengan melakukan pengubahan sandi dalam-sesi. + Namun, notifikasi ini hanya akan ditampilkan jika informasi masa berlaku sandi dikirimkan ke perangkat oleh penyedia identitas SAML selama alur login SAML. - If this policy is set, the user cannot change or override it.</translation> + Jika kebijakan ini ditetapkan, pengguna tidak dapat mengubah atau menggantinya.</translation> <translation id="3322771899429619102">Memungkinkan Anda menyetel daftar pola URL guna menentukan situs yang diizinkan untuk menggunakan pembuatan kunci. Jika pola URL ada di dalam 'KeygenBlockedForUrls', maka pola tersebut akan mengganti pengecualian ini. Jika kebijakan ini tidak disetel, nilai default global akan digunakan untuk semua situs dari kebijakan 'DefaultKeygenSetting' jika disetel, atau dari konfigurasi pribadi pengguna.</translation> @@ -1373,7 +1373,7 @@ <translation id="3547954654003013442">Setelan proxy</translation> <translation id="355118380775352753">Situs yang akan dibuka di browser alternatif</translation> <translation id="3554984410014457319">Mengizinkan Asisten Google mendengarkan frasa aktivasi suara</translation> -<translation id="356579196325389849">Users may configure the Chrome OS release channel</translation> +<translation id="356579196325389849">Pengguna dapat mengonfigurasi saluran rilis Chrome OS</translation> <translation id="3575011234198230041">Autentikasi HTTP</translation> <translation id="3577251398714997599">Setelan iklan untuk situs yang menayangkan iklan mengganggu</translation> <translation id="357917253161699596">Izinkan pengguna mengelola sertifikat pengguna</translation> @@ -1405,7 +1405,7 @@ Kebijakan ini digunakan oleh pendaftaran kebijakan machine scope cloud di desktop dan dapat disetel oleh Registry atau GPO di Windows, plist di Mac, dan file kebijakan JSON di Linux.</translation> <translation id="3660562134618097814">Transfer cookie SAML IdP saat proses masuk.</translation> -<translation id="3668151900457104753">Uninstall blacklisted extensions</translation> +<translation id="3668151900457104753">Meng-uninstal ekstensi yang termasuk dalam daftar hitam</translation> <translation id="3701121231485832347">Mengontrol setelan khusus perangkat <ph name="PRODUCT_OS_NAME" />.yang dikelola <ph name="MS_AD_NAME" />.</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Kolom 1 baris sudah tidak digunakan lagi dan akan dihapus di masa mendatang. Mulai gunakan kotak teks multibaris di bawah.)</translation> <translation id="3709266154059827597">Konfigurasikan daftar penginstalan ekstensi yang tidak diizinkan</translation> @@ -1488,7 +1488,7 @@ Jika kebijakan ini tidak disetel, keyboard di layar awalnya dinonaktifkan namun dapat diaktifkan oleh pengguna kapan saja.</translation> <translation id="382476126209906314">Mengonfigurasi awalan TalkGadget untuk hosting akses jarak jauh</translation> <translation id="3824972131618513497">Mengontrol setelan yang terkait dengan pengelolaan daya dan reboot.</translation> -<translation id="3826475866868158882">Google location services enabled</translation> +<translation id="3826475866868158882">Layanan lokasi Google diaktifkan</translation> <translation id="3831054243924627613">Kebijakan ini mengontrol status awal backup dan pemulihan Android. Jika kebijakan ini tidak dikonfigurasi atau ditetapkan ke <ph name="BR_DISABLED" />, status awal backup dan pemulihan Android adalah dinonaktifkan. @@ -1579,7 +1579,7 @@ Jika tidak disetel atau disetel ke False, pengguna akan dapat mentransfer file ke Google Drive.</translation> <translation id="3915395663995367577">URL untuk proxy file .pac</translation> -<translation id="3920892052017026701">Menetapkan awal pengisian daya baterai kustom, dalam persen. +<translation id="3920892052017026701">Menetapkan nilai awal pengisian daya baterai kustom dalam persen. Baterai akan memulai pengisian daya jika sudah mencapai nilai awal pengisian daya baterai kustom. @@ -1716,7 +1716,7 @@ <translation id="4150201353443180367">Tampilan</translation> <translation id="4157003184375321727">Laporkan versi OS dan firmware</translation> <translation id="4157594634940419685">Izinkan akses ke printer CUPS native</translation> -<translation id="4160962198980004898">Device MAC address source when docked</translation> +<translation id="4160962198980004898">Sumber alamat MAC perangkat saat dipasang di dok</translation> <translation id="4163705126749612234">Mengonfigurasi nama domain klien wajib yang akan diberlakukan pada klien akses jarak jauh dan mencegah pengguna mengubahnya. Jika setelan ini diaktifkan, maka hanya klien dari salah satu domain yang ditentukan yang dapat tersambung ke host. @@ -1794,7 +1794,7 @@ Harap diperhatikan bahwa kebijakan yang berisi ID aplikasi tidak berarti pengguna dapat mengaktifkan aplikasi sebagai aplikasi pencatat di layar kunci - misalnya, di Chrome 61, kumpulan aplikasi yang tersedia dibatasi oleh platform. Jika kebijakan tidak disetel, tidak akan ada batasan di kumpulan aplikasi yang dapat diaktifkan oleh pengguna di layar kunci yang diterapkan oleh kebijakan.</translation> -<translation id="4313767483634435271">Device's designated dock MAC address</translation> +<translation id="4313767483634435271">Alamat MAC dok yang ditetapkan untuk perangkat</translation> <translation id="4322842393287974810">Izinkan peluncuran otomatis dengan aplikasi kios tanpa penundaan untuk mengontrol versi <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Tambahkan tombol keluar di baki sistem</translation> <translation id="4332177773549877617">Membuat log peristiwa penginstalan aplikasi Android</translation> @@ -1826,7 +1826,7 @@ <translation id="4360826270668210664">Jika kebijakan ini ditetapkan, host akses jarak jauh akan mewajibkan autentikasi klien untuk memperoleh token autentikasi dari URL ini agar dapat tersambung. Harus digunakan bersama RemoteAccessHostTokenValidationUrl. Fitur ini saat ini dinonaktifkan pada sistem server.</translation> -<translation id="4363057787588706121">Mengizinkan penggabungan daftar kebijakan dari sumber yang berbeda</translation> +<translation id="4363057787588706121">Mengizinkan penggabungan kebijakan daftar dari sumber berbeda</translation> <translation id="436581050240847513">Melaporkan antarmuka jaringan perangkat</translation> <translation id="4372704773119750918">Jangan izinkan pengguna perusahaan untuk menjadi bagian dari multiprofil (primer atau sekunder)</translation> <translation id="4377599627073874279">Izinkan semua situs menampilkan semua gambar</translation> @@ -1992,7 +1992,7 @@ <translation id="4826326557828204741">Tindakan yang diperlukan saat penundaan nganggur tercapai ketika menjalankan daya baterai</translation> <translation id="4832852360828533362">Pelaporan perangkat dan pengguna</translation> <translation id="4834526953114077364">Pengguna yang paling jarang digunakan yang belum masuk dalam 3 bulan terakhir dihapus sampai terdapat cukup ruang kosong</translation> -<translation id="4835622243021053389">Enable NTLMv2 authentication.</translation> +<translation id="4835622243021053389">Aktifkan autentikasi NTLMv2.</translation> <translation id="4858735034935305895">Izinkan mode layar penuh</translation> <translation id="4861767323695239729">Mengonfigurasi metode masukan yang diizinkan dalam sesi pengguna</translation> <translation id="487460824085252184">Migrasi otomatis, jangan tanya persetujuan pengguna.</translation> @@ -2110,9 +2110,9 @@ <translation id="5124368997194894978">Aktifkan booting pada tegangan AC (arus bolak-balik)</translation> <translation id="5131211790949066746">Mengaktifkan penggabungan kebijakan daftar instal ekstensi <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" />, dan <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />. - Jika Anda mengaktifkan setelan ini, nilai dari kebijakan platform perangkat, kebijakan cloud perangkat, dan kebijakan platform pengguna digabungkanmenjadi satu daftar dan digunakan sebagai satu kesatuan utuh, bukan hanya menggunakan nilai dari satu sumber yang memiliki prioritas tertinggi. + Jika Anda mengaktifkan setelan ini, nilai dari kebijakan platform perangkat, kebijakan cloud perangkat, dan kebijakan platform pengguna akan digabung menjadi satu daftar dan digunakan sebagai satu kesatuan utuh, bukannya menggunakan nilai dari satu sumber yang memiliki prioritas tertinggi. - Jika Anda menonaktifkan setelan ini atau membiarkannya tidak disetel, hanya entri daftar dari sumber dengan prioritas tertinggi yang diambil. Semua sumber lainnya akan ditampilkan sebagai konflik tetapi diabaikan.</translation> + Jika setelan ini dinonaktifkan atau tidak ditetapkan, hanya entri daftar dari sumber dengan prioritas tertinggi yang akan diambil. Semua sumber lainnya akan ditampilkan sebagai konflik tetapi diabaikan.</translation> <translation id="5141670636904227950">Menyetel jenis lup default yang diaktifkan di layar masuk</translation> <translation id="5142301680741828703">Selalu mengurai pola URL berikut di <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="5148753489738115745">Memungkinkan Anda menentukan parameter tambahan yang digunakan saat <ph name="PRODUCT_FRAME_NAME" /> meluncurkan <ph name="PRODUCT_NAME" />. @@ -2315,7 +2315,7 @@ Jika aturan bentrok satu sama lain, <ph name="PRODUCT_NAME" /> akan menggunakan aturan yang paling spesifik.</translation> <translation id="5475361623548884387">Aktifkan pencetakan</translation> <translation id="547601067149622666">Jangan izinkan iklan di situs yang menayangkan iklan mengganggu</translation> -<translation id="5483065054530244863">Allow SHA-1 signed certificates issued by local trust anchors</translation> +<translation id="5483065054530244863">Mengizinkan sertifikat bertanda tangan SHA-1 yang dikeluarkan oleh sumber tepercaya setempat</translation> <translation id="5483777239978559943">Kebijakan ini tidak digunakan lagi. Gunakan kebijakan <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> untuk mengontrol ketersediaan plugin Flash dan <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> untuk mengontrol apakah penampil PDF terintegrasi akan digunakan untuk membuka file PDF atau tidak. Menentukan daftar plugin yang dapat diaktifkan atau dinonaktifkan pengguna di <ph name="PRODUCT_NAME" />. @@ -2432,17 +2432,17 @@ Jika kebijakan ini diaktifkan atau tidak ditetapkan, pengguna dapat melihat sandi dalam teks jelas di pengelola sandi.</translation> <translation id="5620392548325769024">Mengaktifkan kebijakan yang menampilkan halaman sambutan saat browser pertama kali diluncurkan setelah upgrade OS</translation> <translation id="5630352020869108293">Mengembalikan sesi terakhir</translation> -<translation id="5643906875497889108">Controls which app/extension types are allowed to be installed and limits runtime access. +<translation id="5643906875497889108">Mengontrol jenis aplikasi/ekstensi yang boleh diinstal dan membatasi akses waktu proses. - This setting white-lists the allowed types of extension/apps that can be installed in <ph name="PRODUCT_NAME" /> and which hosts they can interact with. The value is a list of strings, each of which should be one of the following: "extension", "theme", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". See the <ph name="PRODUCT_NAME" /> extensions documentation for more information on these types. + Setelan ini menempatkan jenis aplikasi/ekstensi yang boleh diinstal di <ph name="PRODUCT_NAME" /> dan host yang dapat berinteraksi dengannya ke dalam daftar aplikasi/ekstensi yang diberi akses. Nilai ini berupa daftar string, dan setiap string adalah salah satu dari berikut ini: "extension", "theme", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". Lihat dokumentasi ekstensi <ph name="PRODUCT_NAME" /> untuk informasi selengkapnya tentang jenis ini. - Note that this policy also affects extensions and apps to be force-installed via ExtensionInstallForcelist. + Perhatikan bahwa kebijakan ini juga memengaruhi aplikasi dan ekstensi yang akan diinstal otomatis melalui ExtensionInstallForcelist. - If this setting is configured, extensions/apps which have a type that is not on the list will not be installed. + Jika setelan ini dikonfigurasi, ekstensi/aplikasi dari jenis yang tidak tercantum dalam daftar tidak akan diinstal. - If this settings is left not-configured, no restrictions on the acceptable extension/app types are enforced. + Jika setelan ini tidak dikonfigurasi, tidak ada batasan yang diberlakukan terkait jenis aplikasi/ekstensi yang diterima. - Prior to version 75 using multiple comma separated extension IDs is not supported and will be skipped. The rest of the policy will continue to apply.</translation> + Sebelum versi 75, penggunaan beberapa ID ekstensi yang dipisahkan koma tidak didukung dan akan dilewati. Bagian lainnya dari kebijakan ini akan tetap berlaku.</translation> <translation id="5645779841392247734">Izinkan cookie di situs ini</translation> <translation id="5689430183304951538">Ukuran halaman pencetakan default</translation> <translation id="5693469654327063861">Izinkan migrasi data</translation> @@ -2482,7 +2482,7 @@ <translation id="5765780083710877561">Deskripsi:</translation> <translation id="5770738360657678870">Saluran pengembang (mungkin tidak stabil)</translation> <translation id="5774856474228476867">URL penelusuran penyedia penelusuran default</translation> -<translation id="5775235485119094648">Charge battery while it is within a fixed range.</translation> +<translation id="5775235485119094648">Mengisi daya baterai saat tingkat daya berada dalam rentang yang ditetapkan.</translation> <translation id="5776485039795852974">Tanyakan setiap kali situs ingin menampilkan pemberitahuan desktop</translation> <translation id="5781412041848781654">Menentukan pustaka GSSAPI yang akan digunakan untuk autentikasi HTTP. Anda dapat menyetel nama pustakanya saja atau jalur lengkap. @@ -2553,14 +2553,14 @@ Jika kebijakan ini tidak dikonfigurasi, setelan isolasi situs default platform akan digunakan untuk layar login. </translation> <translation id="5901427587865226597">Khusus pencetakan dupleks</translation> -<translation id="5905473632148429217">Enable online OCSP/CRL checks</translation> +<translation id="5905473632148429217">Mengaktifkan pemeriksaan OCSP/CRL online</translation> <translation id="5906199912611534122">Mengizinkan pengaktifan atau pe-nonaktifan pembatasan jaringan. Kebijakan ini berlaku untuk semua pengguna, dan untuk semua antarmuka di perangkat. Setelah disetel, pembatasan akan terus berlanjut hingga kebijakan ini dinonaktifkan. Jika disetel ke false, tidak akan ada pembatasan. Jika disetel ke true, sistem akan dibatasi untuk mencapai laju upload dan download (dalam kbit/dtk) yang tersedia.</translation> -<translation id="591088232153082363">Adaptive charge battery based on battery usage pattern.</translation> +<translation id="591088232153082363">Pengisian daya baterai adaptif berdasarkan pola penggunaan baterai.</translation> <translation id="5921713479449475707">Izinkan download pembaruan otomatis melalui HTTP</translation> <translation id="5921888683953999946">Menyetel status default fitur aksesibilitas kursor besar di layar masuk. @@ -2582,7 +2582,7 @@ <translation id="5950205771952201658">Mengingat pemeriksaan pembatalan online kegagalan-lunak tidak memberikan manfaat keamanan yang efektif, pemeriksaan tersebut dinonaktifkan secara default di <ph name="PRODUCT_NAME" /> versi 19 dan yang lebih baru. Dengan menyetel kebijakan ini ke true, perilaku sebelumnya akan dipulihkan dan akan dilakukan pemeriksaan OCSP/CRL online. Jika kebijakan tidak disetel, atau disetel ke false, <ph name="PRODUCT_NAME" /> tidak akan melakukan pemeriksaan pembatalan online di <ph name="PRODUCT_NAME" /> versi 19 dan yang lebih baru.</translation> -<translation id="5961137303188584693">Alamat NIC MAC bawaan perangkat</translation> +<translation id="5961137303188584693">Alamat MAC NIC bawaan perangkat</translation> <translation id="5966615072639944554">Ekstensi yang diizinkan untuk menggunakan API pengesahan jarak jauh</translation> <translation id="5983708779415553259">Perilaku default untuk situs tidak ada dalam paket konten mana pun</translation> <translation id="5997543603646547632">Menggunakan 24 jam sebagai default</translation> @@ -2735,17 +2735,17 @@ Jika dinonaktifkan, data formulir isi-otomatis tidak akan diimpor. Jika tidak disetel, pengguna mungkin akan ditanya apakah ingin mengimpor atau proses impor dapat berlangsung secara otomatis.</translation> -<translation id="6221175752766085998">Mengizinkan sertifikat yang dikeluarkan oleh sumber tepercaya setempat tanpa ekstensi subjectAlternativeName extension</translation> +<translation id="6221175752766085998">Mengizinkan sertifikat yang dikeluarkan oleh sumber tepercaya setempat tanpa ekstensi subjectAlternativeName</translation> <translation id="6224304369267200483">URL/domain otomatis mengizinkan pengesahan langsung Kunci Keamanan</translation> <translation id="6233173491898450179">Setel direktori download</translation> <translation id="6244210204546589761">URL untuk membuka saat permulaan</translation> -<translation id="6255387031094435995">Mengizinkan kebijakan yang dipilih untuk digabungkan saat kebijakan tersebut berasal dari sumber berbeda, dengan cakupan dan level yang sama. +<translation id="6255387031094435995">Mengizinkan penggabungan beberapa kebijakan yang dipilih jika kebijakan tersebut berasal dari sumber berbeda, tetapi dengan cakupan dan level yang sama. - Jika kebijakan tercantum dalam daftar, apabila ada konflik antara dua sumber, mengingat bahwa kebijakan tersebut memiliki cakupan dan level yang sama, nilainya akan digabung ke dalam daftar kebijakan baru. + Jika sebuah kebijakan tercantum dalam daftar, apabila terdapat konflik antara dua sumber, mengingat kebijakan tersebut memiliki cakupan dan level yang sama, nilainya akan digabung ke dalam sebuah daftar kebijakan baru. - Jika kebijakan ada dalam daftar, apabila ada konflik antara dua sumber tetapi juga antara cakupan dan/atau level, kebijakan dengan prioritas tertinggi akan diterapkan. + Jika sebuah kebijakan tercantum dalam daftar, apabila terdapat konflik antara dua sumber dan juga antara cakupan dan/atau level yang berbeda, kebijakan dengan prioritas tertinggi akan diterapkan. - Jika kebijakan tidak ada dalam daftar, apabila ada konflik antara sumber, cakupan, dan/atau level apa pun, kebijakan dengan prioritas tertinggi akan diterapkan.</translation> + Jika sebuah kebijakan tidak tercantum dalam daftar, apabila terdapat konflik antara sumber, cakupan, dan/atau level, kebijakan dengan prioritas tertinggi akan diterapkan.</translation> <translation id="6258193603492867656">Menentukan apakah SPN Kerberos yang dihasilkan harus mencakup port non-standar. Jika Anda mengaktifkan setelan ini, dan port non-standar (selain port 80 atau 443) dimasukkan, port ini akan dimasukkan ke SPN Kerberos yang dihasilkan. Jika Anda menonaktifkan setelan ini atau membiarkannya tidak disetel, SPN Kerberos yang dihasilkan tidak akan pernah mencakup port.</translation> <translation id="6261643884958898336">Laporkan informasi Identifikasi Mesin</translation> <translation id="6281043242780654992">Mengonfigurasikan kebijakan untuk Perpesanan Asli. Hosting perpesanan asli yang dimasukkan dalam daftar hitam tidak akan diizinkan kecuali telah dimasukkan dalam daftar putih.</translation> @@ -2966,7 +2966,7 @@ String dapat memuat variabel ${ASSET_ID}, ${SERIAL_NUM}, ${MAC_ADDR}, ${MACHINE_NAME} yang akan diganti dengan nilai pada perangkat sebelum digunakan sebagai hostname. Substitusi yang dihasilkan akan menjadi hostname yang valid (menurut RFC 1035, bagian 3.1). Jika kebijakan ini tidak ditetapkan, atau nilai setelah substitusi bukan merupakan hostname yang valid, tidak ada hostname yang akan ditetapkan di permintaan DHCP. </translation> -<translation id="6833988859168635883">Startup, Home page and New Tab page</translation> +<translation id="6833988859168635883">Halaman Awal, Halaman Beranda, dan halaman Tab Baru</translation> <translation id="6835883744948188639">Tampilkan permintaan berulang kepada pengguna yang menunjukkan bahwa peluncuran ulang direkomendasikan</translation> <translation id="6837480141980366278">Mengontrol apakah klien DNS built-in digunakan di <ph name="PRODUCT_NAME" /> atau tidak. @@ -3076,17 +3076,17 @@ Saat layar akan diredupkan, model redup smart akan mengevaluasi apakah peredupan layar sebaiknya ditunda. Jika model redup smart menunda peredupan layar, maka hal itu secara efektif akan memperpanjang waktu hingga layar diredupkan. Dalam hal ini, penundaan layar nonaktif, layar terkunci, dan layar menganggur disesuaikan untuk mempertahankan agar interval penundaan peredupan layar tetap sama dengan yang semula dikonfigurasi. Jika kebijakan ini ditetapkan ke True atau tidak ditetapkan, model redup smart akan diaktifkan dan diizinkan untuk memperpanjang waktu hingga layar diredupkan. Jika kebijakan ini ditetapkan ke False, model redup smart tidak akan memengaruhi peredupan layar.</translation> -<translation id="6967394885063085697">Enable the advanced battery charge mode power management policy. +<translation id="6967394885063085697">Mengaktifkan kebijakan pengelolaan daya mode pengisian daya baterai lanjutan. - Advanced Battery Charging Mode allows the user to maximize the battery health. In Advanced Charging Mode the system will use standard charging algorithm and other techniques during non-work hours to maximize battery health. During work hours, an express charge is used. This express charge allows the battery to be charged faster; therefore, the battery is at full charge sooner. For each day the time in which the system will be most heavily used is specified by the start time and the duration. + Mode Pengisian Daya Baterai Lanjutan memungkinkan pengguna memaksimalkan kesehatan baterai. Dalam Mode Pengisian Daya Lanjutan, sistem akan menggunakan algoritme pengisian daya standar dan teknik lainnya selama di luar jam kerja untuk memaksimalkan kesehatan baterai. Selama jam kerja, pengisian daya ekspres digunakan. Pengisian daya ekspres ini memungkinkan baterai untuk terisi lebih cepat, sehingga baterai akan penuh lebih cepat. Untuk setiap hari, waktu kapan sistem akan paling sering digunakan ditentukan oleh waktu mulai dan durasi. - If this policy is set to true, and DeviceAdvancedBatteryChargeModeDayConfig is set, then advanced battery charge mode will always be enabled if supported on the device. + Jika kebijakan ini ditetapkan ke true, dan DeviceAdvancedBatteryChargeModeDayConfig ditetapkan, mode pengisian daya baterai lanjutan akan selalu aktif jika didukung di perangkat. - If this policy is set to false, advanced battery charge mode will always be disabled. + Jika kebijakan ini ditetapkan ke false, mode pengisian daya baterai lanjutan akan selalu nonaktif. Jika kebijakan ini ditetapkan, pengguna tidak dapat mengubah atau menggantinya. - If this policy is left unset, advanced battery charge mode is disabled and cannot be enabled by the user.</translation> + Jika kebijakan ini tidak ditetapkan, mode pengisian daya baterai lanjutan dinonaktifkan dan tidak dapat diaktifkan oleh pengguna.</translation> <translation id="6972540544240464302">Pilih konfigurasi penjadwal tugas</translation> <translation id="6979158407327259162">Google Drive</translation> <translation id="6994082778848658360">Menentukan bagaimana hardware elemen pengaman on-board digunakan untuk memberikan autentikasi faktor kedua jika kompatibel dengan fitur ini. Tombol power mesin digunakan untuk mendeteksi keberadaan pengguna. @@ -3291,7 +3291,7 @@ Kebijakan ini hanya diterapkan jika kebijakan 'DefaultSearchProviderEnabled' diaktifkan.</translation> <translation id="7302043767260300182">Penundaan kunci layar saat menggunakan daya AC</translation> -<translation id="7305262223970835999">Mengaktifkan halaman untuk mengubah sandi dalam sesi pada pengguna SAML.</translation> +<translation id="7305262223970835999">Mengaktifkan halaman untuk pengubahan sandi dalam-sesi bagi pengguna SAML.</translation> <translation id="7311458740754205918">Jika kebijakan ini disetel ke true atau tidak disetel, halaman Tab Baru dapat menampilkan saran konten berdasarkan histori penjelajahan, minat, dan lokasi pengguna. Jika kebijakan disetel ke false, saran konten yang dibuat secara otomatis tidak akan ditampilkan di halaman Tab Baru.</translation> @@ -3414,7 +3414,7 @@ Jika nilai kebijakan ini 0, ukuran cache default akan digunakan namun pengguna tidak akan dapat mengubahnya. Jika kebijakan ini tidak disetel, ukuran default akan digunakan dan pengguna dapat menimpanya dengan tanda --disk-cache-size.</translation> -<translation id="759389052790680884">Menetapkan akhir pengisian daya baterai kustom, dalam persen. +<translation id="759389052790680884">Menetapkan nilai akhir pengisian daya baterai kustom dalam persen. Baterai akan berhenti mengisi daya jika sudah mencapai nilai akhir pengisian daya baterai kustom. @@ -3592,11 +3592,11 @@ <translation id="7937491150792971922">Gabungkan kebijakan daftar instal ekstensi dari beberapa sumber</translation> <translation id="7937766917976512374">Izinkan atau tolak penangkapan video</translation> <translation id="7941975817681987555">Jangan memprediksi tindakan jaringan di sambungan jaringan apa pun</translation> -<translation id="7952007677054834789">Configure the pages to load on startup, the default home page and the default new tab page in <ph name="PRODUCT_NAME" /> and prevents users from changing them. +<translation id="7952007677054834789">Mengonfigurasi halaman yang akan dimuat saat permulaan, halaman beranda default, dan halaman tab baru default di <ph name="PRODUCT_NAME" /> dan mencegah pengguna mengubahnya. - The user's home page settings are only completely locked down if you either select the home page to be the new tab page, or set it to be a URL and specify a home page URL. If you don't specify the home page URL, then the user is still able to set the home page to the new tab page by specifying 'chrome://newtab'. + Setelan halaman beranda pengguna hanya terkunci sepenuhnya jika Anda memilih halaman beranda untuk menjadi halaman tab baru, atau menetapkannya menjadi URL dan menentukan URL halaman beranda. Jika Anda tidak menentukan URL halaman beranda, maka pengguna masih dapat menetapkan halaman beranda ke halaman tab baru dengan menentukan 'chrome://newtab'. - Kebijakan 'URL akan dibuka saat permulaan' akan diabaikan, kecuali jika Anda memilih 'Buka daftar URL' dalam 'Tindakan saat permulaan'.</translation> + Kebijakan 'URL yang akan dibuka saat permulaan' akan diabaikan, kecuali jika Anda memilih 'Buka daftar URL' dalam 'Tindakan saat permulaan'.</translation> <translation id="7952958573604504839">Kebijakan ini tidak digunakan lagi di M48 guna mendukung <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" />, dan dihapus di M54. Mengaktifkan prediksi jaringan di <ph name="PRODUCT_NAME" /> dan mencegah pengguna mengubah setelan ini. @@ -3772,7 +3772,7 @@ <translation id="8312129124898414409">Memungkinkan Anda menyetel apakah situs web diizinkan untuk menggunakan pembuatan kunci atau tidak. Penggunaan pembuatan kunci dapat diizinkan atau ditolak untuk semua situs web. Jika kebijakan ini tidak disetel, 'BlockKeygen' akan digunakan dan pengguna dapat mengubahnya.</translation> -<translation id="8320149248919453401">Battery charge mode</translation> +<translation id="8320149248919453401">Mode pengisian daya baterai</translation> <translation id="8329984337216493753">Kebijakan ini aktif dalam mode eceran saja. Jika DeviceIdleLogoutTimeout ditentukan, kebijakan ini menetapkan durasi kotak peringatan dengan pewaktu hitungan mundur yang ditampilkan ke pengguna sebelum proses keluar dieksekusi. @@ -3973,7 +3973,7 @@ Jika setelan ini dinonaktifkan atau tidak disetel, layanan perlindungan sandi akan mengarahkan pengguna ke https://myaccounts.google.com untuk mengubah sandinya. Kebijakan ini hanya tersedia pada instance Windows yang dihubungkan ke domain <ph name="MS_AD_NAME" />, atau instance Windows 10 Pro atau Enterprise yang terdaftar untuk pengelolaan perangkat.</translation> <translation id="8798099450830957504">Default</translation> -<translation id="8800453707696044281">Set battery charge custom stop charging in percent</translation> +<translation id="8800453707696044281">Menetapkan nilai akhir pengisian daya baterai kustom dalam persen</translation> <translation id="8801680448782904838">Beri tahu pengguna bahwa meluncurkan ulang browser atau memulai ulang perangkat direkomendasikan atau diperlukan</translation> <translation id="8818173863808665831">Melaporkan lokasi geografis perangkat. @@ -4087,11 +4087,11 @@ Kebijakan ini hanya memengaruhi pengguna yang menjalankan autentikasi menggunakan SAML. Nilai kebijakan harus ditentukan dalam detik.</translation> -<translation id="9018338365267278833">This will remove extensions appearing in the <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> or extensions appearing in <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> that have the installation mode set to blocked and will purge local user data with it. Refer to the extensions privacy policy or data retention policy to understand what may happen with the user data that is not stored locally. +<translation id="9018338365267278833">Kebijakan ini akan menghapus ekstensi yang muncul dalam <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> atau <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> yang mode penginstalannya ditetapkan ke diblokir dan akan menghapus data pengguna lokal untuk ekstensi tersebut. Lihat kebijakan privasi atau kebijakan retensi data ekstensi untuk memahami apa yang akan terjadi dengan data pengguna yang tidak disimpan secara lokal. - When the policy is set to enabled, extensions that fall in the aforementioned lists (if already installed on a machine) will be removed from that machine in its entirety (including local user data). + Jika kebijakan ini ditetapkan ke aktif, ekstensi yang termasuk dalam daftar yang disebut sebelumnya (jika sudah terinstal di perangkat) akan dihapus dari perangkat tersebut secara keseluruhan (termasuk data pengguna lokal). - When the policy is set to disabled or left unset, extensions that fall in the aforementioned lists (if already installed on a machine and existing in the blacklist <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />) will be disabled on the machine and not uninstalled.</translation> + Jika kebijakan ini ditetapkan ke nonaktif atau tidak ditetapkan, ekstensi yang termasuk dalam daftar yang disebut sebelumnya (jika sudah terinstal di perangkat dan ada dalam daftar hitam <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />) akan dinonaktifkan di perangkat dan tidak di-uninstal.</translation> <translation id="9027787254195333560">Kebijakan ini memungkinkan Anda mengonfigurasi gambar avatar yang mewakili pengguna di layar login. Kebijakan ini ditetapkan dengan menentukan URL tempat <ph name="PRODUCT_OS_NAME" /> dapat mendownload gambar avatar dan hash kriptografi yang digunakan untuk memverifikasi integritas download. Gambar harus dalam format JPEG dan ukurannya tidak boleh lebih dari 512 kB. URL harus dapat diakses tanpa autentikasi apa pun. Gambar avatar didownload dan disimpan di cache. Gambar akan didownload ulang setiap kali URL atau hash berubah.
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb index 706a1ab5..c9c9063 100644 --- a/components/policy/resources/policy_templates_lt.xtb +++ b/components/policy/resources/policy_templates_lt.xtb
@@ -54,6 +54,13 @@ <translation id="1049138910114524876">Konfigūruojama „<ph name="PRODUCT_OS_NAME" />“ prisijungimo ekrane priverstinai vykdoma lokalė. Jei ši politika nustatyta, prisijungimo ekranas visada bus pateikiamas lokale, kuria pateikta pirma šios politikos vertė (politika apibrėžta kaip sąrašas, kad būtų suderinama ir ateityje). Jei ši politika nenustatyta arba nustatytas tuščias sąrašas, prisijungimo ekranas bus pateikiamas paskutinės naudotojo sesijos lokale. Jei ši politika nustatyta į netinkamą lokalės vertę, prisijungimo ekranas bus pateikiamas atsargine lokale (šiuo metu tai en-US).</translation> +<translation id="1052499923181221200">Ši politika neturi įtakos, nebent „SamlInSessionPasswordChangeEnabled“ nustatyta kaip „Tiesa“. + Jei ši politika nustatyta kaip „Tiesa“ ir nustatyta jos vertė, pvz., 14, tai reiškia, kad SAML naudotojams bus pranešta likus 14 dienų iki konkrečios jų slaptažodžio galiojimo pabaigos dienos. + Tada jie gali nedelsdami tai sutvarkyti pakeitę slaptažodį vykstant sesijai ir atnaujinę jį, nepasibaigus galiojimo laikui. + Bet šie pranešimai bus rodomi, tik jei SAML tapatybės teikėjas siunčia informaciją apie slaptažodžio galiojimo pabaigos laiką į įrenginį, vykstant SAML prisijungimo procesui. + Nustačius šios politikos nulinę vertę naudotojams nebus iš anksto pranešta. Jiems bus pranešta, tik kai jau bus pasibaigęs slaptažodžio galiojimo laikas. + + Jei ši politika nustatyta, naudotojas negali jos keisti ar nepaisyti.</translation> <translation id="1062011392452772310">Įgalinti nuotolinį įrenginio patvirtinimą</translation> <translation id="1062407476771304334">Pakeisti</translation> <translation id="1079801999187584280">Neleisti naudoti kūrėjo įrankių</translation> @@ -214,6 +221,7 @@ Jei politika įgalinta, „Google Assistant“ leidžiama pasiekti ekrano kontekstą. Jei politika išjungta, „Google Assistant“ neleidžiama pasiekti ekrano konteksto. Jei nenustatyta, naudotojai gali nuspręsti, ar leisti „Google Assistant“ pasiekti ekrano kontekstą.</translation> +<translation id="1376119291123231789">Išplėstinio akumuliatoriaus krovimo režimo įgalinimas</translation> <translation id="1383493480903114193">Taikant šią politiką darbo tinkle kodas priverstinai vykdomas naršyklės procese. Ši politika išjungta pagal numatytuosius nustatymus, o įgalinus naudotojui gali iškilti saugos problemų, jei darbo tinkle procesas įtraukiamas į smėlio dėžę. @@ -314,6 +322,18 @@ <translation id="1477934438414550161">1.2 versijos TLS</translation> <translation id="1502843533062797703">Įgalinti trečiosios šalies programinės įrangos įdėjimo blokavimą</translation> <translation id="1504431521196476721">Nuotolinis patvirtinimas</translation> +<translation id="1507382822467487898"> + Konfigūruojama, kuris MAC (medijos prieigos valdymo) adresas bus naudojamas, kai dokas prijungtas prie įrenginio. + + Kai dokas prijungtas prie tam tikrų modelių įrenginių, pagal numatytuosius nustatymus įrenginio priskirtas doko MAC adresas naudojamas įrenginiui identifikuoti eterneto ryšiu. Pagal šią politiką administratoriui leidžiama keisti MAC adreso šaltinį, kol prijungta prie doko. + + Jei pasirinkta „DeviceDockMacAddress“ arba politika nenustatyta, naudojamas įrenginio priskirtas doko MAC adresas. + + Jei pasirinkta „DeviceNicMacAddress“, naudojamas įrenginio NIC (tinklo sąsajos valdiklio) MAC adresas. + + Jei pasirinkta „DockNicMacAddress“, naudojamas doko NIC MAC adresas. + + Šio nustatymo naudotojas negali keisti.</translation> <translation id="1507957856411744193">Jei ši politika nustatyta į „true“, „<ph name="PRODUCT_NAME" />“ prisijungs prie perdavimo įrenginių, pasiekiamų visais IP adresais, o ne tik RFC1918 / RFC4193 privačiais adresais. Jei ši politika nustatyta į „false“, „<ph name="PRODUCT_NAME" />“ prisijungs prie perdavimo įrenginių, pasiekiamų tik RFC1918 / RFC4193 privačiais adresais. @@ -752,6 +772,17 @@ <translation id="2303795211377219696">Kredito kortelių automatinio pildymo funkcijos įgalinimas</translation> <translation id="2309390639296060546">Numatytasis geografinės vietovės nustatymas</translation> <translation id="2327252517317514801">Nurodomi domenai, kuriems leidžiama pasiekti „G Suite“</translation> +<translation id="2356878440219553005">Nurodoma akumuliatoriaus krovimo režimo energijos valdymo politika. + + Dinamiškai valdomas akumuliatoriaus krovimas, siekiant sumažinti akumuliatoriaus energijos eikvojimą dėl intensyvaus akumuliatoriaus veikimo ir pailginti akumuliatoriaus naudojimo laiką. + + Jei pasirinktas tinkinto akumuliatoriaus krovimo režimas, turi būti nurodyta „DeviceBatteryChargeCustomStartCharging“ ir „DeviceBatteryChargeCustomStopCharging“. + + Jei ši politika nustatyta, taikomas akumuliatoriaus krovimo režimas, jei palaikomas įrenginyje. + + Jei ši politika nenustatyta ir palaikoma įrenginyje, taikomas įprasto akumuliatoriaus krovimo režimas ir naudotojas negali jo pakeisti. + + Pastaba. „<ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" />“ nepaiso šios politikos, jei nurodytos anksčiau pateiktos sąlygos.</translation> <translation id="237494535617297575">Leidžiama nustatyti URL šablonų, nurodančių svetaines, kuriose leidžiama pateikti pranešimus, sąrašą. Nenustačius šios politikos, visose svetainėse naudojama visuotinė numatytoji vertė iš politikos „Numatytasis pranešimų nustatymas“ (jei nustatyta) arba naudotojo asmeninės konfigūracijos.</translation> @@ -789,6 +820,7 @@ Jei ši politika nustatyta kaip „Netiesa“, automatinio prisijungimo be delsos (jei sukonfigūruota) apeiti negalima.</translation> <translation id="2454228136871844693">Optimizuoti, kad veiktų stabiliai.</translation> +<translation id="2463034609187171371">DHE šifruotųjų programų komplektų įgalinimas TLS</translation> <translation id="2463365186486772703">Programos lokalė</translation> <translation id="2466131534462628618">Fiksuotojo portalo autentifikavimas nepaiso tarpinio serverio</translation> <translation id="2482676533225429905">Savoji susirašinėjimo pranešimais programa</translation> @@ -970,6 +1002,7 @@ <translation id="2769952903507981510">Konfigūruoti reikiamą nuotolinės prieigos prieglobų domeno pavadinimą</translation> <translation id="2787173078141616821">Informacijos apie „Android“ būseną ataskaita</translation> <translation id="2799297758492717491">Leisti automatinį medijos, atitinkančios į baltąjį sąrašą įtrauktus URL šablonus, paleidimą</translation> +<translation id="2801155097555584385">Tinkintos akumuliatoriaus krovimo pradžios vertės procentais nustatymas</translation> <translation id="2801230735743888564">Leidžiama naudotojams žaisti dinozaurų Velykų kiaušinių žaidimą, kai įrenginys neprijungtas prie interneto. Jei ši politika nustatyta į „False“, naudotojai negali žaisti dinozaurų Velykų kiaušinių žaidimo, kai įrenginys neprijungtas prie interneto. Jei šis nustatymas nustatytas į „True“, naudotojams leidžiama žaisti dinozaurų žaidimą. Jei ši politika nenustatyta, naudotojams neleidžiama žaisti dinozaurų Velykų kiaušinių žaidimo užregistruotoje „Chrome“ OS, bet leidžiama žaisti kitomis aplinkybėmis.</translation> @@ -1043,6 +1076,7 @@ Išjungus šį nustatymą arba nenustačius vertės, funkcija „Spaudinio peržiūra“ naudos pastarąjį naudotą spausdintuvą kaip numatytąją paskirties vietos parinktį. Įjungus šį nustatymą funkcija „Spaudinio peržiūra“ naudos OS sistemos numatytąjį spausdintuvą kaip numatytąją paskirties vietos parinktį.</translation> +<translation id="285627849510728211">Išplėstinio akumuliatoriaus krovimo režimo dienos konfigūracijos nustatymas</translation> <translation id="2856674246949497058">Grąžinti ir palikti tikslinę versiją, jei OS versija naujesnė nei tikslinė. Atlikti „Powerwash“ vykdant procesą.</translation> <translation id="2872961005593481000">Stabdyti</translation> <translation id="2873651257716068683">Nepaisoma numatytojo spausdinamo puslapio dydžio. Jei puslapio dydis nepasiekiamas, šios politikos nepaisoma.</translation> @@ -1175,12 +1209,26 @@ <translation id="3072045631333522102">Naudotina prisijungimo ekrano užsklanda dirbant mažmeninės prekybos režimu</translation> <translation id="3072847235228302527">Nustatyti vietinės įrenginio paskyros paslaugų teikimo sąlygas</translation> <translation id="3077183141551274418">Įgalinama arba išjungiama skirtukų naudojimo trukmė</translation> +<translation id="3079417254871857650">Nurodomas veiksmas, kurį reikia atlikti, kai naudotojo pagrindinis katalogas buvo sukurtas naudojant „eCryptfs“ šifruotę. + + Jei šią politiką nustatysite kaip „DisallowArc“, „Android“ programos bus išjungtos naudotojui ir nebus vykdomas perkėlimas iš „eCryptfs“ į „ext4“ šifruotę. Jei pagrindinis katalogas jau šifruotas naudojant „ext4“, „Android“ programas bus galima vykdyti. + + Jei šią politiką nustatysite kaip „Migrate“, pagrindiniai katalogai, užšifruoti taikant „eCryptfs“, prisijungiant bus automatiškai perkelti į „ext4“ šifruotę, neprašant naudotojo sutikimo. + + Jei šią politiką nustatysite kaip „Wipe“, pagrindiniai katalogai, užšifruoti taikant „eCryptfs“, bus ištrinti prisijungiant ir bus sukurti nauji pagrindiniai katalogai, užšifruoti taikant „ext4“. Įspėjimas: bus pašalinti naudotojo vietiniai duomenys. + + Jei šią politiką nustatysite kaip „MinimalMigrate“, pagrindiniai katalogai, užšifruoti taikant „eCryptfs“, bus ištrinti prisijungiant ir bus sukurti nauji pagrindiniai katalogai, užšifruoti taikant „ext4“. Tačiau bus bandoma išsaugoti prisijungimo prieigos raktus, kad naudotojui nereikėtų prisijungti dar kartą. Įspėjimas: bus pašalinti naudotojo vietiniai duomenys. + + Jei šią politiką nustatysite kaip parinktį, kuri nebepalaikoma („AskUser“ arba „AskForEcryptfsArcUsers“), vietoje jos bus pasirinkta „Migrate“. + + Ši politika netaikoma viešojo terminalo naudotojams. Jei ši politika nenustatyta, įrenginys veiks kaip pasirinkus nustatymą „DisallowArc“.</translation> <translation id="3086995894968271156">Konfigūruokite „Cast Receiver“ politiką „<ph name="PRODUCT_NAME" />“.</translation> <translation id="3088796212846734853">Leidžiama nustatyti URL šablonų, nurodančių svetaines, kuriose leidžiama pateikti vaizdus, sąrašą. Nenustačius šios politikos, visose svetainėse bus naudojama visuotinė numatytoji vertė iš politikos „DefaultImagesSetting“ (jei nustatyta) arba naudotojo asmeninės konfigūracijos. Atkreipkite dėmesį, kad anksčiau ši politika per klaidą buvo įgalinta „Android“, bet ši funkcija šioje platformoje niekada nebuvo visiškai palaikoma.</translation> +<translation id="3091832372132789233">Įrenginių, kurie iš pradžių prijungti prie išorinio maitinimo šaltinio, akumuliatoriaus krovimas.</translation> <translation id="3096595567015595053">Įgalintų papildinių sąrašas</translation> <translation id="3101501961102569744">Pasirinkti, kaip nurodyti tarpinio serverio nustatymus</translation> <translation id="3101709781009526431">Data ir laikas</translation> @@ -1206,6 +1254,7 @@ Jei šis nustatymas išjungtas, „<ph name="PRODUCT_NAME" />“ naudos tik sistemos lygiu įdiegtą savosios susirašinėjimo pranešimais programos prieglobą. Jei šis nustatymas nenustatytas, „<ph name="PRODUCT_NAME" />“ leis naudoti savosios susirašinėjimo pranešimais programos prieglobą naudotojo lygiu.</translation> +<translation id="3177802893484440532">Internetinių OCSP / CRL patikrų vietiniams patikimiems prieraišams reikalavimas</translation> <translation id="3185009703220253572">nuo <ph name="SINCE_VERSION" /> versijos</translation> <translation id="3187220842205194486">„Android“ negali pasiekti įmonės raktų. Ši politika jiems neturi įtakos.</translation> <translation id="3205825995289802549">Pirmo naršyklės lango padidinimas pirmą kartą paleidus programą</translation> @@ -1219,6 +1268,7 @@ <translation id="3220624000494482595">Jei viešojo terminalo programa yra „Android“ programa, ji negalės valdyti „<ph name="PRODUCT_OS_NAME" />“ versijos, net jei ši politika nustatyta į „<ph name="TRUE" />“.</translation> <translation id="3236046242843493070">URL šablonai, kuriuos naudojant galima įdiegti plėtinį, programą ir naudotojo scenarijų iš</translation> <translation id="3240609035816615922">Spausdintuvų konfigūracijos pasiekiamumo politika.</translation> +<translation id="3240655340884151271">Doko integruotas NIC MAC adresas</translation> <translation id="3243309373265599239">Nurodoma laiko trukmė be naudotojo įvesties, po kurios ekranas pritemdomas, kai naudojama kintamosios srovės energija. Kai šios politikos vertė yra didesnė už nulį, ji nurodo laiko trukmę, kurią naudotojas turi neatlikti jokių veiksmų, kol „<ph name="PRODUCT_OS_NAME" />“ pritemdys ekraną. @@ -1240,6 +1290,12 @@ Jei įgalinsite šį nustatymą arba jo nekonfigūruosite, naudotojai galės įgalinti spausdinimo iš debesies įgaliotąjį serverį, tapatumą nustatydami pagal savo „Google“ paskyrą. Jei šio nustatymo neleisite, naudotojai negalės įgalinti tarpinio serverio, o kompiuteriui bus neleidžiama bendrinti prijungtų spausdintuvų su „<ph name="CLOUD_PRINT_NAME" />“.</translation> +<translation id="3312206664202507568">Įgalinamas puslapis adresu chrome://password-change, kur SAML naudotojai gali pakeisti savo SAML slaptažodžius vykstant sesijai, kad būtų užtikrinta, jog sinchronizuojami SAML ir įrenginio užrakinimo ekrano slaptažodžiai. + + Ši politika taip pat įgalina pranešimus, įspėjančius SAML naudotojus, jei netrukus baigsis jų SAML slaptažodžių galiojimas, kad jie galėtų nedelsdami tai sutvarkyti, pakeitę slaptažodį vykstant sesijai. + Bet šie pranešimai bus rodomi, tik jei SAML tapatybės teikėjas siunčia informaciją apie slaptažodžio galiojimo pabaigos laiką į įrenginį, vykstant SAML prisijungimo procesui. + + Jei ši politika nustatyta, naudotojas negali jos keisti ar nepaisyti.</translation> <translation id="3322771899429619102">Leidžiama nustatyti URL šablonų, nurodančių svetaines, kuriose leidžiama naudoti rakto generavimą, sąrašą. Jei URL šablonas yra politikoje „KeygenBlockedForUrls“, šių išimčių nepaisoma. Nenustačius šios politikos visose svetainėse bus naudojama visuotinė numatytoji vertė iš politikos „DefaultKeygenSetting“ (jei nustatyta) arba naudotojo asmeninės konfigūracijos.</translation> @@ -1325,6 +1381,7 @@ Jei ši politika nustatyta į „False“, energijos valdymo delsa ir seanso ilgio apribojimas suaktyvinami iškart pradėjus seansą.</translation> <translation id="3478024346823118645">Ištrinti naudotojo duomenis atsijungiant</translation> +<translation id="3480961938508521469">Visiškas akumuliatoriaus įkrovimas įprastu tempu.</translation> <translation id="348495353354674884">Įgalinti virtualiąją klaviatūrą</translation> <translation id="3487623755010328395"> Nustačius šią politiką, „<ph name="PRODUCT_NAME" />“ bandys užsiregistruoti ir taikyti susijusią debesies politiką visiems profiliams. @@ -1371,6 +1428,8 @@ <translation id="3547954654003013442">Įgaliotojo serverio nustatymai</translation> <translation id="355118380775352753">Svetainės, skirtos atidaryti alternatyvioje naršyklėje</translation> <translation id="3554984410014457319">Leiskite „Google“ padėjėjui klausytis suaktyvinimo balsu frazės</translation> +<translation id="356579196325389849">Naudotojai gali konfigūruoti „Chrome“ OS leidimo kanalą</translation> +<translation id="3575011234198230041">HTTP autentifikavimas</translation> <translation id="3577251398714997599">Skelbimų nustatymai svetainėms su nepageidaujamais skelbimais</translation> <translation id="357917253161699596">Leisti naudotojams tvarkyti naudotojų sertifikatus</translation> <translation id="3583230441447348508">Nurodomas iš anksto sukonfigūruotų tinklo failų bendrinimo įrenginių sąrašas. @@ -1401,6 +1460,7 @@ Ši politika naudojama vykdant įrenginio debesies politikos registraciją staliniame kompiuteryje ir gali būti nustatyta naudojant registrą arba GPO sistemoje „Windows“, „plist“ sistemoje „Mac“ ir JSON politikos failą sistemoje „Linux“.</translation> <translation id="3660562134618097814">„SAML IdP“ slapukų perkėlimas prisijungiant</translation> +<translation id="3668151900457104753">Į juodąjį sąrašą įtrauktų plėtinių pašalinimas</translation> <translation id="3701121231485832347">Valdomi nustatymai, taikomi „<ph name="MS_AD_NAME" />“ tvarkomiems „<ph name="PRODUCT_OS_NAME" />“ įrenginiams.</translation> <translation id="3702647575225525306">„<ph name="POLICY_NAME" />“ (Vienos eilutės laukelis nebenaudojamas ir ateityje bus pašalintas. Pradėkite naudoti toliau pateiktą kelių eilučių teksto laukelį.)</translation> <translation id="3709266154059827597">Konfigūruoti plėtinių diegimo juodąjį sąrašą</translation> @@ -1482,6 +1542,16 @@ Jei ši politika paliekama nenustatyta, ekrano klaviatūra yra išjungta, bet naudotojas ją gali bet kada įgalinti.</translation> <translation id="382476126209906314">Konfigūruoti nuotolinės prieigos prieglobų „TalkGadget“ (Pokalbių programėlės) kodą</translation> <translation id="3824972131618513497">Valdomi nustatymai, susiję su energijos valdymu ir paleidimu iš naujo.</translation> +<translation id="3826475866868158882">Įgalintos „Google“ vietovės paslaugos</translation> +<translation id="3831054243924627613">Ši politika valdo pradinę „Android“ atsarginės kopijos kūrimo ir atkūrimo būseną. + + Kai ši politika nesukonfigūruota arba nustatyta kaip „<ph name="BR_DISABLED" />“, „Android“ atsarginės kopijos kūrimo ir atkūrimo funkcija yra iš karto išjungta. + + Kai ši politika nustatyta kaip „<ph name="BR_ENABLED" />“, „Android“ atsarginės kopijos kūrimo ir atkūrimo funkcija yra iš karto įjungta. + + Kai ši politika nustatyta kaip „<ph name="BR_UNDER_USER_CONTROL" />“, naudotojo prašoma pasirinkti, ar naudoti „Android“ atsarginės kopijos kūrimo ir atkūrimo funkciją. Naudotojui įgalinus atsarginės kopijos kūrimo ir atkūrimo funkciją, „Android“ programos duomenys įkeliami į „Android“ atsarginių kopijų serverius ir pakartotinai diegiant suderinamas programas yra atkuriami iš šių serverių. + + Atminkite, kad ši politika valdo „Android“ atsarginės kopijos kūrimą ir atkūrimą tik pradinio nustatymo metu. Po to naudotojas gali atidaryti „Android“ nustatymus ir įjungti ir (arba) išjungti „Android“ atsarginės kopijos kūrimo ir atkūrimo funkciją.</translation> <translation id="3831376478177535007">Įgalinus šį nustatymą, „<ph name="PRODUCT_NAME" />“ leidžia „Symantec Corporation“ išduotus pasenusių PKI operacijų sertifikatus nustatyti kaip patikimus, jei jie sėkmingai patvirtinami ir susiejami su atpažįstamu CA sertifikatu. Atminkite, kad ši politika nustatoma atsižvelgiant į operacinę sistemą, kuri vis dar atpažįsta sertifikatus iš „Symantec“ pasenusios infrastruktūros. Jei atnaujinus OS pakeičiama, kaip OS apdoroja tokius sertifikatus, ši politika nebegalioja. Be to, ši politika teikiama kaip laikina sprendimo priemonė, norint suteikti įmonėms daugiau laiko pereiti nuo pasenusių „Symantec“ sertifikatų. Ši politika bus pašalinta 2019 m. sausio 1 d. arba šiek tiek vėliau / anksčiau. @@ -1565,6 +1635,15 @@ Jei nenustatyta arba nustatyta kaip „false“, naudotojai galės perkelti failus į „Google“ diską.</translation> <translation id="3915395663995367577">URL, siejantis su tarpinio serverio .pac failu</translation> +<translation id="3920892052017026701">Nustatoma tinkinta akumuliatoriaus krovimo pradžios vertė procentais. + + Akumuliatorius pradedamas krauti, kai pasiekiama tinkinta akumuliatoriaus krovimo pradžios vertė. + + Vertė „DeviceBatteryChargeCustomStartCharging“ turi būti mažesnė nei vertė „DeviceBatteryChargeCustomStopCharging“. + + Ši politika naudojama, tik jei nustatytas tinkintas režimas „DeviceBatteryChargeMode“. + + Jei ši politika nesukonfigūruota arba nenustatyta, taikomas įprastas akumuliatoriaus krovimo režimas.</translation> <translation id="3925377537407648234">Ekrano skyros ir mastelio koeficiento nustatymas</translation> <translation id="3939893074578116847">Siunčiami tinklo paketai į valdymo serverį, siekiant stebėti prisijungimo būseną, kad serveryje būtų aptikta, ar įrenginys prijungtas prie interneto. @@ -1695,6 +1774,7 @@ <translation id="4150201353443180367">Pateiktis</translation> <translation id="4157003184375321727">Pranešti OS ir programinės aparatinės įrangos versiją</translation> <translation id="4157594634940419685">Leisti pasiekti savuosius CUPS spausdintuvus</translation> +<translation id="4160962198980004898">Įrenginio MAC adreso šaltinis, kai prijungta prie doko</translation> <translation id="4163705126749612234">Konfigūruojami būtini klientų domenų pavadinimai, kurie bus nustatyti nuotolinės prieigos klientams, ir neleidžiama naudotojams jų keisti. Jei šis nustatymas įgalintas, tik klientai iš nurodyto domeno gali prisijungti prie prieglobos. @@ -1772,6 +1852,7 @@ Atminkite, kad politika su programos ID nebūtinai reiškia, kad naudotojas galės įgalinti programą kaip užrašų programą užrakinimo ekrane (pvz., 61 versijos „Chrome“ platforma papildomai apriboja pasiekiamų programų rinkinį). Jei politika nenustatyta, nebus taikoma jokių programų, kurias naudotojas gali įgalinti užrakinimo ekrane, rinkinio apribojimų.</translation> +<translation id="4313767483634435271">Įrenginio priskirtas doko MAC adresas</translation> <translation id="4322842393287974810">Leisti automatiškai be delsos paleistai viešojo terminalo programai valdyti „<ph name="PRODUCT_OS_NAME" />“ versiją</translation> <translation id="4325690621216251241">Pridėti atsijungimo mygtuką prie sistemos dėklo</translation> <translation id="4332177773549877617">Registruoti „Android“ programų diegimo įvykius</translation> @@ -1803,6 +1884,7 @@ <translation id="4360826270668210664">Nustačius šią politiką, nuotolinės prieigos prieglobai reikės autentifikuoti klientus, kad gautų autentifikavimo prieigos raktą iš šio URL, kad galėtų prisijungti. Reikia naudoti su „RemoteAccessHostTokenValidationUrl“. Ši funkcija šiuo metu serveryje išjungta.</translation> +<translation id="4363057787588706121">Leidimas sujungti įrašų politikos nuostatas iš skirtingų šaltinių</translation> <translation id="436581050240847513">Pateikti įrenginio tinklo sąsajų ataskaitą</translation> <translation id="4372704773119750918">Neleisti įmonės naudotojui būti kelių profilių dalimi (pirminiu ar antriniu naudotoju)</translation> <translation id="4377599627073874279">Leisti visose svetainėse rodyti visus vaizdus</translation> @@ -1975,6 +2057,7 @@ <translation id="4826326557828204741">Veiksmas, kuris bus atliktas, kai bus pasiektas neaktyvumo delsos laikas, veikiant iš akumuliatoriaus energijos</translation> <translation id="4832852360828533362">Naudotojų ir įrenginių ataskaitų teikimas</translation> <translation id="4834526953114077364">Naudotojai, kurie jungėsi seniausiai ir kurie nebuvo prisijungę per paskutinius 3 mėnesius, šalinami, kol atsiras pakankamai laisvos vietos</translation> +<translation id="4835622243021053389">NTLMv2 autentifikavimo įgalinimas.</translation> <translation id="4858735034935305895">Leisti viso ekrano režimą</translation> <translation id="4861767323695239729">Naudotojo sesijoje leidžiamų įvesties metodų konfigūravimas</translation> <translation id="487460824085252184">Perkeliama automatiškai, neprašant naudotojo sutikimo.</translation> @@ -2097,6 +2180,11 @@ Taisyklės taikomos abiem kryptimis, priešingai nei „<ph name="URL_LIST_POLICY_NAME" />“. T. y., kai pateikiamas ir įgalinamas „Internet Explorer“ priedas, jis taip pat valdo, ar „<ph name="IE_PRODUCT_NAME" />“ turėtų atidaryti šiuos URL sistemoje „<ph name="PRODUCT_NAME" />“.</translation> <translation id="5124368997194894978">Kintamosios srovės (KS) šaltinio paleidimo įgalinimas</translation> +<translation id="5131211790949066746">Galima sujungti plėtinių diegimo įrašų politikos nuostatas iš „<ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />“, „<ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" />“ ir „<ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />“. + + Įjungus šį nustatymą, įrenginio platformos politikos, įrenginio debesies politikos ir naudotojo platformos politikos vertės sujungiamos į vieną įrašą ir naudojamos kaip viena bendra politika užuot naudojus tik vieno, didžiausio prioriteto, šaltinio vertes. + + Išjungus šį nustatymą arba nenustačius, atsižvelgiama tik į didžiausio prioriteto šaltinio įrašus, o visi kiti šaltiniai rodomi kaip prieštaraujantys, bet jų nepaisoma.</translation> <translation id="5141670636904227950">Nustatyti numatytąjį ekrano didinimo tipą, kuris įgalintas prisijungimo ekrane</translation> <translation id="5142301680741828703">„<ph name="PRODUCT_FRAME_NAME" />“ visada pateikti šiuos URL šablonus</translation> <translation id="5148753489738115745">Leidžia nurodyti papildomus parametrus, naudojamus, kai „<ph name="PRODUCT_FRAME_NAME" />“ paleidžia „<ph name="PRODUCT_NAME" />“. @@ -2220,6 +2308,7 @@ Jei politika nenustatyta arba nustatyta į tuščią eilutę arba negaliojantį prievado diapazoną, „WebRTC“ leidžiama naudoti bet kokį pasiekiamą vietinį UDP prievadą.</translation> <translation id="5290940294294002042">Nurodyti papildinių, kuriuos naudotojas gali įgalinti arba kurių gali neleisti, sąrašą</translation> +<translation id="5306186200045823863">Patikimumo nustatymų įgalinimas „Symantec Corporation“ pasenusioje PKI infrastruktūroje</translation> <translation id="5307432759655324440">Inkognito režimo pasiekiamumas</translation> <translation id="5318185076587284965">Įgalinti perdavimo serverių naudojimą per nuotolinės prieigos prieglobą</translation> <translation id="5323128137188992869">Leidimas perduoti turinį į įrenginį naudojant „<ph name="PRODUCT_NAME" />“. @@ -2322,6 +2411,7 @@ Jei taisyklės prieštarauja viena kitai, sistemoje „<ph name="PRODUCT_NAME" />“ naudojama konkrečiausia taisyklė.</translation> <translation id="5475361623548884387">Įgalinti spausdinimą</translation> <translation id="547601067149622666">Neleisti skelbimų svetainėje su nepageidaujamais skelbimais</translation> +<translation id="5483065054530244863">SHA-1 pasirašytų sertifikatų, išduotų naudojant vietinius patikimus prieraišus, leidimas</translation> <translation id="5483777239978559943">Ši politika nebenaudojama. Naudokite „<ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" />“ „Flash“ papildinio pasiekiamumui valdyti ir „<ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" />“, kad galėtumėte valdyti, ar atidarant PDF failus turėtų būti naudojama integruota PDF peržiūros priemonė. Nurodomas papildinių, kuriuos naudotojas gali įgalinti arba išjungti „<ph name="PRODUCT_NAME" />“, sąrašas. @@ -2438,6 +2528,17 @@ Jei įgalinsite šią politiką ar jos nenustatysite, naudotojai galės peržiūrėti savo slaptažodžius nešifruotu tekstu slaptažodžių tvarkytuvėje.</translation> <translation id="5620392548325769024">Pasisveikinimo puslapio rodymo pirmą kartą paleidus naršyklę po OS naujovinimo įgalinimas</translation> <translation id="5630352020869108293">Atkurti paskutinę sesiją</translation> +<translation id="5643906875497889108">Valdoma, kurių tipų programas / plėtinius leidžiama įdiegti, ir apribojama vykdymo laiko prieiga. + + Taikant šį nustatymą į baltąjį sąrašą įtraukiami leidžiamų tipų plėtiniai / programos, kuriuos galima įdiegti „<ph name="PRODUCT_NAME" />“, ir nurodoma, su kokiomis prieglobomis galima sąveikauti. Vertė yra eilučių, kurių kiekvienos vertė turėtų būti viena iš nurodytų toliau, sąrašas. „extension“, „theme“, „user_script“, „hosted_app“, „legacy_packaged_app“, „platform_app“. Jei reikia daugiau informacijos apie šiuos tipus, žr. „<ph name="PRODUCT_NAME" />“ plėtinių dokumentus. + + Atminkite, kad ši politika taip pat turi įtakos plėtiniams ir programoms, kurios turi būti priverstinai įdiegtos naudojant „ExtensionInstallForcelist“. + + Jei šis nustatymas sukonfigūruotas, plėtiniai / programos, kurių tipas nenurodytas sąraše, nebus įdiegti. + + Jei šis nustatymas nesukonfigūruotas, nebus taikomi jokie priimtinų plėtinių / programų tipų apribojimai. + + Naudojant ankstesnę nei 75 versiją kelių kableliais atskirtų plėtinių ID naudojimas nepalaikomas ir bus praleistas. Likusi politika bus toliau taikoma.</translation> <translation id="5645779841392247734">Leisti slapukus šiose svetainėse</translation> <translation id="5689430183304951538">Numatytasis spausdinamo puslapio dydis</translation> <translation id="5693469654327063861">Leisti perkelti duomenis</translation> @@ -2477,6 +2578,7 @@ <translation id="5765780083710877561">Aprašas:</translation> <translation id="5770738360657678870">Kuriamas kanalas (gali būti nestabilus)</translation> <translation id="5774856474228476867">Numatytojo paieškos teikėjo paieškos URL</translation> +<translation id="5775235485119094648">Akumuliatoriaus krovimas esant fiksuotam diapazonui.</translation> <translation id="5776485039795852974">Paklausti kaskart, kai svetainėje norima rodyti darbalaukio pranešimus</translation> <translation id="5781412041848781654">Nurodoma, kurią GSSAPI biblioteką reikia naudoti, nustatant HTTP autentifikavimą. Galima nustatyti vien tik bibliotekos pavadinimą arba visą kelią. @@ -2544,6 +2646,7 @@ <translation id="5893553533827140852">Jei šis nustatymas įgalintas, „Gnubby“ autentifikavimo užklausos bus perduotos įgaliotajam serveriui nuotolinės prieglobos ryšiu. Jei šis nustatymas išjungtas arba nesukonfigūruotas, „Gnubby“ autentifikavimo užklausos nebus perduotos įgaliotajam serveriui.</translation> +<translation id="5897913798715600338">Akumuliatoriaus įkrovimas naudojant greitojo įkrovimo technologijas.</translation> <translation id="5898486742390981550">Kai keli naudotojai yra prisijungę, tik pagrindinis naudotojas gali naudoti „Android“ programas.</translation> <translation id="5900196529149231477"> Ši politika taikoma prisijungimo ekranui. Taip pat žr. politiką „<ph name="ISOLATE_ORIGINS_POLICY_NAME" />“, kuri taikoma naudotojo sesijai. Rekomenduojama abiejų tipų politikai nustatyti tą pačią vertę. Jei vertės neatitiks, pradedant naudotojo sesiją gali būti uždelsta, kol taikoma naudotojo politikos nurodyta vertė. @@ -2552,12 +2655,14 @@ Nesukonfigūravus politikos prisijungimo ekrane bus naudojami numatytieji platformos svetainių atskyrimo nustatymai. </translation> <translation id="5901427587865226597">Tik dvipusis spausdinimas</translation> +<translation id="5905473632148429217">Internetinių OCSP / CRL patikrų įgalinimas</translation> <translation id="5906199912611534122">Leidžiama įgalinti arba išjungti tinklo reguliavimą. Tai taikoma visiems naudotojams ir visoms sąsajoms įrenginyje. Nustačius reguliavimas taikomas, kol politika pakeičiama, kad jis būtų išjungtas. Nustačius į „False“, nereguliuojama. Nustačius į „True“, sistema reguliuojama, kad pasiektų pateiktą įkėlimo ir atsisiuntimo spartą (kilobitais per sek.).</translation> +<translation id="591088232153082363">Prisitaikančio krovimo akumuliatorius, kraunamas pagal akumuliatoriaus energijos vartojimo šabloną.</translation> <translation id="5921713479449475707">Leisti automatinio naujinio atsisiuntimus naudojant HTTP</translation> <translation id="5921888683953999946">Nustatyti numatytąją didelio žymeklio pasiekiamumo funkciją prisijungimo ekrane. @@ -2578,6 +2683,7 @@ <translation id="5950205771952201658">Jei įvyksta laikinoji klaida, atlikus internetinius panaikinimo patikrinimus sauga nėra užtikrinama efektyviai, todėl jie išjungiami pagal numatytuosius nustatymus naudojant 19 ar naujesnę „<ph name="PRODUCT_NAME" />“ versiją. Nustačius šios politikos reikšmę į „true“, atkuriama ankstesnė elgsena ir internete atliekami OCSP / CRL patikrinimai. Jei politika nenustatyta arba jos reikšmė nustatyta kaip „false“, „<ph name="PRODUCT_NAME" />“ neatliks internetinių panaikinimo patikrinimų 19 ar naujesnės versijos „<ph name="PRODUCT_NAME" />“.</translation> +<translation id="5961137303188584693">Įrenginio integruotas NIC MAC adresas</translation> <translation id="5966615072639944554">Plėtiniams leidžiama naudoti nuotolinio patvirtinimo API</translation> <translation id="5983708779415553259">Numatytoji elgsena, skirta svetainėms, neesančioms turinio paketuose</translation> <translation id="5997543603646547632">Naudoti 24 val. laikrodį pagal numatytuosius nustatymus</translation> @@ -2668,6 +2774,17 @@ <translation id="6111936128861357925">Leisti dinozaurų Velykų kiaušinių žaidimą</translation> <translation id="6114416803310251055">nepatvirtinta</translation> <translation id="6133088669883929098">Leisti visoms svetainėms naudoti rakto generavimą</translation> +<translation id="6136537398661737682">Ši politika valdo pradinę „Google“ vietovės paslaugų būseną. + + Kai ši politika nesukonfigūruota arba nustatyta kaip „<ph name="GLS_DISABLED" />“, „Google“ vietovės paslaugos yra iš karto išjungtos. + + Kai ši politika nustatyta kaip „<ph name="GLS_ENABLED" />“, „Google“ vietovės paslaugos yra iš karto įgalintos. + + Kai ši politika nustatyta kaip „<ph name="GLS_UNDER_USER_CONTROL" />“, naudotojo prašoma pasirinkti, ar naudoti „Google“ vietovės paslaugas. Bus leidžiama „Android“ programoms naudoti paslaugas užklausoms dėl įrenginio vietovės teikti ir bus leidžiama teikti anoniminius vietovės duomenis „Google“. + + Atminkite, kad ši politika valdo „Google“ vietovės paslaugų būseną tik pradinio nustatymo metu. Po to naudotojas gali atidaryti „Android“ nustatymus ir įjungti ir (arba) išjungti „Google“ vietovės paslaugas. + + Atminkite, kad šios politikos nepaisoma ir „Google“ vietovės paslaugos yra visada išjungtos, kai politika „<ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" />“ nustatyta kaip „<ph name="BLOCK_GEOLOCATION_SETTING" />“.</translation> <translation id="6141402445226505817">Visada leisti aptikti laiko juostą</translation> <translation id="6145799962557135888">Leidžiama nurodyti URL šablonų, nurodančių svetaines, kuriose leidžiama paleisti „JavaScript“, sąrašą. @@ -2743,9 +2860,17 @@ Jei ši politika išjungta, automatinio pildymo formų duomenys neimportuojami. Jei nenustatyta, naudotojo gali būti paklausta, ar importuoti, arba gali būti automatiškai importuojama.</translation> +<translation id="6221175752766085998">Leidžiami sertifikatai, išduoti naudojant vietinius patikimus prieraišus be plėtinio „subjectAlternativeName“</translation> <translation id="6224304369267200483">URL / domenams automatiškai leidžiama tiesioginė saugos rakto atestacija</translation> <translation id="6233173491898450179">Nustatyti atsisiuntimo katalogą</translation> <translation id="6244210204546589761">Paleidžiant atidaromi URL</translation> +<translation id="6255387031094435995">Leidžiama sujungti pasirinktas politikos nuostatas, kai jos teikiamos iš skirtingų šaltinių, taikant tokią pat apimtį ir lygį. + + Jei politika pateikta įraše, esant nesuderinamiems dviems šaltiniams ir vienodai jų apimčiai bei lygiui, vertės sujungiamos pateikiant naują politikos įrašą. + + Jei politika pateikta įraše, esant nesuderinamiems dviems šaltiniams ir skirtingoms apimtims ir (arba) lygiui, taikoma aukščiausio prioriteto politika. + + Jei politika nepateikta įraše, esant nesuderinamiems šaltiniams, apimtims ir (arba) lygiui, taikoma aukščiausio prioriteto politika.</translation> <translation id="6258193603492867656">Nurodoma, ar į sugeneruotą „Kerberos“ SPN turi būti įtrauktas nestandartinis prievadas. Jei įgalinsite šį nustatymą ir įvesite nestandartinį prievadą (t. y. ne 80 arba 443, o kitokį prievadą), jis bus įtrauktas į sugeneruotą „Kerberos“ SPN. @@ -2947,6 +3072,7 @@ <translation id="6757438632136860443">Galima nustatyti URL šablonų, kuriuose nurodomos svetainės, kurioms leidžiama paleisti papildinį „<ph name="FLASH_PLUGIN_NAME" />“, sąrašą. Jei ši politika nenustatyta, visose svetainėse bus naudojama visuotinė numatytoji vertė iš politikos „DefaultPluginsSetting“ (jei ji nustatyta) arba naudotojo asmeninės konfigūracijos (kitu atveju).</translation> +<translation id="6757613329154374267">Atsarginės kopijos kūrimo ir atkūrimo funkcija įgalinta</translation> <translation id="6762235610019366960">Leidžiama valdyti per visą skirtuką pateikiamo reklaminio ir (arba) mokomojo turinio rodymą naršyklėje „<ph name="PRODUCT_NAME" />“. Jei nesukonfigūruota ar neįgalinta (nustatyta kaip „tiesa“), „<ph name="PRODUCT_NAME" />“ gali būti rodomas per visą skirtuką pateikiamas turinys naudotojams, norint teikti produkto informaciją. @@ -2969,6 +3095,7 @@ Eilutėje gali būti kintamųjų ${ASSET_ID}, ${SERIAL_NUM}, ${MAC_ADDR}, ${MACHINE_NAME}, kurie bus pakeisti įrenginio vertėmis, prieš naudojant juos kaip prieglobos serverio pavadinimą. Rodomas pakeitimas turi būti tinkamas prieglobos serverio pavadinimas (RFC 1035, 3.1 skiltis). Jei ši politika nenustatyta arba po pakeitimo rodoma vertė nėra tinkamas prieglobos serverio pavadinimas, DHCP užklausoje nebus nustatytas joks prieglobos serverio pavadinimas. </translation> +<translation id="6833988859168635883">Paleidimo, pagrindinis ir naujo skirtuko puslapiai</translation> <translation id="6835883744948188639">Pasikartojančio raginimo, kuriame nurodoma, kad rekomenduojama paleisti iš naujo, rodymas naudotojui</translation> <translation id="6837480141980366278">Valdoma, ar integruota DNS kliento programa naudojama „<ph name="PRODUCT_NAME" />“. @@ -3081,6 +3208,17 @@ Kai ekranas turėtų būti pritemdomas, išmanusis pritemdymo modelis įvertina, ar ekrano pritemdymo nereikia atidėti. Jei išmanusis pritemdymo modelis atideda ekrano pritemdymą, jis veiksmingai pratęsia laiką iki ekrano pritemdymo. Tokiu atveju ekrano išjungimo, ekrano užrakto ir neveikos būsenos delsos koreguojamos siekiant išlaikyti vienodą laiką nuo pirminės sukonfigūruotos pritemdymo delsos. Jei ši politika nustatyta kaip „True“ arba paliekama nenustatyta, išmanusis pritemdymo modelis bus įgalintas ir jam bus leista pratęsti laiką iki ekrano pritemdymo. Jei ši politika nustatyta kaip „False“, išmanusis pritemdymo modelis neturės įtakos ekrano pritemdymui.</translation> +<translation id="6967394885063085697">Įgalinama išplėstinio akumuliatoriaus krovimo režimo energijos valdymo politika. + + Taikant išplėstinio akumuliatoriaus krovimo režimą leidžiama naudotojui maksimizuoti akumuliatoriaus būseną. Išplėstinio krovimo režimu sistema naudos įprasto krovimo algoritmą ir kitus metodus ne darbo valandomis akumuliatoriaus būsenai maksimizuoti. Darbo valandomis naudojamas greitasis krovimas. Naudojant greitąjį krovimą galima sparčiau įkrauti akumuliatorių, todėl akumuliatorius sparčiau visiškai įkraunamas. Kiekvieną dieną laikotarpis, kurį sistema bus daugiausia naudojama, nurodomas pagal pradžios laiką ir trukmę. + + Jei ši politika nustatyta kaip „Tiesa“ ir nustatyta „DeviceAdvancedBatteryChargeModeDayConfig“, išplėstinio akumuliatoriaus krovimo režimas yra visada įgalintas, jei palaikomas įrenginyje. + + Jei ši politika nustatyta kaip „Netiesa“, išplėstinio akumuliatoriaus krovimo režimas yra visada išjungtas. + + Jums nustačius šią politiką naudotojai negalės jos pakeisti ar nepaisyti. + + Jei ši politika nenustatyta, išplėstinio akumuliatoriaus krovimo režimas yra išjungtas ir naudotojas jo įjungti negali.</translation> <translation id="6972540544240464302">Pasirinkite užduočių planuoklio konfigūraciją</translation> <translation id="6979158407327259162">„Google“ diskas</translation> <translation id="6994082778848658360">Nurodoma, kaip vidinė saugi elemento aparatinė įranga gali būti naudojama teikiant tapatybės nustatymą dviem veiksniais, jei ji suderinama su šia funkcija. Įrenginio maitinimo mygtukas naudojamas naudotojo buvimo vietai aptikti. @@ -3158,6 +3296,17 @@ Jei įgalinsite arba išjungsite šį nustatymą, naudotojai negalės jo pakeisti arba nepaisyti. Nenustačius politikos, naudotojas galės pasirinkti, ar atrakinant įrenginį turi būti prašoma slaptažodžio.</translation> +<translation id="7107148737865880402">Įgalinama USB maitinimo bendrinimo maitinimo valdymo politika. + + Tam tikruose įrenginiuose yra konkretus USB prievadas, pažymėtas žaibo strėlės ar akumuliatoriaus piktograma, kurį galima naudoti įrenginiams, pvz., mobiliajam telefonui, krauti naudojant sistemos akumuliatorių. Ši politika turi įtakos šio prievado krovimo elgsenai, kai sistema veikia miego būsenos ir išjungimo režimais. Ši politika neturi įtakos kitiems USB prievadams ir krovimo elgsenai, kai sistema aktyvi. + + Kai sistema aktyvi, USB prievadas visada tiekia energiją. + + Kai įjungta miego būsena, jei ši politika nustatyta kaip „Tiesa“, energija tiekiama į USB prievadą, kai įrenginys prijungtas prie sieninio kroviklio arba esant daugiau nei 50 proc. akumuliatoriaus energijos lygiui. Kitu atveju energija netiekiama. + + Kai sistema išjungta, jei ši politika nustatyta kaip „Tiesa“, energija tiekiama į USB prievadą, kai įrenginys prijungtas prie sieninio kroviklio. Kitu atveju energija netiekiama. + + Jei ši politika nenustatyta, politika yra įgalinta ir naudotojas negali jos išjungti.</translation> <translation id="7115494316187648452">Nustatoma, ar „<ph name="PRODUCT_NAME" />“ procesas pradedamas prisijungiant prie OS ir toliau vykdomas, kai uždaromas paskutinis naršyklės langas, leidžiant foninėms programoms ir dabartinei naršymo sesijai išlikti aktyvioms, įskaitant visus sesijos slapukus. Vykdant foninį procesą pateikiama piktograma sistemos juostelėje; jį galima bet kada čia uždaryti. Jei ši politika nustatyta į „True“, foninis režimas įgalinamas ir naudotojas negali jo valdyti naršyklės nustatymuose. @@ -3207,6 +3356,7 @@ Jei ši politika nustatyta kaip „Tiesa“ arba nenustatyta, ekrano pažadinimo užraktams leidžiama tvarkyti energiją, nebent „AllowWakeLocks“ nustatyta kaip „Netiesa“. Jei ši politika nustatyta kaip „Netiesa“, ekrano pažadinimo užraktų užklausos pažeminamos ir nustatomos kaip sistemos pažadinimo užraktų užklausos.</translation> +<translation id="7177857088692019405">Spartusis atrakinimas</translation> <translation id="7185078796915954712">1.3 versijos TLS</translation> <translation id="718956142899066210">Leistini ryšio tipai naujinant</translation> <translation id="7194407337890404814">Numatytojo paieškos teikėjo pavadinimas</translation> @@ -3271,6 +3421,7 @@ <translation id="7273823081800296768">Jei šis nustatymas įgalintas arba nesukonfigūruotas, naudotojai gali pasirinkti susieti klientus ir prieglobas prisijungdami ir nereikia kaskart įvesti PIN kodo. Jei šis nustatymas neleidžiamas, ši funkcija nepasiekiama.</translation> +<translation id="7274077256421167535">USB maitinimo bendrinimo įgalinimas</translation> <translation id="7275334191706090484">Tvarkomos žymės</translation> <translation id="7291084543582732020">Jei įgalinsite šį nustatymą, naudotojai galės naudoti „Smart Lock“, kai atitiks funkcijos reikalavimus. @@ -3284,6 +3435,7 @@ Ši politika taikoma, tik jei įgalinta politika „DefaultSearchProviderEnabled“.</translation> <translation id="7302043767260300182">Ekrano užrakto delsa, kai naudojama kintamosios srovės energija</translation> +<translation id="7305262223970835999">Įgalinamas SAML naudotojų slaptažodžio keitimo per sesiją puslapis.</translation> <translation id="7311458740754205918">Jei ši politika nustatyta kaip „true“ arba nenustatyta, naujo skirtuko puslapyje gali būti rodomi turinio pasiūlymai pagal naudotojo naršymo istoriją, pomėgius ir vietovę. Jei ši politika nustatyta kaip „false“, automatiškai sugeneruoti turinio pasiūlymai naujo skirtuko puslapyje nerodomi.</translation> @@ -3410,6 +3562,15 @@ Jei politikos vertė nustatoma į 0, bus naudojama numatytojo dydžio talpykla, bet naudotojas negalės jos pakeisti. Jei ši politika nenustatyta, bus naudojamas numatytasis dydis, o naudotojas galės jį perrašyti naudodamas parametrą „--disk-cache-size“.</translation> +<translation id="759389052790680884">Nustatoma tinkinta akumuliatoriaus krovimo stabdymo vertė procentais. + + Akumuliatorius nebekraunamas pasiekus tinkintą akumuliatoriaus krovimo stabdymo vertę. + + Vertė „DeviceBatteryChargeCustomStartCharging“ turi būti mažesnė nei vertė „DeviceBatteryChargeCustomStopCharging“. + + Ši politika naudojama, tik jei nustatytas tinkintas režimas „DeviceBatteryChargeMode“. + + Jei ši politika nesukonfigūruota arba nenustatyta, taikomas įprastas akumuliatoriaus krovimo režimas.</translation> <translation id="759957074386651883">Saugaus naršymo nustatymai</translation> <translation id="7604169113182304895">„Android“ programos gali pasirinkti atsižvelgti į šį sąrašą. Negalite priversti jų atsižvelgti į jį.</translation> <translation id="7612157962821894603">Visos sistemos žymos, kurios bus taikomos paleidžiant „<ph name="PRODUCT_NAME" />“</translation> @@ -3488,6 +3649,15 @@ <translation id="7712109699186360774">Klausti kiekvieną kartą, kai svetainė nori pasiekti kamerą ir (arba) mikrofoną</translation> <translation id="7713608076604149344">Atsisiuntimų apribojimai</translation> <translation id="7715711044277116530">Procentas, pagal kurį bus keičiamas ekrano užtemdymo delsos mastelis dirbant pristatymo režimu</translation> +<translation id="7716781462866245042">Nustatoma išplėstinio akumuliatoriaus krovimo režimo dienos konfigūracija. + + Ši politika naudojama, tik jei politika „DeviceAdvancedBatteryChargeModeEnabled“ nustatyta kaip „Tiesa“. + + Jei ši politika nesukonfigūruota arba nenustatyta, išplėstinio akumuliatoriaus krovimo režimas yra visada išjungtas. + + Pastaba. Lauko „<ph name="CHARGE_START_TIME_FIELD_NAME" />“ vertė turi būti mažesnė nei lauko „<ph name="CHARGE_END_TIME_FIELD_NAME" />“ vertė. + + Pastaba: leidžiamos lauko „<ph name="MINUTE_FIELD_NAME" />“ vertės laukuose „<ph name="CHARGE_START_TIME_FIELD_NAME" />“ ir „<ph name="CHARGE_END_TIME_FIELD_NAME" />“ yra 0, 15, 30, 45.</translation> <translation id="7717938661004793600">Konfigūruokite „<ph name="PRODUCT_OS_NAME" />“ pasiekiamumo funkcijas.</translation> <translation id="7724994675283793633">Ši politika įgalina HTTP/0.9 protokolą ne HTTP 80 ir HTTPS 443 prievaduose. @@ -3561,6 +3731,7 @@ Nustatomas plėtinio, kuris turėtų būti naudojamas kaip ekrano užsklanda prisijungimo ekrane, ID. Plėtinys turi būti „AppPack“ (programų paketo), kuris sukonfigūruotas šiam domenui taikant politiką „DeviceAppPack“ (įrenginio programų paketas), dalis.</translation> <translation id="7882857838942884046">Išjungus „Google“ sinchronizavimą „Android“ atsarginė kopija ir atkūrimas neveiks tinkamai.</translation> <translation id="7882890448959833986">Nerodyti nepalaikomos OS įspėjimo</translation> +<translation id="7895553628261067384">Nuotolinė prieiga</translation> <translation id="7902255855035461275">Šiame sąraše pateikti šablonai bus palyginti su užklausą pateikusio URL saugos šaltiniu. Jei bus rasta atitiktis, galimybė pasiekti vaizdo įrašą fiksuojančius įrenginius bus suteikta be raginimo. @@ -3574,6 +3745,11 @@ <translation id="7937491150792971922">Plėtinių diegimo įrašų politikos nuostatų sujungimas iš kelių šaltinių</translation> <translation id="7937766917976512374">Leisti arba blokuoti vaizdo įrašo fiksavimą</translation> <translation id="7941975817681987555">Nenumatyti tinklo veiksmų, naudojant bet kurį tinklo ryšį</translation> +<translation id="7952007677054834789">Konfigūruojami puslapiai, kurie turi būti įkelti paleidžiant, numatytasis pagrindinis puslapis bei numatytasis naujo skirtuko puslapis sistemoje „<ph name="PRODUCT_NAME" />“ ir naudotojams neleidžiama jų keisti. + + Naudotojo pagrindinio puslapio nustatymai bus visiškai užrakinti tik tada, jei kaip pagrindinį puslapį pasirinksite naujo skirtuko puslapį arba nustatysite, kad į jį būtų įkeltas URL, ir nurodysite pagrindinio puslapio URL. Jei pagrindinio puslapio URL nenurodysite, naudotojui ir toliau bus leidžiama kaip pagrindinį puslapį nustatyti naujo skirtuko puslapį nurodant „chrome://newtab“. + + Jei skiltyje „Veiksmai paleidžiant“ nepasirinksite „Atidaryti URL sąrašą“, politikos „Paleidžiant atidaromi URL“ bus nepaisoma.</translation> <translation id="7952958573604504839">Vietoje šios politikos M48 naudojama „<ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" />“ ir ji pašalinta iš M54. Įgalinamas tinklo numatymas „<ph name="PRODUCT_NAME" />“ ir naudotojams neleidžiama keisti šio nustatymo. @@ -3717,6 +3893,7 @@ <translation id="8176035528522326671">Leisti įmonei būti tik pirminiu kelių profilių naudotoju (numatytoji elgsena įmonių valdomiems naudotojams)</translation> <translation id="8214600119442850823">Konfigūruoja slaptažodžių tvarkytuvę.</translation> <translation id="8217516105848565518">Ši politika nebenaudojama. Vietoje jos naudokite „RemoteAccessHostDomainList“.</translation> +<translation id="8244171102276095471">RC4 šifruotųjų programų komplektų įgalinimas TLS</translation> <translation id="8244525275280476362">Maksimali gavimo delsa atšaukus politiką</translation> <translation id="8256688113167012935">Valdomas paskyros pavadinimas, kurį „<ph name="PRODUCT_OS_NAME" />“ rodo atitinkamo įrenginio vietinės paskyros prisijungimo ekrane. @@ -3757,6 +3934,7 @@ <translation id="8312129124898414409">Leidžiama nustatyti, ar svetainėse leidžiama naudoti rakto generavimą. Naudoti rakto generavimą gali būti leidžiama arba draudžiama visose svetainėse. Nenustačius šios politikos, bus naudojama „BlockKeygen“ ir naudotojas galės tai pakeisti.</translation> +<translation id="8320149248919453401">Akumuliatoriaus krovimo režimas</translation> <translation id="8329984337216493753">Ši politika aktyvi tik mažmeninės prekybos režimu. Kai nurodyta „Įrenginio neveikos būsenos atjungimo skirtasis laikas“, pagal šią politiką apibrėžiama įspėjimo laukelio su laiko skaičiavimo atgal laikmačiu, kuris rodomas naudotojui prieš atjungiant, trukmė. @@ -3923,6 +4101,7 @@ Jei nenustatyta, „<ph name="PRODUCT_OS_NAME" />“ įrenginiams naudojamas numatytasis 345 600 000 milisekundžių (keturių dienų) laikotarpis, o „<ph name="PRODUCT_NAME" />“ – 604 800 000 milisekundžių (vienos savaitės) laikotarpis.</translation> <translation id="8685024486845674965">Įspėjimas dėl slaptažodžio apsaugos suaktyvinamas pakartotinai naudojant slaptažodį</translation> <translation id="8693243869659262736">Naudoti integruotą DNS kliento programą</translation> +<translation id="8698286761337647563">Nurodymas, prieš kiek dienų pranešti SAML naudotojams, kad jų slaptažodžio galiojimas netrukus baigsis</translation> <translation id="8703488928438047864">Pranešimas apie plokštės būseną</translation> <translation id="8703872185032220081">Nustatomas šaltinio pakeitimo suvartojant daugiausiai energijos dienos konfigūravimas. @@ -3975,6 +4154,7 @@ Jei šis nustatymas išjungtas arba nenustatytas, naudojant slaptažodžio apsaugos paslaugą naudotojai bus siunčiami adresu https://myaccounts.google.com, kad pakeistų slaptažodį. Ši politika pasiekiama tik „Windows“ objektuose, kurie susieti su „<ph name="MS_AD_NAME" />“ domenu, arba „Windows 10 Pro“ ar „Enterprise“ objektuose, kurie užregistruoti naudoti įrenginių tvarkymo funkciją.</translation> <translation id="8798099450830957504">Numatytasis</translation> +<translation id="8800453707696044281">Tinkintos akumuliatoriaus krovimo stabdymo vertės procentais nustatymas</translation> <translation id="8801680448782904838">Pranešimas naudotojui apie rekomenduojamą ar būtiną naršyklės arba įrenginio paleidimą iš naujo</translation> <translation id="8818173863808665831">Pranešti geografinę šio įrenginio vietą. @@ -4102,6 +4282,11 @@ Ši politika turi įtakos tik naudotojams, kurie autentifikuoti naudojant SAML. Politikos vertė turėtų būti nustatyta per kelias sekundes.</translation> +<translation id="9018338365267278833">Bus pašalinti plėtiniai, rodomi „<ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />“, arba plėtiniai, rodomi „<ph name="EXTENSION_SETTINGS_POLICY_NAME" />“, kurių nustatytas užblokuotas diegimo režimas, ir bus panaikinti vietiniai naudotojo duomenys. Jei norite sužinoti, kas gali nutikti su naudotojo duomenimis, kurie nėra saugomi vietinėje sistemoje, žr. plėtinių privatumo politiką arba duomenų saugojimo politiką. + + Kai politika nustatyta kaip įgalinta, plėtiniai, kurie įtraukti į anksčiau minėtus sąrašus (jei jau įdiegti įrenginyje), bus visiškai pašalinti iš šio įrenginio (įskaitant vietinius naudotojo duomenis). + + Kai politika nustatyta kaip išjungta arba nenustatyta, plėtiniai, kurie įtraukti į anksčiau minėtus sąrašus (jei jau įdiegti įrenginyje ir pateikti juodajame sąraše „<ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />“), bus išjungti įrenginyje ir nebus pašalinti.</translation> <translation id="9027787254195333560">Ši politika suteikia galimybę konfigūruoti prisijungimo ekrane rodomą naudotojo pseudoportreto vaizdą. Politiką reikia nustatyti nurodant URL, iš kurio „<ph name="PRODUCT_OS_NAME" />“ gali atsisiųsti pseudoportreto vaizdą, ir kriptografinę maišos vertę, kuri naudojama atsisiuntimo vientisumui patvirtinti. Vaizdas turi būti JPEG formato, o dydis neturi viršyti 512 KB. URL turi būti galima pasiekti nenustačius tapatybės. Pseudoportreto vaizdas atsisiunčiamas ir įkeliamas į talpyklą. Jis bus pakartotinai atsisiųstas pakeitus URL ar maišą.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 1546aa7c..b2b6df9 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -51,6 +51,13 @@ <translation id="1049138910114524876">Hiermee wordt de taal geconfigureerd die wordt afgedwongen op het <ph name="PRODUCT_OS_NAME" />-inlogscherm. Als dit beleid is ingesteld, wordt het inlogscherm altijd weergegeven in de taal die is aangegeven door de eerste waarde van dit beleid (het beleid wordt gedefinieerd als een lijst voor voorwaartse compatibiliteit). Als dit beleid niet is ingesteld of is ingesteld op een lege lijst, wordt het inlogscherm weergegeven in de taal van de laatste gebruikerssessie. Als dit beleid is ingesteld op een waarde die geen geldige taal is, wordt het inlogscherm weergegeven in een reservetaal (momenteel en-US).</translation> +<translation id="1052499923181221200">Dit beleid heeft geen effect, tenzij SamlInSessionPasswordChangeEnabled is ingesteld op 'true'. + Als dat beleid is ingesteld op 'true' en dit beleid bijvoorbeeld is ingesteld op 14, ontvangen SAML-gebruikers 14 dagen van tevoren een melding dat hun wachtwoord op een bepaalde datum verloopt. + Ze kunnen dit direct oplossen door tijdens een sessie het wachtwoord te wijzigen voordat het verloopt. + Deze meldingen worden echter alleen weergegeven als de SAML-identiteitsprovider tijdens de SAML-inlogprocedure informatie over het verlopen van het wachtwoord verzendt naar het apparaat. + Als dit beleid wordt ingesteld op 0, ontvangen gebruikers van tevoren geen melding. Ze ontvangen pas een melding zodra het wachtwoord is verlopen. + + Als dit beleid niet is ingesteld, kan de gebruiker het niet wijzigen of overschrijven.</translation> <translation id="1062011392452772310">Externe bevestiging van apparaat inschakelen</translation> <translation id="1062407476771304334">Vervangen</translation> <translation id="1079801999187584280">Het gebruik van de hulpprogramma's voor ontwikkelaars niet toestaan</translation> @@ -212,6 +219,7 @@ Als het beleid is ingeschakeld, heeft de Google Assistent toegang tot de schermcontext. Als het beleid is uitgeschakeld, heeft de Google Assistent geen toegang tot de schermcontext. Als het beleid niet is ingesteld, kunnen gebruikers zelf bepalen of ze de Google Assistent wel of geen toegang tot de schermcontext willen verlenen</translation> +<translation id="1376119291123231789">Geavanceerde batterijoplaadmodus inschakelen</translation> <translation id="1383493480903114193">Met dit beleid wordt afgedwongen dat netwerkcode wordt uitgevoerd in het browserproces. Dit beleid is standaard uitgeschakeld. Indien ingeschakeld, worden gebruikers blootgesteld aan beveiligingsproblemen wanneer het netwerkproces in een sandbox wordt uitgevoerd. @@ -312,6 +320,18 @@ <translation id="1477934438414550161">TLS 1.2</translation> <translation id="1502843533062797703">Blokkering van injectie van software van derden inschakelen</translation> <translation id="1504431521196476721">Externe bevestiging</translation> +<translation id="1507382822467487898"> + Hiermee kun je instellen welk MAC-adres (Media Access Control) wordt gebruikt als het apparaat is aangesloten op een dock. + + Bij sommige apparaatmodellen die op een dock zijn aangesloten, wordt standaard het toegewezen dock-MAC-adres van het apparaat gebruikt om het apparaat te identificeren op Ethernet. Met dit beleid kan de beheerder de bron van het MAC-adres wijzigen terwijl het apparaat is gedockt. + + Als 'DeviceDockMacAddress' wordt geselecteerd of het beleid niet wordt ingesteld, wordt het toegewezen dock-MAC-adres van het apparaat gebruikt. + + Als 'DeviceNicMacAddress' wordt geselecteerd, wordt het MAC-adres van de NIC (Network Interface Controller) van het apparaat gebruikt. + + Als 'DockNicMacAddress' wordt geselecteerd, wordt het MAC-adres van de NIC van het dock gebruikt. + + Deze instelling kan niet worden gewijzigd door de gebruiker.</translation> <translation id="1507957856411744193">Als dit beleid is ingesteld op 'True', maakt <ph name="PRODUCT_NAME" /> verbinding met Cast-apparaten op alle IP-adressen en niet alleen op RFC1918/RFC4193-privéadressen. Als dit beleid is ingesteld op 'False', maakt <ph name="PRODUCT_NAME" /> alleen verbinding met Cast-apparaten op RFC1918/RFC4193-privéadressen. @@ -746,6 +766,17 @@ <translation id="2303795211377219696">Automatisch aanvullen inschakelen voor creditcards</translation> <translation id="2309390639296060546">Standaardinstelling voor geolocatie</translation> <translation id="2327252517317514801">Domeinen definiëren voor toegang tot G Suite</translation> +<translation id="2356878440219553005">Bepaalt het stroombeheerbeleid van de geavanceerde batterijoplaadmodus. + + Hiermee wordt het opladen van de batterij dynamisch beheerd om de batterijbelasting te minimaliseren en de levensduur van de batterij te verlengen + + Als de geavanceerde batterijoplaadmodus is geselecteerd, moeten DeviceBatteryChargeCustomStartCharging en DeviceBatteryChargeCustomStopCharging worden opgegeven. + + Als dit beleid wordt ingesteld en het apparaat deze modus ondersteunt, wordt de batterijoplaadmodus toegepast. + + Als het apparaat het beleid wel ondersteunt, maar het beleid niet wordt ingesteld, wordt de standaard batterijoplaadmodus toegepast en kan de gebruiker de modus niet wijzigen. + + Let op: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> overschrijft dit beleid als het is opgegeven.</translation> <translation id="237494535617297575">Hiermee kun je een lijst met URL-patronen opgeven van sites waarop meldingen mogen worden weergegeven. Als dit beleid niet wordt ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites op basis van het beleid 'DefaultNotificationsSetting' (als dit is ingesteld) of anders op basis van de configuratie van de gebruiker.</translation> @@ -783,6 +814,7 @@ Als dit beleid is ingesteld als 'false', kan het automatisch inloggen zonder uitstel (indien geconfigureerd) niet worden overgeslagen.</translation> <translation id="2454228136871844693">Optimaliseren voor stabiliteit.</translation> +<translation id="2463034609187171371">DHE-coderingssuites inschakelen in TLS</translation> <translation id="2463365186486772703">Landinstelling voor applicatie</translation> <translation id="2466131534462628618">Captive portal-verificatie negeert proxyserver</translation> <translation id="2482676533225429905">Systeemeigen berichten</translation> @@ -964,6 +996,7 @@ <translation id="2769952903507981510">De vereiste domeinnaam configureren voor hosts voor externe toegang</translation> <translation id="2787173078141616821">Informatie over de status van Android rapporteren</translation> <translation id="2799297758492717491">Automatisch afspelen van media toestaan op een witte lijst met URL-patronen</translation> +<translation id="2801155097555584385">Een custom startpunt voor batterijoplading opgeven in procenten</translation> <translation id="2801230735743888564">Toestaan dat gebruikers de easter egg-dinosaurusgame spelen wanneer het apparaat offline is. Als dit beleid is ingesteld op 'False', kunnen gebruikers de easter egg-dinosaurusgame niet spelen wanneer het apparaat offline is. Als deze instelling is ingesteld op 'True', kunnen gebruikers de easter egg-dinosaurusgame spelen. Als dit beleid niet is ingesteld, kunnen gebruikers de easter egg-dinosaurusgame niet spelen op geregistreerde Chrome OS-apparaten, maar kunnen ze deze wel onder andere omstandigheden spelen.</translation> @@ -1036,6 +1069,7 @@ Als je deze instelling uitschakelt of geen waarde instelt, gebruikt Afdrukvoorbeeld de laatst gebruikte printer als standaardbestemming. Als je deze instelling inschakelt, gebruikt Afdrukvoorbeeld de standaardprinter van het besturingssysteem als standaardbestemming.</translation> +<translation id="285627849510728211">Dagconfiguratie voor geavanceerde batterijoplaadmodus instellen</translation> <translation id="2856674246949497058">Herstel en blijf op de doelversie als de OS-versie nieuwer is dan de doelversie. Voer een powerwash uit tijdens het proces.</translation> <translation id="2872961005593481000">Afsluiten</translation> <translation id="2873651257716068683">Hiermee overschrijf je de standaardgrootte voor de afdrukpagina. Als de paginagrootte niet beschikbaar is, wordt dit beleid genegeerd.</translation> @@ -1170,12 +1204,26 @@ <translation id="3072045631333522102">Screensaver voor gebruik in het inlogvenster in de winkelmodus</translation> <translation id="3072847235228302527">De Servicevoorwaarden instellen voor een apparaat-lokaal account</translation> <translation id="3077183141551274418">Hiermee schakel je levenscyclussen voor tabbladen in of uit</translation> +<translation id="3079417254871857650">Specificeert de actie die moet worden uitgevoerd wanneer de homedirectory van de gebruiker is gemaakt met ecryptfs-versleuteling. + + Als je dit beleid instelt op 'DisallowArc', worden Android-apps uitgeschakeld voor de gebruiker en wordt de migratie van ecryptfs- naar ext4-versleuteling niet uitgevoerd. Als de homedirectory al beschikt over ext4-versleuteling, worden Android-apps uitgevoerd. + + Als je dit beleid instelt op 'Migrate', worden homedirectory's met ecryptfs-versleuteling nadat je bent ingelogd en zonder om toestemming te vragen automatisch overgezet naar ext4-versleuteling. + + Als je dit beleid instelt op 'Wipe', worden homedirectory's met ecryptfs-versleuteling verwijderd nadat je bent ingelogd en worden er in plaats daarvan nieuwe homedirectory's met ext4-versleuteling gemaakt. Waarschuwing: Hiermee worden de lokale gegevens van de gebruiker verwijderd. + + Als je dit beleid instelt op 'MinimalMigrate', worden homedirectory's met ecryptfs-versleuteling verwijderd nadat je bent ingelogd en worden er in plaats daarvan nieuwe homedirectory's met ext4-versleuteling gemaakt. Er wordt echter geprobeerd de inlogtokens te behouden, zodat de gebruiker niet opnieuw hoeft in te loggen. Waarschuwing: Hiermee worden de lokale gegevens van de gebruiker verwijderd. + + Als je dit beleid instelt op een optie die niet meer wordt ondersteund ('AskUser' of 'AskForEcryptfsArcUsers'), wordt het beleid uitgevoerd alsof je 'Migrate' hebt geselecteerd. + + Dit beleid is niet van toepassing op kioskgebruikers. Als dit beleid niet is ingesteld, gedraagt het apparaat zich alsof 'DisallowArc' is geselecteerd.</translation> <translation id="3086995894968271156">De Cast-receiver instellen in <ph name="PRODUCT_NAME" />.</translation> <translation id="3088796212846734853">Hiermee kun je een lijst met URL-patronen instellen waarmee sites worden gespecificeerd die afbeeldingen mogen weergeven. Als dit beleid niet wordt ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites op basis van het beleid DefaultPopupsSetting (als dit is ingesteld) of anders op basis van de configuratie van de gebruiker. Dit beleid werd eerder ten onrechte ingeschakeld op Android, maar deze functionaliteit is nooit volledig ondersteund geweest op Android.</translation> +<translation id="3091832372132789233">Batterijen opladen van apparaten die ook zijn aangesloten op een externe voedingsbron.</translation> <translation id="3096595567015595053">Lijst met ingeschakelde plug-ins</translation> <translation id="3101501961102569744">Kies hoe je proxyserverinstellingen wilt specificeren</translation> <translation id="3101709781009526431">Datum en tijd</translation> @@ -1201,6 +1249,7 @@ Als deze instelling is uitgeschakeld, gebruikt <ph name="PRODUCT_NAME" /> alleen hosts voor native berichten die zijn geïnstalleerd op systeemniveau. Als deze instelling niet wordt ingesteld, staat <ph name="PRODUCT_NAME" /> het gebruik toe van hosts voor native berichten op gebruikersniveau.</translation> +<translation id="3177802893484440532">Online OCSP/CRL-controles voor lokale vertrouwensinstanties vereisen</translation> <translation id="3185009703220253572">sinds versie <ph name="SINCE_VERSION" /></translation> <translation id="3187220842205194486">Android-apps hebben geen toegang tot zakelijke sleutels. Dit beleid is niet van invloed op deze apps.</translation> <translation id="3205825995289802549">Het eerste browservenster maximaliseren bij eerste uitvoering</translation> @@ -1214,6 +1263,7 @@ <translation id="3220624000494482595">Als de kiosk-app een Android-app is, heeft deze geen controle over de <ph name="PRODUCT_OS_NAME" />-versie, zelfs niet als het beleid is ingesteld op <ph name="TRUE" /> (Waar).</translation> <translation id="3236046242843493070">URL-patronen om de installatie van extensies, apps en gebruikersscripts toe te staan vanaf</translation> <translation id="3240609035816615922">Toegangsbeleid voor printerconfiguratie.</translation> +<translation id="3240655340884151271">MAC-adres van ingebouwde NIC van dock</translation> <translation id="3243309373265599239">Hiermee wordt de tijdsduur zonder input van gebruikers gespecificeerd waarna het scherm wordt gedimd wanneer er op netstroom wordt gewerkt. Als dit beleid is ingesteld op een grotere waarde dan nul, specificeert het de tijd die de gebruiker inactief moet blijven voordat het scherm wordt gedimd door <ph name="PRODUCT_OS_NAME" />. @@ -1235,6 +1285,12 @@ Als deze instelling is ingeschakeld of niet is geconfigureerd, kunnen gebruikers de proxy voor Cloudprinter inschakelen met authenticatie via hun Google-account. Als deze instelling is uitgeschakeld, kunnen gebruikers de proxy niet inschakelen en kan de computer zijn printers niet delen met <ph name="CLOUD_PRINT_NAME" />.</translation> +<translation id="3312206664202507568">Hiermee wordt een pagina op chrome://password-change actief waar SAML-gebruikers hun SAML-wachtwoorden kunnen wijzigen tijdens een sessie. Dit zorgt ervoor dat het SAML-wachtwoord en het wachtwoord voor schermvergrendeling van het apparaat gesynchroniseerd blijven. + + Met dit beleid worden er ook meldingen gegenereerd voor SAML-gebruikers van wie het SAML-wachtwoord bijna verloopt. Ze kunnen dit dan meteen verhelpen door tijdens de sessie het wachtwoord te wijzigen. + Deze meldingen worden echter alleen weergegeven als de SAML-identiteitsprovider tijdens de SAML-inlogprocedure informatie over het verlopen van het wachtwoord verzendt naar het apparaat. + + Als dit beleid niet is ingesteld, kan de gebruiker het niet wijzigen of overschrijven.</translation> <translation id="3322771899429619102">Hiermee kun je een lijst met URL-patronen instellen waarmee sites worden gespecificeerd die sleutels mogen genereren. Als een URL-patroon in 'KeygenBlockedForUrls' staat, worden deze uitzonderingen daardoor overschreven. Als dit beleid niet wordt ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites op basis van het beleid 'DefaultKeygenSetting' (als dit is ingesteld), of anders op basis van de persoonlijke configuratie van de gebruiker.</translation> @@ -1320,6 +1376,7 @@ Als dit beleid is ingesteld op 'False', worden vertragingen in energiebeheer en de limiet voor sessielengte gestart bij het starten van de sessie.</translation> <translation id="3478024346823118645">Gebruikersgegevens wissen bij uitloggen</translation> +<translation id="3480961938508521469">De batterij volledig opladen met een normale snelheid.</translation> <translation id="348495353354674884">Virtueel toetsenbord inschakelen</translation> <translation id="3487623755010328395"> Als dit beleid is ingesteld, probeert <ph name="PRODUCT_NAME" /> zichzelf te registreren en het bijbehorende cloudbeleid voor alle profielen toe te passen. @@ -1365,6 +1422,8 @@ <translation id="3547954654003013442">Proxyinstellingen</translation> <translation id="355118380775352753">Websites die worden geopend in de alternatieve browser</translation> <translation id="3554984410014457319">De Google Assistent laten luisteren naar de spraakactiveringszin</translation> +<translation id="356579196325389849">Gebruikers kunnen het releasekanaal voor Chrome OS configureren.</translation> +<translation id="3575011234198230041">HTTP-verificatie</translation> <translation id="3577251398714997599">Advertentie-instellingen voor sites met opdringerige advertenties</translation> <translation id="357917253161699596">Gebruikers toestaan gebruikerscertificaten te beheren</translation> <translation id="3583230441447348508">Specificeert een lijst vooraf geconfigureerde netwerk-fileshares. @@ -1395,6 +1454,7 @@ Dit beleid wordt gebruikt door cloud-beleidsinschrijving voor machinebereik op desktop en kan worden ingesteld via register of GPO op Windows, plist op Mac en JSON-beleidsbestand op Linux.</translation> <translation id="3660562134618097814">SAML IdP-cookies overdragen tijdens het inloggen</translation> +<translation id="3668151900457104753">Extensies op de zwarte lijst verwijderen</translation> <translation id="3701121231485832347">Beheert instellingen die specifiek zijn voor <ph name="PRODUCT_OS_NAME" />-apparaten die via <ph name="MS_AD_NAME" /> worden beheerd.</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Het veld met één regel is beëindigd en wordt in de toekomst verwijderd. Gebruik het tekstvak met meerdere regels hieronder.)</translation> <translation id="3709266154059827597">Zwarte lijst voor het installeren van extensies configureren</translation> @@ -1476,6 +1536,16 @@ Als dit beleid niet is ingesteld, wordt het schermtoetsenbord aanvankelijk uitgeschakeld, maar kan dit door gebruikers op elk moment worden ingeschakeld.</translation> <translation id="382476126209906314">Het voorvoegsel voor het TalkGadget configureren voor hosts voor externe toegang</translation> <translation id="3824972131618513497">Beheert instellingen met betrekking tot energiebeheer en opnieuw opstarten.</translation> +<translation id="3826475866868158882">Google-locatieservices ingeschakeld</translation> +<translation id="3831054243924627613">Met dit beleid wordt de beginstatus van de back-up- en herstelfunctie van Android beheerd. + + Als dit beleid niet is geconfigureerd of niet is ingesteld op <ph name="BR_DISABLED" />, is de back-up- en herstelfunctie van Android aanvankelijk uitgeschakeld. + + Als dit beleid is ingesteld op <ph name="BR_ENABLED" />, is de back-up- en herstelfunctie van Android aanvankelijk ingeschakeld. + + Als dit beleid is ingesteld op <ph name="BR_UNDER_USER_CONTROL" />, wordt de gebruiker gevraagd of die de back-up- en herstelfunctie van Android wil gebruiken. Als de gebruiker de back-up- en herstelfunctie inschakelt, worden gegevens van Android-apps geüpload naar Android-back-upservers. De gegevens worden vanaf deze servers hersteld wanneer apps opnieuw worden geïnstalleerd (indien de app hiervoor geschikt is). + + Dit beleid bepaalt alleen of de back-up- en herstelfunctie van Android is ingeschakeld bij de eerste installatie. De gebruiker kan later de Android-instellingen zelf aanpassen en de back-up- en herstelfunctie van Android in- of uitschakelen.</translation> <translation id="3831376478177535007">Wanneer deze instelling is ingeschakeld, staat <ph name="PRODUCT_NAME" /> toe dat certificaten die zijn uitgegeven via de verouderde PKI-bewerkingen van Symantec Corporation worden vertrouwd als deze correct worden gevalideerd en zijn gekoppeld aan een herkend CA-certificaat. Houd er rekening mee dat dit beleid afhankelijk is van het feit of de certificaten van de verouderde infrastructuur van Symantec nog door het besturingssysteem worden herkend. Als door een update van het besturingssysteem de verwerking van dergelijke certificaten door het besturingssysteem verandert, is dit beleid niet meer van toepassing. Daarnaast is dit beleid bedoeld als tijdelijke oplossing om bedrijven meer tijd te geven om af te stappen van de verouderde Symantec-certificaten. Dit beleid wordt op of rond 1 januari 2019 verwijderd. @@ -1559,6 +1629,15 @@ Als de optie niet is ingesteld of is ingesteld op 'False', kunnen gebruikers bestanden naar Google Drive overzetten.</translation> <translation id="3915395663995367577">URL naar een PAC-bestand voor de proxy</translation> +<translation id="3920892052017026701">Geef een custom startpunt voor batterijoplading op in procenten. + + De batterij begint met opladen wanneer de waarde van het custom startpunt voor batterijoplading wordt bereikt. + + DeviceBatteryChargeCustomStartCharging moet lager zijn dan DeviceBatteryChargeCustomStopCharging. + + Dit beleid wordt alleen gebruikt als DeviceBatteryChargeMode is ingesteld op 'custom'. + + Als dit beleid niet is geconfigureerd of niet is ingesteld, wordt de standaard batterijoplaadmodus toegepast.</translation> <translation id="3925377537407648234">Schermresolutie en schaalfactor instellen</translation> <translation id="3939893074578116847">Netwerkpakketten verzenden naar de beheerserver om de online status bij te houden, zodat de server kan detecteren of het apparaat offline is. @@ -1688,6 +1767,7 @@ <translation id="4150201353443180367">Weergave</translation> <translation id="4157003184375321727">Besturingssysteem- en firmwareversie rapporteren</translation> <translation id="4157594634940419685">Toegang verlenen aan systeemeigen CUPS-printers</translation> +<translation id="4160962198980004898">Bron van MAC-adres van apparaat wanneer het is gedockt</translation> <translation id="4163705126749612234">Hiermee configureer je de vereiste client-domeinnamen die worden opgelegd aan clients voor externe toegang en voorkom je dat gebruikers deze wijzigen. Als deze instelling is ingeschakeld, kunnen uitsluitend clients van een van de gespecificeerde domeinen verbinding maken met de host. @@ -1765,6 +1845,7 @@ Houd er rekening mee dat als het beleid een app-ID bevat, dit niet noodzakelijkerwijs betekent dat de gebruiker de app kan inschakelen als notitie-app op het vergrendelingsscherm. In Chrome 61 wordt de reeks beschikbare apps bijvoorbeeld extra beperkt door het platform. Als het beleid niet wordt ingesteld, gelden er geen beperkingen voor de reeks apps die de gebruiker kan inschakelen op het vergrendelingsscherm.</translation> +<translation id="4313767483634435271">Toegewezen MAC-adres van dock van apparaat</translation> <translation id="4322842393287974810">Toestaan dat de kiosk-app die automatisch zonder vertraging is gestart, de <ph name="PRODUCT_OS_NAME" />-versie beheert</translation> <translation id="4325690621216251241">Een afmeldknop toevoegen aan de systeembalk</translation> <translation id="4332177773549877617">Gebeurtenissen registreren voor installatie van Android-apps</translation> @@ -1796,6 +1877,7 @@ <translation id="4360826270668210664">Als dit beleid is ingesteld, moet de host voor externe toegang clients verifiëren om een verificatietoken van deze URL te verkrijgen en zo verbinding te kunnen maken. Moet samen met RemoteAccessHostTokenValidationUrl worden gebruikt. Deze functie is momenteel uitgeschakeld aan de serverzijde.</translation> +<translation id="4363057787588706121">Toestaan dat lijstbeleid van verschillende bronnen kan worden samengevoegd</translation> <translation id="436581050240847513">Apparaatnetwerkinterface rapporteren</translation> <translation id="4372704773119750918">Zakelijke gebruikers niet toestaan deel uit te maken van multiprofielen (primair of secundair)</translation> <translation id="4377599627073874279">Alle sites toestaan afbeeldingen weer te geven</translation> @@ -1969,6 +2051,7 @@ <translation id="4826326557828204741">Actie die moet worden ondernomen wanneer de vertraging voor inactief wordt bereikt bij gebruik op accuvermogen</translation> <translation id="4832852360828533362">Gebruikers- en apparaatrapporten</translation> <translation id="4834526953114077364">De gebruikers die het langst geleden gebruikt zijn en gedurende de laatste drie maanden niet zijn ingelogd, worden verwijderd totdat er voldoende vrije ruimte is</translation> +<translation id="4835622243021053389">NTLMv2-verificatie inschakelen.</translation> <translation id="4858735034935305895">Modus voor volledig scherm toestaan</translation> <translation id="4861767323695239729">De toegestane invoermethoden in een gebruikerssessie configureren</translation> <translation id="487460824085252184">Automatisch migreren, niet om toestemming van de gebruiker vragen.</translation> @@ -2090,6 +2173,11 @@ Anders dan bij <ph name="URL_LIST_POLICY_NAME" /> kunnen regels in twee richtingen worden toegepast. Dat betekent dat wanneer de add-in van Internet Explorer aanwezig en ingeschakeld is, deze optie ook beheert of <ph name="IE_PRODUCT_NAME" /> URL's moet openen in <ph name="PRODUCT_NAME" />.</translation> <translation id="5124368997194894978">Opstarten bij netstroom (wisselstroom) inschakelen</translation> +<translation id="5131211790949066746">Hiermee worden de lijstbeleidsregels <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" /> en <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> voor installatie van extensies samengevoegd. + + Als je deze instelling inschakelt, worden de waarden van het beleid voor het machineplatform, de machinecloud en het gebruikersplatform samengevoegd tot één lijst. Bovendien worden ze als een geheel gebruikt in plaats van alleen de waarden van de bron met de hoogste prioriteit te gebruiken. + + Als je deze instelling uitschakelt of niet instelt, worden alleen lijstitems uit de bron met de hoogste prioriteit meegenomen. Alle andere bronnen worden wel als conflicten weergegeven, maar worden genegeerd.</translation> <translation id="5141670636904227950">Het standaardtype van vergrootglas instellen dat op het inlogscherm is ingeschakeld</translation> <translation id="5142301680741828703">De volgende URL-patronen altijd verwerken in <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="5148753489738115745">Hiermee kun je extra parameters opgeven die worden gebruikt wanneer <ph name="PRODUCT_FRAME_NAME" /> <ph name="PRODUCT_NAME" /> start. @@ -2211,6 +2299,7 @@ Als het beleid niet wordt ingesteld, of als dit wordt ingesteld voor een lege tekenreeks of een ongeldig poortbereik, kan WebRTC gebruikmaken van elke lokale UDP-poort.</translation> <translation id="5290940294294002042">Een lijst met plug-ins opgeven die de gebruiker kan in- of uitschakelen</translation> +<translation id="5306186200045823863">De verouderde PKI-infrastructuur van Symantec Corporation vertrouwen</translation> <translation id="5307432759655324440">Beschikbaarheid van incognitomodus</translation> <translation id="5318185076587284965">Het gebruik van relayservers door de host voor externe toegang inschakelen</translation> <translation id="5323128137188992869">Toestaan dat content wordt gecast naar het apparaat via <ph name="PRODUCT_NAME" />. @@ -2313,6 +2402,7 @@ Als regels elkaar tegenspreken, gebruikt <ph name="PRODUCT_NAME" /> de meest specifieke regel.</translation> <translation id="5475361623548884387">Afdrukken inschakelen</translation> <translation id="547601067149622666">Geen advertenties toestaan op sites met opdringerige advertenties</translation> +<translation id="5483065054530244863">Door lokale vertrouwensinstanties verstrekte, met SHA-1 ondertekende certificaten toestaan</translation> <translation id="5483777239978559943">Dit beleid is beëindigd. Gebruik het beleid <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> om de beschikbaarheid van de Flash-plug-in te beheren en het beleid <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> om aan te geven of de geïntegreerde pdf-viewer moet worden gebruikt om pdf-bestanden te openen. Specificeert een lijst met plug-ins die de gebruiker kan in- of uitschakelen in <ph name="PRODUCT_NAME" />. @@ -2429,6 +2519,17 @@ Als je deze instelling inschakelt of niet instelt, kunnen gebruikers hun wachtwoorden als leesbare tekst bekijken in Wachtwoordbeheer.</translation> <translation id="5620392548325769024">Inschakelen dat de welkomstpagina wordt weergegeven bij de eerste keer opstarten van de browser na een upgrade van het besturingssysteem</translation> <translation id="5630352020869108293">De laatste sessie herstellen</translation> +<translation id="5643906875497889108">Bepaalt welke typen apps/extensies mogen worden geïnstalleerd en beperkt runtime-toegang. + + Met deze instelling worden typen extensies/apps die mogen worden geïnstalleerd in <ph name="PRODUCT_NAME" />, op de witte lijst geplaatst. Hosts waarmee ze interactie kunnen hebben, worden ook op de witte lijst geplaatst. De waarde bestaat uit een lijst met tekenreeksen. Elke tekenreeks moet een van de volgende zijn: 'extension', 'theme', 'user_script', 'hosted_app', 'legacy_packaged_app', 'platform_app'. Raadpleeg de documentatie van de <ph name="PRODUCT_NAME" />-extensies voor meer informatie over deze typen. + + Dit beleid is ook van toepassing op extensies en apps die afgedwongen worden geïnstalleerd via ExtensionInstallForcelist. + + Als dit is ingesteld, worden extensies/apps met een ander type dan de typen in de lijst niet geïnstalleerd. + + Als dit niet is ingesteld, gelden er geen beperkingen voor welke typen extensies/apps zijn toegestaan. + + Het gebruik van meerdere door komma's gescheiden extensie-ID's wordt vóór versie 75 niet ondersteund en wordt overgeslagen. De rest van het beleid geldt nog wel.</translation> <translation id="5645779841392247734">Cookies toestaan op deze sites</translation> <translation id="5689430183304951538">Standaard paginagrootte voor afdrukken</translation> <translation id="5693469654327063861">Gegevensmigratie toestaan</translation> @@ -2468,6 +2569,7 @@ <translation id="5765780083710877561">Beschrijving:</translation> <translation id="5770738360657678870">Ontwikkelaarskanaal (mogelijk instabiel)</translation> <translation id="5774856474228476867">Zoek-URL voor standaardzoekprovider</translation> +<translation id="5775235485119094648">Laad de batterij op wanneer de lading zich binnen een bepaald bereik bevindt.</translation> <translation id="5776485039795852974">Altijd goedkeuring vragen wanneer een site bureaubladmeldingen wil weergeven</translation> <translation id="5781412041848781654">Hiermee wordt gespecificeerd welke GSSAPI-bibliotheek moet worden gebruikt voor HTTP-verificatie. Je kunt een bibliotheeknaam instellen of een volledig pad. @@ -2536,6 +2638,7 @@ <translation id="5893553533827140852">Als deze instelling is ingeschakeld, worden gnubby-verificatieverzoeken verzonden via een proxy met een externe hostverbinding. Als deze instelling uitgeschakeld of niet geconfigureerd is, worden gnubby-verificatieverzoeken niet via een proxy verzonden.</translation> +<translation id="5897913798715600338">Batterij snel opladen.</translation> <translation id="5898486742390981550">Wanneer meerdere gebruikers zijn ingelogd, kunnen Android-apps alleen worden gebruikt door de primaire gebruiker.</translation> <translation id="5900196529149231477"> Dit beleid is van toepassing op het inlogscherm. Zie ook het beleid <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, dat van toepassing is op de gebruikerssessie. Het is raadzaam beide beleidsregels op dezelfde waarde in te stellen. Als de waarden niet overeenkomen, kan dit een vertraging veroorzaken bij het openen van een gebruikerssessie terwijl de waarde wordt toegepast die in het gebruikersbeleid is opgegeven. @@ -2544,12 +2647,14 @@ Als het beleid niet is geconfigureerd, worden de standaardinstellingen voor site-isolatie van het platform gebruikt voor het inlogscherm. </translation> <translation id="5901427587865226597">Alleen dubbelzijdig afdrukken</translation> +<translation id="5905473632148429217">Online OCSP/CRL-controles inschakelen</translation> <translation id="5906199912611534122">Hiermee kan netwerkbeperking worden in- of uitgeschakeld. Dit is van toepassing op alle gebruikers en op alle interfaces op het apparaat. Zodra de beperking is ingesteld, wordt deze gehandhaafd totdat het beleid wordt gewijzigd en de instelling wordt uitgeschakeld. Als het beleid is ingesteld op 'False', geldt er geen beperking. Als het beleid is ingesteld op 'True', wordt het systeem beperkt om de opgegeven upload- en downloadsnelheid (in kbits/s) te bereiken.</translation> +<translation id="591088232153082363">Aangepast batterijgebruik op basis van het gebruikspatroon van de batterij.</translation> <translation id="5921713479449475707">Downloads voor automatische updates via HTTP toestaan</translation> <translation id="5921888683953999946">De standaardstatus van de toegankelijkheidsfunctie 'Grote muisaanwijzer' op het inlogscherm instellen. @@ -2571,6 +2676,7 @@ <translation id="5950205771952201658">Omdat soft-fail online certificaatintrekkingscontroles de veiligheid niet aantoonbaar verhogen, worden deze standaard uitgeschakeld in versie 19 en hoger van <ph name="PRODUCT_NAME" />. Als dit beleid op 'True' wordt ingesteld, wordt het eerdere gedrag hersteld en worden online OCSP/CRL-controles uitgevoerd. Als het beleid niet is ingesteld, of is ingesteld op 'False', voert <ph name="PRODUCT_NAME" /> geen online intrekkingscontroles uit in <ph name="PRODUCT_NAME" /> 19 en hoger.</translation> +<translation id="5961137303188584693">MAC-adres van ingebouwde NIC van apparaat</translation> <translation id="5966615072639944554">Extensies die toestemming hebben de API voor externe bevestiging te gebruiken</translation> <translation id="5983708779415553259">Standaardgedrag voor sites die zich niet in een inhoudspakket bevinden</translation> <translation id="5997543603646547632">Klok met 24-uursnotatie standaard gebruiken</translation> @@ -2661,6 +2767,17 @@ <translation id="6111936128861357925">Easter egg-dinosaurusgame toestaan</translation> <translation id="6114416803310251055">verouderd</translation> <translation id="6133088669883929098">Alle sites toestaan sleutels te genereren</translation> +<translation id="6136537398661737682">Met dit beleid wordt de beginstatus van Google-locatieservices beheerd. + + Als dit beleid niet is geconfigureerd of niet is ingesteld op <ph name="GLS_DISABLED" />, zijn Google-locatieservices aanvankelijk uitgeschakeld. + + Als dit beleid is ingesteld op <ph name="GLS_ENABLED" />, zijn Google-locatieservices aanvankelijk ingeschakeld. + + Als dit beleid is ingesteld op <ph name="GLS_UNDER_USER_CONTROL" />, wordt de gebruiker gevraagd of die Google-locatieservices wil gebruiken. Hiermee kunnen Android-apps de services gebruiken om de apparaatlocatie op te vragen. Ook worden hierdoor anonieme locatiegegevens verzonden naar Google. + + Dit beleid bepaalt alleen of de Google-locatieservices zijn ingeschakeld bij de eerste installatie. De gebruiker kan later de Android-instellingen zelf aanpassen en de Google-locatieservices in- of uitschakelen. + + Als het beleid <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> is ingesteld op <ph name="BLOCK_GEOLOCATION_SETTING" />, wordt dit beleid genegeerd en zijn Google-locatieservices altijd uitgeschakeld.</translation> <translation id="6141402445226505817">Altijd minder nauwkeurige tijdzonedetectie gebruiken</translation> <translation id="6145799962557135888">Hiermee kun je een lijst URL-patronen instellen waarmee sites worden gespecificeerd die JavaScript mogen uitvoeren. @@ -2722,9 +2839,17 @@ Als het beleid is uitgeschakeld, worden formuliergegevens voor Automatisch aanvullen niet geïmporteerd. Als dit beleid niet is ingesteld, kan de gebruiker worden gevraagd of hij wil importeren, of wordt er automatisch geïmporteerd.</translation> +<translation id="6221175752766085998">Door lokale vertrouwde instanties uitgegeven certificaten zonder de extensie subjectAlternativeName toestaan</translation> <translation id="6224304369267200483">URL's/domeinen hebben rechtstreekse bevestiging van de beveiligingssleutel toegestaan</translation> <translation id="6233173491898450179">Downloaddirectory instellen</translation> <translation id="6244210204546589761">URL's die worden geopend bij starten</translation> +<translation id="6255387031094435995">Maakt het mogelijk de geselecteerde beleidsregels samen te voegen als ze afkomstig zijn uit verschillende bronnen en hetzelfde bereik en niveau hebben. + + Als een beleid in de lijst staat, worden de waarden samengevoegd in een nieuwe beleidslijst als er een conflict tussen twee bronnen is, omdat ze hetzelfde bereik en niveau hebben. + + Als een beleid in de lijst staat, wordt het beleid met de hoogste prioriteit toegepast als er een conflict tussen twee bronnen is, maar ook als het bereik en/of het niveau verschilt. + + Als beleid niet in de lijst staat, wordt het beleid met de hoogste prioriteit toegepast als er een conflict tussen bronnen, het bereik en/of het niveau is.</translation> <translation id="6258193603492867656">Hiermee wordt aangegeven of de gegenereerde Kerberos-SPN een niet-standaardpoort moet bevatten. Als je deze instelling inschakelt en er een niet-standaardpoort (een andere poort dan 80 of 443) wordt opgegeven, wordt deze opgenomen in de gegenereerde Kerberos-SPN. @@ -2926,6 +3051,7 @@ <translation id="6757438632136860443">Hiermee kun je een lijst met URL-patronen opgeven voor sites die de <ph name="FLASH_PLUGIN_NAME" />-plug-in mogen uitvoeren. Als dit beleid niet wordt ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Je vindt deze in het beleid 'DefaultPluginsSetting' (als dit is ingesteld), of in de persoonlijke configuratie van de gebruiker.</translation> +<translation id="6757613329154374267">Back-up en herstel is ingeschakeld</translation> <translation id="6762235610019366960">Hiermee kun je de presentatie van promotie- en/of educatieve content op een volledig tabblad beheren in <ph name="PRODUCT_NAME" />. Als dit beleid niet is geconfigureerd of als het is ingeschakeld (ingesteld op 'True'), kan <ph name="PRODUCT_NAME" /> content op een volledig tabblad aan gebruikers laten zien om productinformatie te leveren. @@ -2948,6 +3074,7 @@ De tekenreeks kan de variabelen ${ASSET_ID}, ${SERIAL_NUM}, ${MAC_ADDR}, ${MACHINE_NAME} bevatten, die worden vervangen door waarden op het apparaat voordat deze als hostnaam wordt gebruikt. Deze vervanging moet een geldige hostnaam opleveren (conform RFC 1035, sectie 3.1). Als dit beleid niet is ingesteld of als de vervanging geen geldige hostnaam oplevert, wordt er geen hostnaam ingesteld in het DHCP-verzoek. </translation> +<translation id="6833988859168635883">Startpagina, homepage en pagina 'Nieuw tabblad'</translation> <translation id="6835883744948188639">Toon de gebruiker een terugkerende prompt om aan te geven dat opnieuw opstarten wordt aanbevolen</translation> <translation id="6837480141980366278">Hiermee wordt bepaald of de ingebouwde DNS-client wordt gebruikt in <ph name="PRODUCT_NAME" />. @@ -3057,6 +3184,17 @@ Wanneer het scherm bijna wordt gedimd, evalueert het slimme dimmodel of het dimmen moet worden uitgesteld, waardoor het langer duurt tot het scherm wordt gedimd. In dit geval worden de vertragingen aangepast voordat het scherm wordt uitgeschakeld, wordt vergrendeld of inactief wordt, zodat de tijden vanaf het moment dat het scherm wordt gedimd, zo blijven zoals oorspronkelijk is ingesteld. Als dit beleid wordt ingesteld op 'true' of niet wordt ingesteld, wordt het slimme dimmodel ingeschakeld, zodat het langer duurt voordat het scherm wordt gedimd. Als dit beleid wordt ingesteld op 'false', heeft het slimme dimmodel geen invloed op het dimmen van het scherm.</translation> +<translation id="6967394885063085697">Schakel het stroombeheerbeleid voor de geavanceerde batterijoplaadmodus in. + + In de geavanceerde batterijoplaadmodus kan de gebruiker de staat van de batterij maximaliseren. In de geavanceerde batterijoplaadmodus gebruikt het systeem buiten werktijden een standaard oplaadalgoritme en andere technieken om de staat van de batterij te maximaliseren. Tijdens werktijden wordt snel opgeladen. Dankzij dit snelle opladen is de batterij sneller volledig opgeladen. Voor elke dag wordt een begintijd en een duur opgegeven om aan te geven wanneer het systeem het intensiefst wordt gebruikt. + + Als dit beleid is ingesteld op 'true' en DeviceAdvancedBatteryChargeModeDayConfig is ingesteld, wordt de geavanceerde batterijoplaadmodus altijd ingeschakeld als dit wordt ondersteund door het apparaat. + + Als dit beleid is ingesteld op 'false', wordt de geavanceerde batterijoplaadmodus altijd uitgeschakeld. + + Als je dit beleid instelt, kunnen gebruikers dit niet wijzigen of negeren. + + Als dit beleid niet wordt ingesteld, wordt de geavanceerde batterijoplaadmodus uitgeschakeld en kan deze niet worden ingeschakeld door de gebruiker.</translation> <translation id="6972540544240464302">Geselecteerde taakplannerconfiguratie</translation> <translation id="6979158407327259162">Google Drive</translation> <translation id="6994082778848658360">Geeft aan hoe de ingebouwde Secure Element-hardware kan worden gebruikt voor authenticatie met meerdere factoren, indien de hardware geschikt is voor deze functie. De aan/uit-knop van de machine wordt gebruikt om de fysieke aanwezigheid van de gebruiker te detecteren. @@ -3132,6 +3270,17 @@ Als je deze instelling in- of uitschakelt, kunnen gebruikers de instelling niet wijzigen of overschrijven. Als het beleid niet wordt ingesteld, kan de gebruiker kiezen of hij om een wachtwoord wil worden gevraagd om het apparaat te ontgrendelen.</translation> +<translation id="7107148737865880402">Schakel het stroombeheerbeleid voor energie delen via USB in. + + Sommige apparaten hebben een USB-poort die is gemarkeerd met een bliksemschicht of batterijpictogram. Deze poort kan worden gebruikt om bepaalde apparaten, zoals een mobiele telefoon, op te laden via de batterij van het systeem. Dit beleid bepaalt het oplaadgedrag van deze poort wanneer het systeem zich in de slaapstand bevindt of is uitgeschakeld. Dit beleid heeft geen invloed op andere USB-poorten en ook niet op het oplaadgedrag wanneer het systeem is ingeschakeld. + + Wanneer het systeem is ingeschakeld, levert de USB-poort altijd stroom. + + Als dit beleid is ingesteld op 'true', levert de USB-poort in de slaapstand stroom indien het apparaat is aangesloten op een stopcontact of het batterijniveau hoger dan 50% is. Anders wordt er geen stroom geleverd. + + Als dit beleid is ingesteld op 'true', levert de USB-poort van het uitgeschakelde systeem stroom indien het apparaat is aangesloten op een stopcontact. Anders wordt er geen stroom geleverd. + + Als dit beleid niet wordt ingesteld, wordt het beleid ingeschakeld en kan de gebruiker het niet uitschakelen.</translation> <translation id="7115494316187648452">Hiermee wordt bepaald of een <ph name="PRODUCT_NAME" />-proces wordt gestart bij het inloggen op het besturingssysteem en geactiveerd blijft wanneer het laatste browservenster wordt gesloten, zodat apps op de achtergrond en de huidige browsesessie actief blijven, inclusief de sessiecookies. Het achtergrondproces geeft een pictogram weer in het systeemvak en kan altijd via die weg worden gesloten. Als dit beleid wordt ingesteld op 'True', wordt de achtergrondmodus ingeschakeld en kan deze niet door de gebruiker worden beheerd in de browserinstellingen. @@ -3181,6 +3330,7 @@ Als dit beleid is ingesteld op 'true' of als het niet is ingesteld, worden wake locks van het scherm ingesteld voor stroombeheer, tenzij AllowWakeLocks is ingesteld op 'false'. Als dit beleid is ingesteld op 'false', worden verzoeken voor wake locks van het scherm gedegradeerd tot verzoeken voor wake locks van het systeem.</translation> +<translation id="7177857088692019405">Snel ontgrendelen</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="718956142899066210">Verbindingstypen die zijn toegestaan voor updates</translation> <translation id="7194407337890404814">Naam van standaardzoekprovider</translation> @@ -3245,6 +3395,7 @@ <translation id="7273823081800296768">Als deze instelling is ingeschakeld of niet is geconfigureerd, kunnen gebruikers clients en hosts aanmelden op het moment dat verbinding wordt gemaakt, zodat er niet elke keer een pincode hoeft te worden opgegeven. Als deze instelling is uitgeschakeld, is deze functie niet beschikbaar.</translation> +<translation id="7274077256421167535">Energie delen via USB inschakelen</translation> <translation id="7275334191706090484">Beheerde bladwijzers</translation> <translation id="7291084543582732020">Als je deze instelling inschakelt, mogen gebruikers Smart Lock gebruiken als aan de vereisten voor de functie wordt voldaan. @@ -3258,6 +3409,7 @@ Dit beleid wordt alleen gerespecteerd als het beleid 'DefaultSearchProviderEnabled' is ingeschakeld.</translation> <translation id="7302043767260300182">Vertraging van schermvergrendeling wanneer op netstroom wordt gewerkt</translation> +<translation id="7305262223970835999">Een pagina inschakelen waar tijdens een sessie het wachtwoord voor SAML-gebruikers kan worden gewijzigd.</translation> <translation id="7311458740754205918">Als dit beleid is ingesteld op 'True' of niet is ingesteld, kunnen op de nieuwe tabbladpagina contentsuggesties worden weergegeven op basis van de browsegeschiedenis, interesses en locatie van de gebruiker. Als dit is ingesteld op 'False', worden er geen automatisch gegenereerde contentsuggesties weergegeven op de nieuwe tabbladpagina.</translation> @@ -3384,6 +3536,15 @@ Als de waarde van dit beleid 0 is, wordt de standaardcachegrootte gebruikt, maar kan de gebruiker deze niet wijzigen. Als dit beleid niet is ingesteld, wordt de standaardgrootte gebruikt en kan de gebruiker deze overschrijven met de markering --disk-cache-size.</translation> +<translation id="759389052790680884">Geef een custom batterijoplaadstop op in procenten. + + De batterij stopt met opladen wanneer de waarde van de custom batterijoplaadstop wordt bereikt. + + DeviceBatteryChargeCustomStartCharging moet lager zijn dan DeviceBatteryChargeCustomStopCharging. + + Dit beleid wordt alleen gebruikt als DeviceBatteryChargeMode is ingesteld op 'custom'. + + Als dit beleid niet is geconfigureerd of niet is ingesteld, wordt de standaard batterijoplaadmodus toegepast.</translation> <translation id="759957074386651883">Safe Browsing-instellingen</translation> <translation id="7604169113182304895">Het is mogelijk dat Android-apps deze lijst op vrijwillige basis respecteren. Je kunt ze niet dwingen om de lijst te respecteren.</translation> <translation id="7612157962821894603">Markeringen voor het hele systeem die worden toegepast bij het starten van <ph name="PRODUCT_NAME" /></translation> @@ -3461,6 +3622,15 @@ <translation id="7712109699186360774">Altijd goedkeuring vragen wanneer een site toegang wil hebben tot de camera en/of microfoon</translation> <translation id="7713608076604149344">Downloadbeperkingen</translation> <translation id="7715711044277116530">Percentage waarmee de dimvertraging van het scherm in de presentatiemodus wordt geschaald</translation> +<translation id="7716781462866245042">Stel een dagconfiguratie voor de geavanceerde batterijoplaadmodus in. + + Dit beleid wordt alleen gebruikt als DeviceAdvancedBatteryChargeModeEnabled is ingesteld op 'true'. + + Als dit beleid niet is geconfigureerd of niet is ingesteld, is de geavanceerde batterijoplaadmodus altijd uitgeschakeld. + + Let op: <ph name="CHARGE_START_TIME_FIELD_NAME" /> moet korter zijn dan <ph name="CHARGE_END_TIME_FIELD_NAME" />. + + Opmerking: Toegestane waarden voor het veld <ph name="MINUTE_FIELD_NAME" /> in <ph name="CHARGE_START_TIME_FIELD_NAME" /> en <ph name="CHARGE_END_TIME_FIELD_NAME" /> zijn 0, 15, 30, 45.</translation> <translation id="7717938661004793600">Toegankelijkheidsfuncties van <ph name="PRODUCT_OS_NAME" /> configureren.</translation> <translation id="7724994675283793633">Met dit beleid wordt HTTP/0.9 ingeschakeld voor poorten anders dan poort 80 voor HTTP en poort 443 voor HTTPS. @@ -3534,6 +3704,7 @@ Hiermee bepaal je de ID van de extensie die moet worden gebruikt als schermbeveiliging voor het inlogvenster. De extensie moet onderdeel zijn van het AppPack dat is geconfigureerd voor dit domein via het beleid DeviceAppPack.</translation> <translation id="7882857838942884046">Als je de synchronisatie met Google uitschakelt, werkt de Android-functie 'Back-up maken en resetten' niet meer naar behoren.</translation> <translation id="7882890448959833986">De waarschuwing voor een niet-ondersteund besturingssysteem negeren</translation> +<translation id="7895553628261067384">Externe toegang</translation> <translation id="7902255855035461275">Patronen in deze lijst worden vergeleken met de beveiligingsoorsprong van de aanvragende URL. Als een overeenkomst wordt gevonden, wordt toegang tot apparaten voor het vastleggen van video zonder prompt toegestaan. OPMERKING: Tot versie 45 werd dit beleid alleen ondersteund in de kioskmodus.</translation> @@ -3545,6 +3716,11 @@ <translation id="7937491150792971922">Lijstbeleidsregels voor installatie van extensies van meerdere bronnen samenvoegen</translation> <translation id="7937766917976512374">Het opnemen van video's toestaan of weigeren</translation> <translation id="7941975817681987555">Geen netwerkacties voorspellen voor een netwerkverbinding</translation> +<translation id="7952007677054834789">Hiermee wordt geconfigureerd welke pagina's worden geladen bij het opstarten, wat de standaard homepage is en welke pagina standaard wordt gebruikt voor nieuwe tabbladen in <ph name="PRODUCT_NAME" />. Ook verhinder je hiermee dat gebruikers deze pagina's kunnen wijzigen. + + De instellingen voor de homepage worden alleen volledig voor de gebruiker vergrendeld als je de pagina 'Nieuw tabblad' als de homepage selecteert of als je zelf een URL voor de homepage specificeert. Als je geen URL voor de homepage opgeeft, kan de gebruiker nog steeds de pagina 'Nieuw tabblad' als homepage instellen door 'chrome://newtab' op te geven. + + Het beleid 'URL's die worden geopend bij starten' wordt genegeerd, tenzij je 'Een lijst met URL's openen' selecteert bij 'Actie bij starten'.</translation> <translation id="7952958573604504839">Dit beleid is beëindigd in M48 ten gunste van <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" /> en is verwijderd in M54. Hiermee wordt netwerkvoorspelling in <ph name="PRODUCT_NAME" /> ingeschakeld en wordt voorkomen dat gebruikers deze instelling kunnen wijzigen. @@ -3688,6 +3864,7 @@ <translation id="8176035528522326671">Toestaan dat Enterprise-gebruiker alleen primair gebruiker van meerdere profielen is (standaardgedrag voor beheerde Enterprise-gebruikers)</translation> <translation id="8214600119442850823">Hiermee wordt Wachtwoordbeheer geconfigureerd.</translation> <translation id="8217516105848565518">Dit beleid is beëindigd. Gebruik in plaats daarvan RemoteAccessHostDomainList.</translation> +<translation id="8244171102276095471">RC4-coderingssuites in TLS inschakelen</translation> <translation id="8244525275280476362">Maximum vertraging voor ophalen na ongeldigverklaring voor beleid</translation> <translation id="8256688113167012935">Hiermee wordt de weergave van de accountnaam in <ph name="PRODUCT_OS_NAME" /> op het aanmeldscherm beheerd voor het bijbehorende lokale account van het apparaat. @@ -3728,6 +3905,7 @@ <translation id="8312129124898414409">Hiermee kun je instellen of websites sleutels mogen genereren. Het genereren van sleutels kan ofwel worden toegestaan voor alle websites ofwel worden geweigerd voor alle websites. Als dit beleid niet wordt ingesteld, wordt 'BlockKeygen' gebruikt en kan de gebruiker dit wijzigen.</translation> +<translation id="8320149248919453401">Batterijoplaadmodus</translation> <translation id="8329984337216493753">Dit beleid is alleen ingeschakeld in de winkelmodus. Als DeviceIdleLogoutTimeout is gespecificeerd, bepaalt dit beleid hoe lang het waarschuwingsvenster met afteltimer wordt weergegeven dat de gebruiker te zien krijgt voordat deze wordt afgemeld. @@ -3878,6 +4056,7 @@ Als dit beleid niet is ingesteld, wordt een standaardperiode van 345.600.000 milliseconden (vier dagen) gebruikt voor <ph name="PRODUCT_OS_NAME" />-apparaten en 604.800.000 milliseconden (één week) voor <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Waarschuwing voor wachtwoordbeveiliging wordt geactiveerd bij hergebruik van een wachtwoord</translation> <translation id="8693243869659262736">Ingebouwde DNS-client gebruiken</translation> +<translation id="8698286761337647563">Hoeveel dagen van tevoren SAML-gebruikers bericht ontvangen dat hun wachtwoord bijna verloopt</translation> <translation id="8703488928438047864">Boardstatus rapporteren</translation> <translation id="8703872185032220081">Stel de dagelijkse configuratie voor stroompiekverschuiving in. @@ -3930,6 +4109,7 @@ Als deze instelling uitgeschakeld of niet ingesteld is, leidt de wachtwoordbeveiligingsservice gebruikers naar https://myaccounts.google.com om hun wachtwoord te wijzigen. Dit beleid is alleen beschikbaar op Windows-instanties die gekoppeld zijn aan een <ph name="MS_AD_NAME" />-domein of op instanties van Windows 10 Pro of Enterprise die ingeschreven zijn voor apparaatbeheer.</translation> <translation id="8798099450830957504">Standaard</translation> +<translation id="8800453707696044281">Een custom batterijoplaadstop opgeven in procenten</translation> <translation id="8801680448782904838">Een gebruiker laten weten dat het aanbevolen of vereist is om de browser of het apparaat opnieuw op te starten</translation> <translation id="8818173863808665831">De geografische locatie van het apparaat rapporteren. @@ -4058,6 +4238,11 @@ Dit beleid is alleen van toepassing op gebruikers die zijn geverifieerd met SAML. De beleidswaarde moet worden gespecificeerd in seconden.</translation> +<translation id="9018338365267278833">Hiermee verwijder je extensies in <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> of in <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> waarvan de installatiemodus is geblokkeerd. Ook worden lokale gebruikersgegevens definitief verwijderd. Raadpleeg het privacybeleid voor extensies of het beleid voor gegevensbehoud voor meer informatie over wat er gebeurt met gebruikersgegevens die niet lokaal zijn opgeslagen. + + Als het beleid is ingeschakeld, worden extensies in de genoemde lijsten geheel verwijderd van het apparaat (als ze zijn geïnstalleerd), inclusief lokale gebruikersgegevens. + + Als het beleid is uitgeschakeld of niet is ingesteld, worden extensies in de genoemde lijsten uitgeschakeld op het apparaat (als ze zijn geïnstalleerd en op de zwarte lijst <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> staan) maar worden ze niet verwijderd.</translation> <translation id="9027787254195333560">Met dit beleid kun je de avatarafbeelding configureren die voor de gebruiker wordt weergegeven op het inlogscherm. Het beleid wordt ingesteld door de URL op te geven waar <ph name="PRODUCT_OS_NAME" /> de avatarafbeelding kan downloaden, evenals een cryptografische hash die wordt gebruikt om de integriteit van de download te verifiëren. De afbeelding moet de jpeg-indeling hebben en mag niet groter zijn dan 512 KB. De URL moet zonder verificatie toegankelijk zijn. De avatarafbeelding wordt gedownload en opgeslagen in het cachegeheugen. Deze wordt opnieuw gedownload wanneer de URL of de hash wordt gewijzigd.
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb index 6464f86f..7f509157 100644 --- a/components/policy/resources/policy_templates_ta.xtb +++ b/components/policy/resources/policy_templates_ta.xtb
@@ -135,6 +135,7 @@ இந்தக் கொள்கை அமைக்கப்படாவிட்டால், இயல்பான கால இடைவெளி 3 மணிநேரமாகும். குறைந்தபட்சமாக அனுமதிக்கப்பட்ட கால இடைவெளி 60 வினாடிகளாகும்.</translation> <translation id="1204263402976895730">இயக்கப்பட்ட நிறுவனப் பிரிண்டர்கள்</translation> +<translation id="1216919699175573511">Signed HTTP Exchange (SXG) உதவியை இயக்கும்</translation> <translation id="1219695476179627719">சாதனம் ஏற்கனவே சமீபத்திய பதிப்பில் இயங்கிக்கொண்டிருந்தால், <ph name="DEVICE_TARGET_VERSION_PREFIX_POLICY_NAME" /> அமைத்த பதிப்பிற்கு அது மீட்டமைக்கப்பட வேண்டுமா என்பதைக் குறிக்கும். இயல்புநிலையாக RollbackDisabled இருக்கும்.</translation> @@ -1569,6 +1570,13 @@ இந்தக் கொள்கை அமைக்கப்படாதபோது, நேரத்தின் இயல்பான அளவு பயன்படுத்தப்படும். கொள்கை மதிப்பை மில்லிவினாடிகளில் மட்டுமே குறிப்பிட வேண்டும்.</translation> +<translation id="4105884561459127998">SAML உள்நுழைவுகளுக்கான அங்கீகரிப்பு வகையை உள்ளமைக்கும். + + இந்தக் கொள்கை அமைக்கப்படவில்லை என்றாலோ இயல்புநிலைக்கு (மதிப்பு 0) அமைக்கப்பட்டாலோ பிற காரணிகளின் அடிப்படையில் SAML உள்நுழைவுகளின் நடத்தையை உலாவி தீர்மானிக்கும். பெரும்பாலான அடிப்படைச் சூழலில் பயனர் அங்கீகரிப்பும் தற்காலிகமாகச் சேமித்த பயனர் தரவின் பாதுகாப்பும் பயனர்களால் கைமுறையாக உள்ளிடப்படும் கடவுச்சொற்களை அடிப்படையாகக் கொண்டுள்ளது. + + ClientCertificate (மதிப்பு 1) என இந்தக் கொள்கை அமைக்கப்பட்டால் கிளையன்ட் சான்றிதழ் அங்கீகரிப்பானது SAML மூலம் உள்நுழையும், புதிதாகச் சேர்க்கப்படும் பயனர்களுக்குப் பயன்படுத்தப்படும். அத்தகைய பயனர்களுக்குக் கடவுச்சொற்கள் பயன்படுத்தப்படாது. மேலும், அவர்களின் தற்காலிகமாகச் சேமித்த அகத் தரவானது தொடர்புடைய கிரிப்டோகிராஃபிக் விசைகளைப் பயன்படுத்திப் பாதுகாக்கப்படும். உதாரணமாக, ஸ்மார்ட் கார்டு அடிப்படையிலான பயனர் அங்கீகரிப்பை உள்ளமைக்க இந்த அமைப்பு அனுமதிக்கும் (ஸ்மார்ட் கார்டு மிடில்வேர் ஆப்ஸ் DeviceLoginScreenExtensions கொள்கை வழியே நிறுவப்பட வேண்டும் என்பதைக் கவனத்தில் கொள்ளவும். + + SAMLலைஐப் பயன்படுத்தி அங்கீகரிக்கும் பயனர்களுக்கு மட்டுமே இந்தக் கொள்கை பொருந்தும்.</translation> <translation id="4105989332710272578">URLகளின் பட்டியலுக்குச் சான்றிதழ் வெளிப்படைத்தன்மை செயலாக்கத்தை முடக்கு</translation> <translation id="4121350739760194865">புதிய தாவல் பக்கத்தில் தோன்றுவதிலிருந்து பயன்பாட்டு விளம்பரங்களைத் தடு</translation> <translation id="4125606414556046117">டெஸ்க்டாப்பிலும், பயனருக்கான உள்நுழைவுத் திரையின் பின்புலத்திலும் காண்பிக்கப்படும் வால்பேப்பர் படத்தை உள்ளமைக்க இந்தக் கொள்கை அனுமதிக்கும். <ph name="PRODUCT_OS_NAME" /> வால்பேப்பர் படத்தைப் பதிவிறக்கக்கூடிய URL மற்றும் அந்தப் பதிவிறக்கத்தின் நம்பகத்தன்மையைச் சரிபார்க்கப் பயன்படுத்தக்கூடிய கிரிப்டோகிராஃபிக் ஹேஷ் ஆகியவற்றைக் குறிப்பிடுவதன் மூலம் இந்தக் கொள்கையை அமைக்கலாம். படம் JPEG வடிவத்தில் இருக்க வேண்டும், அதன் கோப்பு அளவு 16 மெ.பை.க்கு அதிகமாக இருக்கக்கூடாது. குறிப்பிடப்படும் URL எந்த அங்கீகாரங்களும் இன்றி அணுகக்கூடியதாக இருக்க வேண்டும். @@ -1597,6 +1605,30 @@ கொள்கை அமைக்கப்படாமல் இருந்தால், டெஸ்க்டாப்பிலும் உள்நுழைவுத் திரையின் பின்புலத்திலும் காட்டுவதற்கான படத்தைப் பயனர் தேர்வுசெய்யலாம்.</translation> <translation id="412697421478384751">பூட்டுத் திரை PINக்கு வலிமை குறைந்த PINகளை அமைப்பதற்கு, பயனர்களை அனுமதிக்கும்</translation> <translation id="4138655880188755661">நேர வரம்பு</translation> +<translation id="4144164749344898721">இந்தக் கொள்கை பயனர் செயலற்ற நிலையில் இருக்கும் போது மின்சக்தி உபயோக நிர்வாகத்திற்காகப் பல்வேறு அமைப்புகளைக் கட்டுப்படுத்தும். + + நான்கு வகையான நடவடிக்கைகள் உள்ளன: + * |ScreenDim| குறிப்பிடும் நேரத்திற்கு பயனர் ஏதும் செய்யாமல் இருந்தால் திரை மங்கலாக்கப்படும். + * |ScreenOff| குறிப்பிடும் நேரத்திற்கு பயனர் ஏதும் செய்யாமல் இருந்தால் திரை முடக்கப்படும். + * |IdleWarning| குறிப்பிடும் நேரத்திற்கு பயனர் ஏதும் செய்யாமல் இருந்தால் அதற்கான நடவடிக்கை எடுக்கப்படும் என்று எச்சரிக்கைச் செய்தி காட்டப்படும். செயலற்ற நிலைக்கான நடவடிக்கையானது வெளியேறும்படியோ முடக்கும்படியோ இருந்தால் மட்டுமே எச்சரிக்கைச் செய்தி காட்டப்படும். + * |Idle| குறிப்பிடும் நேரத்திற்கு பயனர் ஏதும் செய்யாமல் இருந்தால் |IdleAction| குறிப்பிடும் நடவடிக்கை மேற்கொள்ளப்படும். + + மேலே கூறப்பட்ட ஒவ்வொரு நடவடிக்கைக்கும் தாமதமானது மில்லி வினாடிகளில் குறிப்பிடப்பட வேண்டும், மேலும் பொருத்தமான நடவடிக்கையைத் தூண்ட பூஜ்ஜியத்தைவிட அதிகமான மதிப்பு அமைக்கப்பட வேண்டும். தாமதமானது பூஜ்ஜியமாக அமைக்கப்பட்டால் பொருத்தமான செயலை <ph name="PRODUCT_OS_NAME" />மேற்கொள்ளாது. + + மேலே கூறப்பட்ட ஒவ்வொரு தாமதத்திற்கும் நேர அளவு அமைக்கப்படவில்லை எனில் இயல்புநிலை மதிப்பு பயன்படுத்தப்படும். + + |ScreenDim| மதிப்புகள் |ScreenOff| மதிப்பைவிடக் குறைவாகவோ அதற்குச் சமமாகவோ மாற்றியமைக்கப்படும், மேலும் |ScreenOff| மற்றும் |IdleWarning| மதிப்புகள் |Idle| மதிப்பைவிடக் குறைவாகவோ அதற்குச் சமமாகவோ மாற்றியமைக்கப்படும். + + |IdleAction| என்பது சாத்தியமான நான்கு நடவடிக்கைகளில் ஒன்றாக இருக்கலாம்: + * |Suspend| + * |Logout| + * |Shutdown| + * |DoNothing| + + |IdleAction| அமைக்கப்படவில்லை எனில் இயல்பு நடவடிக்கையான இடைநிறுத்தத்தை மேற்கொள்ளும். + + AC மின்சக்திக்கும் பேட்டரிக்கும் தனித்தனியான அமைப்புகளும் உள்ளன. + </translation> <translation id="4150201353443180367">டிஸ்பிளே</translation> <translation id="4157003184375321727">OS மற்றும் firmware பதிப்பைப் புகாரளி</translation> <translation id="4157594634940419685">இயல்பு CUPS பிரிண்டர்களுக்கான அணுகலை அனுமதிக்கும்</translation> @@ -1680,6 +1712,15 @@ <translation id="4322842393287974810"><ph name="PRODUCT_OS_NAME" /> பதிப்பைக் கட்டுப்படுத்த, தாமதமின்றி தானாகத் துவங்கும் கியோஸ்க் பயன்பாட்டை அனுமதிக்கவும்</translation> <translation id="4325690621216251241">கணினி ட்ரேயில் வெளியேறு பொத்தனைச் சேர்க்கவும்</translation> <translation id="4332177773549877617">Android பயன்பாட்டின் நிறுவல்களுக்காக, நிகழ்வுகளைப் பதிவுசெய்</translation> +<translation id="4335292026668105285">AC மின்சக்தியில் இயங்கும்போது எச்சரிக்கை உரையாடல் காண்பிக்கப்பட்டதற்கு பிறகு, பயனரின் உள்ளீடு இல்லாத நேரத்தின் நீளத்தைக் குறிக்கும். + + இந்தக் கொள்கை அமைக்கப்பட்டால், இது செயலற்ற நிலைக்கான நடவடிக்கை மேற்கொள்ளவுள்ளது என்ற எச்சரிக்கை உரையாடலை <ph name="PRODUCT_OS_NAME" /> பயனருக்குக் காட்டுவதற்கு முன்பாக, பயனர் செயலற்ற நிலையில் இருக்க வேண்டிய நேரத்தின் நீளத்தைக் குறிப்பிடும். + + இந்தக் கொள்கை அமைக்கப்படவில்லை எனில், எந்த எச்சரிக்கை உரையாடலும் காண்பிக்கப்படாது. + + கொள்கையின் மதிப்பானது மில்லிவினாடிகளில் குறிப்பிடப்பட வேண்டும். மதிப்புகள் செயலற்ற தாமதநிலைக்குக் குறைவாகவோ அல்லது சமமாகவோ பிணைக்கப்பட்டிருக்கும். + + செயலற்ற நிலைக்கான நடவடிக்கையானது வெளியேறும்படியோ முடக்கும்படியோ இருந்தால் மட்டுமே எச்சரிக்கைச் செய்தி காட்டப்படும்.</translation> <translation id="4346674324214534449">குறுக்கிடும் விளம்பரங்களுடன்கூடிய தளங்களில் விளம்பரங்களைத் தடுக்க வேண்டுமா என்பதை அமைப்பதற்கு அனுமதிக்கும். இந்தக் கொள்கை "2" என்பதற்கு அமைத்தால், குறுக்கிடும் விளம்பரங்களுடன்கூடிய தளங்களில் விளம்பரங்கள் தடுக்கப்படும். @@ -3185,6 +3226,11 @@ இந்தக் கொள்கை பயன்படுத்தப்பட்டால், இந்தக் கொள்கையில் பட்டியலிடப்பட்ட ஐடிகளைத் தவிர, மற்ற எல்லாப் பிரிண்டர்களையும் பயனர் பயன்படுத்தலாம். <ph name="DEVICE_PRINTERS_POLICY" /> இல் குறிப்பிடப்பட்டுள்ள கோப்பில் உள்ள "id" அல்லது "guid" புலங்களுடன் ஐடிகள் பொருந்த வேண்டும். </translation> +<translation id="7506269062143646163">Signed HTTP Exchange (SXG)க்கான ஆதரவை இயக்கும். + + இந்தக் கொள்கை அமைக்கப்படவில்லை என்றாலோ இயக்கப்பட்டாலோ இணைய உள்ளடக்கங்கள் Signed HTTP Exchanges ஆக வழங்கப்படுவதை Google Chrome ஏற்கும். + + இந்தக் கொள்கை முடக்கப்பட்டால் Signed HTTP Exchangesஸை ஏற்ற முடியாது.</translation> <translation id="7511361072385293666">இந்தக் கொள்கை true என அமைக்கப்பட்டிருந்தாலோ அல்லது அமைக்கப்படாமல் இருந்தாலோ <ph name="PRODUCT_NAME" /> இல் QUIC நெறிமுறையின் பயன்பாடு அனுமதிக்கப்படும். இந்தக் கொள்கை false என அமைக்கப்படாமல் இருந்தால் QUIC நெறிமுறையின் பயன்பாடு அனுமதிக்கப்படாது.</translation> <translation id="7517845714620372896">திரை ஒளிர்வின் சதவீதத்தைக் குறிப்பிடும். @@ -3324,6 +3370,15 @@ "ethernet", "wifi", "wimax", "bluetooth" மற்றும் "cellular" ஆகியவை அங்கீகரிக்கப்பட்ட இணைப்பு வகை அடையாளங்காட்டிகளாகும்.</translation> <translation id="7763614521440615342">புதிய தாவல் பக்கத்தில் உள்ளடக்கப் பரிந்துரைகளைக் காட்டு</translation> <translation id="7765879851993224640">Smart Lock உள்நுழைவைப் பயன்படுத்துவதை அனுமதிக்கும்.</translation> +<translation id="7772346342637974431">பேட்டரி சக்தியில் இயங்கும்போது எச்சரிக்கை உரையாடல் காண்பிக்கப்பட்டதற்கு பிறகு, பயனரின் உள்ளீடு இல்லாத நேரத்தின் நீளத்தைக் குறிக்கும். + + இந்தக் கொள்கை அமைக்கப்பட்டால், இது செயலற்ற நிலைக்கான நடவடிக்கை மேற்கொள்ளவுள்ளது என்ற எச்சரிக்கை உரையாடலை <ph name="PRODUCT_OS_NAME" /> பயனருக்குக் காட்டுவதற்கு முன்பாக, பயனர் செயலற்ற நிலையில் இருக்க வேண்டிய நேரத்தின் நீளத்தைக் குறிப்பிடும். + + இந்தக் கொள்கை அமைக்கப்படவில்லை எனில், எந்த எச்சரிக்கை உரையாடலும் காண்பிக்கப்படாது. + + கொள்கையின் மதிப்பானது மில்லிவினாடிகளில் குறிப்பிடப்பட வேண்டும். மதிப்புகள் செயலற்ற தாமதநிலைக்குக் குறைவாகவோ அல்லது சமமாகவோ பிணைக்கப்பட்டிருக்கும். + + செயலற்ற நிலைக்கான நடவடிக்கையானது வெளியேறும்படியோ முடக்கும்படியோ இருந்தால் மட்டுமே எச்சரிக்கைச் செய்தி காட்டப்படும்.</translation> <translation id="7774768074957326919">கணினியின் ப்ராக்ஸி அமைப்புகளைப் பயன்படுத்து</translation> <translation id="7777535871204167559">வெளிப்புறச் சேமிப்பகச் சாதனங்களை, 'படிக்க மட்டுமேயான' சாதனங்களாகப் பயன்படுத்தும்</translation> <translation id="7788511847830146438">ஒவ்வொரு சுயவிவரத்திற்கும்</translation> @@ -3375,6 +3430,7 @@ <translation id="793134539373873765">OS புதுப்பிப்பு தரவுகளுக்கு p2p பயன்படுத்தப்பட வேண்டுமா என்பதைக் குறிப்பிடுகிறது. சரி என அமைக்கப்பட்டிருந்தால், LAN இல் புதுப்பிப்பு தரவுகளைச் சாதனங்கள் பகிரும், மேலும் பெறுவதற்கும் முயற்சிக்கும், மேலும் இது இணைய அகலக்கற்றையின் பயன்பாடு மற்றும் நெரிசலைக் குறைக்கும். LAN இல் புதுப்பிப்பு தரவு இல்லையெனில், சாதனம் புதுப்பிப்புச் சாதனத்திலிருந்து பதிவிறக்குவதைக் குறைக்கும். தவறு அல்லது உள்ளமைக்கப்படவில்லை எனில், p2p பயன்படுத்தப்படாது.</translation> <translation id="7933141401888114454">மேற்பார்வையிடப்படும் பயனர்களின் உருவாக்கத்தை இயக்கு</translation> <translation id="793473937901685727">ARC பயன்பாடுகளுக்குச் சான்றிதழ் கிடைக்கும்நிலையை அமை</translation> +<translation id="7937491150792971922">பல மூலங்களிலிருந்து நீட்டிப்பு நிறுவல் பட்டியல் கொள்கைகளை ஒன்றிணைக்கும்</translation> <translation id="7937766917976512374">வீடியோ பதிவை அனுமதி அல்லது தடு</translation> <translation id="7941975817681987555">எந்த நெட்வொர்க் இணைப்பிலும் நெட்வொர்க் செயல்பாடுகளை யூகிக்க வேண்டாம்</translation> <translation id="7952958573604504839">இந்தக் கொள்கை <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" />க்குச் சாதகமாக M48ல் தடுக்கப்பட்டுள்ளது, M54ல் அகற்றப்பட்டுள்ளது. @@ -3830,6 +3886,7 @@ பாதுகாப்பான சூழல் பற்றிய கூடுதல் தகவல்களைப் பெற, https://www.w3.org/TR/secure-contexts/ என்ற தளத்தைப் பார்க்கவும் </translation> +<translation id="8939595959513040470">பயனர்களுக்கு Quick Fix Build மூலம் வழங்கும்.</translation> <translation id="8942616385591203339">முதல் உள்நுழைவின் போது, ஒத்திசைவு அனுமதி பயனருக்குக் காண்பிக்கப்பட வேண்டுமா என்பதை இந்தக் கொள்கை கட்டுப்படுத்துகிறது. பயனருக்கு ஒத்திசைவு அனுமதி ஒருபோதும் தேவைப்படாத சூழலில், இது தவறு என அமைக்கப்படும். தவறு என அமைக்கப்பட்டால், ஒத்திசைவு அனுமதி காண்பிக்கப்படாது. சரி என அமைக்கப்பட்டால் அல்லது அமைக்கப்படவில்லை எனில், ஒத்திசைவு அனுமதி காண்பிக்கப்படும்.</translation> @@ -3887,6 +3944,9 @@ கொள்கை அமைக்கப்படாமல் இருந்தால், உள்நுழைவுத் திரையில் பயனரைக் குறிப்பிடும் தோற்றப் படத்தைப் பயனர் தேர்வுசெய்யலாம்.</translation> <translation id="9035964157729712237">தடுப்புப் பட்டியலில் இருந்து, விலக்குவதற்கான நீட்டிப்பு IDகள்</translation> +<translation id="9038058011835642205">பயனருக்கு அறிவிக்காமல் நிறுவப்படும் இணையதளங்களின் பட்டியலைத் தானாகவே குறிக்கும். இவற்றைப் பயனரால் நிறுவல் நீக்கவோ முடக்கவோ முடியாது. + + கொள்கையின் பட்டியலில் உள்ள ஒவ்வொன்றும் முக்கிய உறுப்பைக் கொண்டதாகும்: "url" மற்றும் இரண்டு விருப்பத்தேர்வு உறுப்புகள்: "default_launch_container" மற்றும் "create_desktop_shortcut". "url" ஆனது நிறுவ வேண்டிய இணைய ஆப்ஸின் URLலாக இருக்க வேண்டும், இணைய ஆப்ஸ் நிறுவப்பட்டதும் அது எவ்வாறு திறக்கப்படும் என்பதைக் குறிக்கும் 'சாளரமாகவோ' 'தாவலாகவோ' "launch_container" இருக்க வேண்டும். மேலும் Linuxஸிலும் Windowsஸிலும் டெஸ்க்டாப் ஷார்ட்கட் உருவாக்கப்பட வேண்டுமெனில், "create_desktop_shortcut" ஆனது 'சரி" என அமைக்கப்பட வேண்டும். "default_launch_container" புறக்கணிக்கப்பட்டால், ஆப்ஸ் இயல்பாகவே தாவலில் திறக்கும். "default_launch_container"ரின் மதிப்பு எப்படி இருந்தாலும், எந்த கன்டெய்னரில் ஆப்ஸ் திறக்கப்பட வேண்டும் என்பதைப் பயனர் மாற்றலாம். "create_desktop_shortcuts" ஆனது புறக்கணிக்கப்பட்டால், டெஸ்க்டாப் ஷார்ட்கட்கள் எதுவும் உருவாக்கப்படாது.</translation> <translation id="9038839118379817310">வைஃபையை இயக்கும்</translation> <translation id="9039822628127365650">இந்தக் கொள்கை அமைக்கப்பட்டால் பயனரை உள்நுழைவிலிருந்து தானாக வெளியேற்றி, அமர்வை முடிக்க வேண்டிய நேர அளவைக் குறிப்பிடும். சிஸ்டம் ட்ரேயில் காட்டப்படும் நேரக் கணிப்பான் மூலம் மீதமிருக்கும் நேரம் பயனருக்குத் தெரிவிக்கப்படும். @@ -3896,6 +3956,11 @@ கொள்கையின் மதிப்பை மில்லி வினாடிகளில் குறிப்பிட வேண்டும். மதிப்புகள் 30 வினாடிகளில் இருந்து 24 மணிநேரம் வரையிலான வரம்பிற்கு மாற்றியமைக்கப்படும்.</translation> <translation id="9042911395677044526"><ph name="PRODUCT_OS_NAME" /> சாதனத்தில் பயன்படுத்துவதற்கு ஒவ்வொரு பயனருக்குமாக நெட்வொர்க் உள்ளமைவை வழங்க அனுமதிக்கிறது. நெட்வொர்க் உள்ளமைவு என்பது <ph name="ONC_SPEC_URL" /> இல் விளக்கப்பட்டுள்ளபடி திறந்த நெட்வொர்க் உள்ளமைவு வடிவத்தால் வரையறுக்கப்பட்ட JSON-வடிவமைப்புத் தொடர் ஆகும்.</translation> +<translation id="9050853837490399534">சாதனம் Quick Fix Buildக்குப் புதுப்பிக்கப்பட்டாலும் இல்லையென்றாலும் இந்தக் கொள்கை அதைக் கட்டுப்படுத்தும். + + Quick Fix Buildக்கு மேப் செய்யும் டோக்கனுக்கு கொள்கையின் மதிப்பு வழங்கப்பட்டு, புதுப்பிப்பு மற்றொரு கொள்கையின் மூலம் தடுக்கப்படாமல் இருந்தால், தொடர்புடைய Quick Fix Buildக்குச் சாதனம் புதுப்பிக்கப்படும். + + இந்தக் கொள்கை அமைக்கப்படவில்லை என்றாலோ அதன் மதிப்பு Quick Fix Buildக்கு மேப் செய்யப்படவில்லை என்றாலோ சாதனம் Quick Fix Buildக்கு புதுப்பிக்கப்படாது. சாதனம் ஏற்கனவே Quick Fix Buildஐ செயல்படுத்திக்கொண்டும் கொள்கையானது இனி அமைக்கப்படாமலும் அல்லது அதன் மதிப்பு Quick Fix Buildக்கு இனி மேப் செய்யப்படாமலும் இருப்பின், புதுப்பிப்பு மற்றொரு கொள்கையின் மூலம் தடுக்கப்படாமல் இருந்தால், சாதனம் வழக்கமான கட்டமைப்பிற்குப் புதுப்பிக்கப்படும்.</translation> <translation id="906631898352326790"> இந்தக் கொள்கை இயக்கப்பட்டிருந்தால், காற்புள்ளியால் பிரிக்கப்பட்ட பட்டியலில் குறிப்பிடப்பட்டுள்ள ஒவ்வொரு தளமும் அதற்குரிய செயல்முறையை இயக்கும். இது துணை டொமைன்களின்படியும் தளங்களைத் தனிப்படுத்தும். எ.கா. https://example.com/ எனக் குறிப்பிட்டால், https://example.com/ தளத்தின் ஒரு பகுதியாக https://foo.example.com/ எனும் தளமும் தனிப்படுத்தப்படும். இந்தக் கொள்கை முடக்கப்பட்டிருந்தால், IsolateOrigins, SitePerProcess ஆகியவற்றின் அம்சங்கள் முடக்கப்படும். அப்போதும் பயனர்களால் கட்டளை வரிக் கொடிகள் மூலம் IsolateOriginsஸை நேரடியாக இயக்க முடியும்.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 1569426..db8f3bd 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -54,6 +54,13 @@ <translation id="1049138910114524876">Налаштовує, який мовний код використовуватиметься на екрані входу в <ph name="PRODUCT_OS_NAME" />. Якщо правило налаштовано, на екрані входу завжди використовуватиметься мовний код, указаний у першому значенні в цьому правилі (правило визначається як список прямої сумісності). Якщо це правило не налаштовано або для нього вказано пустий список, на екрані входу використовуватиметься мовний код останнього сеансу користувача. Якщо для цього правила вказано недійсний мовний код, на екрані входу використовуватиметься альтернативний код (зараз "en-US").</translation> +<translation id="1052499923181221200">Це правило не діє, якщо для правила SamlInSessionPasswordChangeEnabled не вибрано значення true. + Якщо для вказаного вище правила вибрано значення true, а для цього вказано, наприклад, 14, користувачі SAML отримують сповіщення за 14 днів до того, як завершиться термін дії їхнього пароля. + Тоді вони можуть одразу змінити пароль під час сеансу й оновити його до завершення терміну дії. + Ці сповіщення з’являються, лише якщо постачальник ідентифікаторів SAML надсилає на пристрій інформацію про завершення терміну дії пароля під час входу через SAML. + Якщо для цього правила вибрано значення 0, користувачі не отримують сповіщення заздалегідь, а лише після завершення терміну дії пароля. + + Якщо це правило налаштовано, користувач не може змінити чи замінити його.</translation> <translation id="1062011392452772310">Вмикає віддалене підтвердження даних для пристрою</translation> <translation id="1062407476771304334">Замінити</translation> <translation id="1079801999187584280">Забороняє використання Інструментів розробника</translation> @@ -216,6 +223,7 @@ Якщо це правило ввімкнено, Google Асистент матиме доступ до вмісту екрана. Якщо це правило вимкнено, Google Асистент не матиме доступу до вмісту екрана. Якщо правило не налаштовано, користувачі можуть вибрати, чи надавати Google Асистенту доступ до вмісту екрана</translation> +<translation id="1376119291123231789">Увімкнути режим покращеного заряджання акумулятора</translation> <translation id="1383493480903114193">Це правило ініціює виконання коду мережі у веб-переглядачі. Це правило вимкнено за умовчанням. Якщо його ввімкнути, у користувачів може виникнути проблема з безпекою, коли мережевий процес проходить через "пісочницю". @@ -314,6 +322,18 @@ <translation id="1477934438414550161">TLS 1.2</translation> <translation id="1502843533062797703">Блокувати вставляння ПЗ незалежних розробників</translation> <translation id="1504431521196476721">Віддалене засвідчення</translation> +<translation id="1507382822467487898"> + Визначає, яка MAC-адреса (адреса рівня мережевого доступу) використовується, коли пристрій пристиковано до док-станції. + + Коли док-станція підключається до деяких моделей пристроїв, використовується призначена пристрою MAC-адреса док-станції, щоб визначати пристрій в Ethernet за умовчанням. Це правило дозволяє адміністратору змінювати джерело MAC-адреси, коли пристрій пристиковано до док-станції. + + Якщо вибрано значення DeviceDockMacAddress або правило не налаштовано, використовується призначена пристрою MAC-адреса док-станції. + + Якщо вибрано значення DeviceNicMacAddress, використовується MAC-адреса мережевої плати пристрою. + + Якщо вибрано значення DockNicMacAddress, використовується MAC-адреса мережевої плати док-станції. + + Користувач не може змінити це налаштування.</translation> <translation id="1507957856411744193">Якщо для цього правила вибрано true, <ph name="PRODUCT_NAME" /> під’єднується до пристроїв для трансляції з усіма IP-адресами, а не лише з приватними RFC1918/RFC4193. Якщо для цього правила вибрано false, <ph name="PRODUCT_NAME" /> під’єднується лише до пристроїв для трансляції з приватними адресами RFC1918/RFC4193. @@ -746,6 +766,17 @@ <translation id="2303795211377219696">Вмикає функцію автозаповнення для кредитних карток</translation> <translation id="2309390639296060546">Налаштування географічного місцезнаходження за умовчанням</translation> <translation id="2327252517317514801">Визначати домени з доступом до G Suite</translation> +<translation id="2356878440219553005">Визначає правило керування живленням у режимі заряджання акумулятора. + + Динамічно контролює заряджання акумулятора, щоб мінімізувати його зношення через навантаження та подовжити час роботи. + + Якщо вибрано власний режим заряджання акумулятора, потрібно вказати параметри DeviceBatteryChargeCustomStartCharging і DeviceBatteryChargeCustomStopCharging. + + Якщо це правило налаштовано, застосовується власний режим заряджання акумулятора (за умови, що пристрій підтримує його). + + Якщо це правило не налаштовано, але підтримується на пристрої, застосовується стандартний режим заряджання акумулятора. Користувач не зможе це змінити. + + Примітка: якщо вказано правило <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" />, воно заміняє це правило.</translation> <translation id="237494535617297575">Дозволяє налаштовувати список шаблонів URL-адрес, що визначають сайти, яким дозволено показувати сповіщення. Якщо це правило не встановлено, для всіх сайтів використовується загальне значення за умовчанням – з правила "DefaultNotificationsSetting" (якщо його встановлено) або з особистих налаштувань користувача.</translation> <translation id="2386362615870139244">Дозволити блокування режиму активного стану екрана</translation> <translation id="2411817661175306360">Застереження щодо захисту паролем вимкнено</translation> @@ -781,6 +812,7 @@ Якщо для цього правила встановлено значення "false", нульову затримку автоматичного входу (якщо вона встановлена) обійти не можна.</translation> <translation id="2454228136871844693">Оптимізація для стабільності.</translation> +<translation id="2463034609187171371">Увімкнути набори шифрів DHE в TLS</translation> <translation id="2463365186486772703">Регіональні налаштування програми</translation> <translation id="2466131534462628618">Автентифікація приєднаного порталу ігнорує проксі-сервер</translation> <translation id="2482676533225429905">Обмін повідомленнями з оригінальними додатками</translation> @@ -952,6 +984,7 @@ <translation id="2769952903507981510">Налаштовувати потрібне ім’я домену для хостів віддаленого доступу</translation> <translation id="2787173078141616821">Повідомляти інформацію про статус пристрою Android</translation> <translation id="2799297758492717491">Дозволити автоматично відтворювати медіафайли з білого списку шаблонів URL-адрес</translation> +<translation id="2801155097555584385">Налаштувати рівень початку заряджання акумулятора у відсотках</translation> <translation id="2801230735743888564">Користувачі можуть грати в гру Dinosaur Easter Egg, коли пристрій перебуває в режимі офлайн. Якщо це правило має значення "false", користувачі не зможуть грати в гру Dinosaur Easter Egg у режимі офлайн. Якщо це правило не налаштовано або має значення "true", користувачі зможуть грати в цю гру. Якщо це правило не налаштувати, користувачі не зможуть грати в гру Dinosaur Easter Egg на зареєстрованих пристроях з ОС Chrome, але матимуть змогу робити це на інших пристроях.</translation> @@ -1025,6 +1058,7 @@ Якщо це правило вимкнено або не налаштовано, у режимі попереднього перегляду друку за умовчанням використовуватиметься останній використаний принтер. Якщо це правило ввімкнено, у режимі попереднього перегляду друку використовуватиметься принтер операційної системи за умовчанням.</translation> +<translation id="285627849510728211">Налаштувати режим покращеного заряджання акумулятора для кожного дня</translation> <translation id="2856674246949497058">Відкочуватися до цільової версії та використовувати її, якщо версія ОС новіша. Під час процедури виконується Powerwash.</translation> <translation id="2872961005593481000">Завершити роботу</translation> <translation id="2873651257716068683">Замінює стандартний розмір сторінки друку. Якщо розмір сторінки недоступний, це правило ігнорується.</translation> @@ -1156,12 +1190,26 @@ <translation id="3072045631333522102">Заставка, яка буде відображатися на екрані входу в режимі роздрібного продажу</translation> <translation id="3072847235228302527">Установити Умови використання для локального облікового запису на пристрої</translation> <translation id="3077183141551274418">Вмикає або вимикає життєві цикли вкладок</translation> +<translation id="3079417254871857650">Указує, що робити, коли домашній каталог користувача створено із шифруванням ecryptfs. + + Якщо для цього правила вибрано значення DisallowArc, додатки Android вимикаються для користувача та немає переходу із шифрування ecryptfs на ext4. Якщо домашній каталог уже має шифрування ext4, додатки Android запускаються. + + Якщо для цього правила вибрано значення Migrate, домашні каталоги із шифруванням ecryptfs автоматично переходять на ext4 під час входу (без дозволу користувача). + + Якщо для цього правила вибрано значення Wipe, домашні каталоги із шифруванням ecryptfs автоматично видаляються під час входу, а натомість створюються каталоги з ext4. Застереження: локальні дані користувача видаляються. + + Якщо для цього правила вибрано значення MinimalMigrate, домашні каталоги із шифруванням ecryptfs видаляються під час входу, а натомість створюються каталоги з ext4. Однак маркери облікових даних зберігаються (якщо це можливо), щоб користувач не входив знову. Застереження: локальні дані користувача видаляються. + + Якщо вибрати для цього правила непідтримуване значення (AskUser або AskForEcryptfsArcUsers), воно сприймається як Migrate. + + Це правило не стосується користувачів терміналів. Якщо це правило не налаштовано, пристрій поводиться так, ніби вибрано значення DisallowArc.</translation> <translation id="3086995894968271156">Налаштування приймача Cast у <ph name="PRODUCT_NAME" />.</translation> <translation id="3088796212846734853">Дає змогу налаштовувати список шаблонів URL-адрес, що визначають сайти, яким дозволено показувати зображення. Якщо це правило не налаштовано, для всіх сайтів використовується загальне значення за умовчанням відповідно до правила DefaultImagesSetting (якщо його встановлено) чи особистих параметрів користувача. Зауважте: раніше це правило було помилково ввімкнено на Android, хоча його функції ніколи не підтримувалися повністю.</translation> +<translation id="3091832372132789233">Заряджати акумулятори пристроїв, для яких основним є зовнішнє джерело живлення.</translation> <translation id="3096595567015595053">Список увімкнених плагінів</translation> <translation id="3101501961102569744">Вибрати спосіб визначення налаштувань проксі-сервера</translation> <translation id="3101709781009526431">Дата та час</translation> @@ -1187,6 +1235,7 @@ Якщо це налаштування вимкнено, <ph name="PRODUCT_NAME" /> використовувє лише хости для обміну повідомленнями з оригінальними додатками, установлені на рівні системи. Якщо це правило не налаштовано, <ph name="PRODUCT_NAME" /> дозволяє використовувати хости на рівні користувача для обміну повідомленнями з оригінальними додатками.</translation> +<translation id="3177802893484440532">Вимагати перевірку OCSP/CRL онлайн для локальних ключів довіри</translation> <translation id="3185009703220253572">від версії <ph name="SINCE_VERSION" /></translation> <translation id="3187220842205194486">Додатки Android не мають доступу до корпоративних ключів. На них не впливає це правило.</translation> <translation id="3205825995289802549">Розгортати перше вікно веб-переглядача під час запуску</translation> @@ -1196,6 +1245,7 @@ <translation id="3220624000494482595">Якщо додаток-термінал є додатком Android, він не зможе керувати версією <ph name="PRODUCT_OS_NAME" />, навіть якщо для правила встановлено значення "<ph name="TRUE" />".</translation> <translation id="3236046242843493070">Шаблони URL-адрес, з яких дозволено встановлювати розширення, програми та сценарії користувача</translation> <translation id="3240609035816615922">Правила доступу до конфігурації принтерів.</translation> +<translation id="3240655340884151271">MAC-адреса вбудованої мережевої плати док-станції</translation> <translation id="3243309373265599239">Визначає період часу неактивності користувача, після якого екран затемнюється, якщо використовується живлення від мережі. Якщо для цього правила встановлено значення більше за нуль, указується період часу, протягом якого користувач має залишатися неактивним, перш ніж <ph name="PRODUCT_OS_NAME" /> затемнить екран. @@ -1217,6 +1267,12 @@ Якщо це налаштування вимкнено або не налаштовано, користувачі можуть вмикати проксі-сервер Cloud Print. Для цього потрібно виконати автентифікацію, використовуючи дані облікового запису Google. Якщо це налаштування вимкнено, користувачі не можуть вмикати проксі-сервер і комп’ютер не надає <ph name="CLOUD_PRINT_NAME" /> доступ до принтерів.</translation> +<translation id="3312206664202507568">Вмикає сторінку на сайті chrome://password-change, що дозволяє користувачам змінювати паролі SAML під час сеансу. Це дає змогу синхронізувати пароль SAML і пароль екрана блокування пристрою. + + Це правило також вмикає сповіщення про завершення терміну дії пароля SAML, щоб користувачі могли вчасно змінити його під час сеансу. + Ці сповіщення з’являються, лише якщо постачальник ідентифікаторів SAML надсилає на пристрій інформацію про завершення терміну дії пароля під час входу через SAML. + + Якщо це правило налаштовано, користувач не може змінити чи замінити його.</translation> <translation id="3322771899429619102">Можна створити список шаблонів URL-адрес сайтів, яким дозволено генерувати ключі. Якщо для шаблону URL-адреси вказано правило KeygenBlockedForUrls, воно замінює цей виняток. Якщо це правило не налаштовано, до всіх сайтів застосовується загальне правило за умовчанням: DefaultKeygenSetting (якщо налаштовано) або правило користувача.</translation> @@ -1301,6 +1357,7 @@ Якщо для цього правила встановлено значення "False" або його не встановлено взагалі, затримки керування живленням або обмеження тривалості сеансу запускаються відразу після початку сеансу.</translation> <translation id="3478024346823118645">Стирати дані користувача під час виходу</translation> +<translation id="3480961938508521469">Повністю заряджати акумулятор зі стандартною швидкістю.</translation> <translation id="348495353354674884">Увімкнути віртуальну клавіатуру</translation> <translation id="3487623755010328395"> Якщо правило налаштовано, <ph name="PRODUCT_NAME" /> спробує зареєструватися та застосувати пов’язані правила хмарних служб до всіх профілів. @@ -1347,6 +1404,8 @@ <translation id="3547954654003013442">Налаштування проксі-сервера</translation> <translation id="355118380775352753">Веб-сайти, які мають відкриватися в альтернативному веб-переглядачі</translation> <translation id="3554984410014457319">Дозволити Google Асистенту розпізнавати фразу для активації голосом</translation> +<translation id="356579196325389849">Користувачі можуть налаштовувати версію оновлення Chrome OS</translation> +<translation id="3575011234198230041">Автентифікація HTTP</translation> <translation id="3577251398714997599">Налаштування реклами для сайтів із нав’язливими оголошеннями</translation> <translation id="357917253161699596">Дозволити користувачам керувати своїми сертифікатами</translation> <translation id="3583230441447348508">Визначає список попередньо налаштованих мережевих файлообмінників. @@ -1377,6 +1436,7 @@ Це правило застосовується через реєстрацію правила про повноваження пристрою щодо використання хмарних служб на комп’ютері й може налаштовуватися за допомогою реєстру чи GPO у Windows, plist у Mac і файлу правила JSON у Linux.</translation> <translation id="3660562134618097814">Передавати файли cookie SAML IdP під час входу</translation> +<translation id="3668151900457104753">Видалити розширення, внесені в чорний список</translation> <translation id="3701121231485832347">Керує налаштуваннями пристроїв із <ph name="PRODUCT_OS_NAME" />, якими керує <ph name="MS_AD_NAME" />.</translation> <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Поле, що складається з одного рядка, не підтримується, у майбутньому його буде видалено. Почніть користуватися полем нижче, що складається з кількох рядків.)</translation> <translation id="3709266154059827597">Налаштувати "чорний список" для встановлення розширень</translation> @@ -1458,6 +1518,16 @@ Якщо це правило не встановлено, екранна клавіатура буде вимкнена, однак користувачі зможуть будь-коли ввімкнути її.</translation> <translation id="382476126209906314">Налаштовувати префікс TalkGadget для хостів віддаленого доступу</translation> <translation id="3824972131618513497">Контролює налаштування, пов’язані з керуванням живленням і перезапуском.</translation> +<translation id="3826475866868158882">Служби локації Google увімкнено</translation> +<translation id="3831054243924627613">Це правило керує початковим станом резервного копіювання й відновлення Android. + + Якщо це правило не налаштовано або має значення <ph name="BR_DISABLED" />, резервне копіювання й відновлення Android вимкнено. + + Якщо цього для правила вибрано значення <ph name="BR_ENABLED" />, резервне копіювання й відновлення Android увімкнено. + + Якщо цього для правила вибрано значення <ph name="BR_UNDER_USER_CONTROL" />, користувач вирішує, чи вмикати резервне копіювання й відновлення Android. Якщо ввімкнути цю функцію, дані додатків Android завантажуються на резервні сервери Android і відновлюються під час перевстановлення сумісних додатків. + + Зауважте, що це правило контролює стан резервного копіювання й відновлення Android лише під час початкового налаштування. Пізніше користувач може ввімкнути або вимкнути резервне копіювання й відновлення Android у налаштуваннях.</translation> <translation id="3831376478177535007">Якщо це налаштування ввімкнено, <ph name="PRODUCT_NAME" /> дозволяє вважати сертифікати, видані застарілими операціями PKI корпорації Symantec, надійними, якщо їх підтверджено та приєднано до визнаних сертифікатів центру сертифікації (ЦС). Зверніть увагу, що це правило залежить від того, чи операційна система все ще визнає сертифікати від застарілої інфраструктури корпорації Symantec. Якщо після оновлення ОС спосіб обробки сертифікатів зміниться, це правило може перестати діяти. Окрім того, це правило діє тимчасово, щоб підприємства мали більше часу на заміну застарілих сертифікатів корпорації Symantec. Правило перестане діяти приблизно 1 січня 2019 року. @@ -1539,6 +1609,15 @@ Якщо правило не налаштовано або має значення "false", користувачі можуть надсилати файли на Google Диск.</translation> <translation id="3915395663995367577">URL-адреса для файлу .pac проксі-сервера</translation> +<translation id="3920892052017026701">Налаштовує рівень початку заряджання акумулятора у відсотках. + + Акумулятор починає заряджатися, коли заряд досягає вказаного значення. + + Значення правила DeviceBatteryChargeCustomStartCharging має бути меншим за DeviceBatteryChargeCustomStopCharging. + + Це правило використовується, лише якщо для DeviceBatteryChargeMode вибрано власне значення. + + Якщо це правило не налаштовано або не встановлено, застосовується стандартний режим заряджання акумулятора.</translation> <translation id="3925377537407648234">Встановлює роздільну здатність екрана й коефіцієнт масштабування</translation> <translation id="3939893074578116847">Надсилати мережеві пакети на сервер керування, щоб відстежувати онлайн-статус. Сервер зможе визначати, чи пристрій перебуває в режимі офлайн. @@ -1667,6 +1746,7 @@ <translation id="4150201353443180367">Екран</translation> <translation id="4157003184375321727">Повідомляти версію ОС і мікропрограми</translation> <translation id="4157594634940419685">Надавати доступ до рідних принтерів CUPS</translation> +<translation id="4160962198980004898">Джерело MAC-адреси пристрою, пристикованого до док-станції</translation> <translation id="4163705126749612234">Налаштовує потрібні доменні імена, які надаються клієнтам із віддаленим доступом. Користувачі не можуть змінювати це налаштування. Якщо це налаштування ввімкнено, лише клієнти з одного з указаних доменів можуть під’єднуватися до хосту. @@ -1742,6 +1822,7 @@ Тож якщо список правил порожній, створення нотаток на заблокованому екрані вимкнеться. Зауважте, що правило, яке містить ідентифікатор додатка, не обов’язково означає, що користувач зможе вмикати цей додаток для створення нотаток на заблокованому екрані. Наприклад, у версії Chrome 61 платформа додатково обмежує набір доступних додатків. Якщо це правило не налаштовано, обмеження щодо додатків, які користувач може активувати на заблокованому екрані, не діють.</translation> +<translation id="4313767483634435271">Призначена пристрою MAC-адреса док-станції</translation> <translation id="4322842393287974810">Дозволити додатку-терміналу, який запускається автоматично та без затримки, керувати версією <ph name="PRODUCT_OS_NAME" /></translation> <translation id="4325690621216251241">Додати кнопку виходу в системну область</translation> <translation id="4332177773549877617">Журнал подій під час встановлення додатків Android</translation> @@ -1773,6 +1854,7 @@ <translation id="4360826270668210664">Якщо це правило налаштовано, хост віддаленого доступу під час з’єднання проситиме клієнтів надати маркер автентифікації з цієї сторінки. Це правило потрібно використовувати разом із RemoteAccessHostTokenValidationUrl. Цю функцію наразі вимкнено на сервері.</translation> +<translation id="4363057787588706121">Дає змогу об’єднувати правила списків із різних джерел</translation> <translation id="436581050240847513">Повідомляти про мережеві інтерфейси пристрою</translation> <translation id="4372704773119750918">Не дозволяти корпоративному користувачу бути частиною мультипрофілю (основним чи другорядним користувачем)</translation> <translation id="4377599627073874279">Дозволяти всім сайтам показувати всі зображення</translation> @@ -1938,6 +2020,7 @@ <translation id="4826326557828204741">Дія, яка має виконуватися під час живлення від акумулятора, коли виникає затримка через неактивність</translation> <translation id="4832852360828533362">Звіти про користувачів і пристрої</translation> <translation id="4834526953114077364">Дані неактивних останнім часом користувачів, які не входили в обліковий запис протягом останніх 3-х місяців, видаляються, доки не буде звільнено достатньо місця</translation> +<translation id="4835622243021053389">Увімкнути автентифікацію NTLMv2.</translation> <translation id="4858735034935305895">Дозволити повноекранний режим</translation> <translation id="4861767323695239729">Налаштовує дозволені методи введення в сеансі користувача</translation> <translation id="487460824085252184">Переміщувати автоматично без дозволу користувача.</translation> @@ -2056,6 +2139,11 @@ На відміну від <ph name="URL_LIST_POLICY_NAME" />, правила застосовуються в обох напрямках. Якщо встановлено й увімкнено доповнення для Internet Explorer, воно також визначає, чи <ph name="IE_PRODUCT_NAME" /> відкриватиме ці URL-адреси в <ph name="PRODUCT_NAME" />.</translation> <translation id="5124368997194894978">Дозволити запуск під час підключення змінного струму</translation> +<translation id="5131211790949066746">Дає змогу об’єднати правила <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" /> і <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> зі списку встановлення розширень. + + Якщо це налаштування ввімкнено, значення з правил платформи пристрою, хмари пристрою й платформи користувача об’єднуються в один список і діють разом (замість значень з одного джерела з найвищим пріоритетом). + + Якщо це налаштування вимкнено або не встановлено, беруться лише записи з джерела з найвищим пріоритетом, а всі інші джерела показуються як конфліктні й ігноруються.</translation> <translation id="5141670636904227950">Установити тип лупи за умовчанням, яка вмикається на екрані входу</translation> <translation id="5142301680741828703">Завжди відтворювати перелічені шаблони URL-адрес у <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="5148753489738115745">Дозволяє вказувати додаткові параметри, які використовуються, коли <ph name="PRODUCT_FRAME_NAME" /> запускає <ph name="PRODUCT_NAME" />. @@ -2165,6 +2253,7 @@ Якщо не налаштувати це правило або залишити порожній рядок чи вказати недійсний діапазон порту, WebRTC буде дозволено використовувати будь-який доступний локальний порт UDP.</translation> <translation id="5290940294294002042">Указати список плагінів, які користувач може ввімкнути або вимкнути</translation> +<translation id="5306186200045823863">Увімкнути застарілу інфраструктуру відкритих ключів корпорації Symantec як надійну</translation> <translation id="5307432759655324440">Доступність режиму анонімного перегляду</translation> <translation id="5318185076587284965">Увімкнути використання серверів ретрансляції хостами віддаленого доступу.</translation> <translation id="5323128137188992869">Дає змогу транслювати вміст на пристрої за допомогою <ph name="PRODUCT_NAME" />. @@ -2260,6 +2349,7 @@ Якщо правила конфліктують, <ph name="PRODUCT_NAME" />використовує те, яке підходить найбільше.</translation> <translation id="5475361623548884387">Увімкнути друк</translation> <translation id="547601067149622666">Заборонити рекламу на сайтах із нав'язливими оголошеннями</translation> +<translation id="5483065054530244863">Дозволяти підписані сертифікати SHA-1, видані локальними ключами довіри</translation> <translation id="5483777239978559943">Це правило більше не підтримується. Натомість використовуйте правило <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" />, щоб контролювати доступність плагіна Flash, і правило <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" />, щоб указувати, чи файли PDF відкриватимуться за допомогою інтегрованого засобу перегляду PDF. Визначає список плагінів, які користувач може ввімкнути або вимкнути в <ph name="PRODUCT_NAME" />. @@ -2376,6 +2466,17 @@ Якщо це правило ввімкнено або не налаштовано, користувачі можуть переглядати свої паролі як відкритий текст у диспетчері паролів.</translation> <translation id="5620392548325769024">Показувати сторінку привітання під час першого запуску веб-переглядача після оновлення ОС</translation> <translation id="5630352020869108293">Відновити останній сеанс</translation> +<translation id="5643906875497889108">Визначає, які типи додатків або розширень можна встановлювати, і обмежує доступ до часу виконання. + + Це налаштування створює білий список типів розширень і додатків, які можна встановлювати в <ph name="PRODUCT_NAME" />, та хостів, із якими вони можуть взаємодіяти. Значення – список рядків таких типів: extension, theme, user_script, hosted_app, legacy_packaged_app, platform_app. Докладніше про ці типи можна дізнатися в документації <ph name="PRODUCT_NAME" /> щодо розширень. + + Зауважте, що це правило також впливає на примусове встановлення розширень і додатків через ExtensionInstallForcelist. + + Якщо це правило налаштовано, типи розширень і додатків, яких немає в списку, не встановлюються. + + Якщо це правило не налаштовано, немає обмежень щодо прийнятних типів розширень і додатків. + + До версії 75 не підтримується введення кількох ідентифікаторів розширень через кому. Решта правила застосовується.</translation> <translation id="5645779841392247734">Дозволити файли cookie на цих сайтах</translation> <translation id="5689430183304951538">Стандартний розмір сторінки друку</translation> <translation id="5693469654327063861">Дозволити перенесення даних</translation> @@ -2415,6 +2516,7 @@ <translation id="5765780083710877561">Опис:</translation> <translation id="5770738360657678870">Версія для розробників (може бути нестабільною)</translation> <translation id="5774856474228476867">URL-адреса для пошуку пошукової служби за умовчанням</translation> +<translation id="5775235485119094648">Заряджати акумулятор, коли досягнуто вказаного діапазону.</translation> <translation id="5776485039795852974">Запитувати щоразу, коли сайт хоче показати сповіщення на робочому столі</translation> <translation id="5781412041848781654">Указує, яку бібліотеку GSSAPI використовувати для автентифікації HTTP. Можна вказати лише назву бібліотеки або повний шлях. @@ -2476,6 +2578,7 @@ <translation id="5893553533827140852">Якщо цей параметр увімкнено, запити на автентифікацію розширення Gnubby надсилаються через віддалене з’єднанння з хостом. Якщо цей параметр вимкнено або не налаштовано, запити на автентифікацію розширення Gnubby не надсилаються.</translation> +<translation id="5897913798715600338">Заряджати акумулятор через технологію швидкого заряджання.</translation> <translation id="5898486742390981550">Якщо на пристрої здійснено вхід у декілька облікових записів, працювати в додатках Android може лише основний користувач.</translation> <translation id="5900196529149231477"> Це правило діє для екрана входу. Також перегляньте правило <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, яке застосовується до сеансу користувача. Радимо вибрати однакове значення для обох правил. Інакше сеанс користувача може починатись із затримкою, оскільки застосовуватиметься значення, указане в політиці користувача. @@ -2484,12 +2587,14 @@ Якщо це правило не налаштовано, для екрана входу діють параметри платформи ізоляції сайтів за умовчанням. </translation> <translation id="5901427587865226597">Лише двосторонній друк</translation> +<translation id="5905473632148429217">Увімкнути перевірки OCSP/CRL онлайн</translation> <translation id="5906199912611534122">Дозволяє вмикати або вимикати обмеження пропускної спроможності мережі. Цей параметр впливає на користувачів та інтерфейс пристроїв. Якщо налаштувати його, обмеження застосовуватиметься, доки не буде змінено значення параметра. Якщо вибрано значення "false", обмеження не діятиме. Якщо вибрано значення "true", систему буде обмежено до вказаної швидкості передавання та завантаження (у Кбіт/с).</translation> +<translation id="591088232153082363">Адаптивне заряджання акумулятора на основі моделі використання заряду.</translation> <translation id="5921713479449475707">Дозволити завантаження автоматичних оновлень через HTTP</translation> <translation id="5921888683953999946">Налаштувати стан за умовчанням для функції доступності великого курсора на екрані входу. @@ -2511,6 +2616,7 @@ <translation id="5950205771952201658">Зважаючи на те, що онлайнові перевірки анулювання сертифікатів із так званою "м’якою відмовою" (soft-fail) не забезпечують ефективного покращення безпеки, за умовчанням вони вимкнені в <ph name="PRODUCT_NAME" /> 19 і новіших версіях. Якщо для цього правила встановити значення "true", відновиться попередній режим і знову виконуватимуться перевірки OCSP/CRL у режимі онлайн. Якщо правило не налаштовано або має значення "false", <ph name="PRODUCT_NAME" /> не виконуватиме онлайнові перевірки сертифікатів у <ph name="PRODUCT_NAME" /> 19 і новіших версіях.</translation> +<translation id="5961137303188584693">MAC-адреса вбудованої мережевої плати пристрою</translation> <translation id="5966615072639944554">Дозволяє розширенням використовувати API віддаленого підтвердження даних</translation> <translation id="5983708779415553259">Поведінка за умовчанням для сайтів, яких немає в жодному пакеті вмісту</translation> <translation id="5997543603646547632">Використовувати 24-годинний формат годинника за умовчанням</translation> @@ -2601,6 +2707,17 @@ <translation id="6111936128861357925">Дозволити грати в гру Dinosaur Easter Egg</translation> <translation id="6114416803310251055">не рекомендується</translation> <translation id="6133088669883929098">Дозволити всім сайтам генерувати ключі</translation> +<translation id="6136537398661737682">Це правило керує початковим станом Служб локації Google. + + Якщо це правило не налаштовано або має значення <ph name="GLS_DISABLED" />, Служби локації Google вимкнено. + + Якщо для цього правила вибрано значення <ph name="GLS_ENABLED" />, Служби локації Google увімкнено. + + Якщо для цього правила вибрано значення <ph name="GLS_UNDER_USER_CONTROL" />, користувач може вирішувати, чи вмикати Служби локації Google. Якщо це правило ввімкнено, додатки Android можуть запитувати місцезнаходження пристрою через сервіси, а також надсилати анонімні геодані в Google. + + Зауважте, що це правило контролює стан Служб локації Google лише під час початкового налаштування. Пізніше користувач може ввімкнути або вимкнути Служби локації Google у налаштуваннях Android. + + Зауважте, що це правило ігнорується й Служби локації Google завжди вимкнено, якщо для правила <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> вибрано значення <ph name="BLOCK_GEOLOCATION_SETTING" />.</translation> <translation id="6141402445226505817">Завжди приблизно визначати часовий пояс</translation> <translation id="6145799962557135888">Дозволяє налаштовувати список шаблонів URL-адрес, що визначають сайти, яким дозволено запускати JavaScript. Якщо це правило не встановлено, для всіх сайтів використовується загальне значення за умовчанням – з правила "DefaultJavaScriptSetting" (якщо його встановлено) або з особистих налаштувань користувача.</translation> <translation id="614662973812186053">Це правило також керує збиранням даних про використання та діагностику додатків Android.</translation> @@ -2674,9 +2791,17 @@ Якщо правило вимкнено, дані автозаповнення форм не імпортуватимуться. Якщо це правило не налаштовано, користувач отримує запит на імпортування або імпортування починається автоматично.</translation> +<translation id="6221175752766085998">Дозволяти сертифікати, видані локальними ключами довіри без розширення subjectAlternativeName</translation> <translation id="6224304369267200483">URL-адресам і доменам автоматично дозволене засвідчення ключів безпеки</translation> <translation id="6233173491898450179">Установити каталог для завантаження</translation> <translation id="6244210204546589761">URL-адреси для відкривання під час запуску</translation> +<translation id="6255387031094435995">Дає змогу об’єднати вибрані правила з різних джерел, якщо вони мають однакові область дії та рівень. + + Якщо правило є в списку, але існує конфлікт між двома джерелами, значення об’єднуються в новий список правил за умови, що вони мають однакові область дії та рівень. + + Якщо правило є в списку, але існує конфлікт між двома джерелами й областями дії та/або рівнями, застосовується правило з найвищим пріоритетом. + + Якщо правила немає в списку, але існує конфлікт між двома джерелами й областями дії та/або рівнями, застосовується правило з найвищим пріоритетом.</translation> <translation id="6258193603492867656">Указує, чи створене ім’я учасника сервера (SPN) за протоколом Kerberos має включати нестандартний порт. Якщо це налаштування ввімкнено та введено нестандартний порт (тобто не порт 80 або 443), порт включається в створене ім’я SPN Kerberos. Якщо це налаштування вимкнено чи не встановлено, у створене ім’я SPN Kerberos ніколи не включається порт.</translation> <translation id="6261643884958898336">Повідомляти ідентифікаційну інформацію комп’ютера</translation> <translation id="6281043242780654992">Налаштовує правила для хостів для обміну повідомленнями з оригінальними додатками. Хости для обміну повідомленнями з оригінальними додатками, внесені в чорний список, забороняються, якщо їх не внесено в білий список.</translation> @@ -2874,6 +2999,7 @@ <translation id="6757438632136860443">Дозволяє створювати список шаблонів URL-адрес сайтів, які можуть запускати плагін <ph name="FLASH_PLUGIN_NAME" />. Якщо це правило не встановлено, для всіх сайтів буде застосовано загальне значення за умовчанням відповідно до правила "DefaultPluginsSetting" (якщо таке встановлено) або персоналізованих налаштувань користувача.</translation> +<translation id="6757613329154374267">Резервне копіювання й відновлення ввімкнено</translation> <translation id="6762235610019366960">Дає змогу керувати показом вмісту рекламного та/або навчального характеру на всю вкладку в <ph name="PRODUCT_NAME" />. Якщо це правило не налаштовано або ввімкнено (установлено значення true), <ph name="PRODUCT_NAME" /> може показувати вміст на всю вкладку, щоб надати користувачам інформацію про продукт. @@ -2896,6 +3022,7 @@ Рядок може містити змінні ${ASSET_ID}, ${SERIAL_NUM}, ${MAC_ADDR}, ${MACHINE_NAME}, які буде замінено значеннями на пристрої перед іменем хосту. Нове значення має бути дійсним іменем хосту (згідно з розділом 3.1 документа RFC 1035). Якщо це правило не налаштовано або замінене значення не є дійсним іменем хосту, у запиті DHCP не буде налаштовано ім’я хосту. </translation> +<translation id="6833988859168635883">Стартова й домашня сторінки та сторінка нової вкладки</translation> <translation id="6835883744948188639">Показувати користувачеві повторюваний запит із рекомендацією перезапуску</translation> <translation id="6837480141980366278">Контролює використання вбудованого клієнта DNS у <ph name="PRODUCT_NAME" />. @@ -3007,6 +3134,17 @@ Коли екран має згаснути, модель розумного затемнення оцінює, чи потрібно відкласти цю дію. Якщо модель розумного затемнення відкладає вимкнення екрана, час його активності збільшується. У такому випадку затримки вимкнення, блокування й неактивності екрана налаштовуються відповідно, щоб проміжки часу від затримки затемнення екрана відповідали попереднім налаштуванням. Якщо це правило має значення true або його не налаштовано, модель розумного затемнення буде ввімкнено, і вона зможе збільшувати час активності екрана. Якщо це правило має значення false, модель розумного затемнення не зможе впливати на час затемнення екрана.</translation> +<translation id="6967394885063085697">Увімкнути правило керування живленням у режимі покращеного заряджання акумулятора. + + Режим покращеного заряджання дає змогу подовжити тривалість роботи акумулятора. У цьому режимі система використовує стандартний алгоритм заряджання й інші методи під час неактивності, щоб подовжити тривалість роботи акумулятора. Під час активності застосовується технологія Express Charge. Завдяки їй акумулятор заряджається швидше. Для кожного дня вказується початок і тривалість періоду, коли система використовується найактивніше. + + Якщо для цього правила вибрано значення true й налаштовано правило DeviceAdvancedBatteryChargeModeDayConfig, режим покращеного заряджання акумулятора завжди ввімкнено (за умови, що пристрій підтримує його). + + Якщо для цього правила вибрано значення false, режим покращеного заряджання акумулятора завжди вимкнено. + + Якщо це правило налаштовано, користувачі не можуть змінювати або замінювати його. + + Якщо це правило не налаштовано, режим покращеного заряджання акумулятора вимкнено. Користувач не може ввімкнути його.</translation> <translation id="6972540544240464302">Вибрати конфігурацію планувальника завдань</translation> <translation id="6979158407327259162">Диск Google</translation> <translation id="6994082778848658360">Визначає, як наявне апаратне забезпечення елемента безпеки можна використовувати для двофакторної автентифікації, якщо воно сумісне з цією функцією. Фізична присутність користувача визначається за допомогою кнопки живлення комп’ютера. @@ -3072,6 +3210,17 @@ Якщо ввімкнути або вимкнути це налаштування, користувачі не зможуть змінити або замінити його. Якщо це правило не налаштовано, користувач може вибрати, чи потрібно вводити пароль, щоб розблокувати пристрій.</translation> +<translation id="7107148737865880402">Увімкнути правило керування живленням USB PowerShare. + + Деякі пристрої мають спеціальний порт USB, позначений значком блискавки або акумулятора, через який можна заряджати інші пристрої (наприклад, мобільний телефон) від акумулятора системи. Це правило впливає на заряджання, коли система перебуває в режимі сну або вимкнена. Воно не впливає на інші порти USB та заряджання, коли система активна. + + За активного стану системи порт USB завжди подає живлення. + + Якщо для цього правила вибрано значення true, а система перебуває в режимі сну, живлення подається на порт USB, лише коли пристрій підключено до електромережі або заряд акумулятора перевищує 50%. В іншому разі живлення не подається. + + Якщо для цього правила вибрано значення true, а систему вимкнено, живлення подається на порт USB, лише коли пристрій підключено до електромережі. В іншому разі живлення не подається. + + Якщо це правило не налаштовано, воно залишається ввімкненим. Користувач не може вимкнути його.</translation> <translation id="7115494316187648452">Визначає, чи розпочався процес <ph name="PRODUCT_NAME" /> під час входу в ОС, і продовжує діяти після закриття останнього вікна веб-переглядача, дозволяючи фоновим додаткам і поточному сеансу веб-перегляду (включно з файлами cookie) залишатись активними. Фоновий процес можна закрити на панелі завдань (на ній відображатиметься відповідний значок). Якщо для правила вибрано значення "true", фоновий режим буде ввімкнено. Користувач не зможе вимкнути його в налаштуваннях веб-переглядача. @@ -3122,6 +3271,7 @@ Якщо для цього правила вказано значення true або його не налаштовано, екран блокуватиметься в активному режимі для керування живленням (якщо для правила AllowWakeLocks не встановлено значення false). Якщо для цього правила вказано значення false, запити на блокування екрана в активному режимі буде прирівняно до запитів на блокування системи в активному режимі.</translation> +<translation id="7177857088692019405">Швидке розблокування</translation> <translation id="7185078796915954712">TLS 1.3</translation> <translation id="718956142899066210">Типи з’єднань, дозволені для оновлень</translation> <translation id="7194407337890404814">Назва пошукової служби за умовчанням</translation> @@ -3186,6 +3336,7 @@ <translation id="7273823081800296768">Якщо цей параметр увімкнено або не налаштовано, користувачі можуть підключати клієнтів і хостів під час з’єднання, не вводячи PIN-код. Якщо цей параметр вимкнено, ця функція недоступна.</translation> +<translation id="7274077256421167535">Увімкнути USB PowerShare</translation> <translation id="7275334191706090484">Закладки, якими керує адміністратор</translation> <translation id="7291084543582732020">Якщо це налаштування ввімкнено, користувачі можуть застосовувати Smart Lock за умови, що дотримуються вимог функції. @@ -3199,6 +3350,7 @@ Це правило застосовується, лише якщо ввімкнено правило "DefaultSearchProviderEnabled".</translation> <translation id="7302043767260300182">Затримка блокування екрана, коли використовується живлення від мережі</translation> +<translation id="7305262223970835999">Дозволяє користувачам SAML змінювати пароль на сторінці під час сеансу.</translation> <translation id="7311458740754205918">Якщо це правило не налаштовано або має значення "true", на сторінці "Нова вкладка" відображатимуться пропозиції вмісту, підібрані на основі історії переглядів, зацікавлень чи місцезнаходження користувача. Якщо встановлено значення "false", на сторінці "Нова вкладка" відображатиметься автоматично згенерований вміст.</translation> @@ -3320,6 +3472,15 @@ Якщо значення цього правила встановлено на 0, використовується розмір кеш-пам’яті за умовчанням, але користувач не може змінити його. Якщо це правило не встановлено, використовується розмір кеш-пам’яті за умовчанням, але користувач може його змінювати за допомогою позначки "--disk-cache-size".</translation> +<translation id="759389052790680884">Налаштувати, на якому рівні у відсотках припиняється заряджання акумулятора + + Акумулятор перестає заряджатися, коли його заряд досягає вказаного значення. + + Значення правила DeviceBatteryChargeCustomStartCharging має бути меншим за DeviceBatteryChargeCustomStopCharging. + + Це правило використовується, лише якщо для DeviceBatteryChargeMode вибрано власне значення. + + Якщо це правило не налаштовано або не встановлено, застосовується стандартний режим заряджання акумулятора.</translation> <translation id="759957074386651883">Налаштування Безпечного перегляду</translation> <translation id="7604169113182304895">Додатки Android можуть вибирати, чи використовувати цей список. Ви не можете вплинути на це.</translation> <translation id="7612157962821894603">Позначки на рівні системи, що застосовуються під час запуску <ph name="PRODUCT_NAME" /></translation> @@ -3394,6 +3555,15 @@ <translation id="7712109699186360774">Запитувати щоразу, коли сайту потрібен доступ до камери та/чи мікрофона</translation> <translation id="7713608076604149344">Обмеження завантажень</translation> <translation id="7715711044277116530">Відсоток, за яким масштабують затримку затемнення екрана в режимі презентації</translation> +<translation id="7716781462866245042">Налаштувати режим покращеного заряджання акумулятора на кожний день. + + Це правило застосовується, лише якщо DeviceAdvancedBatteryChargeModeEnabled має значення true. + + Якщо це правило не налаштовано або не встановлено, режим покращеного заряджання акумулятора завжди вимкнено. + + Примітка: значення <ph name="CHARGE_START_TIME_FIELD_NAME" /> має бути меншим за <ph name="CHARGE_END_TIME_FIELD_NAME" />. + + Примітка: дозволені значення параметра <ph name="MINUTE_FIELD_NAME" /> в полях <ph name="CHARGE_START_TIME_FIELD_NAME" /> і <ph name="CHARGE_END_TIME_FIELD_NAME" /> – 0, 15, 30, 45.</translation> <translation id="7717938661004793600">Налаштувати функції доступності <ph name="PRODUCT_OS_NAME" />.</translation> <translation id="7724994675283793633">Це правило вмикає протокол HTTP/0.9 для всіх портів, окрім 80 для HTTP та 443 для HTTPS. @@ -3467,6 +3637,7 @@ Визначає ідентифікатор розширення, яке має використовуватись як заставка на екрані входу. Це розширення має входити в пакет AppPack, налаштований для цього домену за допомогою правила DeviceAppPack.</translation> <translation id="7882857838942884046">Якщо вимкнути Google Sync, додаток Android Backup and Restore працюватиме неналежним чином.</translation> <translation id="7882890448959833986">Блокування застереження в непідтримуваних ОС</translation> +<translation id="7895553628261067384">Віддалений доступ</translation> <translation id="7902255855035461275">Зразки в цьому списку зіставлятимуться з джерелом безпеки запитаної URL-адреси. Якщо буде знайдено збіг, доступ до пристроїв запису відео надаватиметься негайно. @@ -3480,6 +3651,11 @@ <translation id="7937491150792971922">Об’єднати правила списку встановлення розширень із кількох джерел</translation> <translation id="7937766917976512374">Дозволити чи заборонити запис відео</translation> <translation id="7941975817681987555">Не передбачати дії в мережі</translation> +<translation id="7952007677054834789">Налаштовує сторінки, які завантажуються під час запуску, а також домашню сторінку та сторінку нової вкладки за умовчанням у <ph name="PRODUCT_NAME" />. Користувачі не можуть змінювати їх. + + Налаштування домашньої сторінки повністю блокуються, лише якщо це сторінка нової вкладки або вказана URL-адреса. Якщо не вказати URL-адресу домашньої сторінки, користувач зможе зробити нею сторінку нової вкладки, вибравши chrome://newtab. + + Правило "URL-адреси, які відкриваються під час запуску" ігнорується, якщо для правила "Дія під час запуску" не вибрано значення "Відкривати список URL-адрес".</translation> <translation id="7952958573604504839">Це правило більше не підтримується в M48 (натомість діє <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" />) і вилучене в M54. Вмикає прогнозування мережі в <ph name="PRODUCT_NAME" />. Користувачі не можуть змінювати це налаштування. @@ -3618,6 +3794,7 @@ <translation id="8176035528522326671">Дозволити корпоративному користувачеві бути лише основним багатопрофільним користувачем (налаштування за умовчанням для користувачів, якими керує адміністратор підприємства)</translation> <translation id="8214600119442850823">Визначає налаштування диспетчера паролів.</translation> <translation id="8217516105848565518">Це правило більше не підтримується. Натомість застосовуйте RemoteAccessHostDomainList.</translation> +<translation id="8244171102276095471">Увімкнути набори шифрів RC4 в TLS</translation> <translation id="8244525275280476362">Максимальна затримка отримання після анулювання правила</translation> <translation id="8256688113167012935">Контролюється, як <ph name="PRODUCT_OS_NAME" /> відображає ім’я облікового запису на екрані входу для відповідних локальних облікових записів у пристрої. @@ -3658,6 +3835,7 @@ <translation id="8312129124898414409">Можна дозволити або заборонити всім сайтам генерувати ключі. Якщо це правило не налаштовано, застосовується правило BlockKeygen. Користувач може його змінити.</translation> +<translation id="8320149248919453401">Режим заряджання акумулятора</translation> <translation id="8329984337216493753">Це правило активне лише в режимі роздрібного продажу. Якщо параметр DeviceIdleLogoutTimeout встановлено, це правило визначає тривалість показу вікна застереження з таймером зворотнього відліку, яке бачить користувач до виконання автоматичного виходу. @@ -3823,6 +4001,7 @@ Якщо час не налаштовано, використовується період за умовчанням – 345 600 000 мілісекунд (чотири дні) для пристроїв <ph name="PRODUCT_OS_NAME" /> і 604 800 000 мілісекунд (один тиждень) для <ph name="PRODUCT_NAME" />.</translation> <translation id="8685024486845674965">Застереження про захист паролем активується під час повторного введення пароля</translation> <translation id="8693243869659262736">Використовувати вдубований клієнт DNS</translation> +<translation id="8698286761337647563">За скільки днів сповіщати користувачів SAML про завершення терміну дії їхнього пароля</translation> <translation id="8703488928438047864">Повідомити статус панелі</translation> <translation id="8703872185032220081">Налаштувати зміну піку потужності на день. @@ -3867,6 +4046,7 @@ Якщо його вимкнено або не налаштовано, для змінення пароля користувачі спрямовуватимуться на сторінку https://myaccounts.google.com. Це правило доступне лише у версіях Windows, зареєстрованих у домені <ph name="MS_AD_NAME" />, або Windows 10 Pro чи Enterprise, зареєстрованих для керування пристроєм.</translation> <translation id="8798099450830957504">За умовчанням</translation> +<translation id="8800453707696044281">Налаштувати, на якому рівні у відсотках припиняється заряджання акумулятора</translation> <translation id="8801680448782904838">Сповіщати користувача про рекомендований чи обов’язковий перезапуск веб-переглядача або пристрою</translation> <translation id="8818173863808665831">Повідомляє географічне місцезнаходження пристрою. @@ -3995,6 +4175,11 @@ Це правило стосується лише користувачів, які пройшли автентифікацію через SAML. Значення правила вказується в секундах.</translation> +<translation id="9018338365267278833">Зі списку <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> або з правила <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> буде видалено розширення, для яких заблоковано режим встановлення. Також буде назавжди видалено локальні дані користувача. Щоб дізнатися, що станеться з даними користувача, які не зберігаються локально, перегляньте політику конфіденційності щодо розширень або політику щодо збереження даних. + + Якщо для цього правила вибрано значення enabled, розширення з вищезгаданих списків (уже встановлені на пристрої) буде повністю видалено (включно з локальними даними користувача). + + Якщо для цього правила вибрано значення disabled або його не налаштовано, розширення з вищезгаданих списків (уже встановлені на пристрої та внесені в чорний список <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />) не буде видалено, а лише вимкнено.</translation> <translation id="9027787254195333560">Це правило дає змогу налаштовувати зображення аватару, яке представляє користувача на екрані входу. Для цього потрібно вказати URL-адресу, з якої <ph name="PRODUCT_OS_NAME" /> може завантажити зображення та криптографічний хеш для перевірки цілісності завантаження. Зображення має бути у форматі JPEG, а його розмір не може перевищувати 512 КБ. URL-адреса має бути доступною без автентифікації. Зображення аватару завантажується й додається в кеш. Якщо URL-адреса або хеш змінюються, зображення завантажується повторно.
diff --git a/components/resources/OWNERS b/components/resources/OWNERS index 7e1e4793..456bcda 100644 --- a/components/resources/OWNERS +++ b/components/resources/OWNERS
@@ -19,7 +19,6 @@ per-file neterror*=file://net/OWNERS per-file ntp_tiles_resources.grdp=file://components/ntp_tiles/OWNERS per-file offline_pages_resources.grdp=file://components/offline_pages/OWNERS -per-file omnibox_resources.grdp=file://components/omnibox/OWNERS per-file proximity_auth*=tengs@chromium.org per-file printing_resources.grdp=file://printing/OWNERS per-file security_interstitials_resources.grdp=file://components/security_interstitials/OWNERS
diff --git a/components/resources/components_resources.grd b/components/resources/components_resources.grd index 7e12c82..1097ea5 100644 --- a/components/resources/components_resources.grd +++ b/components/resources/components_resources.grd
@@ -17,7 +17,6 @@ <part file="neterror_resources.grdp" /> <part file="ntp_tiles_resources.grdp" /> <part file="offline_pages_resources.grdp" /> - <part file="omnibox_resources.grdp" /> <part file="password_manager_internals_resources.grdp" /> <part file="printing_resources.grdp" /> <part file="safe_browsing_resources.grdp" />
diff --git a/components/resources/omnibox_resources.grdp b/components/resources/omnibox_resources.grdp deleted file mode 100644 index 80372e1b..0000000 --- a/components/resources/omnibox_resources.grdp +++ /dev/null
@@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<grit-part> - <include name="IDR_OMNIBOX_PEDAL_CONCEPTS" file="../omnibox/resources/omnibox_pedal_concepts.json" type="BINDATA" compress="gzip" /> -</grit-part>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index 6e4f02c..3dd5ef41 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -1186,6 +1186,7 @@ <translation id="7615602087246926389">አስቀድሞ በተለየ የGoogle መለያዎ ይለፍ ቃል ስሪት የተመሰጠረ ውሂብ አለዎት። እባክዎ ከታች ያስገቡት።</translation> <translation id="7633909222644580952">የአፈጻጸም ውሂብ እና የብልሽት ሪፖርቶች</translation> <translation id="7637571805876720304">ክሬዲት ካርድ ከChromium ይወገድ?</translation> +<translation id="7638605456503525968">ተከታታይ ወደቦች</translation> <translation id="7639968568612851608">ጠቆር ያለ ግራጫ</translation> <translation id="765676359832457558">የላቁ ቅንብሮችን ደብቅ...</translation> <translation id="7658239707568436148">ይቅር</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index f6b3a2f..8bc2622 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">لديك فعلاً بيانات تم تشفيرها باستخدام نسخة أخرى من كلمة مرور حسابك في Google. يُرجى إدخالها أدناه.</translation> <translation id="7633909222644580952">تقارير الأعطال وبيانات الأداء</translation> <translation id="7637571805876720304">هل تريد إزالة بطاقة الائتمان من Chromium؟</translation> +<translation id="7638605456503525968">المنافذ التسلسلية</translation> <translation id="7639968568612851608">رمادي داكن</translation> <translation id="765676359832457558">إخفاء الإعدادات المتقدمة...</translation> <translation id="7658239707568436148">إلغاء</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 1e024ad..1df3db7 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">Вече имате данни, които са шифровани посредством друга версия на паролата за профила ви в Google. Моля, въведете я по-долу.</translation> <translation id="7633909222644580952">Данни за ефективността и сигнали за сривове</translation> <translation id="7637571805876720304">Кредитната карта да се премахне ли от Chromium?</translation> +<translation id="7638605456503525968">Серийни портове</translation> <translation id="7639968568612851608">тъмносиво</translation> <translation id="765676359832457558">Скриване на разширените настройки...</translation> <translation id="7658239707568436148">Отказ</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index c3ad171..6729cf0 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">আপনার কাছে ইতিমধ্যেই এমন ডেটা আছে যা Google অ্যাকাউন্টের পাসওয়ার্ডের কোনো ভিন্ন ভার্সন ব্যবহারের দ্বারা এনক্রিপ্ট করা হয়৷ অনুগ্রহ করে এটিকে নিচে লিখুন৷</translation> <translation id="7633909222644580952">পারফর্ম্যান্সের ডেটা ও ক্র্যাশ রিপোর্ট</translation> <translation id="7637571805876720304">Chromium থেকে ক্রেডিট কার্ড সরাবেন?</translation> +<translation id="7638605456503525968">সিরিয়াল পোর্ট</translation> <translation id="7639968568612851608">গাঢ় ধূসর</translation> <translation id="765676359832457558">উন্নত সেটিংস লুকান...</translation> <translation id="7658239707568436148">বাতিল</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 953353c1..0623ccc 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -1185,6 +1185,7 @@ <translation id="7615602087246926389">Ja teniu dades encriptades amb una versió diferent de la contrasenya del vostre compte de Google. Introduïu-la a continuació.</translation> <translation id="7633909222644580952">Dades de rendiment i informes d'errors</translation> <translation id="7637571805876720304">Voleu suprimir la targeta de crèdit de Chromium?</translation> +<translation id="7638605456503525968">Ports en sèrie</translation> <translation id="7639968568612851608">Gris fosc</translation> <translation id="765676359832457558">Amaga la configuració avançada...</translation> <translation id="7658239707568436148">Cancel·la</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index abe0ca7..25f99b48 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -1179,6 +1179,7 @@ <translation id="7615602087246926389">Již máte údaje, které jsou šifrovány pomocí jiné verze vašeho hesla k účtu Google. Zadejte toto heslo prosím níže.</translation> <translation id="7633909222644580952">Údaje o výkonu a přehledy selhání</translation> <translation id="7637571805876720304">Odstranit platební kartu z prohlížeče Chromium?</translation> +<translation id="7638605456503525968">Sériové porty</translation> <translation id="7639968568612851608">Tmavě šedá</translation> <translation id="765676359832457558">Skrýt rozšířená nastavení...</translation> <translation id="7658239707568436148">Zrušit</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index abe01ee..1cd3a93 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">Du har allerede data, der er krypteret med en anden version af adgangskoden til din Google-konto. Angiv adgangskoden i feltet nedenfor.</translation> <translation id="7633909222644580952">Effektivitetsdata og nedbrudsrapporter</translation> <translation id="7637571805876720304">Vil du fjerne kreditkortet fra Chromium?</translation> +<translation id="7638605456503525968">Serieporte</translation> <translation id="7639968568612851608">Mørkegrå</translation> <translation id="765676359832457558">Skjul avancerede indstillinger...</translation> <translation id="7658239707568436148">Annuller</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 065e7f8..5d7c19a 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -1201,6 +1201,7 @@ <translation id="7615602087246926389">Sie verfügen bereits über Daten, die mit einem vorherigen Passwort für Ihr Google-Konto verschlüsselt wurden. Bitte geben Sie dieses Passwort unten ein.</translation> <translation id="7633909222644580952">Leistungsdaten und Absturzberichte</translation> <translation id="7637571805876720304">Kreditkarte aus Chromium entfernen?</translation> +<translation id="7638605456503525968">Serielle Schnittstellen</translation> <translation id="7639968568612851608">Dunkelgrau</translation> <translation id="765676359832457558">Erweiterte Einstellungen ausblenden</translation> <translation id="7658239707568436148">Abbrechen</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index ddd030f6..96863e7 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -1197,6 +1197,7 @@ <translation id="7615602087246926389">Έχετε ήδη δεδομένα που είναι κρυπτογραφημένα με χρήση διαφορετικής έκδοσης του κωδικού πρόσβασης για τον Λογαριασμό σας Google. Εισαγάγετέ τον παρακάτω.</translation> <translation id="7633909222644580952">Δεδομένα απόδοσης και αναφορές σφαλμάτων</translation> <translation id="7637571805876720304">Να καταργηθεί η πιστωτική κάρτα από το Chromium;</translation> +<translation id="7638605456503525968">Σειριακές θύρες</translation> <translation id="7639968568612851608">Σκούρο γκρι</translation> <translation id="765676359832457558">Απόκρυψη σύνθετων ρυθμίσεων…</translation> <translation id="7658239707568436148">Ακύρωση</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index f37980c..95dec56 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -1203,6 +1203,7 @@ <translation id="7615602087246926389">You already have data that is encrypted using a different version of your Google Account password. Please enter it below.</translation> <translation id="7633909222644580952">Performance data and crash reports</translation> <translation id="7637571805876720304">Remove credit card from Chromium?</translation> +<translation id="7638605456503525968">Serial ports</translation> <translation id="7639968568612851608">Dark grey</translation> <translation id="765676359832457558">Hide advanced settings ...</translation> <translation id="7658239707568436148">Cancel</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index b8c6ce6..58b578bc06 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -1197,6 +1197,7 @@ <translation id="7615602087246926389">Ya has utilizado otra versión de la contraseña de tu cuenta de Google para encriptar contenido. Ingrésala a continuación.</translation> <translation id="7633909222644580952">Informes sobre fallos y datos de rendimiento</translation> <translation id="7637571805876720304">¿Confirmas que quieres quitar la tarjeta de crédito de Chromium?</translation> +<translation id="7638605456503525968">Puertos en serie</translation> <translation id="7639968568612851608">Gris oscuro</translation> <translation id="765676359832457558">Ocultar configuración avanzada...</translation> <translation id="7658239707568436148">Cancelar</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 1089747..faf313b 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -1185,6 +1185,7 @@ <translation id="7615602087246926389">Has usado anteriormente otra versión de la contraseña de tu cuenta de Google para el cifrado de datos. Introdúcela a continuación.</translation> <translation id="7633909222644580952">Datos de rendimiento e informes sobre fallos</translation> <translation id="7637571805876720304">¿Quitar tarjeta de crédito de Chromium?</translation> +<translation id="7638605456503525968">Puertos serie</translation> <translation id="7639968568612851608">Gris oscuro</translation> <translation id="765676359832457558">Ocultar configuración avanzada...</translation> <translation id="7658239707568436148">Cancelar</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 77120f0..4072d3ee 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">Teil on juba andmed, mis on krüpteeritud Google'i konto parooli teise versiooniga. Sisestage see allpool.</translation> <translation id="7633909222644580952">Toimivusandmed ja krahhiaruanded</translation> <translation id="7637571805876720304">Kas eemaldada Chromiumist krediitkaart?</translation> +<translation id="7638605456503525968">Jadapordid</translation> <translation id="7639968568612851608">Tumehall</translation> <translation id="765676359832457558">Peida täpsemad seaded ...</translation> <translation id="7658239707568436148">Tühista</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 648c3fee..af51b50 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">شما در حال حاضر دادههایی دارید که با استفاده از نسخه دیگری از گذرواژه حساب Google شما رمزگذاری شدهاند. لطفاً آن را در زیر وارد کنید.</translation> <translation id="7633909222644580952">دادههای عملکرد و گزارشهای خرابی</translation> <translation id="7637571805876720304">کارت اعتباری از Chromium پاک شود؟</translation> +<translation id="7638605456503525968">درگاههای سریال</translation> <translation id="7639968568612851608">خاکستری تیره</translation> <translation id="765676359832457558">پنهان کردن تنظیمات پیشرفته…</translation> <translation id="7658239707568436148">لغو</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 31b5afd4..35c9690f 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -1197,6 +1197,7 @@ <translation id="7615602087246926389">Tietojasi on jo salattu Google-tilisi salasanan muulla versiolla. Syötä salasana alla.</translation> <translation id="7633909222644580952">Tehokkuusdata ja virheraportit</translation> <translation id="7637571805876720304">Poistetaanko luottokortti Chromiumista?</translation> +<translation id="7638605456503525968">Sarjaportit</translation> <translation id="7639968568612851608">Tummanharmaa</translation> <translation id="765676359832457558">Piilota lisäasetukset...</translation> <translation id="7658239707568436148">Peruuta</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 4e5838c..8324c21b 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">Mayroon ka nang data na na-encrypt gamit ang ibang bersyon ng iyong password ng Google Account. Pakilagay ito sa ibaba.</translation> <translation id="7633909222644580952">Date ng performance at mga ulat ng pag-crash</translation> <translation id="7637571805876720304">Gusto mo bang alisin ang credit card sa Chromium?</translation> +<translation id="7638605456503525968">Mga serial port</translation> <translation id="7639968568612851608">Dark Grey</translation> <translation id="765676359832457558">Itago ang mga advanced na setting...</translation> <translation id="7658239707568436148">Kanselahin</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 3f08b57..773e6d3 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -1185,6 +1185,7 @@ <translation id="7615602087246926389">Vous disposez déjà de données chiffrées à l'aide d'une autre version de votre mot de passe de compte Google. Veuillez saisir celui-ci ci-dessous.</translation> <translation id="7633909222644580952">Données relatives aux performances et rapports d'erreur</translation> <translation id="7637571805876720304">Supprimer les données de carte de paiement de Chromium ?</translation> +<translation id="7638605456503525968">Ports série</translation> <translation id="7639968568612851608">Gris foncé</translation> <translation id="765676359832457558">Masquer les paramètres avancés…</translation> <translation id="7658239707568436148">Annuler</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index e53bba4..d63bbd1 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -1195,6 +1195,7 @@ <translation id="7615602087246926389">તમારી પાસે પેહલાથી જ ડેટા છે જે તમારા Google એકાઉન્ટ પાસવર્ડના વિવિધ વર્ઝનનો ઉપયોગ કરીને એન્ક્રિપ્ટ કરેલો છે.</translation> <translation id="7633909222644580952">કાર્યપ્રદર્શન ડેટા અને ક્રૅશ રિપોર્ટ</translation> <translation id="7637571805876720304">Chromium માંથી ક્રેડિટ કાર્ડ દૂર કરીએ?</translation> +<translation id="7638605456503525968">સીરિયલ પોર્ટ</translation> <translation id="7639968568612851608">ઘાટો ગ્રે</translation> <translation id="765676359832457558">વિગતવાર સેટિંગ્સ છુપાવો...</translation> <translation id="7658239707568436148">રદ કરો</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index c3067d5..bfe7f15 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -1194,6 +1194,7 @@ <translation id="7615602087246926389">आपके पास पहले से ऐसा डेटा है, जिसे आपके Google खाते के पासवर्ड के किसी भिन्न वर्शन का उपयोग करके एन्क्रिप्ट किया गया है. कृपया उसे नीचे लिखें.</translation> <translation id="7633909222644580952">परफ़ॉर्मेंस डेटा और क्रैश रिपोर्ट</translation> <translation id="7637571805876720304">क्रोमियम से क्रेडिट कार्ड निकालें?</translation> +<translation id="7638605456503525968">सीरियल पोर्ट</translation> <translation id="7639968568612851608">गहरा धूसर</translation> <translation id="765676359832457558">बेहतर सेटिंग छिपाएं...</translation> <translation id="7658239707568436148">अभी नहीं</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 3d0228b..a908029 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -1195,6 +1195,7 @@ <translation id="7615602087246926389">Već imate podatke koji su kriptirani pomoću druge verzije zaporke vašeg Google računa. Unesite je u nastavku.</translation> <translation id="7633909222644580952">Podaci o uspješnosti i izvješća o padu programa</translation> <translation id="7637571805876720304">Želite li ukloniti kreditnu karticu iz Chromiuma?</translation> +<translation id="7638605456503525968">Serijski priključci</translation> <translation id="7639968568612851608">Tamnosiva</translation> <translation id="765676359832457558">Skrivanje naprednih postavki...</translation> <translation id="7658239707568436148">Odustani</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index fcf892f..f8268a7 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -1194,6 +1194,7 @@ <translation id="7615602087246926389">Már rendelkezik olyan adattal, amely Google-fiókja jelszavának egy másik verziójával van titkosítva. Kérjük, lentebb adja azt meg.</translation> <translation id="7633909222644580952">Teljesítményre vonatkozó adatok és hibajelentések</translation> <translation id="7637571805876720304">Eltávolítja a hitelkártyát a Chromiumból?</translation> +<translation id="7638605456503525968">Soros portok</translation> <translation id="7639968568612851608">Sötétszürke</translation> <translation id="765676359832457558">Speciális beállítások elrejtése...</translation> <translation id="7658239707568436148">Mégse</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index af0e2b6..39bf74d 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="id"> -<translation id="1001338328714563407">As the manager of your device and account, <ph name="ENROLLMENT_DOMAIN" />:</translation> +<translation id="1001338328714563407">Sebagai pengelola perangkat dan akun Anda, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Jangan Sekarang</translation> <translation id="1010200102790553230">Muat halaman nanti</translation> <translation id="1015730422737071372">Berikan detail tambahan</translation> @@ -309,7 +309,7 @@ <translation id="2586657967955657006">Papan klip</translation> <translation id="2587730715158995865">Dari <ph name="ARTICLE_PUBLISHER" />. Baca artikel ini dan <ph name="OTHER_ARTICLE_COUNT" /> artikel lainnya.</translation> <translation id="2587841377698384444">ID API Direktori:</translation> -<translation id="2595719060046994702">This device and account are not managed by a company or other organization.</translation> +<translation id="2595719060046994702">Perangkat dan akun ini tidak dikelola oleh perusahaan atau organisasi lain.</translation> <translation id="2597378329261239068">Dokumen ini dilindungi sandi. Masukkan sandi.</translation> <translation id="2609632851001447353">Variasi</translation> <translation id="2618023639789766142">C10 (Amplop)</translation> @@ -361,7 +361,7 @@ <translation id="2903493209154104877">Alamat</translation> <translation id="290376772003165898">Halaman tidak dalam bahasa <ph name="LANGUAGE" />?</translation> <translation id="2909946352844186028">Perubahan jaringan terdeteksi.</translation> -<translation id="2910133103376701357">Your device and account are managed by <ph name="ENROLLMENT_DOMAIN" />.</translation> +<translation id="2910133103376701357">Perangkat dan akun Anda dikelola oleh <ph name="ENROLLMENT_DOMAIN" />.</translation> <translation id="2916038427272391327">Tutup program lain</translation> <translation id="2922350208395188000">Sertifikat server tidak dapat diperiksa.</translation> <translation id="2925673989565098301">Metode Pengiriman</translation> @@ -372,7 +372,7 @@ <translation id="2948083400971632585">Anda dapat menonaktifkan proxy apa pun yang dikonfigurasi untuk sambungan dari halaman setelan.</translation> <translation id="2955913368246107853">Tutup bilah cari</translation> <translation id="2969319727213777354">Untuk membuat sambungan aman, jam perlu disetel dengan benar. Itu karena sertifikat yang digunakan situs web untuk mengidentifikasi situs web tersebut hanya valid untuk jangka waktu tertentu. Karena jam perangkat tidak benar, Google Chrome tidak dapat memverifikasi sertifikat ini.</translation> -<translation id="2970515157925768593">Can remotely change your device and account setup.</translation> +<translation id="2970515157925768593">Dapat mengubah penyiapan perangkat dan akun dari jauh.</translation> <translation id="2972581237482394796">&Ulang</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, saat ini yang dipilih. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Hapus Data</translation> @@ -384,7 +384,7 @@ <translation id="3005723025932146533">Tampilkan salinan yang disimpan</translation> <translation id="3008447029300691911">Masukkan CVC untuk <ph name="CREDIT_CARD" />. Setelah mengonfirmasi, detail kartu Anda akan dibagikan dengan situs ini.</translation> <translation id="3010559122411665027">Entri daftar "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> -<translation id="3014389611820813634">As the manager of this device, <ph name="ENROLLMENT_DOMAIN" />:</translation> +<translation id="3014389611820813634">Sebagai pengelola perangkat ini, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Diblokir secara otomatis</translation> <translation id="3023071826883856138">You4 (Envelope)</translation> <translation id="3024663005179499861">Jenis kebijakan salah</translation> @@ -430,7 +430,7 @@ <translation id="3287510313208355388">Download saat online</translation> <translation id="3293642807462928945">Pelajari lebih lanjut tentang kebijakan <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Hasil penelusuran tidak ditemukan</translation> -<translation id="3311730110465560799">Dapat mengubah penyiapan perangkat Anda dari jarak jauh.</translation> +<translation id="3311730110465560799">Dapat mengubah penyiapan perangkat dari jauh.</translation> <translation id="3320021301628644560">Tambahkan alamat penagihan</translation> <translation id="3324983252691184275">Merah Lembayung</translation> <translation id="3338095232262050444">Aman</translation> @@ -524,7 +524,7 @@ <translation id="3761718714832595332">Sembunyikan status</translation> <translation id="3765032636089507299">Halaman Safe Browsing sedang diperbaiki.</translation> <translation id="3778403066972421603">Ingin menyimpan kartu ini di Akun Google dan perangkat ini?</translation> -<translation id="3779973883630527594">The company, school, or organization that manages this account:</translation> +<translation id="3779973883630527594">Perusahaan, sekolah, atau organisasi yang mengelola akun ini:</translation> <translation id="3781428340399460090">Merah Muda Terang</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Masa berlaku <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -565,7 +565,7 @@ <translation id="4072486802667267160">Terjadi error saat memproses pesanan Anda. Harap coba lagi.</translation> <translation id="4075732493274867456">Klien dan server tidak mendukung versi protokol SSL umum atau cipher suite.</translation> <translation id="4079302484614802869">Konfigurasi proxy disetel untuk menggunakan URL skrip .pac, bukan server proxy yang tetap.</translation> -<translation id="4082393374666368382">Settings - Management</translation> +<translation id="4082393374666368382">Setelan - Pengelolaan</translation> <translation id="4092411512356034591">Lanjutkan ke <ph name="DOMAIN" />?</translation> <translation id="4098354747657067197">Situs yang akan dibuka berisi penipuan</translation> <translation id="4103249731201008433">Nomor seri perangkat tidak valid</translation> @@ -723,7 +723,7 @@ <translation id="4926159001844873046"><ph name="SITE" /> menyatakan</translation> <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" />/<ph name="TOTAL_MATCHCOUNT" /></translation> <translation id="4943872375798546930">Tidak ada hasil</translation> -<translation id="4945672369594656571">Controls how your device and account data is handled. Google processes your device and account data exclusively under the direction of your device and account manager and solely for the purposes specified by your device and account manager.</translation> +<translation id="4945672369594656571">Mengontrol penanganan data perangkat dan akun Anda. Google memproses data perangkat dan akun Anda secara eksklusif sesuai arahan pengelola perangkat dan akun Anda dan semata-mata untuk keperluan yang ditetapkan oleh pengelola perangkat dan akun Anda.</translation> <translation id="4950898438188848926">Tombol beralih tab, tekan Enter untuk beralih ke tab yang terbuka, <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" /></translation> <translation id="495170559598752135">Tindakan</translation> <translation id="4955242332710481440">A5-Extra</translation> @@ -737,7 +737,7 @@ <translation id="5017554619425969104">Teks yang Anda salin</translation> <translation id="5018422839182700155">Tidak dapat membuka halaman ini</translation> <translation id="5019198164206649151">Penyimpanan cadangan dalam kondisi buruk</translation> -<translation id="5020154601324912079">Controls how your device data is handled. Google processes your device data exclusively under the direction of your device manager and solely for the purposes specified by your device manager.</translation> +<translation id="5020154601324912079">Mengontrol penanganan data perangkat Anda. Google memproses data perangkat Anda secara eksklusif sesuai arahan pengelola perangkat dan semata-mata untuk keperluan yang ditentukan oleh pengelola perangkat Anda.</translation> <translation id="5023310440958281426">Periksa kebijakan administrator Anda</translation> <translation id="5029568752722684782">Hapus salinan</translation> <translation id="503069730517007720">Sertifikat root wajib untuk "<ph name="SOFTWARE_NAME" />" tidak diinstal. Administrator IT Anda harus melihat petunjuk konfigurasi untuk "<ph name="SOFTWARE_NAME" />" agar dapat menyelesaikan masalah ini. <ph name="FURTHER_EXPLANATION" /></translation> @@ -895,7 +895,7 @@ <translation id="5838278095973806738">Jangan masukkan informasi sensitif apa pun di situs ini (misalnya, sandi atau kartu kredit), karena penyerang dapat mencurinya.</translation> <translation id="5860033963881614850">Nonaktif</translation> <translation id="5863847714970149516">Halaman berikutnya mungkin mencoba menagih Anda.</translation> -<translation id="5865951947699094510">Can remotely change your account setup.</translation> +<translation id="5865951947699094510">Dapat mengubah penyiapan akun Anda dari jauh.</translation> <translation id="5866257070973731571">Tambahkan Nomor Telepon</translation> <translation id="5869405914158311789">Situs ini tidak dapat dijangkau</translation> <translation id="5869522115854928033">Sandi tersimpan</translation> @@ -916,7 +916,7 @@ <translation id="5977976211062815271">Di perangkat ini</translation> <translation id="5980920751713728343">Index-3x5</translation> <translation id="598637245381783098">Tidak dapat membuka aplikasi pembayaran</translation> -<translation id="5988826871883769516">Your device is managed by <ph name="ENROLLMENT_DOMAIN" />.</translation> +<translation id="5988826871883769516">Perangkat Anda dikelola oleh <ph name="ENROLLMENT_DOMAIN" />.</translation> <translation id="5989320800837274978">Baik proxy server tetap ataupun URL skrip .pac tidak ditentukan.</translation> <translation id="5990559369517809815">Permintaan ke server telah dicekal oleh ekstensi.</translation> <translation id="6008256403891681546">JCB</translation> @@ -1089,7 +1089,7 @@ <translation id="7062635574500127092">Hijau kebiruan</translation> <translation id="7064851114919012435">Info kontak</translation> <translation id="7079718277001814089">Situs ini berisi malware</translation> -<translation id="7081564429925484109">Peringatan: Kebijakan ini tidak digabungkan seperti yang telah ditentukan dalam kebijakan PolicyListMultipleSourceMergeList karena tidak ada dalam daftar.</translation> +<translation id="7081564429925484109">Peringatan: Kebijakan ini tidak digabung sebagaimana yang ditetapkan dalam kebijakan PolicyListMultipleSourceMergeList karena tidak tercantum dalam daftar.</translation> <translation id="7087282848513945231">Wilayah</translation> <translation id="7090678807593890770">Telusuri <ph name="LINK" /> di Google</translation> <translation id="7108338896283013870">Sembunyikan</translation> @@ -1164,7 +1164,7 @@ <translation id="741007362987735528">Wide-Format</translation> <translation id="7416351320495623771">Kelola Sandi...</translation> <translation id="7419106976560586862">Jalur Profil</translation> -<translation id="7424427397225027541">Controls how your account data is handled. Google processes your account data exclusively under the direction of your account manager and solely for the purposes specified by your account manager.</translation> +<translation id="7424427397225027541">Mengontrol penanganan data akun Anda. Google memproses data akun Anda secara eksklusif sesuai arahan pengelola akun Anda dan semata-mata untuk keperluan yang ditetapkan oleh pengelola akun Anda.</translation> <translation id="7437289804838430631">Tambahkan Info Kontak</translation> <translation id="7440140511386898319">Jelajahi saat offline</translation> <translation id="7441627299479586546">Subjek kebijakan salah</translation> @@ -1211,6 +1211,7 @@ <translation id="7615602087246926389">Anda sudah memiliki data yang dienkripsi menggunakan versi sandi Akun Google yang berbeda. Masukkan sandi di bawah.</translation> <translation id="7633909222644580952">Data performa dan laporan kerusakan</translation> <translation id="7637571805876720304">Hapus kartu kredit dari Chromium?</translation> +<translation id="7638605456503525968">Port serial</translation> <translation id="7639968568612851608">Abu-Abu Tua</translation> <translation id="765676359832457558">Sembunyikan setelan lanjutan...</translation> <translation id="7658239707568436148">Batal</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 824f4c7..b1d8504 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -1192,6 +1192,7 @@ <translation id="7615602087246926389">Hai già dati criptati con una versione diversa della password del tuo Account Google. Inseriscila qui di seguito.</translation> <translation id="7633909222644580952">Dati sulle prestazioni e rapporti sugli arresti anomali</translation> <translation id="7637571805876720304">Rimuovere la carta di credito da Chromium?</translation> +<translation id="7638605456503525968">Porte seriali</translation> <translation id="7639968568612851608">Grigio scuro</translation> <translation id="765676359832457558">Nascondi impostazioni avanzate...</translation> <translation id="7658239707568436148">Annulla</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index b21e6c5..e1db414 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -1190,6 +1190,7 @@ <translation id="7615602087246926389">יש לך כבר נתונים שהוצפנו באמצעות גירסה אחרת של סיסמת חשבון Google שלך. הזן אותה למטה.</translation> <translation id="7633909222644580952">נתוני ביצועים ודוחות קריסה</translation> <translation id="7637571805876720304">האם להסיר מ-Chromium את כרטיס האשראי?</translation> +<translation id="7638605456503525968">יציאות טוריות</translation> <translation id="7639968568612851608">אפור כהה</translation> <translation id="765676359832457558">הסתר הגדרות מתקדמות...</translation> <translation id="7658239707568436148">ביטול</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 4c8c3c8..70888a6 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -1185,6 +1185,7 @@ <translation id="7615602087246926389">別の Google アカウント パスワードを使って暗号化したデータが既にあります。パスワードを以下に入力してください。</translation> <translation id="7633909222644580952">パフォーマンス データと障害レポート</translation> <translation id="7637571805876720304">Chromium からクレジット カードを削除してもよろしいですか?</translation> +<translation id="7638605456503525968">シリアルポート</translation> <translation id="7639968568612851608">ダークグレー</translation> <translation id="765676359832457558">詳細設定を表示しない...</translation> <translation id="7658239707568436148">キャンセル</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 030ecb6..7a68992 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -1189,6 +1189,7 @@ <translation id="7615602087246926389">ನಿಮ್ಮ Google ಖಾತೆಯ ಪಾಸ್ವರ್ಡ್ನ ಬೇರೆ ಆವೃತ್ತಿಯನ್ನು ಬಳಸಿಕೊಂಡು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾದ ಡೇಟಾವನ್ನು ನೀವು ಈಗಾಗಲೇ ಹೊಂದಿರುವಿರಿ. ದಯವಿಟ್ಟು ಕೆಳಗೆ ಇದನ್ನು ನಮೂದಿಸಿ.</translation> <translation id="7633909222644580952">ಕಾರ್ಯಕ್ಷಮತೆಯ ಡೇಟಾ ಮತ್ತು ಕ್ರ್ಯಾಶ್ ವರದಿಗಳು</translation> <translation id="7637571805876720304">Chromium ನಿಂದ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ತೆಗೆದುಹಾಕುವುದೇ?</translation> +<translation id="7638605456503525968">ಸೀರಿಯಲ್ ಪೋರ್ಟ್ಗಳು</translation> <translation id="7639968568612851608">ಕಡು ಬೂದು</translation> <translation id="765676359832457558">ಸುಧಾರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮರೆಮಾಡು...</translation> <translation id="7658239707568436148">ರದ್ದುಮಾಡಿ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 5e90d31..4f648f7 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -1195,6 +1195,7 @@ <translation id="7615602087246926389">다른 Google 계정 비밀번호 버전을 사용하여 암호화된 데이터가 이미 있습니다. 아래에 암호를 입력하시기 바랍니다.</translation> <translation id="7633909222644580952">성능 데이터 및 비정상 종료 보고서</translation> <translation id="7637571805876720304">Chromium에서 신용카드를 삭제하시겠습니까?</translation> +<translation id="7638605456503525968">직렬 포트</translation> <translation id="7639968568612851608">짙은 회색</translation> <translation id="765676359832457558">고급 설정 숨기기</translation> <translation id="7658239707568436148">취소</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index d5f23341..342ddc4 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lt"> +<translation id="1001338328714563407">Kaip jūsų įrenginio ir paskyros valdytojas (<ph name="ENROLLMENT_DOMAIN" />):</translation> <translation id="1008557486741366299">Ne dabar</translation> <translation id="1010200102790553230">Įkelti puslapį vėliau</translation> <translation id="1015730422737071372">Pateikti papildomos išsamios informacijos</translation> @@ -308,6 +309,7 @@ <translation id="2586657967955657006">Iškarpinė</translation> <translation id="2587730715158995865">Nuo „<ph name="ARTICLE_PUBLISHER" />“. Skaitykite šią ir kitas istorijas (<ph name="OTHER_ARTICLE_COUNT" />).</translation> <translation id="2587841377698384444">Katalogo API ID:</translation> +<translation id="2595719060046994702">Šio įrenginio ir paskyros netvarko įmonė ar kita organizacija.</translation> <translation id="2597378329261239068">Šis dokumentas apsaugotas slaptažodžiu. Įveskite slaptažodį.</translation> <translation id="2609632851001447353">Variantai</translation> <translation id="2618023639789766142">C10 (vokas)</translation> @@ -342,6 +344,7 @@ <translation id="2781692009645368755">Google Pay</translation> <translation id="2784949926578158345">Ryšys atkurtas.</translation> <translation id="2788784517760473862">Tinkamos kredito kortelės</translation> +<translation id="2792012897584536778">Šio įrenginio administratoriai nustatė saugos sertifikatus, leidžiančius jiems peržiūrėti svetainių, kuriose lankotės, turinį.</translation> <translation id="2794233252405721443">Svetainė užblokuota</translation> <translation id="2799020568854403057">Pateiktoje svetainėje yra kenkėjiškų programų</translation> <translation id="2799223571221894425">Paleisti iš naujo</translation> @@ -358,6 +361,7 @@ <translation id="2903493209154104877">Adresai</translation> <translation id="290376772003165898">Puslapis parašytas ne <ph name="LANGUAGE" />?</translation> <translation id="2909946352844186028">Aptiktas tinklo pasikeitimas.</translation> +<translation id="2910133103376701357">Jūsų įrenginį ir paskyrą valdo <ph name="ENROLLMENT_DOMAIN" />.</translation> <translation id="2916038427272391327">Uždarykite kitas programas</translation> <translation id="2922350208395188000">Neįmanoma patikrinti serverio sertifikato.</translation> <translation id="2925673989565098301">Pristatymo metodas</translation> @@ -368,6 +372,7 @@ <translation id="2948083400971632585">Galite neleisti visų tarpinių serverių, jungimasis prie kurių sukonfigūruotas nustatymų puslapyje.</translation> <translation id="2955913368246107853">Uždaryti paieškos juostą</translation> <translation id="2969319727213777354">Kad užmegztumėte saugų ryšį, turėsite tinkamai nustatyti laikrodį. To reikia, nes svetainių tapatybei įrodyti naudojami sertifikatai galioja tik tam tikru laikotarpiu. Įrenginio laikrodis nustatytas netinkamai, todėl „Google Chrome“ negali patvirtinti šių sertifikatų.</translation> +<translation id="2970515157925768593">Galima nuotoliniu būdu keisti įrenginio nustatymo ir paskyros kūrimo procesą.</translation> <translation id="2972581237482394796">&Atlikti iš naujo</translation> <translation id="2977665033722899841">„<ph name="ROW_NAME" />“, šiuo metu pasirinkta. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Išvalyti duomenis</translation> @@ -379,6 +384,7 @@ <translation id="3005723025932146533">Rodyti išsaugotą kopiją</translation> <translation id="3008447029300691911">Įveskite „<ph name="CREDIT_CARD" />“ kortelės saugos kodą (CVC). Kai patvirtinsite, išsami kortelės informacija bus bendrinama su šia svetaine.</translation> <translation id="3010559122411665027">Sąrašo įrašas „<ph name="ENTRY_INDEX" />“: <ph name="ERROR" /></translation> +<translation id="3014389611820813634">Kaip šio įrenginio valdytojas (<ph name="ENROLLMENT_DOMAIN" />):</translation> <translation id="301521992641321250">Automatiškai užblokuota</translation> <translation id="3023071826883856138">„You4“ (vokas)</translation> <translation id="3024663005179499861">Netinkamas politikos tipas</translation> @@ -425,6 +431,7 @@ <translation id="3287510313208355388">Atsisiųsti prisijungus</translation> <translation id="3293642807462928945">Sužinokite daugiau apie „<ph name="POLICY_NAME" />“ politiką</translation> <translation id="3303855915957856445">Nerasta jokių paieškos rezultatų</translation> +<translation id="3311730110465560799">Galima nuotoliniu būdu keisti įrenginio nustatymo procesą.</translation> <translation id="3320021301628644560">Atsiskaitymo adreso pridėjimas</translation> <translation id="3324983252691184275">Tamsiai raudona</translation> <translation id="3338095232262050444">Saugi</translation> @@ -519,6 +526,7 @@ <translation id="3761718714832595332">Slėpti būseną</translation> <translation id="3765032636089507299">Saugaus naršymo puslapis kuriamas.</translation> <translation id="3778403066972421603">Ar norite išsaugoti šią kortelę „Google“ paskyroje ir šiame įrenginyje?</translation> +<translation id="3779973883630527594">Šią paskyrą valdanti įmonė, mokykla arba organizacija:</translation> <translation id="3781428340399460090">Ryškiai rausva</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Galiojimo laikas baigiasi <ph name="EXPIRATION_MONTH" /> / <ph name="EXPIRATION_YEAR" /></translation> @@ -559,6 +567,7 @@ <translation id="4072486802667267160">Apdorojant jūsų užsakymą įvyko klaida. Bandykite dar kartą.</translation> <translation id="4075732493274867456">Kliento programa ir serveris nepalaiko įprasto SSL protokolo versijos ar šifruotojo programų komplekto.</translation> <translation id="4079302484614802869">Įgaliotojo serverio konfigūracijoje nustatyta naudoti .pac scenarijaus URL, o ne fiksuotus įgaliotuosius serverius.</translation> +<translation id="4082393374666368382">Nustatymai – valdymas</translation> <translation id="4092411512356034591">Eiti toliau į <ph name="DOMAIN" />?</translation> <translation id="4098354747657067197">Ketinate apsilankyti apgaulingoje svetainėje</translation> <translation id="4103249731201008433">Netinkamas įrenginio serijos numeris</translation> @@ -691,6 +700,7 @@ <translation id="4759118997339041434">Mokėjimo automatinis pildymas išjungtas</translation> <translation id="4764776831041365478">Tinklalapis šiuo adresu <ph name="URL" /> gali laikinai neveikti arba visam laikui būti perkeltas kitu žiniatinklio adresu.</translation> <translation id="4771973620359291008">Įvyko nežinoma klaida.</translation> +<translation id="4780900888022378816">Jūsų įrenginį valdo <ph name="ENROLLMENT_DOMAIN" />, o paskyrą – <ph name="ACCOUNT_DOMAIN" />.</translation> <translation id="4785689107224900852">Perjungti į šį skirtuką</translation> <translation id="4798078619018708837">Jei norite atnaujinti išsamią kortelės informaciją, įveskite „<ph name="CREDIT_CARD" />“ galiojimo laiko pabaigos datą ir kortelės saugos kodą (CVC). Kai patvirtinsite, „Google“ paskyroje nurodyta išsami kortelės informacija bus bendrinama su šia svetaine.</translation> <translation id="4800132727771399293">Patikrinkite kortelės galiojimo pabaigos datą bei saugos kodą (CVC) ir bandykite dar kart</translation> @@ -715,6 +725,7 @@ <translation id="4926159001844873046">Svetainėje <ph name="SITE" /> nurodyta:</translation> <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" /> / <ph name="TOTAL_MATCHCOUNT" /></translation> <translation id="4943872375798546930">Rezultatų nėra</translation> +<translation id="4945672369594656571">Valdoma, kaip apdorojami jūsų įrenginio ir paskyros duomenys. „Google“ apdoroja įrenginio ir paskyros duomenis tik pagal įrenginio ir paskyros valdytojo nurodymus ir tik įrenginio ir paskyros valdytojo nurodytais tikslais.</translation> <translation id="4950898438188848926">Skirtuko perjungimo mygtukas. Paspauskite „Enter“, kad perjungtumėte į atidarytą skirtuką „<ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" />“</translation> <translation id="495170559598752135">Veiksmai</translation> <translation id="4955242332710481440">A5-Extra</translation> @@ -728,6 +739,7 @@ <translation id="5017554619425969104">Nukopijuotas tekstas</translation> <translation id="5018422839182700155">Negalima atidaryti šio puslapio</translation> <translation id="5019198164206649151">Bloga atsarginio atminties įrenginio būsena</translation> +<translation id="5020154601324912079">Valdoma, kaip apdorojami jūsų įrenginio duomenys. „Google“ apdoroja įrenginio duomenis tik pagal įrenginio valdytojo nurodymus ir tik įrenginio valdytojo nurodytais tikslais.</translation> <translation id="5023310440958281426">Patikrinkite savo administratoriaus politiką</translation> <translation id="5029568752722684782">Išvalyti kopiją</translation> <translation id="503069730517007720">Reikalingas „<ph name="SOFTWARE_NAME" />“ šakninis sertifikatas, bet jis nėra įdiegtas. Jūsų IT administratorius turėtų peržiūrėti „<ph name="SOFTWARE_NAME" />“ konfigūravimo instrukcijas, kad išspręstų šią problemą. <ph name="FURTHER_EXPLANATION" /></translation> @@ -885,6 +897,7 @@ <translation id="5838278095973806738">Šioje svetainėje neturėtumėte pateikti neskelbtinos informacijos (pvz., slaptažodžių ar kredito kortelių numerių), nes ją gali pavogti užpuolikai.</translation> <translation id="5860033963881614850">Išjungta</translation> <translation id="5863847714970149516">Toliau pateiktame puslapyje gali būti bandoma jus apmokestinti</translation> +<translation id="5865951947699094510">Galima nuotoliniu būdu keisti paskyros kūrimo procesą.</translation> <translation id="5866257070973731571">Telefono numerio pridėjimas</translation> <translation id="5869405914158311789">Nepavyksta pasiekti šios svetainės</translation> <translation id="5869522115854928033">Išsaugoti slaptažodžiai</translation> @@ -905,6 +918,7 @@ <translation id="5977976211062815271">Šiame įrenginyje</translation> <translation id="5980920751713728343">Index-3x5</translation> <translation id="598637245381783098">Nepavyksta atidaryti mokėjimo programos</translation> +<translation id="5988826871883769516">Įrenginį tvarko <ph name="ENROLLMENT_DOMAIN" />.</translation> <translation id="5989320800837274978">Nenurodyti nei fiksuoti įgaliotieji serveriai, nei .pac scenarijaus URL.</translation> <translation id="5990559369517809815">Plėtinys užblokavo serveriui teikiamas užklausas.</translation> <translation id="6008256403891681546">JCB</translation> @@ -922,6 +936,7 @@ <translation id="6047233362582046994">Jei suprantate, kokia rizika gali kilti jūsų saugai, galite <ph name="BEGIN_LINK" />apsilankyti šioje svetainėje<ph name="END_LINK" />, kol iš jos dar nepašalintos kenkėjiškos programos.</translation> <translation id="6047927260846328439">Šiuo turiniu gali būti bandoma apgaule priversti jus įdiegti programinę įrangą arba atskleisti asmens informaciją. <ph name="BEGIN_LINK" />Rodyti vis tiek<ph name="END_LINK" /></translation> <translation id="6051221802930200923">Šiuo metu negalite apsilankyti <ph name="SITE" />, nes svetainėje naudojamas sertifikatų prisegimas. Tinklo klaidos ir užpuolimai dažniausiai yra laikini, todėl šis puslapis vėliau tikriausiai veiks.</translation> +<translation id="6052284303005792909">•</translation> <translation id="6058977677006700226">Naudojate korteles visuose įrenginiuose?</translation> <translation id="6059925163896151826">USB įrenginiai</translation> <translation id="6080696365213338172">Pasiekėte turinį naudodami administratoriaus pateiktą sertifikatą. Duomenys, kuriuos pateikiate <ph name="DOMAIN" />, gali būti perimti administratoriaus.</translation> @@ -991,6 +1006,7 @@ <translation id="6508722015517270189">Iš naujo paleiskite „Chrome“</translation> <translation id="6529602333819889595">&Ištrinti dar kartą</translation> <translation id="6534179046333460208">Fizinio žiniatinklio pasiūlymai</translation> +<translation id="6554795675067793129">Jūsų paskyrą tvarko <ph name="ENROLLMENT_DOMAIN" />.</translation> <translation id="6556866813142980365">Grąžinti</translation> <translation id="6563469144985748109">Jūsų valdytojas dar jos nepatvirtino</translation> <translation id="6569060085658103619">Peržiūrite plėtinio puslapį</translation> @@ -1075,6 +1091,7 @@ <translation id="7062635574500127092">Žalsvai mėlyna</translation> <translation id="7064851114919012435">Kontaktinė informacija</translation> <translation id="7079718277001814089">Šioje svetainėje yra kenkėjiškų programų</translation> +<translation id="7081564429925484109">Įspėjimas: ši politika nebuvo sujungta, kaip nurodyta politikoje „PolicyListMultipleSourceMergeList“, nes ji nėra įrašas.</translation> <translation id="7087282848513945231">Apskritis</translation> <translation id="7090678807593890770">Sistemoje „Google“ atlikite paiešką pagal užklausą „<ph name="LINK" />“</translation> <translation id="7108338896283013870">Slėpti</translation> @@ -1151,6 +1168,7 @@ <translation id="741007362987735528">Wide-Format</translation> <translation id="7416351320495623771">Tvarkyti slaptažodžius…</translation> <translation id="7419106976560586862">Profilio kelias</translation> +<translation id="7424427397225027541">Valdoma, kaip apdorojami jūsų paskyros duomenys. „Google“ apdoroja paskyros duomenis tik pagal paskyros valdytojo nurodymus ir tik paskyros valdytojo nurodytais tikslais.</translation> <translation id="7437289804838430631">Pridėti kontaktinę informaciją</translation> <translation id="7440140511386898319">Naršymas neprisijungus</translation> <translation id="7441627299479586546">Netinkamas politikos objektas</translation> @@ -1197,6 +1215,7 @@ <translation id="7615602087246926389">Jau turite duomenų, kurie šifruojami naudojant kitos versijos „Google“ paskyros slaptažodį. Įveskite juos toliau.</translation> <translation id="7633909222644580952">Našumo duomenys ir strigčių ataskaitos</translation> <translation id="7637571805876720304">Pašalinti kredito kortelės informaciją iš „Chromium“?</translation> +<translation id="7638605456503525968">Nuoseklieji prievadai</translation> <translation id="7639968568612851608">Tamsiai pilka</translation> <translation id="765676359832457558">Slėpti išplėstinius nustatymus...</translation> <translation id="7658239707568436148">Atšaukti</translation> @@ -1236,6 +1255,7 @@ <translation id="780301667611848630">Ačiū, ne</translation> <translation id="7805768142964895445">Būsena</translation> <translation id="7806344367022510803">Keisti paieškos variklio nustatymus sistemoje „Chrome“</translation> +<translation id="7810209002420871817">Kaip jūsų paskyros valdytojas (<ph name="ACCOUNT_DOMAIN" />):</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Pašalinti formos pasiūlymą iš „Chrome“?</translation> <translation id="7815407501681723534">Pagal terminą „<ph name="SEARCH_STRING" />“ surasta tiek <ph name="SEARCH_RESULTS" />: <ph name="NUMBER_OF_RESULTS" /></translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index e93038b..d489ef8 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -1185,6 +1185,7 @@ <translation id="7615602087246926389">Jums jau ir dati, kas šifrēti, izmantojot citu Google konta paroles versiju. Ievadiet to šeit.</translation> <translation id="7633909222644580952">Veiktspējas dati un avāriju pārskati</translation> <translation id="7637571805876720304">Vai noņemt kredītkarti no pārlūka Chromium?</translation> +<translation id="7638605456503525968">Seriālie porti</translation> <translation id="7639968568612851608">Tumši pelēka</translation> <translation id="765676359832457558">Slēpt papildu iestatījumus...</translation> <translation id="7658239707568436148">Atcelt</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 2352da2..8589d1b 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -1181,6 +1181,7 @@ <translation id="7615602087246926389">നിങ്ങൾക്ക് ഇതിനകം കൈവശമുള്ള എൻക്രിപ്റ്റ് ചെയ്ത ഡാറ്റ നിങ്ങളുടെ Google അക്കൗണ്ട് പാസ്വേഡിന്റെ ഒരു വ്യത്യസ്ത പതിപ്പ് ഉപയോഗിക്കുന്നു. ദയവായി അത് താഴെ നൽകുക.</translation> <translation id="7633909222644580952">പ്രകടന ഡാറ്റയും ക്രാഷ് റിപ്പോർട്ടുകളും</translation> <translation id="7637571805876720304">Chromium-ത്തിൽ നിന്ന് ക്രെഡിറ്റ് കാർഡ് നീക്കംചെയ്യണോ?</translation> +<translation id="7638605456503525968">സീരിയൽ പോർട്ടുകൾ</translation> <translation id="7639968568612851608">കടും ചാരനിറം</translation> <translation id="765676359832457558">വിപുലമായ ക്രമീകരണങ്ങൾ മറയ്ക്കുക...</translation> <translation id="7658239707568436148">റദ്ദാക്കൂ</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 0b257b2..bccbbb9 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">तुमच्याकडे आधीपासूनच डेटा आहे जो तुमच्या Google खाते पासवर्डची विभिन्न आवृत्ती वापरुन एंक्रिप्ट करण्यात आला आहे. कृपया तो खाली एंटर करा.</translation> <translation id="7633909222644580952">परफॉर्मंस डेटा आणि क्रॅश अहवाल</translation> <translation id="7637571805876720304">Chromium वरून क्रेडिट कार्ड काढून टाकायचे?</translation> +<translation id="7638605456503525968">सिरीअल पोर्ट</translation> <translation id="7639968568612851608">गडद राखाडी</translation> <translation id="765676359832457558">प्रगत सेटिंग्ज लपवा...</translation> <translation id="7658239707568436148">रद्द करा</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 0398d8b2..b106172 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -1187,6 +1187,7 @@ <translation id="7615602087246926389">Anda sudah mempunyai data yang disulitkan menggunakan versi kata laluan Akaun Google anda yang berbeza. Sila masukkannya di bawah.</translation> <translation id="7633909222644580952">Data prestasi dan laporan ranap sistem</translation> <translation id="7637571805876720304">Alih keluar kad kredit daripada Chromium?</translation> +<translation id="7638605456503525968">Port siri</translation> <translation id="7639968568612851608">Kelabu Gelap</translation> <translation id="765676359832457558">Sembunyikan tetapan lanjutan...</translation> <translation id="7658239707568436148">Batal</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index d0fd726..6d47aae 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="nl"> +<translation id="1001338328714563407">Als beheerder van je apparaat en account kan <ph name="ENROLLMENT_DOMAIN" /> het volgende:</translation> <translation id="1008557486741366299">Niet nu</translation> <translation id="1010200102790553230">Pagina later laden</translation> <translation id="1015730422737071372">Aanvullende gegevens verzenden</translation> @@ -300,6 +301,7 @@ <translation id="2586657967955657006">Klembord</translation> <translation id="2587730715158995865">Van <ph name="ARTICLE_PUBLISHER" />. Lees dit en <ph name="OTHER_ARTICLE_COUNT" /> andere artikelen.</translation> <translation id="2587841377698384444">Directory API-ID:</translation> +<translation id="2595719060046994702">Dit apparaat en dit account worden niet beheerd door een bedrijf of andere organisatie.</translation> <translation id="2597378329261239068">Dit document is beveiligd met een wachtwoord. Geef een wachtwoord op.</translation> <translation id="2609632851001447353">Varianten</translation> <translation id="2618023639789766142">C10 (envelop)</translation> @@ -334,6 +336,7 @@ <translation id="2781692009645368755">Google Pay</translation> <translation id="2784949926578158345">De verbinding is opnieuw ingesteld.</translation> <translation id="2788784517760473862">Geaccepteerde creditcards</translation> +<translation id="2792012897584536778">De beheerders van dit apparaat hebben beveiligingscertificaten ingesteld waarmee ze de content kunnen bekijken van websites die je bezoekt.</translation> <translation id="2794233252405721443">Site geblokkeerd</translation> <translation id="2799020568854403057">De volgende site bevat schadelijke apps</translation> <translation id="2799223571221894425">Opnieuw starten</translation> @@ -350,6 +353,7 @@ <translation id="2903493209154104877">Adressen</translation> <translation id="290376772003165898">Pagina is niet in het <ph name="LANGUAGE" />?</translation> <translation id="2909946352844186028">Er is een netwerkwijziging gedetecteerd.</translation> +<translation id="2910133103376701357">Je apparaat en account worden beheerd door <ph name="ENROLLMENT_DOMAIN" />.</translation> <translation id="2916038427272391327">Andere programma's sluiten</translation> <translation id="2922350208395188000">Het servercertificaat kan niet worden gecontroleerd.</translation> <translation id="2925673989565098301">Bezorgingsmethode</translation> @@ -360,6 +364,7 @@ <translation id="2948083400971632585">Via de instellingenpagina kun je proxyservers uitschakelen die voor een verbinding zijn geconfigureerd.</translation> <translation id="2955913368246107853">Zoekbalk sluiten</translation> <translation id="2969319727213777354">Als je een beveiligde verbinding tot stand wilt brengen, moet je klok correct zijn ingesteld. Dit moet omdat de certificaten die deze websites gebruiken om zichzelf te identificeren, slechts gedurende bepaalde perioden geldig zijn. Aangezien de klok van je apparaat niet goed is ingesteld, kan Chrome deze certificaten niet verifiëren.</translation> +<translation id="2970515157925768593">Op afstand je apparaat- en accountinstellingen wijzigen.</translation> <translation id="2972581237482394796">&Opnieuw</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, momenteel geselecteerd. <ph name="ROW_CONTENT" /></translation> <translation id="2982481275546140226">Gegevens wissen</translation> @@ -371,6 +376,7 @@ <translation id="3005723025932146533">Opgeslagen kopie weergeven</translation> <translation id="3008447029300691911">Geef de CVC-code voor <ph name="CREDIT_CARD" /> op. Zodra je bevestigt, worden je creditcardgegevens gedeeld met deze site.</translation> <translation id="3010559122411665027">Lijstitem '<ph name="ENTRY_INDEX" />': <ph name="ERROR" /></translation> +<translation id="3014389611820813634">Als beheerder van dit apparaat kan <ph name="ENROLLMENT_DOMAIN" /> het volgende:</translation> <translation id="301521992641321250">Automatisch geblokkeerd</translation> <translation id="3023071826883856138">You4 (envelop)</translation> <translation id="3024663005179499861">Onjuist beleidstype</translation> @@ -413,6 +419,7 @@ <translation id="3287510313208355388">Downloaden wanneer online</translation> <translation id="3293642807462928945">Meer informatie over het beleid <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Geen zoekresultaten gevonden</translation> +<translation id="3311730110465560799">Op afstand je apparaatinstellingen wijzigen.</translation> <translation id="3320021301628644560">Factuuradres toevoegen</translation> <translation id="3324983252691184275">Karmozijnrood</translation> <translation id="3338095232262050444">Beveiligd</translation> @@ -505,6 +512,7 @@ <translation id="3761718714832595332">Status verbergen</translation> <translation id="3765032636089507299">De Safe Browsing-pagina is in aanbouw.</translation> <translation id="3778403066972421603">Wil je deze pas opslaan in je Google-account en op dit apparaat?</translation> +<translation id="3779973883630527594">Het bedrijf, de school of de organisatie waardoor dit account wordt beheerd, kan het volgende:</translation> <translation id="3781428340399460090">Felroze</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Verloopt: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -545,6 +553,7 @@ <translation id="4072486802667267160">Er is een fout opgetreden bij het verwerken van je bestelling. Probeer het opnieuw.</translation> <translation id="4075732493274867456">De client en server ondersteunen geen algemene SSL-protocolversie of coderingssuite.</translation> <translation id="4079302484614802869">Proxyconfiguratie is ingesteld op het gebruik van een pac-script-URL, niet op het gebruik van vaste proxyservers.</translation> +<translation id="4082393374666368382">Instellingen: beheer</translation> <translation id="4092411512356034591">Doorgaan naar <ph name="DOMAIN" />?</translation> <translation id="4098354747657067197">Misleidende site gedetecteerd</translation> <translation id="4103249731201008433">Serienummer van apparaat is ongeldig</translation> @@ -677,6 +686,7 @@ <translation id="4759118997339041434">Automatisch aanvullen voor betalingen uitgeschakeld</translation> <translation id="4764776831041365478"><ph name="URL" /> werkt even niet, of de pagina kan verhuisd zijn naar een nieuw webadres.</translation> <translation id="4771973620359291008">Er is een onbekende fout opgetreden.</translation> +<translation id="4780900888022378816">Je apparaat wordt beheerd door <ph name="ENROLLMENT_DOMAIN" /> en je account wordt beheerd door <ph name="ACCOUNT_DOMAIN" />.</translation> <translation id="4785689107224900852">Overschakelen naar dit tabblad</translation> <translation id="4798078619018708837">Geef de vervaldatum en CVC-code voor <ph name="CREDIT_CARD" /> op om je creditcardgegevens te updaten. Nadat je hebt bevestigd, worden de creditcardgegevens uit je Google-account gedeeld met deze site.</translation> <translation id="4800132727771399293">Controleer je vervaldatum en CVC-code en probeer het opnieuw</translation> @@ -701,6 +711,7 @@ <translation id="4926159001844873046"><ph name="SITE" /> meldt het volgende</translation> <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" />/<ph name="TOTAL_MATCHCOUNT" /></translation> <translation id="4943872375798546930">Geen resultaten</translation> +<translation id="4945672369594656571">Bepalen hoe je apparaat- en accountgegevens worden verwerkt. Google verwerkt je apparaat- en account gegevens uitsluitend op aanwijzing van je apparaat- en accountbeheerder en alleen voor de doeleinden die zijn opgegeven door je apparaat- en accountbeheerder.</translation> <translation id="4950898438188848926">Schakelknop voor tabbladen, druk op Enter om naar het geopende tabblad, <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" />, te schakelen</translation> <translation id="495170559598752135">Acties</translation> <translation id="4955242332710481440">A5-Extra</translation> @@ -714,6 +725,7 @@ <translation id="5017554619425969104">Tekst die je hebt gekopieerd</translation> <translation id="5018422839182700155">Kan deze pagina niet openen</translation> <translation id="5019198164206649151">Backend-opslag in slechte staat</translation> +<translation id="5020154601324912079">Bepalen hoe je apparaatgegevens worden verwerkt. Google verwerkt je apparaatgegevens uitsluitend op aanwijzing van je apparaatbeheerder en alleen voor de doeleinden die zijn opgegeven door je apparaatbeheerder.</translation> <translation id="5023310440958281426">Neem het beleid van je beheerder door</translation> <translation id="5029568752722684782">Kopie wissen</translation> <translation id="503069730517007720">Er is een rootcertificaat voor '<ph name="SOFTWARE_NAME" />' vereist, maar niet geïnstalleerd. Je IT-beheerder moet de configuratie-instructies voor '<ph name="SOFTWARE_NAME" />' raadplegen om dit probleem op te lossen. <ph name="FURTHER_EXPLANATION" /></translation> @@ -871,6 +883,7 @@ <translation id="5838278095973806738">Geef geen gevoelige gegevens op op deze site (zoals wachtwoorden of creditcards), want deze kunnen worden gestolen door cybercriminelen.</translation> <translation id="5860033963881614850">Uit</translation> <translation id="5863847714970149516">De komende pagina probeert misschien kosten in rekening te brengen</translation> +<translation id="5865951947699094510">Op afstand je accountinstellingen wijzigen.</translation> <translation id="5866257070973731571">Telefoonnummer toevoegen</translation> <translation id="5869405914158311789">Deze site is niet bereikbaar</translation> <translation id="5869522115854928033">Opgeslagen wachtwoorden</translation> @@ -891,6 +904,7 @@ <translation id="5977976211062815271">Op dit apparaat</translation> <translation id="5980920751713728343">Index-3x5</translation> <translation id="598637245381783098">Kan betaal-app niet openen</translation> +<translation id="5988826871883769516">Je apparaat wordt beheerd door <ph name="ENROLLMENT_DOMAIN" />.</translation> <translation id="5989320800837274978">Er worden geen vaste proxyservers en geen pac-script-URL gespecificeerd.</translation> <translation id="5990559369517809815">Verzoeken aan de server zijn door een extensie geblokkeerd.</translation> <translation id="6008256403891681546">JCB</translation> @@ -908,6 +922,7 @@ <translation id="6047233362582046994">Als je de beveiligingsrisico's begrijpt, kun je <ph name="BEGIN_LINK" />deze site bezoeken<ph name="END_LINK" /> voordat de schadelijke apps zijn verwijderd.</translation> <translation id="6047927260846328439">Deze content probeert je mogelijk te misleiden om software te installeren of persoonsgegevens openbaar te maken. <ph name="BEGIN_LINK" />Toch weergeven<ph name="END_LINK" /></translation> <translation id="6051221802930200923">Je kunt <ph name="SITE" /> momenteel niet bezoeken, omdat de website gebruikmaakt van certificaatpinning. Netwerkfouten en aanvallen zijn doorgaans tijdelijk, dus deze pagina werkt later waarschijnlijk correct.</translation> +<translation id="6052284303005792909">•</translation> <translation id="6058977677006700226">Je passen gebruiken op al je apparaten?</translation> <translation id="6059925163896151826">USB-apparaten</translation> <translation id="6080696365213338172">Je hebt toegang tot content gekregen met behulp van een certificaat van je beheerder. Gegevens die je verstrekt aan <ph name="DOMAIN" />, kunnen door je beheerder worden onderschept.</translation> @@ -976,6 +991,7 @@ <translation id="6508722015517270189">Chrome opnieuw starten</translation> <translation id="6529602333819889595">&Opnieuw verwijderen</translation> <translation id="6534179046333460208">Fysieke web-suggesties</translation> +<translation id="6554795675067793129">Je account wordt beheerd door <ph name="ENROLLMENT_DOMAIN" />.</translation> <translation id="6556866813142980365">Opnieuw</translation> <translation id="6563469144985748109">Je beheerder heeft dit nog niet goedgekeurd</translation> <translation id="6569060085658103619">Je bekijkt een extensiepagina</translation> @@ -1060,6 +1076,7 @@ <translation id="7062635574500127092">Blauwgroen</translation> <translation id="7064851114919012435">Contactgegevens</translation> <translation id="7079718277001814089">Deze site bevat malware</translation> +<translation id="7081564429925484109">Waarschuwing: Dit beleid is niet samengevoegd zoals is gespecificeerd in het beleid PolicyListMultipleSourceMergeList, omdat het geen lijst is.</translation> <translation id="7087282848513945231">County</translation> <translation id="7090678807593890770">Zoek op Google naar <ph name="LINK" /></translation> <translation id="7108338896283013870">Verbergen</translation> @@ -1133,6 +1150,7 @@ <translation id="741007362987735528">Wide-Format</translation> <translation id="7416351320495623771">Wachtwoorden beheren…</translation> <translation id="7419106976560586862">Profielpad</translation> +<translation id="7424427397225027541">Bepalen hoe je accountgegevens worden verwerkt. Google verwerkt je accountgegevens uitsluitend op aanwijzing van je accountbeheerder en alleen voor de doeleinden die zijn opgegeven door je accountbeheerder.</translation> <translation id="7437289804838430631">Contactgegevens toevoegen</translation> <translation id="7440140511386898319">Content bekijken wanneer je offline bent</translation> <translation id="7441627299479586546">Onjuist beleidsonderwerp</translation> @@ -1179,6 +1197,7 @@ <translation id="7615602087246926389">Je hebt al gegevens die zijn gecodeerd met een andere versie van het wachtwoord voor je Google-account. Geef dit wachtwoord hieronder op.</translation> <translation id="7633909222644580952">Prestatiegegevens en crashrapporten</translation> <translation id="7637571805876720304">Creditcard verwijderen uit Chromium?</translation> +<translation id="7638605456503525968">Seriële poorten</translation> <translation id="7639968568612851608">Donkergrijs</translation> <translation id="765676359832457558">Geavanceerde instellingen verbergen...</translation> <translation id="7658239707568436148">Annuleren</translation> @@ -1218,6 +1237,7 @@ <translation id="780301667611848630">Nee, bedankt</translation> <translation id="7805768142964895445">Status</translation> <translation id="7806344367022510803">De zoekmachine-instellingen wijzigen in Chrome</translation> +<translation id="7810209002420871817">Als beheerder van je account kan <ph name="ACCOUNT_DOMAIN" /> het volgende:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Formuliersuggestie verwijderen uit Chrome?</translation> <translation id="7815407501681723534"><ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> gevonden voor '<ph name="SEARCH_STRING" />'</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index f2d833d1..c8e7db87 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -1195,6 +1195,7 @@ <translation id="7615602087246926389">Du har allerede data som er kryptert med en annen versjon av Google-kontopassordet ditt. Skriv det inn nedenfor.</translation> <translation id="7633909222644580952">Ytelsesdata og programstopprapporter</translation> <translation id="7637571805876720304">Vil du fjerne kredittkortet fra Chromium?</translation> +<translation id="7638605456503525968">Serielle porter</translation> <translation id="7639968568612851608">Mørk grå</translation> <translation id="765676359832457558">Skjul avanserte innstillinger</translation> <translation id="7658239707568436148">Avbryt</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 02b966e..400ccf3 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">Masz już dane zaszyfrowane przy użyciu innej wersji hasła konta Google. Wpisz je poniżej.</translation> <translation id="7633909222644580952">Dane o wydajności i raporty o awariach</translation> <translation id="7637571805876720304">Usunąć tę kartę kredytową z Chromium?</translation> +<translation id="7638605456503525968">Porty szeregowe</translation> <translation id="7639968568612851608">Ciemnoszary</translation> <translation id="765676359832457558">Ukryj ustawienia zaawansowane...</translation> <translation id="7658239707568436148">Anuluj</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index 6119670..4a0cd57 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">Você já possui dados criptografados utilizando uma versão diferente de sua senha para a Conta do Google. Digite-a abaixo.</translation> <translation id="7633909222644580952">Dados de desempenho e relatórios de erros</translation> <translation id="7637571805876720304">Remover cartão de crédito do Chromium?</translation> +<translation id="7638605456503525968">Portas seriais</translation> <translation id="7639968568612851608">Cinza-escuro</translation> <translation id="765676359832457558">Ocultar configurações avançadas...</translation> <translation id="7658239707568436148">Cancelar</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index 1deceb8..1be2978 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -1195,6 +1195,7 @@ <translation id="7615602087246926389">Já tem dados encriptados usando uma versão diferente da palavra-passe da sua Conta Google. Introduza-a abaixo.</translation> <translation id="7633909222644580952">Dados de desempenho e relatórios de falhas</translation> <translation id="7637571805876720304">Pretende remover o cartão de crédito do Chromium?</translation> +<translation id="7638605456503525968">Portas de série</translation> <translation id="7639968568612851608">Cinzento-escuro</translation> <translation id="765676359832457558">Ocultar definições avançadas...</translation> <translation id="7658239707568436148">Cancelar</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index d9c5945..950399e 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">Aveți deja date criptate utilizând o versiune diferită a parolei pentru Contul dvs. Google. Introduceți-o mai jos.</translation> <translation id="7633909222644580952">Date privind performanța și rapoarte de blocare</translation> <translation id="7637571805876720304">Elimini cardul de credit din Chromium?</translation> +<translation id="7638605456503525968">Porturi seriale</translation> <translation id="7639968568612851608">Gri închis</translation> <translation id="765676359832457558">Ascundeți setările avansate...</translation> <translation id="7658239707568436148">Anulează</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 4944335..ae0fd09 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -1184,6 +1184,7 @@ <translation id="7615602087246926389">У вас уже есть данные, зашифрованные с другой версией пароля к аккаунту Google. Введите этот пароль ниже.</translation> <translation id="7633909222644580952">Данные о производительности и отчеты о сбоях</translation> <translation id="7637571805876720304">Удалить кредитную карту из Chromium?</translation> +<translation id="7638605456503525968">Последовательные порты</translation> <translation id="7639968568612851608">Темно-серый</translation> <translation id="765676359832457558">Скрыть дополнительные настройки</translation> <translation id="7658239707568436148">Отмена</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 95c0900..09b6339 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -1180,6 +1180,7 @@ <translation id="7615602087246926389">Už máte údaje, ktoré sú šifrované pomocou inej verzie vášho hesla účtu Google. Zadajte ho nižšie.</translation> <translation id="7633909222644580952">Údaje o výkonnosti a správy o zlyhaní</translation> <translation id="7637571805876720304">Chcete kreditnú kartu odstrániť z prehliadača Chromium?</translation> +<translation id="7638605456503525968">Sériové porty</translation> <translation id="7639968568612851608">Tmavosivá</translation> <translation id="765676359832457558">Skryť rozšírené nastavenia...</translation> <translation id="7658239707568436148">Zrušiť</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index fdfbc84..e5f3ae7 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">Podatke, ki so šifrirani z drugo različico gesla za Google Račun, že imate. Geslo vnesite spodaj.</translation> <translation id="7633909222644580952">Podatki o delovanju in poročila o zrušitvah</translation> <translation id="7637571805876720304">Želite kreditno kartico odstraniti iz Chromiuma?</translation> +<translation id="7638605456503525968">Serijska vrata</translation> <translation id="7639968568612851608">Temno siva</translation> <translation id="765676359832457558">Skrij dodatne nastavitve ...</translation> <translation id="7658239707568436148">Prekliči</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 7f75e08a..05b9190 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -1195,6 +1195,7 @@ <translation id="7615602087246926389">Већ имате податке који су шифровани помоћу друге верзије лозинке за Google налог. Унесите је у наставку.</translation> <translation id="7633909222644580952">Подаци о учинку и извештаји о отказивању</translation> <translation id="7637571805876720304">Желите ли да уклоните кредитну картицу из Chromium-а?</translation> +<translation id="7638605456503525968">Серијски портови</translation> <translation id="7639968568612851608">Тамносива</translation> <translation id="765676359832457558">Сакриј напредна подешавања...</translation> <translation id="7658239707568436148">Откажи</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index 6f716f8..e3465f0 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">Du har redan data som krypteras med en annan version av ditt lösenord till Google-kontot. Ange det nedan.</translation> <translation id="7633909222644580952">Prestandainformation och kraschrapporter</translation> <translation id="7637571805876720304">Vill du ta bort kreditkortet från Chromium?</translation> +<translation id="7638605456503525968">Serieportar</translation> <translation id="7639968568612851608">Mörkgrå</translation> <translation id="765676359832457558">Dölj avancerade inställningar ...</translation> <translation id="7658239707568436148">Avbryt</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 1d5b51b..55d3d8e 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -1194,6 +1194,7 @@ <translation id="7615602087246926389">Tayari una data ambayo imesimbwa kwa fiche kwa kutumia toleo tofauti la nenosiri lako la Akaunti ya Google. Tafadhali liingize hapo chini.</translation> <translation id="7633909222644580952">Ripoti za utendaji na programu kuacha kufanya kazi</translation> <translation id="7637571805876720304">Je, ungependa kuondoa kadi ya mikopo kwenye Chromium?</translation> +<translation id="7638605456503525968">Milango ya kuingiza</translation> <translation id="7639968568612851608">Kijivu Iliyokolea</translation> <translation id="765676359832457558">Ficha mipangilio ya kina...</translation> <translation id="7658239707568436148">Ghairi</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 22c8efb..5eb47ed 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -1192,6 +1192,7 @@ <translation id="7615602087246926389">உங்கள் Google கணக்கு கடவுச்சொல்லின் மற்றொரு பதிப்பைப் பயன்படுத்தி குறியாக்கப்பட்ட தரவு உங்களிடம் ஏற்கனவே உள்ளது. கீழே அதை உள்ளிடுக.</translation> <translation id="7633909222644580952">செயல்திறன் தரவுகள் & சிதைவு அறிக்கைகள்</translation> <translation id="7637571805876720304">Chromium இலிருந்து கிரெடிட் கார்டை அகற்றவா?</translation> +<translation id="7638605456503525968">சீரியல் போர்ட்டுகள்</translation> <translation id="7639968568612851608">அடர்ந்த சாம்பல்</translation> <translation id="765676359832457558">மேம்பட்ட அமைப்புகளை மறை...</translation> <translation id="7658239707568436148">ரத்து செய்</translation> @@ -1201,6 +1202,7 @@ <translation id="7668654391829183341">அறியப்படாத சாதனம்</translation> <translation id="7669271284792375604">இந்தத் தளத்தில் உள்ள ஹேக்கர்கள், உங்களை ஏமாற்றி (எடுத்துக்காட்டாக, உங்கள் முகப்புப் பக்கத்தை மாற்றுவது அல்லது நீங்கள் பார்வையிடும் தளங்களில் கூடுதல் விளம்பரங்களைக் காட்டுவது), உங்கள் உலாவல் அனுபவத்தைப் பாதிக்கக்கூடிய நிரல்களை நிறுவ வைக்கலாம்.</translation> <translation id="7676643023259824263"><ph name="TEXT" /> கிளிப்-போர்டு உரையைத் தேடும்</translation> +<translation id="7679176406634891508">இயங்குதளம் மற்றும் கிளவுட்</translation> <translation id="7681101578153515023">தேடல் இன்ஜினை மாற்று</translation> <translation id="7682287625158474539">ஷிப்பிங்</translation> <translation id="7687186412095877299">கட்டணப் படிவங்களில் உங்கள் சேமிக்கப்பட்ட கட்டண முறைகளை நிரப்பும்</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 3ce57e3..eee5053 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -1187,6 +1187,7 @@ <translation id="7615602087246926389">మీకు ఇప్పటికే మీ Google ఖాతా పాస్వర్డ్ యొక్క మరొక వెర్షన్ను ఉపయోగించి ఎన్క్రిప్ట్ అయిన డేటా ఉంది. దయచేసి దాన్ని దిగువ నమోదు చేయండి.</translation> <translation id="7633909222644580952">పనితీరు డేటా, క్రాష్ నివేదికలు</translation> <translation id="7637571805876720304">Chromium నుండి క్రెడిట్ కార్డ్ను తీసివేయాలా?</translation> +<translation id="7638605456503525968">సీరియల్ పోర్ట్లు</translation> <translation id="7639968568612851608">ముదురు బూడిద రంగు</translation> <translation id="765676359832457558">అధునాతన సెట్టింగ్లను దాచు...</translation> <translation id="7658239707568436148">రద్దు చేయి</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index c8a93ee..02c4ac1 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -1195,6 +1195,7 @@ <translation id="7615602087246926389">คุณมีข้อมูลที่ถูกเข้ารหัสโดยใช้รหัสผ่านบัญชี Google รูปแบบอื่นอยู่แล้ว โปรดป้อนรหัสผ่านด้านล่าง</translation> <translation id="7633909222644580952">ข้อมูลประสิทธิภาพและรายงานข้อขัดข้อง</translation> <translation id="7637571805876720304">ต้องการนำบัตรเครดิตออกจาก Chromium ใช่ไหม</translation> +<translation id="7638605456503525968">พอร์ตอนุกรม</translation> <translation id="7639968568612851608">เทาเข้ม</translation> <translation id="765676359832457558">ซ่อนการตั้งค่าขั้นสูง...</translation> <translation id="7658239707568436148">ยกเลิก</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index faa015e..5e7302bc 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">Google Hesabı şifrenizin farklı bir sürümü kullanılarak şifrelenmiş verileriniz zaten var. Lütfen bu şifreyi aşağıya girin.</translation> <translation id="7633909222644580952">Performans verileri ve kilitlenme raporları</translation> <translation id="7637571805876720304">Kredi kartı Chromium'dan kaldırılsın mı?</translation> +<translation id="7638605456503525968">Seri bağlantı noktaları</translation> <translation id="7639968568612851608">Koyu Gri</translation> <translation id="765676359832457558">Gelişmiş ayarları gizle...</translation> <translation id="7658239707568436148">İptal</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index a29f58f2..d7c98e8 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="uk"> +<translation id="1001338328714563407">Як адміністратор пристрою й облікового запису, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="1008557486741366299">Не зараз</translation> <translation id="1010200102790553230">Завантажити сторінку пізніше</translation> <translation id="1015730422737071372">Надати додаткову інформацію</translation> @@ -308,6 +309,7 @@ <translation id="2586657967955657006">Буфер обміну</translation> <translation id="2587730715158995865">Видавець: <ph name="ARTICLE_PUBLISHER" />. Читайте цю та ще <ph name="OTHER_ARTICLE_COUNT" /> статей.</translation> <translation id="2587841377698384444">Ідентифікатор API каталогу:</translation> +<translation id="2595719060046994702">Цими пристроєм і обліковим записом не керує компанія чи інша організація.</translation> <translation id="2597378329261239068">Цей документ захищено паролем. Введіть пароль.</translation> <translation id="2609632851001447353">Різновиди</translation> <translation id="2618023639789766142">C10 (конверт)</translation> @@ -342,6 +344,7 @@ <translation id="2781692009645368755">Google Pay</translation> <translation id="2784949926578158345">З’єднання було скинуто.</translation> <translation id="2788784517760473862">Прийнятні кредитні картки</translation> +<translation id="2792012897584536778">Адміністратори цього пристрою налаштували сертифікати безпеки, які дають їм змогу бачити вміст відкритих вами веб-сайтів.</translation> <translation id="2794233252405721443">Сайт заблоковано</translation> <translation id="2799020568854403057">Сайт містить шкідливі додатки</translation> <translation id="2799223571221894425">Перезапустити</translation> @@ -358,6 +361,7 @@ <translation id="2903493209154104877">Адреси</translation> <translation id="290376772003165898">Ця сторінка відображається не такою мовою: <ph name="LANGUAGE" />?</translation> <translation id="2909946352844186028">Виявлено зміну в мережі.</translation> +<translation id="2910133103376701357">Вашим пристроєм і обліковим записом керує <ph name="ENROLLMENT_DOMAIN" />.</translation> <translation id="2916038427272391327">Закрийте інші програми</translation> <translation id="2922350208395188000">Сертифікат сервера неможливо перевірити.</translation> <translation id="2925673989565098301">Спосіб доставки</translation> @@ -368,6 +372,7 @@ <translation id="2948083400971632585">Усі проксі-сервери, налаштовані для з’єднання, можна вимкнути на сторінці налаштувань.</translation> <translation id="2955913368246107853">Закрити панель пошуку</translation> <translation id="2969319727213777354">Щоб установити безпечне з’єднання, потрібно правильно налаштувати час, оскільки сертифікати, які підтверджують справжність веб-сайтів, дійсні лише протягом певного періоду. На вашому пристрої неправильно налаштовано час, тому Chrome не може перевірити сертифікати.</translation> +<translation id="2970515157925768593">може віддалено змінювати налаштування пристрою й облікового запису</translation> <translation id="2972581237482394796">&Повторити</translation> <translation id="2977665033722899841">Зараз вибрано: <ph name="ROW_NAME" /> (<ph name="ROW_CONTENT" />)</translation> <translation id="2982481275546140226">Очистити дані</translation> @@ -379,6 +384,7 @@ <translation id="3005723025932146533">Показати збережену копію</translation> <translation id="3008447029300691911">Введіть код CVC картки <ph name="CREDIT_CARD" />. Щойно ви підтвердите дані картки, цей сайт отримає доступ до них.</translation> <translation id="3010559122411665027">Елемент списку "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> +<translation id="3014389611820813634">Як адміністратор цього пристрою, <ph name="ENROLLMENT_DOMAIN" />:</translation> <translation id="301521992641321250">Блокується автоматично</translation> <translation id="3023071826883856138">You4 (конверт)</translation> <translation id="3024663005179499861">Неправильний тип правила</translation> @@ -424,6 +430,7 @@ <translation id="3287510313208355388">Завантажити після відновлення інтернет-з’єднання</translation> <translation id="3293642807462928945">Докладніше про правило <ph name="POLICY_NAME" /></translation> <translation id="3303855915957856445">Немає результатів</translation> +<translation id="3311730110465560799">може віддалено змінювати налаштування пристрою.</translation> <translation id="3320021301628644560">Додати платіжну адресу</translation> <translation id="3324983252691184275">Малиновий</translation> <translation id="3338095232262050444">Надійне</translation> @@ -518,6 +525,7 @@ <translation id="3761718714832595332">Сховати статус</translation> <translation id="3765032636089507299">Сторінка "Безпечний перегляд" розробляється.</translation> <translation id="3778403066972421603">Зберегти дані картки у вашому обліковому записі Google і на цьому пристрої?</translation> +<translation id="3779973883630527594">Компанія, навчальний заклад або організація, що керує цим обліковим записом:</translation> <translation id="3781428340399460090">Яскраво-рожевий</translation> <translation id="3783418713923659662">Mastercard</translation> <translation id="3787705759683870569">Діє до <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> @@ -558,6 +566,7 @@ <translation id="4072486802667267160">Не вдалось обробити ваше замовлення. Повторіть спробу.</translation> <translation id="4075732493274867456">Клієнт і сервер підтримують різні версії протоколу SSL або набору шифрів.</translation> <translation id="4079302484614802869">Конфігурацію проксі-сервера налаштовано на використання URL-адреси сценарію .pac, а не фіксованих проксі-серверів.</translation> +<translation id="4082393374666368382">Налаштування – керування</translation> <translation id="4092411512356034591">Перейти на сайт <ph name="DOMAIN" />?</translation> <translation id="4098354747657067197">Оманливий сайт</translation> <translation id="4103249731201008433">Недійсний серійний номер пристрою</translation> @@ -690,6 +699,7 @@ <translation id="4759118997339041434">Автозаповнення платіжних даних вимкнено</translation> <translation id="4764776831041365478">Веб-сторінка за адресою <ph name="URL" /> може бути тимчасово недоступною або її назавжди переміщено на нову веб-адресу.</translation> <translation id="4771973620359291008">Виникла невідома помилка.</translation> +<translation id="4780900888022378816">Вашим пристроєм керує<ph name="ENROLLMENT_DOMAIN" />, а обліковим записом – <ph name="ACCOUNT_DOMAIN" />.</translation> <translation id="4785689107224900852">Перейти на цю вкладку</translation> <translation id="4798078619018708837">Введіть дату закінчення терміну дії та код CVC картки <ph name="CREDIT_CARD" />, щоб оновити її дані. Щойно ви підтвердите дані картки в обліковому записі Google, цей сайт отримає доступ до них.</translation> <translation id="4800132727771399293">Перевірте дату закінчення терміну дії та код CVC та повторіть спробу</translation> @@ -714,6 +724,7 @@ <translation id="4926159001844873046">Повідомлення із сайту <ph name="SITE" /></translation> <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" /> з <ph name="TOTAL_MATCHCOUNT" /></translation> <translation id="4943872375798546930">Не знайдено жодного результату</translation> +<translation id="4945672369594656571">Керує обробкою даних пристрою й облікового запису. Google обробляє дані пристрою й облікового запису виключно під керівництвом їх адміністратора та лише для вказаних ним цілей.</translation> <translation id="4950898438188848926">Кнопка перемикання вкладки: натисніть Enter, щоб перейти на відкриту вкладку, <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" /></translation> <translation id="495170559598752135">Дії</translation> <translation id="4955242332710481440">A5-Extra</translation> @@ -727,6 +738,7 @@ <translation id="5017554619425969104">Скопійований текст</translation> <translation id="5018422839182700155">Не вдається відкрити цю сторінку</translation> <translation id="5019198164206649151">Резервний носій пошкоджено</translation> +<translation id="5020154601324912079">Керує обробкою даних пристрою. Google обробляє дані пристрою виключно під керівництвом його адміністратора та лише для вказаних ним цілей.</translation> <translation id="5023310440958281426">Перегляньте правила свого адміністратора</translation> <translation id="5029568752722684782">Видалити копію</translation> <translation id="503069730517007720">Для програмного забезпечення <ph name="SOFTWARE_NAME" /> потрібен кореневий сертифікат, однак його не встановлено. Вашому IT-адміністратору потрібно переглянути вказівки з налаштування <ph name="SOFTWARE_NAME" />, щоб вирішити цю проблему. <ph name="FURTHER_EXPLANATION" /></translation> @@ -884,6 +896,7 @@ <translation id="5838278095973806738">Не вводьте конфіденційну інформацію на цьому сайті (як-от паролі й дані кредитних карток). Зловмисники можуть викрасти її.</translation> <translation id="5860033963881614850">Вимк.</translation> <translation id="5863847714970149516">Наступна сторінка може спробувати стягнути плату</translation> +<translation id="5865951947699094510">може віддалено змінювати налаштування облікового запису</translation> <translation id="5866257070973731571">Додайте номер телефону</translation> <translation id="5869405914158311789">Немає зв’язку із сайтом</translation> <translation id="5869522115854928033">Збережені паролі</translation> @@ -904,6 +917,7 @@ <translation id="5977976211062815271">На цьому пристрої</translation> <translation id="5980920751713728343">Index-3x5</translation> <translation id="598637245381783098">Неможливо відкрити додаток для платежів</translation> +<translation id="5988826871883769516">Вашим пристроєм керує<ph name="ENROLLMENT_DOMAIN" />.</translation> <translation id="5989320800837274978">Не вказано ні фіксованих проксі-серверів, ні URL-адрес сценарію .pac.</translation> <translation id="5990559369517809815">Надсилання запитів на сервер заблоковано розширенням.</translation> <translation id="6008256403891681546">JCB</translation> @@ -921,6 +935,7 @@ <translation id="6047233362582046994">Якщо ви розумієте ризики, пов’язані з безпекою, можете <ph name="BEGIN_LINK" />перейти на цей сайт<ph name="END_LINK" />, перш ніж небезпечні додатки буде видалено.</translation> <translation id="6047927260846328439">Цей вміст може оманливим шляхом змусити вас установити програмну або надати особисту інформацію. <ph name="BEGIN_LINK" />Усе одно показати<ph name="END_LINK" /></translation> <translation id="6051221802930200923">Зараз не можна перейти на сторінку <ph name="SITE" />, оскільки цей веб-сайт використовує закріплення сертифікатів. Помилки мережі й атаки зазвичай тимчасові, тому ця сторінка, скоріш за все, запрацює пізніше.</translation> +<translation id="6052284303005792909">•</translation> <translation id="6058977677006700226">Використовувати картки на всіх ваших пристроях?</translation> <translation id="6059925163896151826">Пристрої USB</translation> <translation id="6080696365213338172">Ви отримали доступ до вмісту, використовуючи наданий адміністратором сертифікат. Адміністратор може перехоплювати дані, які ви надасте домену <ph name="DOMAIN" />.</translation> @@ -990,6 +1005,7 @@ <translation id="6508722015517270189">Перезапустіть Chrome</translation> <translation id="6529602333819889595">&Повторити видалення</translation> <translation id="6534179046333460208">Пропозиції сервісу "Інтернет навколо нас"</translation> +<translation id="6554795675067793129">Вашим обліковим записом керує <ph name="ENROLLMENT_DOMAIN" />.</translation> <translation id="6556866813142980365">Повторити</translation> <translation id="6563469144985748109">Адміністратор ще не схвалив його</translation> <translation id="6569060085658103619">Ви переглядаєте сторінку розширень</translation> @@ -1074,6 +1090,7 @@ <translation id="7062635574500127092">Бірюзовий</translation> <translation id="7064851114919012435">Контактна інформація</translation> <translation id="7079718277001814089">Цей сайт містить зловмисне програмне забезпечення</translation> +<translation id="7081564429925484109">Застереження: це правило не об’єднано як указано в PolicyListMultipleSourceMergeList, оскільки це не список.</translation> <translation id="7087282848513945231">Країна</translation> <translation id="7090678807593890770">Пошукайте за запитом "<ph name="LINK" />" у Google</translation> <translation id="7108338896283013870">Сховати</translation> @@ -1150,6 +1167,7 @@ <translation id="741007362987735528">Широкий формат</translation> <translation id="7416351320495623771">Керувати паролями…</translation> <translation id="7419106976560586862">Шлях до профілю</translation> +<translation id="7424427397225027541">Керує обробкою даних облікового запису. Google обробляє дані облікового запису виключно під керівництвом його адміністратора та лише для вказаних ним цілей.</translation> <translation id="7437289804838430631">Додати контактну інформацію</translation> <translation id="7440140511386898319">Перегляд у режимі офлайн</translation> <translation id="7441627299479586546">Неправильна тема правила</translation> @@ -1196,6 +1214,7 @@ <translation id="7615602087246926389">Ви вже зашифрували дані, використовуючи іншу версію пароля облікового запису Google. Введіть його нижче.</translation> <translation id="7633909222644580952">Дані про ефективність і звіти про збої</translation> <translation id="7637571805876720304">Видалити дані кредитної картки з Chromium?</translation> +<translation id="7638605456503525968">Послідовні порти</translation> <translation id="7639968568612851608">Темно-сірий</translation> <translation id="765676359832457558">Сховати розширені налаштування...</translation> <translation id="7658239707568436148">Скасувати</translation> @@ -1235,6 +1254,7 @@ <translation id="780301667611848630">Ні, дякую</translation> <translation id="7805768142964895445">Статус</translation> <translation id="7806344367022510803">Змініть налаштування пошукової системи в Chrome</translation> +<translation id="7810209002420871817">Як адміністратор облікового запису, <ph name="ACCOUNT_DOMAIN" />:</translation> <translation id="7812922009395017822">Mir</translation> <translation id="7813600968533626083">Видалити дані для автозаповнення форм із Chrome?</translation> <translation id="7815407501681723534">Знайдено результатів за запитом "<ph name="SEARCH_STRING" />": <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /></translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index d68dc12..331d506 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">Bạn đã có dữ liệu được mã hóa bằng mật khẩu khác của Tài khoản Google. Vui lòng nhập mật khẩu đó bên dưới.</translation> <translation id="7633909222644580952">Báo cáo sự cố và dữ liệu hiệu suất</translation> <translation id="7637571805876720304">Bạn muốn xóa thẻ tín dụng khỏi Chromium?</translation> +<translation id="7638605456503525968">Cổng nối tiếp</translation> <translation id="7639968568612851608">Xám đen</translation> <translation id="765676359832457558">Ẩn cài đặt nâng cao...</translation> <translation id="7658239707568436148">Hủy</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 9ac05a8..d3077cd 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -1180,6 +1180,7 @@ <translation id="7615602087246926389">您已经使用不同版本的 Google 帐号密码加密了数据。请在下方输入。</translation> <translation id="7633909222644580952">性能数据和崩溃报告</translation> <translation id="7637571805876720304">要从 Chromium 中移除信用卡吗?</translation> +<translation id="7638605456503525968">串行端口</translation> <translation id="7639968568612851608">深灰色</translation> <translation id="765676359832457558">隐藏高级设置...</translation> <translation id="7658239707568436148">取消</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index a32513e4..f1683c47 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -1196,6 +1196,7 @@ <translation id="7615602087246926389">你已經使用其他版本的「Google 帳戶」密碼對資料進行加密,請在下方輸入密碼。</translation> <translation id="7633909222644580952">效能資料和當機報告</translation> <translation id="7637571805876720304">要從 Chromium 中移除信用卡嗎?</translation> +<translation id="7638605456503525968">序列埠</translation> <translation id="7639968568612851608">深灰色</translation> <translation id="765676359832457558">隱藏進階設定...</translation> <translation id="7658239707568436148">取消</translation>
diff --git a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle.cc b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle.cc index 30ddd90..a90f08f7 100644 --- a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle.cc +++ b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle.cc
@@ -10,6 +10,7 @@ #include "base/bind.h" #include "base/metrics/histogram_macros.h" +#include "base/optional.h" #include "base/timer/timer.h" #include "base/trace_event/trace_event.h" #include "base/trace_event/traced_value.h" @@ -31,6 +32,34 @@ namespace subresource_filter { +namespace { + +using CheckResults = + std::vector<SubresourceFilterSafeBrowsingClient::CheckResult>; + +base::Optional<RedirectPosition> GetEnforcementRedirectPosition( + const CheckResults& results) { + // Safe cast since we have strict limits on HTTP redirects. + int num_results = static_cast<int>(results.size()); + for (int i = num_results - 1; i >= 0; --i) { + bool warning = false; + ActivationList list = GetListForThreatTypeAndMetadata( + results[i].threat_type, results[i].threat_metadata, &warning); + if (!warning && list != ActivationList::NONE) { + if (num_results == 1) + return RedirectPosition::kOnly; + if (i == 0) + return RedirectPosition::kFirst; + if (i == num_results - 1) + return RedirectPosition::kLast; + return RedirectPosition::kMiddle; + } + } + return base::nullopt; +} + +} // namespace + SubresourceFilterSafeBrowsingActivationThrottle:: SubresourceFilterSafeBrowsingActivationThrottle( content::NavigationHandle* handle, @@ -137,9 +166,8 @@ "SubresourceFilterSafeBrowsingActivationThrottle::NotifyResult"); DCHECK(!check_results_.empty()); - // Determine which results to consider for safebrowsing/abusive. - std::vector<SubresourceFilterSafeBrowsingClient::CheckResult> - check_results_to_consider = {check_results_.back()}; + // Determine which results to consider for safebrowsing/abusive enforcement. + CheckResults check_results_to_consider = {check_results_.back()}; if (check_results_.size() >= 2 && base::FeatureList::IsEnabled( kSafeBrowsingSubresourceFilterConsiderRedirects)) { @@ -211,6 +239,15 @@ DCHECK_EQ(ActivationDecision::ACTIVATED, decision); builder.SetDryRun(true); } + + if (auto optional_position = GetEnforcementRedirectPosition(check_results_)) { + RedirectPosition position = *optional_position; + UMA_HISTOGRAM_ENUMERATION( + "SubresourceFilter.PageLoad.Activation.RedirectPosition2.Enforcement", + position); + builder.SetEnforcementRedirectPosition(static_cast<int64_t>(position)); + } + builder.Record(ukm::UkmRecorder::Get()); UMA_HISTOGRAM_ENUMERATION("SubresourceFilter.PageLoad.ActivationDecision", @@ -297,26 +334,6 @@ // Get the activation level for the matching configuration. auto activation_level = selected_config->config.activation_options.activation_level; - - // If there is an activation triggered by the activation list (not a dry run), - // report where in the redirect chain it was triggered. - if (selected_config->config.activation_conditions.activation_scope == - ActivationScope::ACTIVATION_LIST && - activation_level == mojom::ActivationLevel::kEnabled) { - ActivationPosition position; - if (configs.size() == 1) { - position = ActivationPosition::kOnly; - } else if (selected_index == 0) { - position = ActivationPosition::kFirst; - } else if (selected_index == configs.size() - 1) { - position = ActivationPosition::kLast; - } else { - position = ActivationPosition::kMiddle; - } - UMA_HISTOGRAM_ENUMERATION( - "SubresourceFilter.PageLoad.Activation.RedirectPosition", position); - } - // Compute and return the activation decision. return activation_level == mojom::ActivationLevel::kDisabled ? ActivationDecision::ACTIVATION_DISABLED
diff --git a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle.h b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle.h index c7339fdd..fd2e4e2 100644 --- a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle.h +++ b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle.h
@@ -28,12 +28,15 @@ class SubresourceFilterClient; -enum class ActivationPosition { +// Enum representing a position in the redirect chain. These values are +// persisted to logs. Entries should not be renumbered and numeric values should +// never be reused. +enum class RedirectPosition { kOnly = 0, kFirst = 1, kMiddle = 2, kLast = 3, - kMaxValue = kLast, + kMaxValue = kLast }; // Navigation throttle responsible for activating subresource filtering on page
diff --git a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc index 9b27feb..119cc4d 100644 --- a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc +++ b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc
@@ -890,7 +890,7 @@ struct RedirectSamplesAndResults { std::vector<GURL> urls; bool expected_activation; - ActivationPosition expected_position; + base::Optional<RedirectPosition> last_enforcement_position; }; TEST_F(SubresourceFilterSafeBrowsingActivationThrottleTest, @@ -900,7 +900,7 @@ scoped_feature_list.InitAndEnableFeature( kSafeBrowsingSubresourceFilterConsiderRedirects); std::string histogram_string = - "SubresourceFilter.PageLoad.Activation.RedirectPosition"; + "SubresourceFilter.PageLoad.Activation.RedirectPosition2.Enforcement"; // Set up the urls for enforcement. GURL normal_url("https://example.regular"); @@ -924,13 +924,13 @@ // Check cases where there are multiple redirection. const RedirectSamplesAndResults kTestCases[] = { - {{worse_url, normal_url, normal_url}, true, ActivationPosition::kFirst}, - {{bad_url, normal_url, worse_url}, true, ActivationPosition::kLast}, - {{worse_url, normal_url, bad_url}, true, ActivationPosition::kFirst}, - {{normal_url, worse_url, bad_url}, true, ActivationPosition::kLast}, - {{normal_url, normal_url}, false, ActivationPosition::kMaxValue}, - {{normal_url, bad_url, normal_url}, false, ActivationPosition::kMaxValue}, - {{worse_url}, true, ActivationPosition::kOnly}, + {{worse_url, normal_url, normal_url}, true, RedirectPosition::kFirst}, + {{bad_url, normal_url, worse_url}, true, RedirectPosition::kLast}, + {{worse_url, normal_url, bad_url}, true, RedirectPosition::kLast}, + {{normal_url, worse_url, bad_url}, true, RedirectPosition::kLast}, + {{normal_url, normal_url}, false, base::nullopt}, + {{normal_url, bad_url, normal_url}, false, RedirectPosition::kMiddle}, + {{worse_url}, true, RedirectPosition::kOnly}, }; for (const auto& test_case : kTestCases) { const base::HistogramTester histograms; @@ -943,11 +943,14 @@ if (test_case.expected_activation) { EXPECT_EQ(mojom::ActivationLevel::kEnabled, *observer()->GetPageActivationForLastCommittedLoad()); - histograms.ExpectUniqueSample(histogram_string, - test_case.expected_position, 1); } else { EXPECT_EQ(mojom::ActivationLevel::kDisabled, *observer()->GetPageActivationForLastCommittedLoad()); + } + if (test_case.last_enforcement_position.has_value()) { + histograms.ExpectUniqueSample(histogram_string, + *test_case.last_enforcement_position, 1); + } else { histograms.ExpectTotalCount(histogram_string, 0); } }
diff --git a/components/ui_devtools/css_agent.cc b/components/ui_devtools/css_agent.cc index 4fd7f68..8b0f9ea3 100644 --- a/components/ui_devtools/css_agent.cc +++ b/components/ui_devtools/css_agent.cc
@@ -157,6 +157,10 @@ return Response::Error("Invalid node id"); UIElement* ui_element = dom_agent_->GetElementFromNodeId(node_id); + // Handle setting properties from metadata for View. + if (ui_element->type() == VIEW) + ui_element->SetPropertiesFromString(edit->getText()); + gfx::Rect updated_bounds; bool visible = false; if (!GetPropertiesForUIElement(ui_element, &updated_bounds, &visible))
diff --git a/components/ui_devtools/ui_element.cc b/components/ui_devtools/ui_element.cc index 20a3489..59470da5 100644 --- a/components/ui_devtools/ui_element.cc +++ b/components/ui_devtools/ui_element.cc
@@ -109,4 +109,9 @@ delegate_->OnUIElementAdded(nullptr, this); } +bool UIElement::SetPropertiesFromString(const std::string& text) { + NOTREACHED(); + return false; +} + } // namespace ui_devtools
diff --git a/components/ui_devtools/ui_element.h b/components/ui_devtools/ui_element.h index 217e406..6b25d2a 100644 --- a/components/ui_devtools/ui_element.h +++ b/components/ui_devtools/ui_element.h
@@ -80,6 +80,11 @@ virtual void GetVisible(bool* visible) const = 0; virtual void SetVisible(bool visible) = 0; + // Set this element's property values according to |text|. + // |text| is the string passed in through StyleDeclarationEdit::text from + // the frontend. + virtual bool SetPropertiesFromString(const std::string& text); + // If element exists, returns its associated native window and its screen // bounds. Otherwise, returns null and empty bounds. virtual std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndScreenBounds()
diff --git a/components/ui_devtools/views/view_element.cc b/components/ui_devtools/views/view_element.cc index 0595923..6b147f219 100644 --- a/components/ui_devtools/views/view_element.cc +++ b/components/ui_devtools/views/view_element.cc
@@ -4,6 +4,7 @@ #include "components/ui_devtools/views/view_element.h" +#include "base/strings/string_split.h" #include "base/strings/utf_string_conversions.h" #include "components/ui_devtools/Protocol.h" #include "components/ui_devtools/ui_element_delegate.h" @@ -59,10 +60,19 @@ std::vector<std::pair<std::string, std::string>> ViewElement::GetCustomProperties() const { + std::vector<std::pair<std::string, std::string>> ret; + + views::metadata::ClassMetaData* metadata = view_->GetClassMetaData(); + for (views::metadata::MemberMetaDataBase* member : *metadata) { + ret.emplace_back(member->member_name(), + base::UTF16ToUTF8(member->GetValueAsString(view_))); + } + base::string16 description = view_->GetTooltipText(gfx::Point()); - if (description.empty()) - return {}; - return {{"tooltip", base::UTF16ToUTF8(description)}}; + if (!description.empty()) + ret.emplace_back("tooltip", base::UTF16ToUTF8(description)); + + return ret; } void ViewElement::GetBounds(gfx::Rect* bounds) const { @@ -81,6 +91,39 @@ view_->SetVisible(visible); } +bool ViewElement::SetPropertiesFromString(const std::string& text) { + std::vector<std::string> tokens = base::SplitString( + text, ":;", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); + + DCHECK_EQ(tokens.size() % 2, 0UL); + for (size_t i = 0; i < tokens.size() - 1; i += 2) { + const std::string& property_name = tokens.at(i); + const std::string& property_value = base::ToLowerASCII(tokens.at(i + 1)); + + views::metadata::ClassMetaData* metadata = view_->GetClassMetaData(); + views::metadata::MemberMetaDataBase* member = + metadata->FindMemberData(property_name); + if (!member) { + DLOG(ERROR) << "UI DevTools: Can not find property " << property_name + << " in MetaData."; + continue; + } + + // Since DevTools frontend doesn't check the value, we do a sanity check + // based on its type here. + if (member->member_type() == "bool") { + if (property_value != "true" && property_value != "false") { + // Ignore the value. + continue; + } + } + + member->SetValueAsString(view_, base::UTF8ToUTF16(property_value)); + } + + return true; +} + std::unique_ptr<protocol::Array<std::string>> ViewElement::GetAttributes() const { auto attributes = protocol::Array<std::string>::create();
diff --git a/components/ui_devtools/views/view_element.h b/components/ui_devtools/views/view_element.h index 2f5a7c3d..1c1bf31 100644 --- a/components/ui_devtools/views/view_element.h +++ b/components/ui_devtools/views/view_element.h
@@ -37,6 +37,7 @@ void SetBounds(const gfx::Rect& bounds) override; void GetVisible(bool* visible) const override; void SetVisible(bool visible) override; + bool SetPropertiesFromString(const std::string& text) override; std::unique_ptr<protocol::Array<std::string>> GetAttributes() const override; std::pair<gfx::NativeWindow, gfx::Rect> GetNodeWindowAndScreenBounds() const override;
diff --git a/components/ui_devtools/views/view_element_unittest.cc b/components/ui_devtools/views/view_element_unittest.cc index 5b97459..a2a3e54 100644 --- a/components/ui_devtools/views/view_element_unittest.cc +++ b/components/ui_devtools/views/view_element_unittest.cc
@@ -89,6 +89,36 @@ EXPECT_TRUE(view()->visible()); } +TEST_F(ViewElementTest, SetPropertiesFromString) { + static const char* kTestProperty = "Enabled"; + + auto props = element()->GetCustomProperties(); + size_t index; + for (index = 0; index < props.size(); ++index) { + if (props[index].first == kTestProperty) { + EXPECT_EQ(props[index].second, "true"); + break; + } + } + + // Check the property can be set accordingly. + element()->SetPropertiesFromString("Enabled:false"); + props = element()->GetCustomProperties(); + EXPECT_EQ(props[index].first, kTestProperty); + EXPECT_EQ(props[index].second, "false"); + + element()->SetPropertiesFromString("Enabled:true"); + props = element()->GetCustomProperties(); + EXPECT_EQ(props[index].first, kTestProperty); + EXPECT_EQ(props[index].second, "true"); + + // Test setting a non-existent property has no effect. + element()->SetPropertiesFromString("Enable:false"); + props = element()->GetCustomProperties(); + EXPECT_EQ(props[index].first, kTestProperty); + EXPECT_EQ(props[index].second, "true"); +} + TEST_F(ViewElementTest, GetVisible) { bool visible; @@ -120,10 +150,12 @@ TEST_F(ViewElementTest, GetCustomProperties) { auto props = element()->GetCustomProperties(); - DCHECK_EQ(props.size(), 1U); + // There could be a number of properties from metadata. + DCHECK_GE(props.size(), 1U); - EXPECT_EQ(props[0].first, "tooltip"); - EXPECT_EQ(props[0].second, "This is the tooltip"); + // The very last property is "tooltip". + EXPECT_EQ(props.back().first, "tooltip"); + EXPECT_EQ(props.back().second, "This is the tooltip"); } TEST_F(ViewElementTest, GetNodeWindowAndScreenBounds) {
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn index bc3f8a7ee..99fee479 100644 --- a/components/viz/service/BUILD.gn +++ b/components/viz/service/BUILD.gn
@@ -35,6 +35,7 @@ "display/draw_polygon.h", "display/dynamic_geometry_binding.cc", "display/dynamic_geometry_binding.h", + "display/external_use_client.h", "display/frame_rate_decider.cc", "display/frame_rate_decider.h", "display/geometry_binding.cc",
diff --git a/components/viz/service/display/display_resource_provider.cc b/components/viz/service/display/display_resource_provider.cc index 80c8576..54ca8b5d 100644 --- a/components/viz/service/display/display_resource_provider.cc +++ b/components/viz/service/display/display_resource_provider.cc
@@ -668,12 +668,6 @@ to_return.reserve(unused.size()); std::vector<ReturnedResource*> need_synchronization_resources; std::vector<GLbyte*> unverified_sync_tokens; - std::vector<ResourceId> external_used_resource_ids; - std::vector<ReturnedResource*> external_used_resources; - if (external_use_client_) { - external_used_resource_ids.reserve(unused.size()); - external_used_resources.reserve(unused.size()); - } GLES2Interface* gl = ContextGL(); for (ResourceId local_id : unused) { @@ -681,13 +675,8 @@ CHECK(it != resources_.end()); ChildResource& resource = it->second; - bool is_external_used_resource = false; auto sk_image_it = resource_sk_images_.find(local_id); if (sk_image_it != resource_sk_images_.end()) { - if (external_use_client_) { - external_used_resource_ids.push_back(local_id); - is_external_used_resource = true; - } resource_sk_images_.erase(sk_image_it); } @@ -740,9 +729,6 @@ !returned.sync_token.verified_flush()) { unverified_sync_tokens.push_back(returned.sync_token.GetData()); } - - if (is_external_used_resource) - external_used_resources.push_back(&returned); } child_info->child_to_parent_map.erase(child_id); @@ -772,10 +758,8 @@ for (ReturnedResource* returned : need_synchronization_resources) returned->sync_token = new_sync_token; - if (external_use_client_ && !external_used_resource_ids.empty()) { - external_use_client_->ReleaseCachedPromiseSkImages( - std::move(external_used_resource_ids)); - } + if (external_use_client_ && !unused.empty()) + external_use_client_->ReleaseCachedResources(unused); if (!to_return.empty()) child_info->return_callback.Run(to_return); @@ -936,7 +920,7 @@ DisplayResourceProvider::LockSetForExternalUse::LockSetForExternalUse( DisplayResourceProvider* resource_provider, - SkiaOutputSurface* client) + ExternalUseClient* client) : resource_provider_(resource_provider) { DCHECK(!resource_provider_->external_use_client_); resource_provider_->external_use_client_ = client;
diff --git a/components/viz/service/display/display_resource_provider.h b/components/viz/service/display/display_resource_provider.h index 0033144..4aba922 100644 --- a/components/viz/service/display/display_resource_provider.h +++ b/components/viz/service/display/display_resource_provider.h
@@ -20,6 +20,7 @@ #include "components/viz/common/resources/return_callback.h" #include "components/viz/common/resources/shared_bitmap.h" #include "components/viz/common/resources/transferable_resource.h" +#include "components/viz/service/display/external_use_client.h" #include "components/viz/service/display/overlay_candidate.h" #include "components/viz/service/display/resource_fence.h" #include "components/viz/service/display/resource_metadata.h" @@ -44,7 +45,6 @@ class ContextProvider; class SharedBitmapManager; -class SkiaOutputSurface; // This class provides abstractions for receiving and using resources from other // modules/threads/processes. It abstracts away GL textures vs GpuMemoryBuffers @@ -200,7 +200,7 @@ // |resource_provider|. Both |resource_provider| and |client| outlive this // class. LockSetForExternalUse(DisplayResourceProvider* resource_provider, - SkiaOutputSurface* client); + ExternalUseClient* client); ~LockSetForExternalUse(); // Lock a resource for external use. @@ -482,8 +482,8 @@ ResourceMap resources_; ChildMap children_; base::flat_map<ResourceId, sk_sp<SkImage>> resource_sk_images_; - // If set, all |resource_sk_images_| were created with this client. - SkiaOutputSurface* external_use_client_ = nullptr; + // Used to release resources held by an external consumer. + ExternalUseClient* external_use_client_ = nullptr; base::flat_map<int, std::vector<ResourceId>> batched_returning_resources_; scoped_refptr<ResourceFence> current_read_lock_fence_;
diff --git a/components/viz/service/display/display_resource_provider_unittest.cc b/components/viz/service/display/display_resource_provider_unittest.cc index 52c6bb91..cae558e 100644 --- a/components/viz/service/display/display_resource_provider_unittest.cc +++ b/components/viz/service/display/display_resource_provider_unittest.cc
@@ -446,6 +446,13 @@ DisplayResourceProviderTest, ::testing::Values(false, true)); +class MockExternalUseClient : public ExternalUseClient { + public: + MockExternalUseClient() = default; + MOCK_METHOD1(ReleaseCachedResources, + void(const std::vector<ResourceId>& resource_ids)); +}; + TEST_P(DisplayResourceProviderTest, LockForExternalUse) { // TODO(penghuang): consider supporting SW mode. if (!use_gpu()) @@ -479,13 +486,17 @@ unsigned parent_id = resource_map[list.front().id]; + testing::StrictMock<MockExternalUseClient> client; DisplayResourceProvider::LockSetForExternalUse lock_set( - resource_provider_.get(), /*client=*/nullptr); + resource_provider_.get(), &client); ResourceMetadata metadata = lock_set.LockResource(parent_id); ASSERT_EQ(metadata.mailbox_holder.mailbox, mailbox); ASSERT_TRUE(metadata.mailbox_holder.sync_token.HasData()); + // Expect the resource to be passed to ReleaseCachedResources when no longer + // used. + EXPECT_CALL(client, ReleaseCachedResources(testing::ElementsAre(parent_id))); resource_provider_->DeclareUsedResourcesFromChild(child_id, ResourceIdSet()); // The resource should not be returned due to the external use lock. EXPECT_EQ(0u, returned_to_child.size()); @@ -494,8 +505,12 @@ gpu::CommandBufferId::FromUnsafeValue(0x234), 0x456); sync_token2.SetVerifyFlush(); + + // We will get a second release of |parent_id| now that we've released our + // external lock. + EXPECT_CALL(client, ReleaseCachedResources(testing::ElementsAre(parent_id))); + // UnlockResources will also call DeclareUsedResourcesFromChild. lock_set.UnlockResources(sync_token2); - resource_provider_->DeclareUsedResourcesFromChild(child_id, ResourceIdSet()); // The resource should be returned after the lock is released. EXPECT_EQ(1u, returned_to_child.size()); EXPECT_EQ(sync_token2, returned_to_child[0].sync_token);
diff --git a/components/viz/service/display/external_use_client.h b/components/viz/service/display/external_use_client.h new file mode 100644 index 0000000..dd3f52e --- /dev/null +++ b/components/viz/service/display/external_use_client.h
@@ -0,0 +1,26 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_EXTERNAL_USE_CLIENT_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_EXTERNAL_USE_CLIENT_H_ + +#include <vector> + +#include "components/viz/common/resources/resource_id.h" +#include "components/viz/service/viz_service_export.h" + +namespace viz { + +// Interface used by DisplayResourceProvider::LockSetForExternalUse to notify +// the external client about resource removal. +class VIZ_SERVICE_EXPORT ExternalUseClient { + public: + // Release cached data associated with the given |resource_ids|. + virtual void ReleaseCachedResources( + const std::vector<ResourceId>& resource_ids) = 0; +}; + +} // namespace viz + +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_EXTERNAL_USE_CLIENT_H_
diff --git a/components/viz/service/display/skia_output_surface.h b/components/viz/service/display/skia_output_surface.h index 1dbf55a..c865d3b 100644 --- a/components/viz/service/display/skia_output_surface.h +++ b/components/viz/service/display/skia_output_surface.h
@@ -9,6 +9,7 @@ #include <vector> #include "components/viz/common/resources/resource_format.h" +#include "components/viz/service/display/external_use_client.h" #include "components/viz/service/display/output_surface.h" #include "third_party/skia/include/core/SkRefCnt.h" @@ -33,7 +34,8 @@ // SkiaRenderer will be the only renderer. When other renderers are removed, // we will replace OutputSurface with SkiaOutputSurface, and remove all // OutputSurface's methods which are not useful for SkiaRenderer. -class VIZ_SERVICE_EXPORT SkiaOutputSurface : public OutputSurface { +class VIZ_SERVICE_EXPORT SkiaOutputSurface : public OutputSurface, + public ExternalUseClient { public: SkiaOutputSurface(); ~SkiaOutputSurface() override; @@ -68,11 +70,6 @@ sk_sp<SkColorSpace> dst_color_space, bool has_alpha) = 0; - // Release SkImages created by MakePromiseSkImage on the thread on which - // it was fulfilled. SyncToken represents point after which SkImage is - // released. - virtual void ReleaseCachedPromiseSkImages(std::vector<ResourceId> ids) = 0; - // Swaps the current backbuffer to the screen. virtual void SkiaSwapBuffers(OutputSurfaceFrame frame) = 0;
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.cc b/components/viz/service/display_embedder/skia_output_surface_impl.cc index 807c403..bd907eb 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl.cc
@@ -400,14 +400,15 @@ return image; } -void SkiaOutputSurfaceImpl::ReleaseCachedPromiseSkImages( - std::vector<ResourceId> ids) { +void SkiaOutputSurfaceImpl::ReleaseCachedResources( + const std::vector<ResourceId>& ids) { if (ids.empty()) return; std::vector<std::unique_ptr<ImageContext>> image_contexts; for (auto id : ids) { auto it = promise_image_cache_.find(id); - DCHECK(it != promise_image_cache_.end()); + if (it == promise_image_cache_.end()) + continue; auto& image_context = it->second; image_context->image = nullptr; image_contexts.push_back(std::move(image_context));
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.h b/components/viz/service/display_embedder/skia_output_surface_impl.h index a8b3f7b..e4971fb 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.h +++ b/components/viz/service/display_embedder/skia_output_surface_impl.h
@@ -96,7 +96,6 @@ ResourceFormat format, bool mipmap, sk_sp<SkColorSpace> color_space) override; - void ReleaseCachedPromiseSkImages(std::vector<ResourceId> ids) override; void RemoveRenderPassResource(std::vector<RenderPassId> ids) override; void CopyOutput(RenderPassId id, @@ -106,6 +105,9 @@ void AddContextLostObserver(ContextLostObserver* observer) override; void RemoveContextLostObserver(ContextLostObserver* observer) override; + // ExternalUseClient implementation: + void ReleaseCachedResources(const std::vector<ResourceId>& ids) override; + protected: // Set the fields of |capabilities_| and propagates to |impl_on_gpu_|. Should // be called after BindToClient().
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc index 484af740..4fd16fa 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc
@@ -344,8 +344,8 @@ kTopLeft_GrSurfaceOrigin, dst_color_space); } -void SkiaOutputSurfaceImplNonDDL::ReleaseCachedPromiseSkImages( - std::vector<ResourceId> ids) { +void SkiaOutputSurfaceImplNonDDL::ReleaseCachedResources( + const std::vector<ResourceId>& ids) { if (ids.empty()) return; DCHECK_EQ(order_num_, 0u); @@ -353,7 +353,8 @@ sync_point_order_data_->BeginProcessingOrderNumber(order_num_); for (auto id : ids) { auto it = promise_image_cache_.find(id); - DCHECK(it != promise_image_cache_.end()); + if (it == promise_image_cache_.end()) + continue; it->second->image = nullptr; promise_image_cache_.erase(it); }
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h index 8907d39..166fd63d 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h +++ b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h
@@ -104,7 +104,6 @@ ResourceFormat format, bool mipmap, sk_sp<SkColorSpace> color_space) override; - void ReleaseCachedPromiseSkImages(std::vector<ResourceId> ids) override; void RemoveRenderPassResource(std::vector<RenderPassId> ids) override; void CopyOutput(RenderPassId id, const copy_output::RenderPassGeometry& geometry, @@ -113,6 +112,9 @@ void AddContextLostObserver(ContextLostObserver* observer) override; void RemoveContextLostObserver(ContextLostObserver* observer) override; + // ExternalUseClient implementation: + void ReleaseCachedResources(const std::vector<ResourceId>& ids) override; + private: GrContext* gr_context() { return shared_context_state_->gr_context(); }
diff --git a/components/viz/test/fake_skia_output_surface.cc b/components/viz/test/fake_skia_output_surface.cc index 026d05d9..ca376bf 100644 --- a/components/viz/test/fake_skia_output_surface.cc +++ b/components/viz/test/fake_skia_output_surface.cc
@@ -155,8 +155,8 @@ return nullptr; } -void FakeSkiaOutputSurface::ReleaseCachedPromiseSkImages( - std::vector<ResourceId> ids) {} +void FakeSkiaOutputSurface::ReleaseCachedResources( + const std::vector<ResourceId>& ids) {} void FakeSkiaOutputSurface::SkiaSwapBuffers(OutputSurfaceFrame frame) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
diff --git a/components/viz/test/fake_skia_output_surface.h b/components/viz/test/fake_skia_output_surface.h index 276b4bca..19df347d 100644 --- a/components/viz/test/fake_skia_output_surface.h +++ b/components/viz/test/fake_skia_output_surface.h
@@ -74,7 +74,6 @@ ResourceFormat format, bool mipmap, sk_sp<SkColorSpace> color_space) override; - void ReleaseCachedPromiseSkImages(std::vector<ResourceId> ids) override; void RemoveRenderPassResource(std::vector<RenderPassId> ids) override; void CopyOutput(RenderPassId id, @@ -84,6 +83,9 @@ void AddContextLostObserver(ContextLostObserver* observer) override; void RemoveContextLostObserver(ContextLostObserver* observer) override; + // ExternalUseClient implementation: + void ReleaseCachedResources(const std::vector<ResourceId>& ids) override; + private: explicit FakeSkiaOutputSurface( scoped_refptr<ContextProvider> context_provider);
diff --git a/content/app/strings/translations/content_strings_ta.xtb b/content/app/strings/translations/content_strings_ta.xtb index 7ec4daf..ae8e2d5b 100644 --- a/content/app/strings/translations/content_strings_ta.xtb +++ b/content/app/strings/translations/content_strings_ta.xtb
@@ -177,6 +177,7 @@ <translation id="6981594929165378967">செருகும்</translation> <translation id="6989848892321993519">இந்த உரையில் <ph name="MIN_CHARACTERS" /> அல்லது அதற்கு மேற்பட்ட எழுத்துக்குறிகளைப் பயன்படுத்தவும் (தற்போது 1 எழுத்துக்குறியைப் பயன்படுத்துகிறீர்கள்).</translation> <translation id="709897737746224366">கோரிய வடிவமைப்பில் தருக.</translation> +<translation id="7118469954320184356">விவரம் எதுவுமில்லை.</translation> <translation id="7139483182332611405">முன்னுரை</translation> <translation id="7263440858009898357">பட்டியலிலிருந்து ஒரு உருப்படியைத் தேர்ந்தெடுங்கள்.</translation> <translation id="727747134524199931">நெடுவரிசை மேற்தலைப்பு</translation>
diff --git a/content/browser/devtools/devtools_session.cc b/content/browser/devtools/devtools_session.cc index cab390b..4dd2611 100644 --- a/content/browser/devtools/devtools_session.cc +++ b/content/browser/devtools/devtools_session.cc
@@ -17,7 +17,6 @@ #include "content/public/browser/devtools_manager_delegate.h" #include "third_party/inspector_protocol/encoding/encoding.h" -namespace cbor = inspector_protocol_encoding::cbor; using inspector_protocol_encoding::SpanFrom; namespace content { @@ -150,7 +149,8 @@ // TODO(dgozman): revisit the proxy delegate. if (proxy_delegate_) { if (client_->UsesBinaryProtocol()) { - DCHECK(cbor::IsCBORMessage(SpanFrom(message))); + DCHECK( + inspector_protocol_encoding::cbor::IsCBORMessage(SpanFrom(message))); proxy_delegate_->SendMessageToBackend( this, ConvertCBORToJSON(SpanFrom(message))); return true; @@ -168,7 +168,8 @@ if (client_->UsesBinaryProtocol()) { // If the client uses the binary protocol, then |message| is already // CBOR (it comes from the client). - DCHECK(cbor::IsCBORMessage(SpanFrom(message))); + DCHECK( + inspector_protocol_encoding::cbor::IsCBORMessage(SpanFrom(message))); } else { converted_cbor_message = ConvertJSONToCBOR(SpanFrom(message)); message_to_send = &converted_cbor_message; @@ -288,7 +289,7 @@ return; } std::string cbor = message->serialize(/*binary=*/true); - DCHECK(cbor::IsCBORMessage(SpanFrom(cbor))); + DCHECK(inspector_protocol_encoding::cbor::IsCBORMessage(SpanFrom(cbor))); client->DispatchProtocolMessage( agent_host, client->UsesBinaryProtocol() ? cbor : ConvertCBORToJSON(SpanFrom(cbor))); @@ -329,7 +330,7 @@ } std::string cbor(reinterpret_cast<const char*>(message->data.data()), message->data.size()); - DCHECK(cbor::IsCBORMessage(SpanFrom(cbor))); + DCHECK(inspector_protocol_encoding::cbor::IsCBORMessage(SpanFrom(cbor))); client->DispatchProtocolMessage( agent_host, client->UsesBinaryProtocol() ? cbor : ConvertCBORToJSON(SpanFrom(cbor))); @@ -364,7 +365,8 @@ // Or it comes from another devtools_session, in which case it may be CBOR // already. We auto-detect and convert to what the client wants as needed. inspector_protocol_encoding::span<uint8_t> bytes = SpanFrom(message); - bool is_cbor_message = cbor::IsCBORMessage(bytes); + bool is_cbor_message = + inspector_protocol_encoding::cbor::IsCBORMessage(bytes); if (client_->UsesBinaryProtocol()) { client_->DispatchProtocolMessage( agent_host_, is_cbor_message ? message : ConvertJSONToCBOR(bytes)); @@ -437,13 +439,14 @@ // |this| may be deleted at this point. return; } - DCHECK(cbor::IsCBORMessage(SpanFrom(message))); + DCHECK(inspector_protocol_encoding::cbor::IsCBORMessage(SpanFrom(message))); std::string patched(message); inspector_protocol_encoding::Status status = inspector_protocol_encoding::cbor::AppendString8EntryToCBORMap( SpanFrom(kSessionId), SpanFrom(session_id), &patched); if (!status.ok()) { - LOG(ERROR) << "cbor::AppendString8EntryToCBORMap error " + LOG(ERROR) << "inspector_protocol_encoding::cbor::" + "AppendString8EntryToCBORMap error " << static_cast<uint32_t>(status.error) << " position " << static_cast<uint32_t>(status.pos); return;
diff --git a/content/browser/fileapi/file_system_url_loader_factory_browsertest.cc b/content/browser/fileapi/file_system_url_loader_factory_browsertest.cc index 7e30c919..27bae38f 100644 --- a/content/browser/fileapi/file_system_url_loader_factory_browsertest.cc +++ b/content/browser/fileapi/file_system_url_loader_factory_browsertest.cc
@@ -14,6 +14,7 @@ #include "base/i18n/unicodestring.h" #include "base/rand_util.h" #include "base/task/post_task.h" +#include "base/test/bind_test_util.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "content/browser/fileapi/file_system_url_loader_factory.h" @@ -32,6 +33,7 @@ #include "storage/browser/fileapi/file_system_context.h" #include "storage/browser/fileapi/file_system_file_util.h" #include "storage/browser/fileapi/file_system_operation_context.h" +#include "storage/browser/fileapi/file_system_operation_runner.h" #include "storage/browser/fileapi/file_system_url.h" #include "storage/browser/test/async_file_test_helper.h" #include "storage/browser/test/mock_special_storage_policy.h" @@ -42,6 +44,7 @@ #include "third_party/icu/source/i18n/unicode/datefmt.h" #include "third_party/icu/source/i18n/unicode/regex.h" +using base::BindLambdaForTesting; using content::AsyncFileTestHelper; using network::mojom::URLLoaderFactory; using storage::FileSystemContext; @@ -146,74 +149,83 @@ return line.find("<script>start(\"") == 0; } -void ShutdownFileSystemContextOnIOThread( - scoped_refptr<FileSystemContext> file_system_context) { - if (!file_system_context) - return; - file_system_context->Shutdown(); - file_system_context = nullptr; -} - } // namespace class FileSystemURLLoaderFactoryTest : public ContentBrowserTest { protected: - FileSystemURLLoaderFactoryTest() {} + FileSystemURLLoaderFactoryTest() : file_util_(nullptr) { + feature_list_.InitAndEnableFeature(network::features::kNetworkService); + } ~FileSystemURLLoaderFactoryTest() override = default; void SetUpOnMainThread() override { - feature_list_.InitAndEnableFeature(network::features::kNetworkService); + io_task_runner_ = + base::CreateSingleThreadTaskRunnerWithTraits({BrowserThread::IO}); + blocking_task_runner_ = + base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()}); special_storage_policy_ = new MockSpecialStoragePolicy; + ContentBrowserTest::SetUpOnMainThread(); + // We use a test FileSystemContext which runs on the main thread, so we // can work with it synchronously. ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); file_system_context_ = - CreateFileSystemContextForTesting(nullptr, temp_dir_.GetPath()); - base::RunLoop run_loop; - file_system_context_->OpenFileSystem( - GURL("http://remote/"), storage::kFileSystemTypeTemporary, - storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, - base::BindOnce(&FileSystemURLLoaderFactoryTest::OnOpenFileSystem, - run_loop.QuitWhenIdleClosure())); - run_loop.Run(); + CreateFileSystemContext(nullptr, temp_dir_.GetPath()); + file_util_ = file_system_context_->sandbox_delegate()->sync_file_util(); - ContentBrowserTest::SetUpOnMainThread(); + // The filesystem must be opened on the IO sequence. + base::RunLoop loop; + io_task_runner_->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { + file_system_context_->OpenFileSystem( + GURL("http://remote/"), storage::kFileSystemTypeTemporary, + storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, + base::BindOnce(&FileSystemURLLoaderFactoryTest::OnOpenFileSystem, + loop.QuitClosure())); + })); + loop.Run(); } void TearDownOnMainThread() override { loader_.reset(); - base::PostTaskWithTraits( - FROM_HERE, {content::BrowserThread::IO}, - base::BindOnce(&ShutdownFileSystemContextOnIOThread, - std::move(file_system_context_))); + base::RunLoop loop; + io_task_runner_->PostTask(FROM_HERE, BindLambdaForTesting([&]() { + if (file_system_context_) { + file_system_context_->Shutdown(); + file_system_context_ = nullptr; + } + loop.Quit(); + })); + loop.Run(); special_storage_policy_ = nullptr; // FileReader posts a task to close the file in destructor. base::RunLoop().RunUntilIdle(); ContentBrowserTest::TearDownOnMainThread(); } - void SetUpAutoMountContext(base::FilePath* mnt_point) { - *mnt_point = temp_dir_.GetPath().AppendASCII("auto_mount_dir"); - ASSERT_TRUE(base::CreateDirectory(*mnt_point)); + base::FilePath SetUpAutoMountContext() { + base::FilePath mnt_point = + temp_dir_.GetPath().AppendASCII("auto_mount_dir"); + EXPECT_TRUE(base::CreateDirectory(mnt_point)); std::vector<std::unique_ptr<storage::FileSystemBackend>> additional_providers; additional_providers.push_back(std::make_unique<TestFileSystemBackend>( - base::ThreadTaskRunnerHandle::Get().get(), *mnt_point)); + base::ThreadTaskRunnerHandle::Get().get(), mnt_point)); std::vector<storage::URLRequestAutoMountHandler> handlers = { base::BindRepeating(&TestAutoMountForURLRequest)}; file_system_context_ = CreateFileSystemContextWithAutoMountersForTesting( - nullptr, std::move(additional_providers), handlers, - temp_dir_.GetPath()); + io_task_runner_, blocking_task_runner_, nullptr, + std::move(additional_providers), handlers, temp_dir_.GetPath()); + return mnt_point; } - void SetFileUpAutoMountContext() { - base::FilePath mnt_point; - SetUpAutoMountContext(&mnt_point); + void SetUpFileAutoMountContext() { + const base::FilePath mnt_point = SetUpAutoMountContext(); ASSERT_EQ(static_cast<int>(sizeof(kTestFileData)) - 1, base::WriteFile(mnt_point.AppendASCII("foo"), kTestFileData, @@ -226,38 +238,79 @@ } void CreateDirectory(const base::StringPiece& dir_name) { - base::FilePath path = base::FilePath().AppendASCII(dir_name); std::unique_ptr<FileSystemOperationContext> context(NewOperationContext()); - ASSERT_EQ(base::File::FILE_OK, - file_util()->CreateDirectory(context.get(), CreateURL(path), - false /* exclusive */, - false /* recursive */)); + base::RunLoop loop; + blocking_task_runner_->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { + base::FilePath path = base::FilePath().AppendASCII(dir_name); + ASSERT_EQ(base::File::FILE_OK, + file_util_->CreateDirectory(context.get(), CreateURL(path), + /*exclusive=*/false, + /*recursive=*/false)); + loop.Quit(); + })); + loop.Run(); } void WriteFile(const base::StringPiece& file_name, const char* buf, int buf_size) { - FileSystemURL url = file_system_context_->CreateCrackedFileSystemURL( + FileSystemURL url; + url = file_system_context_->CreateCrackedFileSystemURL( GURL("http://remote"), storage::kFileSystemTypeTemporary, base::FilePath().AppendASCII(file_name)); - ASSERT_EQ(base::File::FILE_OK, - AsyncFileTestHelper::CreateFileWithData( - file_system_context_.get(), url, buf, buf_size)); + + base::File::Error result = base::File::FILE_OK; + base::FilePath local_path; + base::ScopedTempDir dir; + if (!dir.CreateUniqueTempDir()) + result = base::File::FILE_ERROR_FAILED; + local_path = dir.GetPath().AppendASCII("tmp"); + if (buf_size != base::WriteFile(local_path, buf, buf_size)) + result = base::File::FILE_ERROR_FAILED; + EXPECT_EQ(base::File::FILE_OK, result); + + base::RunLoop loop; + io_task_runner_->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { + file_system_context_->operation_runner()->CopyInForeignFile( + local_path, url, BindLambdaForTesting([&](base::File::Error err) { + result = err; + loop.Quit(); + })); + })); + loop.Run(); + EXPECT_EQ(base::File::FILE_OK, result); } void EnsureFileExists(const base::StringPiece file_name) { - base::FilePath path = base::FilePath().AppendASCII(file_name); std::unique_ptr<FileSystemOperationContext> context(NewOperationContext()); - ASSERT_EQ( - base::File::FILE_OK, - file_util()->EnsureFileExists(context.get(), CreateURL(path), nullptr)); + + base::RunLoop loop; + blocking_task_runner_->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { + base::FilePath path = base::FilePath().AppendASCII(file_name); + ASSERT_EQ(base::File::FILE_OK, + file_util_->EnsureFileExists(context.get(), CreateURL(path), + nullptr)); + loop.Quit(); + })); + loop.Run(); } void TruncateFile(const base::StringPiece file_name, int64_t length) { - base::FilePath path = base::FilePath().AppendASCII(file_name); std::unique_ptr<FileSystemOperationContext> context(NewOperationContext()); - ASSERT_EQ(base::File::FILE_OK, - file_util()->Truncate(context.get(), CreateURL(path), length)); + + base::RunLoop loop; + blocking_task_runner_->PostTask( + FROM_HERE, BindLambdaForTesting([&]() { + base::FilePath path = base::FilePath().AppendASCII(file_name); + ASSERT_EQ( + base::File::FILE_OK, + file_util_->Truncate(context.get(), CreateURL(path), length)); + loop.Quit(); + })); + loop.Run(); } // If |size| is negative, the reported size is ignored. @@ -305,15 +358,15 @@ } std::unique_ptr<network::TestURLLoaderClient> TestLoad(const GURL& url) { - auto client = TestLoadHelper(url, /*extra_headers=*/nullptr, - file_system_context_.get()); + auto client = + TestLoadHelper(url, /*extra_headers=*/nullptr, file_system_context_); client->RunUntilComplete(); return client; } std::unique_ptr<network::TestURLLoaderClient> TestLoadWithContext( const GURL& url, - FileSystemContext* file_system_context) { + scoped_refptr<storage::FileSystemContext> file_system_context) { auto client = TestLoadHelper(url, /*extra_headers=*/nullptr, file_system_context); client->RunUntilComplete(); @@ -323,15 +376,21 @@ std::unique_ptr<network::TestURLLoaderClient> TestLoadWithHeaders( const GURL& url, const net::HttpRequestHeaders* extra_headers) { - auto client = - TestLoadHelper(url, extra_headers, file_system_context_.get()); + auto client = TestLoadHelper(url, extra_headers, file_system_context_); client->RunUntilComplete(); return client; } std::unique_ptr<network::TestURLLoaderClient> TestLoadNoRun(const GURL& url) { - return TestLoadHelper(url, /*extra_headers=*/nullptr, - file_system_context_.get()); + return TestLoadHelper(url, /*extra_headers=*/nullptr, file_system_context_); + } + + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner() { + return io_task_runner_; + } + + scoped_refptr<base::SequencedTaskRunner> blocking_task_runner() { + return blocking_task_runner_; } // |temp_dir_| must be deleted last. @@ -347,8 +406,16 @@ std::move(done_closure).Run(); } - storage::FileSystemFileUtil* file_util() { - return file_system_context_->sandbox_delegate()->sync_file_util(); + storage::FileSystemContext* CreateFileSystemContext( + storage::QuotaManagerProxy* quota_manager_proxy, + const base::FilePath& base_path) { + std::vector<std::unique_ptr<storage::FileSystemBackend>> + additional_providers; + additional_providers.push_back(std::make_unique<TestFileSystemBackend>( + blocking_task_runner_.get(), base_path)); + return CreateFileSystemContextWithAdditionalProvidersForTesting( + io_task_runner_, blocking_task_runner_, quota_manager_proxy, + std::move(additional_providers), base_path); } FileSystemOperationContext* NewOperationContext() { @@ -362,28 +429,10 @@ return shell()->web_contents()->GetMainFrame(); } - // Starts |request| using |loader_factory| and sets |out_loader| and - // |out_loader_client| to the resulting URLLoader and its URLLoaderClient. The - // caller can then use functions like client.RunUntilComplete() to wait for - // completion. - void StartRequest( - URLLoaderFactory* loader_factory, - const network::ResourceRequest& request, - network::mojom::URLLoaderPtr* out_loader, - std::unique_ptr<network::TestURLLoaderClient>* out_loader_client) { - *out_loader_client = std::make_unique<network::TestURLLoaderClient>(); - loader_factory->CreateLoaderAndStart( - mojo::MakeRequest(out_loader), 0, 0, network::mojom::kURLLoadOptionNone, - request, (*out_loader_client)->CreateInterfacePtr(), - net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); - } - - content::WebContents* GetWebContents() { return shell()->web_contents(); } - std::unique_ptr<network::TestURLLoaderClient> TestLoadHelper( const GURL& url, const net::HttpRequestHeaders* extra_headers, - FileSystemContext* file_system_context) { + scoped_refptr<storage::FileSystemContext> file_system_context) { network::ResourceRequest request; request.url = url; if (extra_headers) @@ -393,14 +442,23 @@ auto factory = content::CreateFileSystemURLLoaderFactory( render_frame_host(), /*is_navigation=*/false, file_system_context, storage_domain); - std::unique_ptr<network::TestURLLoaderClient> client; - StartRequest(factory.get(), request, &loader_, &client); + + auto client = std::make_unique<network::TestURLLoaderClient>(); + factory->CreateLoaderAndStart( + mojo::MakeRequest(&loader_), 0, 0, network::mojom::kURLLoadOptionNone, + request, client->CreateInterfacePtr(), + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)); + return client; } base::test::ScopedFeatureList feature_list_; scoped_refptr<MockSpecialStoragePolicy> special_storage_policy_; + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; + scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; scoped_refptr<FileSystemContext> file_system_context_; + // Owned by |file_system_context_| and only usable on |blocking_task_runner_|. + storage::FileSystemFileUtil* file_util_; DISALLOW_COPY_AND_ASSIGN(FileSystemURLLoaderFactoryTest); }; @@ -490,7 +548,9 @@ CreateDirectory("foo"); scoped_refptr<FileSystemContext> file_system_context = - CreateIncognitoFileSystemContextForTesting(nullptr, temp_dir_.GetPath()); + CreateIncognitoFileSystemContextForTesting(io_task_runner(), + blocking_task_runner(), + nullptr, temp_dir_.GetPath()); auto client = TestLoadWithContext(CreateFileSystemURL("/"), file_system_context.get()); @@ -521,8 +581,7 @@ IN_PROC_BROWSER_TEST_F(FileSystemURLLoaderFactoryTest, AutoMountDirectoryListing) { base::ScopedAllowBlockingForTesting allow_blocking; - base::FilePath mnt_point; - SetUpAutoMountContext(&mnt_point); + base::FilePath mnt_point = SetUpAutoMountContext(); EXPECT_TRUE(base::CreateDirectory(mnt_point)); EXPECT_TRUE(base::CreateDirectory(mnt_point.AppendASCII("foo"))); EXPECT_EQ(10, @@ -560,8 +619,7 @@ IN_PROC_BROWSER_TEST_F(FileSystemURLLoaderFactoryTest, AutoMountInvalidRoot) { base::ScopedAllowBlockingForTesting allow_blocking; - base::FilePath mnt_point; - SetUpAutoMountContext(&mnt_point); + base::FilePath mnt_point = SetUpAutoMountContext(); auto client = TestLoad(GURL("filesystem:http://automount/external/invalid")); EXPECT_FALSE(client->has_received_response()); @@ -575,8 +633,7 @@ IN_PROC_BROWSER_TEST_F(FileSystemURLLoaderFactoryTest, AutoMountNoHandler) { base::ScopedAllowBlockingForTesting allow_blocking; - base::FilePath mnt_point; - SetUpAutoMountContext(&mnt_point); + base::FilePath mnt_point = SetUpAutoMountContext(); auto client = TestLoad(GURL("filesystem:http://noauto/external/mnt_name")); EXPECT_FALSE(client->has_received_response()); @@ -683,7 +740,9 @@ client->completion_status().error_code); } -IN_PROC_BROWSER_TEST_F(FileSystemURLLoaderFactoryTest, FileDirRedirect) { +// This test times out: http://crbug.com/944647. +IN_PROC_BROWSER_TEST_F(FileSystemURLLoaderFactoryTest, + DISABLED_FileDirRedirect) { base::ScopedAllowBlockingForTesting allow_blocking; CreateDirectory("dir"); auto client = TestLoad(CreateFileSystemURL("dir")); @@ -751,7 +810,9 @@ // Creates a new filesystem context for incognito mode. scoped_refptr<FileSystemContext> file_system_context = - CreateIncognitoFileSystemContextForTesting(nullptr, temp_dir_.GetPath()); + CreateIncognitoFileSystemContextForTesting(io_task_runner(), + blocking_task_runner(), + nullptr, temp_dir_.GetPath()); // The request should return NOT_FOUND error if it's in incognito mode. auto client = TestLoadWithContext(CreateFileSystemURL("file"), @@ -771,7 +832,7 @@ IN_PROC_BROWSER_TEST_F(FileSystemURLLoaderFactoryTest, FileAutoMountFileTest) { base::ScopedAllowBlockingForTesting allow_blocking; - SetFileUpAutoMountContext(); + SetUpFileAutoMountContext(); auto client = TestLoad(GURL("filesystem:http://automount/external/mnt_name/foo")); @@ -794,7 +855,7 @@ IN_PROC_BROWSER_TEST_F(FileSystemURLLoaderFactoryTest, FileAutoMountInvalidRoot) { base::ScopedAllowBlockingForTesting allow_blocking; - SetFileUpAutoMountContext(); + SetUpFileAutoMountContext(); auto client = TestLoad(GURL("filesystem:http://automount/external/invalid/foo")); @@ -809,7 +870,7 @@ IN_PROC_BROWSER_TEST_F(FileSystemURLLoaderFactoryTest, FileAutoMountNoHandler) { base::ScopedAllowBlockingForTesting allow_blocking; - SetFileUpAutoMountContext(); + SetUpFileAutoMountContext(); auto client = TestLoad(GURL("filesystem:http://noauto/external/mnt_name/foo"));
diff --git a/content/browser/frame_host/navigation_controller_android.cc b/content/browser/frame_host/navigation_controller_android.cc index 519b640..3c08d56 100644 --- a/content/browser/frame_host/navigation_controller_android.cc +++ b/content/browser/frame_host/navigation_controller_android.cc
@@ -389,6 +389,18 @@ } base::android::ScopedJavaLocalRef<jobject> +NavigationControllerAndroid::GetVisibleEntry(JNIEnv* env, + const JavaParamRef<jobject>& obj) { + content::NavigationEntry* entry = navigation_controller_->GetVisibleEntry(); + + if (!entry) + return base::android::ScopedJavaLocalRef<jobject>(); + + return JNI_NavigationControllerImpl_CreateJavaNavigationEntry(env, entry, + /*index=*/-1); +} + +base::android::ScopedJavaLocalRef<jobject> NavigationControllerAndroid::GetPendingEntry(JNIEnv* env, const JavaParamRef<jobject>& obj) { content::NavigationEntry* entry = navigation_controller_->GetPendingEntry();
diff --git a/content/browser/frame_host/navigation_controller_android.h b/content/browser/frame_host/navigation_controller_android.h index 034b761..7f01993 100644 --- a/content/browser/frame_host/navigation_controller_android.h +++ b/content/browser/frame_host/navigation_controller_android.h
@@ -96,6 +96,9 @@ JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, int index); + base::android::ScopedJavaLocalRef<jobject> GetVisibleEntry( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& /* obj */); base::android::ScopedJavaLocalRef<jobject> GetPendingEntry( JNIEnv* env, const base::android::JavaParamRef<jobject>& /* obj */);
diff --git a/content/browser/frame_host/navigation_handle_impl.cc b/content/browser/frame_host/navigation_handle_impl.cc index f834c58..79d4ecd 100644 --- a/content/browser/frame_host/navigation_handle_impl.cc +++ b/content/browser/frame_host/navigation_handle_impl.cc
@@ -34,16 +34,6 @@ namespace { -// Default timeout for the READY_TO_COMMIT -> COMMIT transition. Chosen -// initially based on the Navigation.ReadyToCommitUntilCommit UMA, and then -// refined based on feedback based on CrashExitCodes.Renderer/RESULT_CODE_HUNG. -constexpr base::TimeDelta kDefaultCommitTimeout = - base::TimeDelta::FromSeconds(30); - -// Timeout for the READY_TO_COMMIT -> COMMIT transition. -// Overrideable via SetCommitTimeoutForTesting. -base::TimeDelta g_commit_timeout = kDefaultCommitTimeout; - // Use this to get a new unique ID for a NavigationHandle during construction. // The returned ID is guaranteed to be nonzero (zero is the "no ID" indicator). int64_t CreateUniqueHandleID() { @@ -51,75 +41,6 @@ return ++unique_id_counter; } -// LOG_NAVIGATION_TIMING_HISTOGRAM logs |value| for "Navigation.<histogram>" UMA -// as well as supplementary UMAs (depending on |transition| and |is_background|) -// for BackForward/Reload/NewNavigation variants. -// -// kMaxTime and kBuckets constants are consistent with -// UMA_HISTOGRAM_MEDIUM_TIMES, but a custom kMinTime is used for high fidelity -// near the low end of measured values. -// -// TODO(zetamoo): This is duplicated in navigation_request. Never update one -// without the other. And remove this one. -// -// TODO(csharrison,nasko): This macro is incorrect for subframe navigations, -// which will only have subframe-specific transition types. This means that all -// subframes currently are tagged as NewNavigations. -#define LOG_NAVIGATION_TIMING_HISTOGRAM(histogram, transition, is_background, \ - duration) \ - do { \ - const base::TimeDelta kMinTime = base::TimeDelta::FromMilliseconds(1); \ - const base::TimeDelta kMaxTime = base::TimeDelta::FromMinutes(3); \ - const int kBuckets = 50; \ - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram, duration, kMinTime, \ - kMaxTime, kBuckets); \ - if (transition & ui::PAGE_TRANSITION_FORWARD_BACK) { \ - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram ".BackForward", \ - duration, kMinTime, kMaxTime, kBuckets); \ - } else if (ui::PageTransitionCoreTypeIs(transition, \ - ui::PAGE_TRANSITION_RELOAD)) { \ - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram ".Reload", duration, \ - kMinTime, kMaxTime, kBuckets); \ - } else if (ui::PageTransitionIsNewNavigation(transition)) { \ - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram ".NewNavigation", \ - duration, kMinTime, kMaxTime, kBuckets); \ - } else { \ - NOTREACHED() << "Invalid page transition: " << transition; \ - } \ - if (is_background.has_value()) { \ - if (is_background.value()) { \ - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram \ - ".BackgroundProcessPriority", \ - duration, kMinTime, kMaxTime, kBuckets); \ - } else { \ - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram \ - ".ForegroundProcessPriority", \ - duration, kMinTime, kMaxTime, kBuckets); \ - } \ - } \ - } while (0) - -void LogIsSameProcess(ui::PageTransition transition, bool is_same_process) { - // Log overall value, then log specific value per type of navigation. - UMA_HISTOGRAM_BOOLEAN("Navigation.IsSameProcess", is_same_process); - - if (transition & ui::PAGE_TRANSITION_FORWARD_BACK) { - UMA_HISTOGRAM_BOOLEAN("Navigation.IsSameProcess.BackForward", - is_same_process); - return; - } - if (ui::PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_RELOAD)) { - UMA_HISTOGRAM_BOOLEAN("Navigation.IsSameProcess.Reload", is_same_process); - return; - } - if (ui::PageTransitionIsNewNavigation(transition)) { - UMA_HISTOGRAM_BOOLEAN("Navigation.IsSameProcess.NewNavigation", - is_same_process); - return; - } - NOTREACHED() << "Invalid page transition: " << transition; -} - } // namespace NavigationHandleImpl::NavigationHandleImpl( @@ -137,7 +58,6 @@ redirect_chain_(redirect_chain), reload_type_(ReloadType::NONE), restore_type_(RestoreType::NONE), - is_same_process_(true), weak_factory_(this) { const GURL& url = navigation_request_->common_params().url; TRACE_EVENT_ASYNC_BEGIN2("navigation", "NavigationHandle", this, @@ -474,9 +394,7 @@ } bool NavigationHandleImpl::IsSameProcess() { - DCHECK(state() == NavigationRequest::DID_COMMIT || - state() == NavigationRequest::DID_COMMIT_ERROR_PAGE); - return is_same_process_; + return navigation_request_->is_same_process(); } int NavigationHandleImpl::GetNavigationEntryOffset() { @@ -506,19 +424,6 @@ new ServiceWorkerNavigationHandle(service_worker_context)); } -void NavigationHandleImpl::InitAppCacheHandle( - ChromeAppCacheService* appcache_service) { - // The final process id won't be available until - // NavigationHandleImpl::ReadyToCommitNavigation. - appcache_handle_.reset(new AppCacheNavigationHandle( - appcache_service, ChildProcessHost::kInvalidUniqueID)); -} - -std::unique_ptr<AppCacheNavigationHandle> -NavigationHandleImpl::TakeAppCacheHandle() { - return std::move(appcache_handle_); -} - void NavigationHandleImpl::UpdateStateFollowingRedirect( const GURL& new_referrer_url, ThrottleChecksFinishedCallback callback) { @@ -549,62 +454,6 @@ complete_callback_ = std::move(callback); } -void NavigationHandleImpl::ReadyToCommitNavigation(bool is_error) { - TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, - "ReadyToCommitNavigation"); - - navigation_request_->set_handle_state(NavigationRequest::READY_TO_COMMIT); - ready_to_commit_time_ = base::TimeTicks::Now(); - RestartCommitTimeout(); - - if (appcache_handle_) - appcache_handle_->SetProcessId(GetRenderFrameHost()->GetProcess()->GetID()); - - // Record metrics for the time it takes to get to this state from the - // beginning of the navigation. - if (!IsSameDocument() && !is_error) { - is_same_process_ = - GetRenderFrameHost()->GetProcess()->GetID() == - frame_tree_node()->current_frame_host()->GetProcess()->GetID(); - LogIsSameProcess(GetPageTransition(), is_same_process_); - - // Don't log process-priority-specific UMAs for TimeToReadyToCommit2 metric - // (which shouldn't be influenced by renderer priority). - constexpr base::Optional<bool> kIsBackground = base::nullopt; - - base::TimeDelta delta = - ready_to_commit_time_ - - navigation_request_->common_params().navigation_start; - LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit2", GetPageTransition(), - kIsBackground, delta); - - if (IsInMainFrame()) { - LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit2.MainFrame", - GetPageTransition(), kIsBackground, - delta); - } else { - LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit2.Subframe", - GetPageTransition(), kIsBackground, - delta); - } - - if (is_same_process_) { - LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit2.SameProcess", - GetPageTransition(), kIsBackground, - delta); - } else { - LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit2.CrossProcess", - GetPageTransition(), kIsBackground, - delta); - } - } - - navigation_request_->SetExpectedProcess(GetRenderFrameHost()->GetProcess()); - - if (!IsSameDocument()) - GetDelegate()->ReadyToCommitNavigation(this); -} - void NavigationHandleImpl::RunCompleteCallback( NavigationThrottle::ThrottleCheckResult result) { DCHECK(result.action() != NavigationThrottle::DEFER); @@ -622,54 +471,4 @@ // destruction. } -void NavigationHandleImpl::RenderProcessBlockedStateChanged(bool blocked) { - if (blocked) - StopCommitTimeout(); - else - RestartCommitTimeout(); -} - -void NavigationHandleImpl::StopCommitTimeout() { - commit_timeout_timer_.Stop(); - render_process_blocked_state_changed_subscription_.reset(); - GetRenderFrameHost()->GetRenderWidgetHost()->RendererIsResponsive(); -} - -void NavigationHandleImpl::RestartCommitTimeout() { - commit_timeout_timer_.Stop(); - if (state() >= NavigationRequest::DID_COMMIT) - return; - - RenderProcessHost* renderer_host = - GetRenderFrameHost()->GetRenderWidgetHost()->GetProcess(); - if (!render_process_blocked_state_changed_subscription_) { - render_process_blocked_state_changed_subscription_ = - renderer_host->RegisterBlockStateChangedCallback(base::BindRepeating( - &NavigationHandleImpl::RenderProcessBlockedStateChanged, - base::Unretained(this))); - } - if (!renderer_host->IsBlocked()) - commit_timeout_timer_.Start( - FROM_HERE, g_commit_timeout, - base::BindRepeating(&NavigationHandleImpl::OnCommitTimeout, - weak_factory_.GetWeakPtr())); -} - -void NavigationHandleImpl::OnCommitTimeout() { - DCHECK_EQ(NavigationRequest::READY_TO_COMMIT, state()); - render_process_blocked_state_changed_subscription_.reset(); - GetRenderFrameHost()->GetRenderWidgetHost()->RendererIsUnresponsive( - base::BindRepeating(&NavigationHandleImpl::RestartCommitTimeout, - weak_factory_.GetWeakPtr())); -} - -// static -void NavigationHandleImpl::SetCommitTimeoutForTesting( - const base::TimeDelta& timeout) { - if (timeout.is_zero()) - g_commit_timeout = kDefaultCommitTimeout; - else - g_commit_timeout = timeout; -} - } // namespace content
diff --git a/content/browser/frame_host/navigation_handle_impl.h b/content/browser/frame_host/navigation_handle_impl.h index 5564a03..a253036 100644 --- a/content/browser/frame_host/navigation_handle_impl.h +++ b/content/browser/frame_host/navigation_handle_impl.h
@@ -43,8 +43,6 @@ namespace content { -class AppCacheNavigationHandle; -class ChromeAppCacheService; class NavigationUIData; class NavigatorDelegate; class ServiceWorkerContextWrapper; @@ -180,13 +178,6 @@ return service_worker_handle_.get(); } - void InitAppCacheHandle(ChromeAppCacheService* appcache_service); - AppCacheNavigationHandle* appcache_handle() const { - return appcache_handle_.get(); - } - - std::unique_ptr<AppCacheNavigationHandle> TakeAppCacheHandle(); - typedef base::OnceCallback<void(NavigationThrottle::ThrottleCheckResult)> ThrottleChecksFinishedCallback; @@ -201,10 +192,6 @@ return navigation_request_->frame_tree_node(); } - // Called when the navigation is ready to be committed. This will update the - // |state_| and inform the delegate. - void ReadyToCommitNavigation(bool is_error); - // Called during commit. Takes ownership of the embedder's NavigationData // instance. This NavigationData may have been cloned prior to being added // here. @@ -262,10 +249,6 @@ // navigation or an error page. bool IsWaitingToCommit(); - // Sets the READY_TO_COMMIT -> DID_COMMIT timeout. Resets the timeout to the - // default value if |timeout| is zero. - static void SetCommitTimeoutForTesting(const base::TimeDelta& timeout); - private: // TODO(clamy): Transform NavigationHandleImplTest into NavigationRequestTest // once NavigationHandleImpl has become a wrapper around NavigationRequest. @@ -295,21 +278,6 @@ return navigation_request_->handle_state(); } - // Called if READY_TO_COMMIT -> COMMIT state transition takes an unusually - // long time. - void OnCommitTimeout(); - - // Called by the RenderProcessHost to handle the case when the process - // changed its state of being blocked. - void RenderProcessBlockedStateChanged(bool blocked); - - void StopCommitTimeout(); - void RestartCommitTimeout(); - - // TODO(zetamoo): Remove once |ready_to_commit_time_| is owned by - // NavigationRequest. - base::TimeTicks ready_to_commit_time() const { return ready_to_commit_time_; } - // The NavigationRequest that owns this NavigationHandle. NavigationRequest* navigation_request_; @@ -328,17 +296,6 @@ std::vector<std::string> removed_request_headers_; net::HttpRequestHeaders modified_request_headers_; - // The time this navigation was ready to commit. - base::TimeTicks ready_to_commit_time_; - - // Timer for detecting an unexpectedly long time to commit a navigation. - base::OneShotTimer commit_timeout_timer_; - - // The subscription to the notification of the changing of the render - // process's blocked state. - std::unique_ptr<base::CallbackList<void(bool)>::Subscription> - render_process_blocked_state_changed_subscription_; - // The unique id of the corresponding NavigationEntry. int pending_nav_entry_id_; @@ -356,11 +313,6 @@ // corresponding provider is created in the renderer. std::unique_ptr<ServiceWorkerNavigationHandle> service_worker_handle_; - // Manages the lifetime of a pre-created AppCacheHost until a browser side - // navigation is ready to be committed, i.e we have a renderer process ready - // to service the navigation request. - std::unique_ptr<AppCacheNavigationHandle> appcache_handle_; - // Embedder data from the IO thread tied to this navigation. std::unique_ptr<NavigationData> navigation_data_; @@ -379,9 +331,6 @@ // Which proxy server was used for this navigation, if any. net::ProxyServer proxy_server_; - // Set in ReadyToCommitNavigation. - bool is_same_process_; - // Allows to override response_headers_ in tests. // TODO(clamy): Clean this up once the architecture of unit tests is better. scoped_refptr<net::HttpResponseHeaders> response_headers_for_testing_;
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc index 49d7f2dd..270e7ad 100644 --- a/content/browser/frame_host/navigation_request.cc +++ b/content/browser/frame_host/navigation_request.cc
@@ -102,6 +102,16 @@ constexpr base::FeatureParam<double> kDoNotUseCacheProbability{ &kHistoryNavigationDoNotUseCacheAblationStudy, "probability", 0.0}; +// Default timeout for the READY_TO_COMMIT -> COMMIT transition. Chosen +// initially based on the Navigation.ReadyToCommitUntilCommit UMA, and then +// refined based on feedback based on CrashExitCodes.Renderer/RESULT_CODE_HUNG. +constexpr base::TimeDelta kDefaultCommitTimeout = + base::TimeDelta::FromSeconds(30); + +// Timeout for the READY_TO_COMMIT -> COMMIT transition. +// Overrideable via SetCommitTimeoutForTesting. +base::TimeDelta g_commit_timeout = kDefaultCommitTimeout; + // Returns the net load flags to use based on the navigation type. // TODO(clamy): Remove the blink code that sets the caching flags when // PlzNavigate launches. @@ -348,9 +358,6 @@ // UMA_HISTOGRAM_MEDIUM_TIMES, but a custom kMinTime is used for high fidelity // near the low end of measured values. // -// TODO(zetamoo): This is duplicated in navigation_handle_impl. Never update one -// without the other. -// // TODO(csharrison,nasko): This macro is incorrect for subframe navigations, // which will only have subframe-specific transition types. This means that all // subframes currently are tagged as NewNavigations. @@ -432,6 +439,53 @@ } } +void RecordReadyToCommitMetrics(base::TimeTicks navigation_start_time, + ui::PageTransition transition, + const base::TimeTicks& ready_to_commit_time, + bool is_same_process, + bool is_main_frame) { + constexpr base::Optional<bool> kIsBackground = base::nullopt; + base::TimeDelta delta = ready_to_commit_time - navigation_start_time; + LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit2", transition, + kIsBackground, delta); + if (is_main_frame) { + LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit2.MainFrame", + transition, kIsBackground, delta); + } else { + LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit2.Subframe", transition, + kIsBackground, delta); + } + if (is_same_process) { + LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit2.SameProcess", + transition, kIsBackground, delta); + } else { + LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit2.CrossProcess", + transition, kIsBackground, delta); + } +} + +void RecordIsSameProcessMetrics(ui::PageTransition transition, + bool is_same_process) { + // Log overall value, then log specific value per type of navigation. + UMA_HISTOGRAM_BOOLEAN("Navigation.IsSameProcess", is_same_process); + + if (transition & ui::PAGE_TRANSITION_FORWARD_BACK) { + UMA_HISTOGRAM_BOOLEAN("Navigation.IsSameProcess.BackForward", + is_same_process); + return; + } + if (ui::PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_RELOAD)) { + UMA_HISTOGRAM_BOOLEAN("Navigation.IsSameProcess.Reload", is_same_process); + return; + } + if (ui::PageTransitionIsNewNavigation(transition)) { + UMA_HISTOGRAM_BOOLEAN("Navigation.IsSameProcess.NewNavigation", + is_same_process); + return; + } + NOTREACHED() << "Invalid page transition: " << transition; +} + } // namespace // static @@ -892,7 +946,7 @@ common_params_.url); // Inform the NavigationHandle that the navigation will commit. - navigation_handle_->ReadyToCommitNavigation(false); + ReadyToCommitNavigation(false); CommitNavigation(); } @@ -1248,10 +1302,9 @@ } // Update the AppCache params of the commit params. - commit_params_.appcache_host_id = - navigation_handle_->appcache_handle() - ? navigation_handle_->appcache_handle()->appcache_host_id() - : blink::mojom::kAppCacheNoHostId; + commit_params_.appcache_host_id = appcache_handle_ + ? appcache_handle_->appcache_host_id() + : blink::mojom::kAppCacheNoHostId; // Update fetch start timing. While NavigationRequest updates fetch start // timing for redirects, it's not aware of service worker interception so @@ -1651,8 +1704,11 @@ if (navigating_frame_host->GetRenderViewHost() ->GetWebkitPreferences() .application_cache_enabled) { - navigation_handle_->InitAppCacheHandle( - static_cast<ChromeAppCacheService*>(partition->GetAppCacheService())); + // The final process id won't be available until + // NavigationRequest::ReadyToCommitNavigation. + appcache_handle_.reset(new AppCacheNavigationHandle( + static_cast<ChromeAppCacheService*>(partition->GetAppCacheService()), + ChildProcessHost::kInvalidUniqueID)); } } @@ -1745,8 +1801,8 @@ devtools_navigation_token(), frame_tree_node_->devtools_frame_token()), std::move(navigation_ui_data), - navigation_handle_->service_worker_handle(), - navigation_handle_->appcache_handle(), this); + navigation_handle_->service_worker_handle(), appcache_handle_.get(), + this); VerifyLoaderAndRenderFrameHostExpectations(); } @@ -1982,7 +2038,7 @@ associated_site_instance_id_.reset(); } - navigation_handle_->ReadyToCommitNavigation(true); + ReadyToCommitNavigation(true); render_frame_host_->FailedNavigation(this, common_params_, commit_params_, has_stale_copy_in_cache_, net_error_, error_page_content); @@ -2479,7 +2535,7 @@ // commit. Inform observers that the navigation is now ready to commit, // unless it is not set to commit (204/205s/downloads). if (render_frame_host_) - navigation_handle_->ReadyToCommitNavigation(false); + ReadyToCommitNavigation(false); } else { handle_state_ = NavigationRequest::CANCELING; } @@ -2688,7 +2744,7 @@ handle_state_ = DID_COMMIT; } - navigation_handle_->StopCommitTimeout(); + StopCommitTimeout(); // Record metrics for the time it took to commit the navigation if it was to // another document without error. @@ -2696,13 +2752,10 @@ ui::PageTransition transition = common_params_.transition; base::Optional<bool> is_background = render_frame_host_->GetProcess()->IsProcessBackgrounded(); - const base::TimeTicks& ready_to_commit_time = - navigation_handle_->ready_to_commit_time(); - RecordStartToCommitMetrics(common_params_.navigation_start, transition, - ready_to_commit_time, is_background, - navigation_handle_->is_same_process_, - frame_tree_node_->IsMainFrame()); + RecordStartToCommitMetrics( + common_params_.navigation_start, transition, ready_to_commit_time_, + is_background, is_same_process_, frame_tree_node_->IsMainFrame()); } DCHECK(!frame_tree_node_->IsMainFrame() || navigation_entry_committed) @@ -2722,4 +2775,92 @@ } } +void NavigationRequest::ReadyToCommitNavigation(bool is_error) { + TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", + navigation_handle_.get(), + "ReadyToCommitNavigation"); + + handle_state_ = READY_TO_COMMIT; + ready_to_commit_time_ = base::TimeTicks::Now(); + RestartCommitTimeout(); + + if (appcache_handle_) + appcache_handle_->SetProcessId(render_frame_host_->GetProcess()->GetID()); + + // Record metrics for the time it takes to get to this state from the + // beginning of the navigation. + if (!IsSameDocument() && !is_error) { + is_same_process_ = + render_frame_host_->GetProcess()->GetID() == + frame_tree_node_->current_frame_host()->GetProcess()->GetID(); + + RecordIsSameProcessMetrics(common_params_.transition, is_same_process_); + + RecordReadyToCommitMetrics(common_params_.navigation_start, + common_params_.transition, ready_to_commit_time_, + is_same_process_, + frame_tree_node_->IsMainFrame()); + } + + SetExpectedProcess(render_frame_host_->GetProcess()); + + if (!IsSameDocument()) + GetDelegate()->ReadyToCommitNavigation(navigation_handle_.get()); +} + +void NavigationRequest::RenderProcessBlockedStateChanged(bool blocked) { + if (blocked) + StopCommitTimeout(); + else + RestartCommitTimeout(); +} + +void NavigationRequest::StopCommitTimeout() { + commit_timeout_timer_.Stop(); + render_process_blocked_state_changed_subscription_.reset(); + render_frame_host_->GetRenderWidgetHost()->RendererIsResponsive(); +} + +void NavigationRequest::RestartCommitTimeout() { + commit_timeout_timer_.Stop(); + if (handle_state_ >= DID_COMMIT) + return; + + RenderProcessHost* renderer_host = + render_frame_host_->GetRenderWidgetHost()->GetProcess(); + if (!render_process_blocked_state_changed_subscription_) { + render_process_blocked_state_changed_subscription_ = + renderer_host->RegisterBlockStateChangedCallback(base::BindRepeating( + &NavigationRequest::RenderProcessBlockedStateChanged, + base::Unretained(this))); + } + if (!renderer_host->IsBlocked()) + commit_timeout_timer_.Start( + FROM_HERE, g_commit_timeout, + base::BindRepeating(&NavigationRequest::OnCommitTimeout, + weak_factory_.GetWeakPtr())); +} + +void NavigationRequest::OnCommitTimeout() { + DCHECK_EQ(READY_TO_COMMIT, handle_state_); + render_process_blocked_state_changed_subscription_.reset(); + render_frame_host_->GetRenderWidgetHost()->RendererIsUnresponsive( + base::BindRepeating(&NavigationRequest::RestartCommitTimeout, + weak_factory_.GetWeakPtr())); +} + +// static +void NavigationRequest::SetCommitTimeoutForTesting( + const base::TimeDelta& timeout) { + if (timeout.is_zero()) + g_commit_timeout = kDefaultCommitTimeout; + else + g_commit_timeout = timeout; +} + +std::unique_ptr<AppCacheNavigationHandle> +NavigationRequest::TakeAppCacheHandle() { + return std::move(appcache_handle_); +} + } // namespace content
diff --git a/content/browser/frame_host/navigation_request.h b/content/browser/frame_host/navigation_request.h index ba5a804..312172f 100644 --- a/content/browser/frame_host/navigation_request.h +++ b/content/browser/frame_host/navigation_request.h
@@ -36,6 +36,7 @@ namespace content { +class AppCacheNavigationHandle; class FrameNavigationEntry; class FrameTreeNode; class NavigationHandleImpl; @@ -395,6 +396,18 @@ return previous_url_; } + bool is_same_process() const { + DCHECK(handle_state_ == DID_COMMIT || + handle_state_ == DID_COMMIT_ERROR_PAGE); + return is_same_process_; + } + + std::unique_ptr<AppCacheNavigationHandle> TakeAppCacheHandle(); + + // Sets the READY_TO_COMMIT -> DID_COMMIT timeout. Resets the timeout to the + // default value if |timeout| is zero. + static void SetCommitTimeoutForTesting(const base::TimeDelta& timeout); + private: // TODO(clamy): Transform NavigationHandleImplTest into NavigationRequestTest // once NavigationHandleImpl has become a wrapper around NavigationRequest. @@ -624,7 +637,20 @@ // RenderProcessHostObserver implementation. void RenderProcessHostDestroyed(RenderProcessHost* host) override; - void RecordNavigationMetrics() const; + // Called when the navigation is ready to be committed. This will update the + // |state_| and inform the delegate. + void ReadyToCommitNavigation(bool is_error); + + // Called if READY_TO_COMMIT -> COMMIT state transition takes an unusually + // long time. + void OnCommitTimeout(); + + // Called by the RenderProcessHost to handle the case when the process + // changed its state of being blocked. + void RenderProcessBlockedStateChanged(bool blocked); + + void StopCommitTimeout(); + void RestartCommitTimeout(); FrameTreeNode* frame_tree_node_; @@ -781,6 +807,25 @@ // cause a "commit" and won't generate this notification. NavigationType navigation_type_ = NAVIGATION_TYPE_UNKNOWN; + // The time this navigation was ready to commit. + base::TimeTicks ready_to_commit_time_; + + // Timer for detecting an unexpectedly long time to commit a navigation. + base::OneShotTimer commit_timeout_timer_; + + // Manages the lifetime of a pre-created AppCacheHost until a browser side + // navigation is ready to be committed, i.e we have a renderer process ready + // to service the navigation request. + std::unique_ptr<AppCacheNavigationHandle> appcache_handle_; + + // Set in ReadyToCommitNavigation. + bool is_same_process_ = true; + + // The subscription to the notification of the changing of the render + // process's blocked state. + std::unique_ptr<base::CallbackList<void(bool)>::Subscription> + render_process_blocked_state_changed_subscription_; + base::WeakPtrFactory<NavigationRequest> weak_factory_; DISALLOW_COPY_AND_ASSIGN(NavigationRequest);
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index f2bd60b..3932774 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -6425,8 +6425,7 @@ navigation_request->GetMimeType() == "message/rfc822"); accessibility_reset_count_ = 0; - appcache_handle_ = - navigation_request->navigation_handle()->TakeAppCacheHandle(); + appcache_handle_ = navigation_request->TakeAppCacheHandle(); frame_tree_node()->navigator()->DidNavigate(this, *validated_params, std::move(navigation_request), is_same_document_navigation);
diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc index 0f9839b..973d26bc7 100644 --- a/content/browser/frame_host/render_frame_host_manager_unittest.cc +++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc
@@ -2799,19 +2799,6 @@ NavigationSimulator::NavigateAndCommitFromBrowser(contents(), kUrl); - controller().LoadURL( - kUrlBar, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); - main_test_rfh()->PrepareForCommit(); - - FrameHostMsg_DidCommitProvisionalLoad_Params params; - params.nav_entry_id = 0; - params.did_create_new_entry = false; - params.transition = ui::PAGE_TRANSITION_LINK; - params.should_update_history = false; - params.gesture = NavigationGestureAuto; - params.method = "GET"; - params.page_state = PageState::CreateFromURL(kUrlBar); - struct TestCase { const char* const url; const char* const origin; @@ -2836,15 +2823,20 @@ }; for (const auto& test_case : cases) { - params.url = GURL(test_case.url); - params.origin = url::Origin::Create(GURL(test_case.origin)); + auto navigation = NavigationSimulatorImpl::CreateBrowserInitiated( + GURL(test_case.url), contents()); + navigation->set_origin(url::Origin::Create(GURL(test_case.origin))); + navigation->ReadyToCommit(); - int expected_bad_msg_count = process()->bad_msg_count(); + int expected_bad_msg_count = + static_cast<MockRenderProcessHost*>(navigation->GetNavigationHandle() + ->GetRenderFrameHost() + ->GetProcess()) + ->bad_msg_count(); if (test_case.mismatch) expected_bad_msg_count++; - main_test_rfh()->SendNavigateWithParams( - ¶ms, false /* was_within_same_document */); + navigation->Commit(); EXPECT_EQ(expected_bad_msg_count, process()->bad_msg_count()) << " url:" << test_case.url
diff --git a/content/browser/media/url_provision_fetcher.cc b/content/browser/media/url_provision_fetcher.cc index ae55d7c6..5805c66 100644 --- a/content/browser/media/url_provision_fetcher.cc +++ b/content/browser/media/url_provision_fetcher.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "content/public/browser/provision_fetcher_factory.h" #include "media/base/bind_to_current_loop.h" +#include "media/base/media_switches.h" #include "net/base/load_flags.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/resource_request.h" @@ -29,6 +30,13 @@ const std::string& default_url, const std::string& request_data, const media::ProvisionFetcher::ResponseCB& response_cb) { + // For testing, don't actually do provisioning if the feature is enabled, + // just indicate that the request failed. + if (base::FeatureList::IsEnabled(media::kFailUrlProvisionFetcherForTesting)) { + response_cb.Run(false, std::string()); + return; + } + response_cb_ = response_cb; const std::string request_string =
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc index 28f839e..94540e16 100644 --- a/content/browser/security_exploit_browsertest.cc +++ b/content/browser/security_exploit_browsertest.cc
@@ -1401,7 +1401,9 @@ // Have the main frame navigate and lie that the initiator origin is b.com. injector.Activate(); - EXPECT_TRUE(ExecJs(web_contents, "window.location = '/title2.html';")); + // Don't expect a response for the script, as the process may be killed + // before the script sends its completion message. + ExecuteScriptAsync(web_contents, "window.location = '/title2.html';"); // Verify that the renderer was terminated. EXPECT_EQ(bad_message::INVALID_INITIATOR_ORIGIN, kill_waiter.Wait()); @@ -1424,7 +1426,9 @@ // Have the main frame submit a BeginNavigation IPC with a missing initiator. injector.Activate(); - EXPECT_TRUE(ExecJs(web_contents, "window.location = '/title2.html';")); + // Don't expect a response for the script, as the process may be killed + // before the script sends its completion message. + ExecuteScriptAsync(web_contents, "window.location = '/title2.html';"); // Verify that the renderer was terminated. EXPECT_EQ(bad_message::RFHI_BEGIN_NAVIGATION_MISSING_INITIATOR_ORIGIN,
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 4b1e01a4..40c9e790 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -13521,7 +13521,7 @@ // Attempt to navigate the second tab to a.com. This will attempt to reuse // the hung process. - NavigationHandleImpl::SetCommitTimeoutForTesting( + NavigationRequest::SetCommitTimeoutForTesting( base::TimeDelta::FromMilliseconds(100)); GURL hung_url(embedded_test_server()->GetURL("a.com", "/title3.html")); UnresponsiveRendererObserver unresponsive_renderer_observer(new_contents); @@ -13534,7 +13534,7 @@ EXPECT_EQ(hung_process, a_process); // Reset the timeout. - NavigationHandleImpl::SetCommitTimeoutForTesting(base::TimeDelta()); + NavigationRequest::SetCommitTimeoutForTesting(base::TimeDelta()); } // This is a regression test for https://crbug.com/881812 which complained that @@ -13572,7 +13572,7 @@ // Attempt to navigate the second tab to a.com. This will attempt to reuse // the hung process. base::TimeDelta kTimeout = base::TimeDelta::FromMilliseconds(100); - NavigationHandleImpl::SetCommitTimeoutForTesting(kTimeout); + NavigationRequest::SetCommitTimeoutForTesting(kTimeout); GURL hung_url(embedded_test_server()->GetURL("a.com", "/title3.html")); UnresponsiveRendererObserver unresponsive_renderer_observer(new_contents); EXPECT_TRUE( @@ -13586,7 +13586,7 @@ EXPECT_FALSE(hung_process); // Reset the timeout. - NavigationHandleImpl::SetCommitTimeoutForTesting(base::TimeDelta()); + NavigationRequest::SetCommitTimeoutForTesting(base::TimeDelta()); } // Tests that an inner WebContents will reattach to its outer WebContents after
diff --git a/content/browser/site_per_process_unload_browsertest.cc b/content/browser/site_per_process_unload_browsertest.cc index 3aade57..5e61465 100644 --- a/content/browser/site_per_process_unload_browsertest.cc +++ b/content/browser/site_per_process_unload_browsertest.cc
@@ -417,7 +417,7 @@ // Attempt to navigate the second tab to a.com. This will attempt to reuse // the hung process. base::TimeDelta kTimeout = base::TimeDelta::FromMilliseconds(100); - NavigationHandleImpl::SetCommitTimeoutForTesting(kTimeout); + NavigationRequest::SetCommitTimeoutForTesting(kTimeout); GURL hung_url(embedded_test_server()->GetURL("a.com", "/title3.html")); UnresponsiveRendererObserver unresponsive_renderer_observer(new_contents); EXPECT_TRUE( @@ -431,7 +431,7 @@ EXPECT_FALSE(hung_process); // Reset the timeout. - NavigationHandleImpl::SetCommitTimeoutForTesting(base::TimeDelta()); + NavigationRequest::SetCommitTimeoutForTesting(base::TimeDelta()); } // Test that unload handlers in iframes are run, even when the removed subtree
diff --git a/content/browser/webauth/authenticator_common.cc b/content/browser/webauth/authenticator_common.cc index 47f990f9..51358eb0 100644 --- a/content/browser/webauth/authenticator_common.cc +++ b/content/browser/webauth/authenticator_common.cc
@@ -285,46 +285,15 @@ mojo::ConvertTo<device::PublicKeyCredentialUserEntity>(options->user), device::PublicKeyCredentialParams(std::move(credential_params))); - auto exclude_list = + make_credential_param.exclude_list = mojo::ConvertTo<std::vector<device::PublicKeyCredentialDescriptor>>( options->exclude_credentials); - make_credential_param.SetExcludeList(std::move(exclude_list)); - make_credential_param.SetHmacSecret(options->hmac_create_secret); - make_credential_param.set_is_incognito_mode(is_incognito); + make_credential_param.hmac_secret = options->hmac_create_secret; + make_credential_param.is_incognito_mode = is_incognito; return make_credential_param; } -device::CtapGetAssertionRequest CreateCtapGetAssertionRequest( - const std::string& client_data_json, - const blink::mojom::PublicKeyCredentialRequestOptionsPtr& options, - base::Optional<std::string> app_id, - bool is_incognito) { - device::CtapGetAssertionRequest request_parameter(options->relying_party_id, - client_data_json); - - auto allowed_list = - mojo::ConvertTo<std::vector<device::PublicKeyCredentialDescriptor>>( - options->allow_credentials); - - request_parameter.SetAllowList(std::move(allowed_list)); - request_parameter.SetUserVerification( - mojo::ConvertTo<device::UserVerificationRequirement>( - options->user_verification)); - - if (app_id) { - request_parameter.SetAppId(std::move(*app_id)); - } - - if (!options->cable_authentication_data.empty()) { - request_parameter.SetCableExtension( - mojo::ConvertTo<std::vector<device::CableDiscoveryData>>( - options->cable_authentication_data)); - } - request_parameter.set_is_incognito_mode(is_incognito); - return request_parameter; -} - // The application parameter is the SHA-256 hash of the UTF-8 encoding of // the application identity (i.e. relying_party_id) of the application // requesting the registration. @@ -336,6 +305,37 @@ return application_parameter; } +device::CtapGetAssertionRequest CreateCtapGetAssertionRequest( + const std::string& client_data_json, + const blink::mojom::PublicKeyCredentialRequestOptionsPtr& options, + base::Optional<std::string> app_id, + bool is_incognito) { + device::CtapGetAssertionRequest request_parameter(options->relying_party_id, + client_data_json); + + request_parameter.allow_list = + mojo::ConvertTo<std::vector<device::PublicKeyCredentialDescriptor>>( + options->allow_credentials); + + request_parameter.user_verification = + mojo::ConvertTo<device::UserVerificationRequirement>( + options->user_verification); + + if (app_id) { + request_parameter.alternative_application_parameter = + CreateApplicationParameter(*app_id); + request_parameter.app_id = std::move(*app_id); + } + + if (!options->cable_authentication_data.empty()) { + request_parameter.cable_extension = + mojo::ConvertTo<std::vector<device::CableDiscoveryData>>( + options->cable_authentication_data); + } + request_parameter.is_incognito_mode = is_incognito; + return request_parameter; +} + // Parses the FIDO transport types extension from the DER-encoded, X.509 // certificate in |der_cert| and appends any unique transport types found to // |out_transports|. @@ -699,7 +699,7 @@ auto ctap_request = CreateCtapMakeCredentialRequest( client_data_json_, options, browser_context()->IsOffTheRecord()); // On dual protocol CTAP2/U2F devices, force credential creation over U2F. - ctap_request.set_is_u2f_only(OriginIsCryptoTokenExtension(caller_origin_)); + ctap_request.is_u2f_only = OriginIsCryptoTokenExtension(caller_origin_); // Compute the effective attestation conveyance preference and set // |attestation_requested_| for showing the attestation consent prompt later. @@ -710,7 +710,7 @@ relying_party_id_)) { attestation = ::device::AttestationConveyancePreference::DIRECT; } - ctap_request.set_attestation_preference(attestation); + ctap_request.attestation_preference = attestation; attestation_requested_ = attestation != ::device::AttestationConveyancePreference::NONE;
diff --git a/content/browser/webauth/authenticator_common.h b/content/browser/webauth/authenticator_common.h index ac7534c..b7b600d 100644 --- a/content/browser/webauth/authenticator_common.h +++ b/content/browser/webauth/authenticator_common.h
@@ -33,7 +33,7 @@ namespace device { struct PlatformAuthenticatorInfo; -class CtapGetAssertionRequest; +struct CtapGetAssertionRequest; class FidoRequestHandlerBase; enum class FidoReturnCode : uint8_t;
diff --git a/content/browser/webauth/authenticator_impl.h b/content/browser/webauth/authenticator_impl.h index 8b004ed..aaf01bd 100644 --- a/content/browser/webauth/authenticator_impl.h +++ b/content/browser/webauth/authenticator_impl.h
@@ -24,7 +24,7 @@ namespace device { struct PlatformAuthenticatorInfo; -class CtapGetAssertionRequest; +struct CtapGetAssertionRequest; class FidoRequestHandlerBase; enum class FidoReturnCode : uint8_t;
diff --git a/content/public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java index 7430c40..9d45f563 100644 --- a/content/public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java
@@ -210,6 +210,15 @@ } @Override + public NavigationEntry getVisibleEntry() { + if (mNativeNavigationControllerAndroid != 0) { + return nativeGetVisibleEntry(mNativeNavigationControllerAndroid); + } + + return null; + } + + @Override public NavigationEntry getPendingEntry() { if (mNativeNavigationControllerAndroid != 0) { return nativeGetPendingEntry(mNativeNavigationControllerAndroid); @@ -301,6 +310,7 @@ boolean override, boolean reloadOnChange); private native NavigationEntry nativeGetEntryAtIndex( long nativeNavigationControllerAndroid, int index); + private native NavigationEntry nativeGetVisibleEntry(long nativeNavigationControllerAndroid); private native NavigationEntry nativeGetPendingEntry(long nativeNavigationControllerAndroid); private native int nativeGetLastCommittedEntryIndex(long nativeNavigationControllerAndroid); private native boolean nativeRemoveEntryAtIndex(long nativeNavigationControllerAndroid,
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/NavigationController.java b/content/public/android/java/src/org/chromium/content_public/browser/NavigationController.java index d45a4f6..a5b3723 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/NavigationController.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/NavigationController.java
@@ -4,6 +4,8 @@ package org.chromium.content_public.browser; +import android.support.annotation.Nullable; + import org.chromium.base.VisibleForTesting; /** @@ -147,6 +149,12 @@ public NavigationEntry getEntryAtIndex(int index); /** + * @return The {@link NavigationEntry} that is appropriate to be displayed in the address bar. + */ + @Nullable + NavigationEntry getVisibleEntry(); + + /** * @return The pending {@link NavigationEntry} for this controller or {@code null} if none * exists. */
diff --git a/content/public/common/common_param_traits_macros.h b/content/public/common/common_param_traits_macros.h index 247b7f0..24bded9 100644 --- a/content/public/common/common_param_traits_macros.h +++ b/content/public/common/common_param_traits_macros.h
@@ -123,6 +123,7 @@ IPC_STRUCT_TRAITS_MEMBER(allow_scripts_to_close_windows) IPC_STRUCT_TRAITS_MEMBER(remote_fonts_enabled) IPC_STRUCT_TRAITS_MEMBER(javascript_can_access_clipboard) + IPC_STRUCT_TRAITS_MEMBER(xslt_enabled) IPC_STRUCT_TRAITS_MEMBER(xss_auditor_enabled) IPC_STRUCT_TRAITS_MEMBER(dns_prefetching_enabled) IPC_STRUCT_TRAITS_MEMBER(data_saver_enabled)
diff --git a/content/public/common/web_preferences.cc b/content/public/common/web_preferences.cc index 1691690d..1822036 100644 --- a/content/public/common/web_preferences.cc +++ b/content/public/common/web_preferences.cc
@@ -78,6 +78,7 @@ allow_scripts_to_close_windows(false), remote_fonts_enabled(true), javascript_can_access_clipboard(false), + xslt_enabled(true), xss_auditor_enabled(true), dns_prefetching_enabled(true), data_saver_enabled(false),
diff --git a/content/public/common/web_preferences.h b/content/public/common/web_preferences.h index 63f9611..a83015f3 100644 --- a/content/public/common/web_preferences.h +++ b/content/public/common/web_preferences.h
@@ -93,6 +93,7 @@ bool allow_scripts_to_close_windows; bool remote_fonts_enabled; bool javascript_can_access_clipboard; + bool xslt_enabled; bool xss_auditor_enabled; // We don't use dns_prefetching_enabled to disable DNS prefetching. Instead, // we disable the feature at a lower layer so that we catch non-WebKit uses
diff --git a/content/renderer/media/renderer_webaudiodevice_impl.cc b/content/renderer/media/renderer_webaudiodevice_impl.cc index 5c6b526..caf8cb3b 100644 --- a/content/renderer/media/renderer_webaudiodevice_impl.cc +++ b/content/renderer/media/renderer_webaudiodevice_impl.cc
@@ -133,7 +133,7 @@ session_id_(session_id), frame_id_(render_frame_id_cb.Run()) { DCHECK(client_callback_); - DCHECK_NE(frame_id_, MSG_ROUTING_NONE); + DCHECK(session_id_ == 0 || frame_id_ != MSG_ROUTING_NONE); media::AudioParameters hardware_params( device_params_cb.Run(frame_id_, session_id_, std::string()));
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 3c144ca..3e328da 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -687,6 +687,7 @@ settings->SetDownloadableBinaryFontsEnabled(prefs.remote_fonts_enabled); settings->SetJavaScriptCanAccessClipboard( prefs.javascript_can_access_clipboard); + WebRuntimeFeatures::EnableXSLT(prefs.xslt_enabled); settings->SetXSSAuditorEnabled(prefs.xss_auditor_enabled); settings->SetDNSPrefetchingEnabled(prefs.dns_prefetching_enabled); blink::WebNetworkStateNotifier::SetSaveDataEnabled(prefs.data_saver_enabled);
diff --git a/content/shell/browser/web_test/web_test_bluetooth_adapter_provider.cc b/content/shell/browser/web_test/web_test_bluetooth_adapter_provider.cc index f4b9ac0f..4ed916a 100644 --- a/content/shell/browser/web_test/web_test_bluetooth_adapter_provider.cc +++ b/content/shell/browser/web_test/web_test_bluetooth_adapter_provider.cc
@@ -673,13 +673,13 @@ device::BluetoothRemoteGattCharacteristic::PROPERTY_READ); ON_CALL(*user_description, ReadRemoteDescriptor_(_, _)) - .WillByDefault(Invoke( - [descriptorName]( - const BluetoothRemoteGattDescriptor::ValueCallback& callback, - BluetoothRemoteGattDescriptor::ErrorCallback&) { + .WillByDefault( + Invoke([descriptorName]( + BluetoothRemoteGattDescriptor::ValueCallback& callback, + BluetoothRemoteGattDescriptor::ErrorCallback&) { std::vector<uint8_t> value(descriptorName.begin(), descriptorName.end()); - callback.Run(value); + std::move(callback).Run(value); })); ON_CALL(*user_description, WriteRemoteDescriptor_(_, _, _)) @@ -696,7 +696,7 @@ // expectation. ON_CALL(*client_config, WriteRemoteDescriptor_(_, _, _)) .WillByDefault( - Invoke([](const std::vector<uint8_t>&, const base::Closure&, + Invoke([](const std::vector<uint8_t>&, base::OnceClosure&, BluetoothRemoteGattDescriptor::ErrorCallback&) { NOTREACHED(); })); @@ -713,7 +713,7 @@ // error correctly as a web test failure. ON_CALL(*no_read_descriptor, ReadRemoteDescriptor_(_, _)) .WillByDefault( - Invoke([](const BluetoothRemoteGattDescriptor::ValueCallback&, + Invoke([](BluetoothRemoteGattDescriptor::ValueCallback&, BluetoothRemoteGattDescriptor::ErrorCallback&) { NOTREACHED(); })); @@ -1040,11 +1040,12 @@ ON_CALL(*user_descriptor, ReadRemoteDescriptor_(_, _)) .WillByDefault(Invoke( [adapter_ptr, device_ptr, disconnect, succeeds]( - const BluetoothRemoteGattDescriptor::ValueCallback& callback, + BluetoothRemoteGattDescriptor::ValueCallback& callback, BluetoothRemoteGattDescriptor::ErrorCallback& error_callback) { base::OnceClosure pending; if (succeeds) { - pending = base::Bind(callback, std::vector<uint8_t>({1})); + pending = base::BindOnce(std::move(callback), + std::vector<uint8_t>({1})); } else { pending = base::BindOnce(std::move(error_callback), @@ -1063,11 +1064,11 @@ ON_CALL(*user_descriptor, WriteRemoteDescriptor_(_, _, _)) .WillByDefault(Invoke( [adapter_ptr, device_ptr, disconnect, succeeds]( - const std::vector<uint8_t>& value, const base::Closure& callback, + const std::vector<uint8_t>& value, base::OnceClosure& callback, BluetoothRemoteGattDescriptor::ErrorCallback& error_callback) { base::OnceClosure pending; if (succeeds) { - pending = callback; + pending = std::move(callback); } else { pending = base::BindOnce(std::move(error_callback),
diff --git a/content/shell/renderer/web_test/blink_test_helpers.cc b/content/shell/renderer/web_test/blink_test_helpers.cc index 786f175e..40b58ed1d 100644 --- a/content/shell/renderer/web_test/blink_test_helpers.cc +++ b/content/shell/renderer/web_test/blink_test_helpers.cc
@@ -105,6 +105,7 @@ prefs->allow_universal_access_from_file_urls = true; prefs->dom_paste_enabled = true; prefs->javascript_can_access_clipboard = true; + prefs->xslt_enabled = true; prefs->xss_auditor_enabled = false; #if defined(OS_MACOSX) prefs->editing_behavior = EDITING_BEHAVIOR_MAC;
diff --git a/content/shell/test_runner/test_plugin.cc b/content/shell/test_runner/test_plugin.cc index 10a91c9b..97d95e4b 100644 --- a/content/shell/test_runner/test_plugin.cc +++ b/content/shell/test_runner/test_plugin.cc
@@ -19,7 +19,10 @@ #include "cc/resources/cross_thread_shared_bitmap.h" #include "components/viz/common/resources/bitmap_allocation.h" #include "content/shell/test_runner/web_test_delegate.h" +#include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/gles2_interface.h" +#include "gpu/command_buffer/client/shared_image_interface.h" +#include "gpu/command_buffer/common//shared_image_usage.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" #include "third_party/blink/public/platform/web_coalesced_input_event.h" @@ -119,7 +122,6 @@ container_(nullptr), web_local_frame_(frame), gl_(nullptr), - color_texture_(0), content_changed_(false), framebuffer_(0), touch_event_request_( @@ -170,12 +172,16 @@ blink::Platform::ContextAttributes attrs; blink::WebURL url = container->GetDocument().Url(); blink::Platform::GraphicsInfo gl_info; - context_provider_ = + std::unique_ptr<blink::WebGraphicsContext3DProvider> context_provider = blink::Platform::Current()->CreateOffscreenGraphicsContext3DProvider( attrs, url, &gl_info); - if (context_provider_ && !context_provider_->BindToCurrentThread()) - context_provider_ = nullptr; - gl_ = context_provider_ ? context_provider_->ContextGL() : nullptr; + if (context_provider && !context_provider->BindToCurrentThread()) + context_provider = nullptr; + if (context_provider) { + gl_ = context_provider ? context_provider->ContextGL() : nullptr; + context_provider_ = + base::MakeRefCounted<ContextProviderRef>(std::move(context_provider)); + } if (!InitScene()) return false; @@ -232,35 +238,44 @@ return; rect_ = clip_rect; - if (rect_.IsEmpty()) { + if (!mailbox_.IsZero()) { + DCHECK(context_provider_); + auto* sii = context_provider_->data->SharedImageInterface(); + sii->DestroySharedImage(sync_token_, mailbox_); mailbox_ = gpu::Mailbox(); sync_token_ = gpu::SyncToken(); + } + + if (rect_.IsEmpty()) { shared_bitmap_ = nullptr; } else if (gl_) { - gl_->Viewport(0, 0, rect_.width, rect_.height); + DCHECK(context_provider_); + auto* sii = context_provider_->data->SharedImageInterface(); + mailbox_ = sii->CreateSharedImage( + viz::ResourceFormat::RGBA_8888, gfx::Size(rect_.width, rect_.height), + gfx::ColorSpace(), + gpu::SHARED_IMAGE_USAGE_GLES2 | gpu::SHARED_IMAGE_USAGE_DISPLAY); + gl_->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData()); - gl_->BindTexture(GL_TEXTURE_2D, color_texture_); - gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, rect_.width, rect_.height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + GLuint color_texture = + gl_->CreateAndTexStorage2DSharedImageCHROMIUM(mailbox_.name); + gl_->BeginSharedImageAccessDirectCHROMIUM( + color_texture, GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM); + gl_->BindFramebuffer(GL_FRAMEBUFFER, framebuffer_); gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, color_texture_, 0); + GL_TEXTURE_2D, color_texture, 0); + gl_->Viewport(0, 0, rect_.width, rect_.height); DrawSceneGL(); - gl_->ProduceTextureDirectCHROMIUM(color_texture_, mailbox_.name); - gl_->Flush(); - gl_->GenSyncTokenCHROMIUM(sync_token_.GetData()); + gl_->EndSharedImageAccessDirectCHROMIUM(color_texture); + gl_->DeleteTextures(1, &color_texture); + + gl_->GenUnverifiedSyncTokenCHROMIUM(sync_token_.GetData()); shared_bitmap_ = nullptr; } else { - mailbox_ = gpu::Mailbox(); - sync_token_ = gpu::SyncToken(); - viz::SharedBitmapId id = viz::SharedBitmap::GenerateId(); std::unique_ptr<base::SharedMemory> shm = viz::bitmap_allocation::AllocateMappedBitmap(gfx::Rect(rect_).size(), @@ -281,9 +296,6 @@ return false; } -static void IgnoreReleaseCallback(const gpu::SyncToken& sync_token, bool lost) { -} - // static void TestPlugin::ReleaseSharedMemory( scoped_refptr<cc::CrossThreadSharedBitmap> shared_bitmap, @@ -291,6 +303,16 @@ const gpu::SyncToken& sync_token, bool lost) {} +// static +void TestPlugin::ReleaseSharedImage( + scoped_refptr<ContextProviderRef> context_provider, + const gpu::Mailbox& mailbox, + const gpu::SyncToken& sync_token, + bool lost) { + auto* sii = context_provider->data->SharedImageInterface(); + sii->DestroySharedImage(sync_token, mailbox); +} + bool TestPlugin::PrepareTransferableResource( cc::SharedBitmapIdRegistrar* bitmap_registrar, viz::TransferableResource* resource, @@ -300,8 +322,11 @@ if (!mailbox_.IsZero()) { *resource = viz::TransferableResource::MakeGL(mailbox_, GL_LINEAR, GL_TEXTURE_2D, sync_token_); + // We pass ownership of the shared image to the callback. *release_callback = viz::SingleReleaseCallback::Create( - base::BindOnce(&IgnoreReleaseCallback)); + base::BindOnce(&ReleaseSharedImage, context_provider_, mailbox_)); + mailbox_ = gpu::Mailbox(); + sync_token_ = gpu::SyncToken(); } else if (shared_bitmap_) { // The |bitmap_data_| is only used for a single compositor frame, so we know // the SharedBitmapId in it was not registered yet. @@ -369,7 +394,6 @@ float color[4]; PremultiplyAlpha(scene_.background_color, scene_.opacity, color); - gl_->GenTextures(1, &color_texture_); gl_->GenFramebuffers(1, &framebuffer_); gl_->Viewport(0, 0, rect_.width, rect_.height); @@ -436,9 +460,10 @@ framebuffer_ = 0; } - if (color_texture_) { - gl_->DeleteTextures(1, &color_texture_); - color_texture_ = 0; + if (!mailbox_.IsZero()) { + DCHECK(context_provider_); + auto* sii = context_provider_->data->SharedImageInterface(); + sii->DestroySharedImage(sync_token_, mailbox_); } }
diff --git a/content/shell/test_runner/test_plugin.h b/content/shell/test_runner/test_plugin.h index 4449870..f7d99b10 100644 --- a/content/shell/test_runner/test_plugin.h +++ b/content/shell/test_runner/test_plugin.h
@@ -9,6 +9,7 @@ #include <string> #include "base/macros.h" +#include "base/memory/ref_counted.h" #include "cc/layers/texture_layer.h" #include "cc/layers/texture_layer_client.h" #include "cc/resources/shared_bitmap_id_registrar.h" @@ -135,6 +136,9 @@ } }; + using ContextProviderRef = base::RefCountedData< + std::unique_ptr<blink::WebGraphicsContext3DProvider>>; + // Functions for parsing plugin parameters. Primitive ParsePrimitive(const blink::WebString& string); void ParseColor(const blink::WebString& string, uint8_t color[3]); @@ -159,15 +163,19 @@ cc::SharedBitmapIdRegistration registration, const gpu::SyncToken& sync_token, bool lost); + static void ReleaseSharedImage( + scoped_refptr<ContextProviderRef> context_provider, + const gpu::Mailbox& mailbox, + const gpu::SyncToken& sync_token, + bool lost); WebTestDelegate* delegate_; blink::WebPluginContainer* container_; blink::WebLocalFrame* web_local_frame_; blink::WebRect rect_; - std::unique_ptr<blink::WebGraphicsContext3DProvider> context_provider_; + scoped_refptr<ContextProviderRef> context_provider_; gpu::gles2::GLES2Interface* gl_; - GLuint color_texture_; gpu::Mailbox mailbox_; gpu::SyncToken sync_token_; scoped_refptr<cc::CrossThreadSharedBitmap> shared_bitmap_;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 4f8560e..f0ce32ba 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -795,15 +795,12 @@ "../browser/download/mhtml_generation_browsertest.cc", "../browser/download/save_package_browsertest.cc", "../browser/fileapi/file_system_browsertest.cc", - "../browser/frame_host/back_forward_cache_metrics_browsertest.cc", - - # These tests have incorrect threading (https://crbug.com/860547). - #"../browser/fileapi/file_system_url_loader_factory_browsertest.cc", - "../browser/fileapi/file_system_chooser_browsertest.cc", + "../browser/fileapi/file_system_url_loader_factory_browsertest.cc", "../browser/fileapi/fileapi_browsertest.cc", "../browser/find_request_manager_browsertest.cc", "../browser/font_unique_name_lookup/font_unique_name_browsertest.cc", + "../browser/frame_host/back_forward_cache_metrics_browsertest.cc", "../browser/frame_host/blocked_scheme_navigation_browsertest.cc", "../browser/frame_host/frame_tree_browsertest.cc", "../browser/frame_host/interstitial_page_impl_browsertest.cc",
diff --git a/content/test/navigation_simulator_impl.cc b/content/test/navigation_simulator_impl.cc index c522f7e..12143551 100644 --- a/content/test/navigation_simulator_impl.cc +++ b/content/test/navigation_simulator_impl.cc
@@ -1248,7 +1248,7 @@ // Note: Error pages must commit in a unique origin. So it is left unset. params->url_is_unreachable = true; } else { - params->origin = url::Origin::Create(navigation_url_); + params->origin = origin_.value_or(url::Origin::Create(navigation_url_)); params->redirects.push_back(navigation_url_); params->method = request_ ? request_->common_params().method : "GET"; params->http_status_code = 200;
diff --git a/content/test/navigation_simulator_impl.h b/content/test/navigation_simulator_impl.h index 565d15c..489d195 100644 --- a/content/test/navigation_simulator_impl.h +++ b/content/test/navigation_simulator_impl.h
@@ -149,6 +149,8 @@ void set_page_state(const PageState& page_state) { page_state_ = page_state; } + void set_origin(const url::Origin& origin) { origin_ = origin; } + private: NavigationSimulatorImpl(const GURL& original_url, bool browser_initiated, @@ -274,6 +276,7 @@ net::HttpResponseInfo::CONNECTION_INFO_UNKNOWN; base::Optional<net::SSLInfo> ssl_info_; base::Optional<PageState> page_state_; + base::Optional<url::Origin> origin_; bool auto_advance_ = true; bool drop_swap_out_ack_ = false;
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor.h b/device/bluetooth/bluetooth_remote_gatt_descriptor.h index b5fd813..fa44324c 100644 --- a/device/bluetooth/bluetooth_remote_gatt_descriptor.h +++ b/device/bluetooth/bluetooth_remote_gatt_descriptor.h
@@ -33,7 +33,7 @@ // The ValueCallback is used to return the value of a remote characteristic // descriptor upon a read request. - typedef base::Callback<void(const std::vector<uint8_t>&)> ValueCallback; + using ValueCallback = base::OnceCallback<void(const std::vector<uint8_t>&)>; // Returns the value of the descriptor. For remote descriptors, this is the // most recently cached value of the remote descriptor. For local descriptors @@ -48,7 +48,7 @@ // Sends a read request to a remote characteristic descriptor to read its // value. |callback| is called to return the read value on success and // |error_callback| is called for failures. - virtual void ReadRemoteDescriptor(const ValueCallback& callback, + virtual void ReadRemoteDescriptor(ValueCallback callback, ErrorCallback error_callback) = 0; // Sends a write request to a remote characteristic descriptor, to modify the @@ -57,7 +57,7 @@ // only applies to remote descriptors and will fail for those that are locally // hosted. virtual void WriteRemoteDescriptor(const std::vector<uint8_t>& new_value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) = 0; protected:
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_android.cc b/device/bluetooth/bluetooth_remote_gatt_descriptor_android.cc index 589449d..b01d6141 100644 --- a/device/bluetooth/bluetooth_remote_gatt_descriptor_android.cc +++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_android.cc
@@ -80,7 +80,7 @@ } void BluetoothRemoteGattDescriptorAndroid::ReadRemoteDescriptor( - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback) { if (read_pending_ || write_pending_) { base::ThreadTaskRunnerHandle::Get()->PostTask( @@ -100,13 +100,13 @@ } read_pending_ = true; - read_callback_ = callback; + read_callback_ = std::move(callback); read_error_callback_ = std::move(error_callback); } void BluetoothRemoteGattDescriptorAndroid::WriteRemoteDescriptor( const std::vector<uint8_t>& new_value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) { if (read_pending_ || write_pending_) { base::ThreadTaskRunnerHandle::Get()->PostTask( @@ -127,7 +127,7 @@ } write_pending_ = true; - write_callback_ = callback; + write_callback_ = std::move(callback); write_error_callback_ = std::move(error_callback); } @@ -139,14 +139,13 @@ read_pending_ = false; // Clear callbacks before calling to avoid reentrancy issues. - ValueCallback read_callback = read_callback_; + ValueCallback read_callback = std::move(read_callback_); ErrorCallback read_error_callback = std::move(read_error_callback_); - read_callback_.Reset(); if (status == 0 // android.bluetooth.BluetoothGatt.GATT_SUCCESS && !read_callback.is_null()) { base::android::JavaByteArrayToByteVector(env, value, &value_); - read_callback.Run(value_); + std::move(read_callback).Run(value_); // TODO(https://crbug.com/584369): Call GattDescriptorValueChanged. } else if (!read_error_callback.is_null()) { std::move(read_error_callback) @@ -161,13 +160,12 @@ write_pending_ = false; // Clear callbacks before calling to avoid reentrancy issues. - base::Closure write_callback = write_callback_; + base::OnceClosure write_callback = std::move(write_callback_); ErrorCallback write_error_callback = std::move(write_error_callback_); - write_callback_.Reset(); if (status == 0 // android.bluetooth.BluetoothGatt.GATT_SUCCESS && !write_callback.is_null()) { - write_callback.Run(); + std::move(write_callback).Run(); // TODO(https://crbug.com/584369): Call GattDescriptorValueChanged. } else if (!write_error_callback.is_null()) { std::move(write_error_callback)
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_android.h b/device/bluetooth/bluetooth_remote_gatt_descriptor_android.h index 322a2c4..b1e0672 100644 --- a/device/bluetooth/bluetooth_remote_gatt_descriptor_android.h +++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_android.h
@@ -47,10 +47,10 @@ BluetoothRemoteGattCharacteristic* GetCharacteristic() const override; BluetoothRemoteGattCharacteristic::Permissions GetPermissions() const override; - void ReadRemoteDescriptor(const ValueCallback& callback, + void ReadRemoteDescriptor(ValueCallback callback, ErrorCallback error_callback) override; void WriteRemoteDescriptor(const std::vector<uint8_t>& value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) override; // Called when Read operation completes. @@ -81,7 +81,7 @@ // WriteRemoteCharacteristic callbacks and pending state. bool write_pending_ = false; - base::Closure write_callback_; + base::OnceClosure write_callback_; ErrorCallback write_error_callback_; std::vector<uint8_t> value_;
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_mac.h b/device/bluetooth/bluetooth_remote_gatt_descriptor_mac.h index f558a66..92e4ac6 100644 --- a/device/bluetooth/bluetooth_remote_gatt_descriptor_mac.h +++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_mac.h
@@ -37,10 +37,10 @@ // BluetoothRemoteGattDescriptor const std::vector<uint8_t>& GetValue() const override; BluetoothRemoteGattCharacteristic* GetCharacteristic() const override; - void ReadRemoteDescriptor(const ValueCallback& callback, + void ReadRemoteDescriptor(ValueCallback callback, ErrorCallback error_callback) override; void WriteRemoteDescriptor(const std::vector<uint8_t>& new_value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) override; private: @@ -74,7 +74,7 @@ // ReadRemoteDescriptor request callbacks. std::pair<ValueCallback, ErrorCallback> read_value_callbacks_; // WriteRemoteDescriptor request callbacks. - std::pair<base::Closure, ErrorCallback> write_value_callbacks_; + std::pair<base::OnceClosure, ErrorCallback> write_value_callbacks_; }; // Stream operator for logging.
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_mac.mm b/device/bluetooth/bluetooth_remote_gatt_descriptor_mac.mm index a8f10f0..d072a89 100644 --- a/device/bluetooth/bluetooth_remote_gatt_descriptor_mac.mm +++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_mac.mm
@@ -93,7 +93,7 @@ // value. |callback| is called to return the read value on success and // |error_callback| is called for failures. void BluetoothRemoteGattDescriptorMac::ReadRemoteDescriptor( - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback) { if (value_read_or_write_in_progress_) { VLOG(1) << *this << ": Read failed, already in progress."; @@ -105,13 +105,14 @@ } VLOG(1) << *this << ": Read value."; value_read_or_write_in_progress_ = true; - read_value_callbacks_ = std::make_pair(callback, std::move(error_callback)); + read_value_callbacks_ = + std::make_pair(std::move(callback), std::move(error_callback)); [GetCBPeripheral() readValueForDescriptor:cb_descriptor_]; } void BluetoothRemoteGattDescriptorMac::WriteRemoteDescriptor( const std::vector<uint8_t>& value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) { if (value_read_or_write_in_progress_) { VLOG(1) << *this << ": Write failed, already in progress."; @@ -123,7 +124,8 @@ } VLOG(1) << *this << ": Write value."; value_read_or_write_in_progress_ = true; - write_value_callbacks_ = std::make_pair(callback, std::move(error_callback)); + write_value_callbacks_ = + std::make_pair(std::move(callback), std::move(error_callback)); base::scoped_nsobject<NSData> nsdata_value( [[NSData alloc] initWithBytes:value.data() length:value.size()]); [GetCBPeripheral() writeValue:nsdata_value forDescriptor:GetCBDescriptor()]; @@ -150,7 +152,7 @@ } VLOG(1) << *this << ": Value read."; value_ = VectorValueFromObjC([cb_descriptor_ value]); - callbacks.first.Run(value_); + std::move(callbacks.first).Run(value_); } void BluetoothRemoteGattDescriptorMac::DidWriteValueForDescriptor( @@ -159,7 +161,7 @@ VLOG(1) << *this << ": Value written, no write in progress."; return; } - std::pair<base::Closure, ErrorCallback> callbacks; + std::pair<base::OnceClosure, ErrorCallback> callbacks; callbacks.swap(write_value_callbacks_); value_read_or_write_in_progress_ = false; RecordDidWriteValueForDescriptorResult(error); @@ -173,7 +175,7 @@ return; } VLOG(1) << *this << ": Value written."; - callbacks.first.Run(); + std::move(callbacks.first).Run(); } CBPeripheral* BluetoothRemoteGattDescriptorMac::GetCBPeripheral() const {
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_win.cc b/device/bluetooth/bluetooth_remote_gatt_descriptor_win.cc index 5006f9f3..e577914 100644 --- a/device/bluetooth/bluetooth_remote_gatt_descriptor_win.cc +++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_win.cc
@@ -70,7 +70,7 @@ } void BluetoothRemoteGattDescriptorWin::ReadRemoteDescriptor( - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback) { DCHECK(ui_task_runner_->RunsTasksInCurrentSequence()); @@ -81,7 +81,7 @@ void BluetoothRemoteGattDescriptorWin::WriteRemoteDescriptor( const std::vector<uint8_t>& new_value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) { DCHECK(ui_task_runner_->RunsTasksInCurrentSequence());
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_win.h b/device/bluetooth/bluetooth_remote_gatt_descriptor_win.h index 98ad74a..5974482 100644 --- a/device/bluetooth/bluetooth_remote_gatt_descriptor_win.h +++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_win.h
@@ -38,10 +38,10 @@ BluetoothRemoteGattCharacteristic* GetCharacteristic() const override; BluetoothRemoteGattCharacteristic::Permissions GetPermissions() const override; - void ReadRemoteDescriptor(const ValueCallback& callback, + void ReadRemoteDescriptor(ValueCallback callback, ErrorCallback error_callback) override; void WriteRemoteDescriptor(const std::vector<uint8_t>& new_value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) override; uint16_t GetAttributeHandle() const;
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.cc b/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.cc index ca05ae7..85532b7 100644 --- a/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.cc +++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.cc
@@ -98,7 +98,7 @@ } void BluetoothRemoteGattDescriptorWinrt::ReadRemoteDescriptor( - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback) { if (pending_read_callbacks_ || pending_write_callbacks_) { base::ThreadTaskRunnerHandle::Get()->PostTask( @@ -137,12 +137,12 @@ } pending_read_callbacks_ = std::make_unique<PendingReadCallbacks>( - callback, std::move(error_callback)); + std::move(callback), std::move(error_callback)); } void BluetoothRemoteGattDescriptorWinrt::WriteRemoteDescriptor( const std::vector<uint8_t>& value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) { if (pending_read_callbacks_ || pending_write_callbacks_) { base::ThreadTaskRunnerHandle::Get()->PostTask( @@ -205,7 +205,7 @@ } pending_write_callbacks_ = std::make_unique<PendingWriteCallbacks>( - callback, std::move(error_callback)); + std::move(callback), std::move(error_callback)); } IGattDescriptor* BluetoothRemoteGattDescriptorWinrt::GetDescriptorForTesting() { @@ -307,7 +307,7 @@ } value_.assign(data, data + length); - pending_read_callbacks->callback.Run(value_); + std::move(pending_read_callbacks->callback).Run(value_); } void BluetoothRemoteGattDescriptorWinrt::OnWriteValueWithResult(
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.h b/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.h index 9d541fb..9195387 100644 --- a/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.h +++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.h
@@ -42,10 +42,10 @@ // BluetoothRemoteGattDescriptor: const std::vector<uint8_t>& GetValue() const override; BluetoothRemoteGattCharacteristic* GetCharacteristic() const override; - void ReadRemoteDescriptor(const ValueCallback& callback, + void ReadRemoteDescriptor(ValueCallback callback, ErrorCallback error_callback) override; void WriteRemoteDescriptor(const std::vector<uint8_t>& value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) override; ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::IGattDescriptor*
diff --git a/device/bluetooth/bluez/bluetooth_remote_gatt_descriptor_bluez.cc b/device/bluetooth/bluez/bluetooth_remote_gatt_descriptor_bluez.cc index a0f50caf..eedf09f5 100644 --- a/device/bluetooth/bluez/bluetooth_remote_gatt_descriptor_bluez.cc +++ b/device/bluetooth/bluez/bluetooth_remote_gatt_descriptor_bluez.cc
@@ -82,14 +82,14 @@ } void BluetoothRemoteGattDescriptorBlueZ::ReadRemoteDescriptor( - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback) { VLOG(1) << "Sending GATT characteristic descriptor read request to " << "descriptor: " << GetIdentifier() << ", UUID: " << GetUUID().canonical_value(); bluez::BluezDBusManager::Get()->GetBluetoothGattDescriptorClient()->ReadValue( - object_path(), callback, + object_path(), std::move(callback), base::BindOnce(&BluetoothRemoteGattDescriptorBlueZ::OnError, weak_ptr_factory_.GetWeakPtr(), std::move(error_callback))); @@ -97,7 +97,7 @@ void BluetoothRemoteGattDescriptorBlueZ::WriteRemoteDescriptor( const std::vector<uint8_t>& new_value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) { VLOG(1) << "Sending GATT characteristic descriptor write request to " << "characteristic: " << GetIdentifier() @@ -106,7 +106,7 @@ bluez::BluezDBusManager::Get() ->GetBluetoothGattDescriptorClient() - ->WriteValue(object_path(), new_value, callback, + ->WriteValue(object_path(), new_value, std::move(callback), base::BindOnce(&BluetoothRemoteGattDescriptorBlueZ::OnError, weak_ptr_factory_.GetWeakPtr(), std::move(error_callback)));
diff --git a/device/bluetooth/bluez/bluetooth_remote_gatt_descriptor_bluez.h b/device/bluetooth/bluez/bluetooth_remote_gatt_descriptor_bluez.h index 6b77dbe..4242501 100644 --- a/device/bluetooth/bluez/bluetooth_remote_gatt_descriptor_bluez.h +++ b/device/bluetooth/bluez/bluetooth_remote_gatt_descriptor_bluez.h
@@ -35,10 +35,10 @@ device::BluetoothRemoteGattCharacteristic* GetCharacteristic() const override; device::BluetoothRemoteGattCharacteristic::Permissions GetPermissions() const override; - void ReadRemoteDescriptor(const ValueCallback& callback, + void ReadRemoteDescriptor(ValueCallback callback, ErrorCallback error_callback) override; void WriteRemoteDescriptor(const std::vector<uint8_t>& new_value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) override; private:
diff --git a/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.cc b/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.cc index 1f53f9f1..ac7010d 100644 --- a/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.cc +++ b/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.cc
@@ -50,33 +50,34 @@ } void BluetoothRemoteGattDescriptorCast::ReadRemoteDescriptor( - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback) { - remote_descriptor_->Read(base::BindOnce( - &BluetoothRemoteGattDescriptorCast::OnReadRemoteDescriptor, - weak_factory_.GetWeakPtr(), callback, std::move(error_callback))); + remote_descriptor_->Read( + base::BindOnce(&BluetoothRemoteGattDescriptorCast::OnReadRemoteDescriptor, + weak_factory_.GetWeakPtr(), std::move(callback), + std::move(error_callback))); } void BluetoothRemoteGattDescriptorCast::WriteRemoteDescriptor( const std::vector<uint8_t>& new_value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) { remote_descriptor_->Write( new_value, base::BindOnce( &BluetoothRemoteGattDescriptorCast::OnWriteRemoteDescriptor, - weak_factory_.GetWeakPtr(), new_value, callback, + weak_factory_.GetWeakPtr(), new_value, std::move(callback), std::move(error_callback))); } void BluetoothRemoteGattDescriptorCast::OnReadRemoteDescriptor( - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback, bool success, const std::vector<uint8_t>& result) { if (success) { value_ = result; - callback.Run(result); + std::move(callback).Run(result); return; } std::move(error_callback).Run(BluetoothGattService::GATT_ERROR_FAILED); @@ -84,12 +85,12 @@ void BluetoothRemoteGattDescriptorCast::OnWriteRemoteDescriptor( const std::vector<uint8_t>& written_value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback, bool success) { if (success) { value_ = written_value; - callback.Run(); + std::move(callback).Run(); return; } std::move(error_callback).Run(BluetoothGattService::GATT_ERROR_FAILED);
diff --git a/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.h b/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.h index e1561a6..d74bcaf 100644 --- a/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.h +++ b/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.h
@@ -40,10 +40,10 @@ // BluetoothRemoteGattDescriptor implementation: const std::vector<uint8_t>& GetValue() const override; BluetoothRemoteGattCharacteristic* GetCharacteristic() const override; - void ReadRemoteDescriptor(const ValueCallback& callback, + void ReadRemoteDescriptor(ValueCallback callback, ErrorCallback error_callback) override; void WriteRemoteDescriptor(const std::vector<uint8_t>& new_value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) override; private: @@ -52,7 +52,7 @@ // valid. In this case, |value_| is updated and |callback| is run with // |result|. If |success| is false, |result| is ignored and |error_callback| // is run. - void OnReadRemoteDescriptor(const ValueCallback& callback, + void OnReadRemoteDescriptor(ValueCallback callback, ErrorCallback error_callback, bool success, const std::vector<uint8_t>& result); @@ -62,7 +62,7 @@ // WriteRemoteDescriptor(), and |success| is true if the write was successful. // If successful, |value_| will be updated. void OnWriteRemoteDescriptor(const std::vector<uint8_t>& written_value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback, bool success);
diff --git a/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.cc b/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.cc index 520259a..e3c41e56 100644 --- a/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.cc +++ b/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.cc
@@ -88,7 +88,7 @@ // BluetoothGattDescriptorClientImpl override. void ReadValue(const dbus::ObjectPath& object_path, - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback) override { dbus::ObjectProxy* object_proxy = object_manager_->GetObjectProxy(object_path); @@ -109,7 +109,7 @@ object_proxy->CallMethodWithErrorCallback( &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, base::BindOnce(&BluetoothGattDescriptorClientImpl::OnValueSuccess, - weak_ptr_factory_.GetWeakPtr(), callback), + weak_ptr_factory_.GetWeakPtr(), std::move(callback)), base::BindOnce(&BluetoothGattDescriptorClientImpl::OnError, weak_ptr_factory_.GetWeakPtr(), std::move(error_callback))); @@ -118,7 +118,7 @@ // BluetoothGattDescriptorClientImpl override. void WriteValue(const dbus::ObjectPath& object_path, const std::vector<uint8_t>& value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) override { dbus::ObjectProxy* object_proxy = object_manager_->GetObjectProxy(object_path); @@ -140,7 +140,7 @@ object_proxy->CallMethodWithErrorCallback( &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, base::BindOnce(&BluetoothGattDescriptorClientImpl::OnSuccess, - weak_ptr_factory_.GetWeakPtr(), callback), + weak_ptr_factory_.GetWeakPtr(), std::move(callback)), base::BindOnce(&BluetoothGattDescriptorClientImpl::OnError, weak_ptr_factory_.GetWeakPtr(), std::move(error_callback))); @@ -199,14 +199,14 @@ } // Called when a response for a successful method call is received. - void OnSuccess(const base::Closure& callback, dbus::Response* response) { + void OnSuccess(base::OnceClosure callback, dbus::Response* response) { DCHECK(response); - callback.Run(); + std::move(callback).Run(); } // Called when a descriptor value response for a successful method call is // received. - void OnValueSuccess(const ValueCallback& callback, dbus::Response* response) { + void OnValueSuccess(ValueCallback callback, dbus::Response* response) { DCHECK(response); dbus::MessageReader reader(response); @@ -221,7 +221,7 @@ if (bytes) value.assign(bytes, bytes + length); - callback.Run(value); + std::move(callback).Run(value); } // Called when a response for a failed method call is received.
diff --git a/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.h b/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.h index cf424f6..b9f9a96 100644 --- a/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.h +++ b/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.h
@@ -68,7 +68,8 @@ using ErrorCallback = base::OnceCallback<void(const std::string& error_name, const std::string& error_message)>; - typedef base::Callback<void(const std::vector<uint8_t>& value)> ValueCallback; + using ValueCallback = + base::OnceCallback<void(const std::vector<uint8_t>& value)>; ~BluetoothGattDescriptorClient() override; @@ -89,7 +90,7 @@ // |object_path| and returns the value in |callback| on success. On error, // invokes |error_callback|. virtual void ReadValue(const dbus::ObjectPath& object_path, - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback) = 0; // Issues a request to write the value of GATT descriptor with object path @@ -97,7 +98,7 @@ // |error_callback| on failure. virtual void WriteValue(const dbus::ObjectPath& object_path, const std::vector<uint8_t>& value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) = 0; // Creates the instance.
diff --git a/device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.cc b/device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.cc index dd804f8..fa46713 100644 --- a/device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.cc +++ b/device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.cc
@@ -96,7 +96,7 @@ void FakeBluetoothGattDescriptorClient::ReadValue( const dbus::ObjectPath& object_path, - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback) { auto iter = properties_.find(object_path); if (iter == properties_.end()) { @@ -122,13 +122,13 @@ } } - callback.Run(iter->second->properties->value.value()); + std::move(callback).Run(iter->second->properties->value.value()); } void FakeBluetoothGattDescriptorClient::WriteValue( const dbus::ObjectPath& object_path, const std::vector<uint8_t>& value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) { if (properties_.find(object_path) == properties_.end()) { std::move(error_callback).Run(kUnknownDescriptorError, "");
diff --git a/device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.h b/device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.h index 43cc07b..a1ae410db 100644 --- a/device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.h +++ b/device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.h
@@ -50,11 +50,11 @@ std::vector<dbus::ObjectPath> GetDescriptors() override; Properties* GetProperties(const dbus::ObjectPath& object_path) override; void ReadValue(const dbus::ObjectPath& object_path, - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback) override; void WriteValue(const dbus::ObjectPath& object_path, const std::vector<uint8_t>& value, - const base::Closure& callback, + base::OnceClosure callback, ErrorCallback error_callback) override; // Makes the descriptor with the UUID |uuid| visible under the characteristic
diff --git a/device/bluetooth/test/fake_remote_gatt_descriptor.cc b/device/bluetooth/test/fake_remote_gatt_descriptor.cc index 406464b..4a704c0 100644 --- a/device/bluetooth/test/fake_remote_gatt_descriptor.cc +++ b/device/bluetooth/test/fake_remote_gatt_descriptor.cc
@@ -64,27 +64,28 @@ } void FakeRemoteGattDescriptor::ReadRemoteDescriptor( - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback) { base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(&FakeRemoteGattDescriptor::DispatchReadResponse, - weak_ptr_factory_.GetWeakPtr(), callback, - std::move(error_callback))); + FROM_HERE, + base::BindOnce(&FakeRemoteGattDescriptor::DispatchReadResponse, + weak_ptr_factory_.GetWeakPtr(), std::move(callback), + std::move(error_callback))); } void FakeRemoteGattDescriptor::WriteRemoteDescriptor( const std::vector<uint8_t>& value, - const base::RepeatingClosure& callback, + base::OnceClosure callback, ErrorCallback error_callback) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&FakeRemoteGattDescriptor::DispatchWriteResponse, - weak_ptr_factory_.GetWeakPtr(), callback, + weak_ptr_factory_.GetWeakPtr(), std::move(callback), std::move(error_callback), value)); } void FakeRemoteGattDescriptor::DispatchReadResponse( - const ValueCallback& callback, + ValueCallback callback, ErrorCallback error_callback) { DCHECK(next_read_response_); uint16_t gatt_code = next_read_response_->gatt_code(); @@ -94,7 +95,7 @@ if (gatt_code == mojom::kGATTSuccess) { DCHECK(value); value_ = std::move(value.value()); - callback.Run(value_); + std::move(callback).Run(value_); return; } else if (gatt_code == mojom::kGATTInvalidHandle) { DCHECK(!value); @@ -105,7 +106,7 @@ } void FakeRemoteGattDescriptor::DispatchWriteResponse( - const base::RepeatingClosure& callback, + base::OnceClosure callback, ErrorCallback error_callback, const std::vector<uint8_t>& value) { DCHECK(next_write_response_); @@ -115,7 +116,7 @@ switch (gatt_code) { case mojom::kGATTSuccess: last_written_value_ = value; - callback.Run(); + std::move(callback).Run(); break; case mojom::kGATTInvalidHandle: std::move(error_callback)
diff --git a/device/bluetooth/test/fake_remote_gatt_descriptor.h b/device/bluetooth/test/fake_remote_gatt_descriptor.h index 5bfa694..0ef5ed5 100644 --- a/device/bluetooth/test/fake_remote_gatt_descriptor.h +++ b/device/bluetooth/test/fake_remote_gatt_descriptor.h
@@ -57,17 +57,17 @@ // device::BluetoothRemoteGattDescriptor overrides: const std::vector<uint8_t>& GetValue() const override; device::BluetoothRemoteGattCharacteristic* GetCharacteristic() const override; - void ReadRemoteDescriptor(const ValueCallback& callback, + void ReadRemoteDescriptor(ValueCallback callback, ErrorCallback error_callback) override; void WriteRemoteDescriptor(const std::vector<uint8_t>& value, - const base::RepeatingClosure& callback, + base::OnceClosure callback, ErrorCallback error_callback) override; private: - void DispatchReadResponse(const ValueCallback& callback, + void DispatchReadResponse(ValueCallback callback, ErrorCallback error_callback); - void DispatchWriteResponse(const base::RepeatingClosure& callback, + void DispatchWriteResponse(base::OnceClosure callback, ErrorCallback error_callback, const std::vector<uint8_t>& value);
diff --git a/device/bluetooth/test/mock_bluetooth_gatt_descriptor.h b/device/bluetooth/test/mock_bluetooth_gatt_descriptor.h index 2ef1141..565b108 100644 --- a/device/bluetooth/test/mock_bluetooth_gatt_descriptor.h +++ b/device/bluetooth/test/mock_bluetooth_gatt_descriptor.h
@@ -38,19 +38,18 @@ MOCK_CONST_METHOD0(GetCharacteristic, BluetoothRemoteGattCharacteristic*()); MOCK_CONST_METHOD0(GetPermissions, BluetoothRemoteGattCharacteristic::Permissions()); - void ReadRemoteDescriptor(const ValueCallback& c, ErrorCallback ec) override { + void ReadRemoteDescriptor(ValueCallback c, ErrorCallback ec) override { ReadRemoteDescriptor_(c, ec); } - MOCK_METHOD2(ReadRemoteDescriptor_, - void(const ValueCallback&, ErrorCallback&)); + MOCK_METHOD2(ReadRemoteDescriptor_, void(ValueCallback&, ErrorCallback&)); void WriteRemoteDescriptor(const std::vector<uint8_t>& v, - const base::Closure& c, + base::OnceClosure c, ErrorCallback ec) override { WriteRemoteDescriptor_(v, c, ec); } MOCK_METHOD3(WriteRemoteDescriptor_, void(const std::vector<uint8_t>&, - const base::Closure&, + base::OnceClosure&, ErrorCallback&)); private:
diff --git a/device/fido/ctap2_device_operation.h b/device/fido/ctap2_device_operation.h index 20f110e..3d9c1ad1 100644 --- a/device/fido/ctap2_device_operation.h +++ b/device/fido/ctap2_device_operation.h
@@ -31,9 +31,9 @@ namespace device { // Ctap2DeviceOperation performs a single request--response operation on a CTAP2 -// device. The |Request| class must implement an |EncodeToCBOR| method that -// returns a pair of |CtapRequestCommand| and an optional CBOR |Value|. -// The response will be parsed to CBOR and then further parsed into a |Response| +// device. The |Request| class must implement a static |EncodeToCBOR| method +// that returns a pair of |CtapRequestCommand| and an optional CBOR |Value|. The +// response will be parsed to CBOR and then further parsed into a |Response| // using a provided callback. template <class Request, class Response> class Ctap2DeviceOperation : public DeviceOperation<Request, Response> { @@ -76,7 +76,7 @@ void Start() override { std::pair<CtapRequestCommand, base::Optional<cbor::Value>> request( - this->request().EncodeAsCBOR()); + Request::EncodeAsCBOR(this->request())); std::vector<uint8_t> request_bytes; // TODO: it would be nice to see which device each request is going to, but
diff --git a/device/fido/ctap_get_assertion_request.cc b/device/fido/ctap_get_assertion_request.cc index 32fb4ac7..37ba8b9 100644 --- a/device/fido/ctap_get_assertion_request.cc +++ b/device/fido/ctap_get_assertion_request.cc
@@ -15,12 +15,13 @@ namespace device { -CtapGetAssertionRequest::CtapGetAssertionRequest(std::string rp_id, - std::string client_data_json) - : rp_id_(std::move(rp_id)), - client_data_json_(std::move(client_data_json)), - client_data_hash_( - fido_parsing_utils::CreateSHA256Hash(client_data_json_)) {} +CtapGetAssertionRequest::CtapGetAssertionRequest( + std::string in_rp_id, + std::string in_client_data_json) + : rp_id(std::move(in_rp_id)), + client_data_json(std::move(in_client_data_json)), + client_data_hash(fido_parsing_utils::CreateSHA256Hash(client_data_json)) { +} CtapGetAssertionRequest::CtapGetAssertionRequest( const CtapGetAssertionRequest& that) = default; @@ -36,38 +37,39 @@ CtapGetAssertionRequest::~CtapGetAssertionRequest() = default; +// static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> -CtapGetAssertionRequest::EncodeAsCBOR() const { +CtapGetAssertionRequest::EncodeAsCBOR(const CtapGetAssertionRequest& request) { cbor::Value::MapValue cbor_map; - cbor_map[cbor::Value(1)] = cbor::Value(rp_id_); - cbor_map[cbor::Value(2)] = cbor::Value(client_data_hash_); + cbor_map[cbor::Value(1)] = cbor::Value(request.rp_id); + cbor_map[cbor::Value(2)] = cbor::Value(request.client_data_hash); - if (allow_list_ && !allow_list_->empty()) { + if (request.allow_list && !request.allow_list->empty()) { cbor::Value::ArrayValue allow_list_array; - for (const auto& descriptor : *allow_list_) { + for (const auto& descriptor : *request.allow_list) { allow_list_array.push_back(descriptor.ConvertToCBOR()); } cbor_map[cbor::Value(3)] = cbor::Value(std::move(allow_list_array)); } - if (pin_auth_) { - cbor_map[cbor::Value(6)] = cbor::Value(*pin_auth_); + if (request.pin_auth) { + cbor_map[cbor::Value(6)] = cbor::Value(*request.pin_auth); } - if (pin_protocol_) { - cbor_map[cbor::Value(7)] = cbor::Value(*pin_protocol_); + if (request.pin_protocol) { + cbor_map[cbor::Value(7)] = cbor::Value(*request.pin_protocol); } cbor::Value::MapValue option_map; // User presence is required by default. - if (!user_presence_required_) { + if (!request.user_presence_required) { option_map[cbor::Value(kUserPresenceMapKey)] = - cbor::Value(user_presence_required_); + cbor::Value(request.user_presence_required); } // User verification is not required by default. - if (user_verification_ == UserVerificationRequirement::kRequired) { + if (request.user_verification == UserVerificationRequirement::kRequired) { option_map[cbor::Value(kUserVerificationMapKey)] = cbor::Value(true); } @@ -79,60 +81,9 @@ cbor::Value(std::move(cbor_map))); } -CtapGetAssertionRequest& CtapGetAssertionRequest::SetUserVerification( - UserVerificationRequirement user_verification) { - user_verification_ = user_verification; - return *this; -} - -CtapGetAssertionRequest& CtapGetAssertionRequest::SetUserPresenceRequired( - bool user_presence_required) { - user_presence_required_ = user_presence_required; - return *this; -} - -CtapGetAssertionRequest& CtapGetAssertionRequest::SetAllowList( - std::vector<PublicKeyCredentialDescriptor> allow_list) { - allow_list_ = std::move(allow_list); - return *this; -} - -CtapGetAssertionRequest& CtapGetAssertionRequest::SetPinAuth( - std::vector<uint8_t> pin_auth) { - pin_auth_ = std::move(pin_auth); - return *this; -} - -CtapGetAssertionRequest& CtapGetAssertionRequest::SetPinProtocol( - uint8_t pin_protocol) { - pin_protocol_ = pin_protocol; - return *this; -} - -CtapGetAssertionRequest& CtapGetAssertionRequest::SetCableExtension( - std::vector<CableDiscoveryData> cable_extension) { - cable_extension_ = std::move(cable_extension); - return *this; -} - -CtapGetAssertionRequest& CtapGetAssertionRequest::SetAppId(std::string app_id) { - app_id_ = std::move(app_id); - alternative_application_parameter_ = - std::array<uint8_t, crypto::kSHA256Length>(); - crypto::SHA256HashString(*app_id_, alternative_application_parameter_->data(), - alternative_application_parameter_->size()); - return *this; -} - -bool CtapGetAssertionRequest::CheckResponseRpIdHash( - const std::array<uint8_t, kRpIdHashLength>& response_rp_id_hash) const { - return response_rp_id_hash == fido_parsing_utils::CreateSHA256Hash(rp_id_) || - (app_id_ && - response_rp_id_hash == *alternative_application_parameter()); -} - +// static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> -CtapGetNextAssertionRequest::EncodeAsCBOR() const { +CtapGetNextAssertionRequest::EncodeAsCBOR(const CtapGetNextAssertionRequest&) { return std::make_pair(CtapRequestCommand::kAuthenticatorGetNextAssertion, base::nullopt); }
diff --git a/device/fido/ctap_get_assertion_request.h b/device/fido/ctap_get_assertion_request.h index d6131e0..95791e0 100644 --- a/device/fido/ctap_get_assertion_request.h +++ b/device/fido/ctap_get_assertion_request.h
@@ -29,7 +29,7 @@ // Object that encapsulates request parameters for AuthenticatorGetAssertion as // specified in the CTAP spec. // https://fidoalliance.org/specs/fido-v2.0-rd-20161004/fido-client-to-authenticator-protocol-v2.0-rd-20161004.html#authenticatorgetassertion -class COMPONENT_EXPORT(DEVICE_FIDO) CtapGetAssertionRequest { +struct COMPONENT_EXPORT(DEVICE_FIDO) CtapGetAssertionRequest { public: using ClientDataHash = std::array<uint8_t, kClientDataHashLength>; @@ -43,84 +43,31 @@ // Serializes GetAssertion request parameter into CBOR encoded map with // integer keys and CBOR encoded values as defined by the CTAP spec. // https://drafts.fidoalliance.org/fido-2/latest/fido-client-to-authenticator-protocol-v2.0-wd-20180305.html#authenticatorGetAssertion - std::pair<CtapRequestCommand, base::Optional<cbor::Value>> EncodeAsCBOR() - const; + static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> + EncodeAsCBOR(const CtapGetAssertionRequest& request); - CtapGetAssertionRequest& SetUserVerification( - UserVerificationRequirement user_verfication); - CtapGetAssertionRequest& SetUserPresenceRequired(bool user_presence_required); - CtapGetAssertionRequest& SetAllowList( - std::vector<PublicKeyCredentialDescriptor> allow_list); - CtapGetAssertionRequest& SetPinAuth(std::vector<uint8_t> pin_auth); - CtapGetAssertionRequest& SetPinProtocol(uint8_t pin_protocol); - CtapGetAssertionRequest& SetCableExtension( - std::vector<CableDiscoveryData> cable_extension); - CtapGetAssertionRequest& SetAppId(std::string app_id); - - // Return true if the given RP ID hash from a response is valid for this - // request. - bool CheckResponseRpIdHash( - const std::array<uint8_t, kRpIdHashLength>& response_rp_id_hash) const; - - const std::string& rp_id() const { return rp_id_; } - const std::string& client_data_json() const { return client_data_json_; } - const std::array<uint8_t, kClientDataHashLength>& client_data_hash() const { - return client_data_hash_; - } - - UserVerificationRequirement user_verification() const { - return user_verification_; - } - - bool user_presence_required() const { return user_presence_required_; } - const base::Optional<std::vector<PublicKeyCredentialDescriptor>>& allow_list() - const { - return allow_list_; - } - - const base::Optional<std::vector<uint8_t>>& pin_auth() const { - return pin_auth_; - } - - const base::Optional<uint8_t>& pin_protocol() const { return pin_protocol_; } - const base::Optional<std::vector<CableDiscoveryData>>& cable_extension() - const { - return cable_extension_; - } - const base::Optional<std::array<uint8_t, kRpIdHashLength>>& - alternative_application_parameter() const { - return alternative_application_parameter_; - } - const base::Optional<std::string>& app_id() const { return app_id_; } - - bool is_incognito_mode() const { return is_incognito_mode_; } - void set_is_incognito_mode(bool is_incognito_mode) { - is_incognito_mode_ = is_incognito_mode; - } - - private: - std::string rp_id_; - std::string client_data_json_; - std::array<uint8_t, kClientDataHashLength> client_data_hash_; - UserVerificationRequirement user_verification_ = + std::string rp_id; + std::string client_data_json; + std::array<uint8_t, kClientDataHashLength> client_data_hash; + UserVerificationRequirement user_verification = UserVerificationRequirement::kDiscouraged; - bool user_presence_required_ = true; + bool user_presence_required = true; - base::Optional<std::vector<PublicKeyCredentialDescriptor>> allow_list_; - base::Optional<std::vector<uint8_t>> pin_auth_; - base::Optional<uint8_t> pin_protocol_; - base::Optional<std::vector<CableDiscoveryData>> cable_extension_; - base::Optional<std::string> app_id_; + base::Optional<std::vector<PublicKeyCredentialDescriptor>> allow_list; + base::Optional<std::vector<uint8_t>> pin_auth; + base::Optional<uint8_t> pin_protocol; + base::Optional<std::vector<CableDiscoveryData>> cable_extension; + base::Optional<std::string> app_id; base::Optional<std::array<uint8_t, crypto::kSHA256Length>> - alternative_application_parameter_; + alternative_application_parameter; - bool is_incognito_mode_ = false; + bool is_incognito_mode = false; }; -class CtapGetNextAssertionRequest { +struct CtapGetNextAssertionRequest { public: - std::pair<CtapRequestCommand, base::Optional<cbor::Value>> EncodeAsCBOR() - const; + static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> + EncodeAsCBOR(const CtapGetNextAssertionRequest&); }; } // namespace device
diff --git a/device/fido/ctap_make_credential_request.cc b/device/fido/ctap_make_credential_request.cc index f6bac1d..ef8a693 100644 --- a/device/fido/ctap_make_credential_request.cc +++ b/device/fido/ctap_make_credential_request.cc
@@ -16,16 +16,16 @@ namespace device { CtapMakeCredentialRequest::CtapMakeCredentialRequest( - std::string client_data_json, - PublicKeyCredentialRpEntity rp, - PublicKeyCredentialUserEntity user, - PublicKeyCredentialParams public_key_credential_params) - : client_data_json_(std::move(client_data_json)), - client_data_hash_( - fido_parsing_utils::CreateSHA256Hash(client_data_json_)), - rp_(std::move(rp)), - user_(std::move(user)), - public_key_credential_params_(std::move(public_key_credential_params)) {} + std::string in_client_data_json, + PublicKeyCredentialRpEntity in_rp, + PublicKeyCredentialUserEntity in_user, + PublicKeyCredentialParams in_public_key_credential_params) + : client_data_json(std::move(in_client_data_json)), + client_data_hash(fido_parsing_utils::CreateSHA256Hash(client_data_json)), + rp(std::move(in_rp)), + user(std::move(in_user)), + public_key_credential_params(std::move(in_public_key_credential_params)) { +} CtapMakeCredentialRequest::CtapMakeCredentialRequest( const CtapMakeCredentialRequest& that) = default; @@ -41,46 +41,49 @@ CtapMakeCredentialRequest::~CtapMakeCredentialRequest() = default; +// static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> -CtapMakeCredentialRequest::EncodeAsCBOR() const { +CtapMakeCredentialRequest::EncodeAsCBOR( + const CtapMakeCredentialRequest& request) { cbor::Value::MapValue cbor_map; - cbor_map[cbor::Value(1)] = cbor::Value(client_data_hash_); - cbor_map[cbor::Value(2)] = rp_.ConvertToCBOR(); + cbor_map[cbor::Value(1)] = cbor::Value(request.client_data_hash); + cbor_map[cbor::Value(2)] = request.rp.ConvertToCBOR(); cbor_map[cbor::Value(3)] = - PublicKeyCredentialUserEntity::ConvertToCBOR(user_); - cbor_map[cbor::Value(4)] = public_key_credential_params_.ConvertToCBOR(); - if (exclude_list_) { + PublicKeyCredentialUserEntity::ConvertToCBOR(request.user); + cbor_map[cbor::Value(4)] = + request.public_key_credential_params.ConvertToCBOR(); + if (request.exclude_list) { cbor::Value::ArrayValue exclude_list_array; - for (const auto& descriptor : *exclude_list_) { + for (const auto& descriptor : *request.exclude_list) { exclude_list_array.push_back(descriptor.ConvertToCBOR()); } cbor_map[cbor::Value(5)] = cbor::Value(std::move(exclude_list_array)); } - if (hmac_secret_) { + if (request.hmac_secret) { cbor::Value::MapValue extensions; extensions[cbor::Value(kExtensionHmacSecret)] = cbor::Value(true); cbor_map[cbor::Value(6)] = cbor::Value(std::move(extensions)); } - if (pin_auth_) { - cbor_map[cbor::Value(8)] = cbor::Value(*pin_auth_); + if (request.pin_auth) { + cbor_map[cbor::Value(8)] = cbor::Value(*request.pin_auth); } - if (pin_protocol_) { - cbor_map[cbor::Value(9)] = cbor::Value(*pin_protocol_); + if (request.pin_protocol) { + cbor_map[cbor::Value(9)] = cbor::Value(*request.pin_protocol); } cbor::Value::MapValue option_map; // Resident keys are not required by default. - if (resident_key_required_) { + if (request.resident_key_required) { option_map[cbor::Value(kResidentKeyMapKey)] = - cbor::Value(resident_key_required_); + cbor::Value(request.resident_key_required); } // User verification is not required by default. - if (user_verification_ == UserVerificationRequirement::kRequired) { + if (request.user_verification == UserVerificationRequirement::kRequired) { option_map[cbor::Value(kUserVerificationMapKey)] = cbor::Value(true); } @@ -92,47 +95,4 @@ cbor::Value(std::move(cbor_map))); } -CtapMakeCredentialRequest& -CtapMakeCredentialRequest::SetAuthenticatorAttachment( - AuthenticatorAttachment authenticator_attachment) { - authenticator_attachment_ = authenticator_attachment; - return *this; -} - -CtapMakeCredentialRequest& CtapMakeCredentialRequest::SetUserVerification( - UserVerificationRequirement user_verification) { - user_verification_ = user_verification; - return *this; -} - -CtapMakeCredentialRequest& CtapMakeCredentialRequest::SetResidentKeyRequired( - bool resident_key_required) { - resident_key_required_ = resident_key_required; - return *this; -} - -CtapMakeCredentialRequest& CtapMakeCredentialRequest::SetExcludeList( - std::vector<PublicKeyCredentialDescriptor> exclude_list) { - exclude_list_ = std::move(exclude_list); - return *this; -} - -CtapMakeCredentialRequest& CtapMakeCredentialRequest::SetPinAuth( - std::vector<uint8_t> pin_auth) { - pin_auth_ = std::move(pin_auth); - return *this; -} - -CtapMakeCredentialRequest& CtapMakeCredentialRequest::SetPinProtocol( - uint8_t pin_protocol) { - pin_protocol_ = pin_protocol; - return *this; -} - -CtapMakeCredentialRequest& CtapMakeCredentialRequest::SetHmacSecret( - bool hmac_secret) { - hmac_secret_ = hmac_secret; - return *this; -} - } // namespace device
diff --git a/device/fido/ctap_make_credential_request.h b/device/fido/ctap_make_credential_request.h index e51050b4..25dda96 100644 --- a/device/fido/ctap_make_credential_request.h +++ b/device/fido/ctap_make_credential_request.h
@@ -30,7 +30,7 @@ // Object containing request parameters for AuthenticatorMakeCredential command // as specified in // https://fidoalliance.org/specs/fido-v2.0-rd-20170927/fido-client-to-authenticator-protocol-v2.0-rd-20170927.html -class COMPONENT_EXPORT(DEVICE_FIDO) CtapMakeCredentialRequest { +struct COMPONENT_EXPORT(DEVICE_FIDO) CtapMakeCredentialRequest { public: using ClientDataHash = std::array<uint8_t, kClientDataHashLength>; @@ -48,86 +48,32 @@ // Serializes MakeCredential request parameter into CBOR encoded map with // integer keys and CBOR encoded values as defined by the CTAP spec. // https://drafts.fidoalliance.org/fido-2/latest/fido-client-to-authenticator-protocol-v2.0-wd-20180305.html#authenticatorMakeCredential - std::pair<CtapRequestCommand, base::Optional<cbor::Value>> EncodeAsCBOR() - const; + static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> + EncodeAsCBOR(const CtapMakeCredentialRequest& request); - CtapMakeCredentialRequest& SetAuthenticatorAttachment( - AuthenticatorAttachment authenticator_attachment); - CtapMakeCredentialRequest& SetUserVerification( - UserVerificationRequirement user_verification); - CtapMakeCredentialRequest& SetResidentKeyRequired(bool resident_key); - CtapMakeCredentialRequest& SetExcludeList( - std::vector<PublicKeyCredentialDescriptor> exclude_list); - CtapMakeCredentialRequest& SetPinAuth(std::vector<uint8_t> pin_auth); - CtapMakeCredentialRequest& SetPinProtocol(uint8_t pin_protocol); - CtapMakeCredentialRequest& SetHmacSecret(bool hmac_secret); - - const std::string& client_data_json() const { return client_data_json_; } - const std::array<uint8_t, kClientDataHashLength>& client_data_hash() const { - return client_data_hash_; - } - const PublicKeyCredentialRpEntity& rp() const { return rp_; } - const PublicKeyCredentialUserEntity user() const { return user_; } - const PublicKeyCredentialParams& public_key_credential_params() const { - return public_key_credential_params_; - } - UserVerificationRequirement user_verification() const { - return user_verification_; - } - AuthenticatorAttachment authenticator_attachment() const { - return authenticator_attachment_; - } - bool resident_key_required() const { return resident_key_required_; } - bool hmac_secret() const { return hmac_secret_; } - const base::Optional<std::vector<PublicKeyCredentialDescriptor>>& - exclude_list() const { - return exclude_list_; - } - const base::Optional<std::vector<uint8_t>>& pin_auth() const { - return pin_auth_; - } - const base::Optional<uint8_t>& pin_protocol() const { return pin_protocol_; } - - void set_is_u2f_only(bool is_u2f_only) { is_u2f_only_ = is_u2f_only; } - bool is_u2f_only() { return is_u2f_only_; } - - bool is_incognito_mode() const { return is_incognito_mode_; } - void set_is_incognito_mode(bool is_incognito_mode) { - is_incognito_mode_ = is_incognito_mode; - } - - AttestationConveyancePreference attestation_preference() const { - return attestation_preference_; - } - void set_attestation_preference( - AttestationConveyancePreference attestation_preference) { - attestation_preference_ = attestation_preference; - } - - private: - std::string client_data_json_; - std::array<uint8_t, kClientDataHashLength> client_data_hash_; - PublicKeyCredentialRpEntity rp_; - PublicKeyCredentialUserEntity user_; - PublicKeyCredentialParams public_key_credential_params_; - UserVerificationRequirement user_verification_ = + std::string client_data_json; + ClientDataHash client_data_hash; + PublicKeyCredentialRpEntity rp; + PublicKeyCredentialUserEntity user; + PublicKeyCredentialParams public_key_credential_params; + UserVerificationRequirement user_verification = UserVerificationRequirement::kDiscouraged; - AuthenticatorAttachment authenticator_attachment_ = + AuthenticatorAttachment authenticator_attachment = AuthenticatorAttachment::kAny; - bool resident_key_required_ = false; + bool resident_key_required = false; // hmac_secret_ indicates whether the "hmac-secret" extension should be // asserted to CTAP2 authenticators. - bool hmac_secret_ = false; + bool hmac_secret = false; // If true, instruct the request handler only to dispatch this request via // U2F. - bool is_u2f_only_ = false; - bool is_incognito_mode_ = false; + bool is_u2f_only = false; + bool is_incognito_mode = false; - base::Optional<std::vector<PublicKeyCredentialDescriptor>> exclude_list_; - base::Optional<std::vector<uint8_t>> pin_auth_; - base::Optional<uint8_t> pin_protocol_; - AttestationConveyancePreference attestation_preference_ = + base::Optional<std::vector<PublicKeyCredentialDescriptor>> exclude_list; + base::Optional<std::vector<uint8_t>> pin_auth; + base::Optional<uint8_t> pin_protocol; + AttestationConveyancePreference attestation_preference = AttestationConveyancePreference::NONE; };
diff --git a/device/fido/ctap_request_unittest.cc b/device/fido/ctap_request_unittest.cc index 79564184..91ea179 100644 --- a/device/fido/ctap_request_unittest.cc +++ b/device/fido/ctap_request_unittest.cc
@@ -31,10 +31,11 @@ test_data::kClientDataJson, std::move(rp), std::move(user), PublicKeyCredentialParams({{CredentialType::kPublicKey, 7}, {CredentialType::kPublicKey, 257}})); + make_credential_param.resident_key_required = true; + make_credential_param.user_verification = + UserVerificationRequirement::kRequired; auto serialized_data = MockFidoDevice::EncodeCBORRequest( - make_credential_param.SetResidentKeyRequired(true) - .SetUserVerification(UserVerificationRequirement::kRequired) - .EncodeAsCBOR()); + CtapMakeCredentialRequest::EncodeAsCBOR(make_credential_param)); EXPECT_THAT(serialized_data, ::testing::ElementsAreArray( test_data::kCtapMakeCredentialRequest)); } @@ -60,12 +61,12 @@ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03})); - get_assertion_req.SetAllowList(std::move(allowed_list)) - .SetUserPresenceRequired(false) - .SetUserVerification(UserVerificationRequirement::kRequired); + get_assertion_req.allow_list = std::move(allowed_list); + get_assertion_req.user_presence_required = false; + get_assertion_req.user_verification = UserVerificationRequirement::kRequired; - auto serialized_data = - MockFidoDevice::EncodeCBORRequest(get_assertion_req.EncodeAsCBOR()); + auto serialized_data = MockFidoDevice::EncodeCBORRequest( + CtapGetAssertionRequest::EncodeAsCBOR(get_assertion_req)); EXPECT_THAT(serialized_data, ::testing::ElementsAreArray( test_data::kTestComplexCtapGetAssertionRequest)); @@ -92,31 +93,29 @@ auto client_data_hash = std::get<1>(*request_and_hash); EXPECT_THAT(client_data_hash, ::testing::ElementsAreArray(test_data::kClientDataHash)); - EXPECT_EQ(test_data::kRelyingPartyId, request.rp().rp_id()); - EXPECT_EQ("Acme", request.rp().rp_name()); - EXPECT_THAT(request.user().id, - ::testing::ElementsAreArray(test_data::kUserId)); - ASSERT_TRUE(request.user().name); - EXPECT_EQ("johnpsmith@example.com", *request.user().name); - ASSERT_TRUE(request.user().display_name); - EXPECT_EQ("John P. Smith", *request.user().display_name); - ASSERT_TRUE(request.user().icon_url); + EXPECT_EQ(test_data::kRelyingPartyId, request.rp.rp_id()); + EXPECT_EQ("Acme", request.rp.rp_name()); + EXPECT_THAT(request.user.id, ::testing::ElementsAreArray(test_data::kUserId)); + ASSERT_TRUE(request.user.name); + EXPECT_EQ("johnpsmith@example.com", *request.user.name); + ASSERT_TRUE(request.user.display_name); + EXPECT_EQ("John P. Smith", *request.user.display_name); + ASSERT_TRUE(request.user.icon_url); EXPECT_EQ("https://pics.acme.com/00/p/aBjjjpqPb.png", - request.user().icon_url->spec()); - ASSERT_EQ(2u, request.public_key_credential_params() - .public_key_credential_params() - .size()); - EXPECT_EQ(7, request.public_key_credential_params() - .public_key_credential_params() - .at(0) - .algorithm); - EXPECT_EQ(257, request.public_key_credential_params() - .public_key_credential_params() - .at(1) - .algorithm); - EXPECT_EQ(UserVerificationRequirement::kRequired, - request.user_verification()); - EXPECT_TRUE(request.resident_key_required()); + request.user.icon_url->spec()); + ASSERT_EQ(2u, + request.public_key_credential_params.public_key_credential_params() + .size()); + EXPECT_EQ(7, + request.public_key_credential_params.public_key_credential_params() + .at(0) + .algorithm); + EXPECT_EQ(257, + request.public_key_credential_params.public_key_credential_params() + .at(1) + .algorithm); + EXPECT_EQ(UserVerificationRequirement::kRequired, request.user_verification); + EXPECT_TRUE(request.resident_key_required); } TEST(VirtualCtap2DeviceTest, ParseGetAssertionRequestForVirtualCtapKey) { @@ -142,16 +141,15 @@ auto client_data_hash = std::get<1>(*request_and_hash); EXPECT_THAT(client_data_hash, ::testing::ElementsAreArray(test_data::kClientDataHash)); - EXPECT_EQ(test_data::kRelyingPartyId, request.rp_id()); - EXPECT_EQ(UserVerificationRequirement::kRequired, - request.user_verification()); - EXPECT_FALSE(request.user_presence_required()); - ASSERT_TRUE(request.allow_list()); - ASSERT_EQ(2u, request.allow_list()->size()); + EXPECT_EQ(test_data::kRelyingPartyId, request.rp_id); + EXPECT_EQ(UserVerificationRequirement::kRequired, request.user_verification); + EXPECT_FALSE(request.user_presence_required); + ASSERT_TRUE(request.allow_list); + ASSERT_EQ(2u, request.allow_list->size()); - EXPECT_THAT(request.allow_list()->at(0).id(), + EXPECT_THAT(request.allow_list->at(0).id(), ::testing::ElementsAreArray(kAllowedCredentialOne)); - EXPECT_THAT(request.allow_list()->at(1).id(), + EXPECT_THAT(request.allow_list->at(1).id(), ::testing::ElementsAreArray(kAllowedCredentialTwo)); } } // namespace device
diff --git a/device/fido/fido_authenticator.h b/device/fido/fido_authenticator.h index cbe9cad6..af8c91d3 100644 --- a/device/fido/fido_authenticator.h +++ b/device/fido/fido_authenticator.h
@@ -22,8 +22,8 @@ namespace device { -class CtapGetAssertionRequest; -class CtapMakeCredentialRequest; +struct CtapGetAssertionRequest; +struct CtapMakeCredentialRequest; namespace pin { struct RetriesResponse;
diff --git a/device/fido/fido_device_authenticator.cc b/device/fido/fido_device_authenticator.cc index 082b6b2..a997f8a 100644 --- a/device/fido/fido_device_authenticator.cc +++ b/device/fido/fido_device_authenticator.cc
@@ -223,7 +223,7 @@ // If a PIN cannot be collected, and UV is required, then this request cannot // be met. - if (request.user_verification() == UserVerificationRequirement::kRequired && + if (request.user_verification == UserVerificationRequirement::kRequired && (!can_collect_pin || device_support == ClientPinAvailability::kNotSupported)) { return MakeCredentialPINDisposition::kUnsatisfiable; @@ -232,7 +232,7 @@ // If UV is required and a PIN can be set, set it during the MakeCredential // process. if (device_support == ClientPinAvailability::kSupportedButPinNotSet && - request.user_verification() == UserVerificationRequirement::kRequired) { + request.user_verification == UserVerificationRequirement::kRequired) { return MakeCredentialPINDisposition::kSetPIN; } @@ -243,8 +243,7 @@ supports_u2f); // TODO(agl): perhaps CTAP2 is indicated when, for example, hmac-secret is // requested? - if (request.user_verification() == - UserVerificationRequirement::kDiscouraged) { + if (request.user_verification == UserVerificationRequirement::kDiscouraged) { return MakeCredentialPINDisposition::kNoPIN; } @@ -276,7 +275,7 @@ // UI support for collecting it. observer && observer->SupportsPIN(); const bool resident_key_request = - !request.allow_list() || request.allow_list()->empty(); + !request.allow_list || request.allow_list->empty(); if (resident_key_request) { if (can_use_pin) { @@ -287,7 +286,7 @@ // If UV is required then the PIN must be used if set, or else this request // cannot be satisfied. - if (request.user_verification() == UserVerificationRequirement::kRequired) { + if (request.user_verification == UserVerificationRequirement::kRequired) { if (can_use_pin) { return GetAssertionPINDisposition::kUsePIN; } @@ -295,7 +294,7 @@ } // If UV is preferred and a PIN is set, use it. - if (request.user_verification() == UserVerificationRequirement::kPreferred && + if (request.user_verification == UserVerificationRequirement::kPreferred && can_use_pin) { return GetAssertionPINDisposition::kUsePIN; }
diff --git a/device/fido/fido_device_authenticator.h b/device/fido/fido_device_authenticator.h index a62a0e91..2547018 100644 --- a/device/fido/fido_device_authenticator.h +++ b/device/fido/fido_device_authenticator.h
@@ -21,8 +21,8 @@ namespace device { -class CtapGetAssertionRequest; -class CtapMakeCredentialRequest; +struct CtapGetAssertionRequest; +struct CtapMakeCredentialRequest; class FidoDevice; class FidoTask;
diff --git a/device/fido/get_assertion_handler_unittest.cc b/device/fido/get_assertion_handler_unittest.cc index 14024e8..937a42a 100644 --- a/device/fido/get_assertion_handler_unittest.cc +++ b/device/fido/get_assertion_handler_unittest.cc
@@ -71,25 +71,26 @@ CtapGetAssertionRequest CreateTestRequestWithCableExtension() { CtapGetAssertionRequest request(test_data::kRelyingPartyId, test_data::kClientDataJson); - request.SetCableExtension({}); + request.cable_extension.emplace(); return request; } std::unique_ptr<GetAssertionRequestHandler> CreateGetAssertionHandlerU2f() { CtapGetAssertionRequest request(test_data::kRelyingPartyId, test_data::kClientDataJson); - request.SetAllowList( - {{CredentialType::kPublicKey, - fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle)}}); + request.allow_list.emplace({PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle))}); return CreateGetAssertionHandlerWithRequest(std::move(request)); } std::unique_ptr<GetAssertionRequestHandler> CreateGetAssertionHandlerCtap() { CtapGetAssertionRequest request(test_data::kRelyingPartyId, test_data::kClientDataJson); - request.SetAllowList({{CredentialType::kPublicKey, - fido_parsing_utils::Materialize( - test_data::kTestGetAssertionCredentialId)}}); + request.allow_list.emplace({PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize( + test_data::kTestGetAssertionCredentialId))}); return CreateGetAssertionHandlerWithRequest(std::move(request)); } @@ -234,7 +235,7 @@ TEST_F(FidoGetAssertionHandlerTest, TestIncompatibleUserVerificationSetting) { auto request = CtapGetAssertionRequest(test_data::kRelyingPartyId, test_data::kClientDataJson); - request.SetUserVerification(UserVerificationRequirement::kRequired); + request.user_verification = UserVerificationRequirement::kRequired; auto request_handler = CreateGetAssertionHandlerWithRequest(std::move(request)); discovery()->WaitForCallToStartAndSimulateSuccess(); @@ -242,8 +243,8 @@ auto device = MockFidoDevice::MakeCtapWithGetInfoExpectation( test_data::kTestGetInfoResponseWithoutUvSupport); device->ExpectRequestAndRespondWith( - MockFidoDevice::EncodeCBORRequest( - MakeCredentialTask::GetTouchRequest(device.get()).EncodeAsCBOR()), + MockFidoDevice::EncodeCBORRequest(CtapMakeCredentialRequest::EncodeAsCBOR( + MakeCredentialTask::GetTouchRequest(device.get()))), test_data::kTestMakeCredentialResponse); discovery()->AddDevice(std::move(device)); @@ -257,10 +258,10 @@ TestU2fSignRequestWithUserVerificationRequired) { auto request = CtapGetAssertionRequest(test_data::kRelyingPartyId, test_data::kClientDataJson); - request.SetAllowList( - {{CredentialType::kPublicKey, - fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle)}}); - request.SetUserVerification(UserVerificationRequirement::kRequired); + request.allow_list.emplace({PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle))}); + request.user_verification = UserVerificationRequirement::kRequired; auto request_handler = CreateGetAssertionHandlerWithRequest(std::move(request)); discovery()->WaitForCallToStartAndSimulateSuccess(); @@ -298,9 +299,9 @@ TEST_F(FidoGetAssertionHandlerTest, InvalidCredential) { CtapGetAssertionRequest request(test_data::kRelyingPartyId, test_data::kClientDataJson); - request.SetAllowList( - {{CredentialType::kPublicKey, - fido_parsing_utils::Materialize(test_data::kKeyHandleAlpha)}}); + request.allow_list.emplace({PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize(test_data::kKeyHandleAlpha))}); auto request_handler = CreateGetAssertionHandlerWithRequest(std::move(request)); discovery()->WaitForCallToStartAndSimulateSuccess(); @@ -403,7 +404,7 @@ TEST_F(FidoGetAssertionHandlerTest, AllTransportsAllowedIfAllowCredentialsListIsEmpty) { auto request = CreateTestRequestWithCableExtension(); - request.SetAllowList({}); + request.allow_list.emplace(); EXPECT_CALL(*mock_adapter_, IsPresent()).WillOnce(::testing::Return(true)); auto request_handler = CreateGetAssertionHandlerWithRequest(std::move(request)); @@ -413,13 +414,15 @@ TEST_F(FidoGetAssertionHandlerTest, AllTransportsAllowedIfHasAllowedCredentialWithEmptyTransportsList) { auto request = CreateTestRequestWithCableExtension(); - request.SetAllowList({ - {CredentialType::kPublicKey, - fido_parsing_utils::Materialize( - test_data::kTestGetAssertionCredentialId), - {FidoTransportProtocol::kBluetoothLowEnergy}}, - {CredentialType::kPublicKey, - fido_parsing_utils::Materialize(kBogusCredentialId)}, + request.allow_list.emplace({ + PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize( + test_data::kTestGetAssertionCredentialId), + {FidoTransportProtocol::kBluetoothLowEnergy}), + PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize(kBogusCredentialId)), }); EXPECT_CALL(*mock_adapter_, IsPresent()).WillOnce(::testing::Return(true)); @@ -431,15 +434,17 @@ TEST_F(FidoGetAssertionHandlerTest, AllowedTransportsAreUnionOfTransportsLists) { auto request = CreateTestRequestWithCableExtension(); - request.SetAllowList({ - {CredentialType::kPublicKey, - fido_parsing_utils::Materialize( - test_data::kTestGetAssertionCredentialId), - {FidoTransportProtocol::kBluetoothLowEnergy}}, - {CredentialType::kPublicKey, - fido_parsing_utils::Materialize(kBogusCredentialId), - {FidoTransportProtocol::kInternal, - FidoTransportProtocol::kNearFieldCommunication}}, + request.allow_list.emplace({ + PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize( + test_data::kTestGetAssertionCredentialId), + {FidoTransportProtocol::kBluetoothLowEnergy}), + PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize(kBogusCredentialId), + {FidoTransportProtocol::kInternal, + FidoTransportProtocol::kNearFieldCommunication}), }); EXPECT_CALL(*mock_adapter_, IsPresent()).WillOnce(::testing::Return(true)); @@ -455,7 +460,7 @@ CableDisabledIfAllowCredentialsListUndefinedButCableExtensionMissing) { CtapGetAssertionRequest request(test_data::kRelyingPartyId, test_data::kClientDataJson); - ASSERT_FALSE(!!request.cable_extension()); + ASSERT_FALSE(!!request.cable_extension); EXPECT_CALL(*mock_adapter_, IsPresent()).WillOnce(::testing::Return(true)); auto request_handler = CreateGetAssertionHandlerWithRequest(std::move(request)); @@ -470,13 +475,14 @@ CableDisabledIfExplicitlyAllowedButCableExtensionMissing) { CtapGetAssertionRequest request(test_data::kRelyingPartyId, test_data::kClientDataJson); - ASSERT_FALSE(!!request.cable_extension()); - request.SetAllowList({ - {CredentialType::kPublicKey, - fido_parsing_utils::Materialize( - test_data::kTestGetAssertionCredentialId), - {FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy, - FidoTransportProtocol::kUsbHumanInterfaceDevice}}, + ASSERT_FALSE(!!request.cable_extension); + request.allow_list.emplace({ + PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize( + test_data::kTestGetAssertionCredentialId), + {FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy, + FidoTransportProtocol::kUsbHumanInterfaceDevice}), }); auto request_handler = @@ -515,11 +521,12 @@ TEST_F(FidoGetAssertionHandlerTest, SuccessWithOnlyUsbTransportAllowed) { auto request = CreateTestRequestWithCableExtension(); - request.SetAllowList({ - {CredentialType::kPublicKey, - fido_parsing_utils::Materialize( - test_data::kTestGetAssertionCredentialId), - {FidoTransportProtocol::kUsbHumanInterfaceDevice}}, + request.allow_list.emplace({ + PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize( + test_data::kTestGetAssertionCredentialId), + {FidoTransportProtocol::kUsbHumanInterfaceDevice}), }); set_supported_transports({FidoTransportProtocol::kUsbHumanInterfaceDevice}); @@ -547,11 +554,12 @@ TEST_F(FidoGetAssertionHandlerTest, SuccessWithOnlyBleTransportAllowed) { auto request = CreateTestRequestWithCableExtension(); - request.SetAllowList({ - {CredentialType::kPublicKey, - fido_parsing_utils::Materialize( - test_data::kTestGetAssertionCredentialId), - {FidoTransportProtocol::kBluetoothLowEnergy}}, + request.allow_list.emplace({ + PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize( + test_data::kTestGetAssertionCredentialId), + {FidoTransportProtocol::kBluetoothLowEnergy}), }); set_supported_transports({FidoTransportProtocol::kBluetoothLowEnergy}); @@ -580,11 +588,12 @@ TEST_F(FidoGetAssertionHandlerTest, SuccessWithOnlyNfcTransportAllowed) { auto request = CreateTestRequestWithCableExtension(); - request.SetAllowList({ - {CredentialType::kPublicKey, - fido_parsing_utils::Materialize( - test_data::kTestGetAssertionCredentialId), - {FidoTransportProtocol::kNearFieldCommunication}}, + request.allow_list.emplace({ + PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize( + test_data::kTestGetAssertionCredentialId), + {FidoTransportProtocol::kNearFieldCommunication}), }); set_supported_transports({FidoTransportProtocol::kNearFieldCommunication}); @@ -613,11 +622,12 @@ TEST_F(FidoGetAssertionHandlerTest, SuccessWithOnlyInternalTransportAllowed) { auto request = CreateTestRequestWithCableExtension(); - request.SetAllowList({ - {CredentialType::kPublicKey, - fido_parsing_utils::Materialize( - test_data::kTestGetAssertionCredentialId), - {FidoTransportProtocol::kInternal}}, + request.allow_list.emplace({ + PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize( + test_data::kTestGetAssertionCredentialId), + {FidoTransportProtocol::kInternal}), }); set_supported_transports({FidoTransportProtocol::kInternal}); @@ -752,11 +762,12 @@ // Request the correct credential ID, but set a different transport hint. CtapGetAssertionRequest request(test_data::kRelyingPartyId, test_data::kClientDataJson); - request.SetAllowList({ - {CredentialType::kPublicKey, - fido_parsing_utils::Materialize( - test_data::kTestGetAssertionCredentialId), - {FidoTransportProtocol::kBluetoothLowEnergy}}, + request.allow_list.emplace({ + PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize( + test_data::kTestGetAssertionCredentialId), + {FidoTransportProtocol::kBluetoothLowEnergy}), }); TestGetAssertionRequestCallback cb;
diff --git a/device/fido/get_assertion_request_handler.cc b/device/fido/get_assertion_request_handler.cc index d8d928f..39d51fce 100644 --- a/device/fido/get_assertion_request_handler.cc +++ b/device/fido/get_assertion_request_handler.cc
@@ -20,6 +20,7 @@ #include "device/fido/features.h" #include "device/fido/fido_authenticator.h" #include "device/fido/fido_discovery_factory.h" +#include "device/fido/fido_parsing_utils.h" #include "device/fido/get_assertion_task.h" #include "device/fido/pin.h" @@ -30,7 +31,10 @@ bool ResponseValid(const FidoAuthenticator& authenticator, const CtapGetAssertionRequest& request, const AuthenticatorGetAssertionResponse& response) { - if (!request.CheckResponseRpIdHash(response.GetRpIdHash())) { + if (response.GetRpIdHash() != + fido_parsing_utils::CreateSHA256Hash(request.rp_id) && + (!request.app_id || + response.GetRpIdHash() != request.alternative_application_parameter)) { return false; } @@ -52,8 +56,7 @@ return false; } - if ((!request.allow_list() || request.allow_list()->empty()) && - !user_entity) { + if ((!request.allow_list || request.allow_list->empty()) && !user_entity) { return false; } @@ -68,7 +71,7 @@ // Thus, returned credential ID need not be in allowed list. // TODO(hongjunchoi) : Add link to section of the CTAP spec once it is // published. - const auto& allow_list = request.allow_list(); + const auto& allow_list = request.allow_list; if (!allow_list || allow_list->empty()) { if (authenticator.Options() && !authenticator.Options()->supports_resident_key) { @@ -109,9 +112,9 @@ void SetCredentialIdForResponseWithEmptyCredential( const CtapGetAssertionRequest& request, AuthenticatorGetAssertionResponse& response) { - if (request.allow_list() && request.allow_list()->size() == 1 && + if (request.allow_list && request.allow_list->size() == 1 && !response.credential()) { - response.SetCredential(request.allow_list()->at(0)); + response.SetCredential(request.allow_list->at(0)); } } @@ -130,8 +133,7 @@ const bool pin_support = base::FeatureList::IsEnabled(device::kWebAuthPINSupport) && have_observer; - return request.user_verification() != - UserVerificationRequirement::kRequired || + return request.user_verification != UserVerificationRequirement::kRequired || opt_options->user_verification_availability == AuthenticatorSupportedOptions::UserVerificationAvailability:: kSupportedAndConfigured || @@ -151,7 +153,7 @@ // TODO(https://crbug.com/874479): |allowed_list| will |has_value| even if the // WebAuthn request has `allowCredential` undefined. - const auto& allowed_list = request.allow_list(); + const auto& allowed_list = request.allow_list; if (!allowed_list || allowed_list->empty()) { return kAllTransports; } @@ -170,11 +172,27 @@ base::flat_set<FidoTransportProtocol> GetTransportsAllowedAndConfiguredByRP( const CtapGetAssertionRequest& request) { auto transports = GetTransportsAllowedByRP(request); - if (!request.cable_extension()) + if (!request.cable_extension) transports.erase(FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy); return transports; } +void ReportGetAssertionRequestTransport(FidoAuthenticator* authenticator) { + if (authenticator->AuthenticatorTransport()) { + base::UmaHistogramEnumeration( + "WebAuthentication.GetAssertionRequestTransport", + *authenticator->AuthenticatorTransport()); + } +} + +void ReportGetAssertionResponseTransport(FidoAuthenticator* authenticator) { + if (authenticator->AuthenticatorTransport()) { + base::UmaHistogramEnumeration( + "WebAuthentication.GetAssertionResponseTransport", + *authenticator->AuthenticatorTransport()); + } +} + } // namespace GetAssertionRequestHandler::GetAssertionRequestHandler( @@ -196,9 +214,9 @@ if (base::ContainsKey( transport_availability_info().available_transports, FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy)) { - DCHECK(request_.cable_extension()); + DCHECK(request_.cable_extension); auto discovery = - FidoDiscoveryFactory::CreateCable(*request_.cable_extension()); + FidoDiscoveryFactory::CreateCable(*request_.cable_extension); discovery->set_observer(this); discoveries().push_back(std::move(discovery)); } @@ -258,25 +276,21 @@ } } - if (authenticator->AuthenticatorTransport()) { - base::UmaHistogramEnumeration( - "WebAuthentication.GetAssertionRequestTransport", - *authenticator->AuthenticatorTransport()); - } - CtapGetAssertionRequest request(request_); if (authenticator->Options()) { if (authenticator->Options()->user_verification_availability == AuthenticatorSupportedOptions::UserVerificationAvailability:: kSupportedAndConfigured && - request_.user_verification() != + request_.user_verification != UserVerificationRequirement::kDiscouraged) { - request.SetUserVerification(UserVerificationRequirement::kRequired); + request.user_verification = UserVerificationRequirement::kRequired; } else { - request.SetUserVerification(UserVerificationRequirement::kDiscouraged); + request.user_verification = UserVerificationRequirement::kDiscouraged; } } + ReportGetAssertionRequestTransport(authenticator); + FIDO_LOG(DEBUG) << "Asking for assertion from " << authenticator->GetDisplayName(); authenticator->GetAssertion( @@ -354,8 +368,8 @@ SetCredentialIdForResponseWithEmptyCredential(request_, *response); const size_t num_responses = response->num_credentials().value_or(1); - if (num_responses == 0 || (num_responses > 1 && request_.allow_list() && - !request_.allow_list()->empty())) { + if (num_responses == 0 || (num_responses > 1 && request_.allow_list && + !request_.allow_list->empty())) { OnAuthenticatorResponse(authenticator, FidoReturnCode::kAuthenticatorResponseInvalid, base::nullopt); @@ -374,6 +388,8 @@ return; } + ReportGetAssertionResponseTransport(authenticator); + OnAuthenticatorResponse(authenticator, FidoReturnCode::kSuccess, std::move(responses_)); } @@ -417,6 +433,8 @@ return; } + ReportGetAssertionResponseTransport(authenticator); + OnAuthenticatorResponse(authenticator, FidoReturnCode::kSuccess, std::move(responses_)); } @@ -546,11 +564,13 @@ observer()->FinishCollectPIN(); state_ = State::kWaitingForSecondTouch; CtapGetAssertionRequest request(request_); - request.SetPinAuth(response->PinAuth(request.client_data_hash())); - request.SetPinProtocol(pin::kProtocolVersion); + request.pin_auth = response->PinAuth(request.client_data_hash); + request.pin_protocol = pin::kProtocolVersion; // If doing a PIN operation then we don't ask the authenticator to also do // internal UV. - request.SetUserVerification(UserVerificationRequirement::kDiscouraged); + request.user_verification = UserVerificationRequirement::kDiscouraged; + + ReportGetAssertionRequestTransport(authenticator_); authenticator_->GetAssertion( std::move(request),
diff --git a/device/fido/get_assertion_task.cc b/device/fido/get_assertion_task.cc index d6283e7e..54e7452 100644 --- a/device/fido/get_assertion_task.cc +++ b/device/fido/get_assertion_task.cc
@@ -23,8 +23,7 @@ bool ctap2_device_supports_u2f = device.device_info() && base::ContainsKey(device.device_info()->versions, ProtocolVersion::kU2f); - return request.alternative_application_parameter() && - ctap2_device_supports_u2f; + return request.alternative_application_parameter && ctap2_device_supports_u2f; } } // namespace @@ -38,11 +37,11 @@ weak_factory_(this) { // This code assumes that user-presence is requested in order to implement // possible U2F-fallback. - DCHECK(request_.user_presence_required()); + DCHECK(request_.user_presence_required); // The UV parameter should have been made binary by this point because CTAP2 // only takes a binary value. - DCHECK_NE(request_.user_verification(), + DCHECK_NE(request_.user_verification, UserVerificationRequirement::kPreferred); } @@ -80,12 +79,12 @@ } CtapGetAssertionRequest GetAssertionTask::NextSilentRequest() { - DCHECK(request_.allow_list() && - current_credential_ < request_.allow_list()->size()); + DCHECK(request_.allow_list && + current_credential_ < request_.allow_list->size()); CtapGetAssertionRequest request = request_; - request.SetAllowList({{request_.allow_list()->at(current_credential_)}}); - request.SetUserPresenceRequired(false); - request.SetUserVerification(UserVerificationRequirement::kDiscouraged); + request.allow_list = {{request_.allow_list->at(current_credential_)}}; + request.user_presence_required = false; + request.user_verification = UserVerificationRequirement::kDiscouraged; return request; } @@ -97,7 +96,7 @@ // support silent probing so don't do it with them.) if (device()->DeviceTransport() != FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy && - ((request_.allow_list() && request_.allow_list()->size() > 1) || + ((request_.allow_list && request_.allow_list->size() > 1) || MayFallbackToU2fWithAppIdExtension(*device(), request_))) { sign_operation_ = std::make_unique<Ctap2DeviceOperation< CtapGetAssertionRequest, AuthenticatorGetAssertionResponse>>( @@ -158,7 +157,7 @@ void GetAssertionTask::HandleResponseToSilentRequest( CtapDeviceResponseCode response_code, base::Optional<AuthenticatorGetAssertionResponse> response_data) { - DCHECK(request_.allow_list() && request_.allow_list()->size() > 0); + DCHECK(request_.allow_list && request_.allow_list->size() > 0); if (canceled_) { return; @@ -170,7 +169,7 @@ // user verification configuration. if (response_code == CtapDeviceResponseCode::kSuccess) { CtapGetAssertionRequest request = request_; - request.SetAllowList({{request_.allow_list()->at(current_credential_)}}); + request.allow_list = {{request_.allow_list->at(current_credential_)}}; sign_operation_ = std::make_unique<Ctap2DeviceOperation< CtapGetAssertionRequest, AuthenticatorGetAssertionResponse>>( device(), std::move(request), @@ -184,7 +183,7 @@ // Credential was not recognized or an error occurred. Probe the next // credential. - if (++current_credential_ < request_.allow_list()->size()) { + if (++current_credential_ < request_.allow_list->size()) { sign_operation_ = std::make_unique<Ctap2DeviceOperation< CtapGetAssertionRequest, AuthenticatorGetAssertionResponse>>( device(), NextSilentRequest(),
diff --git a/device/fido/get_assertion_task_unittest.cc b/device/fido/get_assertion_task_unittest.cc index c8894f46..552d214a 100644 --- a/device/fido/get_assertion_task_unittest.cc +++ b/device/fido/get_assertion_task_unittest.cc
@@ -57,9 +57,10 @@ CtapGetAssertionRequest request_param(test_data::kRelyingPartyId, test_data::kClientDataJson); - request_param.SetAllowList({{CredentialType::kPublicKey, - fido_parsing_utils::Materialize( - test_data::kTestGetAssertionCredentialId)}}); + request_param.allow_list.emplace({PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize( + test_data::kTestGetAssertionCredentialId))}); auto task = std::make_unique<GetAssertionTask>( device.get(), std::move(request_param), @@ -79,9 +80,9 @@ CtapGetAssertionRequest request_param(test_data::kRelyingPartyId, test_data::kClientDataJson); - request_param.SetAllowList( - {{CredentialType::kPublicKey, - fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle)}}); + request_param.allow_list.emplace({PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle))}); auto task = std::make_unique<GetAssertionTask>( device.get(), std::move(request_param), @@ -101,7 +102,9 @@ std::vector<uint8_t> key_handle(hash.begin(), hash.end()); CtapGetAssertionRequest request_param(test_data::kRelyingPartyId, test_data::kClientDataJson); - request_param.SetAllowList({{CredentialType::kPublicKey, key_handle}}); + request_param.allow_list.emplace( + {PublicKeyCredentialDescriptor(CredentialType::kPublicKey, key_handle)}); + ; auto device = std::make_unique<VirtualCtap2Device>(); device->mutable_state()->registrations.emplace( @@ -188,8 +191,11 @@ allowed_list.push_back(PublicKeyCredentialDescriptor( CredentialType::kPublicKey, fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle))); - request.SetAppId(test_data::kAppId); - request.SetAllowList(std::move(allowed_list)); + request.app_id = test_data::kAppId; + request.alternative_application_parameter = + fido_parsing_utils::Materialize(base::span<const uint8_t, 32>( + test_data::kAlternativeApplicationParameter)); + request.allow_list = std::move(allowed_list); auto device = MockFidoDevice::MakeCtap(); device->ExpectRequestAndRespondWith(test_data::kCtapSilentGetAssertionRequest, @@ -214,8 +220,11 @@ allowed_list.push_back(PublicKeyCredentialDescriptor( CredentialType::kPublicKey, fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle))); - request.SetAppId(test_data::kAppId); - request.SetAllowList(std::move(allowed_list)); + request.app_id = test_data::kAppId; + request.alternative_application_parameter = + fido_parsing_utils::Materialize(base::span<const uint8_t, 32>( + test_data::kAlternativeApplicationParameter)); + request.allow_list = std::move(allowed_list); ::testing::InSequence s; auto device = MockFidoDevice::MakeCtap(); @@ -253,8 +262,11 @@ CredentialType::kPublicKey, fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle))); - request.SetAppId(test_data::kAppId); - request.SetAllowList(std::move(allowed_list)); + request.app_id = test_data::kAppId; + request.alternative_application_parameter = + fido_parsing_utils::Materialize(base::span<const uint8_t, 32>( + test_data::kAlternativeApplicationParameter)); + request.allow_list = std::move(allowed_list); auto device = MockFidoDevice::MakeCtap(ReadCTAPGetInfoResponse( test_data::kTestCtap2OnlyAuthenticatorGetInfoResponse));
diff --git a/device/fido/mac/authenticator.mm b/device/fido/mac/authenticator.mm index 6d871cd..e9e65b2 100644 --- a/device/fido/mac/authenticator.mm +++ b/device/fido/mac/authenticator.mm
@@ -64,8 +64,8 @@ std::set<std::vector<uint8_t>> allow_list_credential_ids; // Extract applicable credential IDs from the allowList, if the request has // one. If not, any credential matching the RP works. - if (request.allow_list()) { - for (const auto& credential_descriptor : *request.allow_list()) { + if (request.allow_list) { + for (const auto& credential_descriptor : *request.allow_list) { if (credential_descriptor.credential_type() != CredentialType::kPublicKey) continue; @@ -80,7 +80,7 @@ } return FindCredentialInKeychain(keychain_access_group_, metadata_secret_, - request.rp_id(), allow_list_credential_ids, + request.rp_id, allow_list_credential_ids, nullptr /* LAContext */) != base::nullopt; } NOTREACHED();
diff --git a/device/fido/mac/get_assertion_operation.mm b/device/fido/mac/get_assertion_operation.mm index cb4a86d3..46fad38 100644 --- a/device/fido/mac/get_assertion_operation.mm +++ b/device/fido/mac/get_assertion_operation.mm
@@ -42,7 +42,7 @@ GetAssertionOperation::~GetAssertionOperation() = default; const std::string& GetAssertionOperation::RpId() const { - return request().rp_id(); + return request().rp_id; } void GetAssertionOperation::Run() { @@ -67,8 +67,8 @@ // Collect the credential ids from allowList. If allowList is absent, we will // pick the first available credential for the RP. std::set<std::vector<uint8_t>> allowed_credential_ids; - if (request().allow_list()) { - for (const PublicKeyCredentialDescriptor& desc : *request().allow_list()) { + if (request().allow_list) { + for (const PublicKeyCredentialDescriptor& desc : *request().allow_list) { if (desc.credential_type() != CredentialType::kPublicKey) continue; @@ -111,9 +111,8 @@ AuthenticatorData authenticator_data = MakeAuthenticatorData(RpId(), /*attested_credential_data=*/base::nullopt); - base::Optional<std::vector<uint8_t>> signature = - GenerateSignature(authenticator_data, request().client_data_hash(), - credential->private_key); + base::Optional<std::vector<uint8_t>> signature = GenerateSignature( + authenticator_data, request().client_data_hash, credential->private_key); if (!signature) { FIDO_LOG(ERROR) << "GenerateSignature failed"; std::move(callback())
diff --git a/device/fido/mac/make_credential_operation.mm b/device/fido/mac/make_credential_operation.mm index 927b8b1b..1fe0a11 100644 --- a/device/fido/mac/make_credential_operation.mm +++ b/device/fido/mac/make_credential_operation.mm
@@ -45,7 +45,7 @@ MakeCredentialOperation::~MakeCredentialOperation() = default; const std::string& MakeCredentialOperation::RpId() const { - return request().rp().rp_id(); + return request().rp.rp_id(); } void MakeCredentialOperation::Run() { @@ -63,7 +63,7 @@ static_cast<int>(CoseAlgorithmIdentifier::kCoseEs256); }; const auto& key_params = - request().public_key_credential_params().public_key_credential_params(); + request().public_key_credential_params.public_key_credential_params(); if (!std::any_of(key_params.begin(), key_params.end(), is_es256)) { DVLOG(1) << "No supported algorithm found."; std::move(callback()) @@ -86,8 +86,8 @@ // Evaluate that excludeList does not contain any credentials stored by this // authenticator. - if (request().exclude_list()) { - for (auto& credential : *request().exclude_list()) { + if (request().exclude_list) { + for (auto& credential : *request().exclude_list) { ScopedCFTypeRef<CFMutableDictionaryRef> query = DefaultKeychainQuery(); CFDictionarySetValue(query, kSecAttrApplicationLabel, [NSData dataWithBytes:credential.id().data() @@ -115,7 +115,7 @@ // Delete the key pair for this RP + user handle if one already exists. base::Optional<std::string> encoded_rp_id_user_id = CredentialMetadata::EncodeRpIdAndUserId(metadata_secret(), RpId(), - request().user().id); + request().user.id); if (!encoded_rp_id_user_id) { // Internal error. std::move(callback()) @@ -201,7 +201,7 @@ AuthenticatorData authenticator_data = MakeAuthenticatorData(RpId(), std::move(*attested_credential_data)); base::Optional<std::vector<uint8_t>> signature = GenerateSignature( - authenticator_data, request().client_data_hash(), private_key); + authenticator_data, request().client_data_hash, private_key); if (!signature) { FIDO_LOG(ERROR) << "MakeSignature failed"; std::move(callback()) @@ -224,7 +224,7 @@ return CredentialMetadata::SealCredentialId( metadata_secret(), RpId(), CredentialMetadata::UserEntity::FromPublicKeyCredentialUserEntity( - request().user())); + request().user)); } } // namespace mac
diff --git a/device/fido/make_credential_handler_unittest.cc b/device/fido/make_credential_handler_unittest.cc index 16163f6..8e35af4c 100644 --- a/device/fido/make_credential_handler_unittest.cc +++ b/device/fido/make_credential_handler_unittest.cc
@@ -240,8 +240,8 @@ auto device = MockFidoDevice::MakeCtapWithGetInfoExpectation( test_data::kTestGetInfoResponseWithoutUvSupport); device->ExpectRequestAndRespondWith( - MockFidoDevice::EncodeCBORRequest( - MakeCredentialTask::GetTouchRequest(device.get()).EncodeAsCBOR()), + MockFidoDevice::EncodeCBORRequest(CtapMakeCredentialRequest::EncodeAsCBOR( + MakeCredentialTask::GetTouchRequest(device.get()))), test_data::kTestMakeCredentialResponse); discovery()->AddDevice(std::move(device)); @@ -327,8 +327,8 @@ auto device = MockFidoDevice::MakeCtapWithGetInfoExpectation( test_data::kTestGetInfoResponseWithoutResidentKeySupport); device->ExpectRequestAndRespondWith( - MockFidoDevice::EncodeCBORRequest( - MakeCredentialTask::GetTouchRequest(device.get()).EncodeAsCBOR()), + MockFidoDevice::EncodeCBORRequest(CtapMakeCredentialRequest::EncodeAsCBOR( + MakeCredentialTask::GetTouchRequest(device.get()))), test_data::kTestMakeCredentialResponse); discovery()->AddDevice(std::move(device));
diff --git a/device/fido/make_credential_request_handler.cc b/device/fido/make_credential_request_handler.cc index 6137566..998f73e 100644 --- a/device/fido/make_credential_request_handler.cc +++ b/device/fido/make_credential_request_handler.cc
@@ -10,6 +10,7 @@ #include "base/bind.h" #include "base/feature_list.h" +#include "base/metrics/histogram_functions.h" #include "base/stl_util.h" #include "components/device_event_log/device_event_log.h" #include "device/fido/authenticator_make_credential_response.h" @@ -107,6 +108,14 @@ return base::flat_set<FidoTransportProtocol>(); } +void ReportMakeCredentialRequestTransport(FidoAuthenticator* authenticator) { + if (authenticator->AuthenticatorTransport()) { + base::UmaHistogramEnumeration( + "WebAuthentication.MakeCredentialRequestTransport", + *authenticator->AuthenticatorTransport()); + } +} + } // namespace MakeCredentialRequestHandler::MakeCredentialRequestHandler( @@ -133,15 +142,15 @@ // (in AuthenticatorImpl) and get rid of the separate // AuthenticatorSelectionCriteriaParameter. if (authenticator_selection_criteria_.require_resident_key()) { - request_.SetResidentKeyRequired(true); - request_.SetUserVerification(UserVerificationRequirement::kRequired); + request_.resident_key_required = true; + request_.user_verification = UserVerificationRequirement::kRequired; } else { - request_.SetResidentKeyRequired(false); - request_.SetUserVerification( - authenticator_selection_criteria_.user_verification_requirement()); + request_.resident_key_required = false; + request_.user_verification = + authenticator_selection_criteria_.user_verification_requirement(); } - request_.SetAuthenticatorAttachment( - authenticator_selection_criteria_.authenticator_attachment()); + request_.authenticator_attachment = + authenticator_selection_criteria_.authenticator_attachment(); Start(); } @@ -211,12 +220,15 @@ if (authenticator->Options()->user_verification_availability == AuthenticatorSupportedOptions::UserVerificationAvailability:: kSupportedAndConfigured && - !request_.is_u2f_only()) { - request.SetUserVerification(UserVerificationRequirement::kRequired); + !request_.is_u2f_only) { + request.user_verification = UserVerificationRequirement::kRequired; } else { - request.SetUserVerification(UserVerificationRequirement::kDiscouraged); + request.user_verification = UserVerificationRequirement::kDiscouraged; } } + + ReportMakeCredentialRequestTransport(authenticator); + authenticator->MakeCredential( std::move(request), base::BindOnce(&MakeCredentialRequestHandler::HandleResponse, @@ -279,7 +291,7 @@ } const auto rp_id_hash = - fido_parsing_utils::CreateSHA256Hash(request_.rp().rp_id()); + fido_parsing_utils::CreateSHA256Hash(request_.rp.rp_id()); if (!response || response->GetRpIdHash() != rp_id_hash) { FIDO_LOG(ERROR) << "Failing assertion request due to bad response from " @@ -290,6 +302,12 @@ return; } + if (authenticator->AuthenticatorTransport()) { + base::UmaHistogramEnumeration( + "WebAuthentication.MakeCredentialResponseTransport", + *authenticator->AuthenticatorTransport()); + } + OnAuthenticatorResponse(authenticator, FidoReturnCode::kSuccess, std::move(response)); } @@ -476,11 +494,13 @@ observer()->FinishCollectPIN(); state_ = State::kWaitingForSecondTouch; CtapMakeCredentialRequest request(request_); - request.SetPinAuth(response->PinAuth(request.client_data_hash())); - request.SetPinProtocol(pin::kProtocolVersion); + request.pin_auth = response->PinAuth(request.client_data_hash); + request.pin_protocol = pin::kProtocolVersion; // If doing a PIN operation then we don't ask the authenticator to also do // internal UV. - request.SetUserVerification(UserVerificationRequirement::kDiscouraged); + request.user_verification = UserVerificationRequirement::kDiscouraged; + + ReportMakeCredentialRequestTransport(authenticator_); authenticator_->MakeCredential( std::move(request),
diff --git a/device/fido/make_credential_task.cc b/device/fido/make_credential_task.cc index 5fc49b37..05ef98b3 100644 --- a/device/fido/make_credential_task.cc +++ b/device/fido/make_credential_task.cc
@@ -26,8 +26,8 @@ bool ShouldUseU2fBecauseCtapRequiresClientPin( const FidoDevice* device, const CtapMakeCredentialRequest& request) { - if (request.user_verification() == UserVerificationRequirement::kRequired || - (request.pin_auth() && !request.pin_auth()->empty())) { + if (request.user_verification == UserVerificationRequirement::kRequired || + (request.pin_auth && !request.pin_auth->empty())) { return false; } @@ -51,7 +51,7 @@ weak_factory_(this) { // The UV parameter should have been made binary by this point because CTAP2 // only takes a binary value. - DCHECK_NE(request_.user_verification(), + DCHECK_NE(request_.user_verification, UserVerificationRequirement::kPreferred); } @@ -75,7 +75,7 @@ PublicKeyCredentialParams( {{CredentialType::kPublicKey, base::strict_cast<int>(CoseAlgorithmIdentifier::kCoseEs256)}})); - req.SetExcludeList({}); + req.exclude_list.reset(); // If a device supports CTAP2 and has PIN support then setting an empty // pinAuth should trigger just a touch[1]. Our U2F code also understands @@ -87,7 +87,7 @@ device->device_info()->options.client_pin_availability != AuthenticatorSupportedOptions::ClientPinAvailability:: kNotSupported)) { - req.SetPinAuth({}); + req.pin_auth.emplace(); } DCHECK(IsConvertibleToU2fRegisterCommand(req)); @@ -108,7 +108,7 @@ void MakeCredentialTask::StartTask() { if (device()->supported_protocol() == ProtocolVersion::kCtap && - !request_.is_u2f_only() && + !request_.is_u2f_only && !ShouldUseU2fBecauseCtapRequiresClientPin(device(), request_)) { MakeCredential(); } else { @@ -123,20 +123,20 @@ } CtapGetAssertionRequest MakeCredentialTask::NextSilentSignRequest() { - DCHECK(request_.exclude_list() && - current_credential_ < request_.exclude_list()->size()); - CtapGetAssertionRequest request(request_.rp().rp_id(), + DCHECK(request_.exclude_list && + current_credential_ < request_.exclude_list->size()); + CtapGetAssertionRequest request(request_.rp.rp_id(), /*client_data_json=*/""); - request.SetAllowList({{request_.exclude_list()->at(current_credential_)}}); - request.SetUserPresenceRequired(false); - request.SetUserVerification(UserVerificationRequirement::kDiscouraged); + request.allow_list = {{request_.exclude_list->at(current_credential_)}}; + request.user_presence_required = false; + request.user_verification = UserVerificationRequirement::kDiscouraged; return request; } void MakeCredentialTask::MakeCredential() { // Silently probe each credential in the allow list to work around // authenticators rejecting lists over a certain size. - if (request_.exclude_list() && request_.exclude_list()->size() > 1) { + if (request_.exclude_list && request_.exclude_list->size() > 1) { silent_sign_operation_ = std::make_unique<Ctap2DeviceOperation< CtapGetAssertionRequest, AuthenticatorGetAssertionResponse>>( device(), NextSilentSignRequest(), @@ -160,7 +160,7 @@ void MakeCredentialTask::HandleResponseToSilentSignRequest( CtapDeviceResponseCode response_code, base::Optional<AuthenticatorGetAssertionResponse> response_data) { - DCHECK(request_.exclude_list() && request_.exclude_list()->size() > 0); + DCHECK(request_.exclude_list && request_.exclude_list->size() > 0); if (canceled_) { return; @@ -171,8 +171,7 @@ // touch and and the CTAP2_ERR_CREDENTIAL_EXCLUDED error code. if (response_code == CtapDeviceResponseCode::kSuccess) { CtapMakeCredentialRequest request = request_; - request.SetExcludeList( - {{request_.exclude_list()->at(current_credential_)}}); + request.exclude_list = {{request_.exclude_list->at(current_credential_)}}; register_operation_ = std::make_unique<Ctap2DeviceOperation< CtapMakeCredentialRequest, AuthenticatorMakeCredentialResponse>>( device(), std::move(request), std::move(callback_), @@ -203,7 +202,7 @@ // The authenticator doesn't recognize this particular credential from the // exclude list. Try the next one. - if (++current_credential_ < request_.exclude_list()->size()) { + if (++current_credential_ < request_.exclude_list->size()) { silent_sign_operation_ = std::make_unique<Ctap2DeviceOperation< CtapGetAssertionRequest, AuthenticatorGetAssertionResponse>>( device(), NextSilentSignRequest(), @@ -219,7 +218,7 @@ // register request may proceed but without the exclude list present in case // it exceeds the device's size limit. CtapMakeCredentialRequest request = request_; - request.SetExcludeList({}); + request.exclude_list.reset(); register_operation_ = std::make_unique<Ctap2DeviceOperation< CtapMakeCredentialRequest, AuthenticatorMakeCredentialResponse>>( device(), std::move(request), std::move(callback_),
diff --git a/device/fido/make_credential_task_unittest.cc b/device/fido/make_credential_task_unittest.cc index 377ef1d..ded1476 100644 --- a/device/fido/make_credential_task_unittest.cc +++ b/device/fido/make_credential_task_unittest.cc
@@ -153,7 +153,7 @@ test_data::kClientDataJson, std::move(rp), std::move(user), PublicKeyCredentialParams( std::vector<PublicKeyCredentialParams::CredentialInfo>(1))); - request.SetUserVerification(UserVerificationRequirement::kRequired); + request.user_verification = UserVerificationRequirement::kRequired; const auto task = std::make_unique<MakeCredentialTask>( device.get(), std::move(request), callback_receiver_.callback()); @@ -179,7 +179,7 @@ test_data::kClientDataJson, std::move(rp), std::move(user), PublicKeyCredentialParams( std::vector<PublicKeyCredentialParams::CredentialInfo>(1))); - request.set_is_u2f_only(true); + request.is_u2f_only = true; const auto task = std::make_unique<MakeCredentialTask>( device.get(), std::move(request), callback_receiver_.callback()); make_credential_callback_receiver().WaitForCallback();
diff --git a/device/fido/pin.cc b/device/fido/pin.cc index bd524e2..9f0bbc62 100644 --- a/device/fido/pin.cc +++ b/device/fido/pin.cc
@@ -74,8 +74,9 @@ cbor::Value(std::move(map))); } +// static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> -RetriesRequest::EncodeAsCBOR() const { +RetriesRequest::EncodeAsCBOR(const RetriesRequest&) { return EncodePINCommand(Subcommand::kGetRetries); } @@ -105,8 +106,9 @@ return ret; } +// static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> -KeyAgreementRequest::EncodeAsCBOR() const { +KeyAgreementRequest::EncodeAsCBOR(const KeyAgreementRequest&) { return EncodePINCommand(Subcommand::kGetKeyAgreement); } @@ -287,17 +289,18 @@ EVP_CIPHER_CTX_cleanup(&aes_ctx); } +// static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> -SetRequest::EncodeAsCBOR() const { +SetRequest::EncodeAsCBOR(const SetRequest& request) { // See // https://fidoalliance.org/specs/fido-v2.0-rd-20180702/fido-client-to-authenticator-protocol-v2.0-rd-20180702.html#settingNewPin uint8_t shared_key[SHA256_DIGEST_LENGTH]; - auto cose_key = GenerateSharedKey(peer_key_, shared_key); + auto cose_key = GenerateSharedKey(request.peer_key_, shared_key); static_assert((sizeof(pin_) % AES_BLOCK_SIZE) == 0, "pin_ is not a multiple of the AES block size"); uint8_t encrypted_pin[sizeof(pin_)]; - Encrypt(shared_key, pin_, encrypted_pin); + Encrypt(shared_key, request.pin_, encrypted_pin); std::vector<uint8_t> pin_auth = MakePinAuth(base::make_span(shared_key, sizeof(shared_key)), @@ -345,22 +348,23 @@ return ret; } +// static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> -ChangeRequest::EncodeAsCBOR() const { +ChangeRequest::EncodeAsCBOR(const ChangeRequest& request) { // See // https://fidoalliance.org/specs/fido-v2.0-rd-20180702/fido-client-to-authenticator-protocol-v2.0-rd-20180702.html#changingExistingPin uint8_t shared_key[SHA256_DIGEST_LENGTH]; - auto cose_key = GenerateSharedKey(peer_key_, shared_key); + auto cose_key = GenerateSharedKey(request.peer_key_, shared_key); static_assert((sizeof(new_pin_) % AES_BLOCK_SIZE) == 0, "new_pin_ is not a multiple of the AES block size"); uint8_t encrypted_pin[sizeof(new_pin_)]; - Encrypt(shared_key, new_pin_, encrypted_pin); + Encrypt(shared_key, request.new_pin_, encrypted_pin); static_assert((sizeof(old_pin_hash_) % AES_BLOCK_SIZE) == 0, "old_pin_hash_ is not a multiple of the AES block size"); uint8_t old_pin_hash_enc[sizeof(old_pin_hash_)]; - Encrypt(shared_key, old_pin_hash_, old_pin_hash_enc); + Encrypt(shared_key, request.old_pin_hash_, old_pin_hash_enc); uint8_t ciphertexts_concat[sizeof(encrypted_pin) + sizeof(old_pin_hash_enc)]; memcpy(ciphertexts_concat, encrypted_pin, sizeof(encrypted_pin)); @@ -386,8 +390,9 @@ }); } +// static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> -ResetRequest::EncodeAsCBOR() const { +ResetRequest::EncodeAsCBOR(const ResetRequest&) { return std::make_pair(CtapRequestCommand::kAuthenticatorReset, base::nullopt); } @@ -408,18 +413,19 @@ return shared_key_; } +// static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> -TokenRequest::EncodeAsCBOR() const { +TokenRequest::EncodeAsCBOR(const TokenRequest& request) { static_assert((sizeof(pin_hash_) % AES_BLOCK_SIZE) == 0, "pin_hash_ is not a multiple of the AES block size"); - uint8_t encrypted_pin[sizeof(pin_hash_)]; - Encrypt(shared_key_.data(), pin_hash_, encrypted_pin); + uint8_t encrypted_pin[sizeof(request.pin_hash_)]; + Encrypt(request.shared_key_.data(), request.pin_hash_, encrypted_pin); return EncodePINCommand( Subcommand::kGetPINToken, - [this, &encrypted_pin](cbor::Value::MapValue* map) { + [&request, &encrypted_pin](cbor::Value::MapValue* map) { map->emplace(static_cast<int>(RequestKey::kKeyAgreement), - std::move(this->cose_key_)); + std::move(request.cose_key_)); map->emplace( static_cast<int>(RequestKey::kPINHashEnc), base::span<const uint8_t>(encrypted_pin, sizeof(encrypted_pin)));
diff --git a/device/fido/pin.h b/device/fido/pin.h index f13cccae..6226095 100644 --- a/device/fido/pin.h +++ b/device/fido/pin.h
@@ -44,8 +44,8 @@ // RetriesRequest asks an authenticator for the number of remaining PIN attempts // before the device is locked. struct RetriesRequest { - std::pair<CtapRequestCommand, base::Optional<cbor::Value>> EncodeAsCBOR() - const; + static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> + EncodeAsCBOR(const RetriesRequest&); }; // RetriesResponse reflects an authenticator's response to a |RetriesRequest|. @@ -64,8 +64,8 @@ // KeyAgreementRequest asks an authenticator for an ephemeral ECDH key for // encrypting PIN material in future requests. struct KeyAgreementRequest { - std::pair<CtapRequestCommand, base::Optional<cbor::Value>> EncodeAsCBOR() - const; + static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> + EncodeAsCBOR(const KeyAgreementRequest&); }; // KeyAgreementResponse reflects an authenticator's response to a @@ -92,8 +92,8 @@ // IsValid(pin) must be true. SetRequest(const std::string& pin, const KeyAgreementResponse& peer_key); - std::pair<CtapRequestCommand, base::Optional<cbor::Value>> EncodeAsCBOR() - const; + static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> + EncodeAsCBOR(const SetRequest&); private: const KeyAgreementResponse peer_key_; @@ -114,8 +114,8 @@ const std::string& new_pin, const KeyAgreementResponse& peer_key); - std::pair<CtapRequestCommand, base::Optional<cbor::Value>> EncodeAsCBOR() - const; + static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> + EncodeAsCBOR(const ChangeRequest&); private: const KeyAgreementResponse peer_key_; @@ -128,8 +128,8 @@ // PIN-related command, but is generally used to reset a PIN and so is // included here. struct ResetRequest { - std::pair<CtapRequestCommand, base::Optional<cbor::Value>> EncodeAsCBOR() - const; + static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> + EncodeAsCBOR(const ResetRequest&); }; using ResetResponse = EmptyResponse; @@ -148,8 +148,8 @@ // This is needed to decrypt the response. const std::array<uint8_t, 32>& shared_key() const; - std::pair<CtapRequestCommand, base::Optional<cbor::Value>> EncodeAsCBOR() - const; + static std::pair<CtapRequestCommand, base::Optional<cbor::Value>> + EncodeAsCBOR(const TokenRequest&); private: std::array<uint8_t, 32> shared_key_;
diff --git a/device/fido/u2f_command_constructor.cc b/device/fido/u2f_command_constructor.cc index d8ef619..0dae0a1 100644 --- a/device/fido/u2f_command_constructor.cc +++ b/device/fido/u2f_command_constructor.cc
@@ -15,12 +15,12 @@ bool IsConvertibleToU2fRegisterCommand( const CtapMakeCredentialRequest& request) { - if (request.user_verification() == UserVerificationRequirement::kRequired || - request.resident_key_required()) + if (request.user_verification == UserVerificationRequirement::kRequired || + request.resident_key_required) return false; const auto& public_key_credential_info = - request.public_key_credential_params().public_key_credential_params(); + request.public_key_credential_params.public_key_credential_params(); return std::any_of( public_key_credential_info.begin(), public_key_credential_info.end(), [](const auto& credential_info) { @@ -30,9 +30,8 @@ } bool IsConvertibleToU2fSignCommand(const CtapGetAssertionRequest& request) { - const auto& allow_list = request.allow_list(); - return request.user_verification() != - UserVerificationRequirement::kRequired && + const auto& allow_list = request.allow_list; + return request.user_verification != UserVerificationRequirement::kRequired && allow_list && !allow_list->empty(); } @@ -41,26 +40,26 @@ if (!IsConvertibleToU2fRegisterCommand(request)) return base::nullopt; - if (request.pin_auth() && request.pin_auth()->size() == 0) { + if (request.pin_auth && request.pin_auth->size() == 0) { // An empty pin_auth in CTAP2 indicates that the device should just wait // for a touch. return ConstructBogusU2fRegistrationCommand(); } const bool is_invidual_attestation = - request.attestation_preference() == + request.attestation_preference == AttestationConveyancePreference::ENTERPRISE; return ConstructU2fRegisterCommand( - fido_parsing_utils::CreateSHA256Hash(request.rp().rp_id()), - request.client_data_hash(), is_invidual_attestation); + fido_parsing_utils::CreateSHA256Hash(request.rp.rp_id()), + request.client_data_hash, is_invidual_attestation); } base::Optional<std::vector<uint8_t>> ConvertToU2fSignCommand( const CtapMakeCredentialRequest& request, base::span<const uint8_t> key_handle) { return ConstructU2fSignCommand( - fido_parsing_utils::CreateSHA256Hash(request.rp().rp_id()), - request.client_data_hash(), key_handle); + fido_parsing_utils::CreateSHA256Hash(request.rp.rp_id()), + request.client_data_hash, key_handle); } base::Optional<std::vector<uint8_t>> ConvertToU2fSignCommand( @@ -72,12 +71,12 @@ const auto& application_parameter = application_parameter_type == ApplicationParameterType::kPrimary - ? fido_parsing_utils::CreateSHA256Hash(request.rp_id()) - : request.alternative_application_parameter().value_or( + ? fido_parsing_utils::CreateSHA256Hash(request.rp_id) + : request.alternative_application_parameter.value_or( std::array<uint8_t, kRpIdHashLength>()); return ConstructU2fSignCommand(application_parameter, - request.client_data_hash(), key_handle); + request.client_data_hash, key_handle); } std::vector<uint8_t> ConstructU2fRegisterCommand(
diff --git a/device/fido/u2f_command_constructor_unittest.cc b/device/fido/u2f_command_constructor_unittest.cc index deadbc8..d3ec18a 100644 --- a/device/fido/u2f_command_constructor_unittest.cc +++ b/device/fido/u2f_command_constructor_unittest.cc
@@ -90,15 +90,15 @@ TEST(U2fCommandConstructorTest, TestU2fRegisterUserVerificationRequirement) { auto make_credential_param = ConstructMakeCredentialRequest(); - make_credential_param.SetUserVerification( - UserVerificationRequirement::kRequired); + make_credential_param.user_verification = + UserVerificationRequirement::kRequired; EXPECT_FALSE(IsConvertibleToU2fRegisterCommand(make_credential_param)); } TEST(U2fCommandConstructorTest, TestU2fRegisterResidentKeyRequirement) { auto make_credential_param = ConstructMakeCredentialRequest(); - make_credential_param.SetResidentKeyRequired(true); + make_credential_param.resident_key_required = true; EXPECT_FALSE(IsConvertibleToU2fRegisterCommand(make_credential_param)); } @@ -118,7 +118,7 @@ allowed_list.push_back(PublicKeyCredentialDescriptor( CredentialType::kPublicKey, fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle))); - get_assertion_req.SetAllowList(std::move(allowed_list)); + get_assertion_req.allow_list = std::move(allowed_list); const auto u2f_sign_command = ConvertToU2fSignCommand( get_assertion_req, ApplicationParameterType::kPrimary, @@ -141,8 +141,8 @@ allowed_list.push_back(PublicKeyCredentialDescriptor( CredentialType::kPublicKey, fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle))); - get_assertion_req.SetAllowList(std::move(allowed_list)); - get_assertion_req.SetUserVerification(UserVerificationRequirement::kRequired); + get_assertion_req.allow_list = std::move(allowed_list); + get_assertion_req.user_verification = UserVerificationRequirement::kRequired; EXPECT_FALSE(IsConvertibleToU2fSignCommand(get_assertion_req)); }
diff --git a/device/fido/u2f_register_operation.cc b/device/fido/u2f_register_operation.cc index 55d5e7f..85ee37e 100644 --- a/device/fido/u2f_register_operation.cc +++ b/device/fido/u2f_register_operation.cc
@@ -32,7 +32,7 @@ void U2fRegisterOperation::Start() { DCHECK(IsConvertibleToU2fRegisterCommand(request())); - const auto& exclude_list = request().exclude_list(); + const auto& exclude_list = request().exclude_list; if (exclude_list && !exclude_list->empty()) { // First try signing with the excluded credentials to see whether this // device should be excluded. @@ -97,7 +97,7 @@ case apdu::ApduResponse::Status::SW_WRONG_LENGTH: // Continue to iterate through the provided key handles in the exclude // list to check for already registered keys. - if (++current_key_handle_index_ < request().exclude_list()->size()) { + if (++current_key_handle_index_ < request().exclude_list->size()) { TrySign(); } else { // Reached the end of exclude list with no duplicate credential. @@ -141,7 +141,7 @@ auto response = AuthenticatorMakeCredentialResponse::CreateFromU2fRegisterResponse( device()->DeviceTransport(), - fido_parsing_utils::CreateSHA256Hash(request().rp().rp_id()), + fido_parsing_utils::CreateSHA256Hash(request().rp.rp_id()), apdu_response->data()); std::move(callback()) .Run(CtapDeviceResponseCode::kSuccess, std::move(response)); @@ -166,8 +166,8 @@ } const std::vector<uint8_t>& U2fRegisterOperation::excluded_key_handle() const { - DCHECK_LT(current_key_handle_index_, request().exclude_list()->size()); - return request().exclude_list().value()[current_key_handle_index_].id(); + DCHECK_LT(current_key_handle_index_, request().exclude_list->size()); + return request().exclude_list.value()[current_key_handle_index_].id(); } } // namespace device
diff --git a/device/fido/u2f_register_operation_unittest.cc b/device/fido/u2f_register_operation_unittest.cc index 3d3c69f..d81ec4f 100644 --- a/device/fido/u2f_register_operation_unittest.cc +++ b/device/fido/u2f_register_operation_unittest.cc
@@ -38,10 +38,10 @@ test_data::kClientDataJson, std::move(rp), std::move(user), PublicKeyCredentialParams( std::vector<PublicKeyCredentialParams::CredentialInfo>(1))); - request.SetExcludeList(std::move(registered_keys)); + request.exclude_list = std::move(registered_keys); if (is_individual_attestation) - request.set_attestation_preference( - AttestationConveyancePreference::ENTERPRISE); + request.attestation_preference = + AttestationConveyancePreference::ENTERPRISE; return request; }
diff --git a/device/fido/u2f_sign_operation.cc b/device/fido/u2f_sign_operation.cc index c0499486..4245d38d 100644 --- a/device/fido/u2f_sign_operation.cc +++ b/device/fido/u2f_sign_operation.cc
@@ -27,9 +27,9 @@ U2fSignOperation::~U2fSignOperation() = default; void U2fSignOperation::Start() { - const auto& allow_list = request().allow_list(); + const auto& allow_list = request().allow_list; if (allow_list && !allow_list->empty()) { - if (request().alternative_application_parameter().has_value()) { + if (request().alternative_application_parameter.has_value()) { // Try the alternative value first. This is because the U2F Zero // authenticator (at least) crashes if we try the wrong AppID first. app_param_type_ = ApplicationParameterType::kAlternative; @@ -79,8 +79,8 @@ case apdu::ApduResponse::Status::SW_NO_ERROR: { auto application_parameter = app_param_type_ == ApplicationParameterType::kPrimary - ? fido_parsing_utils::CreateSHA256Hash(request().rp_id()) - : request().alternative_application_parameter().value_or( + ? fido_parsing_utils::CreateSHA256Hash(request().rp_id) + : request().alternative_application_parameter.value_or( std::array<uint8_t, kRpIdHashLength>()); auto sign_response = AuthenticatorGetAssertionResponse::CreateFromU2fSignResponse( @@ -103,9 +103,9 @@ // the primary value to try. app_param_type_ = ApplicationParameterType::kPrimary; TrySign(); - } else if (++current_key_handle_index_ < request().allow_list()->size()) { + } else if (++current_key_handle_index_ < request().allow_list->size()) { // Key is not for this device. Try signing with the next key. - if (request().alternative_application_parameter().has_value()) { + if (request().alternative_application_parameter.has_value()) { app_param_type_ = ApplicationParameterType::kAlternative; } TrySign(); @@ -179,8 +179,8 @@ } const std::vector<uint8_t>& U2fSignOperation::key_handle() const { - DCHECK_LT(current_key_handle_index_, request().allow_list()->size()); - return request().allow_list().value()[current_key_handle_index_].id(); + DCHECK_LT(current_key_handle_index_, request().allow_list->size()); + return request().allow_list->at(current_key_handle_index_).id(); } } // namespace device
diff --git a/device/fido/u2f_sign_operation_unittest.cc b/device/fido/u2f_sign_operation_unittest.cc index cf35cc3..ec7223d 100644 --- a/device/fido/u2f_sign_operation_unittest.cc +++ b/device/fido/u2f_sign_operation_unittest.cc
@@ -40,13 +40,11 @@ CtapGetAssertionRequest request(test_data::kRelyingPartyId, test_data::kClientDataJson); - std::vector<PublicKeyCredentialDescriptor> allowed_list; + request.allow_list.emplace(); for (auto& key_handle : key_handles) { - allowed_list.emplace_back(CredentialType::kPublicKey, - std::move(key_handle)); + request.allow_list->emplace_back(CredentialType::kPublicKey, + std::move(key_handle)); } - - request.SetAllowList(std::move(allowed_list)); return request; } @@ -330,7 +328,10 @@ TEST_F(U2fSignOperationTest, AlternativeApplicationParameter) { auto request = CreateSignRequest( {fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle)}); - request.SetAppId(test_data::kAppId); + request.app_id = test_data::kAppId; + request.alternative_application_parameter = + fido_parsing_utils::Materialize(base::span<const uint8_t, 32>( + test_data::kAlternativeApplicationParameter)); auto device = std::make_unique<MockFidoDevice>(); EXPECT_CALL(*device, GetId()).WillRepeatedly(::testing::Return("device")); @@ -352,16 +353,19 @@ ::testing::ElementsAreArray(test_data::kU2fSignature)); EXPECT_THAT(response_value->raw_credential_id(), ::testing::ElementsAreArray(test_data::kU2fSignKeyHandle)); - EXPECT_THAT( - response_value->GetRpIdHash(), - ::testing::ElementsAreArray(test_data::kAlternativeApplicationParameter)); + EXPECT_THAT(response_value->GetRpIdHash(), + ::testing::ElementsAreArray(base::span<const uint8_t, 32>( + test_data::kAlternativeApplicationParameter))); } // This is a regression test in response to https://crbug.com/833398. TEST_F(U2fSignOperationTest, AlternativeApplicationParameterRejection) { auto request = CreateSignRequest( {fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle)}); - request.SetAppId(test_data::kAppId); + request.app_id = test_data::kAppId; + request.alternative_application_parameter = + fido_parsing_utils::Materialize(base::span<const uint8_t, 32>( + test_data::kAlternativeApplicationParameter)); auto device = std::make_unique<MockFidoDevice>(); EXPECT_CALL(*device, GetId()).WillRepeatedly(::testing::Return("device"));
diff --git a/device/fido/virtual_ctap2_device.cc b/device/fido/virtual_ctap2_device.cc index 21384ff..9797562d 100644 --- a/device/fido/virtual_ctap2_device.cc +++ b/device/fido/virtual_ctap2_device.cc
@@ -179,7 +179,7 @@ // algorithm in publicKeyCredParam. bool AreMakeCredentialParamsValid(const CtapMakeCredentialRequest& request) { const auto& params = - request.public_key_credential_params().public_key_credential_params(); + request.public_key_credential_params.public_key_credential_params(); return std::any_of( params.begin(), params.end(), [](const auto& credential_info) { return credential_info.algorithm == @@ -544,9 +544,9 @@ bool user_verified; const CtapDeviceResponseCode uv_error = CheckUserVerification( - true /* is makeCredential */, options, request.pin_auth(), - request.pin_protocol(), mutable_state()->pin_token, client_data_hash, - request.user_verification(), mutable_state()->simulate_press_callback, + true /* is makeCredential */, options, request.pin_auth, + request.pin_protocol, mutable_state()->pin_token, client_data_hash, + request.user_verification, mutable_state()->simulate_press_callback, &user_verified); if (uv_error != CtapDeviceResponseCode::kSuccess) { return uv_error; @@ -554,14 +554,14 @@ // 6. Check for already registered credentials. const auto rp_id_hash = - fido_parsing_utils::CreateSHA256Hash(request.rp().rp_id()); - if (request.exclude_list()) { + fido_parsing_utils::CreateSHA256Hash(request.rp.rp_id()); + if (request.exclude_list) { if (config_.reject_large_allow_and_exclude_lists && - request.exclude_list()->size() > 1) { + request.exclude_list->size() > 1) { return CtapDeviceResponseCode::kCtap2ErrLimitExceeded; } - for (const auto& excluded_credential : *request.exclude_list()) { + for (const auto& excluded_credential : *request.exclude_list) { if (FindRegistrationData(excluded_credential.id(), rp_id_hash)) { if (mutable_state()->simulate_press_callback) { mutable_state()->simulate_press_callback.Run(); @@ -579,7 +579,7 @@ } // Step 8. - if ((request.resident_key_required() && !options.supports_resident_key) || + if ((request.resident_key_required && !options.supports_resident_key) || !options.supports_user_presence) { return CtapDeviceResponseCode::kCtap2ErrUnsupportedOption; } @@ -602,7 +602,7 @@ std::vector<uint8_t> key_handle(hash.begin(), hash.end()); base::Optional<cbor::Value> extensions; - if (request.hmac_secret()) { + if (request.hmac_secret) { cbor::Value::MapValue extensions_map; extensions_map.emplace(cbor::Value(kExtensionHmacSecret), cbor::Value(true)); @@ -641,12 +641,12 @@ RegistrationData registration(std::move(private_key), rp_id_hash, 1 /* signature counter */); - if (request.resident_key_required()) { + if (request.resident_key_required) { // If there's already a registration for this RP and user ID, delete it. for (const auto& registration : mutable_state()->registrations) { if (registration.second.is_resident && rp_id_hash == registration.second.application_parameter && - registration.second.user->id == request.user().id) { + registration.second.user->id == request.user.id) { mutable_state()->registrations.erase(registration.first); break; } @@ -664,7 +664,7 @@ } registration.is_resident = true; - registration.user = request.user(); + registration.user = request.user; } StoreNewKey(key_handle, std::move(registration)); @@ -688,9 +688,9 @@ bool user_verified; const CtapDeviceResponseCode uv_error = CheckUserVerification( - false /* not makeCredential */, options, request.pin_auth(), - request.pin_protocol(), mutable_state()->pin_token, client_data_hash, - request.user_verification(), mutable_state()->simulate_press_callback, + false /* not makeCredential */, options, request.pin_auth, + request.pin_protocol, mutable_state()->pin_token, client_data_hash, + request.user_verification, mutable_state()->simulate_press_callback, &user_verified); if (uv_error != CtapDeviceResponseCode::kSuccess) { return uv_error; @@ -698,23 +698,23 @@ // Resident keys are not supported. if (!config_.resident_key_support && - (!request.allow_list() || request.allow_list()->empty())) { + (!request.allow_list || request.allow_list->empty())) { return CtapDeviceResponseCode::kCtap2ErrNoCredentials; } - const auto rp_id_hash = fido_parsing_utils::CreateSHA256Hash(request.rp_id()); + const auto rp_id_hash = fido_parsing_utils::CreateSHA256Hash(request.rp_id); std::vector<std::pair<base::span<const uint8_t>, RegistrationData*>> found_registrations; - if (!request.user_presence_required() && + if (!request.user_presence_required && config_.reject_silent_authentication_requests) { return CtapDeviceResponseCode::kCtap2ErrUnsupportedOption; } - if (request.allow_list()) { + if (request.allow_list) { if (config_.reject_large_allow_and_exclude_lists && - request.allow_list()->size() > 1) { + request.allow_list->size() > 1) { return CtapDeviceResponseCode::kCtap2ErrLimitExceeded; } @@ -722,7 +722,7 @@ // some authenticators in practice don't take it that way. Thus this code // mirrors that to better reflect reality. CTAP 2.0 leaves it as undefined // behaviour. - for (const auto& allowed_credential : *request.allow_list()) { + for (const auto& allowed_credential : *request.allow_list) { RegistrationData* found = FindRegistrationData(allowed_credential.id(), rp_id_hash); if (found) { @@ -747,12 +747,12 @@ } // Step 5. - if (!options.supports_user_presence && request.user_presence_required()) { + if (!options.supports_user_presence && request.user_presence_required) { return CtapDeviceResponseCode::kCtap2ErrUnsupportedOption; } // Step 7. - if (request.user_presence_required() && !user_verified && + if (request.user_presence_required && !user_verified && mutable_state()->simulate_press_callback) { mutable_state()->simulate_press_callback.Run(); } @@ -1128,7 +1128,7 @@ exclude_list.push_back(std::move(*excluded_credential)); } - request.SetExcludeList(std::move(exclude_list)); + request.exclude_list = std::move(exclude_list); } const auto extensions_it = request_map.find(cbor::Value(6)); @@ -1144,7 +1144,7 @@ if (!hmac_secret_it->second.is_bool()) { return base::nullopt; } - request.SetHmacSecret(hmac_secret_it->second.GetBool()); + request.hmac_secret = hmac_secret_it->second.GetBool(); } } @@ -1160,22 +1160,22 @@ const auto resident_key_option = option_map.find(cbor::Value(kResidentKeyMapKey)); if (resident_key_option != option_map.end()) - request.SetResidentKeyRequired(resident_key_option->second.GetBool()); + request.resident_key_required = resident_key_option->second.GetBool(); const auto uv_option = option_map.find(cbor::Value(kUserVerificationMapKey)); if (uv_option != option_map.end()) - request.SetUserVerification( + request.user_verification = uv_option->second.GetBool() ? UserVerificationRequirement::kRequired - : UserVerificationRequirement::kDiscouraged); + : UserVerificationRequirement::kDiscouraged; } const auto pin_auth_it = request_map.find(cbor::Value(8)); if (pin_auth_it != request_map.end()) { if (!pin_auth_it->second.is_bytestring()) return base::nullopt; - request.SetPinAuth(pin_auth_it->second.GetBytestring()); + request.pin_auth = pin_auth_it->second.GetBytestring(); } const auto pin_protocol_it = request_map.find(cbor::Value(9)); @@ -1184,7 +1184,7 @@ pin_protocol_it->second.GetUnsigned() > std::numeric_limits<uint8_t>::max()) return base::nullopt; - request.SetPinProtocol(pin_protocol_it->second.GetUnsigned()); + request.pin_protocol = pin_protocol_it->second.GetUnsigned(); } return std::make_pair(std::move(request), @@ -1234,7 +1234,7 @@ allow_list.push_back(std::move(*allowed_credential)); } - request.SetAllowList(std::move(allow_list)); + request.allow_list = std::move(allow_list); } const auto option_it = request_map.find(cbor::Value(5)); @@ -1249,22 +1249,21 @@ const auto user_presence_option = option_map.find(cbor::Value(kUserPresenceMapKey)); if (user_presence_option != option_map.end()) - request.SetUserPresenceRequired(user_presence_option->second.GetBool()); + request.user_presence_required = user_presence_option->second.GetBool(); const auto uv_option = option_map.find(cbor::Value(kUserVerificationMapKey)); if (uv_option != option_map.end()) - request.SetUserVerification( - uv_option->second.GetBool() - ? UserVerificationRequirement::kRequired - : UserVerificationRequirement::kPreferred); + request.user_verification = uv_option->second.GetBool() + ? UserVerificationRequirement::kRequired + : UserVerificationRequirement::kPreferred; } const auto pin_auth_it = request_map.find(cbor::Value(6)); if (pin_auth_it != request_map.end()) { if (!pin_auth_it->second.is_bytestring()) return base::nullopt; - request.SetPinAuth(pin_auth_it->second.GetBytestring()); + request.pin_auth = pin_auth_it->second.GetBytestring(); } const auto pin_protocol_it = request_map.find(cbor::Value(7)); @@ -1273,7 +1272,7 @@ pin_protocol_it->second.GetUnsigned() > std::numeric_limits<uint8_t>::max()) return base::nullopt; - request.SetPinProtocol(pin_protocol_it->second.GetUnsigned()); + request.pin_protocol = pin_protocol_it->second.GetUnsigned(); } return std::make_pair(std::move(request),
diff --git a/device/fido/win/webauthn_api.cc b/device/fido/win/webauthn_api.cc index 1436800..3333c4c3 100644 --- a/device/fido/win/webauthn_api.cc +++ b/device/fido/win/webauthn_api.cc
@@ -195,20 +195,18 @@ CtapMakeCredentialRequest request) { DCHECK(webauthn_api->IsAvailable()); - base::string16 rp_id = base::UTF8ToUTF16(request.rp().rp_id()); - base::string16 rp_name = - base::UTF8ToUTF16(request.rp().rp_name().value_or("")); - base::string16 rp_icon_url = OptionalGURLToUTF16(request.rp().rp_icon_url()); + base::string16 rp_id = base::UTF8ToUTF16(request.rp.rp_id()); + base::string16 rp_name = base::UTF8ToUTF16(request.rp.rp_name().value_or("")); + base::string16 rp_icon_url = OptionalGURLToUTF16(request.rp.rp_icon_url()); WEBAUTHN_RP_ENTITY_INFORMATION rp_info{ WEBAUTHN_RP_ENTITY_INFORMATION_CURRENT_VERSION, rp_id.c_str(), rp_name.c_str(), rp_icon_url.c_str()}; - base::string16 user_name = - base::UTF8ToUTF16(request.user().name.value_or("")); - base::string16 user_icon_url = OptionalGURLToUTF16(request.user().icon_url); + base::string16 user_name = base::UTF8ToUTF16(request.user.name.value_or("")); + base::string16 user_icon_url = OptionalGURLToUTF16(request.user.icon_url); base::string16 user_display_name = - base::UTF8ToUTF16(request.user().display_name.value_or("")); - std::vector<uint8_t> user_id = request.user().id; + base::UTF8ToUTF16(request.user.display_name.value_or("")); + std::vector<uint8_t> user_id = request.user.id; WEBAUTHN_USER_ENTITY_INFORMATION user_info{ WEBAUTHN_USER_ENTITY_INFORMATION_CURRENT_VERSION, user_id.size(), @@ -221,7 +219,7 @@ std::vector<WEBAUTHN_COSE_CREDENTIAL_PARAMETER> cose_credential_parameter_values; for (const PublicKeyCredentialParams::CredentialInfo& credential_info : - request.public_key_credential_params().public_key_credential_params()) { + request.public_key_credential_params.public_key_credential_params()) { if (credential_info.type != CredentialType::kPublicKey) { continue; } @@ -233,7 +231,7 @@ cose_credential_parameter_values.size(), cose_credential_parameter_values.data()}; - std::string client_data_json = request.client_data_json(); + std::string client_data_json = request.client_data_json; WEBAUTHN_CLIENT_DATA client_data{ WEBAUTHN_CLIENT_DATA_CURRENT_VERSION, client_data_json.size(), const_cast<unsigned char*>( @@ -241,7 +239,7 @@ WEBAUTHN_HASH_ALGORITHM_SHA_256}; std::vector<WEBAUTHN_EXTENSION> extensions; - if (request.hmac_secret()) { + if (request.hmac_secret) { static BOOL kHMACSecretTrue = TRUE; extensions.emplace_back( WEBAUTHN_EXTENSION{WEBAUTHN_EXTENSIONS_IDENTIFIER_HMAC_SECRET, @@ -249,20 +247,20 @@ } uint32_t authenticator_attachment; - if (request.is_u2f_only()) { + if (request.is_u2f_only) { authenticator_attachment = WEBAUTHN_AUTHENTICATOR_ATTACHMENT_CROSS_PLATFORM_U2F_V2; - } else if (request.is_incognito_mode()) { + } else if (request.is_incognito_mode) { // Disable all platform authenticators in incognito mode. We are going to // revisit this in crbug/908622. authenticator_attachment = WEBAUTHN_AUTHENTICATOR_ATTACHMENT_CROSS_PLATFORM; } else { authenticator_attachment = - ToWinAuthenticatorAttachment(request.authenticator_attachment()); + ToWinAuthenticatorAttachment(request.authenticator_attachment); } std::vector<WEBAUTHN_CREDENTIAL_EX> exclude_list_credentials = - ToWinCredentialExVector(request.exclude_list()); + ToWinCredentialExVector(request.exclude_list); std::vector<WEBAUTHN_CREDENTIAL_EX*> exclude_list_ptrs; std::transform( exclude_list_credentials.begin(), exclude_list_credentials.end(), @@ -277,9 +275,9 @@ 0, nullptr}, // Ignored because pExcludeCredentialList is set. WEBAUTHN_EXTENSIONS{extensions.size(), extensions.data()}, authenticator_attachment, - request.resident_key_required(), - ToWinUserVerificationRequirement(request.user_verification()), - ToWinAttestationConveyancePreference(request.attestation_preference()), + request.resident_key_required, + ToWinUserVerificationRequirement(request.user_verification), + ToWinAttestationConveyancePreference(request.attestation_preference), /*dwFlags=*/0, &cancellation_id, &exclude_credential_list, @@ -314,8 +312,8 @@ CtapGetAssertionRequest request) { DCHECK(webauthn_api->IsAvailable()); - base::string16 rp_id16 = base::UTF8ToUTF16(request.rp_id()); - std::string client_data_json = request.client_data_json(); + base::string16 rp_id16 = base::UTF8ToUTF16(request.rp_id); + std::string client_data_json = request.client_data_json; WEBAUTHN_CLIENT_DATA client_data{ WEBAUTHN_CLIENT_DATA_CURRENT_VERSION, client_data_json.size(), const_cast<unsigned char*>( @@ -323,14 +321,14 @@ WEBAUTHN_HASH_ALGORITHM_SHA_256}; base::Optional<base::string16> opt_app_id16 = base::nullopt; - if (request.app_id()) { - opt_app_id16 = base::UTF8ToUTF16(base::StringPiece( - reinterpret_cast<const char*>(request.app_id()->data()), - request.app_id()->size())); + if (request.app_id) { + opt_app_id16 = base::UTF8ToUTF16( + base::StringPiece(reinterpret_cast<const char*>(request.app_id->data()), + request.app_id->size())); } std::vector<WEBAUTHN_CREDENTIAL_EX> allow_list_credentials = - ToWinCredentialExVector(request.allow_list()); + ToWinCredentialExVector(request.allow_list); std::vector<WEBAUTHN_CREDENTIAL_EX*> allow_list_ptrs; std::transform(allow_list_credentials.begin(), allow_list_credentials.end(), std::back_inserter(allow_list_ptrs), @@ -338,13 +336,13 @@ WEBAUTHN_CREDENTIAL_LIST allow_credential_list{allow_list_ptrs.size(), allow_list_ptrs.data()}; - auto legacy_credentials = ToWinCredentialVector(request.allow_list()); + auto legacy_credentials = ToWinCredentialVector(request.allow_list); uint32_t authenticator_attachment; if (opt_app_id16) { authenticator_attachment = WEBAUTHN_AUTHENTICATOR_ATTACHMENT_CROSS_PLATFORM_U2F_V2; - } else if (request.is_incognito_mode()) { + } else if (request.is_incognito_mode) { // Disable all platform authenticators in incognito mode. We are going to // revisit this in crbug/908622. authenticator_attachment = WEBAUTHN_AUTHENTICATOR_ATTACHMENT_CROSS_PLATFORM; @@ -371,7 +369,7 @@ legacy_credentials.data()}, WEBAUTHN_EXTENSIONS{0, nullptr}, // None supported. authenticator_attachment, - ToWinUserVerificationRequirement(request.user_verification()), + ToWinUserVerificationRequirement(request.user_verification), /*dwFlags=*/0, opt_app_id16 ? opt_app_id16->data() : nullptr, opt_app_id16 ? &kUseAppIdTrue : &kUseAppIdFalse,
diff --git a/device/vr/BUILD.gn b/device/vr/BUILD.gn index 6332064d..ed5275a 100644 --- a/device/vr/BUILD.gn +++ b/device/vr/BUILD.gn
@@ -149,6 +149,18 @@ "windows_mixed_reality/mixed_reality_renderloop.h", "windows_mixed_reality/mixed_reality_statics.cc", "windows_mixed_reality/mixed_reality_statics.h", + "windows_mixed_reality/wrappers/wmr_input_location.cc", + "windows_mixed_reality/wrappers/wmr_input_location.h", + "windows_mixed_reality/wrappers/wmr_input_manager.cc", + "windows_mixed_reality/wrappers/wmr_input_manager.h", + "windows_mixed_reality/wrappers/wmr_input_source.cc", + "windows_mixed_reality/wrappers/wmr_input_source.h", + "windows_mixed_reality/wrappers/wmr_input_source_state.cc", + "windows_mixed_reality/wrappers/wmr_input_source_state.h", + "windows_mixed_reality/wrappers/wmr_pointer_pose.cc", + "windows_mixed_reality/wrappers/wmr_pointer_pose.h", + "windows_mixed_reality/wrappers/wmr_pointer_source_pose.cc", + "windows_mixed_reality/wrappers/wmr_pointer_source_pose.h", ] }
diff --git a/device/vr/windows_mixed_reality/mixed_reality_input_helper.cc b/device/vr/windows_mixed_reality/mixed_reality_input_helper.cc index 9b8fa92..13f2ded 100644 --- a/device/vr/windows_mixed_reality/mixed_reality_input_helper.cc +++ b/device/vr/windows_mixed_reality/mixed_reality_input_helper.cc
@@ -4,7 +4,6 @@ #include "device/vr/windows_mixed_reality/mixed_reality_input_helper.h" -#include <SpatialInteractionManagerInterop.h> #include <windows.perception.h> #include <windows.perception.spatial.h> #include <windows.ui.input.spatial.h> @@ -15,11 +14,14 @@ #include <unordered_map> #include <vector> -#include "base/win/core_winrt_util.h" -#include "base/win/scoped_hstring.h" -#include "base/win/typed_event_handler.h" #include "device/gamepad/public/cpp/gamepads.h" #include "device/vr/public/mojom/isolated_xr_service.mojom.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_input_location.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_input_manager.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_input_source.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_input_source_state.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_pointer_pose.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.h" #include "ui/gfx/transform.h" #include "ui/gfx/transform_util.h" @@ -35,32 +37,15 @@ using SourceKind = ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceKind; -using ABI::Windows::Foundation::IReference; using ABI::Windows::Foundation::ITypedEventHandler; -using ABI::Windows::Foundation::Collections::IVectorView; using ABI::Windows::Perception::IPerceptionTimestamp; -using ABI::Windows::Perception::People::IHeadPose; using ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem; -using ABI::Windows::UI::Input::Spatial::ISpatialInteractionControllerProperties; using ABI::Windows::UI::Input::Spatial::ISpatialInteractionManager; -using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource; -using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource2; -using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource3; using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceEventArgs; using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceEventArgs2; -using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceLocation; -using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceLocation2; -using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceLocation3; -using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceProperties; using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceState; -using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceState2; -using ABI::Windows::UI::Input::Spatial::ISpatialPointerInteractionSourcePose; -using ABI::Windows::UI::Input::Spatial::ISpatialPointerInteractionSourcePose2; -using ABI::Windows::UI::Input::Spatial::ISpatialPointerPose; -using ABI::Windows::UI::Input::Spatial::ISpatialPointerPose2; using ABI::Windows::UI::Input::Spatial::SpatialInteractionManager; using ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceEventArgs; -using ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceState; using Microsoft::WRL::Callback; using Microsoft::WRL::ComPtr; @@ -182,82 +167,45 @@ // Note that since this is built by polling, and so eventing changes are not // accounted for here. std::unordered_map<ButtonName, ButtonData> ParseButtonState( - ComPtr<ISpatialInteractionSourceState> source) { - if (!source) - return {}; - - ComPtr<ISpatialInteractionSourceState2> source_state; - HRESULT hr = source.As(&source_state); - DCHECK(SUCCEEDED(hr)); - + const WMRInputSourceState& source_state) { std::unordered_map<ButtonName, ButtonData> button_map; - boolean bool_val; - DOUBLE double_val; ButtonData data = button_map[ButtonName::kSelect]; - hr = source_state->get_IsSelectPressed(&bool_val); - DCHECK(SUCCEEDED(hr)); - data.pressed = bool_val; - data.touched = bool_val; - - hr = source_state->get_SelectPressedValue(&double_val); - DCHECK(SUCCEEDED(hr)); - data.value = double_val; + data.pressed = source_state.IsSelectPressed(); + data.touched = data.pressed; + data.value = source_state.SelectPressedValue(); button_map[ButtonName::kSelect] = data; data = button_map[ButtonName::kGrip]; - hr = source_state->get_IsGrasped(&bool_val); - DCHECK(SUCCEEDED(hr)); - data.pressed = bool_val; - data.touched = bool_val; - data.value = bool_val ? 1.0 : 0.0; + data.pressed = source_state.IsGrasped(); + data.touched = data.pressed; + data.value = data.pressed ? 1.0 : 0.0; button_map[ButtonName::kGrip] = data; - ComPtr<ISpatialInteractionControllerProperties> controller_properties; - hr = source_state->get_ControllerProperties(&controller_properties); - - // Controller Properties only exist for motion controllers - if (FAILED(hr) || !controller_properties) + if (!source_state.SupportsControllerProperties()) return button_map; data = button_map[ButtonName::kThumbstick]; - hr = controller_properties->get_IsThumbstickPressed(&bool_val); - DCHECK(SUCCEEDED(hr)); - data.pressed = bool_val; - data.touched = bool_val; - data.value = bool_val ? 1.0 : 0.0; + data.pressed = source_state.IsThumbstickPressed(); + data.touched = data.pressed; + data.value = data.pressed ? 1.0 : 0.0; - hr = controller_properties->get_ThumbstickX(&double_val); - DCHECK(SUCCEEDED(hr)); - data.x_axis = double_val; - - hr = controller_properties->get_ThumbstickY(&double_val); - DCHECK(SUCCEEDED(hr)); - data.y_axis = double_val; + data.x_axis = source_state.ThumbstickX(); + data.y_axis = source_state.ThumbstickY(); button_map[ButtonName::kThumbstick] = data; data = button_map[ButtonName::kTouchpad]; - hr = controller_properties->get_IsTouchpadPressed(&bool_val); - DCHECK(SUCCEEDED(hr)); - data.pressed = bool_val; - data.value = bool_val ? 1.0 : 0.0; - - hr = controller_properties->get_IsTouchpadTouched(&bool_val); - DCHECK(SUCCEEDED(hr)); - data.touched = bool_val; + data.pressed = source_state.IsTouchpadPressed(); + data.touched = source_state.IsTouchpadTouched(); + data.value = data.pressed ? 1.0 : 0.0; // Touchpad must be touched if it is pressed if (data.pressed && !data.touched) data.touched = true; if (data.touched) { - hr = controller_properties->get_TouchpadX(&double_val); - DCHECK(SUCCEEDED(hr)); - data.x_axis = double_val; - - hr = controller_properties->get_TouchpadY(&double_val); - DCHECK(SUCCEEDED(hr)); - data.y_axis = double_val; + data.x_axis = source_state.TouchpadX(); + data.y_axis = source_state.TouchpadY(); } button_map[ButtonName::kTouchpad] = data; @@ -265,58 +213,27 @@ return button_map; } -template <class T> -bool TryGetValue(ComPtr<IReference<T>> val_ref, T* out_val) { - if (!val_ref) - return false; - - HRESULT hr = val_ref->get_Value(out_val); - DCHECK(SUCCEEDED(hr)); - - return true; -} - -GamepadPose GetGamepadPose(ComPtr<ISpatialInteractionSourceLocation> location) { +GamepadPose GetGamepadPose(const WMRInputLocation& location) { GamepadPose gamepad_pose; - if (!location) - return gamepad_pose; - ComPtr<IReference<WFN::Vector3>> vec3_ref; - WFN::Vector3 vec3; - HRESULT hr = location->get_Position(&vec3_ref); - DCHECK(SUCCEEDED(hr)); - if (TryGetValue(vec3_ref, &vec3)) { - gamepad_pose.not_null = true; - gamepad_pose.position = ConvertToGamepadVector(vec3); - } - - hr = location->get_Velocity(&vec3_ref); - DCHECK(SUCCEEDED(hr)); - if (TryGetValue(vec3_ref, &vec3)) { - gamepad_pose.not_null = true; - gamepad_pose.linear_velocity = ConvertToGamepadVector(vec3); - } - - ComPtr<ISpatialInteractionSourceLocation2> loc2; - hr = location.As(&loc2); - DCHECK(SUCCEEDED(hr)); - - ComPtr<IReference<WFN::Quaternion>> quat_ref; WFN::Quaternion quat; - hr = loc2->get_Orientation(&quat_ref); - DCHECK(SUCCEEDED(hr)); - if (TryGetValue(quat_ref, &quat)) { + if (location.TryGetOrientation(&quat)) { gamepad_pose.not_null = true; gamepad_pose.orientation = ConvertToGamepadQuaternion(quat); } - ComPtr<ISpatialInteractionSourceLocation3> loc3; - hr = location.As(&loc3); - DCHECK(SUCCEEDED(hr)); + WFN::Vector3 vec3; + if (location.TryGetPosition(&vec3)) { + gamepad_pose.not_null = true; + gamepad_pose.position = ConvertToGamepadVector(vec3); + } - hr = loc3->get_AngularVelocity(&vec3_ref); - DCHECK(SUCCEEDED(hr)); - if (TryGetValue(vec3_ref, &vec3)) { + if (location.TryGetVelocity(&vec3)) { + gamepad_pose.not_null = true; + gamepad_pose.linear_velocity = ConvertToGamepadVector(vec3); + } + + if (location.TryGetAngularVelocity(&vec3)) { gamepad_pose.not_null = true; gamepad_pose.angular_velocity = ConvertToGamepadVector(vec3); } @@ -336,35 +253,15 @@ return gfx::ComposeTransform(decomposed_transform); } -bool TryGetGripFromLocation( - ComPtr<ISpatialInteractionSourceLocation> location_in_origin, - gfx::Transform* origin_from_grip) { - DCHECK(origin_from_grip); - *origin_from_grip = gfx::Transform(); - - if (!location_in_origin) - return false; - - auto gamepad_pose = GetGamepadPose(location_in_origin); - - if (!(gamepad_pose.not_null && gamepad_pose.position.not_null && - gamepad_pose.orientation.not_null)) - return false; - - *origin_from_grip = - CreateTransform(gamepad_pose.position, gamepad_pose.orientation); - return true; -} - -bool TryGetPointerOffset(ComPtr<ISpatialInteractionSourceState> state, - ComPtr<ISpatialInteractionSource> source, +bool TryGetPointerOffset(const WMRInputSourceState& state, + const WMRInputSource& source, ComPtr<ISpatialCoordinateSystem> origin, gfx::Transform origin_from_grip, gfx::Transform* grip_from_pointer) { DCHECK(grip_from_pointer); *grip_from_pointer = gfx::Transform(); - if (!state || !source || !origin) + if (!origin) return false; // We can get the pointer position, but we'll need to transform it to an @@ -374,51 +271,23 @@ if (!origin_from_grip.GetInverse(&grip_from_origin)) return false; - ComPtr<ISpatialInteractionSource2> source2; - HRESULT hr = source.As(&source2); - if (FAILED(hr)) - return false; + bool pointing_supported = source.IsPointingSupported(); - boolean pointing_supported = false; - hr = source2->get_IsPointingSupported(&pointing_supported); - DCHECK(SUCCEEDED(hr)); - - ComPtr<ISpatialPointerPose> pointer_pose; - hr = state->TryGetPointerPose(origin.Get(), &pointer_pose); - if (FAILED(hr) || !pointer_pose) + WMRPointerPose pointer_pose(nullptr); + if (!state.TryGetPointerPose(origin, &pointer_pose)) return false; WFN::Vector3 pos; WFN::Quaternion rot; if (pointing_supported) { - ComPtr<ISpatialPointerPose2> pointer_pose2; - hr = pointer_pose.As(&pointer_pose2); - if (FAILED(hr)) + WMRPointerSourcePose pointer_source_pose(nullptr); + if (!pointer_pose.TryGetInteractionSourcePose(source, &pointer_source_pose)) return false; - ComPtr<ISpatialPointerInteractionSourcePose> pointer_source_pose; - hr = pointer_pose2->TryGetInteractionSourcePose(source.Get(), - &pointer_source_pose); - if (FAILED(hr) || !pointer_source_pose) - return false; - - hr = pointer_source_pose->get_Position(&pos); - DCHECK(SUCCEEDED(hr)); - - ComPtr<ISpatialPointerInteractionSourcePose2> pointer_source_pose2; - hr = pointer_source_pose.As(&pointer_source_pose2); - if (FAILED(hr)) - return false; - - hr = pointer_source_pose2->get_Orientation(&rot); - DCHECK(SUCCEEDED(hr)); + pos = pointer_source_pose.Position(); + rot = pointer_source_pose.Orientation(); } else { - ComPtr<IHeadPose> head; - hr = pointer_pose->get_Head(&head); - DCHECK(SUCCEEDED(hr)); - - hr = head->get_ForwardDirection(&pos); - DCHECK(SUCCEEDED(hr)); + pos = pointer_pose.HeadForward(); } gfx::Transform origin_from_pointer = CreateTransform( @@ -438,10 +307,8 @@ } } -uint32_t GetSourceId(ComPtr<ISpatialInteractionSource> source) { - uint32_t id; - HRESULT hr = source->get_Id(&id); - DCHECK(SUCCEEDED(hr)); +uint32_t GetSourceId(const WMRInputSource& source) { + uint32_t id = source.Id(); // Voice's ID seems to be coming through as 0, which will cause a DCHECK in // the hash table used on the blink side. To ensure that we don't have any @@ -470,25 +337,15 @@ } bool MixedRealityInputHelper::EnsureSpatialInteractionManager() { - if (spatial_interaction_manager_) + if (input_manager_) return true; if (!hwnd_) return false; - ComPtr<ISpatialInteractionManagerInterop> spatial_interaction_interop; - base::win::ScopedHString spatial_interaction_interop_string = - base::win::ScopedHString::Create( - RuntimeClass_Windows_UI_Input_Spatial_SpatialInteractionManager); - HRESULT hr = base::win::RoGetActivationFactory( - spatial_interaction_interop_string.get(), - IID_PPV_ARGS(&spatial_interaction_interop)); - if (FAILED(hr)) - return false; + input_manager_ = WMRInputManager::GetForWindow(hwnd_); - hr = spatial_interaction_interop->GetForWindow( - hwnd_, IID_PPV_ARGS(&spatial_interaction_manager_)); - if (FAILED(hr)) + if (!input_manager_) return false; SubscribeEvents(); @@ -503,22 +360,9 @@ if (!timestamp || !origin || !EnsureSpatialInteractionManager()) return input_states; - ComPtr<IVectorView<SpatialInteractionSourceState*>> source_states; - if (FAILED(spatial_interaction_manager_->GetDetectedSourcesAtTimestamp( - timestamp.Get(), &source_states))) - return input_states; - - unsigned int size; - HRESULT hr = source_states->get_Size(&size); - DCHECK(SUCCEEDED(hr)); - base::AutoLock scoped_lock(lock_); - - for (unsigned int i = 0; i < size; i++) { - ComPtr<ISpatialInteractionSourceState> state; - if (FAILED(source_states->GetAt(i, &state))) - continue; - + auto source_states = input_manager_->GetDetectedSourcesAtTimestamp(timestamp); + for (auto state : source_states) { auto parsed_source_state = LockedParseWindowsSourceState(state, origin); if (parsed_source_state.source_state) @@ -546,22 +390,9 @@ if (!timestamp || !origin || !EnsureSpatialInteractionManager()) return ret; - ComPtr<IVectorView<SpatialInteractionSourceState*>> source_states; - if (FAILED(spatial_interaction_manager_->GetDetectedSourcesAtTimestamp( - timestamp.Get(), &source_states))) - return ret; - - unsigned int size; - HRESULT hr = source_states->get_Size(&size); - DCHECK(SUCCEEDED(hr)); - base::AutoLock scoped_lock(lock_); - - for (unsigned int i = 0; i < size; i++) { - ComPtr<ISpatialInteractionSourceState> state; - if (FAILED(source_states->GetAt(i, &state))) - continue; - + auto source_states = input_manager_->GetDetectedSourcesAtTimestamp(timestamp); + for (auto state : source_states) { auto parsed_source_state = LockedParseWindowsSourceState(state, origin); // If we have a grip, then we should have enough data. @@ -574,19 +405,14 @@ } ParsedInputState MixedRealityInputHelper::LockedParseWindowsSourceState( - ComPtr<ISpatialInteractionSourceState> state, + const WMRInputSourceState& state, ComPtr<ISpatialCoordinateSystem> origin) { ParsedInputState input_state; - if (!(state && origin)) + if (!origin) return input_state; - ComPtr<ISpatialInteractionSource> source; - HRESULT hr = state->get_Source(&source); - DCHECK(SUCCEEDED(hr)); - - SourceKind source_kind; - hr = source->get_Kind(&source_kind); - DCHECK(SUCCEEDED(hr)); + WMRInputSource source = state.GetSource(); + SourceKind source_kind = source.Kind(); bool is_controller = (source_kind == SourceKind::SpatialInteractionSourceKind_Controller); @@ -603,18 +429,18 @@ gfx::Transform origin_from_grip; if (is_controller) { input_state.button_data = ParseButtonState(state); - ComPtr<ISpatialInteractionSourceProperties> props; - hr = state->get_Properties(&props); - DCHECK(SUCCEEDED(hr)); - ComPtr<ISpatialInteractionSourceLocation> location_in_origin; - if (FAILED(props->TryGetLocation(origin.Get(), &location_in_origin)) || - !location_in_origin) + WMRInputLocation location_in_origin(nullptr); + if (!state.TryGetLocation(origin, &location_in_origin)) return input_state; - if (!TryGetGripFromLocation(location_in_origin, &origin_from_grip)) + auto gamepad_pose = GetGamepadPose(location_in_origin); + if (!(gamepad_pose.not_null && gamepad_pose.position.not_null && + gamepad_pose.orientation.not_null)) return input_state; - input_state.gamepad_pose = GetGamepadPose(location_in_origin); + origin_from_grip = + CreateTransform(gamepad_pose.position, gamepad_pose.orientation); + input_state.gamepad_pose = gamepad_pose; } gfx::Transform grip_from_pointer; @@ -652,17 +478,7 @@ description->handedness = device::mojom::XRHandedness::NONE; } else if (is_controller) { description->target_ray_mode = device::mojom::XRTargetRayMode::POINTING; - - ComPtr<ISpatialInteractionSource3> source3; - hr = source.As(&source3); - if (FAILED(hr)) - return input_state; - - Handedness handedness; - hr = source3->get_Handedness(&handedness); - DCHECK(SUCCEEDED(hr)); - - description->handedness = WindowsToMojoHandedness(handedness); + description->handedness = WindowsToMojoHandedness(source.Handedness()); } else { NOTREACHED(); } @@ -703,17 +519,14 @@ if (press_kind != PressKind::SpatialInteractionPressKind_Select) return S_OK; - ComPtr<ISpatialInteractionSourceState> state; - hr = args->get_State(&state); + ComPtr<ISpatialInteractionSourceState> source_state_wmr; + hr = args->get_State(&source_state_wmr); DCHECK(SUCCEEDED(hr)); - ComPtr<ISpatialInteractionSource> source; - hr = state->get_Source(&source); - DCHECK(SUCCEEDED(hr)); + WMRInputSourceState state(source_state_wmr); + WMRInputSource source = state.GetSource(); - SourceKind source_kind; - hr = source->get_Kind(&source_kind); - DCHECK(SUCCEEDED(hr)); + SourceKind source_kind = source.Kind(); if (source_kind != SourceKind::SpatialInteractionSourceKind_Controller && source_kind != SourceKind::SpatialInteractionSourceKind_Voice) @@ -730,44 +543,44 @@ // does not. if (source_kind == SourceKind::SpatialInteractionSourceKind_Voice && !is_pressed) - pending_voice_states_.push_back(state); + pending_voice_states_.push_back(std::move(state)); return S_OK; } void MixedRealityInputHelper::SubscribeEvents() { - DCHECK(spatial_interaction_manager_); + DCHECK(input_manager_); DCHECK(pressed_token_.value == 0); DCHECK(released_token_.value == 0); // The destructor ensures that we're unsubscribed so raw this is fine. auto pressed_callback = Callback<SpatialInteractionSourceEventHandler>( this, &MixedRealityInputHelper::OnSourcePressed); - HRESULT hr = spatial_interaction_manager_->add_SourcePressed( + HRESULT hr = input_manager_->GetComPtr()->add_SourcePressed( pressed_callback.Get(), &pressed_token_); DCHECK(SUCCEEDED(hr)); // The destructor ensures that we're unsubscribed so raw this is fine. auto released_callback = Callback<SpatialInteractionSourceEventHandler>( this, &MixedRealityInputHelper::OnSourceReleased); - hr = spatial_interaction_manager_->add_SourceReleased(released_callback.Get(), - &released_token_); + hr = input_manager_->GetComPtr()->add_SourceReleased(released_callback.Get(), + &released_token_); DCHECK(SUCCEEDED(hr)); } void MixedRealityInputHelper::UnsubscribeEvents() { base::AutoLock scoped_lock(lock_); - if (!spatial_interaction_manager_) + if (!input_manager_) return; HRESULT hr = S_OK; if (pressed_token_.value != 0) { - hr = spatial_interaction_manager_->remove_SourcePressed(pressed_token_); + hr = input_manager_->GetComPtr()->remove_SourcePressed(pressed_token_); pressed_token_.value = 0; DCHECK(SUCCEEDED(hr)); } if (released_token_.value != 0) { - hr = spatial_interaction_manager_->remove_SourceReleased(released_token_); + hr = input_manager_->GetComPtr()->remove_SourceReleased(released_token_); released_token_.value = 0; DCHECK(SUCCEEDED(hr)); }
diff --git a/device/vr/windows_mixed_reality/mixed_reality_input_helper.h b/device/vr/windows_mixed_reality/mixed_reality_input_helper.h index f9a3bf2..04544969 100644 --- a/device/vr/windows_mixed_reality/mixed_reality_input_helper.h +++ b/device/vr/windows_mixed_reality/mixed_reality_input_helper.h
@@ -8,6 +8,7 @@ #include <windows.ui.input.spatial.h> #include <wrl.h> +#include <memory> #include <unordered_map> #include <vector> @@ -42,6 +43,8 @@ ParsedInputState(ParsedInputState&& other); }; +class WMRInputManager; +class WMRInputSourceState; class MixedRealityInputHelper { public: MixedRealityInputHelper(HWND hwnd); @@ -64,9 +67,7 @@ bool EnsureSpatialInteractionManager(); ParsedInputState LockedParseWindowsSourceState( - Microsoft::WRL::ComPtr< - ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceState> - state, + const WMRInputSourceState& state, Microsoft::WRL::ComPtr< ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem> origin); @@ -86,9 +87,7 @@ void SubscribeEvents(); void UnsubscribeEvents(); - Microsoft::WRL::ComPtr< - ABI::Windows::UI::Input::Spatial::ISpatialInteractionManager> - spatial_interaction_manager_; + std::unique_ptr<WMRInputManager> input_manager_; EventRegistrationToken pressed_token_; EventRegistrationToken released_token_; @@ -99,9 +98,7 @@ std::unordered_map<uint32_t, ControllerState> controller_states_; HWND hwnd_; - std::vector<Microsoft::WRL::ComPtr< - ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceState>> - pending_voice_states_; + std::vector<WMRInputSourceState> pending_voice_states_; base::Lock lock_;
diff --git a/device/vr/windows_mixed_reality/wrappers/wmr_input_location.cc b/device/vr/windows_mixed_reality/wrappers/wmr_input_location.cc new file mode 100644 index 0000000..cd76c2a --- /dev/null +++ b/device/vr/windows_mixed_reality/wrappers/wmr_input_location.cc
@@ -0,0 +1,86 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "device/vr/windows_mixed_reality/wrappers/wmr_input_location.h" + +#include <windows.ui.input.spatial.h> +#include <wrl.h> + +#include "base/logging.h" + +namespace WFN = ABI::Windows::Foundation::Numerics; + +using ABI::Windows::Foundation::IReference; +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceLocation; +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceLocation2; +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceLocation3; +using Microsoft::WRL::ComPtr; + +namespace { +template <class T> +bool TryGetValue(ComPtr<IReference<T>> val_ref, T* out_val) { + if (!val_ref) + return false; + + HRESULT hr = val_ref->get_Value(out_val); + DCHECK(SUCCEEDED(hr)); + + return true; +} +} // anonymous namespace + +namespace device { + +WMRInputLocation::WMRInputLocation( + ComPtr<ISpatialInteractionSourceLocation> location) + : location_(location) { + if (location_) { + location_.As(&location2_); + location_.As(&location3_); + } +} + +WMRInputLocation::~WMRInputLocation() = default; + +bool WMRInputLocation::TryGetPosition(WFN::Vector3* position) const { + DCHECK(position); + if (!location_) + return false; + ComPtr<IReference<WFN::Vector3>> ref; + HRESULT hr = location_->get_Position(&ref); + DCHECK(SUCCEEDED(hr)); + return TryGetValue(ref, position); +} + +bool WMRInputLocation::TryGetVelocity(WFN::Vector3* velocity) const { + DCHECK(velocity); + if (!location_) + return false; + ComPtr<IReference<WFN::Vector3>> ref; + HRESULT hr = location_->get_Velocity(&ref); + DCHECK(SUCCEEDED(hr)); + return TryGetValue(ref, velocity); +} + +bool WMRInputLocation::TryGetOrientation(WFN::Quaternion* orientation) const { + DCHECK(orientation); + if (!location2_) + return false; + ComPtr<IReference<WFN::Quaternion>> ref; + HRESULT hr = location2_->get_Orientation(&ref); + DCHECK(SUCCEEDED(hr)); + return TryGetValue(ref, orientation); +} + +bool WMRInputLocation::TryGetAngularVelocity( + WFN::Vector3* angular_velocity) const { + DCHECK(angular_velocity); + if (!location3_) + return false; + ComPtr<IReference<WFN::Vector3>> ref; + HRESULT hr = location3_->get_AngularVelocity(&ref); + DCHECK(SUCCEEDED(hr)); + return TryGetValue(ref, angular_velocity); +} + +} // namespace device
diff --git a/device/vr/windows_mixed_reality/wrappers/wmr_input_location.h b/device/vr/windows_mixed_reality/wrappers/wmr_input_location.h new file mode 100644 index 0000000..e4d9d4c --- /dev/null +++ b/device/vr/windows_mixed_reality/wrappers/wmr_input_location.h
@@ -0,0 +1,50 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_INPUT_LOCATION_H_ +#define DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_INPUT_LOCATION_H_ + +#include <windows.ui.input.spatial.h> +#include <wrl.h> + +#include "base/macros.h" + +namespace device { +class WMRInputLocation { + public: + explicit WMRInputLocation( + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceLocation> + location); + virtual ~WMRInputLocation(); + + // Uses ISpatialInteractionSourceLocation. + bool TryGetPosition( + ABI::Windows::Foundation::Numerics::Vector3* position) const; + bool TryGetVelocity( + ABI::Windows::Foundation::Numerics::Vector3* velocity) const; + + // Uses ISpatialInteractionSourceLocation2. + bool TryGetOrientation( + ABI::Windows::Foundation::Numerics::Quaternion* orientation) const; + + // Uses ISpatialInteractionSourceLocation3. + bool TryGetAngularVelocity( + ABI::Windows::Foundation::Numerics::Vector3* angular_velocity) const; + + private: + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceLocation> + location_; + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceLocation2> + location2_; + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceLocation3> + location3_; + + DISALLOW_COPY(WMRInputLocation); +}; +} // namespace device + +#endif // DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_INPUT_LOCATION_H_
diff --git a/device/vr/windows_mixed_reality/wrappers/wmr_input_manager.cc b/device/vr/windows_mixed_reality/wrappers/wmr_input_manager.cc new file mode 100644 index 0000000..15db02d --- /dev/null +++ b/device/vr/windows_mixed_reality/wrappers/wmr_input_manager.cc
@@ -0,0 +1,82 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "device/vr/windows_mixed_reality/wrappers/wmr_input_manager.h" + +#include <SpatialInteractionManagerInterop.h> +#include <windows.perception.h> +#include <windows.ui.input.spatial.h> +#include <wrl.h> + +#include <memory> +#include <vector> + +#include "base/logging.h" +#include "base/strings/string_util.h" +#include "base/win/core_winrt_util.h" +#include "base/win/scoped_hstring.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_input_source_state.h" + +using ABI::Windows::Foundation::Collections::IVectorView; +using ABI::Windows::Perception::IPerceptionTimestamp; +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionManager; +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceState; +using ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceState; +using Microsoft::WRL::ComPtr; + +namespace device { +std::unique_ptr<WMRInputManager> WMRInputManager::GetForWindow(HWND hwnd) { + if (!hwnd) + return nullptr; + + ComPtr<ISpatialInteractionManagerInterop> spatial_interaction_interop; + base::win::ScopedHString spatial_interaction_interop_string = + base::win::ScopedHString::Create( + RuntimeClass_Windows_UI_Input_Spatial_SpatialInteractionManager); + HRESULT hr = base::win::RoGetActivationFactory( + spatial_interaction_interop_string.get(), + IID_PPV_ARGS(&spatial_interaction_interop)); + if (FAILED(hr)) + return nullptr; + + ComPtr<ISpatialInteractionManager> manager; + hr = spatial_interaction_interop->GetForWindow(hwnd, IID_PPV_ARGS(&manager)); + if (FAILED(hr)) + return nullptr; + + return std::make_unique<WMRInputManager>(manager); +} + +WMRInputManager::WMRInputManager(ComPtr<ISpatialInteractionManager> manager) + : manager_(manager) { + DCHECK(manager_); +} + +WMRInputManager::~WMRInputManager() = default; + +std::vector<WMRInputSourceState> WMRInputManager::GetDetectedSourcesAtTimestamp( + ComPtr<IPerceptionTimestamp> timestamp) const { + std::vector<WMRInputSourceState> input_states; + ComPtr<IVectorView<SpatialInteractionSourceState*>> source_states; + if (FAILED(manager_->GetDetectedSourcesAtTimestamp(timestamp.Get(), + &source_states))) + return input_states; + + uint32_t size; + HRESULT hr = source_states->get_Size(&size); + DCHECK(SUCCEEDED(hr)); + + for (uint32_t i = 0; i < size; i++) { + ComPtr<ISpatialInteractionSourceState> source_state_wmr; + hr = source_states->GetAt(i, &source_state_wmr); + DCHECK(SUCCEEDED(hr)); + input_states.emplace_back(source_state_wmr); + } + + return input_states; +} + +ComPtr<ISpatialInteractionManager> WMRInputManager::GetComPtr() const { + return manager_; +} +} // namespace device
diff --git a/device/vr/windows_mixed_reality/wrappers/wmr_input_manager.h b/device/vr/windows_mixed_reality/wrappers/wmr_input_manager.h new file mode 100644 index 0000000..cd6fb72 --- /dev/null +++ b/device/vr/windows_mixed_reality/wrappers/wmr_input_manager.h
@@ -0,0 +1,46 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_INPUT_MANAGER_H_ +#define DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_INPUT_MANAGER_H_ + +#include <windows.perception.h> +#include <windows.ui.input.spatial.h> +#include <wrl.h> + +#include <memory> +#include <vector> + +#include "base/macros.h" + +namespace device { +class WMRInputSourceState; +class WMRInputManager { + public: + static std::unique_ptr<WMRInputManager> GetForWindow(HWND hwnd); + + explicit WMRInputManager( + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionManager> + manager); + virtual ~WMRInputManager(); + + std::vector<WMRInputSourceState> GetDetectedSourcesAtTimestamp( + Microsoft::WRL::ComPtr<ABI::Windows::Perception::IPerceptionTimestamp> + timestamp) const; + + // TODO(954413): Remove this once the events that are used have been wrapped. + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionManager> + GetComPtr() const; + + private: + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionManager> + manager_; + + DISALLOW_COPY_AND_ASSIGN(WMRInputManager); +}; +} // namespace device + +#endif // DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_INPUT_MANAGER_H_
diff --git a/device/vr/windows_mixed_reality/wrappers/wmr_input_source.cc b/device/vr/windows_mixed_reality/wrappers/wmr_input_source.cc new file mode 100644 index 0000000..6926a2f --- /dev/null +++ b/device/vr/windows_mixed_reality/wrappers/wmr_input_source.cc
@@ -0,0 +1,71 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "device/vr/windows_mixed_reality/wrappers/wmr_input_source.h" + +#include <windows.ui.input.spatial.h> +#include <wrl.h> + +#include <cstdint> + +#include "base/logging.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.h" + +using SourceHandedness = + ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceHandedness; +using SourceKind = + ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceKind; + +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource; +using Microsoft::WRL::ComPtr; + +namespace device { +WMRInputSource::WMRInputSource(ComPtr<ISpatialInteractionSource> source) + : source_(source) { + if (source_) { + source_.As(&source2_); + source_.As(&source3_); + } +} + +WMRInputSource::~WMRInputSource() = default; + +WMRInputSource::WMRInputSource(const WMRInputSource& other) = default; + +uint32_t WMRInputSource::Id() const { + uint32_t val; + HRESULT hr = source_->get_Id(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +SourceKind WMRInputSource::Kind() const { + SourceKind val; + HRESULT hr = source_->get_Kind(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +bool WMRInputSource::IsPointingSupported() const { + if (!source2_) + return false; + boolean val; + HRESULT hr = source2_->get_IsPointingSupported(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +SourceHandedness WMRInputSource::Handedness() const { + if (!source3_) + return SourceHandedness::SpatialInteractionSourceHandedness_Unspecified; + SourceHandedness val; + HRESULT hr = source3_->get_Handedness(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +ComPtr<ISpatialInteractionSource> WMRInputSource::GetComPtr() const { + return source_; +} +} // namespace device
diff --git a/device/vr/windows_mixed_reality/wrappers/wmr_input_source.h b/device/vr/windows_mixed_reality/wrappers/wmr_input_source.h new file mode 100644 index 0000000..8a15d80c1 --- /dev/null +++ b/device/vr/windows_mixed_reality/wrappers/wmr_input_source.h
@@ -0,0 +1,49 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_INPUT_SOURCE_H_ +#define DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_INPUT_SOURCE_H_ + +#include <windows.ui.input.spatial.h> +#include <wrl.h> + +#include <cstdint> + +namespace device { +class WMRInputSource { + public: + explicit WMRInputSource( + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource> source); + WMRInputSource(const WMRInputSource& other); + virtual ~WMRInputSource(); + + // Uses ISpatialInteractionSource. + uint32_t Id() const; + ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceKind Kind() const; + + // Uses ISpatialInteractionSource2. + bool IsPointingSupported() const; + + // Uses ISpatialInteractionSource3. + ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceHandedness + Handedness() const; + + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource> + GetComPtr() const; + + private: + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource> + source_; + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource2> + source2_; + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource3> + source3_; +}; +} // namespace device + +#endif // DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_INPUT_SOURCE_H_
diff --git a/device/vr/windows_mixed_reality/wrappers/wmr_input_source_state.cc b/device/vr/windows_mixed_reality/wrappers/wmr_input_source_state.cc new file mode 100644 index 0000000..0c4a613d --- /dev/null +++ b/device/vr/windows_mixed_reality/wrappers/wmr_input_source_state.cc
@@ -0,0 +1,163 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "device/vr/windows_mixed_reality/wrappers/wmr_input_source_state.h" + +#include <windows.perception.spatial.h> +#include <windows.ui.input.spatial.h> + +#include <wrl.h> + +#include "base/logging.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_input_location.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_input_source.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_pointer_pose.h" + +using ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem; +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionControllerProperties; +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource; +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceLocation; +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceProperties; +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceState; +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceState2; +using ABI::Windows::UI::Input::Spatial::ISpatialPointerPose; +using Microsoft::WRL::ComPtr; + +namespace device { +WMRInputSourceState::WMRInputSourceState( + ComPtr<ISpatialInteractionSourceState> source_state) + : source_state_(source_state) { + DCHECK(source_state_); + HRESULT hr = source_state_.As(&source_state2_); + DCHECK(SUCCEEDED(hr)); + + hr = source_state_->get_Properties(&properties_); + DCHECK(SUCCEEDED(hr)); + + source_state2_->get_ControllerProperties(&controller_properties_); +} + +WMRInputSourceState::WMRInputSourceState(const WMRInputSourceState& other) = + default; + +WMRInputSourceState::~WMRInputSourceState() = default; + +// ISpatialInteractionSourceState +bool WMRInputSourceState::TryGetPointerPose( + ComPtr<ISpatialCoordinateSystem> origin, + WMRPointerPose* pointer_pose) const { + ComPtr<ISpatialPointerPose> pointer_pose_wmr; + HRESULT hr = + source_state_->TryGetPointerPose(origin.Get(), &pointer_pose_wmr); + + if (SUCCEEDED(hr) && pointer_pose_wmr) { + *pointer_pose = WMRPointerPose(pointer_pose_wmr); + return true; + } + + return false; +} + +WMRInputSource WMRInputSourceState::GetSource() const { + ComPtr<ISpatialInteractionSource> source; + HRESULT hr = source_state_->get_Source(&source); + DCHECK(SUCCEEDED(hr)); + return WMRInputSource(source); +} + +bool WMRInputSourceState::IsGrasped() const { + boolean val; + HRESULT hr = source_state2_->get_IsGrasped(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +bool WMRInputSourceState::IsSelectPressed() const { + boolean val; + HRESULT hr = source_state2_->get_IsSelectPressed(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +double WMRInputSourceState::SelectPressedValue() const { + DOUBLE val; + HRESULT hr = source_state2_->get_SelectPressedValue(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +bool WMRInputSourceState::SupportsControllerProperties() const { + return controller_properties_ != nullptr; +} + +bool WMRInputSourceState::IsThumbstickPressed() const { + DCHECK(SupportsControllerProperties()); + boolean val; + HRESULT hr = controller_properties_->get_IsThumbstickPressed(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +bool WMRInputSourceState::IsTouchpadPressed() const { + DCHECK(SupportsControllerProperties()); + boolean val; + HRESULT hr = controller_properties_->get_IsTouchpadPressed(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +bool WMRInputSourceState::IsTouchpadTouched() const { + DCHECK(SupportsControllerProperties()); + boolean val; + HRESULT hr = controller_properties_->get_IsTouchpadTouched(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +double WMRInputSourceState::ThumbstickX() const { + DCHECK(SupportsControllerProperties()); + DOUBLE val; + HRESULT hr = controller_properties_->get_ThumbstickX(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +double WMRInputSourceState::ThumbstickY() const { + DCHECK(SupportsControllerProperties()); + DOUBLE val; + HRESULT hr = controller_properties_->get_ThumbstickY(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +double WMRInputSourceState::TouchpadX() const { + DCHECK(SupportsControllerProperties()); + DOUBLE val; + HRESULT hr = controller_properties_->get_TouchpadX(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +double WMRInputSourceState::TouchpadY() const { + DCHECK(SupportsControllerProperties()); + DOUBLE val; + HRESULT hr = controller_properties_->get_TouchpadY(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +bool WMRInputSourceState::TryGetLocation( + ComPtr<ISpatialCoordinateSystem> origin, + WMRInputLocation* location) const { + DCHECK(location); + ComPtr<ISpatialInteractionSourceLocation> location_wmr; + if (FAILED(properties_->TryGetLocation(origin.Get(), &location_wmr)) || + !location_wmr) + return false; + + *location = WMRInputLocation(location_wmr); + return true; +} + +} // namespace device
diff --git a/device/vr/windows_mixed_reality/wrappers/wmr_input_source_state.h b/device/vr/windows_mixed_reality/wrappers/wmr_input_source_state.h new file mode 100644 index 0000000..783e58385 --- /dev/null +++ b/device/vr/windows_mixed_reality/wrappers/wmr_input_source_state.h
@@ -0,0 +1,74 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_INPUT_SOURCE_STATE_H_ +#define DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_INPUT_SOURCE_STATE_H_ + +#include <windows.perception.spatial.h> +#include <windows.ui.input.spatial.h> +#include <wrl.h> + +namespace device { +class WMRInputLocation; +class WMRInputSource; +class WMRPointerPose; +class WMRInputSourceState { + public: + explicit WMRInputSourceState( + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceState> + source_state); + WMRInputSourceState(const WMRInputSourceState& other); + virtual ~WMRInputSourceState(); + + // Uses ISpatialInteractionSourceState. + bool TryGetPointerPose( + Microsoft::WRL::ComPtr< + ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem> origin, + WMRPointerPose* pointer_pose) const; + WMRInputSource GetSource() const; + + // Uses ISpatialInteractionSourceState2. + bool IsGrasped() const; + bool IsSelectPressed() const; + double SelectPressedValue() const; + + bool SupportsControllerProperties() const; + + // Uses SpatialInteractionControllerProperties. + bool IsThumbstickPressed() const; + bool IsTouchpadPressed() const; + bool IsTouchpadTouched() const; + double ThumbstickX() const; + double ThumbstickY() const; + double TouchpadX() const; + double TouchpadY() const; + + // Uses SpatialInteractionSourceProperties. + bool TryGetLocation( + Microsoft::WRL::ComPtr< + ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem> origin, + WMRInputLocation* location) const; + + private: + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceState> + source_state_; + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceState2> + source_state2_; + + // Typically we want to restrict each wrapper to one "COM" class, but this is + // a Property on SpatialInteractionSourceState that is just a struct. + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionControllerProperties> + controller_properties_; + + // We only use one method from this class, which is a property on our class. + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialInteractionSourceProperties> + properties_; +}; +} // namespace device + +#endif // DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_INPUT_SOURCE_STATE_H_
diff --git a/device/vr/windows_mixed_reality/wrappers/wmr_pointer_pose.cc b/device/vr/windows_mixed_reality/wrappers/wmr_pointer_pose.cc new file mode 100644 index 0000000..e60fae5f --- /dev/null +++ b/device/vr/windows_mixed_reality/wrappers/wmr_pointer_pose.cc
@@ -0,0 +1,67 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "device/vr/windows_mixed_reality/wrappers/wmr_pointer_pose.h" + +#include <windows.perception.h> +#include <windows.ui.input.spatial.h> + +#include <wrl.h> + +#include "base/logging.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_input_source.h" +#include "device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.h" + +namespace WFN = ABI::Windows::Foundation::Numerics; +using ABI::Windows::Perception::People::IHeadPose; +using ABI::Windows::UI::Input::Spatial::ISpatialInteractionSource; +using ABI::Windows::UI::Input::Spatial::ISpatialPointerInteractionSourcePose; +using ABI::Windows::UI::Input::Spatial::ISpatialPointerPose; +using ABI::Windows::UI::Input::Spatial::ISpatialPointerPose2; +using Microsoft::WRL::ComPtr; + +namespace device { +WMRPointerPose::WMRPointerPose(ComPtr<ISpatialPointerPose> pointer_pose) + : pointer_pose_(pointer_pose) { + if (pointer_pose_) { + pointer_pose_.As(&pointer_pose2_); + + HRESULT hr = pointer_pose_->get_Head(&head_); + DCHECK(SUCCEEDED(hr)); + } +} + +WMRPointerPose::~WMRPointerPose() = default; + +bool WMRPointerPose::IsValid() const { + return pointer_pose_ != nullptr; +} + +bool WMRPointerPose::TryGetInteractionSourcePose( + const WMRInputSource& source, + WMRPointerSourcePose* pointer_source_pose) const { + DCHECK(pointer_source_pose); + if (!pointer_pose2_) + return false; + + ComPtr<ISpatialPointerInteractionSourcePose> psp_wmr; + HRESULT hr = pointer_pose2_->TryGetInteractionSourcePose( + source.GetComPtr().Get(), &psp_wmr); + if (SUCCEEDED(hr) && psp_wmr) { + *pointer_source_pose = WMRPointerSourcePose(psp_wmr); + return true; + } + + return false; +} + +WFN::Vector3 WMRPointerPose::HeadForward() const { + DCHECK(IsValid()); + WFN::Vector3 val; + HRESULT hr = head_->get_ForwardDirection(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +} // namespace device
diff --git a/device/vr/windows_mixed_reality/wrappers/wmr_pointer_pose.h b/device/vr/windows_mixed_reality/wrappers/wmr_pointer_pose.h new file mode 100644 index 0000000..25089e3 --- /dev/null +++ b/device/vr/windows_mixed_reality/wrappers/wmr_pointer_pose.h
@@ -0,0 +1,46 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_POINTER_POSE_H_ +#define DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_POINTER_POSE_H_ + +#include <windows.perception.spatial.h> +#include <windows.ui.input.spatial.h> +#include <wrl.h> + +#include "base/macros.h" + +namespace device { +class WMRInputSource; +class WMRPointerSourcePose; +class WMRPointerPose { + public: + explicit WMRPointerPose( + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialPointerPose> pointer_pose); + virtual ~WMRPointerPose(); + + bool IsValid() const; + + // Uses ISpatialPointerPose2. + bool TryGetInteractionSourcePose( + const WMRInputSource& source, + WMRPointerSourcePose* pointer_source_pose) const; + + // Uses IHeadPose. + ABI::Windows::Foundation::Numerics::Vector3 HeadForward() const; + + private: + Microsoft::WRL::ComPtr<ABI::Windows::UI::Input::Spatial::ISpatialPointerPose> + pointer_pose_; + Microsoft::WRL::ComPtr<ABI::Windows::UI::Input::Spatial::ISpatialPointerPose2> + pointer_pose2_; + + // This is a simple interface, so expose it directly rather than create + // a new wrapper class. + Microsoft::WRL::ComPtr<ABI::Windows::Perception::People::IHeadPose> head_; + DISALLOW_COPY(WMRPointerPose); +}; +} // namespace device + +#endif // DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_POINTER_POSE_H_
diff --git a/device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.cc b/device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.cc new file mode 100644 index 0000000..a39827b --- /dev/null +++ b/device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.cc
@@ -0,0 +1,50 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.h" + +#include <windows.ui.input.spatial.h> + +#include <wrl.h> + +#include "base/logging.h" + +namespace WFN = ABI::Windows::Foundation::Numerics; +using ABI::Windows::UI::Input::Spatial::ISpatialPointerInteractionSourcePose; +using ABI::Windows::UI::Input::Spatial::ISpatialPointerInteractionSourcePose2; +using Microsoft::WRL::ComPtr; + +namespace device { +WMRPointerSourcePose::WMRPointerSourcePose( + ComPtr<ISpatialPointerInteractionSourcePose> pointer_source_pose) + : pointer_source_pose_(pointer_source_pose) { + if (pointer_source_pose_) { + HRESULT hr = pointer_source_pose_.As(&pointer_source_pose2_); + DCHECK(SUCCEEDED(hr)); + } +} + +WMRPointerSourcePose::~WMRPointerSourcePose() = default; + +bool WMRPointerSourcePose::IsValid() const { + return pointer_source_pose_ != nullptr; +} + +WFN::Vector3 WMRPointerSourcePose::Position() const { + DCHECK(IsValid()); + WFN::Vector3 val; + HRESULT hr = pointer_source_pose_->get_Position(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +WFN::Quaternion WMRPointerSourcePose::Orientation() const { + DCHECK(IsValid()); + WFN::Quaternion val; + HRESULT hr = pointer_source_pose2_->get_Orientation(&val); + DCHECK(SUCCEEDED(hr)); + return val; +} + +} // namespace device
diff --git a/device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.h b/device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.h new file mode 100644 index 0000000..caae4bfec --- /dev/null +++ b/device/vr/windows_mixed_reality/wrappers/wmr_pointer_source_pose.h
@@ -0,0 +1,41 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_POINTER_SOURCE_POSE_H_ +#define DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_POINTER_SOURCE_POSE_H_ + +#include <windows.ui.input.spatial.h> +#include <wrl.h> + +#include "base/macros.h" + +namespace device { +class WMRPointerSourcePose { + public: + explicit WMRPointerSourcePose( + Microsoft::WRL::ComPtr<ABI::Windows::UI::Input::Spatial:: + ISpatialPointerInteractionSourcePose> + pointer_pose); + virtual ~WMRPointerSourcePose(); + + bool IsValid() const; + + // Uses ISpatialPointerInteractionSourcePose. + ABI::Windows::Foundation::Numerics::Vector3 Position() const; + + // Uses ISpatialPointerInteractionSourcePose2. + ABI::Windows::Foundation::Numerics::Quaternion Orientation() const; + + private: + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialPointerInteractionSourcePose> + pointer_source_pose_; + Microsoft::WRL::ComPtr< + ABI::Windows::UI::Input::Spatial::ISpatialPointerInteractionSourcePose2> + pointer_source_pose2_; + + DISALLOW_COPY(WMRPointerSourcePose); +}; +} // namespace device + +#endif // DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_POINTER_SOURCE_POSE_H_
diff --git a/extensions/browser/api/web_request/web_request_api_helpers.cc b/extensions/browser/api/web_request/web_request_api_helpers.cc index 5af87f6..9cb01a071 100644 --- a/extensions/browser/api/web_request/web_request_api_helpers.cc +++ b/extensions/browser/api/web_request/web_request_api_helpers.cc
@@ -56,15 +56,6 @@ using ParsedResponseCookies = std::vector<std::unique_ptr<net::ParsedCookie>>; -// Mirrors the histogram enum of the same name. DO NOT REORDER THESE VALUES OR -// CHANGE THEIR MEANING. -enum class WebRequestWSRequestHeadersModification { - kNone, - kSetUserAgentOnly, - kRiskyModification, - kMaxValue = kRiskyModification, -}; - void ClearCacheOnNavigationOnUI() { web_cache::WebCacheManager::GetInstance()->ClearCacheOnNavigation(); }
diff --git a/extensions/renderer/BUILD.gn b/extensions/renderer/BUILD.gn index 4e0663d..ccae9b3 100644 --- a/extensions/renderer/BUILD.gn +++ b/extensions/renderer/BUILD.gn
@@ -136,6 +136,8 @@ "guest_view/mime_handler_view/mime_handler_view_container_manager.h", "guest_view/mime_handler_view/mime_handler_view_frame_container.cc", "guest_view/mime_handler_view/mime_handler_view_frame_container.h", + "guest_view/mime_handler_view/post_message_support.cc", + "guest_view/mime_handler_view/post_message_support.h", "i18n_hooks_delegate.cc", "i18n_hooks_delegate.h", "id_generator_custom_bindings.cc",
diff --git a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc index fc7bcb90..97f4fd4 100644 --- a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc +++ b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc
@@ -13,6 +13,7 @@ #include "content/public/renderer/render_view.h" #include "extensions/common/extension_messages.h" #include "extensions/common/guest_view/extensions_guest_view_messages.h" +#include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_plugin_document.h" @@ -28,7 +29,10 @@ const GURL& original_url) : GuestViewContainer(render_frame), MimeHandlerViewContainerBase(render_frame, info, mime_type, original_url), - guest_proxy_routing_id_(-1) { + guest_proxy_routing_id_(-1), + is_resource_accessible_to_embedder_( + GetSourceFrame()->GetSecurityOrigin().CanAccess( + blink::WebSecurityOrigin::Create(original_url))) { RecordInteraction( MimeHandlerViewUMATypes::Type::kDidCreateMimeHandlerViewContainerBase); is_embedded_ = !render_frame->GetWebFrame()->GetDocument().IsPluginDocument(); @@ -122,7 +126,19 @@ MimeHandlerViewContainerBase::CreateMimeHandlerViewGuestIfNecessary(); } -blink::WebRemoteFrame* MimeHandlerViewContainer::GetGuestProxyFrame() const { +int32_t MimeHandlerViewContainer::GetInstanceId() const { + return element_instance_id(); +} + +gfx::Size MimeHandlerViewContainer::GetElementSize() const { + return *element_size_; +} + +blink::WebLocalFrame* MimeHandlerViewContainer::GetSourceFrame() { + return render_frame()->GetWebFrame(); +} + +blink::WebFrame* MimeHandlerViewContainer::GetTargetFrame() { content::RenderView* guest_proxy_render_view = content::RenderView::FromRoutingID(guest_proxy_routing_id_); if (!guest_proxy_render_view) @@ -130,12 +146,12 @@ return guest_proxy_render_view->GetWebView()->MainFrame()->ToWebRemoteFrame(); } -int32_t MimeHandlerViewContainer::GetInstanceId() const { - return element_instance_id(); +bool MimeHandlerViewContainer::IsEmbedded() const { + return is_embedded_; } -gfx::Size MimeHandlerViewContainer::GetElementSize() const { - return *element_size_; +bool MimeHandlerViewContainer::IsResourceAccessibleBySource() const { + return is_resource_accessible_to_embedder_; } } // namespace extensions
diff --git a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.h b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.h index 76bc0b2..2f3efa2 100644 --- a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.h +++ b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.h
@@ -16,6 +16,11 @@ #include "url/gurl.h" #include "v8/include/v8.h" +namespace blink { +class WebFrame; +class WebLocalFrame; +} // namespace blink + namespace extensions { // A container for loading up an extension inside a BrowserPlugin to handle a @@ -54,6 +59,11 @@ // GuestViewContainer overrides. void OnRenderFrameDestroyed() override; + // PostMessageSupport::Delegate overrides. + blink::WebLocalFrame* GetSourceFrame() override; + blink::WebFrame* GetTargetFrame() override; + bool IsEmbedded() const override; + bool IsResourceAccessibleBySource() const override; protected: ~MimeHandlerViewContainer() override; @@ -61,7 +71,6 @@ private: // MimeHandlerViewContainerBase override. void CreateMimeHandlerViewGuestIfNecessary() final; - blink::WebRemoteFrame* GetGuestProxyFrame() const final; int32_t GetInstanceId() const final; gfx::Size GetElementSize() const final; @@ -73,6 +82,12 @@ // The RenderView routing ID of the guest. int guest_proxy_routing_id_; + // TODO(ekaramad): This is intentionally here instead of + // MimeHandlerViewContainerBase because MimeHandlerViewFrameContainer will + // soon be refactored, and no longer a subclass of MHVCB. This means MHVCB + // and MimeHandlerViewContainer should soon merge back into a MHVC class. + // Determines whether the embedder can access |original_url_|. Used for UMA. + bool is_resource_accessible_to_embedder_; // The size of the element. base::Optional<gfx::Size> element_size_;
diff --git a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_base.cc b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_base.cc index ff82f05..f166edf 100644 --- a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_base.cc +++ b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_base.cc
@@ -4,32 +4,22 @@ #include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_base.h" -#include "base/auto_reset.h" #include "base/bind.h" #include "base/guid.h" #include "base/lazy_instance.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_functions.h" #include "base/stl_util.h" -#include "base/values.h" #include "components/guest_view/common/guest_view_constants.h" #include "content/public/common/url_loader_throttle.h" #include "content/public/common/webplugininfo.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_thread.h" -#include "content/public/renderer/v8_value_converter.h" #include "extensions/common/guest_view/extensions_guest_view_messages.h" #include "extensions/common/mojo/guest_view.mojom.h" #include "extensions/renderer/extension_frame_helper.h" -#include "gin/arguments.h" -#include "gin/dictionary.h" -#include "gin/handle.h" -#include "gin/interceptor.h" -#include "gin/object_template_builder.h" -#include "gin/wrappable.h" #include "ipc/ipc_sync_channel.h" #include "services/network/public/cpp/features.h" -#include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/public/web/web_associated_url_loader.h" @@ -37,15 +27,12 @@ #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_frame.h" #include "third_party/blink/public/web/web_local_frame.h" -#include "third_party/blink/public/web/web_remote_frame.h" namespace extensions { using UMAType = MimeHandlerViewUMATypes::Type; namespace { -const char kPostMessageName[] = "postMessage"; - base::LazyInstance<mojom::GuestViewAssociatedPtr>::Leaky g_guest_view; mojom::GuestView* GetGuestView() { @@ -57,67 +44,6 @@ return g_guest_view.Get().get(); } -// The gin-backed scriptable object which is exposed by the BrowserPlugin for -// MimeHandlerViewContainerBase. This currently only implements "postMessage". -class ScriptableObject : public gin::Wrappable<ScriptableObject>, - public gin::NamedPropertyInterceptor { - public: - static gin::WrapperInfo kWrapperInfo; - - static v8::Local<v8::Object> Create( - v8::Isolate* isolate, - base::WeakPtr<MimeHandlerViewContainerBase> container) { - ScriptableObject* scriptable_object = - new ScriptableObject(isolate, container); - return gin::CreateHandle(isolate, scriptable_object) - .ToV8() - .As<v8::Object>(); - } - - // gin::NamedPropertyInterceptor - v8::Local<v8::Value> GetNamedProperty( - v8::Isolate* isolate, - const std::string& identifier) override { - if (identifier == kPostMessageName) { - if (post_message_function_template_.IsEmpty()) { - post_message_function_template_.Reset( - isolate, - gin::CreateFunctionTemplate( - isolate, - base::BindRepeating( - &MimeHandlerViewContainerBase::PostJavaScriptMessage, - container_, isolate))); - } - v8::Local<v8::FunctionTemplate> function_template = - v8::Local<v8::FunctionTemplate>::New(isolate, - post_message_function_template_); - v8::Local<v8::Function> function; - if (function_template->GetFunction(isolate->GetCurrentContext()) - .ToLocal(&function)) - return function; - } - return v8::Local<v8::Value>(); - } - - private: - ScriptableObject(v8::Isolate* isolate, - base::WeakPtr<MimeHandlerViewContainerBase> container) - : gin::NamedPropertyInterceptor(isolate, this), container_(container) {} - - // gin::Wrappable - gin::ObjectTemplateBuilder GetObjectTemplateBuilder( - v8::Isolate* isolate) override { - return gin::Wrappable<ScriptableObject>::GetObjectTemplateBuilder(isolate) - .AddNamedPropertyInterceptor(); - } - - base::WeakPtr<MimeHandlerViewContainerBase> container_; - v8::Persistent<v8::FunctionTemplate> post_message_function_template_; -}; - -// static -gin::WrapperInfo ScriptableObject::kWrapperInfo = {gin::kEmbedderNativeGin}; - // Maps from content::RenderFrame to the set of MimeHandlerViewContainerBases // within it. base::LazyInstance< @@ -189,13 +115,6 @@ mime_type_(mime_type), embedder_render_frame_routing_id_(embedder_render_frame->GetRoutingID()), before_unload_control_binding_(this), - resource_access_type_( - embedder_render_frame->GetWebFrame() - ->GetDocument() - .GetSecurityOrigin() - .CanAccess(blink::WebSecurityOrigin::Create(original_url)) - ? ResourceAccessType::kAccessible - : ResourceAccessType::kInaccessible), weak_factory_(this) { DCHECK(!mime_type_.empty()); g_mime_handler_view_container_base_map.Get()[embedder_render_frame].insert( @@ -216,6 +135,16 @@ } // static +PostMessageSupport::Delegate* PostMessageSupport::Delegate::FromWebLocalFrame( + blink::WebLocalFrame* web_local_frame) { + auto mime_handlers = MimeHandlerViewContainerBase::FromRenderFrame( + content::RenderFrame::FromWebFrame(web_local_frame)); + if (mime_handlers.empty()) + return nullptr; + return mime_handlers.front(); +} + +// static std::vector<MimeHandlerViewContainerBase*> MimeHandlerViewContainerBase::FromRenderFrame( content::RenderFrame* render_frame) { @@ -236,54 +165,6 @@ return std::make_unique<PluginResourceThrottle>(weak_factory_.GetWeakPtr()); } -void MimeHandlerViewContainerBase::PostJavaScriptMessage( - v8::Isolate* isolate, - v8::Local<v8::Value> message) { - if (should_report_internal_messages_) - RecordUMAForPostMessage(message); - if (!guest_loaded_) { - pending_messages_.push_back(v8::Global<v8::Value>(isolate, message)); - return; - } - - auto* guest_proxy_frame = GetGuestProxyFrame(); - - v8::Context::Scope context_scope( - GetEmbedderRenderFrame()->GetWebFrame()->MainWorldScriptContext()); - - v8::Local<v8::Object> guest_proxy_window = guest_proxy_frame->GlobalProxy(); - gin::Dictionary window_object(isolate, guest_proxy_window); - v8::Local<v8::Function> post_message; - if (!window_object.Get(std::string(kPostMessageName), &post_message)) - return; - - v8::Local<v8::Value> args[] = { - message, - // Post the message to any domain inside the browser plugin. The embedder - // should already know what is embedded. - gin::StringToV8(isolate, "*")}; - GetEmbedderRenderFrame()->GetWebFrame()->CallFunctionEvenIfScriptDisabled( - post_message.As<v8::Function>(), guest_proxy_window, base::size(args), - args); -} - -void MimeHandlerViewContainerBase::PostMessageFromValue( - const base::Value& message) { - blink::WebLocalFrame* frame = GetEmbedderRenderFrame()->GetWebFrame(); - if (!frame) - return; - - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - v8::HandleScope handle_scope(isolate); - v8::Context::Scope context_scope(frame->MainWorldScriptContext()); - RecordInteraction(UMAType::kPostMessageInternal); - base::AutoReset<bool> avoid_recording_internal_messages( - &should_report_internal_messages_, false); - PostJavaScriptMessage(isolate, - content::V8ValueConverter::Create()->ToV8Value( - &message, frame->MainWorldScriptContext())); -} - void MimeHandlerViewContainerBase::DidReceiveData(const char* data, int data_length) { view_id_ += std::string(data, data_length); @@ -365,24 +246,8 @@ RecordInteraction(UMAType::kDidLoadExtension); if (!GetEmbedderRenderFrame()) return; - guest_loaded_ = true; - if (pending_messages_.empty()) - return; - - // Now that the guest has loaded, flush any unsent messages. - blink::WebLocalFrame* frame = GetEmbedderRenderFrame()->GetWebFrame(); - if (!frame) - return; - - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - v8::HandleScope handle_scope(isolate); - v8::Context::Scope context_scope(frame->MainWorldScriptContext()); - for (const auto& pending_message : pending_messages_) - PostJavaScriptMessage(isolate, - v8::Local<v8::Value>::New(isolate, pending_message)); - - pending_messages_.clear(); + post_message_support()->SetActive(); } void MimeHandlerViewContainerBase::SendResourceRequest() { @@ -420,38 +285,6 @@ CreateMimeHandlerViewGuestIfNecessary(); } -void MimeHandlerViewContainerBase::RecordUMAForPostMessage( - v8::Local<v8::Value>& message) { - auto data = content::V8ValueConverter::Create()->FromV8Value( - message, - GetEmbedderRenderFrame()->GetWebFrame()->MainWorldScriptContext()); - std::string message_type; - if (data->is_dict()) { - base::DictionaryValue::From(std::move(data)) - ->GetString("type", &message_type); - } - - bool accessible = resource_access_type_ == ResourceAccessType::kAccessible; - MimeHandlerViewUMATypes::Type post_message_type; - if (message_type == "getSelectedText") { - post_message_type = accessible ? UMAType::kAccessibleGetSelectedText - : UMAType::kInaccessibleGetSelectedText; - } else if (message_type == "print") { - post_message_type = - accessible ? UMAType::kAccessiblePrint : UMAType::kInaccessiblePrint; - } else if (message_type == "selectAll") { - post_message_type = accessible ? UMAType::kAccessibleSelectAll - : UMAType::kInaccessibleSelectAll; - } else { - post_message_type = accessible ? UMAType::kAccessibleInvalid - : UMAType::kInaccessibleInvalid; - } - DCHECK_NE(post_message_type, UMAType::kDidCreateMimeHandlerViewContainerBase); - RecordInteraction(post_message_type); - if (is_embedded_) - RecordInteraction(UMAType::kPostMessageToEmbeddedMimeHandlerView); -} - void MimeHandlerViewContainerBase::SetShowBeforeUnloadDialog( bool show_dialog, SetShowBeforeUnloadDialogCallback callback) { @@ -465,12 +298,7 @@ v8::Local<v8::Object> MimeHandlerViewContainerBase::GetScriptableObjectInternal( v8::Isolate* isolate) { - if (scriptable_object_.IsEmpty()) { - v8::Local<v8::Object> object = - ScriptableObject::Create(isolate, weak_factory_.GetWeakPtr()); - scriptable_object_.Reset(isolate, object); - } - return v8::Local<v8::Object>::New(isolate, scriptable_object_); + return post_message_support()->GetScriptableObject(isolate); } void MimeHandlerViewContainerBase::RecordInteraction(UMAType uma_type) {
diff --git a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_base.h b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_base.h index 6ae8357..321a3b7 100644 --- a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_base.h +++ b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_base.h
@@ -11,6 +11,7 @@ #include "content/public/common/transferrable_url_loader.mojom.h" #include "extensions/common/api/mime_handler.mojom.h" #include "extensions/common/guest_view/mime_handler_view_uma_types.h" +#include "extensions/renderer/guest_view/mime_handler_view/post_message_support.h" #include "ipc/ipc_message.h" #include "mojo/public/cpp/bindings/binding.h" #include "services/network/public/mojom/url_loader.mojom.h" @@ -21,7 +22,6 @@ namespace blink { class WebAssociatedURLLoader; -class WebRemoteFrame; } // namespace blink namespace content { @@ -35,7 +35,8 @@ // A base class for MimeHandlerViewContainer which provides a way of reusing the // common logic between the BrowserPlugin-based and frame-based container. class MimeHandlerViewContainerBase : public blink::WebAssociatedURLLoaderClient, - public mime_handler::BeforeUnloadControl { + public mime_handler::BeforeUnloadControl, + public PostMessageSupport::Delegate { public: MimeHandlerViewContainerBase(content::RenderFrame* embedder_render_frame, const content::WebPluginInfo& info, @@ -55,13 +56,6 @@ std::unique_ptr<content::URLLoaderThrottle> MaybeCreatePluginThrottle( const GURL& url); - // Post a JavaScript message to the guest. - void PostJavaScriptMessage(v8::Isolate* isolate, - v8::Local<v8::Value> message); - - // Post |message| to the guest. - void PostMessageFromValue(const base::Value& message); - // WebAssociatedURLLoaderClient overrides. void DidReceiveData(const char* data, int data_length) override; void DidFinishLoading() override; @@ -70,7 +64,6 @@ MimeHandlerViewContainerBase(); virtual void CreateMimeHandlerViewGuestIfNecessary(); - virtual blink::WebRemoteFrame* GetGuestProxyFrame() const = 0; virtual int32_t GetInstanceId() const = 0; virtual gfx::Size GetElementSize() const = 0; @@ -103,12 +96,8 @@ int32_t plugin_frame_routing_id_ = MSG_ROUTING_NONE; private: - enum class ResourceAccessType : size_t { kAccessible, kInaccessible }; - class PluginResourceThrottle; - void RecordUMAForPostMessage(v8::Local<v8::Value>& message); - // Called for embedded plugins when network service is enabled. This is called // by the URLLoaderThrottle which intercepts the resource load, which is then // sent to the browser to be handed off to the plugin. @@ -134,32 +123,18 @@ // the embedded case, no URL request is made automatically. std::unique_ptr<blink::WebAssociatedURLLoader> loader_; - // The scriptable object that backs the plugin. - v8::Global<v8::Object> scriptable_object_; - - // Pending postMessage messages that need to be sent to the guest. These are - // queued while the guest is loading and once it is fully loaded they are - // delivered so that messages aren't lost. - std::vector<v8::Global<v8::Value>> pending_messages_; - // True if a guest process has been requested. bool guest_created_ = false; // True if the guest page has fully loaded and its JavaScript onload function // has been called. bool guest_loaded_ = false; - // The routing ID of the frame which contains the plugin element. const int32_t embedder_render_frame_routing_id_; mojo::Binding<mime_handler::BeforeUnloadControl> before_unload_control_binding_; - ResourceAccessType resource_access_type_; - // Currently used to avoid recording UMA stats for internal use of the - // postMessage API. - bool should_report_internal_messages_ = true; - base::WeakPtrFactory<MimeHandlerViewContainerBase> weak_factory_; DISALLOW_COPY_AND_ASSIGN(MimeHandlerViewContainerBase);
diff --git a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.cc b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.cc index 3ee274b..b2dd30f 100644 --- a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.cc +++ b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.cc
@@ -10,6 +10,7 @@ #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_thread.h" +#include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_frame.h" #include "third_party/blink/public/web/web_local_frame.h" @@ -90,6 +91,9 @@ resource_url), plugin_element_(plugin_element), element_instance_id_(content::RenderThread::Get()->GenerateRoutingID()), + is_resource_accessible_to_embedder_( + GetSourceFrame()->GetSecurityOrigin().CanAccess( + blink::WebSecurityOrigin::Create(resource_url))), render_frame_lifetime_observer_( new RenderFrameLifetimeObserver(this, GetEmbedderRenderFrame())) { RecordInteraction( @@ -124,11 +128,6 @@ delete this; } -blink::WebRemoteFrame* MimeHandlerViewFrameContainer::GetGuestProxyFrame() - const { - return GetContentFrame()->ToWebRemoteFrame(); -} - int32_t MimeHandlerViewFrameContainer::GetInstanceId() const { return element_instance_id_; } @@ -142,4 +141,20 @@ return blink::WebFrame::FromFrameOwnerElement(plugin_element_); } +blink::WebLocalFrame* MimeHandlerViewFrameContainer::GetSourceFrame() { + return GetEmbedderRenderFrame()->GetWebFrame(); +} + +blink::WebFrame* MimeHandlerViewFrameContainer::GetTargetFrame() { + return GetContentFrame(); +} + +bool MimeHandlerViewFrameContainer::IsEmbedded() const { + return is_embedded_; +} + +bool MimeHandlerViewFrameContainer::IsResourceAccessibleBySource() const { + return is_resource_accessible_to_embedder_; +} + } // namespace extensions
diff --git a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.h b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.h index 42e7f34b..04fb897 100644 --- a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.h +++ b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.h
@@ -46,6 +46,12 @@ void DestroyFrameContainer(); void DidLoad(); + // PostMessageHelper::Delegate. + blink::WebLocalFrame* GetSourceFrame() override; + blink::WebFrame* GetTargetFrame() override; + bool IsEmbedded() const override; + bool IsResourceAccessibleBySource() const override; + int32_t element_instance_id() const { return element_instance_id_; } private: @@ -62,7 +68,6 @@ // MimeHandlerViewContainerBase overrides. void CreateMimeHandlerViewGuestIfNecessary() final; - blink::WebRemoteFrame* GetGuestProxyFrame() const final; int32_t GetInstanceId() const final; gfx::Size GetElementSize() const final; @@ -70,6 +75,12 @@ blink::WebElement plugin_element_; const int32_t element_instance_id_; + // TODO(ekaramad): This is intentionally here instead of + // MimeHandlerViewContainerBase because MimeHandlerViewFrameContainer will + // soon be refactored, and no longer a subclass of MHVCB. This means MHVCB + // and MimeHandlerViewContainer should soon merge back into a MHVC class. + // Determines whether the embedder can access |original_url_|. Used for UMA. + bool is_resource_accessible_to_embedder_; std::unique_ptr<RenderFrameLifetimeObserver> render_frame_lifetime_observer_; DISALLOW_COPY_AND_ASSIGN(MimeHandlerViewFrameContainer);
diff --git a/extensions/renderer/guest_view/mime_handler_view/post_message_support.cc b/extensions/renderer/guest_view/mime_handler_view/post_message_support.cc new file mode 100644 index 0000000..fed1d90 --- /dev/null +++ b/extensions/renderer/guest_view/mime_handler_view/post_message_support.cc
@@ -0,0 +1,220 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "extensions/renderer/guest_view/mime_handler_view/post_message_support.h" + +#include "base/auto_reset.h" +#include "base/metrics/histogram_functions.h" +#include "content/public/renderer/v8_value_converter.h" +#include "extensions/common/guest_view/mime_handler_view_uma_types.h" +#include "gin/arguments.h" +#include "gin/dictionary.h" +#include "gin/handle.h" +#include "gin/interceptor.h" +#include "gin/object_template_builder.h" +#include "gin/wrappable.h" +#include "third_party/blink/public/web/web_frame.h" +#include "third_party/blink/public/web/web_local_frame.h" + +namespace extensions { + +using UMAType = MimeHandlerViewUMATypes::Type; + +namespace { + +const char kPostMessageName[] = "postMessage"; + +// The gin-backed scriptable object which is exposed by the BrowserPlugin for +// PostMessageSupport. This currently only implements "postMessage". +class ScriptableObject : public gin::Wrappable<ScriptableObject>, + public gin::NamedPropertyInterceptor { + public: + static gin::WrapperInfo kWrapperInfo; + + static v8::Local<v8::Object> Create( + v8::Isolate* isolate, + base::WeakPtr<PostMessageSupport> post_message_support) { + ScriptableObject* scriptable_object = + new ScriptableObject(isolate, post_message_support); + return gin::CreateHandle(isolate, scriptable_object) + .ToV8() + .As<v8::Object>(); + } + + // gin::NamedPropertyInterceptor + v8::Local<v8::Value> GetNamedProperty( + v8::Isolate* isolate, + const std::string& identifier) override { + if (identifier == kPostMessageName) { + if (post_message_function_template_.IsEmpty()) { + post_message_function_template_.Reset( + isolate, + gin::CreateFunctionTemplate( + isolate, + base::BindRepeating(&PostMessageSupport::PostJavaScriptMessage, + post_message_support_, isolate))); + } + v8::Local<v8::FunctionTemplate> function_template = + v8::Local<v8::FunctionTemplate>::New(isolate, + post_message_function_template_); + v8::Local<v8::Function> function; + if (function_template->GetFunction(isolate->GetCurrentContext()) + .ToLocal(&function)) + return function; + } + return v8::Local<v8::Value>(); + } + + private: + ScriptableObject(v8::Isolate* isolate, + base::WeakPtr<PostMessageSupport> post_message_support) + : gin::NamedPropertyInterceptor(isolate, this), + post_message_support_(post_message_support) {} + + // gin::Wrappable + gin::ObjectTemplateBuilder GetObjectTemplateBuilder( + v8::Isolate* isolate) override { + return gin::Wrappable<ScriptableObject>::GetObjectTemplateBuilder(isolate) + .AddNamedPropertyInterceptor(); + } + + base::WeakPtr<PostMessageSupport> post_message_support_; + v8::Persistent<v8::FunctionTemplate> post_message_function_template_; +}; + +// static +gin::WrapperInfo ScriptableObject::kWrapperInfo = {gin::kEmbedderNativeGin}; + +} // namespace + +PostMessageSupport::Delegate::Delegate() + : post_message_support_(std::make_unique<PostMessageSupport>(this)) {} +PostMessageSupport::Delegate::~Delegate() = default; + +// static +PostMessageSupport* PostMessageSupport::FromWebLocalFrame( + blink::WebLocalFrame* web_local_frame) { + if (auto* delegate = Delegate::FromWebLocalFrame(web_local_frame)) + return delegate->post_message_support(); + return nullptr; +} + +PostMessageSupport::PostMessageSupport(Delegate* delegate) + : delegate_(delegate), weak_factory_(this) { + DCHECK(delegate_); +} + +PostMessageSupport::~PostMessageSupport() { + DCHECK(delegate_); +} + +v8::Local<v8::Object> PostMessageSupport::GetScriptableObject( + v8::Isolate* isolate) { + if (scriptable_object_.IsEmpty()) { + v8::Local<v8::Object> object = + ScriptableObject::Create(isolate, weak_factory_.GetWeakPtr()); + scriptable_object_.Reset(isolate, object); + } + return v8::Local<v8::Object>::New(isolate, scriptable_object_); +} + +void PostMessageSupport::PostJavaScriptMessage(v8::Isolate* isolate, + v8::Local<v8::Value> message) { + if (should_report_internal_messages_) + RecordUMAForPostMessage(message); + + if (!is_active_) { + pending_messages_.push_back(v8::Global<v8::Value>(isolate, message)); + return; + } + + auto* target_frame = delegate_->GetTargetFrame(); + if (!target_frame) + return; + + v8::Context::Scope context_scope( + delegate_->GetSourceFrame()->MainWorldScriptContext()); + v8::Local<v8::Object> target_window_proxy = target_frame->GlobalProxy(); + gin::Dictionary window_object(isolate, target_window_proxy); + v8::Local<v8::Function> post_message; + if (!window_object.Get(std::string(kPostMessageName), &post_message)) + return; + + v8::Local<v8::Value> args[] = { + message, + // Post the message to any domain inside the browser plugin. The embedder + // should already know what is embedded. + gin::StringToV8(isolate, "*")}; + delegate_->GetSourceFrame()->CallFunctionEvenIfScriptDisabled( + post_message.As<v8::Function>(), target_window_proxy, base::size(args), + args); +} +void PostMessageSupport::PostMessageFromValue(const base::Value& message) { + base::UmaHistogramEnumeration(MimeHandlerViewUMATypes::kUMAName, + UMAType::kPostMessageInternal); + auto* frame = delegate_->GetSourceFrame(); + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + v8::HandleScope handle_scope(isolate); + v8::Context::Scope context_scope(frame->MainWorldScriptContext()); + base::AutoReset<bool> avoid_recording_internal_messages( + &should_report_internal_messages_, false); + PostJavaScriptMessage(isolate, + content::V8ValueConverter::Create()->ToV8Value( + &message, frame->MainWorldScriptContext())); +} + +void PostMessageSupport::SetActive() { + DCHECK(!is_active_); + is_active_ = true; + if (pending_messages_.empty()) + return; + + // Now that the guest has loaded, flush any unsent messages. + auto* source = delegate_->GetSourceFrame(); + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + v8::HandleScope handle_scope(isolate); + v8::Context::Scope context_scope(source->MainWorldScriptContext()); + for (const auto& pending_message : pending_messages_) + PostJavaScriptMessage(isolate, + v8::Local<v8::Value>::New(isolate, pending_message)); + + pending_messages_.clear(); +} + +void PostMessageSupport::RecordUMAForPostMessage( + v8::Local<v8::Value>& message) { + auto data = content::V8ValueConverter::Create()->FromV8Value( + message, delegate_->GetSourceFrame()->MainWorldScriptContext()); + std::string message_type; + if (data->is_dict()) { + base::DictionaryValue::From(std::move(data)) + ->GetString("type", &message_type); + } + + bool accessible = delegate_->IsResourceAccessibleBySource(); + MimeHandlerViewUMATypes::Type post_message_type; + if (message_type == "getSelectedText") { + post_message_type = accessible ? UMAType::kAccessibleGetSelectedText + : UMAType::kInaccessibleGetSelectedText; + } else if (message_type == "print") { + post_message_type = + accessible ? UMAType::kAccessiblePrint : UMAType::kInaccessiblePrint; + } else if (message_type == "selectAll") { + post_message_type = accessible ? UMAType::kAccessibleSelectAll + : UMAType::kInaccessibleSelectAll; + } else { + post_message_type = accessible ? UMAType::kAccessibleInvalid + : UMAType::kInaccessibleInvalid; + } + DCHECK_NE(post_message_type, UMAType::kDidCreateMimeHandlerViewContainerBase); + base::UmaHistogramEnumeration(MimeHandlerViewUMATypes::kUMAName, + post_message_type); + if (delegate_->IsEmbedded()) { + base::UmaHistogramEnumeration( + MimeHandlerViewUMATypes::kUMAName, + UMAType::kPostMessageToEmbeddedMimeHandlerView); + } +} + +} // namespace extensions
diff --git a/extensions/renderer/guest_view/mime_handler_view/post_message_support.h b/extensions/renderer/guest_view/mime_handler_view/post_message_support.h new file mode 100644 index 0000000..1ba8989 --- /dev/null +++ b/extensions/renderer/guest_view/mime_handler_view/post_message_support.h
@@ -0,0 +1,110 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef EXTENSIONS_RENDERER_GUEST_VIEW_MIME_HANDLER_VIEW_POST_MESSAGE_SUPPORT_H_ +#define EXTENSIONS_RENDERER_GUEST_VIEW_MIME_HANDLER_VIEW_POST_MESSAGE_SUPPORT_H_ + +#include <memory> +#include <vector> + +#include "base/memory/weak_ptr.h" +#include "base/values.h" +#include "v8/include/v8.h" + +namespace blink { +class WebFrame; +class WebLocalFrame; +} // namespace blink + +namespace extensions { + +// Helper class the implements postMessage support using gin/ to enable an +// embedder of MimeHandlerView (in an HTMLPlugInElement) to send messages to +// the extension loaded inside the MimeHandlerViewGuest process. +class PostMessageSupport { + public: + // Provides source and target messages used for posting messages. It is + // expected to be alive for the lifetime of PostMessageSupport. + class Delegate { + public: + // Returns the Delegate with source frame |web_local_frame| which will be + // used for internal uses of postMessage. + static Delegate* FromWebLocalFrame(blink::WebLocalFrame* web_local_frame); + + Delegate(); + virtual ~Delegate(); + // The source frame which is sending the message. This is the embedder frame + // for a MimeHandlerViewGuest. Must not return nullptr. + virtual blink::WebLocalFrame* GetSourceFrame() = 0; + + // The target WebFrame which the message is sent to. + virtual blink::WebFrame* GetTargetFrame() = 0; + // Returns true if the Delegate is embedded. Used to track postMessage usage + // to embedded MimeHandlerView (i.e., created using a plugin element but not + // as a result of frame navigations to a relevant MimeHandlerView MIME. + virtual bool IsEmbedded() const = 0; + // Determines whether the (MimeHandlerView) resource in target frame is + // accessible from source frame (used for UMA). + virtual bool IsResourceAccessibleBySource() const = 0; + + PostMessageSupport* post_message_support() { + return post_message_support_.get(); + } + + private: + std::unique_ptr<PostMessageSupport> post_message_support_; + }; + + // Returns the first postMessage support found on |web_local_frame|. This is + // the instance which corresponds to a full page MimeHandlerView. + static PostMessageSupport* FromWebLocalFrame( + blink::WebLocalFrame* web_local_frame); + + explicit PostMessageSupport(Delegate* delegate); + ~PostMessageSupport(); + + // Returns the gin/ implementation of v8::Object exposing the postMessage API. + // This is used as the PluginWrapper() for HTMLPlugInElement. + v8::Local<v8::Object> GetScriptableObject(v8::Isolate* isolate); + + // If |is_active_| the message is sent from source frame to the target frame + // (provided by |delegate_|). If |!is_active_| the messages are queued to be + // sent as soon as the PostMessageSupport becomes active. + void PostJavaScriptMessage(v8::Isolate* isolate, + v8::Local<v8::Value> message); + void PostMessageFromValue(const base::Value& message); + + // Activates the PostMessageSupport. After calling this method all the + // messages in |message_queue_| are forwarded to the target frame. + void SetActive(); + + private: + PostMessageSupport(const PostMessageSupport&) = delete; + PostMessageSupport& operator=(const PostMessageSupport&) = delete; + + void RecordUMAForPostMessage(v8::Local<v8::Value>& message); + + // The scriptable object that backs the plugin. + v8::Global<v8::Object> scriptable_object_; + + // Pending postMessage messages that need to be sent to the guest. These are + // queued while the guest is loading and once it is fully loaded they are + // delivered so that messages aren't lost. + std::vector<v8::Global<v8::Value>> pending_messages_; + + // When false, all sent messages are queued up in |message_queue_|. When true, + // the messages are forwarded to the target frame. + bool is_active_ = false; + // Currently used to avoid recording UMA stats for internal use of the + // postMessage API. + bool should_report_internal_messages_ = true; + + Delegate* const delegate_; + + base::WeakPtrFactory<PostMessageSupport> weak_factory_; +}; + +} // namespace extensions + +#endif // EXTENSIONS_RENDERER_GUEST_VIEW_MIME_HANDLER_VIEW_POST_MESSAGE_SUPPORT_H_
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg index 0bb0d6a..1ea963d6 100644 --- a/infra/config/cr-buildbucket.cfg +++ b/infra/config/cr-buildbucket.cfg
@@ -1985,6 +1985,7 @@ builders { name: "Win10 FYI Release (NVIDIA GeForce GTX 1660)" mixins: "win-gpu-fyi-ci" + execution_timeout_secs: 43200 # 12h. } builders { name: "Win7 FYI Debug (AMD)"
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index ebcf4c4..b6db214 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1112,12 +1112,18 @@ <message name="IDS_IOS_PASSWORD_MANAGER_BLACKLIST_BUTTON" desc="Button text for the 'Save Password' infobar's 'Never remember for this site' option [Length: 10em]"> Never </message> + <message name="IDS_IOS_PASSWORD_MANAGER_MODAL_BLACKLIST_BUTTON" desc="Button text for the 'Save Password' Infobar's Modal 'Never remember this site' option [Length: 70em]"> + Never For This Site + </message> <message name="IDS_IOS_PASSWORD_MANAGER_SAVE_BUTTON" desc="Save button text for password manager [Length: 10em]"> Save </message> <message name="IDS_IOS_PASSWORD_MANAGER_SAVE_PASSWORD_PROMPT" desc="Info bar message to save a password. [Length: 60em]"> Save password? </message> + <message name="IDS_IOS_PASSWORD_MANAGER_SAVE_PASSWORD_TITLE" desc="Infobar title to save a password. [Length: 70em]"> + Save password + </message> <message name="IDS_IOS_PASSWORD_MANAGER_UPDATE_BUTTON" desc="Label for the 'update' button in the Update Password infobar. This infobar asks if the user wishes to update the saved password for a site to a new password the user has just entered; the button applies the suggested update. [Length: 10em]"> Update </message> @@ -1127,6 +1133,9 @@ <message name="IDS_IOS_PASSWORD_MANAGER_UPDATE_PASSWORD_FOR_ACCOUNT" desc="Infobar message to update a password for named account. [Length:70em]"> Update password for <ph name="USERNAME">$1<ex>don.john.lemon@example.com</ex></ph>? </message> + <message name="IDS_IOS_PASSWORD_MANAGER_UPDATE_PASSWORD_TITLE" desc="Infobar title to update a password. [Length: 70em]"> + Update password + </message> <message name="IDS_SAVE_PASSWORD_FOOTER" desc="The footer text of the infobar that offers user to save/update a password to Chrome."> Passwords are saved in your Google Account so you can use them on any device. </message>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb index e72f77d..f3d8cad 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb
@@ -32,6 +32,7 @@ <translation id="5389212809648216794">„Google Chrome“ negali naudoti fotoaparato, nes jį naudoja kita programa</translation> <translation id="5639704535586432836">Atidarykite „Nustatymai“ > „Privatumas“ > „Fotoaparatas“ > „Google Chrome“ ir įjunkite fotoaparatą.</translation> <translation id="5642200033778930880">„Google Chrome“ negali naudoti fotoaparato padalyto rodinio režimu</translation> +<translation id="5690427481109656848">Google LLC</translation> <translation id="5854621639439811139">„Chrome“ patarimas. Kai kurie mygtukai dabar yra ekrano apačioje, pvz., mygtukai „Atgal“, „Pirmyn“ ir „Ieškoti“.</translation> <translation id="6036420186814142909">„Google Chrome“ yra funkcijų, kurias naudojant lengva tvarkyti internetinius duomenis ir tinklalapių įkėlimo spartą. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation> @@ -49,6 +50,7 @@ <translation id="7437998757836447326">Atsijungimas nuo „Chrome“</translation> <translation id="756809126120519699">Išvalyti „Chrome“ duomenys</translation> <translation id="7626032353295482388">Sveiki, tai „Chrome“</translation> +<translation id="8370517070665726704">Autorių teisės „Google LLC.“, <ph name="YEAR" /> m. Visos teisės saugomos.</translation> <translation id="840168496893712993">Dėl tam tikrų priedų „Chrome“ užstringa. Pabandykite juos pašalinti.</translation> <translation id="8459495907675268833">Pasirinkti duomenys pašalinti iš „Chrome“ ir sinchronizuojamų įrenginių. Adresu history.google.com gali būti pateikta kitų formų jūsų „Google“ paskyros istorija, pvz., paieškos ir veikla kitose „Google“ paslaugose.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb index b29342d..5fa5398 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb
@@ -32,6 +32,7 @@ <translation id="5389212809648216794">Google Chrome kan je camera niet gebruiken omdat deze wordt gebruikt door een andere app</translation> <translation id="5639704535586432836">Open Instellingen > Privacy > Camera > Google Chrome en zet de camera aan.</translation> <translation id="5642200033778930880">Google Chrome kan je camera niet gebruiken in de modus 'Gesplitste weergave'</translation> +<translation id="5690427481109656848">Google LLC</translation> <translation id="5854621639439811139">Chrome-tip. Sommige knoppen zoals Terug, Vooruit en Zoeken worden nu onderaan het scherm weergegeven.</translation> <translation id="6036420186814142909">Google Chrome bevat functies die je helpen je internetgegevens te beheren en te bepalen hoe snel je webpagina's kunt laden. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation> @@ -49,6 +50,7 @@ <translation id="7437998757836447326">Uitloggen bij Chrome</translation> <translation id="756809126120519699">Chrome-gegevens gewist</translation> <translation id="7626032353295482388">Welkom bij Chrome</translation> +<translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Alle rechten voorbehouden.</translation> <translation id="840168496893712993">Sommige add-ons kunnen ervoor zorgen dat Chrome crasht. Verwijder deze add-ons.</translation> <translation id="8459495907675268833">De geselecteerde gegevens zijn verwijderd uit Chrome en van gesynchroniseerde apparaten. Voor je Google-account kunnen andere vormen van browsegeschiedenis (zoals zoekopdrachten en activiteit uit andere Google-services) beschikbaar zijn via history.google.com.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb index 072f68f..60624607 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb
@@ -32,6 +32,7 @@ <translation id="5389212809648216794">Зараз Google Chrome не може використовувати камеру, оскільки її використовує інший додаток</translation> <translation id="5639704535586432836">Відкрийте меню "Параметри" > "Приватність" > "Камера" > "Google Chrome" і ввімкніть камеру.</translation> <translation id="5642200033778930880">Google Chrome не може використовувати камеру в режимі розділеного екрана</translation> +<translation id="5690427481109656848">Google LLC</translation> <translation id="5854621639439811139">Порада щодо Chrome. Деякі кнопки зараз розташовані внизу екрана, як-от "Назад", "Уперед" і "Пошук".</translation> <translation id="6036420186814142909">У Google Chrome є функції, які допомагають керувати інтернет-даними та швидкістю завантаження веб-сторінок. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation> @@ -49,6 +50,7 @@ <translation id="7437998757836447326">Вихід із Chrome</translation> <translation id="756809126120519699">Дані Chrome видалено</translation> <translation id="7626032353295482388">Вітаємо у Chrome!</translation> +<translation id="8370517070665726704">Авторське право <ph name="YEAR" /> Google LLC. Усі права захищено.</translation> <translation id="840168496893712993">Деякі додатки спричиняють аварійне завершення роботи Chrome. Спробуйте їх видалити.</translation> <translation id="8459495907675268833">Вибрані дані видалено з Chrome і синхронізованих пристроїв. У вашому обліковому записі Google на сторінці history.google.com можуть бути додаткові форми історії веб-перегляду, як-от пошукові запити чи активність в інших службах Google.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 05ed998c..2283798 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -382,7 +382,7 @@ <translation id="6903907808598579934">Aktifkan sinkronisasi</translation> <translation id="6914583639806229067">Telusuri Gambar yang Anda Salin</translation> <translation id="6914783257214138813">Sandi akan terlihat oleh orang yang dapat melihat file yang diekspor.</translation> -<translation id="692898627499215142">Penyiapan sinkronisasi awal belum selesai. To start Sync, enabled the Sync toggle.</translation> +<translation id="692898627499215142">Penyiapan sinkronisasi awal belum selesai. Untuk memulai Sinkronisasi, aktifkan tombol Sinkronisasi.</translation> <translation id="6944369514868857500">Pilih Akun Lain</translation> <translation id="6945221475159498467">Pilih</translation> <translation id="6973630695168034713">Folder</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 8b2b78a..aee50c90 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -382,12 +382,14 @@ <translation id="6903907808598579934">Įjungti sinchronizavimą</translation> <translation id="6914583639806229067">Ieškoti nukopijuoto vaizdo</translation> <translation id="6914783257214138813">Jūsų slaptažodžiai bus matomi visiems, kurie gali peržiūrėti eksportuotą failą.</translation> +<translation id="692898627499215142">Pradinis sinchronizavimo nustatymas nebaigtas. Norint pradėti sinchronizuoti, įgalintas sinchronizavimo perjungimas.</translation> <translation id="6944369514868857500">Pasirinkti kitą paskyrą</translation> <translation id="6945221475159498467">Pasirinkti</translation> <translation id="6973630695168034713">Aplankai</translation> <translation id="6979158407327259162">„Google“ diskas</translation> <translation id="7004499039102548441">Naujausi skirtukai</translation> <translation id="7006788746334555276">Turinio nustatymai</translation> +<translation id="7015203776128479407">Pradinis sinchronizavimo nustatymas nebaigtas. Sinchronizavimas išjungtas.</translation> <translation id="7029809446516969842">Slaptažodžiai</translation> <translation id="7031882061095297553">Sinchronizavimas su</translation> <translation id="7053983685419859001">Blokuoti</translation> @@ -399,6 +401,7 @@ <translation id="7136892417564438900">Fotoaparatas nepasiekiamas</translation> <translation id="7159472599653637159">Užkl. dėl svet. v. mobil.</translation> <translation id="7167621057293532233">Duomenų tipai</translation> +<translation id="7173114856073700355">Atidaryti nustatymus</translation> <translation id="7189598951263744875">Bendrinti...</translation> <translation id="7192050974311852563">Pradėti registravimą</translation> <translation id="7203585745079012652">Sakyti atsakymus</translation> @@ -475,6 +478,7 @@ <translation id="850600235656508448">Atidaryti inkognito režimu</translation> <translation id="8517375800490286174">Atvirojo šaltinio licencijos</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> skirtukai: <ph name="FIRST_VISIBLE_TAB" />–<ph name="LAST_VISIBLE_TAB" /> iš <ph name="NUMBER_OF_OPEN_TABS" /></translation> +<translation id="8529767659511976195">Nauja</translation> <translation id="8532105204136943229">Gal. pab. metai</translation> <translation id="8534481786647257214">„Google+“ įrašas paskelbtas.</translation> <translation id="8548878600947630424">Ieškoti puslapyje...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index a55f9f7..d0a3396 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -382,12 +382,14 @@ <translation id="6903907808598579934">Synchronisatie inschakelen</translation> <translation id="6914583639806229067">Zoeken naar gekopieerde afbeelding</translation> <translation id="6914783257214138813">Je wachtwoorden zijn zichtbaar voor iedereen die het geëxporteerde bestand kan bekijken.</translation> +<translation id="692898627499215142">Aanvankelijke synchronisatie-instelling is niet voltooid. Schakel Synchronisatie in om te beginnen met synchroniseren.</translation> <translation id="6944369514868857500">Een ander account kiezen</translation> <translation id="6945221475159498467">Selecteren</translation> <translation id="6973630695168034713">Mappen</translation> <translation id="6979158407327259162">Google Drive</translation> <translation id="7004499039102548441">Recent gebruikte tabbladen</translation> <translation id="7006788746334555276">Instellingen voor content</translation> +<translation id="7015203776128479407">Aanvankelijke synchronisatie-instelling is niet voltooid. Synchronisatie is uitgeschakeld.</translation> <translation id="7029809446516969842">Wachtwoorden</translation> <translation id="7031882061095297553">Synchroniseren met</translation> <translation id="7053983685419859001">Blokkeren</translation> @@ -399,6 +401,7 @@ <translation id="7136892417564438900">Camera is niet beschikbaar</translation> <translation id="7159472599653637159">Mobiele site opvragen</translation> <translation id="7167621057293532233">Gegevenstypen</translation> +<translation id="7173114856073700355">Instellingen openen</translation> <translation id="7189598951263744875">Delen</translation> <translation id="7192050974311852563">Logboekregistratie starten</translation> <translation id="7203585745079012652">Antwoorden uitspreken</translation> @@ -475,6 +478,7 @@ <translation id="850600235656508448">Openen in incognitomodus</translation> <translation id="8517375800490286174">Open-sourcelicenties</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" />-tabbladen <ph name="FIRST_VISIBLE_TAB" /> tot <ph name="LAST_VISIBLE_TAB" /> van <ph name="NUMBER_OF_OPEN_TABS" /></translation> +<translation id="8529767659511976195">Nieuw</translation> <translation id="8532105204136943229">Vervaljaar</translation> <translation id="8534481786647257214">Google+ bericht voltooid.</translation> <translation id="8548878600947630424">Zoeken op deze pagina...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 9784144..86486774 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -85,6 +85,7 @@ <translation id="213900355088104901">தனிப்பட்ட முறையில் உலாவ, மறைநிலைத் தாவலைத் திறக்கவும்</translation> <translation id="2139867232736819575">நீங்கள் நகலெடுத்த உரையைத் தேடவும்</translation> <translation id="2149973817440762519">புக்மார்க்கை மாற்றுக</translation> +<translation id="2179182049312275900">அமைப்புகளில் ஒத்திசைவை எந்த நேரத்திலும் இயக்கலாம்.</translation> <translation id="2198757192731523470">தேடல், விளம்பரங்கள் மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் வரலாற்றை Google பயன்படுத்தக்கூடும்.</translation> <translation id="2207590065820824892"><ph name="UNREAD_COUNT" /> படிக்கப்படாத வாசிப்புப் பட்டியல் கட்டுரைகள் உள்ளன.</translation> <translation id="2230173723195178503">இணையப் பக்கம் ஏற்றப்பட்டது</translation> @@ -202,6 +203,7 @@ <translation id="4038354071007134711">கோப்பைத் திறக்கக்கூடிய பயன்பாடு சாதனத்தில் இல்லை.</translation> <translation id="4042870976416480368">பக்கத்தில் கண்டறிக</translation> <translation id="4049507953662678203">இணைய இணைப்பு இருப்பதை உறுதிசெய்து, மீண்டும் முயலவும்.</translation> +<translation id="4071530748369333746">ஒத்திசைவை ரத்துசெய்யவா?</translation> <translation id="4082688844002261427">தேடல், விளம்பரங்கள் மற்றும் பலவற்றைப் பிரத்தியேகமானதாக்க உங்கள் உலாவல் வரலாறு எப்படிப் பயன்படுத்தப்படுகிறது என்பதைக் கட்டுப்படுத்தலாம்</translation> <translation id="408404951701638773">தேடல் பட்டியை இப்போது எளிதாக அணுகலாம்</translation> <translation id="411254640334432676">பதிவிறக்கம் தோல்வி.</translation> @@ -270,6 +272,7 @@ <translation id="5197255632782567636">இணையம்</translation> <translation id="5228579091201413441">ஒத்திசைவை இயக்கு</translation> <translation id="5244474230056479698"><ph name="EMAIL" />க்கு ஒத்திசைக்கிறது</translation> +<translation id="5245322853195994030">ஒத்திசைவை ரத்துசெய்</translation> <translation id="5300589172476337783">காண்பி</translation> <translation id="5317780077021120954">சேமி</translation> <translation id="5327248766486351172">பெயர்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index 15293fe5..03bd96f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -382,12 +382,14 @@ <translation id="6903907808598579934">Увімкнути синхронізацію</translation> <translation id="6914583639806229067">Шукати скопійоване зображення</translation> <translation id="6914783257214138813">Ваші паролі бачитимуть усі, хто може переглядати експортований файл.</translation> +<translation id="692898627499215142">Початкове налаштування синхронізації не завершено. Щоб почати синхронізацію, увімкніть її.</translation> <translation id="6944369514868857500">Вибрати інший обліковий запис</translation> <translation id="6945221475159498467">Вибрати</translation> <translation id="6973630695168034713">Папки</translation> <translation id="6979158407327259162">Диск Google</translation> <translation id="7004499039102548441">Останні вкладки</translation> <translation id="7006788746334555276">Веб-контент</translation> +<translation id="7015203776128479407">Початкове налаштування синхронізації не завершено. Синхронізацію вимкнено.</translation> <translation id="7029809446516969842">Паролі</translation> <translation id="7031882061095297553">Синхронізувати</translation> <translation id="7053983685419859001">Блокувати</translation> @@ -399,6 +401,7 @@ <translation id="7136892417564438900">Камера недоступна</translation> <translation id="7159472599653637159">Мобільний сайт</translation> <translation id="7167621057293532233">Типи даних</translation> +<translation id="7173114856073700355">Відкрити налаштування</translation> <translation id="7189598951263744875">Поділитися...</translation> <translation id="7192050974311852563">Почати ведення журналів</translation> <translation id="7203585745079012652">Озвучувати відповіді</translation> @@ -475,6 +478,7 @@ <translation id="850600235656508448">Відкрити в режимі анонімного перегляду</translation> <translation id="8517375800490286174">Ліцензії ПЗ з відкритим кодом</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" />: вкладки <ph name="FIRST_VISIBLE_TAB" />–<ph name="LAST_VISIBLE_TAB" /> з <ph name="NUMBER_OF_OPEN_TABS" /></translation> +<translation id="8529767659511976195">Нове</translation> <translation id="8532105204136943229">Рік закінчення терміну дії</translation> <translation id="8534481786647257214">Опубліковано в Google+</translation> <translation id="8548878600947630424">Знайти на сторінці...</translation>
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.h b/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.h index 44072ae4..b6d3ff81 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.h +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.h
@@ -40,6 +40,9 @@ // The URL host for which the credentials are being saved for. NSString* GetURLHostText() const; + // The title for the InfobarModal being presented. + virtual NSString* GetInfobarModalTitleText() const; + protected: IOSChromePasswordManagerInfoBarDelegate( bool is_sync_user,
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.mm index 567a8c1..9c6d067 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.mm
@@ -60,6 +60,12 @@ return base::SysUTF8ToNSString(form_to_save_->GetOrigin().host()); } +NSString* IOSChromePasswordManagerInfoBarDelegate::GetInfobarModalTitleText() + const { + NOTREACHED() << "Subclass must implement."; + return @""; +} + int IOSChromePasswordManagerInfoBarDelegate::GetIconId() const { return IDR_IOS_INFOBAR_SAVE_PASSWORD; }
diff --git a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h index dd41983..7fc68ae0e 100644 --- a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h +++ b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h
@@ -51,6 +51,9 @@ bool Accept() override; bool Cancel() override; + // IOSChromePasswordManagerInfoBarDelegate implementation. + NSString* GetInfobarModalTitleText() const override; + DISALLOW_COPY_AND_ASSIGN(IOSChromeSavePasswordInfoBarDelegate); };
diff --git a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm index 299f4d0..1e689e9a 100644 --- a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm +++ b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm
@@ -79,11 +79,24 @@ IDS_IOS_PASSWORD_MANAGER_SAVE_PASSWORD_PROMPT); } +NSString* IOSChromeSavePasswordInfoBarDelegate::GetInfobarModalTitleText() + const { + DCHECK(IsInfobarUIRebootEnabled()); + return l10n_util::GetNSString(IDS_IOS_PASSWORD_MANAGER_SAVE_PASSWORD_TITLE); +} + base::string16 IOSChromeSavePasswordInfoBarDelegate::GetButtonLabel( InfoBarButton button) const { - return l10n_util::GetStringUTF16( - (button == BUTTON_OK) ? IDS_IOS_PASSWORD_MANAGER_SAVE_BUTTON - : IDS_IOS_PASSWORD_MANAGER_BLACKLIST_BUTTON); + if (IsInfobarUIRebootEnabled()) { + return l10n_util::GetStringUTF16( + (button == BUTTON_OK) + ? IDS_IOS_PASSWORD_MANAGER_SAVE_BUTTON + : IDS_IOS_PASSWORD_MANAGER_MODAL_BLACKLIST_BUTTON); + } else { + return l10n_util::GetStringUTF16( + (button == BUTTON_OK) ? IDS_IOS_PASSWORD_MANAGER_SAVE_BUTTON + : IDS_IOS_PASSWORD_MANAGER_BLACKLIST_BUTTON); + } } bool IOSChromeSavePasswordInfoBarDelegate::Accept() {
diff --git a/ios/chrome/browser/passwords/ios_chrome_update_password_infobar_delegate.h b/ios/chrome/browser/passwords/ios_chrome_update_password_infobar_delegate.h index 3839a28..da4af71 100644 --- a/ios/chrome/browser/passwords/ios_chrome_update_password_infobar_delegate.h +++ b/ios/chrome/browser/passwords/ios_chrome_update_password_infobar_delegate.h
@@ -66,6 +66,9 @@ bool Accept() override; bool Cancel() override; + // IOSChromePasswordManagerInfoBarDelegate implementation. + NSString* GetInfobarModalTitleText() const override; + // The credential that should be displayed in the infobar, and for which the // password will be updated. base::string16 selected_account_;
diff --git a/ios/chrome/browser/passwords/ios_chrome_update_password_infobar_delegate.mm b/ios/chrome/browser/passwords/ios_chrome_update_password_infobar_delegate.mm index 4c18b62..9e6da8b 100644 --- a/ios/chrome/browser/passwords/ios_chrome_update_password_infobar_delegate.mm +++ b/ios/chrome/browser/passwords/ios_chrome_update_password_infobar_delegate.mm
@@ -105,14 +105,26 @@ IDS_IOS_PASSWORD_MANAGER_UPDATE_PASSWORD); } +NSString* IOSChromeUpdatePasswordInfoBarDelegate::GetInfobarModalTitleText() + const { + DCHECK(IsInfobarUIRebootEnabled()); + return l10n_util::GetNSString(IDS_IOS_PASSWORD_MANAGER_UPDATE_PASSWORD_TITLE); +} + int IOSChromeUpdatePasswordInfoBarDelegate::GetButtons() const { return BUTTON_OK; } base::string16 IOSChromeUpdatePasswordInfoBarDelegate::GetButtonLabel( InfoBarButton button) const { - DCHECK_EQ(BUTTON_OK, button); - return l10n_util::GetStringUTF16(IDS_IOS_PASSWORD_MANAGER_UPDATE_BUTTON); + if (IsInfobarUIRebootEnabled()) { + return (button == BUTTON_OK) ? l10n_util::GetStringUTF16( + IDS_IOS_PASSWORD_MANAGER_UPDATE_BUTTON) + : base::string16(); + } else { + DCHECK_EQ(BUTTON_OK, button); + return l10n_util::GetStringUTF16(IDS_IOS_PASSWORD_MANAGER_UPDATE_BUTTON); + } } bool IOSChromeUpdatePasswordInfoBarDelegate::Accept() {
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm index 271fd7c8..70150bdd 100644 --- a/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm +++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm
@@ -83,9 +83,9 @@ self.modalViewController = [[InfobarPasswordTableViewController alloc] initWithTableViewStyle:UITableViewStylePlain appBarStyle:ChromeTableViewControllerStyleNoAppBar]; - self.modalViewController.title = - base::SysUTF16ToNSString(self.passwordInfoBarDelegate->GetMessageText()); self.modalViewController.infobarModalDelegate = self; + self.modalViewController.title = + self.passwordInfoBarDelegate->GetInfobarModalTitleText(); self.modalViewController.username = self.passwordInfoBarDelegate->GetUserNameText(); NSString* password = self.passwordInfoBarDelegate->GetPasswordText();
diff --git a/ios/chrome/browser/ui/infobars/modals/BUILD.gn b/ios/chrome/browser/ui/infobars/modals/BUILD.gn index 354217a..930a93bd 100644 --- a/ios/chrome/browser/ui/infobars/modals/BUILD.gn +++ b/ios/chrome/browser/ui/infobars/modals/BUILD.gn
@@ -18,6 +18,7 @@ "//ios/chrome/app/strings:ios_strings_grit", "//ios/chrome/browser/ui/table_view", "//ios/chrome/browser/ui/table_view:styler", + "//ios/chrome/browser/ui/util", "//ui/base", ] }
diff --git a/ios/chrome/browser/ui/infobars/modals/infobar_password_table_view_controller.h b/ios/chrome/browser/ui/infobars/modals/infobar_password_table_view_controller.h index 4de2e98..1dff4c9 100644 --- a/ios/chrome/browser/ui/infobars/modals/infobar_password_table_view_controller.h +++ b/ios/chrome/browser/ui/infobars/modals/infobar_password_table_view_controller.h
@@ -26,7 +26,7 @@ @property(nonatomic, copy) NSString* detailsTextMessage; // The URL being displayed in the InfobarModal. @property(nonatomic, copy) NSString* URL; -// The text used for the save credentials button. +// The text used for the save/update credentials button. @property(nonatomic, copy) NSString* saveButtonText; // The text used for the cancel button. @property(nonatomic, copy) NSString* cancelButtonText;
diff --git a/ios/chrome/browser/ui/infobars/modals/infobar_password_table_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/infobar_password_table_view_controller.mm index 32a3979..7667bcb 100644 --- a/ios/chrome/browser/ui/infobars/modals/infobar_password_table_view_controller.mm +++ b/ios/chrome/browser/ui/infobars/modals/infobar_password_table_view_controller.mm
@@ -12,6 +12,7 @@ #import "ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_text_edit_item.h" #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h" +#import "ios/chrome/browser/ui/util/uikit_ui_util.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util_mac.h" @@ -19,6 +20,11 @@ #error "This file requires ARC support." #endif +namespace { +// Text color for the Cancel button. +const CGFloat kCancelButtonTextColorBlue = 0x1A73E8; +} // namespace + typedef NS_ENUM(NSInteger, SectionIdentifier) { SectionIdentifierContent = kSectionIdentifierEnumZero, }; @@ -28,7 +34,7 @@ ItemTypeUsername, ItemTypePassword, ItemTypeSaveCredentials, - ItemTypeNeverForThisSite, + ItemTypeCancel, }; @interface InfobarPasswordTableViewController () @@ -38,8 +44,9 @@ @property(nonatomic, strong) TableViewTextEditItem* passwordItem; // Item that holds the SaveCredentials Button information. @property(nonatomic, strong) TableViewTextButtonItem* saveCredentialsItem; -// Item that holds the Never Save for this site Button information. -@property(nonatomic, strong) TableViewTextButtonItem* neverForThisSiteItem; +// Item that holds the cancel Button for this Infobar. e.g. "Never Save for this +// site". +@property(nonatomic, strong) TableViewTextButtonItem* cancelInfobarItem; @end @implementation InfobarPasswordTableViewController @@ -122,13 +129,16 @@ [model addItem:self.saveCredentialsItem toSectionWithIdentifier:SectionIdentifierContent]; - self.neverForThisSiteItem = - [[TableViewTextButtonItem alloc] initWithType:ItemTypeNeverForThisSite]; - self.neverForThisSiteItem.buttonText = self.cancelButtonText; - self.neverForThisSiteItem.buttonTextColor = [UIColor blueColor]; - self.neverForThisSiteItem.buttonBackgroundColor = [UIColor clearColor]; - [model addItem:self.neverForThisSiteItem - toSectionWithIdentifier:SectionIdentifierContent]; + if ([self.cancelButtonText length]) { + self.cancelInfobarItem = + [[TableViewTextButtonItem alloc] initWithType:ItemTypeCancel]; + self.cancelInfobarItem.buttonText = self.cancelButtonText; + self.cancelInfobarItem.buttonTextColor = + UIColorFromRGB(kCancelButtonTextColorBlue); + self.cancelInfobarItem.buttonBackgroundColor = [UIColor clearColor]; + [model addItem:self.cancelInfobarItem + toSectionWithIdentifier:SectionIdentifierContent]; + } } #pragma mark - UITableViewDataSource @@ -150,7 +160,7 @@ forControlEvents:UIControlEventTouchUpInside]; break; } - case ItemTypeNeverForThisSite: { + case ItemTypeCancel: { TableViewTextButtonCell* tableViewTextButtonCell = base::mac::ObjCCastStrict<TableViewTextButtonCell>(cell); [tableViewTextButtonCell.button
diff --git a/ios/chrome/browser/ui/settings/cells/clear_browsing_data_item_unittest.mm b/ios/chrome/browser/ui/settings/cells/clear_browsing_data_item_unittest.mm index da9572e..6f0d428 100644 --- a/ios/chrome/browser/ui/settings/cells/clear_browsing_data_item_unittest.mm +++ b/ios/chrome/browser/ui/settings/cells/clear_browsing_data_item_unittest.mm
@@ -41,37 +41,4 @@ EXPECT_FALSE([item hasCounter]); } -// Test that if the counter is set, then [item hasCounter] returns true. -TEST_F(ClearDataItemTest, ConfigureCellTestCounterNotNil) { - std::unique_ptr<BrowsingDataCounterWrapper> counter = - BrowsingDataCounterWrapper::CreateCounterWrapper( - browsing_data::prefs::kDeleteBrowsingHistory, browser_state_.get(), - browser_state_.get()->GetPrefs(), - base::BindRepeating( - ^(const browsing_data::BrowsingDataCounter::Result& result){ - })); - - ClearBrowsingDataItem* item = - [[ClearBrowsingDataItem alloc] initWithType:0 counter:std::move(counter)]; - EXPECT_FALSE([item hasCounter]); -} - -// Test that calling [item restartCounter] sets the detailText to "None" -TEST_F(ClearDataItemTest, ConfigureCellTestRestartCounter) { - std::unique_ptr<BrowsingDataCounterWrapper> counter = - BrowsingDataCounterWrapper::CreateCounterWrapper( - browsing_data::prefs::kDeleteBrowsingHistory, browser_state_.get(), - browser_state_.get()->GetPrefs(), - base::BindRepeating( - ^(const browsing_data::BrowsingDataCounter::Result& result) { - NSString* detail_text = base::SysUTF16ToNSString( - browsing_data::GetCounterTextFromResult(&result)); - EXPECT_EQ(@"None", detail_text); - })); - ClearBrowsingDataItem* item = - [[ClearBrowsingDataItem alloc] initWithType:0 counter:std::move(counter)]; - - [item restartCounter]; -} - } // namespace
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.mm index 744b394..1d858a20 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.mm +++ b/ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.mm
@@ -34,7 +34,7 @@ const CGFloat kButtonCornerRadius = 8; // Font Size for Button Title Label. const CGFloat kButtonTitleFontSize = 17.0; - +// Default Text alignment. const NSTextAlignment kDefaultTextAlignment = NSTextAlignmentCenter; } // namespace
diff --git a/ipc/ipc_mojo_bootstrap.cc b/ipc/ipc_mojo_bootstrap.cc index 5eb7465..63193145 100644 --- a/ipc/ipc_mojo_bootstrap.cc +++ b/ipc/ipc_mojo_bootstrap.cc
@@ -91,6 +91,27 @@ return *provider; } +// Messages are grouped by this info when recording memory metrics. +struct MessageMemoryDumpInfo { + MessageMemoryDumpInfo(const mojo::Message& message) + : id(message.name()), profiler_tag(message.heap_profiler_tag()) {} + MessageMemoryDumpInfo() = default; + + bool operator==(const MessageMemoryDumpInfo& other) const { + return other.id == id && other.profiler_tag == profiler_tag; + } + + uint32_t id = 0; + const char* profiler_tag = nullptr; +}; + +struct MessageMemoryDumpInfoHash { + size_t operator()(const MessageMemoryDumpInfo& info) const { + return base::HashInts32( + info.id, info.profiler_tag ? base::Hash(info.profiler_tag) : 0); + } +}; + class ChannelAssociatedGroupController : public mojo::AssociatedGroupController, public mojo::MessageReceiver, @@ -121,17 +142,21 @@ return outgoing_messages_.size(); } - std::pair<uint32_t, size_t> GetTopQueuedMessageNameAndCount() { - std::unordered_map<uint32_t, size_t> counts; - std::pair<uint32_t, size_t> top_message_name_and_count = {0, 0}; + void GetTopQueuedMessageMemoryDumpInfo(MessageMemoryDumpInfo* info, + size_t* count) { + std::unordered_map<MessageMemoryDumpInfo, size_t, MessageMemoryDumpInfoHash> + counts; + std::pair<MessageMemoryDumpInfo, size_t> top_message_info_and_count = { + MessageMemoryDumpInfo(), 0}; base::AutoLock lock(outgoing_messages_lock_); for (const auto& message : outgoing_messages_) { - auto it_and_inserted = counts.emplace(message.name(), 0); + auto it_and_inserted = counts.emplace(MessageMemoryDumpInfo(message), 0); it_and_inserted.first->second++; - if (it_and_inserted.first->second > top_message_name_and_count.second) - top_message_name_and_count = *it_and_inserted.first; + if (it_and_inserted.first->second > top_message_info_and_count.second) + top_message_info_and_count = *it_and_inserted.first; } - return top_message_name_and_count; + *info = top_message_info_and_count.first; + *count = top_message_info_and_count.second; } void Bind(mojo::ScopedMessagePipeHandle handle) { @@ -672,6 +697,7 @@ } bool SendMessage(mojo::Message* message) { + DCHECK(message->heap_profiler_tag()); if (task_runner_->BelongsToCurrentThread()) { DCHECK(thread_checker_.CalledOnValidThread()); if (!connector_ || paused_) { @@ -991,12 +1017,22 @@ dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameObjectCount, base::trace_event::MemoryAllocatorDump::kUnitsObjects, controller->GetQueuedMessageCount()); - auto top_message_name_and_count = - controller->GetTopQueuedMessageNameAndCount(); - dump->AddScalar("top_message_name", "id", top_message_name_and_count.first); + MessageMemoryDumpInfo info; + size_t count = 0; + controller->GetTopQueuedMessageMemoryDumpInfo(&info, &count); + dump->AddScalar("top_message_name", "id", info.id); dump->AddScalar("top_message_count", base::trace_event::MemoryAllocatorDump::kUnitsObjects, - top_message_name_and_count.second); + count); + + if (info.profiler_tag) { + // TODO(ssid): Memory dumps currently do not support adding string + // arguments in background dumps. So, add this value as a trace event for + // now. + TRACE_EVENT1(base::trace_event::MemoryDumpManager::kTraceCategory, + "ControllerMemoryDumpProvider::OnMemoryDump", + "top_queued_message_tag", info.profiler_tag); + } } return true;
diff --git a/media/DEPS b/media/DEPS index 2fc2b24c..32eb5c0 100644 --- a/media/DEPS +++ b/media/DEPS
@@ -12,6 +12,7 @@ "+mojo/public/cpp/system/platform_handle.h", "+services/ws/public/cpp/gpu/context_provider_command_buffer.h", "+skia/ext", + "+third_party/boringssl/src/include", "+third_party/dav1d", "+third_party/ffmpeg", "+third_party/libaom",
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn index 83fcdba27..e746dc1 100644 --- a/media/base/BUILD.gn +++ b/media/base/BUILD.gn
@@ -306,6 +306,7 @@ ":video_facing", "//media:media_buildflags", "//media:shared_memory_support", + "//third_party/boringssl", "//ui/gfx:color_space", ] deps = [
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 28f4f38..5359c34 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -326,6 +326,13 @@ const base::Feature kExternalClearKeyForTesting{ "ExternalClearKeyForTesting", base::FEATURE_DISABLED_BY_DEFAULT}; +// Prevents UrlProvisionFetcher from making a provisioning request. If +// specified, any provisioning request made will not be sent to the provisioning +// server, and the response will indicate a failure to communicate with the +// provisioning server. +const base::Feature kFailUrlProvisionFetcherForTesting{ + "FailUrlProvisionFetcherForTesting", base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables hardware secure decryption if supported by hardware and CDM. // TODO(xhwang): Currently this is only used for development of new features. // Apply this to Android and ChromeOS as well where hardware secure decryption
diff --git a/media/base/media_switches.h b/media/base/media_switches.h index ee0241b..3863b93 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h
@@ -102,6 +102,7 @@ MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoder; MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoderIgnoreWorkarounds; MEDIA_EXPORT extern const base::Feature kExternalClearKeyForTesting; +MEDIA_EXPORT extern const base::Feature kFailUrlProvisionFetcherForTesting; MEDIA_EXPORT extern const base::Feature kFallbackAfterDecodeError; MEDIA_EXPORT extern const base::Feature kHardwareMediaKeyHandling; MEDIA_EXPORT extern const base::Feature kHardwareSecureDecryption;
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc index 064d6b2..4ea8a9ff 100644 --- a/media/base/video_frame.cc +++ b/media/base/video_frame.cc
@@ -841,15 +841,13 @@ } // static -void VideoFrame::HashFrameForTesting(base::MD5Context* context, +void VideoFrame::HashFrameForTesting(MD5_CTX* context, const VideoFrame& frame) { DCHECK(context); for (size_t plane = 0; plane < NumPlanes(frame.format()); ++plane) { for (int row = 0; row < frame.rows(plane); ++row) { - base::MD5Update(context, base::StringPiece(reinterpret_cast<const char*>( - frame.data(plane) + - frame.stride(plane) * row), - frame.row_bytes(plane))); + MD5_Update(context, (frame.data(plane) + frame.stride(plane) * row), + frame.row_bytes(plane)); } } }
diff --git a/media/base/video_frame.h b/media/base/video_frame.h index 3ab20a32..e6a371c 100644 --- a/media/base/video_frame.h +++ b/media/base/video_frame.h
@@ -14,7 +14,6 @@ #include <vector> #include "base/callback.h" -#include "base/hash/md5.h" #include "base/logging.h" #include "base/macros.h" #include "base/memory/aligned_memory.h" @@ -30,6 +29,7 @@ #include "media/base/video_frame_layout.h" #include "media/base/video_frame_metadata.h" #include "media/base/video_types.h" +#include "third_party/boringssl/src/include/openssl/md5.h" #include "ui/gfx/color_space.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" @@ -365,9 +365,8 @@ static size_t Columns(size_t plane, VideoPixelFormat format, int width); // Used to keep a running hash of seen frames. Expects an initialized MD5 - // context. Calls MD5Update with the context and the contents of the frame. - static void HashFrameForTesting(base::MD5Context* context, - const VideoFrame& frame); + // context. Calls MD5_Update with the context and the contents of the frame. + static void HashFrameForTesting(MD5_CTX* context, const VideoFrame& frame); // Returns true if |frame| is accesible mapped in the VideoFrame memory space. // static
diff --git a/media/base/video_frame_unittest.cc b/media/base/video_frame_unittest.cc index 5ac862c3..7a2952981 100644 --- a/media/base/video_frame_unittest.cc +++ b/media/base/video_frame_unittest.cc
@@ -16,11 +16,14 @@ #include "base/memory/shared_memory.h" #include "base/memory/unsafe_shared_memory_region.h" #include "base/stl_util.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "gpu/command_buffer/common/mailbox_holder.h" #include "media/base/simple_sync_token_client.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/boringssl/src/include/openssl/md5.h" #include "third_party/libyuv/include/libyuv.h" namespace { @@ -50,8 +53,6 @@ namespace media { -using base::MD5DigestToBase16; - // Helper function that initializes a YV12 frame with white and black scan // lines based on the |white_to_black| parameter. If 0, then the entire // frame will be black, if 1 then the entire frame will be white. @@ -142,12 +143,12 @@ frame->stride(plane) * frame->rows(plane)); } - base::MD5Context context; - base::MD5Init(&context); + MD5_CTX context; + MD5_Init(&context); VideoFrame::HashFrameForTesting(&context, *frame.get()); - base::MD5Digest digest; - base::MD5Final(&digest, &context); - EXPECT_EQ(MD5DigestToBase16(digest), expected_hash); + uint8_t digest[MD5_DIGEST_LENGTH]; + MD5_Final(digest, &context); + EXPECT_EQ(base::HexEncode(digest, MD5_DIGEST_LENGTH), expected_hash); } TEST(VideoFrame, CreateFrame) { @@ -168,21 +169,23 @@ InitializeYV12Frame(frame.get(), 0.0f); ExpectFrameColor(frame.get(), 0xFF000000); } - base::MD5Digest digest; - base::MD5Context context; - base::MD5Init(&context); + uint8_t digest[MD5_DIGEST_LENGTH]; + MD5_CTX context; + MD5_Init(&context); VideoFrame::HashFrameForTesting(&context, *frame.get()); - base::MD5Final(&digest, &context); - EXPECT_EQ(MD5DigestToBase16(digest), "9065c841d9fca49186ef8b4ef547e79b"); + MD5_Final(digest, &context); + EXPECT_EQ(base::HexEncode(digest, MD5_DIGEST_LENGTH), + "9065C841D9FCA49186EF8B4EF547E79B"); { SCOPED_TRACE(""); InitializeYV12Frame(frame.get(), 1.0f); ExpectFrameColor(frame.get(), 0xFFFFFFFF); } - base::MD5Init(&context); + MD5_Init(&context); VideoFrame::HashFrameForTesting(&context, *frame.get()); - base::MD5Final(&digest, &context); - EXPECT_EQ(MD5DigestToBase16(digest), "911991d51438ad2e1a40ed5f6fc7c796"); + MD5_Final(digest, &context); + EXPECT_EQ(base::HexEncode(digest, MD5_DIGEST_LENGTH), + "911991D51438AD2E1A40ED5F6FC7C796"); // Test single planar frame. frame = VideoFrame::CreateFrame(media::PIXEL_FORMAT_ARGB, size, @@ -434,8 +437,8 @@ TEST(VideoFrame, CheckFrameExtents) { // Each call consists of a Format and the expected hash of all // planes if filled with kFillByte (defined in ExpectFrameExtents). - ExpectFrameExtents(PIXEL_FORMAT_YV12, "8e5d54cb23cd0edca111dd35ffb6ff05"); - ExpectFrameExtents(PIXEL_FORMAT_I422, "cce408a044b212db42a10dfec304b3ef"); + ExpectFrameExtents(PIXEL_FORMAT_YV12, "8E5D54CB23CD0EDCA111DD35FFB6FF05"); + ExpectFrameExtents(PIXEL_FORMAT_I422, "CCE408A044B212DB42A10DFEC304B3EF"); } static void TextureCallback(gpu::SyncToken* called_sync_token,
diff --git a/media/capture/BUILD.gn b/media/capture/BUILD.gn index 9dccf52..7999abc 100644 --- a/media/capture/BUILD.gn +++ b/media/capture/BUILD.gn
@@ -363,6 +363,7 @@ "//mojo/core/embedder", "//testing/gmock", "//testing/gtest", + "//third_party/boringssl", "//ui/gfx:test_support", ]
diff --git a/media/capture/video/android/BUILD.gn b/media/capture/video/android/BUILD.gn index 1148a14e..63d21bb0 100644 --- a/media/capture/video/android/BUILD.gn +++ b/media/capture/video/android/BUILD.gn
@@ -25,6 +25,7 @@ "//media/capture:capture_device_specific", "//media/capture/mojom:image_capture", "//media/capture/mojom:image_capture_types", + "//third_party/boringssl", "//third_party/libyuv", "//ui/gfx:color_space", "//ui/gfx/geometry",
diff --git a/media/filters/BUILD.gn b/media/filters/BUILD.gn index ed193cb..d12108b5 100644 --- a/media/filters/BUILD.gn +++ b/media/filters/BUILD.gn
@@ -378,6 +378,7 @@ deps += [ # Direct dependency needed for the config + "//third_party/boringssl", "//third_party/opus", ]
diff --git a/media/filters/audio_decoder_unittest.cc b/media/filters/audio_decoder_unittest.cc index 7d95ed0..daaca23 100644 --- a/media/filters/audio_decoder_unittest.cc +++ b/media/filters/audio_decoder_unittest.cc
@@ -11,7 +11,6 @@ #include "base/bind_helpers.h" #include "base/containers/circular_deque.h" #include "base/format_macros.h" -#include "base/hash/md5.h" #include "base/macros.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" @@ -33,6 +32,7 @@ #include "media/filters/in_memory_url_protocol.h" #include "media/media_buildflags.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/boringssl/src/include/openssl/md5.h" #if defined(OS_ANDROID) #include "base/android/build_info.h" @@ -318,17 +318,17 @@ AudioBus::Create(buffer->channel_count(), buffer->frame_count()); buffer->ReadFrames(buffer->frame_count(), 0, 0, output.get()); - base::MD5Context context; - base::MD5Init(&context); + MD5_CTX context; + MD5_Init(&context); for (int ch = 0; ch < output->channels(); ++ch) { - base::MD5Update( - &context, - base::StringPiece(reinterpret_cast<char*>(output->channel(ch)), - output->frames() * sizeof(*output->channel(ch)))); + MD5_Update(&context, reinterpret_cast<char*>(output->channel(ch)), + output->frames() * sizeof(*output->channel(ch))); } - base::MD5Digest digest; - base::MD5Final(&digest, &context); - return base::MD5DigestToBase16(digest); + + uint8_t digest[MD5_DIGEST_LENGTH]; + MD5_Final(digest, &context); + + return base::HexEncode(digest, MD5_DIGEST_LENGTH); } // Android MediaCodec returns wrong timestamps (shifted one frame forward)
diff --git a/media/filters/audio_file_reader_unittest.cc b/media/filters/audio_file_reader_unittest.cc index 11b1931..766b6fa6 100644 --- a/media/filters/audio_file_reader_unittest.cc +++ b/media/filters/audio_file_reader_unittest.cc
@@ -5,10 +5,11 @@ #include "media/filters/audio_file_reader.h" #include <memory> +#include <string> -#include "base/hash/md5.h" #include "base/logging.h" #include "base/macros.h" +#include "base/strings/string_number_conversions.h" #include "build/build_config.h" #include "media/base/audio_bus.h" #include "media/base/audio_hash.h" @@ -18,6 +19,7 @@ #include "media/filters/in_memory_url_protocol.h" #include "media/media_buildflags.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/boringssl/src/include/openssl/md5.h" namespace media { @@ -71,8 +73,11 @@ // On the first pass save the MD5 hash of each packet, on subsequent // passes ensure it matches. - const std::string md5_hash = base::MD5String(base::StringPiece( - reinterpret_cast<char*>(packet.data), packet.size)); + uint8_t digest[MD5_DIGEST_LENGTH]; + MD5(packet.data, packet.size, digest); + const std::string md5_hash = + base::HexEncode(packet.data, MD5_DIGEST_LENGTH); + if (i == 0) { packet_md5_hashes_.push_back(md5_hash); if (j == 0) {
diff --git a/media/gpu/image_processor_test.cc b/media/gpu/image_processor_test.cc index e0d15935..fd9735ae 100644 --- a/media/gpu/image_processor_test.cc +++ b/media/gpu/image_processor_test.cc
@@ -5,9 +5,9 @@ #include <memory> #include <string> #include <tuple> +#include <utility> #include "base/files/file_path.h" -#include "base/hash/md5.h" #include "base/test/launcher/unit_test_launcher.h" #include "base/test/test_suite.h" #include "build/build_config.h"
diff --git a/media/gpu/test/image.cc b/media/gpu/test/image.cc index 3a8de93e..185bba8c 100644 --- a/media/gpu/test/image.cc +++ b/media/gpu/test/image.cc
@@ -7,10 +7,12 @@ #include <memory> #include "base/files/file_util.h" -#include "base/hash/md5.h" #include "base/json/json_reader.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "base/values.h" #include "media/base/test_data_util.h" +#include "third_party/boringssl/src/include/openssl/md5.h" #define VLOGF(level) VLOG(level) << __func__ << "(): " @@ -75,9 +77,12 @@ } // Verify that the image's checksum matches the checksum in the metadata. - base::MD5Digest digest; - base::MD5Sum(mapped_file_.data(), mapped_file_.length(), &digest); - if (base::MD5DigestToBase16(digest) != checksum_) { + uint8_t digest[MD5_DIGEST_LENGTH]; + MD5(mapped_file_.data(), mapped_file_.length(), digest); + const std::string md5_hash = + base::ToLowerASCII(base::HexEncode(digest, MD5_DIGEST_LENGTH)); + + if (md5_hash != checksum_) { LOG(ERROR) << "Image checksum not matching metadata"; return false; }
diff --git a/media/gpu/test/video_frame_validator.cc b/media/gpu/test/video_frame_validator.cc index 5a0f096..05232ac 100644 --- a/media/gpu/test/video_frame_validator.cc +++ b/media/gpu/test/video_frame_validator.cc
@@ -6,15 +6,16 @@ #include "base/bind.h" #include "base/files/file.h" -#include "base/hash/md5.h" #include "base/memory/ptr_util.h" #include "base/numerics/safe_conversions.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "media/base/video_frame.h" #include "media/gpu/test/video_decode_accelerator_unittest_helpers.h" #include "media/gpu/video_frame_mapper.h" #include "media/gpu/video_frame_mapper_factory.h" +#include "third_party/boringssl/src/include/openssl/md5.h" namespace media { namespace test { @@ -154,12 +155,12 @@ std::string VideoFrameValidator::ComputeMD5FromVideoFrame( const VideoFrame* video_frame) const { DCHECK_CALLED_ON_VALID_SEQUENCE(validator_thread_sequence_checker_); - base::MD5Context context; - base::MD5Init(&context); + MD5_CTX context; + MD5_Init(&context); VideoFrame::HashFrameForTesting(&context, *video_frame); - base::MD5Digest digest; - base::MD5Final(&digest, &context); - return MD5DigestToBase16(digest); + uint8_t digest[MD5_DIGEST_LENGTH]; + MD5_Final(digest, &context); + return base::ToLowerASCII(base::HexEncode(digest, MD5_DIGEST_LENGTH)); } } // namespace test
diff --git a/media/gpu/test/video_player/frame_renderer_thumbnail.cc b/media/gpu/test/video_player/frame_renderer_thumbnail.cc index 6732072..ce45256 100644 --- a/media/gpu/test/video_player/frame_renderer_thumbnail.cc +++ b/media/gpu/test/video_player/frame_renderer_thumbnail.cc
@@ -8,6 +8,7 @@ #include "base/files/file_util.h" #include "base/memory/ptr_util.h" +#include "base/strings/string_number_conversions.h" #include "build/build_config.h" #include "media/base/bind_to_current_loop.h" #include "media/gpu/test/rendering_helper.h" @@ -229,8 +230,10 @@ << "RGBA frame has incorrect alpha"; // Calculate the thumbnail's checksum and compare it to golden values. - std::string md5_string = base::MD5String( - base::StringPiece(reinterpret_cast<char*>(&rgb[0]), rgb.size())); + uint8_t digest[MD5_DIGEST_LENGTH]; + MD5(reinterpret_cast<uint8_t*>(&rgb[0]), rgb.size(), digest); + std::string md5_string = + base::ToLowerASCII(base::HexEncode(digest, MD5_DIGEST_LENGTH)); bool is_valid_thumbnail = base::ContainsValue(thumbnail_checksums_, md5_string);
diff --git a/media/gpu/v4l2/BUILD.gn b/media/gpu/v4l2/BUILD.gn index 25b5c0d..9e2ab16f 100644 --- a/media/gpu/v4l2/BUILD.gn +++ b/media/gpu/v4l2/BUILD.gn
@@ -93,6 +93,7 @@ deps = [ ":v4l2", "//testing/gtest", + "//third_party/boringssl", "//ui/gfx:test_support", "//ui/gl", ]
diff --git a/media/gpu/vaapi/BUILD.gn b/media/gpu/vaapi/BUILD.gn index 36c50c8..1c61e63 100644 --- a/media/gpu/vaapi/BUILD.gn +++ b/media/gpu/vaapi/BUILD.gn
@@ -132,6 +132,7 @@ "//mojo/core/embedder", "//testing/gmock", "//testing/gtest", + "//third_party/boringssl", "//ui/gfx:test_support", "//ui/gfx/geometry", ]
diff --git a/media/gpu/video_decode_accelerator_unittest.cc b/media/gpu/video_decode_accelerator_unittest.cc index 56b88d3..3223fb5 100644 --- a/media/gpu/video_decode_accelerator_unittest.cc +++ b/media/gpu/video_decode_accelerator_unittest.cc
@@ -34,7 +34,6 @@ #include "base/files/file.h" #include "base/files/file_util.h" #include "base/format_macros.h" -#include "base/hash/md5.h" #include "base/location.h" #include "base/macros.h" #include "base/message_loop/message_loop.h" @@ -44,6 +43,7 @@ #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" +#include "base/strings/string_util.h" #include "base/strings/stringize_macros.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" @@ -73,6 +73,7 @@ #include "media/video/h264_parser.h" #include "mojo/core/embedder/embedder.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/boringssl/src/include/openssl/md5.h" #include "ui/gfx/codec/png_codec.h" #include "ui/gl/gl_image.h" @@ -1398,8 +1399,11 @@ EXPECT_EQ(media::test::ConvertRGBAToRGB(rgba, &rgb), true) << "RGBA frame had incorrect alpha"; - std::string md5_string = base::MD5String( - base::StringPiece(reinterpret_cast<char*>(&rgb[0]), rgb.size())); + uint8_t digest[MD5_DIGEST_LENGTH]; + MD5(reinterpret_cast<uint8_t*>(&rgb[0]), rgb.size(), digest); + std::string md5_string = + base::ToLowerASCII(base::HexEncode(digest, MD5_DIGEST_LENGTH)); + base::FilePath filepath(test_video_files_[0]->file_name); auto golden_md5s = media::test::ReadGoldenThumbnailMD5s( filepath.AddExtension(FILE_PATH_LITERAL(".md5")));
diff --git a/media/test/pipeline_integration_test_base.cc b/media/test/pipeline_integration_test_base.cc index 90f4ac1..6b8736d 100644 --- a/media/test/pipeline_integration_test_base.cc +++ b/media/test/pipeline_integration_test_base.cc
@@ -5,13 +5,18 @@ #include "media/test/pipeline_integration_test_base.h" #include <memory> +#include <set> +#include <string> #include <utility> +#include <vector> #include "base/bind.h" #include "base/callback.h" #include "base/memory/ref_counted.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "base/time/time.h" #include "media/base/media_log.h" #include "media/base/media_switches.h" @@ -24,6 +29,7 @@ #include "media/renderers/renderer_impl.h" #include "media/test/fake_encrypted_media.h" #include "media/test/test_media_source.h" +#include "third_party/boringssl/src/include/openssl/md5.h" #include "third_party/libaom/libaom_buildflags.h" #if BUILDFLAG(ENABLE_LIBAOM_DECODER) @@ -561,14 +567,14 @@ void PipelineIntegrationTestBase::ResetVideoHash() { DVLOG(1) << __func__; - base::MD5Init(&md5_context_); + MD5_Init(&md5_context_); } std::string PipelineIntegrationTestBase::GetVideoHash() { DCHECK(hashing_enabled_); - base::MD5Digest digest; - base::MD5Final(&digest, &md5_context_); - return base::MD5DigestToBase16(digest); + uint8_t digest[MD5_DIGEST_LENGTH]; + MD5_Final(digest, &md5_context_); + return base::ToLowerASCII(base::HexEncode(digest, MD5_DIGEST_LENGTH)); } std::string PipelineIntegrationTestBase::GetAudioHash() {
diff --git a/media/test/pipeline_integration_test_base.h b/media/test/pipeline_integration_test_base.h index d84a4d79..702010fe 100644 --- a/media/test/pipeline_integration_test_base.h +++ b/media/test/pipeline_integration_test_base.h
@@ -7,9 +7,11 @@ #include <stdint.h> #include <memory> +#include <string> +#include <utility> +#include <vector> #include "base/callback_forward.h" -#include "base/hash/md5.h" #include "base/run_loop.h" #include "base/test/scoped_feature_list.h" #include "base/test/scoped_task_environment.h" @@ -26,6 +28,7 @@ #include "media/renderers/audio_renderer_impl.h" #include "media/renderers/video_renderer_impl.h" #include "testing/gmock/include/gmock/gmock.h" +#include "third_party/boringssl/src/include/openssl/md5.h" using ::testing::NiceMock; @@ -153,7 +156,7 @@ protected: NiceMock<MockMediaLog> media_log_; base::test::ScopedTaskEnvironment scoped_task_environment_; - base::MD5Context md5_context_; + MD5_CTX md5_context_; bool hashing_enabled_; bool clockless_playback_; bool webaudio_attached_;
diff --git a/mojo/public/cpp/bindings/associated_binding.h b/mojo/public/cpp/bindings/associated_binding.h index 023e609..38ae6cc 100644 --- a/mojo/public/cpp/bindings/associated_binding.h +++ b/mojo/public/cpp/bindings/associated_binding.h
@@ -74,7 +74,8 @@ std::unique_ptr<MessageReceiver> payload_validator, bool expect_sync_requests, scoped_refptr<base::SequencedTaskRunner> runner, - uint32_t interface_version); + uint32_t interface_version, + const char* interface_name); std::unique_ptr<InterfaceEndpointClient> endpoint_client_; }; @@ -118,8 +119,8 @@ scoped_refptr<base::SequencedTaskRunner> runner = nullptr) { BindImpl(request.PassHandle(), &stub_, base::WrapUnique(new typename Interface::RequestValidator_()), - Interface::HasSyncMethods_, std::move(runner), - Interface::Version_); + Interface::HasSyncMethods_, std::move(runner), Interface::Version_, + Interface::Name_); } // Unbinds and returns the associated interface request so it can be
diff --git a/mojo/public/cpp/bindings/interface_endpoint_client.h b/mojo/public/cpp/bindings/interface_endpoint_client.h index 0d24ae2..48ba964 100644 --- a/mojo/public/cpp/bindings/interface_endpoint_client.h +++ b/mojo/public/cpp/bindings/interface_endpoint_client.h
@@ -48,7 +48,8 @@ std::unique_ptr<MessageReceiver> payload_validator, bool expect_sync_requests, scoped_refptr<base::SequencedTaskRunner> runner, - uint32_t interface_version); + uint32_t interface_version, + const char* interface_name); ~InterfaceEndpointClient() override; // Sets the error handler to receive notifications when an error is @@ -116,6 +117,8 @@ void FlushForTesting(); void FlushAsyncForTesting(base::OnceClosure callback); + const char* interface_name() const { return interface_name_; } + #if DCHECK_IS_ON() void SetNextCallLocation(const base::Location& location) { next_call_location_ = location; @@ -190,6 +193,7 @@ internal::ControlMessageProxy control_message_proxy_; internal::ControlMessageHandler control_message_handler_; + const char* interface_name_; #if DCHECK_IS_ON() // The code location of the the most recent call into a method on this
diff --git a/mojo/public/cpp/bindings/lib/associated_binding.cc b/mojo/public/cpp/bindings/lib/associated_binding.cc index f6dda57..acdaf0f 100644 --- a/mojo/public/cpp/bindings/lib/associated_binding.cc +++ b/mojo/public/cpp/bindings/lib/associated_binding.cc
@@ -52,7 +52,8 @@ std::unique_ptr<MessageReceiver> payload_validator, bool expect_sync_requests, scoped_refptr<base::SequencedTaskRunner> runner, - uint32_t interface_version) { + uint32_t interface_version, + const char* interface_name) { if (!handle.is_valid()) { endpoint_client_.reset(); return; @@ -62,7 +63,7 @@ std::move(handle), receiver, std::move(payload_validator), expect_sync_requests, internal::GetTaskRunnerToUseFromUserProvidedTaskRunner(std::move(runner)), - interface_version)); + interface_version, interface_name)); } } // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.cc b/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.cc index dd3a251..fa8c7d0 100644 --- a/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.cc +++ b/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.cc
@@ -58,7 +58,8 @@ ScopedInterfaceEndpointHandle handle, uint32_t version, std::unique_ptr<MessageReceiver> validator, - scoped_refptr<base::SequencedTaskRunner> runner) { + scoped_refptr<base::SequencedTaskRunner> runner, + const char* interface_name) { DCHECK(!endpoint_client_); DCHECK_EQ(0u, version_); DCHECK(handle.is_valid()); @@ -68,7 +69,8 @@ // will not be used. endpoint_client_ = std::make_unique<InterfaceEndpointClient>( std::move(handle), nullptr, std::move(validator), false, - GetTaskRunnerToUseFromUserProvidedTaskRunner(std::move(runner)), 0u); + GetTaskRunnerToUseFromUserProvidedTaskRunner(std::move(runner)), 0u, + interface_name); } ScopedInterfaceEndpointHandle AssociatedInterfacePtrStateBase::PassHandle() {
diff --git a/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h b/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h index c006e1bf..cf38944 100644 --- a/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h +++ b/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h
@@ -81,7 +81,8 @@ void Bind(ScopedInterfaceEndpointHandle handle, uint32_t version, std::unique_ptr<MessageReceiver> validator, - scoped_refptr<base::SequencedTaskRunner> runner); + scoped_refptr<base::SequencedTaskRunner> runner, + const char* interface_name); ScopedInterfaceEndpointHandle PassHandle(); InterfaceEndpointClient* endpoint_client() { return endpoint_client_.get(); } @@ -118,7 +119,7 @@ AssociatedInterfacePtrStateBase::Bind( info.PassHandle(), info.version(), std::make_unique<typename Interface::ResponseValidator_>(), - std::move(runner)); + std::move(runner), Interface::Name_); proxy_.reset(new Proxy(endpoint_client())); }
diff --git a/mojo/public/cpp/bindings/lib/binding_state.cc b/mojo/public/cpp/bindings/lib/binding_state.cc index edd5f1e..87560a1 100644 --- a/mojo/public/cpp/bindings/lib/binding_state.cc +++ b/mojo/public/cpp/bindings/lib/binding_state.cc
@@ -117,7 +117,7 @@ endpoint_client_.reset(new InterfaceEndpointClient( router_->CreateLocalEndpointHandle(kMasterInterfaceId), stub, std::move(request_validator), has_sync_methods, - std::move(sequenced_runner), interface_version)); + std::move(sequenced_runner), interface_version, interface_name)); #if BUILDFLAG(MOJO_RANDOM_DELAYS_ENABLED) MakeBindingRandomlyPaused(base::SequencedTaskRunnerHandle::Get(),
diff --git a/mojo/public/cpp/bindings/lib/control_message_proxy.cc b/mojo/public/cpp/bindings/lib/control_message_proxy.cc index aeb5026..c48261a 100644 --- a/mojo/public/cpp/bindings/lib/control_message_proxy.cc +++ b/mojo/public/cpp/bindings/lib/control_message_proxy.cc
@@ -23,6 +23,8 @@ namespace { +const char kMessageTag[] = "ControlMessageProxy"; + bool ValidateControlResponse(Message* message) { ValidationContext validation_context(message->payload(), message->payload_num_bytes(), 0, 0, @@ -77,6 +79,7 @@ params_ptr->input = std::move(input_ptr); Message message(interface_control::kRunMessageId, Message::kFlagExpectsResponse, 0, 0, nullptr); + message.set_heap_profiler_tag(kMessageTag); SerializationContext context; interface_control::internal::RunMessageParams_Data::BufferWriter params; Serialize<interface_control::RunMessageParamsDataView>( @@ -92,6 +95,7 @@ params_ptr->input = std::move(input_ptr); Message message(interface_control::kRunOrClosePipeMessageId, 0, 0, 0, nullptr); + message.set_heap_profiler_tag(kMessageTag); SerializationContext context; interface_control::internal::RunOrClosePipeMessageParams_Data::BufferWriter params; @@ -104,6 +108,7 @@ MessageReceiverWithResponder* receiver, interface_control::RunOrClosePipeInputPtr input_ptr) { Message message(ConstructRunOrClosePipeMessage(std::move(input_ptr))); + message.set_heap_profiler_tag(kMessageTag); ignore_result(receiver->Accept(&message)); }
diff --git a/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc b/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc index f9318db..51e4171f 100644 --- a/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc +++ b/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc
@@ -141,7 +141,8 @@ std::unique_ptr<MessageReceiver> payload_validator, bool expect_sync_requests, scoped_refptr<base::SequencedTaskRunner> runner, - uint32_t interface_version) + uint32_t interface_version, + const char* interface_name) : expect_sync_requests_(expect_sync_requests), handle_(std::move(handle)), incoming_receiver_(receiver), @@ -150,6 +151,7 @@ task_runner_(std::move(runner)), control_message_proxy_(this), control_message_handler_(interface_version), + interface_name_(interface_name), weak_ptr_factory_(this) { DCHECK(handle_.is_valid()); @@ -244,6 +246,7 @@ // message before calling |SendMessage()| below. #endif + message->set_heap_profiler_tag(interface_name_); return controller_->SendMessage(message); } @@ -269,6 +272,7 @@ request_id = next_request_id_++; message->set_request_id(request_id); + message->set_heap_profiler_tag(interface_name_); #if DCHECK_IS_ON() // TODO(https://crbug.com/695289): Send |next_call_location_| in a control
diff --git a/mojo/public/cpp/bindings/lib/interface_ptr_state.cc b/mojo/public/cpp/bindings/lib/interface_ptr_state.cc index 9bd0dd9..9ac8911c 100644 --- a/mojo/public/cpp/bindings/lib/interface_ptr_state.cc +++ b/mojo/public/cpp/bindings/lib/interface_ptr_state.cc
@@ -69,7 +69,8 @@ bool InterfacePtrStateBase::InitializeEndpointClient( bool passes_associated_kinds, bool has_sync_methods, - std::unique_ptr<MessageReceiver> payload_validator) { + std::unique_ptr<MessageReceiver> payload_validator, + const char* interface_name) { // The object hasn't been bound. if (!handle_.is_valid()) return false; @@ -87,7 +88,7 @@ std::move(payload_validator), false, std::move(runner_), // The version is only queried from the client so the value passed here // will not be used. - 0u)); + 0u, interface_name)); return true; }
diff --git a/mojo/public/cpp/bindings/lib/interface_ptr_state.h b/mojo/public/cpp/bindings/lib/interface_ptr_state.h index 9ed2102..03000df 100644 --- a/mojo/public/cpp/bindings/lib/interface_ptr_state.h +++ b/mojo/public/cpp/bindings/lib/interface_ptr_state.h
@@ -87,7 +87,8 @@ bool InitializeEndpointClient( bool passes_associated_kinds, bool has_sync_methods, - std::unique_ptr<MessageReceiver> payload_validator); + std::unique_ptr<MessageReceiver> payload_validator, + const char* interface_name); private: void OnQueryVersion(const base::Callback<void(uint32_t)>& callback, @@ -228,7 +229,8 @@ if (InitializeEndpointClient( Interface::PassesAssociatedKinds_, Interface::HasSyncMethods_, - std::make_unique<typename Interface::ResponseValidator_>())) { + std::make_unique<typename Interface::ResponseValidator_>(), + Interface::Name_)) { router()->SetMasterInterfaceName(Interface::Name_); proxy_ = std::make_unique<Proxy>(endpoint_client()); }
diff --git a/mojo/public/cpp/bindings/lib/message.cc b/mojo/public/cpp/bindings/lib/message.cc index fa28aa4..20556ac 100644 --- a/mojo/public/cpp/bindings/lib/message.cc +++ b/mojo/public/cpp/bindings/lib/message.cc
@@ -221,6 +221,7 @@ serialized_(other.serialized_) { other.transferable_ = false; other.serialized_ = false; + heap_profiler_tag_ = other.heap_profiler_tag_; #if defined(ENABLE_IPC_FUZZER) interface_name_ = other.interface_name_; method_name_ = other.method_name_; @@ -302,6 +303,7 @@ other.transferable_ = false; serialized_ = other.serialized_; other.serialized_ = false; + other.heap_profiler_tag_ = heap_profiler_tag_; #if defined(ENABLE_IPC_FUZZER) interface_name_ = other.interface_name_; method_name_ = other.method_name_; @@ -316,6 +318,7 @@ associated_endpoint_handles_.clear(); transferable_ = false; serialized_ = false; + heap_profiler_tag_ = nullptr; } const uint8_t* Message::payload() const {
diff --git a/mojo/public/cpp/bindings/lib/pipe_control_message_proxy.cc b/mojo/public/cpp/bindings/lib/pipe_control_message_proxy.cc index f218892..7a2f42f 100644 --- a/mojo/public/cpp/bindings/lib/pipe_control_message_proxy.cc +++ b/mojo/public/cpp/bindings/lib/pipe_control_message_proxy.cc
@@ -16,6 +16,8 @@ namespace mojo { namespace { +const char kMessageTag[] = "PipeControlMessageProxy"; + Message ConstructRunOrClosePipeMessage( pipe_control::RunOrClosePipeInputPtr input_ptr) { auto params_ptr = pipe_control::RunOrClosePipeMessageParams::New(); @@ -27,6 +29,7 @@ internal::Serialize<pipe_control::RunOrClosePipeMessageParamsDataView>( params_ptr, message.payload_buffer(), ¶ms, &context); message.set_interface_id(kInvalidInterfaceId); + message.set_heap_profiler_tag(kMessageTag); return message; } @@ -39,6 +42,7 @@ InterfaceId id, const base::Optional<DisconnectReason>& reason) { Message message(ConstructPeerEndpointClosedMessage(id, reason)); + message.set_heap_profiler_tag(kMessageTag); ignore_result(receiver_->Accept(&message)); }
diff --git a/mojo/public/cpp/bindings/message.h b/mojo/public/cpp/bindings/message.h index 791cb53b..4ff8a6b 100644 --- a/mojo/public/cpp/bindings/message.h +++ b/mojo/public/cpp/bindings/message.h
@@ -220,6 +220,11 @@ generic_context.release()->template SafeCast<MessageType>()); } + const char* heap_profiler_tag() const { return heap_profiler_tag_; } + void set_heap_profiler_tag(const char* heap_profiler_tag) { + heap_profiler_tag_ = heap_profiler_tag; + } + #if defined(ENABLE_IPC_FUZZER) const char* interface_name() const { return interface_name_; } void set_interface_name(const char* interface_name) { @@ -257,6 +262,7 @@ // Indicates whether this Message object is serialized. bool serialized_ = false; + const char* heap_profiler_tag_ = nullptr; #if defined(ENABLE_IPC_FUZZER) const char* interface_name_ = nullptr; const char* method_name_ = nullptr;
diff --git a/mojo/public/cpp/bindings/tests/bindings_perftest.cc b/mojo/public/cpp/bindings/tests/bindings_perftest.cc index 7f71ccc..fb79f87 100644 --- a/mojo/public/cpp/bindings/tests/bindings_perftest.cc +++ b/mojo/public/cpp/bindings/tests/bindings_perftest.cc
@@ -24,6 +24,8 @@ const double kMojoTicksPerSecond = 1000000.0; +const char kTestInterfaceName[] = "TestInterface"; + double MojoTicksToSeconds(MojoTimeTicks ticks) { return ticks / kMojoTicksPerSecond; } @@ -206,10 +208,10 @@ InterfaceEndpointClient client0( router0->CreateLocalEndpointHandle(kMasterInterfaceId), &paddle0, nullptr, - false, base::ThreadTaskRunnerHandle::Get(), 0u); + false, base::ThreadTaskRunnerHandle::Get(), 0u, kTestInterfaceName); InterfaceEndpointClient client1( router1->CreateLocalEndpointHandle(kMasterInterfaceId), &paddle1, nullptr, - false, base::ThreadTaskRunnerHandle::Get(), 0u); + false, base::ThreadTaskRunnerHandle::Get(), 0u, kTestInterfaceName); paddle0.set_sender(&client0); paddle1.set_sender(&client1); @@ -255,7 +257,7 @@ CounterReceiver receiver; InterfaceEndpointClient client( router->CreateLocalEndpointHandle(kMasterInterfaceId), &receiver, nullptr, - false, base::ThreadTaskRunnerHandle::Get(), 0u); + false, base::ThreadTaskRunnerHandle::Get(), 0u, kTestInterfaceName); static const uint32_t kIterations[] = {1000, 3000000};
diff --git a/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc b/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc index ff1c02d..883bdd3 100644 --- a/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc +++ b/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc
@@ -23,6 +23,8 @@ namespace test { namespace { +const char kTestInterfaceName[] = "TestInterface"; + using mojo::internal::MultiplexRouter; class MultiplexRouterTest : public testing::Test { @@ -63,13 +65,13 @@ }; TEST_F(MultiplexRouterTest, BasicRequestResponse) { - InterfaceEndpointClient client0(std::move(endpoint0_), nullptr, - std::make_unique<PassThroughFilter>(), false, - base::ThreadTaskRunnerHandle::Get(), 0u); + InterfaceEndpointClient client0( + std::move(endpoint0_), nullptr, std::make_unique<PassThroughFilter>(), + false, base::ThreadTaskRunnerHandle::Get(), 0u, kTestInterfaceName); ResponseGenerator generator; - InterfaceEndpointClient client1(std::move(endpoint1_), &generator, - std::make_unique<PassThroughFilter>(), false, - base::ThreadTaskRunnerHandle::Get(), 0u); + InterfaceEndpointClient client1( + std::move(endpoint1_), &generator, std::make_unique<PassThroughFilter>(), + false, base::ThreadTaskRunnerHandle::Get(), 0u, kTestInterfaceName); Message request; AllocRequestMessage(1, "hello", &request); @@ -110,13 +112,13 @@ } TEST_F(MultiplexRouterTest, BasicRequestResponse_Synchronous) { - InterfaceEndpointClient client0(std::move(endpoint0_), nullptr, - std::make_unique<PassThroughFilter>(), false, - base::ThreadTaskRunnerHandle::Get(), 0u); + InterfaceEndpointClient client0( + std::move(endpoint0_), nullptr, std::make_unique<PassThroughFilter>(), + false, base::ThreadTaskRunnerHandle::Get(), 0u, kTestInterfaceName); ResponseGenerator generator; - InterfaceEndpointClient client1(std::move(endpoint1_), &generator, - std::make_unique<PassThroughFilter>(), false, - base::ThreadTaskRunnerHandle::Get(), 0u); + InterfaceEndpointClient client1( + std::move(endpoint1_), &generator, std::make_unique<PassThroughFilter>(), + false, base::ThreadTaskRunnerHandle::Get(), 0u, kTestInterfaceName); Message request; AllocRequestMessage(1, "hello", &request); @@ -159,13 +161,13 @@ TEST_F(MultiplexRouterTest, LazyResponses) { InterfaceEndpointClient client0( std::move(endpoint0_), nullptr, base::WrapUnique(new PassThroughFilter()), - false, base::ThreadTaskRunnerHandle::Get(), 0u); + false, base::ThreadTaskRunnerHandle::Get(), 0u, kTestInterfaceName); base::RunLoop run_loop; LazyResponseGenerator generator(run_loop.QuitClosure()); InterfaceEndpointClient client1(std::move(endpoint1_), &generator, base::WrapUnique(new PassThroughFilter()), false, base::ThreadTaskRunnerHandle::Get(), - 0u); + 0u, kTestInterfaceName); Message request; AllocRequestMessage(1, "hello", &request); @@ -231,7 +233,7 @@ base::RunLoop run_loop0, run_loop1; InterfaceEndpointClient client0( std::move(endpoint0_), nullptr, base::WrapUnique(new PassThroughFilter()), - false, base::ThreadTaskRunnerHandle::Get(), 0u); + false, base::ThreadTaskRunnerHandle::Get(), 0u, kTestInterfaceName); bool error_handler_called0 = false; client0.set_connection_error_handler( base::Bind(&ForwardErrorHandler, &error_handler_called0, @@ -242,7 +244,7 @@ InterfaceEndpointClient client1(std::move(endpoint1_), &generator, base::WrapUnique(new PassThroughFilter()), false, base::ThreadTaskRunnerHandle::Get(), - 0u); + 0u, kTestInterfaceName); bool error_handler_called1 = false; client1.set_connection_error_handler( base::Bind(&ForwardErrorHandler, &error_handler_called1, @@ -290,11 +292,11 @@ { InterfaceEndpointClient client0( std::move(endpoint0_), nullptr, std::make_unique<PassThroughFilter>(), - false, base::ThreadTaskRunnerHandle::Get(), 0u); + false, base::ThreadTaskRunnerHandle::Get(), 0u, kTestInterfaceName); InterfaceEndpointClient client1(std::move(endpoint1_), &generator, std::make_unique<PassThroughFilter>(), false, base::ThreadTaskRunnerHandle::Get(), - 0u); + 0u, kTestInterfaceName); Message request; AllocRequestMessage(1, "hello", &request);
diff --git a/net/BUILD.gn b/net/BUILD.gn index d76f076..9db44f0 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -831,8 +831,6 @@ "http/partial_data.h", "http/proxy_client_socket.cc", "http/proxy_client_socket.h", - "http/proxy_connect_redirect_http_stream.cc", - "http/proxy_connect_redirect_http_stream.h", "http/proxy_fallback.cc", "http/proxy_fallback.h", "http/transport_security_persister.cc", @@ -2123,8 +2121,7 @@ "ftp/ftp_request_info.h", "ftp/ftp_response_info.cc", "ftp/ftp_response_info.h", - "ftp/ftp_server_type_histograms.cc", - "ftp/ftp_server_type_histograms.h", + "ftp/ftp_server_type.h", "ftp/ftp_transaction.h", "ftp/ftp_transaction_factory.h", "ftp/ftp_util.cc",
diff --git a/net/dns/address_sorter_posix_unittest.cc b/net/dns/address_sorter_posix_unittest.cc index 698cbe9..9597a80 100644 --- a/net/dns/address_sorter_posix_unittest.cc +++ b/net/dns/address_sorter_posix_unittest.cc
@@ -176,7 +176,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) override { NOTIMPLEMENTED(); return nullptr;
diff --git a/net/dns/dns_session_unittest.cc b/net/dns/dns_session_unittest.cc index 8afa5b7..a3bc61d 100644 --- a/net/dns/dns_session_unittest.cc +++ b/net/dns/dns_session_unittest.cc
@@ -63,7 +63,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) override { NOTIMPLEMENTED(); return nullptr;
diff --git a/net/ftp/ftp_directory_listing_parser.cc b/net/ftp/ftp_directory_listing_parser.cc index 5532318..290e50f 100644 --- a/net/ftp/ftp_directory_listing_parser.cc +++ b/net/ftp/ftp_directory_listing_parser.cc
@@ -9,14 +9,14 @@ #include "base/i18n/encoding_detection.h" #include "base/i18n/icu_string_conversions.h" #include "base/stl_util.h" -#include "base/strings/string_util.h" #include "base/strings/string_split.h" +#include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "net/base/net_errors.h" #include "net/ftp/ftp_directory_listing_parser_ls.h" #include "net/ftp/ftp_directory_listing_parser_vms.h" #include "net/ftp/ftp_directory_listing_parser_windows.h" -#include "net/ftp/ftp_server_type_histograms.h" +#include "net/ftp/ftp_server_type.h" namespace net { @@ -121,7 +121,6 @@ std::vector<FtpDirectoryListingEntry>* entries) { FtpServerType server_type = SERVER_UNKNOWN; int rv = DecodeAndParse(text, current_time, entries, &server_type); - UpdateFtpServerTypeHistograms(server_type); return rv; }
diff --git a/net/ftp/ftp_network_transaction.cc b/net/ftp/ftp_network_transaction.cc index 8f4a8622..c2cdd05 100644 --- a/net/ftp/ftp_network_transaction.cc +++ b/net/ftp/ftp_network_transaction.cc
@@ -1251,10 +1251,6 @@ return OK; } - // Only record the connection error after we've applied all our fallbacks. - // We want to capture the final error, one we're not going to recover from. - RecordDataConnectionError(result); - if (result != OK) return Stop(result); @@ -1292,92 +1288,4 @@ return result; } -// We're using a histogram as a group of counters, with one bucket for each -// enumeration value. We're only interested in the values of the counters. -// Ignore the shape, average, and standard deviation of the histograms because -// they are meaningless. -// -// We use two histograms. In the first histogram we tally whether the user has -// seen an error of that type during the session. In the second histogram we -// tally the total number of times the users sees each errer. -void FtpNetworkTransaction::RecordDataConnectionError(int result) { - // Gather data for http://crbug.com/3073. See how many users have trouble - // establishing FTP data connection in passive FTP mode. - enum { - // Data connection successful. - NET_ERROR_OK = 0, - - // Local firewall blocked the connection. - NET_ERROR_ACCESS_DENIED = 1, - - // Connection timed out. - NET_ERROR_TIMED_OUT = 2, - - // Connection has been estabilished, but then got broken (either reset - // or aborted). - NET_ERROR_CONNECTION_BROKEN = 3, - - // Connection has been refused. - NET_ERROR_CONNECTION_REFUSED = 4, - - // No connection to the internet. - NET_ERROR_INTERNET_DISCONNECTED = 5, - - // Could not reach the destination address. - NET_ERROR_ADDRESS_UNREACHABLE = 6, - - // A programming error in our network stack. - NET_ERROR_UNEXPECTED = 7, - - // Other kind of error. - NET_ERROR_OTHER = 20, - - NUM_OF_NET_ERROR_TYPES - } type; - switch (result) { - case OK: - type = NET_ERROR_OK; - break; - case ERR_ACCESS_DENIED: - case ERR_NETWORK_ACCESS_DENIED: - type = NET_ERROR_ACCESS_DENIED; - break; - case ERR_TIMED_OUT: - type = NET_ERROR_TIMED_OUT; - break; - case ERR_CONNECTION_ABORTED: - case ERR_CONNECTION_RESET: - case ERR_CONNECTION_CLOSED: - type = NET_ERROR_CONNECTION_BROKEN; - break; - case ERR_CONNECTION_FAILED: - case ERR_CONNECTION_REFUSED: - type = NET_ERROR_CONNECTION_REFUSED; - break; - case ERR_INTERNET_DISCONNECTED: - type = NET_ERROR_INTERNET_DISCONNECTED; - break; - case ERR_ADDRESS_INVALID: - case ERR_ADDRESS_UNREACHABLE: - type = NET_ERROR_ADDRESS_UNREACHABLE; - break; - case ERR_UNEXPECTED: - type = NET_ERROR_UNEXPECTED; - break; - default: - type = NET_ERROR_OTHER; - break; - } - static bool had_error_type[NUM_OF_NET_ERROR_TYPES]; - - DCHECK(type >= 0 && type < NUM_OF_NET_ERROR_TYPES); - if (!had_error_type[type]) { - had_error_type[type] = true; - UMA_HISTOGRAM_ENUMERATION("Net.FtpDataConnectionErrorHappened", - type, NUM_OF_NET_ERROR_TYPES); - } - UMA_HISTOGRAM_ENUMERATION("Net.FtpDataConnectionErrorCount", - type, NUM_OF_NET_ERROR_TYPES); -} - } // namespace net
diff --git a/net/ftp/ftp_network_transaction.h b/net/ftp/ftp_network_transaction.h index 5df92fa..cbcfdf7 100644 --- a/net/ftp/ftp_network_transaction.h +++ b/net/ftp/ftp_network_transaction.h
@@ -198,8 +198,6 @@ int DoDataRead(); int DoDataReadComplete(int result); - void RecordDataConnectionError(int result); - Command command_sent_; CompletionRepeatingCallback io_callback_;
diff --git a/net/ftp/ftp_server_type_histograms.h b/net/ftp/ftp_server_type.h similarity index 63% rename from net/ftp/ftp_server_type_histograms.h rename to net/ftp/ftp_server_type.h index 807845e..18b0595 100644 --- a/net/ftp/ftp_server_type_histograms.h +++ b/net/ftp/ftp_server_type.h
@@ -2,16 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef NET_FTP_FTP_SERVER_TYPE_HISTOGRAMS_H_ -#define NET_FTP_FTP_SERVER_TYPE_HISTOGRAMS_H_ - -// The UpdateFtpServerTypeHistograms function collects statistics related -// to the types of FTP servers that our users are encountering. +#ifndef NET_FTP_FTP_SERVER_TYPE_H_ +#define NET_FTP_FTP_SERVER_TYPE_H_ namespace net { enum FtpServerType { - // Record cases in which we couldn't parse the server's response. That means + // Cases in which we couldn't parse the server's response. That means // a server type we don't recognize, a security attack (when what we're // connecting to isn't an FTP server), or a broken server. SERVER_UNKNOWN = 0, @@ -25,8 +22,6 @@ NUM_OF_SERVER_TYPES }; -void UpdateFtpServerTypeHistograms(FtpServerType type); - } // namespace net -#endif // NET_FTP_FTP_SERVER_TYPE_HISTOGRAMS_H_ +#endif // NET_FTP_FTP_SERVER_TYPE_H_
diff --git a/net/ftp/ftp_server_type_histograms.cc b/net/ftp/ftp_server_type_histograms.cc deleted file mode 100644 index 759ceaea..0000000 --- a/net/ftp/ftp_server_type_histograms.cc +++ /dev/null
@@ -1,33 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/ftp/ftp_server_type_histograms.h" - -#include "base/metrics/histogram_macros.h" - -namespace net { - -// We're using a histogram as a group of counters, with one bucket for each -// enumeration value. We're only interested in the values of the counters. -// Ignore the shape, average, and standard deviation of the histograms because -// they are meaningless. -// -// We use two histograms. In the first histogram we tally whether the user has -// seen an FTP server of a given type during that session. In the second -// histogram we tally the number of transactions with FTP server of a given type -// the user has made during that session. -void UpdateFtpServerTypeHistograms(FtpServerType type) { - static bool had_server_type[NUM_OF_SERVER_TYPES]; - if (type >= 0 && type < NUM_OF_SERVER_TYPES) { - if (!had_server_type[type]) { - had_server_type[type] = true; - UMA_HISTOGRAM_ENUMERATION("Net.HadFtpServerType2", - type, NUM_OF_SERVER_TYPES); - } - } - UMA_HISTOGRAM_ENUMERATION("Net.FtpServerTypeCount2", - type, NUM_OF_SERVER_TYPES); -} - -} // namespace net
diff --git a/net/http/bidirectional_stream.cc b/net/http/bidirectional_stream.cc index 27a9643..1279ef4 100644 --- a/net/http/bidirectional_stream.cc +++ b/net/http/bidirectional_stream.cc
@@ -421,16 +421,6 @@ StartRequest(ssl_config); } -void BidirectionalStream::OnHttpsProxyTunnelResponseRedirect( - const HttpResponseInfo& response_info, - const SSLConfig& used_ssl_config, - const ProxyInfo& used_proxy_info, - std::unique_ptr<HttpStream> stream) { - DCHECK(stream_request_); - - NotifyFailed(ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT); -} - void BidirectionalStream::OnQuicBroken() {} void BidirectionalStream::NotifyFailed(int error) {
diff --git a/net/http/bidirectional_stream.h b/net/http/bidirectional_stream.h index 6f7675f..d4f56f4b 100644 --- a/net/http/bidirectional_stream.h +++ b/net/http/bidirectional_stream.h
@@ -219,11 +219,6 @@ HttpAuthController* auth_controller) override; void OnNeedsClientAuth(const SSLConfig& used_ssl_config, SSLCertRequestInfo* cert_info) override; - void OnHttpsProxyTunnelResponseRedirect( - const HttpResponseInfo& response_info, - const SSLConfig& used_ssl_config, - const ProxyInfo& used_proxy_info, - std::unique_ptr<HttpStream> stream) override; void OnQuicBroken() override; // Helper method to notify delegate if there is an error.
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc index 0d726f3..535a858 100644 --- a/net/http/http_network_transaction.cc +++ b/net/http/http_network_transaction.cc
@@ -655,29 +655,6 @@ OnIOComplete(ERR_SSL_CLIENT_AUTH_CERT_NEEDED); } -void HttpNetworkTransaction::OnHttpsProxyTunnelResponseRedirect( - const HttpResponseInfo& response_info, - const SSLConfig& used_ssl_config, - const ProxyInfo& used_proxy_info, - std::unique_ptr<HttpStream> stream) { - DCHECK_EQ(STATE_CREATE_STREAM_COMPLETE, next_state_); - - CopyConnectionAttemptsFromStreamRequest(); - - headers_valid_ = true; - response_ = response_info; - server_ssl_config_ = used_ssl_config; - proxy_info_ = used_proxy_info; - if (stream_) { - total_received_bytes_ += stream_->GetTotalReceivedBytes(); - total_sent_bytes_ += stream_->GetTotalSentBytes(); - } - stream_ = std::move(stream); - stream_->SetRequestHeadersCallback(request_headers_callback_); - stream_request_.reset(); // we're done with the stream request - OnIOComplete(ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT); -} - void HttpNetworkTransaction::OnQuicBroken() { net_error_details_.quic_broken = true; } @@ -861,21 +838,12 @@ } int HttpNetworkTransaction::DoCreateStreamComplete(int result) { - // If |result| is ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT, then - // DoCreateStreamComplete is being called from - // OnHttpsProxyTunnelResponseRedirect, which resets the stream request first. - // Therefore, we have to grab the connection attempts in *that* function - // instead of here in that case. - if (result != ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT) - CopyConnectionAttemptsFromStreamRequest(); - + CopyConnectionAttemptsFromStreamRequest(); if (result == OK) { next_state_ = STATE_INIT_STREAM; DCHECK(stream_.get()); } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { result = HandleCertificateRequest(result); - } else if (result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT) { - return DoCreateStreamCompletedTunnelResponseRedirect(); } else if (result == ERR_HTTP_1_1_REQUIRED || result == ERR_PROXY_HTTP_1_1_REQUIRED) { return HandleHttp11Required(result); @@ -1949,32 +1917,4 @@ return result; } -static HttpNetworkTransaction::TunnelRedirectHistogramValue -GetTunnelRedirectHistogramValue(bool is_main_frame, bool was_auto_detected) { - if (!is_main_frame && !was_auto_detected) - return HttpNetworkTransaction::kSubresourceByExplicitProxy; - if (is_main_frame && !was_auto_detected) - return HttpNetworkTransaction::kMainFrameByExplicitProxy; - if (!is_main_frame && was_auto_detected) - return HttpNetworkTransaction::kSubresourceByAutoDetectedProxy; - return HttpNetworkTransaction::kMainFrameByAutoDetectedProxy; -} - -// TODO(https://crbug.com/928551): Support for redirect on CONNECT is -// deprecated. Should remove the ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT error -// code and supporting plumbing + histogram once this change sticks on Stable. -int HttpNetworkTransaction::DoCreateStreamCompletedTunnelResponseRedirect() { - bool is_main_frame = (request_->load_flags & LOAD_MAIN_FRAME_DEPRECATED) == - LOAD_MAIN_FRAME_DEPRECATED; - bool was_auto_detected = proxy_info_.did_use_auto_detected_pac_script(); - - UMA_HISTOGRAM_ENUMERATION( - "Net.Proxy.RedirectDuringConnect", - GetTunnelRedirectHistogramValue(is_main_frame, was_auto_detected)); - - // Fail the request. - stream_.reset(); - return ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT; -} - } // namespace net
diff --git a/net/http/http_network_transaction.h b/net/http/http_network_transaction.h index 089be0f..21a6c46 100644 --- a/net/http/http_network_transaction.h +++ b/net/http/http_network_transaction.h
@@ -49,16 +49,6 @@ : public HttpTransaction, public HttpStreamRequest::Delegate { public: - // Enumeration used by Net.Proxy.RedirectDuringConnect. Exposed here for - // sharing by unit-tests. - enum TunnelRedirectHistogramValue { - kSubresourceByExplicitProxy = 0, - kMainFrameByExplicitProxy = 1, - kSubresourceByAutoDetectedProxy = 2, - kMainFrameByAutoDetectedProxy = 3, - kMaxValue = kMainFrameByAutoDetectedProxy - }; - HttpNetworkTransaction(RequestPriority priority, HttpNetworkSession* session); @@ -127,11 +117,6 @@ HttpAuthController* auth_controller) override; void OnNeedsClientAuth(const SSLConfig& used_ssl_config, SSLCertRequestInfo* cert_info) override; - void OnHttpsProxyTunnelResponseRedirect( - const HttpResponseInfo& response_info, - const SSLConfig& used_ssl_config, - const ProxyInfo& used_proxy_info, - std::unique_ptr<HttpStream> stream) override; void OnQuicBroken() override; void GetConnectionAttempts(ConnectionAttempts* out) const override; @@ -319,10 +304,6 @@ // "Accept-Encoding". bool ContentEncodingsValid() const; - // Logic for handling ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT seen during - // DoCreateStreamCompletedTunnel(). - int DoCreateStreamCompletedTunnelResponseRedirect(); - scoped_refptr<HttpAuthController> auth_controllers_[HttpAuth::AUTH_NUM_TARGETS];
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index a966ab5..d21c871 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc
@@ -9591,7 +9591,7 @@ data.Resume(); rv = callback.WaitForResult(); - EXPECT_THAT(rv, IsError(ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT)); + EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); } // Test that an HTTPS Proxy cannot redirect a CONNECT request for subresources. @@ -9638,11 +9638,7 @@ EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); rv = callback.WaitForResult(); - EXPECT_THAT(rv, IsError(ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT)); - - histograms.ExpectUniqueSample( - "Net.Proxy.RedirectDuringConnect", - HttpNetworkTransaction::kSubresourceByExplicitProxy, 1); + EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); } // Test that an HTTPS Proxy which was auto-detected cannot redirect a CONNECT @@ -9691,11 +9687,7 @@ EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); rv = callback.WaitForResult(); - EXPECT_THAT(rv, IsError(ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT)); - - histograms.ExpectUniqueSample( - "Net.Proxy.RedirectDuringConnect", - HttpNetworkTransaction::kMainFrameByAutoDetectedProxy, 1); + EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); } // Tests that an HTTPS (SPDY) Proxy's cannot redirect a CONNECT request for main @@ -9768,11 +9760,7 @@ FastForwardBy(kTimeIncrement); data.Resume(); rv = callback.WaitForResult(); - EXPECT_THAT(rv, IsError(ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT)); - - histograms.ExpectUniqueSample( - "Net.Proxy.RedirectDuringConnect", - HttpNetworkTransaction::kMainFrameByExplicitProxy, 1); + EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); } // Test that an HTTPS proxy's response to a CONNECT request is filtered.
diff --git a/net/http/http_proxy_client_socket.cc b/net/http/http_proxy_client_socket.cc index a33223d..46ff678 100644 --- a/net/http/http_proxy_client_socket.cc +++ b/net/http/http_proxy_client_socket.cc
@@ -39,7 +39,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) : io_callback_(base::BindRepeating(&HttpProxyClientSocket::OnIOComplete, base::Unretained(this))), @@ -51,7 +50,6 @@ tunnel_(tunnel), using_spdy_(using_spdy), negotiated_protocol_(negotiated_protocol), - is_https_proxy_(is_https_proxy), proxy_server_(proxy_server), proxy_delegate_(proxy_delegate), traffic_annotation_(traffic_annotation), @@ -460,19 +458,6 @@ // client is expecting an SSL protected response. // See http://crbug.com/7338. - case 302: // Found / Moved Temporarily - // Attempt to follow redirects from HTTPS proxies, but only if we can - // sanitize the response. This still allows a rogue HTTPS proxy to - // redirect an HTTPS site load to a similar-looking site, but no longer - // allows it to impersonate the site the user requested. - if (!is_https_proxy_ || !SanitizeProxyRedirect(&response_)) - return ERR_TUNNEL_CONNECTION_FAILED; - - http_stream_parser_.reset(); - socket_.reset(); - is_reused_ = false; - return ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT; - case 407: // Proxy Authentication Required // We need this status code to allow proxy authentication. Our // authentication code is smart enough to avoid being tricked by an
diff --git a/net/http/http_proxy_client_socket.h b/net/http/http_proxy_client_socket.h index 4b5c071..457b6f0 100644 --- a/net/http/http_proxy_client_socket.h +++ b/net/http/http_proxy_client_socket.h
@@ -37,7 +37,7 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocket : public ProxyClientSocket { public: // Takes ownership of |socket|, which should already be connected by the time - // Connect() is called. |socket| is assumed to be a freash socket. If tunnel + // Connect() is called. |socket| is assumed to be a fresh socket. If tunnel // is true then on Connect() this socket will establish an Http tunnel. HttpProxyClientSocket(std::unique_ptr<StreamSocket> socket, const std::string& user_agent, @@ -48,7 +48,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation); // On destruction Disconnect() is called. @@ -160,8 +159,6 @@ const bool using_spdy_; // Protocol negotiated with the server. NextProto negotiated_protocol_; - // If true, then SSL is used to communicate with this proxy - const bool is_https_proxy_; std::string request_line_; HttpRequestHeaders request_headers_;
diff --git a/net/http/http_proxy_client_socket_fuzzer.cc b/net/http/http_proxy_client_socket_fuzzer.cc index cbe9090..57a50f6 100644 --- a/net/http/http_proxy_client_socket_fuzzer.cc +++ b/net/http/http_proxy_client_socket_fuzzer.cc
@@ -58,13 +58,12 @@ &auth_handler_factory, nullptr)); // Determine if the HttpProxyClientSocket should be told the underlying socket // is HTTPS. - bool is_https_proxy = data_provider.ConsumeBool(); net::HttpProxyClientSocket socket( std::move(fuzzed_socket), "Bond/007", net::HostPortPair("foo", 80), net::ProxyServer(net::ProxyServer::SCHEME_HTTP, net::HostPortPair("proxy", 42)), auth_controller.get(), true /* tunnel */, false /* using_spdy */, - net::kProtoUnknown, nullptr /* proxy_delegate */, is_https_proxy, + net::kProtoUnknown, nullptr /* proxy_delegate */, TRAFFIC_ANNOTATION_FOR_TESTS); int result = socket.Connect(callback.callback()); result = callback.GetResult(result);
diff --git a/net/http/http_proxy_client_socket_unittest.cc b/net/http/http_proxy_client_socket_unittest.cc index 226a671..9c5425c 100644 --- a/net/http/http_proxy_client_socket_unittest.cc +++ b/net/http/http_proxy_client_socket_unittest.cc
@@ -28,7 +28,7 @@ // pointer to it. HttpProxyClientSocket socket(std::unique_ptr<StreamSocket>(tagging_sock), "", HostPortPair(), ProxyServer(), nullptr, false, - false, NextProto(), nullptr, false, + false, NextProto(), nullptr, TRAFFIC_ANNOTATION_FOR_TESTS); EXPECT_EQ(tagging_sock->tag(), SocketTag());
diff --git a/net/http/http_proxy_connect_job.cc b/net/http/http_proxy_connect_job.cc index 42103498..2765dd2 100644 --- a/net/http/http_proxy_connect_job.cc +++ b/net/http/http_proxy_connect_job.cc
@@ -562,7 +562,7 @@ ProxyServer(GetProxyServerScheme(), GetDestination()), http_auth_controller_.get(), params_->tunnel(), using_spdy_, negotiated_protocol_, common_connect_job_params()->proxy_delegate, - params_->ssl_params() != nullptr, params_->traffic_annotation()); + params_->traffic_annotation()); nested_connect_job_.reset(); return transport_socket_->Connect(base::BindOnce( &HttpProxyConnectJob::OnIOComplete, base::Unretained(this))); @@ -789,7 +789,7 @@ } int HttpProxyConnectJob::HandleConnectResult(int result) { - if (result == OK || result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT) + if (result == OK) SetSocket(std::move(transport_socket_)); return result; }
diff --git a/net/http/http_proxy_connect_job_unittest.cc b/net/http/http_proxy_connect_job_unittest.cc index dc877737..46453a0 100644 --- a/net/http/http_proxy_connect_job_unittest.cc +++ b/net/http/http_proxy_connect_job_unittest.cc
@@ -1147,46 +1147,19 @@ Initialize(reads, writes, spdy_reads, spdy_writes, io_mode); - // Redirects in the HTTPS case return errors, but also return sockets. + // Redirects during CONNECT returns an error. TestConnectJobDelegate test_delegate( - GetParam() == HTTP - ? TestConnectJobDelegate::SocketExpected::ON_SUCCESS_ONLY - : TestConnectJobDelegate::SocketExpected::ALWAYS); + TestConnectJobDelegate::SocketExpected::ON_SUCCESS_ONLY); std::unique_ptr<ConnectJob> connect_job = CreateConnectJobForTunnel(&test_delegate); // H2 never completes synchronously. bool expect_sync_result = (io_mode == SYNCHRONOUS && GetParam() != SPDY); - if (GetParam() == HTTP) { - // We don't trust 302 responses to CONNECT from HTTP proxies. - test_delegate.StartJobExpectingResult( - connect_job.get(), ERR_TUNNEL_CONNECTION_FAILED, expect_sync_result); - EXPECT_FALSE(test_delegate.socket()); - } else { - // Expect ProxyClientSocket to return the proxy's response, sanitized. - test_delegate.StartJobExpectingResult( - connect_job.get(), ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT, - expect_sync_result); - ASSERT_TRUE(test_delegate.socket()); - - const ProxyClientSocket* tunnel_socket = - static_cast<ProxyClientSocket*>(test_delegate.socket()); - const HttpResponseInfo* response = - tunnel_socket->GetConnectResponseInfo(); - const HttpResponseHeaders* headers = response->headers.get(); - - // Make sure Set-Cookie header was stripped. - EXPECT_FALSE(headers->HasHeader("set-cookie")); - - // Make sure Content-Length: 0 header was added. - EXPECT_TRUE(headers->HasHeaderValue("content-length", "0")); - - // Make sure Location header was included and correct. - std::string location; - EXPECT_TRUE(headers->IsRedirect(&location)); - EXPECT_EQ(location, kRedirectTarget); - } + // We don't trust 302 responses to CONNECT from proxies. + test_delegate.StartJobExpectingResult( + connect_job.get(), ERR_TUNNEL_CONNECTION_FAILED, expect_sync_result); + EXPECT_FALSE(test_delegate.socket()); // Need to close the session to prevent reuse in the next loop iteration. session_->spdy_session_pool()->CloseAllSessions();
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc index 9a115ef9..62cb602f 100644 --- a/net/http/http_stream_factory_job.cc +++ b/net/http/http_stream_factory_job.cc
@@ -33,7 +33,6 @@ #include "net/http/http_request_info.h" #include "net/http/http_server_properties.h" #include "net/http/http_stream_factory.h" -#include "net/http/proxy_connect_redirect_http_stream.h" #include "net/http/proxy_fallback.h" #include "net/log/net_log.h" #include "net/log/net_log_capture_mode.h" @@ -484,17 +483,6 @@ // |this| may be deleted after this call. } -void HttpStreamFactory::Job::OnHttpsProxyTunnelResponseRedirectCallback( - const HttpResponseInfo& response_info, - std::unique_ptr<HttpStream> stream) { - DCHECK_NE(job_type_, PRECONNECT); - DCHECK(!spdy_session_request_); - - delegate_->OnHttpsProxyTunnelResponseRedirect( - this, response_info, server_ssl_config_, proxy_info_, std::move(stream)); - // |this| may be deleted after this call. -} - void HttpStreamFactory::Job::OnPreconnectsComplete() { delegate_->OnPreconnectsComplete(this); // |this| may be deleted after this call. @@ -563,32 +551,6 @@ base::RetainedRef(connection_->ssl_cert_request_info()))); return; - case ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT: { - DCHECK(connection_.get()); - DCHECK(establishing_tunnel_); - - LoadTimingInfo load_timing_info; - bool have_load_timing_info = connection_->GetLoadTimingInfo( - connection_->is_reused(), &load_timing_info); - - std::unique_ptr<StreamSocket> socket = - connection_->release_pending_http_proxy_socket(); - DCHECK(socket); - - connection_.reset(); - ProxyClientSocket* proxy_socket = - static_cast<ProxyClientSocket*>(socket.get()); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce( - &Job::OnHttpsProxyTunnelResponseRedirectCallback, - ptr_factory_.GetWeakPtr(), - *proxy_socket->GetConnectResponseInfo(), - std::make_unique<ProxyConnectRedirectHttpStream>( - have_load_timing_info ? &load_timing_info : nullptr))); - return; - } - case OK: next_state_ = STATE_DONE; if (is_websocket_) { @@ -1019,11 +981,6 @@ } } - if (result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT) { - DCHECK(!ssl_started); - return result; - } - if (proxy_info_.is_quic() && using_quic_ && result < 0) return ReconsiderProxyAfterError(result);
diff --git a/net/http/http_stream_factory_job.h b/net/http/http_stream_factory_job.h index 0ef29a71..b4cf717 100644 --- a/net/http/http_stream_factory_job.h +++ b/net/http/http_stream_factory_job.h
@@ -94,15 +94,6 @@ const SSLConfig& used_ssl_config, const SSLInfo& ssl_info) = 0; - // Invoked when |job| has a failure of the CONNECT request (due to a 302 - // redirect) through an HTTPS proxy. - virtual void OnHttpsProxyTunnelResponseRedirect( - Job* job, - const HttpResponseInfo& response_info, - const SSLConfig& used_ssl_config, - const ProxyInfo& used_proxy_info, - std::unique_ptr<HttpStream> stream) = 0; - // Invoked when |job| raises failure for SSL Client Auth. virtual void OnNeedsClientAuth(Job* job, const SSLConfig& used_ssl_config, @@ -286,9 +277,6 @@ HttpAuthController* auth_controller, base::OnceClosure restart_with_auth_callback); void OnNeedsClientAuthCallback(SSLCertRequestInfo* cert_info); - void OnHttpsProxyTunnelResponseRedirectCallback( - const HttpResponseInfo& response_info, - std::unique_ptr<HttpStream> stream); void OnPreconnectsComplete(); void OnIOComplete(int result);
diff --git a/net/http/http_stream_factory_job_controller.cc b/net/http/http_stream_factory_job_controller.cc index e1ce6fdd..de95183 100644 --- a/net/http/http_stream_factory_job_controller.cc +++ b/net/http/http_stream_factory_job_controller.cc
@@ -381,29 +381,6 @@ delegate_->OnCertificateError(status, used_ssl_config, ssl_info); } -void HttpStreamFactory::JobController::OnHttpsProxyTunnelResponseRedirect( - Job* job, - const HttpResponseInfo& response_info, - const SSLConfig& used_ssl_config, - const ProxyInfo& used_proxy_info, - std::unique_ptr<HttpStream> stream) { - MaybeResumeMainJob(job, base::TimeDelta()); - - if (IsJobOrphaned(job)) { - // We have bound a job to the associated HttpStreamRequest, |job| has been - // orphaned. - OnOrphanedJobComplete(job); - return; - } - - if (!bound_job_) - BindJob(job); - if (!request_) - return; - delegate_->OnHttpsProxyTunnelResponseRedirect( - response_info, used_ssl_config, used_proxy_info, std::move(stream)); -} - void HttpStreamFactory::JobController::OnNeedsClientAuth( Job* job, const SSLConfig& used_ssl_config,
diff --git a/net/http/http_stream_factory_job_controller.h b/net/http/http_stream_factory_job_controller.h index 7a28d51e..e549dd0 100644 --- a/net/http/http_stream_factory_job_controller.h +++ b/net/http/http_stream_factory_job_controller.h
@@ -109,15 +109,6 @@ const SSLConfig& used_ssl_config, const SSLInfo& ssl_info) override; - // Invoked when |job| has a failure of the CONNECT request (due to 302 - // redirect) through an HTTPS proxy. - void OnHttpsProxyTunnelResponseRedirect( - Job* job, - const HttpResponseInfo& response_info, - const SSLConfig& used_ssl_config, - const ProxyInfo& used_proxy_info, - std::unique_ptr<HttpStream> stream) override; - // Invoked when |job| raises failure for SSL Client Auth. void OnNeedsClientAuth(Job* job, const SSLConfig& used_ssl_config,
diff --git a/net/http/http_stream_factory_test_util.h b/net/http/http_stream_factory_test_util.h index 9b24ac23..5ce937a2 100644 --- a/net/http/http_stream_factory_test_util.h +++ b/net/http/http_stream_factory_test_util.h
@@ -93,13 +93,6 @@ void(const SSLConfig& used_ssl_config, SSLCertRequestInfo* cert_info)); - // std::unique_ptr is not copyable and therefore cannot be mocked. - void OnHttpsProxyTunnelResponseRedirect( - const HttpResponseInfo& response_info, - const SSLConfig& used_ssl_config, - const ProxyInfo& used_proxy_info, - std::unique_ptr<HttpStream> stream) override {} - MOCK_METHOD0(OnQuicBroken, void()); private:
diff --git a/net/http/http_stream_factory_unittest.cc b/net/http/http_stream_factory_unittest.cc index 9a4f9450..acad00de 100644 --- a/net/http/http_stream_factory_unittest.cc +++ b/net/http/http_stream_factory_unittest.cc
@@ -268,12 +268,6 @@ void OnNeedsClientAuth(const SSLConfig& used_ssl_config, SSLCertRequestInfo* cert_info) override {} - void OnHttpsProxyTunnelResponseRedirect( - const HttpResponseInfo& response_info, - const SSLConfig& used_ssl_config, - const ProxyInfo& used_proxy_info, - std::unique_ptr<HttpStream> stream) override {} - void OnQuicBroken() override {} void WaitForStream() {
diff --git a/net/http/http_stream_request.h b/net/http/http_stream_request.h index b85a28c..2b4edbb 100644 --- a/net/http/http_stream_request.h +++ b/net/http/http_stream_request.h
@@ -129,24 +129,6 @@ virtual void OnNeedsClientAuth(const SSLConfig& used_ssl_config, SSLCertRequestInfo* cert_info) = 0; - // This is the failure of the CONNECT request through an HTTPS proxy due to - // a 302 redirect. Headers can be read from |response_info|, while the body - // can be read from |stream|. - // - // |used_ssl_config| indicates the actual SSL configuration used for this - // stream, since the HttpStreamRequest may have modified the configuration - // during stream processing. - // - // |used_proxy_info| indicates the actual ProxyInfo used for this stream, - // since the HttpStreamRequest performs the proxy resolution. - // - // Ownership of |stream| is transferred to the delegate. - virtual void OnHttpsProxyTunnelResponseRedirect( - const HttpResponseInfo& response_info, - const SSLConfig& used_ssl_config, - const ProxyInfo& used_proxy_info, - std::unique_ptr<HttpStream> stream) = 0; - // Called when finding all QUIC alternative services are marked broken for // the origin in this request which advertises supporting QUIC. virtual void OnQuicBroken() = 0;
diff --git a/net/http/proxy_client_socket.cc b/net/http/proxy_client_socket.cc index c80ccee..135853e 100644 --- a/net/http/proxy_client_socket.cc +++ b/net/http/proxy_client_socket.cc
@@ -97,28 +97,4 @@ return true; } -// static -bool ProxyClientSocket::SanitizeProxyRedirect(HttpResponseInfo* response) { - DCHECK(response && response->headers.get()); - - std::string location; - if (!response->headers->IsRedirect(&location)) - return false; - - // Return minimal headers; set "Content-Length: 0" to ignore response body. - std::string fake_response_headers = base::StringPrintf( - "HTTP/1.0 302 Found\n" - "Location: %s\n" - "Content-Length: 0\n" - "Connection: close\n" - "\n", - location.c_str()); - std::string raw_headers = - HttpUtil::AssembleRawHeaders(fake_response_headers.data(), - fake_response_headers.length()); - response->headers = new HttpResponseHeaders(raw_headers); - - return true; -} - } // namespace net
diff --git a/net/http/proxy_client_socket.h b/net/http/proxy_client_socket.h index 0a34d87..9cddde8e 100644 --- a/net/http/proxy_client_socket.h +++ b/net/http/proxy_client_socket.h
@@ -80,13 +80,6 @@ // fail. static bool SanitizeProxyAuth(HttpResponseInfo* response); - // When a redirect (e.g. 302 response) is received during tunnel - // construction, this method should be called to strip everything - // but the Location header from the redirect response. If it returns - // false, the response should be discarded and tunnel construction should - // fail. - static bool SanitizeProxyRedirect(HttpResponseInfo* response); - private: DISALLOW_COPY_AND_ASSIGN(ProxyClientSocket); };
diff --git a/net/http/proxy_connect_redirect_http_stream.cc b/net/http/proxy_connect_redirect_http_stream.cc deleted file mode 100644 index 1f5dae74..0000000 --- a/net/http/proxy_connect_redirect_http_stream.cc +++ /dev/null
@@ -1,129 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/http/proxy_connect_redirect_http_stream.h" - -#include <cstddef> - -#include "base/logging.h" -#include "net/base/net_errors.h" - -namespace net { - -ProxyConnectRedirectHttpStream::ProxyConnectRedirectHttpStream( - LoadTimingInfo* load_timing_info) - : has_load_timing_info_(load_timing_info != nullptr) { - if (has_load_timing_info_) - load_timing_info_ = *load_timing_info; -} - -ProxyConnectRedirectHttpStream::~ProxyConnectRedirectHttpStream() = default; - -int ProxyConnectRedirectHttpStream::InitializeStream( - const HttpRequestInfo* request_info, - bool can_send_early, - RequestPriority priority, - const NetLogWithSource& net_log, - CompletionOnceCallback callback) { - NOTREACHED(); - return OK; -} - -int ProxyConnectRedirectHttpStream::SendRequest( - const HttpRequestHeaders& request_headers, - HttpResponseInfo* response, - CompletionOnceCallback callback) { - NOTREACHED(); - return OK; -} - -int ProxyConnectRedirectHttpStream::ReadResponseHeaders( - CompletionOnceCallback callback) { - NOTREACHED(); - return OK; -} - -int ProxyConnectRedirectHttpStream::ReadResponseBody( - IOBuffer* buf, - int buf_len, - CompletionOnceCallback callback) { - NOTREACHED(); - return OK; -} - -void ProxyConnectRedirectHttpStream::Close(bool not_reusable) {} - -bool ProxyConnectRedirectHttpStream::IsResponseBodyComplete() const { - NOTREACHED(); - return true; -} - -bool ProxyConnectRedirectHttpStream::IsConnectionReused() const { - NOTREACHED(); - return false; -} - -void ProxyConnectRedirectHttpStream::SetConnectionReused() { - NOTREACHED(); -} - -bool ProxyConnectRedirectHttpStream::CanReuseConnection() const { - return false; -} - -int64_t ProxyConnectRedirectHttpStream::GetTotalReceivedBytes() const { - return 0; -} - -int64_t ProxyConnectRedirectHttpStream::GetTotalSentBytes() const { - return 0; -} - -bool ProxyConnectRedirectHttpStream::GetAlternativeService( - AlternativeService* alternative_service) const { - return false; -} - -bool ProxyConnectRedirectHttpStream::GetLoadTimingInfo( - LoadTimingInfo* load_timing_info) const { - if (!has_load_timing_info_) - return false; - - *load_timing_info = load_timing_info_; - return true; -} - -void ProxyConnectRedirectHttpStream::GetSSLInfo(SSLInfo* ssl_info) { - NOTREACHED(); -} - -void ProxyConnectRedirectHttpStream::GetSSLCertRequestInfo( - SSLCertRequestInfo* cert_request_info) { - NOTREACHED(); -} - -bool ProxyConnectRedirectHttpStream::GetRemoteEndpoint(IPEndPoint* endpoint) { - NOTREACHED(); - return false; -} - -void ProxyConnectRedirectHttpStream::Drain(HttpNetworkSession* session) { - NOTREACHED(); -} - -void ProxyConnectRedirectHttpStream::PopulateNetErrorDetails( - NetErrorDetails* /*details*/) { - return; -} - -void ProxyConnectRedirectHttpStream::SetPriority(RequestPriority priority) { - // Nothing to do. -} - -HttpStream* ProxyConnectRedirectHttpStream::RenewStreamForAuth() { - NOTREACHED(); - return nullptr; -} - -} // namespace net
diff --git a/net/http/proxy_connect_redirect_http_stream.h b/net/http/proxy_connect_redirect_http_stream.h deleted file mode 100644 index 67cc6181..0000000 --- a/net/http/proxy_connect_redirect_http_stream.h +++ /dev/null
@@ -1,81 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef NET_HTTP_PROXY_CONNECT_REDIRECT_HTTP_STREAM_H_ -#define NET_HTTP_PROXY_CONNECT_REDIRECT_HTTP_STREAM_H_ - -#include <stdint.h> - -#include <memory> - -#include "base/compiler_specific.h" -#include "net/base/completion_once_callback.h" -#include "net/base/load_timing_info.h" -#include "net/http/http_stream.h" - -namespace net { - -// A dummy HttpStream with no body used when a redirect is returned -// from a proxy. -class ProxyConnectRedirectHttpStream : public HttpStream { - public: - // |load_timing_info| is the info that should be returned by - // GetLoadTimingInfo(), or NULL if there is none. Does not take - // ownership of |load_timing_info|. - explicit ProxyConnectRedirectHttpStream(LoadTimingInfo* load_timing_info); - ~ProxyConnectRedirectHttpStream() override; - - // All functions below are expected not to be called except for the - // marked one. - - int InitializeStream(const HttpRequestInfo* request_info, - bool can_send_early, - RequestPriority priority, - const NetLogWithSource& net_log, - CompletionOnceCallback callback) override; - int SendRequest(const HttpRequestHeaders& request_headers, - HttpResponseInfo* response, - CompletionOnceCallback callback) override; - int ReadResponseHeaders(CompletionOnceCallback callback) override; - int ReadResponseBody(IOBuffer* buf, - int buf_len, - CompletionOnceCallback callback) override; - - // This function may be called. - void Close(bool not_reusable) override; - - bool IsResponseBodyComplete() const override; - - bool IsConnectionReused() const override; - void SetConnectionReused() override; - bool CanReuseConnection() const override; - - int64_t GetTotalReceivedBytes() const override; - int64_t GetTotalSentBytes() const override; - bool GetAlternativeService( - AlternativeService* alternative_service) const override; - - // This function may be called. - bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const override; - - void GetSSLInfo(SSLInfo* ssl_info) override; - void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override; - bool GetRemoteEndpoint(IPEndPoint* endpoint) override; - void Drain(HttpNetworkSession* session) override; - void PopulateNetErrorDetails(NetErrorDetails* details) override; - - // This function may be called. - void SetPriority(RequestPriority priority) override; - - HttpStream* RenewStreamForAuth() override; - void SetRequestHeadersCallback(RequestHeadersCallback callback) override {} - - private: - bool has_load_timing_info_; - LoadTimingInfo load_timing_info_; -}; - -} // namespace net - -#endif // NET_HTTP_PROXY_CONNECT_REDIRECT_HTTP_STREAM_H_
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index 5913e46b..5efff24 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -1594,7 +1594,6 @@ { "name": "cyanogenmod.xxx", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "czbix.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dealcruiser.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "derevtsov.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dzlibs.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "easysimplecrm.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fralef.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -2783,7 +2782,6 @@ { "name": "patechmasters.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "payments-reference.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pbprint.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "pieterhordijk.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "poedgirl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "poiema.com.sg", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "posttigo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3189,7 +3187,6 @@ { "name": "max-moeglich.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mdek.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "meddelare.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "medexpress.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mediawiki.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "milahendri.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "moniquedekermadec.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3244,7 +3241,6 @@ { "name": "unionstationapp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "utonia.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vokeapp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "waze.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "whitehouse.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wikibooks.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wikimediafoundation.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3284,7 +3280,6 @@ { "name": "silvergoldbull.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "silvergoldbull.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sunnyfruit.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "szaydon.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tosecure.link", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "uploadbeta.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wikipedia.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3415,7 +3410,6 @@ { "name": "remoteutilities.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rj.gg", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rtcx.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "runementors.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rusl.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sellme.biz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "shopapi.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -4134,7 +4128,6 @@ { "name": "cannyfoxx.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "clmde.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "codeux.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "constructionjobs.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "conversiones.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "converter.ml", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "couragewhispers.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -4412,7 +4405,6 @@ { "name": "hejsupport.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "helpconnect.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "henrock.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "hompus.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hoodoo.tech", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hoton.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ideation-inc.co.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -4614,7 +4606,6 @@ { "name": "wetttipps.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "whatsupgold.com.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "whocalled.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "willosagiede.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wodka-division.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wohlgemuth.rocks", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wrwg.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -4630,7 +4621,6 @@ { "name": "6969.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aaeblog.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "advancis.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "ahxxm.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "anitube-nocookie.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "anitube.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "appartementhaus-badria.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -4892,7 +4882,6 @@ { "name": "coiffeurschnittstelle.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "comitesaustria.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "consonare.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "coopens.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "custodyxchange.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cvursache.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cyph.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -5471,7 +5460,6 @@ { "name": "wander.al", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wapjt.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "webdevops.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "weirdesigns.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "winpack.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "winpack.eu.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wittcher.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -5982,7 +5970,6 @@ { "name": "iflare.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "igforums.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "igrivi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "iirii.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ilona.graphics", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "iluvscotland.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "immaterium.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6203,7 +6190,6 @@ { "name": "nicolaeiotcu.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nightfirec.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nikomo.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "nocs.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nohup.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nojestorget.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nolaviz.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6534,7 +6520,6 @@ { "name": "xandocs.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xbt.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xichtsbuch.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "xiyu.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xmppwocky.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xss.ht", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xwalck.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -7585,7 +7570,6 @@ { "name": "cando.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "capitalquadatv.org.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cardstream.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "celec.gob.ec", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "centennialrewards.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "centerpereezd.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "centillien.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -11098,7 +11082,6 @@ { "name": "jabbari.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "j15t98j.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ja-dyck.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "jeepmafia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jan-and-maaret.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ivi-fertility.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jasmineconseil.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -12567,7 +12550,6 @@ { "name": "applelife.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "applian.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "appui-de-fenetre.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "ar.al", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "archimedicx.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ariege-pyrenees.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aritec-la.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -14367,7 +14349,6 @@ { "name": "captured-symphonies.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "charlierogers.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "childreninadversity.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "chameth.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ciphrex.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "chicolawfirm.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cbamo.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -15485,7 +15466,6 @@ { "name": "sequiturs.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "significados.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sift-tool.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "shipping24h.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "shux.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "skyline.link", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "selectary.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -16588,7 +16568,6 @@ { "name": "litz.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "litzenberger.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lianye5.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "lucasantarella.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "logaldeveloper.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lrssystems.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lidl-tour.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -17548,7 +17527,6 @@ { "name": "buergerhaushalt.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "c-rickroll-v.pw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "caylercapital.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "carlmjohnson.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bn1digital.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cannabis-marijuana.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bypassed.world", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -19116,7 +19094,6 @@ { "name": "sonic.network", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spiritual.dating", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "solutive.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "stewonet.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "st-kilian-markt-erlbach.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sumthing.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spatzenwerkstatt.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -19341,7 +19318,6 @@ { "name": "uk.dating", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "unixforum.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vinesauce.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "vid.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tanto259.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vega.dyndns.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vintagetrailerbuyers.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -19488,7 +19464,6 @@ { "name": "zenmate.com.tr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xlange.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "x-iweb.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "ximbo.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xsz.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xmv.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xn--allgu-biker-o8a.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -20208,7 +20183,6 @@ { "name": "eiga-movie.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "droomhuis-in-pekela-kopen.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dkniss.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "ecology-21.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "diymediahome.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "elizabethbuitrago.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "droomhuis-in-sudwest-fryslan-kopen.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -21278,7 +21252,6 @@ { "name": "onlinepokerspelen.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "oscreen.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "omsdieppe.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "ortlepp.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "overstap.deals", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "paveljanda.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "peercraft.biz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -21286,9 +21259,7 @@ { "name": "peercraft.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pctrouble.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "peercraft.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "pharmafoto.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "peercraft.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "pharmaphoto.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "peercraft.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "peercraft.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "peercraft.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -23366,7 +23337,6 @@ { "name": "administratorserwera.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "admongo.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "adnseguros.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "adora-illustrations.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "adrafinil.wiki", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "adriancohea.ninja", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "advantagehomeexteriors.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -23547,7 +23517,6 @@ { "name": "atlantareroof.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "atlantaspringroll.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "atlantiswaterproofing.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "atlaschiropractic.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "atomism.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "atviras.lt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "audialbuquerqueparts.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -26421,7 +26390,6 @@ { "name": "sphinx.network", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spidermail.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spiders.org.ua", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "spiff.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spiga.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spinspin.wtf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spoketwist.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -28326,7 +28294,6 @@ { "name": "fromthesoutherncross.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "freebookmakerbets.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "freegame-mugen.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "foryouandyourcustomers.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "funny-joke-pictures.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "freimeldungen.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "flokinet.is", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -28496,7 +28463,6 @@ { "name": "grawe-blog.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "guniram.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hainoni.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "gootax.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "greatideahub.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "gwsec.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "guidechecking.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -28521,7 +28487,6 @@ { "name": "haruue.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "guichet-entreprises.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "globalnewsdaily.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "gustiaux.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hdguru.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "gregoirow.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "healthlabs.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -28567,7 +28532,6 @@ { "name": "hiraku.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "holytransaction.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "goiaspropaganda.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "hl7999.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hightower.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hatarisecurity.co.ke", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "highland-webcams.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -28708,7 +28672,6 @@ { "name": "itsdcdn.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hydroagro.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "itsmejohn.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "impakho.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "itis.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "iskai.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ichasco.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -29187,7 +29150,6 @@ { "name": "miamicityballet.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mestazitrka.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mentaltraining-fuer-musiker.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "meisterritter.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mercedes-benz-usedcars.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "millhousenchurch.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "metrans-spedition.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -29499,7 +29461,6 @@ { "name": "owennelson.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "paizinhovirgula.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "oftamedic.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "pakho.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "owapi.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "p3.marketing", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "paavolastudio.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -30009,7 +29970,6 @@ { "name": "sha2017.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "santevie.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "shaharyaranjum.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "shikimori.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "seo-portal.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "shieldofachilles.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "shichibukai.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -30205,7 +30165,6 @@ { "name": "sja-se-training.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stadm.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "survivebox.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "surao.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stlukesbrandon.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sylvaindurand.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "szerelem.love", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -31466,7 +31425,6 @@ { "name": "elexel.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "experticon.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "duks.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "dudesunderwear.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ebolsa.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "e-apack.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ebolsas.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -31523,7 +31481,6 @@ { "name": "eriel.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "facanabota.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fixico-staging.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "emporioviverbem.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fatimamoldes.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ergovita.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "farfallapets.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -31905,7 +31862,6 @@ { "name": "levatc.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ligonier.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lipoabaltimore.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "leverj.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lazytux.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lesjardinsdubanchet.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lakonia.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -32399,7 +32355,6 @@ { "name": "queer.party", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "raycarruthersphotography.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rbnet.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "qledtech.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "publick.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "purpspc.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "radioheteroglossia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -33541,7 +33496,6 @@ { "name": "test02.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "texture.net.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "thiscode.works", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "thrivesummit.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tobias.gr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tokoindo.top", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "topnotchendings.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -34738,7 +34692,6 @@ { "name": "cuanhua3s.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "customgear.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cuxpool.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "cvjd.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cyber-perikarp.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cyclop-editorial.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cypresslegacy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -35176,7 +35129,6 @@ { "name": "joetyson.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "johand.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "johanli.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "johnbeil.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "johngaltgroup.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jokedalderup.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "joker.menu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -36071,7 +36023,6 @@ { "name": "yum0.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yutuo.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yuxuan.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "ywyz.tech", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "zach.codes", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "zaoext.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "zavec.com.ec", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -36353,7 +36304,6 @@ { "name": "geschmackspiloten.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "getfirstalert.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "giglink.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "gillesdesnoyers.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "gittigidiyor.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "globalisierung-fakten.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "gnax.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -37540,7 +37490,6 @@ { "name": "jpsinflatables.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jschoi.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jsent.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jtcat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "julico.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jump-zone.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jump4funinflatables.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -40380,7 +40329,6 @@ { "name": "b9948.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b99520.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b9960.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b9970.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b9980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b99881.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b99882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -40777,7 +40725,6 @@ { "name": "eleonorengland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eline168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elviraszabo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "elvispresley.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elwix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elysiria.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "empyrean-advisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -41901,7 +41848,6 @@ { "name": "timothybjacobs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tinlc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tiny.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "titanpointe.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tju.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "to2mbn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tobias-kleinmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -42917,7 +42863,6 @@ { "name": "tangerine.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tanyanama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tasogarenoinori.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "taunhanh.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "technicalbrothers.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "techniclab.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "techwithcromulent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -43954,7 +43899,6 @@ { "name": "beginatzero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "benc.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "benmorecentre.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bergfreunde.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "berz.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bestautoinsurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bettingsider.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -44078,10 +44022,8 @@ { "name": "e-baraxolka.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "easydumpsterrental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "easyreal.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "easyschools.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ebest.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "echo.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "echoteam.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "echoteen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "econverter.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "edgevelder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -45971,7 +45913,6 @@ { "name": "solartrackerapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "songtianyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sos-falegname.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "soulsteer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "spacestation13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "spanjeflydrive.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "starking.net.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -47239,7 +47180,6 @@ { "name": "giuem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glykofridis.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "golfpark-bostalsee.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gostest.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guoke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gut8er.com.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "h404bi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -47280,7 +47220,6 @@ { "name": "kovehitus.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ladraiglaan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lalajj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lebensraum-im-garten.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lederer-it.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "libricks.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lightspeedta.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -50927,7 +50866,6 @@ { "name": "lamikvah.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "landchecker.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lanforalla.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lichtmetzger.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lighttherapydevice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "line.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "linkybos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51518,7 +51456,6 @@ { "name": "kazakov.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kebabbruce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kelp.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kevinrandles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "keybored.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kgregorczyk.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kibea.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51857,7 +51794,6 @@ { "name": "themallards.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theroamingnotary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theshield.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thingsimplied.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thomasduerlund.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tigernode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tigernode.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51979,7 +51915,6 @@ { "name": "xn--y8jarb5hca.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xpbytes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xtips.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "yannikhenke.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ygobbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yourneighborhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zacadam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -52998,7 +52933,6 @@ { "name": "lindsaygorski.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "linux-audit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "linuxsecurity.expert", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lisky.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "livebandphotos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "liverider.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "livetoride.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -54824,7 +54758,6 @@ { "name": "araraexpress.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arletalibrary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "armanozak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "arne.codes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arviksa.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asproni.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "astral-imperium.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -54949,7 +54882,6 @@ { "name": "dnakids.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "domob.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drewapianostudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "drnow.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drrodina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drtimmarch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dsgarms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -55043,7 +54975,6 @@ { "name": "gregbrimble.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grego.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gsmbrick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "guajars.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gunauc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gv-salto.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gymjp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -55439,7 +55370,6 @@ { "name": "royal856.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "royal86.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "royal861.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "royal869.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "royal872.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "royal873.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "royal875.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56015,7 +55945,6 @@ { "name": "encryptmycard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "endofinternet.goip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "enelacto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "enjoy-israel.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "environmental-colleges.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eosol.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eosol.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56815,7 +56744,6 @@ { "name": "dragonwolfpackaquaria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drakecommercial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dreamlordpress.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dreatho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drinkgas-jihlava.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drlutfi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drpetervoigt.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -57187,7 +57115,6 @@ { "name": "xliang.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xmine128.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--ehqw04eq6e.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "yellotalk.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yhenke.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "youpickfarms.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "your-waterserver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -57195,7 +57122,6 @@ { "name": "yxs.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zeibekiko-souvlaki.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zirka24.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zl0iu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zl8862.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zunda.cafe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zxc.science", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59071,7 +58997,6 @@ { "name": "cachedview.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cafeterasbaratas.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caglarcakici.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "caijunyi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "calentadores-solares-sunshine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "callanan.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "callantonia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59387,7 +59312,6 @@ { "name": "fsty.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fun4tomorrow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "furcdn.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "futa.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "futureaudiographics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fydjbsd.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fyreek.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60203,7 +60127,6 @@ { "name": "speakingdiligence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "specialized-hosting.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "spenny.tf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "spro.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sproutways.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "spt.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sqsd.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60593,7 +60516,6 @@ { "name": "endofodo.goip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "essayjob.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "etha.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "exploration.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ezpzdelivery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fatalerrorcoded.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ferrone.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60756,7 +60678,6 @@ { "name": "rehabreviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rene-guitton.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "richeyweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "robertlluberes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rowancounty911.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rowancounty911.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rowancountyairport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60828,7 +60749,6 @@ { "name": "tellthemachines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "testoon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theideaskitchen.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "theteacherscorner.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thetorlock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thetorrentfunk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thetravelczar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -61624,7 +61544,6 @@ { "name": "vapex.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "varaeventos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vctor.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "veggie-einhorn.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "verschurendegroot.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "victorblomberg.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vietplan.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -61826,7 +61745,6 @@ { "name": "967606.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "9950p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "9box.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "9jatrust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "a-care.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "abaev.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "abasalehngo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62127,7 +62045,6 @@ { "name": "deskguide.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dev-greavesindia.pantheonsite.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devils-point.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "diag.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dicionarios.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "die-bobbeloase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "diendorfer.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62332,7 +62249,6 @@ { "name": "hostingalternative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hotel1926.com.mt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hrafnkellbaldurs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hsuan.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "huangqifu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hytale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "idealcontabilidade.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62437,7 +62353,6 @@ { "name": "kjnotes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kk.in.th", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kl008888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "klapib.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kleine-viecherei.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "knoji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kobar.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -63634,7 +63549,6 @@ { "name": "getlawyered.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glixee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "godattributes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "goldeneggs.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "graph.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "groundthumpingmotors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "groundthumpingmotors.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65104,7 +65018,6 @@ { "name": "617020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "6hzx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "701605.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "85383838.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "88881.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8balls.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "939394.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65717,7 +65630,6 @@ { "name": "jsproxy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "juergmeier.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "justmade.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kaihub.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kaisab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kaktuskola.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "karrot.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65987,7 +65899,6 @@ { "name": "algebra-quiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allesovertech.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alloutsec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "am8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amanet.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ameliemarieintokyo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amendoeiraresort.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66314,7 +66225,6 @@ { "name": "tvteam.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "twwd.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ugy.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ukne.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unknown.kyoto", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vdio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "venzagroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66722,9 +66632,7 @@ { "name": "a1autotransport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aattrans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adaptiveicons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "agks5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "airtec-france.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "alan.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alexanderrans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alldolledupstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alle-zonvakanties.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66901,7 +66809,6 @@ { "name": "kaizenjuku.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kamilmagdziak.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "katsunet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kb6767.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kb786.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kb88dc28.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "keypointfrancine.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -67432,7 +67339,6 @@ { "name": "reeftrip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reliableremovals-blackpool.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "revistabifrontal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "richie.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "richie.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rogerbertrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "romastantra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -67536,7 +67442,6 @@ { "name": "yogamaya9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yogamayanine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yornik.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "youtubeindonesia.web.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yuimarukitchen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yukimochi.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yukimochi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -69141,6 +69046,396 @@ { "name": "zookids.uy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zorrobei.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zravyobrazky.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "01-edu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "123birthdaygreetings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "373816.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5197dh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "68hvip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "731716.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "731783.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "736371.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "736381.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "9297dh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "961621.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "9728dh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "977hghg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "9988ty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aaa-racing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aaa-racing.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aaa-racing.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abdl.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abilitymatters.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "achtzehn.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adiprospero.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adrenalin.travel", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adrienjacquierbret.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agenziapubblicitaria.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agpideas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ahmd.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akupunktur-akupunktoer.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akuston.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alacriti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alecel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alessandrotravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allmemy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "am22i6xaf1m2a5m9k.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "am5566m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "annetta.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anns.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "archerygearonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arilto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arkhvoid.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "auburn-housekeeper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "badgr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bagnichimici.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bargainsettelement.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baron14.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "barth.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "basketforex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bazari.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "berkat-luqs.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bestartshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bf5.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bfh.science", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bibliotecadeseguranca.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "billigastehemsidan.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "binarka.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bio-feed.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bjut.photos", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bobasy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brocinema.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buildiffuse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bustany.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buyamerican.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bwgjms.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bwgjms.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cadra.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cafermin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "camzroofing.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caravanserail.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carezzaperu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cargobas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carlitoxxpro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carolinehanania.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cathouse.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ccc-cloud.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cell-lookup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "changemywifipassword.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chliine.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "classiccutstupelo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clausewitz-gesellschaft.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cmserviscz.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "computer-menschen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "consultasdigitales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "controlambientalbogota.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "counterenlol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crazypowered.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "createcpanama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ctoin.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "czwartybrat.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dale-west.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dcmapping.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deathsdomain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deco-parisienne.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deimos.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "denuevestore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "diamondgrid.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "directhomeremodelinginc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "djbobbytables.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dmarc.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doggo.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doggo.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dotweb.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dragcave.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dsa.cy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e-referendum.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "echomall.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edsinet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edugundavetiyesi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ej.uz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elblogdegoyo.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enlightenth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "entertainmentformitzvahs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "epicserver.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ericksonvasquez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "esher.ac.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "every-day-life.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fashion-hunters.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fau8.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fazzfinancial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "finanziero.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "findcheapmusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flameworked.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fontedoprazer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "franziskaherbert.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frappant.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freexmovie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "friends.tn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fromager.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fukushima-fun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fundmylegalclaim.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gabz.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "galaxymusicpromo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geekstreet.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gellis12.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gestionrocamar.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gobytedesign.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goldsteinlawgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grabatt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grandworldnghiduong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hapimiennam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "happychungus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "harms.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hauller.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "havasigabor.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "helloaigo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "herrfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hi.team", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hmnd.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hookxlab.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "htdcomputer.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "i-voting.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "icetravellers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iglosujemy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ihearmedical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ihempz.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "impresa-di-pulizie.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "infohub.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "infrafile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "infrafind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ingressfs.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "input.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inserzioni-ticino.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inserzioniticino.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "internetanbieter-experte.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "intr0.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itsfitlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ivocopro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ivocotec.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jeancafe.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jms8.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jmsjms.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jmsjms.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jmsjms.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jmsjms.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jobbidag.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "johnhancocknypensions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "johnhancockpensions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jonnasbeauty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jubobs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "juristique.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kendernet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kiro-ku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kjgmuenster.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "klu.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koeldezomerdoor.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koenrh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koenrh.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koenrh.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koenrouwhorst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kolas.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kpmgccc.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kpmgclientcollab.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "l214.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lamaletarural.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lasabubillas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lasranas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "launch-subtitle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leadpagebuilders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leftbrainsolutions.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "legacylawofwashington.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "livada.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liztattoo.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "llbcpa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "logicaccountingsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lokalna.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lonwan.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lunite.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luosonghao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lvtrafficticketguy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lycetre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magicroom.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "makariza.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "malenaamatomd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maniaiti.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mantachiepharmacy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maridonlaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marie-pettenbeck-schule.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marxists.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "massconsultores.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "matchlessdentist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mctitan.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mentecuriosa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meridianoshop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mezzehuis.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "microlz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mindofmedia.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mistine.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mistine.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mobasuite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mobydog.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moneylance.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mongolie.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mopedpress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "morgan-insurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "motlife.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mrschristine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mubase.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "my-webcloud.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mystaffonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nanopixel.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "naspro.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nazimogluinsaat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nivelul2.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "noiglosujemy.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "noiglosujemy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "noobsunited.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "novema.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "noxx.solutions", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olitham.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oneearthapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onevpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "opcare.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ortho-europe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ourfavorite-kakamigahara.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p-p.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parsdev.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pechonova.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pentagonreviewcenter.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "peter-hurtenbach.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pirapiserver.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "planningsagenda.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plumbingkingsllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pnnl.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "po0k.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "post.monster", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "postawnasiebie.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "predkosci.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "protectorlando.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pukkapilatesandpt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "puttymonos.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rbin.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rcmstream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rdwh.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "recyclebin.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "redcarpetmonday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reidsupply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "retidurc.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rightlaw.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rinprom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "romainlapoux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "romainlapoux.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rsdisedezzari.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sandstroh.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sandtohand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sanikapandit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sanook69.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seanstaffiery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sensuality-models.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seulean.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seutens.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seutens.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sevocomm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shiyouqkl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "silesianus.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "simplifyengineering.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "simulfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sloneczni.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smokeping.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sollevix.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "solupredperu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "somoyorkies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "speights-law.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "srdmarketingservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "starlux.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "startersiteweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stonedwarf5.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stromak.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sun-beach.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sunsquare.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "superbomsupermercado.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "supervets.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "switchchargers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t3.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tambo.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tamsweb.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tamtowild.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "technokicks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techy360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "telibee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theviewat55th.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thmpartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tiger21.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tinhbotnghegold.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tissus-paris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "titser.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tombu.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "twonodes.games", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uddate-linthdcp-3345app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uddate-linthdcp-567app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "undp.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unhurriedluxury.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "upstart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uronlinestreams.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "usbcurrent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v5ray.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "venti-athens.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "victorpelletmill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vscodownloader.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "warezoom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wed.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "welovejudo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wolkjehosting.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wordpressfly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "www-railto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb856.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb857.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb859.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb8606.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb865.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb871.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb872.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb873.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb8801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb8806.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb8808.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb8861.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb891.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb893.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb896.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb9009.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb901.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb906.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb935.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb936.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb937.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb951.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb952.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb953.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb957.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb961.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb962.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb963.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb967.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb971.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb972.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb976.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xb982.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xbdmov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xbjt1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xbjt11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--80ahclcaoccacrhfebi0dcn5c1jh.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xpertcube.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xrp.pp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xylerfox.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ying518.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ymm18.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yulaiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zanshinkankarate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zen-solutions.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "znaj.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, // END OF 1-YEAR BULK HSTS ENTRIES // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/proxy_resolution/pac_library_unittest.cc b/net/proxy_resolution/pac_library_unittest.cc index 8a911e9..1b16680 100644 --- a/net/proxy_resolution/pac_library_unittest.cc +++ b/net/proxy_resolution/pac_library_unittest.cc
@@ -271,7 +271,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) override { ADD_FAILURE() << "Called CreateProxyClientSocket()"; return nullptr;
diff --git a/net/quic/quic_proxy_client_socket.cc b/net/quic/quic_proxy_client_socket.cc index e6f2b811..3e925c90 100644 --- a/net/quic/quic_proxy_client_socket.cc +++ b/net/quic/quic_proxy_client_socket.cc
@@ -409,14 +409,6 @@ next_state_ = STATE_CONNECT_COMPLETE; return OK; - case 302: // Found / Moved Temporarily - // Try to return a sanitized response so we can follow auth redirects. - // If we can't, fail the tunnel connection. - if (!SanitizeProxyRedirect(&response_)) - return ERR_TUNNEL_CONNECTION_FAILED; - next_state_ = STATE_DISCONNECTED; - return ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT; - case 407: // Proxy Authentication Required next_state_ = STATE_CONNECT_COMPLETE; if (!SanitizeProxyAuth(&response_))
diff --git a/net/quic/quic_proxy_client_socket_unittest.cc b/net/quic/quic_proxy_client_socket_unittest.cc index 60e259eb..5c7931b 100644 --- a/net/quic/quic_proxy_client_socket_unittest.cc +++ b/net/quic/quic_proxy_client_socket_unittest.cc
@@ -674,6 +674,7 @@ ASSERT_EQ(200, response->headers->response_code()); } +// Tests that a redirect response from a CONNECT fails. TEST_P(QuicProxyClientSocketTest, ConnectRedirects) { mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructSettingsPacket(1)); mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructConnectRequestPacket(2)); @@ -686,15 +687,14 @@ Initialize(); - AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT); + AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); ASSERT_TRUE(response != nullptr); const HttpResponseHeaders* headers = response->headers.get(); ASSERT_EQ(302, headers->response_code()); - ASSERT_FALSE(headers->HasHeader("set-cookie")); - ASSERT_TRUE(headers->HasHeaderValue("content-length", "0")); + ASSERT_TRUE(headers->HasHeader("set-cookie")); std::string location; ASSERT_TRUE(headers->IsRedirect(&location));
diff --git a/net/socket/client_socket_factory.cc b/net/socket/client_socket_factory.cc index c43fecc..313bc16b1 100644 --- a/net/socket/client_socket_factory.cc +++ b/net/socket/client_socket_factory.cc
@@ -62,12 +62,11 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) override { return std::make_unique<HttpProxyClientSocket>( std::move(stream_socket), user_agent, endpoint, proxy_server, http_auth_controller, tunnel, using_spdy, negotiated_protocol, - proxy_delegate, is_https_proxy, traffic_annotation); + proxy_delegate, traffic_annotation); } };
diff --git a/net/socket/client_socket_factory.h b/net/socket/client_socket_factory.h index 16982526..db61cc4 100644 --- a/net/socket/client_socket_factory.h +++ b/net/socket/client_socket_factory.h
@@ -67,7 +67,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) = 0; // Returns the default ClientSocketFactory.
diff --git a/net/socket/client_socket_handle.cc b/net/socket/client_socket_handle.cc index 65edc74..aa71aad 100644 --- a/net/socket/client_socket_handle.cc +++ b/net/socket/client_socket_handle.cc
@@ -108,20 +108,13 @@ RemoveHigherLayeredPool(higher_pool_); pool_ = nullptr; idle_time_ = base::TimeDelta(); - // Connection timing is still needed for handling - // ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT errors. - // - // TODO(mmenke): Remove once ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT no - // longer results in following a redirect. - if (!pending_http_proxy_socket_) - connect_timing_ = LoadTimingInfo::ConnectTiming(); + connect_timing_ = LoadTimingInfo::ConnectTiming(); group_generation_ = -1; } void ClientSocketHandle::ResetErrorState() { is_ssl_error_ = false; ssl_cert_request_info_ = nullptr; - pending_http_proxy_socket_.reset(); } LoadState ClientSocketHandle::GetLoadState() const { @@ -172,12 +165,6 @@ LoadTimingInfo* load_timing_info) const { if (socket_) { load_timing_info->socket_log_id = socket_->NetLog().source().id; - } else if (pending_http_proxy_socket_) { - // TODO(mmenke): This case is only needed for timing for redirects in the - // case of ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT. Remove this code once - // we no longer follow those redirects. - load_timing_info->socket_log_id = - pending_http_proxy_socket_->NetLog().source().id; } else { // Only return load timing information when there's a socket. return false; @@ -207,16 +194,6 @@ void ClientSocketHandle::SetAdditionalErrorState(ConnectJob* connect_job) { connection_attempts_ = connect_job->GetConnectionAttempts(); - // TODO(mmenke): Once redirects are no longer followed on - // ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT, remove this code. - pending_http_proxy_socket_ = connect_job->PassProxySocketOnFailure(); - if (pending_http_proxy_socket_) { - // Connection timing is only set when a socket was actually established. In - // this particular case, there is a socket being returned, just not through - // the normal path, so need to set timing information here. - connect_timing_ = connect_job->connect_timing(); - } - is_ssl_error_ = connect_job->IsSSLError(); ssl_cert_request_info_ = connect_job->GetCertRequestInfo(); }
diff --git a/net/socket/client_socket_handle.h b/net/socket/client_socket_handle.h index b20e4c75c..8ec8c8b 100644 --- a/net/socket/client_socket_handle.h +++ b/net/socket/client_socket_handle.h
@@ -160,9 +160,6 @@ scoped_refptr<SSLCertRequestInfo> ssl_cert_request_info) { ssl_cert_request_info_ = std::move(ssl_cert_request_info); } - void set_pending_http_proxy_socket(std::unique_ptr<StreamSocket> socket) { - pending_http_proxy_socket_ = std::move(socket); - } void set_connection_attempts(const ConnectionAttempts& attempts) { connection_attempts_ = attempts; } @@ -179,10 +176,6 @@ return ssl_cert_request_info_; } - std::unique_ptr<StreamSocket> release_pending_http_proxy_socket() { - return std::move(pending_http_proxy_socket_); - } - // If the connection failed, returns the connection attempts made. (If it // succeeded, they will be returned through the socket instead; see // |StreamSocket::GetConnectionAttempts|.) @@ -237,7 +230,6 @@ int64_t group_generation_; bool is_ssl_error_; scoped_refptr<SSLCertRequestInfo> ssl_cert_request_info_; - std::unique_ptr<StreamSocket> pending_http_proxy_socket_; std::vector<ConnectionAttempt> connection_attempts_; NetLogSource requesting_source_;
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc index efb74e2dc..f0ebdb59 100644 --- a/net/socket/client_socket_pool_base_unittest.cc +++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -258,7 +258,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) override { NOTIMPLEMENTED(); return nullptr;
diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc index 405d61d8..aad5cdc 100644 --- a/net/socket/client_socket_pool_manager.cc +++ b/net/socket/client_socket_pool_manager.cc
@@ -292,27 +292,6 @@ resolution_callback, std::move(callback), proxy_auth_callback); } -NET_EXPORT std::unique_ptr<ConnectJob> CreateConnectJobForRawConnect( - const HostPortPair& host_port_pair, - bool use_tls, - const CommonConnectJobParams* common_connect_job_params, - RequestPriority request_priority, - const ProxyInfo& proxy_info, - const SSLConfig& ssl_config_for_origin, - const SSLConfig& ssl_config_for_proxy, - const NetLogWithSource& net_log, - ConnectJob::Delegate* connect_job_delegate) { - // QUIC proxies are currently not supported through this method. - DCHECK(!proxy_info.is_quic()); - - return ConnectJob::CreateConnectJob( - use_tls, host_port_pair, proxy_info.proxy_server(), - proxy_info.traffic_annotation(), &ssl_config_for_origin, - &ssl_config_for_proxy, true /* force_tunnel */, - net::PRIVACY_MODE_DISABLED, OnHostResolutionCallback(), request_priority, - SocketTag(), common_connect_job_params, connect_job_delegate); -} - int PreconnectSocketsForHttpRequest( ClientSocketPoolManager::SocketGroupType group_type, const HostPortPair& endpoint,
diff --git a/net/socket/client_socket_pool_manager.h b/net/socket/client_socket_pool_manager.h index 0a7a9e74..1ec33cd 100644 --- a/net/socket/client_socket_pool_manager.h +++ b/net/socket/client_socket_pool_manager.h
@@ -141,24 +141,6 @@ CompletionOnceCallback callback, const ClientSocketPool::ProxyAuthCallback& proxy_auth_callback); -// Deprecated: Please do not use this outside of //net and //services/network. -// A helper method that uses the passed in proxy to initialize a ConnectJob that -// does not use a SocketPool, but does use the passed in -// CommonConnectJobParams's SpdySessionPool. Use this method for a raw socket -// connection to a host-port pair (that needs to tunnel through the proxies). If -// |use_tls| is true, will establish a TLS connection on top of the established -// connection. -NET_EXPORT std::unique_ptr<ConnectJob> CreateConnectJobForRawConnect( - const HostPortPair& host_port_pair, - bool use_tls, - const CommonConnectJobParams* common_connect_job_params, - RequestPriority request_priority, - const ProxyInfo& proxy_info, - const SSLConfig& ssl_config_for_origin, - const SSLConfig& ssl_config_for_proxy, - const NetLogWithSource& net_log, - ConnectJob::Delegate* connect_job_delegate); - // Similar to InitSocketHandleForHttpRequest except that it initiates the // desired number of preconnect streams from the relevant socket pool. int PreconnectSocketsForHttpRequest(
diff --git a/net/socket/connect_job.cc b/net/socket/connect_job.cc index 85790b0e..3a0fd94 100644 --- a/net/socket/connect_job.cc +++ b/net/socket/connect_job.cc
@@ -212,10 +212,6 @@ return ConnectionAttempts(); } -std::unique_ptr<StreamSocket> ConnectJob::PassProxySocketOnFailure() { - return nullptr; -} - bool ConnectJob::IsSSLError() const { return false; }
diff --git a/net/socket/connect_job.h b/net/socket/connect_job.h index e23df86d..219ebc95 100644 --- a/net/socket/connect_job.h +++ b/net/socket/connect_job.h
@@ -218,11 +218,6 @@ // proxy. virtual ConnectionAttempts GetConnectionAttempts() const; - // On connect failure, returns the nested proxy socket, if there is one. - // Returns nullptr otherwise. Only returns a non-null value for SSL sockets on - // top of proxy sockets. - virtual std::unique_ptr<StreamSocket> PassProxySocketOnFailure(); - // If the ConnectJob failed, returns true if the failure occurred after SSL // negotiation started. If the ConnectJob succeeded, the returned value is // undefined.
diff --git a/net/socket/fuzzed_socket_factory.cc b/net/socket/fuzzed_socket_factory.cc index 1e933ab..7736fa4 100644 --- a/net/socket/fuzzed_socket_factory.cc +++ b/net/socket/fuzzed_socket_factory.cc
@@ -151,7 +151,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) { NOTIMPLEMENTED(); return nullptr;
diff --git a/net/socket/fuzzed_socket_factory.h b/net/socket/fuzzed_socket_factory.h index e09fba1..4002d006 100644 --- a/net/socket/fuzzed_socket_factory.h +++ b/net/socket/fuzzed_socket_factory.h
@@ -63,7 +63,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) override; // Sets whether Connect()ions on returned sockets can be asynchronously
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc index 0f1e5908..e9dc162 100644 --- a/net/socket/socket_test_util.cc +++ b/net/socket/socket_test_util.cc
@@ -814,7 +814,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) { if (use_mock_proxy_client_sockets_) { ProxyClientSocketDataProvider* next_proxy_data = mock_proxy_data_.GetNext(); @@ -824,7 +823,7 @@ return GetDefaultFactory()->CreateProxyClientSocket( std::move(stream_socket), user_agent, endpoint, proxy_server, http_auth_controller, tunnel, using_spdy, negotiated_protocol, - proxy_delegate, is_https_proxy, traffic_annotation); + proxy_delegate, traffic_annotation); } }
diff --git a/net/socket/socket_test_util.h b/net/socket/socket_test_util.h index 26e2d2b..7ea23087 100644 --- a/net/socket/socket_test_util.h +++ b/net/socket/socket_test_util.h
@@ -659,7 +659,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) override; const std::vector<uint16_t>& udp_client_socket_ports() const { return udp_client_socket_ports_;
diff --git a/net/socket/ssl_connect_job.cc b/net/socket/ssl_connect_job.cc index be99516..86f75191 100644 --- a/net/socket/ssl_connect_job.cc +++ b/net/socket/ssl_connect_job.cc
@@ -115,8 +115,7 @@ params_(std::move(params)), callback_(base::BindRepeating(&SSLConnectJob::OnIOComplete, base::Unretained(this))), - ssl_negotiation_started_(false), - proxy_redirect_(false) {} + ssl_negotiation_started_(false) {} SSLConnectJob::~SSLConnectJob() { // In the case the job was canceled, need to delete nested job first to @@ -180,12 +179,6 @@ return connection_attempts_; } -std::unique_ptr<StreamSocket> SSLConnectJob::PassProxySocketOnFailure() { - if (proxy_redirect_) - return std::move(nested_socket_); - return nullptr; -} - bool SSLConnectJob::IsSSLError() const { return ssl_negotiation_started_; } @@ -322,9 +315,6 @@ // |GetAdditionalErrorState|, we can easily set the state. if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) { ssl_cert_request_info_ = nested_connect_job_->GetCertRequestInfo(); - } else if (result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT) { - proxy_redirect_ = true; - connect_timing_ = nested_connect_job_->connect_timing(); } return result; }
diff --git a/net/socket/ssl_connect_job.h b/net/socket/ssl_connect_job.h index 8ed44809..bc19886 100644 --- a/net/socket/ssl_connect_job.h +++ b/net/socket/ssl_connect_job.h
@@ -100,7 +100,6 @@ base::OnceClosure restart_with_auth_callback, ConnectJob* job) override; ConnectionAttempts GetConnectionAttempts() const override; - std::unique_ptr<StreamSocket> PassProxySocketOnFailure() override; bool IsSSLError() const override; scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override; @@ -159,9 +158,6 @@ scoped_refptr<SSLCertRequestInfo> ssl_cert_request_info_; - // True if a proxy returned a redirect, resulting in an error. - bool proxy_redirect_; - ConnectionAttempts connection_attempts_; // The address of the server the connect job is connected to. Populated if // and only if the connect job is connected *directly* to the server (not
diff --git a/net/socket/transport_client_socket_pool_test_util.cc b/net/socket/transport_client_socket_pool_test_util.cc index d540dd8..bf8b36601 100644 --- a/net/socket/transport_client_socket_pool_test_util.cc +++ b/net/socket/transport_client_socket_pool_test_util.cc
@@ -463,7 +463,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) { NOTIMPLEMENTED(); return nullptr;
diff --git a/net/socket/transport_client_socket_pool_test_util.h b/net/socket/transport_client_socket_pool_test_util.h index ac2b73e..38a9744 100644 --- a/net/socket/transport_client_socket_pool_test_util.h +++ b/net/socket/transport_client_socket_pool_test_util.h
@@ -103,7 +103,6 @@ bool using_spdy, NextProto negotiated_protocol, ProxyDelegate* proxy_delegate, - bool is_https_proxy, const NetworkTrafficAnnotationTag& traffic_annotation) override; int allocation_count() const { return allocation_count_; }
diff --git a/net/socket/transport_client_socket_pool_unittest.cc b/net/socket/transport_client_socket_pool_unittest.cc index fb85532..4688bd1 100644 --- a/net/socket/transport_client_socket_pool_unittest.cc +++ b/net/socket/transport_client_socket_pool_unittest.cc
@@ -1564,36 +1564,9 @@ NetLogWithSource()); rv = callback.GetResult(rv); - if (!use_https_proxy) { - // We don't trust 302 responses to CONNECT from HTTP proxies. - EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); - EXPECT_FALSE(handle.is_initialized()); - EXPECT_FALSE(handle.release_pending_http_proxy_socket()); - } else { - // Expect ProxyClientSocket to return the proxy's response, sanitized. - EXPECT_THAT(rv, IsError(ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT)); - EXPECT_FALSE(handle.is_initialized()); - - std::unique_ptr<StreamSocket> stream_socket = - handle.release_pending_http_proxy_socket(); - ASSERT_TRUE(stream_socket); - const ProxyClientSocket* tunnel_socket = - static_cast<ProxyClientSocket*>(stream_socket.get()); - const HttpResponseInfo* response = - tunnel_socket->GetConnectResponseInfo(); - const HttpResponseHeaders* headers = response->headers.get(); - - // Make sure Set-Cookie header was stripped. - EXPECT_FALSE(headers->HasHeader("set-cookie")); - - // Make sure Content-Length: 0 header was added. - EXPECT_TRUE(headers->HasHeaderValue("content-length", "0")); - - // Make sure Location header was included and correct. - std::string location; - EXPECT_TRUE(headers->IsRedirect(&location)); - EXPECT_EQ(location, kRedirectTarget); - } + // We don't trust 302 responses to CONNECT. + EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); + EXPECT_FALSE(handle.is_initialized()); } } }
diff --git a/net/spdy/spdy_proxy_client_socket.cc b/net/spdy/spdy_proxy_client_socket.cc index c64dcb3..3330305 100644 --- a/net/spdy/spdy_proxy_client_socket.cc +++ b/net/spdy/spdy_proxy_client_socket.cc
@@ -409,17 +409,6 @@ next_state_ = STATE_OPEN; return OK; - case 302: // Found / Moved Temporarily - // Try to return a sanitized response so we can follow auth redirects. - // If we can't, fail the tunnel connection. - if (!SanitizeProxyRedirect(&response_)) - return ERR_TUNNEL_CONNECTION_FAILED; - - // Note that this triggers a spdy::ERROR_CODE_CANCEL. - spdy_stream_->DetachDelegate(); - next_state_ = STATE_DISCONNECTED; - return ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT; - case 407: // Proxy Authentication Required next_state_ = STATE_OPEN; if (!SanitizeProxyAuth(&response_))
diff --git a/net/spdy/spdy_proxy_client_socket_unittest.cc b/net/spdy/spdy_proxy_client_socket_unittest.cc index 329e2217e..3570796 100644 --- a/net/spdy/spdy_proxy_client_socket_unittest.cc +++ b/net/spdy/spdy_proxy_client_socket_unittest.cc
@@ -537,7 +537,7 @@ spdy::SpdySerializedFrame rst( spdy_util_.ConstructSpdyRstStream(1, spdy::ERROR_CODE_CANCEL)); MockWrite writes[] = { - CreateMockWrite(conn, 0, SYNCHRONOUS), CreateMockWrite(rst, 3), + CreateMockWrite(conn, 0, SYNCHRONOUS), }; spdy::SpdySerializedFrame resp(ConstructConnectRedirectReplyFrame()); @@ -547,15 +547,14 @@ Initialize(reads, writes); - AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT); + AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); ASSERT_TRUE(response != nullptr); const HttpResponseHeaders* headers = response->headers.get(); ASSERT_EQ(302, headers->response_code()); - ASSERT_FALSE(headers->HasHeader("set-cookie")); - ASSERT_TRUE(headers->HasHeaderValue("content-length", "0")); + ASSERT_TRUE(headers->HasHeader("set-cookie")); std::string location; ASSERT_TRUE(headers->IsRedirect(&location));
diff --git a/net/url_request/http_with_dns_over_https_unittest.cc b/net/url_request/http_with_dns_over_https_unittest.cc index a04e654..71edf18 100644 --- a/net/url_request/http_with_dns_over_https_unittest.cc +++ b/net/url_request/http_with_dns_over_https_unittest.cc
@@ -169,12 +169,6 @@ void OnNeedsClientAuth(const SSLConfig& used_ssl_config, SSLCertRequestInfo* cert_info) override {} - void OnHttpsProxyTunnelResponseRedirect( - const HttpResponseInfo& response_info, - const SSLConfig& used_ssl_config, - const ProxyInfo& used_proxy_info, - std::unique_ptr<HttpStream> stream) override {} - void OnQuicBroken() override {} private:
diff --git a/net/url_request/url_request_ftp_job.h b/net/url_request/url_request_ftp_job.h index c01f7ed..33edb90 100644 --- a/net/url_request/url_request_ftp_job.h +++ b/net/url_request/url_request_ftp_job.h
@@ -64,8 +64,6 @@ void RestartTransactionWithAuth(); - void LogFtpServerType(char server_type); - // Overridden from URLRequestJob: LoadState GetLoadState() const override; bool NeedsAuth() override;
diff --git a/ppapi/native_client/tools/browser_tester/browsertester/browserlauncher.py b/ppapi/native_client/tools/browser_tester/browsertester/browserlauncher.py index a990ca93..dd94434 100755 --- a/ppapi/native_client/tools/browser_tester/browsertester/browserlauncher.py +++ b/ppapi/native_client/tools/browser_tester/browsertester/browserlauncher.py
@@ -269,7 +269,6 @@ # on Windows (see # https://code.google.com/p/chromium/issues/detail?id=171836) '--enable-logging', - '--disable-web-resources', # This prevents Chrome from making "hidden" network requests at # startup and navigation. These requests could be a source of # non-determinism, and they also add noise to the netlogs.
diff --git a/remoting/test/BUILD.gn b/remoting/test/BUILD.gn index 57b7f3b..553d07c 100644 --- a/remoting/test/BUILD.gn +++ b/remoting/test/BUILD.gn
@@ -24,6 +24,8 @@ "fake_access_token_fetcher.h", "fake_host_list_fetcher.cc", "fake_host_list_fetcher.h", + "fake_ice_connection.cc", + "fake_ice_connection.h", "fake_network_dispatcher.cc", "fake_network_dispatcher.h", "fake_network_manager.cc", @@ -34,6 +36,8 @@ "fake_socket_factory.h", "fake_test_token_storage.cc", "fake_test_token_storage.h", + "fake_webrtc_connection.cc", + "fake_webrtc_connection.h", "frame_generator_util.cc", "frame_generator_util.h", "host_info.cc",
diff --git a/remoting/test/fake_ice_connection.cc b/remoting/test/fake_ice_connection.cc new file mode 100644 index 0000000..2602dc3 --- /dev/null +++ b/remoting/test/fake_ice_connection.cc
@@ -0,0 +1,61 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "remoting/test/fake_ice_connection.h" + +#include "remoting/base/logging.h" +#include "remoting/protocol/client_control_dispatcher.h" +#include "remoting/protocol/host_control_dispatcher.h" +#include "remoting/protocol/transport_context.h" + +namespace remoting { +namespace test { + +FakeIceConnection::FakeIceConnection( + scoped_refptr<protocol::TransportContext> transport_context, + base::OnceClosure on_closed) { + transport_ = + std::make_unique<protocol::IceTransport>(transport_context, this); + on_closed_ = std::move(on_closed); + if (transport_context->role() == protocol::TransportRole::CLIENT) { + control_dispatcher_ = std::make_unique<protocol::ClientControlDispatcher>(); + } else { + control_dispatcher_ = std::make_unique<protocol::HostControlDispatcher>(); + } +} + +FakeIceConnection::~FakeIceConnection() = default; + +void FakeIceConnection::OnAuthenticated() { + control_dispatcher_->Init(transport_->GetMultiplexedChannelFactory(), this); +} + +void FakeIceConnection::OnIceTransportRouteChange( + const std::string& channel_name, + const protocol::TransportRoute& route) { + HOST_LOG << "Channel: " << channel_name << " changed route:\n" + << "Route type: " << route.type + << ", remote address: " << route.remote_address.ToString() + << ", local address: " << route.local_address.ToString(); +} + +void FakeIceConnection::OnIceTransportError(protocol::ErrorCode error) { + LOG(ERROR) << "ICE transport error: " << error; + std::move(on_closed_).Run(); +} + +void FakeIceConnection::OnChannelInitialized( + protocol::ChannelDispatcherBase* channel_dispatcher) { + HOST_LOG << "Channel initialized!"; + std::move(on_closed_).Run(); +} + +void FakeIceConnection::OnChannelClosed( + protocol::ChannelDispatcherBase* channel_dispatcher) { + HOST_LOG << "Channel closed!"; + std::move(on_closed_).Run(); +} + +} // namespace test +} // namespace remoting
diff --git a/remoting/test/fake_ice_connection.h b/remoting/test/fake_ice_connection.h new file mode 100644 index 0000000..a7421ec --- /dev/null +++ b/remoting/test/fake_ice_connection.h
@@ -0,0 +1,50 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef REMOTING_TEST_FAKE_ICE_CONNECTION_H_ +#define REMOTING_TEST_FAKE_ICE_CONNECTION_H_ + +#include "base/macros.h" +#include "remoting/protocol/channel_dispatcher_base.h" +#include "remoting/protocol/ice_transport.h" + +namespace remoting { +namespace test { + +class FakeIceConnection final + : public protocol::IceTransport::EventHandler, + public protocol::ChannelDispatcherBase::EventHandler { + public: + FakeIceConnection(scoped_refptr<protocol::TransportContext> transport_context, + base::OnceClosure on_closed); + ~FakeIceConnection() override; + + void OnAuthenticated(); + + protocol::Transport* transport() { return transport_.get(); } + + private: + // protocol::IceTransport::EventHandler implementations. + void OnIceTransportRouteChange( + const std::string& channel_name, + const protocol::TransportRoute& route) override; + void OnIceTransportError(protocol::ErrorCode error) override; + + // ChannelDispatcherBase::EventHandler implementations. + void OnChannelInitialized( + protocol::ChannelDispatcherBase* channel_dispatcher) override; + void OnChannelClosed( + protocol::ChannelDispatcherBase* channel_dispatcher) override; + + // |transport_| must outlive |control_dispatcher_|. + std::unique_ptr<protocol::IceTransport> transport_; + std::unique_ptr<protocol::ChannelDispatcherBase> control_dispatcher_; + base::OnceClosure on_closed_; + DISALLOW_COPY_AND_ASSIGN(FakeIceConnection); +}; + +} // namespace test +} // namespace remoting + +#endif // REMOTING_TEST_FAKE_ICE_CONNECTION_H_
diff --git a/remoting/test/fake_webrtc_connection.cc b/remoting/test/fake_webrtc_connection.cc new file mode 100644 index 0000000..caa678d --- /dev/null +++ b/remoting/test/fake_webrtc_connection.cc
@@ -0,0 +1,49 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "remoting/test/fake_webrtc_connection.h" + +#include "jingle/glue/thread_wrapper.h" +#include "remoting/base/logging.h" +#include "remoting/protocol/transport_context.h" + +namespace remoting { +namespace test { + +FakeWebrtcConnection::FakeWebrtcConnection( + scoped_refptr<protocol::TransportContext> transport_context, + base::OnceClosure on_closed) { + transport_ = std::make_unique<protocol::WebrtcTransport>( + jingle_glue::JingleThreadWrapper::current(), transport_context, this); + on_closed_ = std::move(on_closed); +} + +FakeWebrtcConnection::~FakeWebrtcConnection() = default; + +void FakeWebrtcConnection::OnWebrtcTransportConnecting() { + HOST_LOG << "Webrtc transport is connecting..."; +} + +void FakeWebrtcConnection::OnWebrtcTransportConnected() { + HOST_LOG << "Webrtc transport is connected!!!"; + std::move(on_closed_).Run(); +} + +void FakeWebrtcConnection::OnWebrtcTransportError(protocol::ErrorCode error) { + LOG(ERROR) << "Webrtc transport error: " << error; + std::move(on_closed_).Run(); +} + +void FakeWebrtcConnection::OnWebrtcTransportIncomingDataChannel( + const std::string& name, + std::unique_ptr<protocol::MessagePipe> pipe) {} + +void FakeWebrtcConnection::OnWebrtcTransportMediaStreamAdded( + scoped_refptr<webrtc::MediaStreamInterface> stream) {} + +void FakeWebrtcConnection::OnWebrtcTransportMediaStreamRemoved( + scoped_refptr<webrtc::MediaStreamInterface> stream) {} + +} // namespace test +} // namespace remoting
diff --git a/remoting/test/fake_webrtc_connection.h b/remoting/test/fake_webrtc_connection.h new file mode 100644 index 0000000..29bde01 --- /dev/null +++ b/remoting/test/fake_webrtc_connection.h
@@ -0,0 +1,47 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef REMOTING_TEST_FAKE_WEBRTC_CONNECTION_H_ +#define REMOTING_TEST_FAKE_WEBRTC_CONNECTION_H_ + +#include "base/callback_forward.h" +#include "base/macros.h" +#include "base/memory/scoped_refptr.h" +#include "remoting/protocol/webrtc_transport.h" + +namespace remoting { +namespace test { + +class FakeWebrtcConnection final + : public protocol::WebrtcTransport::EventHandler { + public: + FakeWebrtcConnection( + scoped_refptr<protocol::TransportContext> transport_context, + base::OnceClosure on_closed); + ~FakeWebrtcConnection() override; + + protocol::Transport* transport() { return transport_.get(); } + + private: + // protocol::WebrtcTransport::EventHandler implementations. + void OnWebrtcTransportConnecting() override; + void OnWebrtcTransportConnected() override; + void OnWebrtcTransportError(protocol::ErrorCode error) override; + void OnWebrtcTransportIncomingDataChannel( + const std::string& name, + std::unique_ptr<protocol::MessagePipe> pipe) override; + void OnWebrtcTransportMediaStreamAdded( + scoped_refptr<webrtc::MediaStreamInterface> stream) override; + void OnWebrtcTransportMediaStreamRemoved( + scoped_refptr<webrtc::MediaStreamInterface> stream) override; + + std::unique_ptr<protocol::WebrtcTransport> transport_; + base::OnceClosure on_closed_; + DISALLOW_COPY_AND_ASSIGN(FakeWebrtcConnection); +}; + +} // namespace test +} // namespace remoting + +#endif // REMOTING_TEST_FAKE_WEBRTC_CONNECTION_H_
diff --git a/remoting/test/ftl_signaling_playground.cc b/remoting/test/ftl_signaling_playground.cc index b249963..3ff77b23 100644 --- a/remoting/test/ftl_signaling_playground.cc +++ b/remoting/test/ftl_signaling_playground.cc
@@ -57,6 +57,7 @@ constexpr char kSwitchNameStoragePath[] = "storage-path"; constexpr char kSwitchNamePin[] = "pin"; constexpr char kSwitchNameHostId[] = "host-id"; +constexpr char kSwitchNameUseChromotocol[] = "use-chromotocol"; const char* SignalStrategyErrorToString(SignalStrategy::Error error) { switch (error) { @@ -72,45 +73,6 @@ return ""; } -class FakeTransportEventHandler final - : public protocol::WebrtcTransport::EventHandler { - public: - explicit FakeTransportEventHandler(base::OnceClosure on_closed) { - on_closed_ = std::move(on_closed); - } - - ~FakeTransportEventHandler() override = default; - - // protocol::WebrtcTransport::EventHandler interface. - void OnWebrtcTransportConnecting() override { - HOST_LOG << "Webrtc transport is connecting..."; - } - - void OnWebrtcTransportConnected() override { - HOST_LOG << "Webrtc transport is connected!!!"; - std::move(on_closed_).Run(); - } - - void OnWebrtcTransportError(protocol::ErrorCode error) override { - LOG(ERROR) << "Webrtc transport error: " << error; - std::move(on_closed_).Run(); - } - - void OnWebrtcTransportIncomingDataChannel( - const std::string& name, - std::unique_ptr<protocol::MessagePipe> pipe) override {} - - void OnWebrtcTransportMediaStreamAdded( - scoped_refptr<webrtc::MediaStreamInterface> stream) override {} - - void OnWebrtcTransportMediaStreamRemoved( - scoped_refptr<webrtc::MediaStreamInterface> stream) override {} - - private: - base::OnceClosure on_closed_; - DISALLOW_COPY_AND_ASSIGN(FakeTransportEventHandler); -}; - } // namespace FtlSignalingPlayground::FtlSignalingPlayground() = default; @@ -125,7 +87,7 @@ printf( "Usage: %s [--auth-code=<auth-code>] [--host-id=<host-id>] [--pin=<pin>] " "[--storage-path=<storage-path>] [--username=<example@gmail.com>] " - "[--host-owner=<example@gmail.com>]\n", + "[--host-owner=<example@gmail.com>] [--use-chromotocol]\n", base::CommandLine::ForCurrentProcess() ->GetProgram() .MaybeAsASCII() @@ -257,7 +219,9 @@ session_manager_ = std::make_unique<protocol::JingleSessionManager>(signal_strategy_.get()); auto protocol_config = protocol::CandidateSessionConfig::CreateDefault(); - protocol_config->set_webrtc_supported(true); + bool use_chromotocol = base::CommandLine::ForCurrentProcess()->HasSwitch( + kSwitchNameUseChromotocol); + protocol_config->set_webrtc_supported(!use_chromotocol); session_manager_->set_protocol_config(std::move(protocol_config)); signal_strategy_->Connect(); @@ -266,8 +230,8 @@ void FtlSignalingPlayground::TearDownSignaling() { on_signaling_connected_callback_.Reset(); session_.reset(); - transport_.reset(); - transport_event_handler_.reset(); + webrtc_connection_.reset(); + ice_connection_.reset(); signal_strategy_->RemoveListener(this); session_manager_.reset(); signal_strategy_.reset(); @@ -277,6 +241,13 @@ std::unique_ptr<protocol::Session> session, protocol::TransportRole transport_role) { session_ = std::move(session); + transport_role_ = transport_role; + std::unique_ptr<protocol::SessionManager> session_manager( + new protocol::JingleSessionManager(signal_strategy_.get())); + session_->SetEventHandler(this); +} + +void FtlSignalingPlayground::InitializeTransport() { protocol::NetworkSettings network_settings( protocol::NetworkSettings::NAT_TRAVERSAL_FULL); auto transport_context = base::MakeRefCounted<protocol::TransportContext>( @@ -284,19 +255,24 @@ std::make_unique<protocol::ChromiumPortAllocatorFactory>(), std::make_unique<ChromiumUrlRequestFactory>( url_loader_factory_owner_->GetURLLoaderFactory()), - network_settings, transport_role); + network_settings, transport_role_); + transport_context->set_relay_mode( + protocol::TransportContext::RelayMode::TURN); transport_context->set_ice_config_url( ServiceUrls::GetInstance()->ice_config_url(), token_getter_.get()); - std::unique_ptr<protocol::SessionManager> session_manager( - new protocol::JingleSessionManager(signal_strategy_.get())); - transport_event_handler_ = std::make_unique<FakeTransportEventHandler>( + auto close_callback = base::BindOnce(&FtlSignalingPlayground::AsyncTearDownAndRunCallback, - base::Unretained(this))); - transport_ = std::make_unique<protocol::WebrtcTransport>( - jingle_glue::JingleThreadWrapper::current(), transport_context, - transport_event_handler_.get()); - session_->SetEventHandler(this); - session_->SetTransport(transport_.get()); + base::Unretained(this)); + if (session_->config().protocol() == + protocol::SessionConfig::Protocol::WEBRTC) { + webrtc_connection_ = std::make_unique<test::FakeWebrtcConnection>( + transport_context, std::move(close_callback)); + session_->SetTransport(webrtc_connection_->transport()); + } else { + ice_connection_ = std::make_unique<test::FakeIceConnection>( + transport_context, std::move(close_callback)); + session_->SetTransport(ice_connection_->transport()); + } } void FtlSignalingPlayground::OnSignalStrategyStateChange( @@ -350,12 +326,17 @@ case protocol::Session::INITIALIZING: case protocol::Session::CONNECTING: case protocol::Session::ACCEPTING: - case protocol::Session::ACCEPTED: case protocol::Session::AUTHENTICATING: // Don't care about these events. return; + case protocol::Session::ACCEPTED: + InitializeTransport(); + return; case protocol::Session::AUTHENTICATED: HOST_LOG << "Session is successfully authenticated!!!"; + if (ice_connection_) { + ice_connection_->OnAuthenticated(); + } return; case protocol::Session::CLOSED:
diff --git a/remoting/test/ftl_signaling_playground.h b/remoting/test/ftl_signaling_playground.h index 9256623..7c5b310 100644 --- a/remoting/test/ftl_signaling_playground.h +++ b/remoting/test/ftl_signaling_playground.h
@@ -15,10 +15,11 @@ #include "remoting/protocol/client_authentication_config.h" #include "remoting/protocol/session.h" #include "remoting/protocol/session_manager.h" -#include "remoting/protocol/webrtc_transport.h" #include "remoting/signaling/ftl_messaging_client.h" #include "remoting/signaling/ftl_registration_manager.h" #include "remoting/signaling/signal_strategy.h" +#include "remoting/test/fake_ice_connection.h" +#include "remoting/test/fake_webrtc_connection.h" namespace network { class TransitionalURLLoaderFactoryOwner; @@ -57,6 +58,7 @@ void TearDownSignaling(); void RegisterSession(std::unique_ptr<protocol::Session> session, protocol::TransportRole transport_role); + void InitializeTransport(); // SignalStrategy::Listener interface. void OnSignalStrategyStateChange(SignalStrategy::State state) override; @@ -76,10 +78,10 @@ std::unique_ptr<SignalStrategy> signal_strategy_; std::unique_ptr<protocol::SessionManager> session_manager_; - std::unique_ptr<protocol::WebrtcTransport::EventHandler> - transport_event_handler_; - std::unique_ptr<protocol::WebrtcTransport> transport_; + std::unique_ptr<test::FakeWebrtcConnection> webrtc_connection_; + std::unique_ptr<test::FakeIceConnection> ice_connection_; std::unique_ptr<protocol::Session> session_; + protocol::TransportRole transport_role_; base::OnceClosure current_callback_; base::OnceClosure on_signaling_connected_callback_;
diff --git a/services/network/proxy_resolving_client_socket.cc b/services/network/proxy_resolving_client_socket.cc index 754cc65e..2305e2f9 100644 --- a/services/network/proxy_resolving_client_socket.cc +++ b/services/network/proxy_resolving_client_socket.cc
@@ -16,12 +16,13 @@ #include "net/base/ip_address.h" #include "net/base/load_flags.h" #include "net/base/net_errors.h" +#include "net/base/privacy_mode.h" #include "net/http/http_auth_controller.h" #include "net/http/http_network_session.h" #include "net/http/proxy_client_socket.h" #include "net/http/proxy_fallback.h" #include "net/log/net_log_source_type.h" -#include "net/socket/client_socket_pool_manager.h" +#include "net/socket/socket_tag.h" #include "net/traffic_annotation/network_traffic_annotation.h" namespace network { @@ -269,14 +270,18 @@ int ProxyResolvingClientSocket::DoInitConnection() { DCHECK(!socket_); + // QUIC proxies are currently not supported. + DCHECK(!proxy_info_.is_quic()); next_state_ = STATE_INIT_CONNECTION_COMPLETE; // Now that the proxy is resolved, create and start a ConnectJob. - connect_job_ = net::CreateConnectJobForRawConnect( - net::HostPortPair::FromURL(url_), use_tls_, common_connect_job_params_, - net::MAXIMUM_PRIORITY, proxy_info_, ssl_config_, ssl_config_, net_log_, - this); + connect_job_ = net::ConnectJob::CreateConnectJob( + use_tls_, net::HostPortPair::FromURL(url_), proxy_info_.proxy_server(), + proxy_info_.traffic_annotation(), &ssl_config_, &ssl_config_, + true /* force_tunnel */, net::PRIVACY_MODE_DISABLED, + net::OnHostResolutionCallback(), net::MAXIMUM_PRIORITY, net::SocketTag(), + common_connect_job_params_, this); return connect_job_->Connect(); }
diff --git a/services/service_manager/sandbox/win/sandbox_win.cc b/services/service_manager/sandbox/win/sandbox_win.cc index feaddef..6592ad25 100644 --- a/services/service_manager/sandbox/win/sandbox_win.cc +++ b/services/service_manager/sandbox/win/sandbox_win.cc
@@ -570,8 +570,10 @@ // Note that this command line flag hasn't been fetched by all // callers of SetJobLevel, only those in this file. - if (service_manager::SandboxTypeFromCommandLine(cmd_line) == - service_manager::SANDBOX_TYPE_GPU) { + SandboxType sandbox_type = + service_manager::SandboxTypeFromCommandLine(cmd_line); + if (sandbox_type == service_manager::SANDBOX_TYPE_GPU || + sandbox_type == service_manager::SANDBOX_TYPE_RENDERER) { int64_t GB = 1024 * 1024 * 1024; // Allow the GPU process's sandbox to access more physical memory if // it's available on the system.
diff --git a/services/tracing/public/cpp/trace_event_args_whitelist.cc b/services/tracing/public/cpp/trace_event_args_whitelist.cc index 2e622d82..4904a7f 100644 --- a/services/tracing/public/cpp/trace_event_args_whitelist.cc +++ b/services/tracing/public/cpp/trace_event_args_whitelist.cc
@@ -29,7 +29,8 @@ const char* const kGetFallbackFontsAllowedArgs[] = {"script", nullptr}; const char* const kGPUAllowedArgs[] = {nullptr}; const char* const kInputLatencyAllowedArgs[] = {"data", nullptr}; -const char* const kMemoryDumpAllowedArgs[] = {"dumps", nullptr}; +const char* const kMemoryDumpAllowedArgs[] = {"dumps", "top_queued_message_tag", + nullptr}; const char* const kRendererHostAllowedArgs[] = { "class", "line", "should_background", "has_pending_views", "bytes_allocated", nullptr};
diff --git a/skia/BUILD.gn b/skia/BUILD.gn index 8f409578..f880df7 100644 --- a/skia/BUILD.gn +++ b/skia/BUILD.gn
@@ -32,9 +32,9 @@ include_dirs = [ "config", "ext", + "//third_party/skia/", "//third_party/skia/include/c", "//third_party/skia/include/codec", - "//third_party/skia/include/config", "//third_party/skia/include/core", "//third_party/skia/include/docs", "//third_party/skia/include/effects", @@ -56,6 +56,7 @@ defines = [ "SK_HAS_PNG_LIBRARY", "SK_HAS_WEBP_LIBRARY", + "SK_USER_CONFIG_HEADER=\"config/SkUserConfig.h\"", ] if (!is_ios) {
diff --git a/storage/browser/fileapi/file_system_dir_url_request_job_unittest.cc b/storage/browser/fileapi/file_system_dir_url_request_job_unittest.cc index 92ff1ff..a5f1012 100644 --- a/storage/browser/fileapi/file_system_dir_url_request_job_unittest.cc +++ b/storage/browser/fileapi/file_system_dir_url_request_job_unittest.cc
@@ -163,8 +163,9 @@ handlers.emplace_back(base::BindRepeating(&TestAutoMountForURLRequest)); file_system_context_ = CreateFileSystemContextWithAutoMountersForTesting( - nullptr, std::move(additional_providers), handlers, - temp_dir_.GetPath()); + base::ThreadTaskRunnerHandle::Get(), + base::ThreadTaskRunnerHandle::Get(), nullptr, + std::move(additional_providers), handlers, temp_dir_.GetPath()); } void OnOpenFileSystem(const GURL& root_url, @@ -378,7 +379,9 @@ CreateDirectory("foo"); scoped_refptr<FileSystemContext> file_system_context = - CreateIncognitoFileSystemContextForTesting(nullptr, temp_dir_.GetPath()); + CreateIncognitoFileSystemContextForTesting( + base::ThreadTaskRunnerHandle::Get(), + base::ThreadTaskRunnerHandle::Get(), nullptr, temp_dir_.GetPath()); TestRequestWithContext(CreateFileSystemURL("/"), file_system_context.get());
diff --git a/storage/browser/fileapi/file_system_url_request_job_unittest.cc b/storage/browser/fileapi/file_system_url_request_job_unittest.cc index 5c5a0c9c..d231a1e 100644 --- a/storage/browser/fileapi/file_system_url_request_job_unittest.cc +++ b/storage/browser/fileapi/file_system_url_request_job_unittest.cc
@@ -169,8 +169,9 @@ handlers.push_back(base::BindRepeating(&TestAutoMountForURLRequest)); file_system_context_ = CreateFileSystemContextWithAutoMountersForTesting( - nullptr, std::move(additional_providers), handlers, - temp_dir_.GetPath()); + base::ThreadTaskRunnerHandle::Get(), + base::ThreadTaskRunnerHandle::Get(), nullptr, + std::move(additional_providers), handlers, temp_dir_.GetPath()); ASSERT_EQ(static_cast<int>(sizeof(kTestFileData)) - 1, base::WriteFile(mnt_point.AppendASCII("foo"), kTestFileData, @@ -421,7 +422,9 @@ // Creates a new filesystem context for incognito mode. scoped_refptr<FileSystemContext> file_system_context = - CreateIncognitoFileSystemContextForTesting(nullptr, temp_dir_.GetPath()); + CreateIncognitoFileSystemContextForTesting( + base::ThreadTaskRunnerHandle::Get(), + base::ThreadTaskRunnerHandle::Get(), nullptr, temp_dir_.GetPath()); // The request should return NOT_FOUND error if it's in incognito mode. TestRequestWithContext(CreateFileSystemURL("file"),
diff --git a/storage/browser/fileapi/obfuscated_file_util_unittest.cc b/storage/browser/fileapi/obfuscated_file_util_unittest.cc index 2e69fa2..73c9ec7 100644 --- a/storage/browser/fileapi/obfuscated_file_util_unittest.cc +++ b/storage/browser/fileapi/obfuscated_file_util_unittest.cc
@@ -208,6 +208,8 @@ // We need to pass in the context to skip all that. file_system_context_ = in_memory_test() ? CreateIncognitoFileSystemContextForTesting( + base::ThreadTaskRunnerHandle::Get(), + base::ThreadTaskRunnerHandle::Get(), quota_manager_->proxy(), data_dir_.GetPath()) : CreateFileSystemContextForTesting( quota_manager_->proxy(), data_dir_.GetPath());
diff --git a/storage/browser/test/test_file_system_context.cc b/storage/browser/test/test_file_system_context.cc index dc6a7dd..e5a67b0 100644 --- a/storage/browser/test/test_file_system_context.cc +++ b/storage/browser/test/test_file_system_context.cc
@@ -47,14 +47,15 @@ } storage::FileSystemContext* CreateFileSystemContextWithAutoMountersForTesting( + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + scoped_refptr<base::SequencedTaskRunner> file_task_runner, storage::QuotaManagerProxy* quota_manager_proxy, std::vector<std::unique_ptr<storage::FileSystemBackend>> additional_providers, const std::vector<storage::URLRequestAutoMountHandler>& auto_mounters, const base::FilePath& base_path) { return new storage::FileSystemContext( - base::ThreadTaskRunnerHandle::Get().get(), - base::ThreadTaskRunnerHandle::Get().get(), + io_task_runner.get(), file_task_runner.get(), storage::ExternalMountPoints::CreateRefCounted().get(), base::MakeRefCounted<MockSpecialStoragePolicy>().get(), quota_manager_proxy, std::move(additional_providers), auto_mounters, @@ -62,11 +63,12 @@ } storage::FileSystemContext* CreateIncognitoFileSystemContextForTesting( + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + scoped_refptr<base::SequencedTaskRunner> file_task_runner, storage::QuotaManagerProxy* quota_manager_proxy, const base::FilePath& base_path) { return new storage::FileSystemContext( - base::ThreadTaskRunnerHandle::Get().get(), - base::ThreadTaskRunnerHandle::Get().get(), + io_task_runner.get(), file_task_runner.get(), storage::ExternalMountPoints::CreateRefCounted().get(), base::MakeRefCounted<MockSpecialStoragePolicy>().get(), quota_manager_proxy,
diff --git a/storage/browser/test/test_file_system_context.h b/storage/browser/test/test_file_system_context.h index 636c22e5..b06701f 100644 --- a/storage/browser/test/test_file_system_context.h +++ b/storage/browser/test/test_file_system_context.h
@@ -35,6 +35,8 @@ const base::FilePath& base_path); storage::FileSystemContext* CreateFileSystemContextWithAutoMountersForTesting( + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + scoped_refptr<base::SequencedTaskRunner> file_task_runner, storage::QuotaManagerProxy* quota_manager_proxy, std::vector<std::unique_ptr<storage::FileSystemBackend>> additional_providers, @@ -42,6 +44,8 @@ const base::FilePath& base_path); storage::FileSystemContext* CreateIncognitoFileSystemContextForTesting( + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + scoped_refptr<base::SequencedTaskRunner> file_task_runner, storage::QuotaManagerProxy* quota_manager_proxy, const base::FilePath& base_path);
diff --git a/testing/merge_scripts/code_coverage/merge_results.py b/testing/merge_scripts/code_coverage/merge_results.py index 06b570d5..ef49a6802 100755 --- a/testing/merge_scripts/code_coverage/merge_results.py +++ b/testing/merge_scripts/code_coverage/merge_results.py
@@ -38,7 +38,7 @@ '--additional-merge-script', help='additional merge script to run') parser.add_argument( '--additional-merge-script-args', - help='args for the additional merge script', action='append') + help='JSON serialized string of args for the additional merge script') parser.add_argument( '--profdata-dir', required=True, help='where to store the merged data') parser.add_argument( @@ -63,16 +63,17 @@ '--output-json', params.output_json, ] if params.additional_merge_script_args: - new_args += params.additional_merge_script_args + new_args += json.loads(params.additional_merge_script_args) new_args += params.jsons_to_merge - rc = subprocess.call([ - sys.executable, params.additional_merge_script] + new_args) + args = [ + sys.executable, params.additional_merge_script] + new_args + rc = subprocess.call(args) if rc != 0: failed = True logging.warning('Additional merge script %s exited with %s' % ( - params.additional_merge_script, p.returncode + params.additional_merge_script, rc )) invalid_profiles = coverage_merger.merge_profiles(
diff --git a/third_party/blink/perf_tests/layout/character_fallback_aat.html b/third_party/blink/perf_tests/layout/character_fallback_aat.html deleted file mode 100644 index 94d7e4d..0000000 --- a/third_party/blink/perf_tests/layout/character_fallback_aat.html +++ /dev/null
@@ -1,18 +0,0 @@ -<html> -<head> - <title>Character Font Fallback Performance with AAT fonts</title> -<script src="../resources/runner.js"></script> -<script src="resources/character_fallback_chars_aat.js"></script> -<script src="resources/character_fallback_test.js"></script> -<style> -#target { - /* Ensure AAT is in fallback on Mac, see crbug.com/547912 */ - font-family: Palatino, Times, 'Hiragino Mincho Pro'; -} -</style> -</head> -<body onload="startTest()"> - <pre id="log"></pre> - <div id="target"></div> -</body> -</html>
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h index 54c3e4b2..dd4a7aa 100644 --- a/third_party/blink/public/platform/web_runtime_features.h +++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -197,6 +197,7 @@ BLINK_PLATFORM_EXPORT static void EnableWebVR(bool); BLINK_PLATFORM_EXPORT static void EnableWebXR(bool); BLINK_PLATFORM_EXPORT static void EnableWebXRHitTest(bool); + BLINK_PLATFORM_EXPORT static void EnableXSLT(bool); BLINK_PLATFORM_EXPORT static void ForceOverlayFullscreenVideo(bool); BLINK_PLATFORM_EXPORT static void EnableTimerThrottlingForBackgroundTabs( bool);
diff --git a/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc b/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc index bd66a12..3abbaa3 100644 --- a/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc
@@ -544,12 +544,16 @@ const char* expected_activities = "blinkSetAttribute | LocalDOMWindow | url | about:blank | " "data:text/html;charset=utf-8,A\n" + "blinkRequestResource | Main resource | data:text/html;charset=utf-8,A\n" "blinkSetAttribute | LocalDOMWindow | url | about:blank | " "data:text/html;charset=utf-8,B\n" + "blinkRequestResource | Main resource | data:text/html;charset=utf-8,B\n" "blinkSetAttribute | LocalDOMWindow | url | about:blank | " "data:text/html;charset=utf-8,C\n" + "blinkRequestResource | Main resource | data:text/html;charset=utf-8,C\n" "blinkSetAttribute | LocalDOMWindow | url | about:blank | " "protocol:blank\n" + "blinkRequestResource | Main resource | protocol:blank\n" "blinkSetAttribute | LocalDOMWindow | url | about:blank | " "about:pathname\n" "blinkSetAttribute | LocalDOMWindow | url | about:blank | "
diff --git a/third_party/blink/renderer/core/dom/container_node.cc b/third_party/blink/renderer/core/dom/container_node.cc index 696c6d0f..827906e 100644 --- a/third_party/blink/renderer/core/dom/container_node.cc +++ b/third_party/blink/renderer/core/dom/container_node.cc
@@ -1022,7 +1022,7 @@ LayoutRect ContainerNode::BoundingBox() const { if (!GetLayoutObject()) return LayoutRect(); - return GetLayoutObject()->AbsoluteBoundingBoxRectHandlingEmptyAnchor(); + return GetLayoutObject()->AbsoluteBoundingBoxRectHandlingEmptyInline(); } // This is used by FrameSelection to denote when the active-state of the page
diff --git a/third_party/blink/renderer/core/dom/processing_instruction.cc b/third_party/blink/renderer/core/dom/processing_instruction.cc index 9543626..fce0804 100644 --- a/third_party/blink/renderer/core/dom/processing_instruction.cc +++ b/third_party/blink/renderer/core/dom/processing_instruction.cc
@@ -140,7 +140,7 @@ // We need to make a synthetic XSLStyleSheet that is embedded. // It needs to be able to kick off import/include loads that // can hang off some parent sheet. - if (is_xsl_) { + if (is_xsl_ && RuntimeEnabledFeatures::XSLTEnabled()) { KURL final_url(local_href_); sheet_ = XSLStyleSheet::CreateEmbedded(this, final_url); loading_ = false; @@ -150,6 +150,9 @@ ClearResource(); + if (is_xsl_ && !RuntimeEnabledFeatures::XSLTEnabled()) + return; + ResourceLoaderOptions options; options.initiator_info.name = fetch_initiator_type_names::kProcessinginstruction; @@ -157,6 +160,7 @@ options); loading_ = true; if (is_xsl_) { + DCHECK(RuntimeEnabledFeatures::XSLTEnabled()); params.MutableResourceRequest().SetFetchRequestMode( network::mojom::FetchRequestMode::kSameOrigin); XSLStyleSheetResource::Fetch(params, GetDocument().Fetcher(), this);
diff --git a/third_party/blink/renderer/core/frame/location.cc b/third_party/blink/renderer/core/frame/location.cc index 252415ff..30da8a3 100644 --- a/third_party/blink/renderer/core/frame/location.cc +++ b/third_party/blink/renderer/core/frame/location.cc
@@ -34,7 +34,7 @@ #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" #include "third_party/blink/renderer/core/frame/dom_window.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" -#include "third_party/blink/renderer/core/frame/local_frame.h" +#include "third_party/blink/renderer/core/loader/frame_load_request.h" #include "third_party/blink/renderer/core/loader/frame_loader.h" #include "third_party/blink/renderer/core/trustedtypes/trusted_types_util.h" #include "third_party/blink/renderer/core/url/dom_url_utils_read_only.h" @@ -317,14 +317,16 @@ argv.push_back(completed_url); activity_logger->LogEvent("blinkSetAttribute", argv.size(), argv.data()); } + + FrameLoadRequest request(current_window->document(), + ResourceRequest(completed_url)); + request.SetClientRedirectReason(ClientNavigationReason::kFrameNavigation); WebFrameLoadType frame_load_type = WebFrameLoadType::kStandard; if (set_location_policy == SetLocationPolicy::kReplaceThisFrame) frame_load_type = WebFrameLoadType::kReplaceCurrentItem; current_window->GetFrame()->MaybeLogAdClickNavigation(); - dom_window_->GetFrame()->ScheduleNavigation(*current_window->document(), - completed_url, frame_load_type, - UserGestureStatus::kNone); + dom_window_->GetFrame()->Navigate(request, frame_load_type); } Document* Location::GetDocument() const {
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc index 4cdfc37e..cd0bfdc 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.cc +++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -69,9 +69,6 @@ FrameLoadRequest frame_request(&origin_document, ResourceRequest(url)); frame_request.GetResourceRequest().SetHasUserGesture( user_gesture_status == UserGestureStatus::kActive); - frame_request.SetFrameType( - IsMainFrame() ? network::mojom::RequestContextFrameType::kTopLevel - : network::mojom::RequestContextFrameType::kNested); frame_request.SetClientRedirectReason( ClientNavigationReason::kFrameNavigation); Navigate(frame_request, frame_load_type); @@ -83,6 +80,9 @@ return; FrameLoadRequest frame_request(passed_request); + frame_request.SetFrameType( + IsMainFrame() ? network::mojom::RequestContextFrameType::kTopLevel + : network::mojom::RequestContextFrameType::kNested); const KURL& url = frame_request.GetResourceRequest().Url(); if (frame_request.OriginDocument() &&
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index 0a26858..16510c6 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -5998,8 +5998,7 @@ } ShapeOutsideInfo* LayoutBox::GetShapeOutsideInfo() const { - return ShapeOutsideInfo::IsEnabledFor(*this) ? ShapeOutsideInfo::Info(*this) - : nullptr; + return ShapeOutsideInfo::Info(*this); } void LayoutBox::ClearPreviousVisualRects() {
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc index 1e2dd3ec..909cc2e 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.cc +++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -1002,29 +1002,68 @@ context(FloatRect()); } -LayoutPoint LayoutInline::FirstLineBoxTopLeft() const { +base::Optional<LayoutPoint> LayoutInline::FirstLineBoxTopLeftInternal() const { if (IsInLayoutNGInlineFormattingContext()) { const NGPhysicalBoxFragment* box_fragment = ContainingBlockFlowFragmentOf(*this); if (!box_fragment) - return LayoutPoint(); + return base::nullopt; const auto& fragments = NGInlineFragmentTraversal::SelfFragmentsOf(*box_fragment, this); if (fragments.IsEmpty()) - return LayoutPoint(); + return base::nullopt; return fragments.front().offset_to_container_box.ToLayoutPoint(); } - if (InlineBox* first_box = FirstLineBoxIncludingCulling()) { + if (const InlineBox* first_box = FirstLineBoxIncludingCulling()) { LayoutPoint location = first_box->Location(); if (UNLIKELY(HasFlippedBlocksWritingMode())) { location = ContainingBlock()->FlipForWritingMode(location); - location.Move(-LinesBoundingBox().Width(), LayoutUnit()); + location.Move(-first_box->Width(), LayoutUnit()); } return location; } + return base::nullopt; +} + +LayoutPoint LayoutInline::AnchorPhysicalLocation() const { + if (const auto& location = FirstLineBoxTopLeftInternal()) + return *location; + // This object doesn't have fragment/line box, probably because it's an empty + // and at the beginning/end of a line. Query sibling or parent. + // TODO(crbug.com/953479): We won't need this if we always create line box + // for empty inline elements. The following algorithm works in most cases for + // anchor elements, though may be inaccurate in some corner cases (e.g. if the + // sibling is not in the same line). + if (const auto* sibling = NextSibling()) { + if (sibling->IsLayoutInline()) + return ToLayoutInline(sibling)->AnchorPhysicalLocation(); + if (sibling->IsText()) + return ToLayoutText(sibling)->FirstLineBoxTopLeft(); + if (sibling->IsBox()) + return ToLayoutBox(sibling)->PhysicalLocation(); + } + if (Parent()->IsLayoutInline()) + return ToLayoutInline(Parent())->AnchorPhysicalLocation(); return LayoutPoint(); } +LayoutRect LayoutInline::AbsoluteBoundingBoxRectHandlingEmptyInline() const { + Vector<LayoutRect> rects; + AddOutlineRects(rects, LayoutPoint(), + NGOutlineType::kIncludeBlockVisualOverflow); + LayoutRect rect = UnionRect(rects); + if (rects.IsEmpty()) { + LayoutPoint location = AnchorPhysicalLocation(); + // AnchorPhysicalLocation is pure physical, while LocalToAbsolute() requires + // physical coordinates with flipped block direction. + if (UNLIKELY(HasFlippedBlocksWritingMode())) + location = ContainingBlock()->FlipForWritingMode(location); + rect.SetLocation(location); + } + return LayoutRect(LocalToAbsoluteQuad(FloatRect(rect), kUseTransforms) + .EnclosingBoundingBox()); +} + LayoutUnit LayoutInline::OffsetLeft(const Element* parent) const { return AdjustedPositionRelativeTo(FirstLineBoxTopLeft(), parent).X(); }
diff --git a/third_party/blink/renderer/core/layout/layout_inline.h b/third_party/blink/renderer/core/layout/layout_inline.h index afeb9ea..d11eab6 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.h +++ b/third_party/blink/renderer/core/layout/layout_inline.h
@@ -247,12 +247,16 @@ const LayoutPoint& accumulated_offset, const NGPaintFragment* parent_fragment = nullptr); - LayoutPoint FirstLineBoxTopLeft() const; + LayoutPoint FirstLineBoxTopLeft() const { + return FirstLineBoxTopLeftInternal().value_or(LayoutPoint()); + } void MapLocalToAncestor(const LayoutBoxModelObject* ancestor, TransformState&, MapCoordinatesFlags mode) const override; + LayoutRect AbsoluteBoundingBoxRectHandlingEmptyInline() const final; + const char* GetName() const override { return "LayoutInline"; } LayoutRect DebugRect() const override; @@ -390,6 +394,9 @@ LayoutBoxModelObject* ContinuationBefore(LayoutObject* before_child); + base::Optional<LayoutPoint> FirstLineBoxTopLeftInternal() const; + LayoutPoint AnchorPhysicalLocation() const; + LayoutObjectChildList children_; union {
diff --git a/third_party/blink/renderer/core/layout/layout_inline_test.cc b/third_party/blink/renderer/core/layout/layout_inline_test.cc index 8609c78..a05833e 100644 --- a/third_party/blink/renderer/core/layout/layout_inline_test.cc +++ b/third_party/blink/renderer/core/layout/layout_inline_test.cc
@@ -374,4 +374,95 @@ LayoutRect(0, 55, 160, 20))); // 'CONTENTS' } +TEST_P(ParameterizedLayoutInlineTest, + AbsoluteBoundingBoxRectHandlingEmptyInline) { + LoadAhem(); + SetBodyInnerHTML(R"HTML( + <style> + body { + margin: 30px 50px; + font: 20px/20px Ahem; + } + </style> + <br><br> + <span id="target1"></span><br> + <span id="target2"></span>after<br> + <span id="target3"></span><span>after</span><br> + <span id="target4"></span><img style="width: 16px; height: 16px"><br> + <span><span><span id="target5"></span></span></span><span>after</span><br> + <span id="target6"> + <img style="width: 30px; height: 30px"> + <div style="width: 100px; height: 100px"></div> + <img style="width: 30px; height: 30px"> + </span> + )HTML"); + + EXPECT_EQ(LayoutRect(50, 70, 0, 0), + GetLayoutObjectByElementId("target1") + ->AbsoluteBoundingBoxRectHandlingEmptyInline()); + EXPECT_EQ(LayoutRect(50, 90, 0, 0), + GetLayoutObjectByElementId("target2") + ->AbsoluteBoundingBoxRectHandlingEmptyInline()); + EXPECT_EQ(LayoutRect(50, 110, 0, 0), + GetLayoutObjectByElementId("target3") + ->AbsoluteBoundingBoxRectHandlingEmptyInline()); + EXPECT_EQ(LayoutRect(50, 130, 0, 0), + GetLayoutObjectByElementId("target4") + ->AbsoluteBoundingBoxRectHandlingEmptyInline()); + EXPECT_EQ(LayoutRect(50, 150, 0, 0), + GetLayoutObjectByElementId("target5") + ->AbsoluteBoundingBoxRectHandlingEmptyInline()); + // This rect covers the overflowing images and continuations. + // 168 = (30 + 4) * 2 + 100. 4 is the descent of the font. + EXPECT_EQ(LayoutRect(50, 170, 100, 168), + GetLayoutObjectByElementId("target6") + ->AbsoluteBoundingBoxRectHandlingEmptyInline()); +} + +TEST_P(ParameterizedLayoutInlineTest, + AbsoluteBoundingBoxRectHandlingEmptyInlineVerticalRL) { + LoadAhem(); + SetBodyInnerHTML(R"HTML( + <style> + body { + margin: 30px 50px; + font: 20px/20px Ahem; + } + </style> + <br><br> + <div style="width: 600px; height: 400px; writing-mode: vertical-rl"> + <span id="target1"></span><br> + <span id="target2"></span>after<br> + <span id="target3"></span><span>after</span><br> + <span id="target4"></span><img style="width: 20px; height: 20px"><br> + <span><span><span id="target5"></span></span></span><span>after</span><br> + <span id="target6"> + <img style="width: 30px; height: 30px"> + <div style="width: 100px; height: 100px"></div> + <img style="width: 30px; height: 30px"> + </span> + </div> + )HTML"); + + EXPECT_EQ(LayoutRect(630, 70, 0, 0), + GetLayoutObjectByElementId("target1") + ->AbsoluteBoundingBoxRectHandlingEmptyInline()); + EXPECT_EQ(LayoutRect(610, 70, 0, 0), + GetLayoutObjectByElementId("target2") + ->AbsoluteBoundingBoxRectHandlingEmptyInline()); + EXPECT_EQ(LayoutRect(590, 70, 0, 0), + GetLayoutObjectByElementId("target3") + ->AbsoluteBoundingBoxRectHandlingEmptyInline()); + EXPECT_EQ(LayoutRect(570, 70, 0, 0), + GetLayoutObjectByElementId("target4") + ->AbsoluteBoundingBoxRectHandlingEmptyInline()); + EXPECT_EQ(LayoutRect(550, 70, 0, 0), + GetLayoutObjectByElementId("target5") + ->AbsoluteBoundingBoxRectHandlingEmptyInline()); + // This rect covers the overflowing images and continuations. + EXPECT_EQ(LayoutRect(390, 70, 160, 100), + GetLayoutObjectByElementId("target6") + ->AbsoluteBoundingBoxRectHandlingEmptyInline()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index 1fba1ef..5e28dad 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -1280,237 +1280,18 @@ return result; } -LayoutRect LayoutObject::AbsoluteBoundingBoxRectHandlingEmptyAnchor() const { - return AbsoluteBoundingBoxRectHelper(ExpandScrollMargin::kIgnore); +LayoutRect LayoutObject::AbsoluteBoundingBoxRectHandlingEmptyInline() const { + return EnclosingLayoutRect(AbsoluteBoundingBoxFloatRect()); } LayoutRect LayoutObject::AbsoluteBoundingBoxRectForScrollIntoView() const { - return AbsoluteBoundingBoxRectHelper(ExpandScrollMargin::kExpand); -} - -LayoutRect LayoutObject::AbsoluteBoundingBoxRectHelper( - ExpandScrollMargin expand) const { - FloatPoint upper_left, lower_right; - bool found_upper_left = GetUpperLeftCorner(expand, upper_left); - bool found_lower_right = GetLowerRightCorner(expand, lower_right); - - // If we've found one corner, but not the other, - // then we should just return a point at the corner that we did find. - if (found_upper_left != found_lower_right) { - if (found_upper_left) - lower_right = upper_left; - else - upper_left = lower_right; - } - - FloatSize size = lower_right.ExpandedTo(upper_left) - upper_left; - if (std::isnan(size.Width()) || std::isnan(size.Height())) - return LayoutRect(); - - return EnclosingLayoutRect(FloatRect(upper_left, size)); -} - -namespace { - -enum class MarginCorner { kTopLeft, kBottomRight }; - -void MovePointByScrollMargin(const LayoutObject* layout_object, - MarginCorner corner, - FloatPoint& point) { - FloatSize offset; - const ComputedStyle* style = layout_object->Style(); - - if (corner == MarginCorner::kTopLeft) - offset = FloatSize(-style->ScrollMarginLeft(), -style->ScrollMarginTop()); - else - offset = FloatSize(style->ScrollMarginRight(), style->ScrollMarginBottom()); - - point.Move(offset); -} - -inline const LayoutObject* EndOfContinuations( - const LayoutObject* layout_object) { - const LayoutObject* prev = nullptr; - const LayoutObject* cur = layout_object; - - if (!cur->IsLayoutInline() && !cur->IsLayoutBlockFlow()) - return nullptr; - - while (cur) { - prev = cur; - if (cur->IsLayoutInline()) - cur = ToLayoutInline(cur)->Continuation(); - else - cur = To<LayoutBlockFlow>(cur)->Continuation(); - } - - return prev; -} - -} // namespace - -bool LayoutObject::GetUpperLeftCorner(ExpandScrollMargin expand, - FloatPoint& point) const { - if (IsSVGChild()) { - point = LocalToAbsoluteQuad(StrokeBoundingBox(), kUseTransforms) - .BoundingBox() - .MinXMinYCorner(); - if (expand == ExpandScrollMargin::kExpand) - MovePointByScrollMargin(this, MarginCorner::kTopLeft, point); - return true; - } - if (!IsInline() || IsAtomicInlineLevel()) { - point = LocalToAbsolute(FloatPoint(), kUseTransforms); - if (expand == ExpandScrollMargin::kExpand) - MovePointByScrollMargin(this, MarginCorner::kTopLeft, point); - return true; - } - - // Find the next text/image child, to get a position. - const LayoutObject* runner = this; - while (runner) { - const LayoutObject* const previous = runner; - if (LayoutObject* runner_first_child = runner->SlowFirstChild()) { - runner = runner_first_child; - } else if (runner->NextSibling()) { - runner = runner->NextSibling(); - } else { - LayoutObject* next = nullptr; - while (!next && runner->Parent()) { - runner = runner->Parent(); - next = runner->NextSibling(); - } - runner = next; - - if (!runner) - break; - } - DCHECK(runner); - - if (!runner->IsInline() || runner->IsAtomicInlineLevel()) { - point = runner->LocalToAbsolute(FloatPoint(), kUseTransforms); - if (expand == ExpandScrollMargin::kExpand) - MovePointByScrollMargin(runner, MarginCorner::kTopLeft, point); - return true; - } - - if (runner->IsText() && !runner->IsBR()) { - const base::Optional<FloatPoint> maybe_point = - ToLayoutText(runner)->GetUpperLeftCorner(); - if (maybe_point.has_value()) { - point = runner->LocalToAbsolute(maybe_point.value(), kUseTransforms); - return true; - } - if (previous->GetNode() == GetNode()) { - // Do nothing - skip unrendered whitespace that is a child or next - // sibling of the anchor. - // FIXME: This fails to skip a whitespace sibling when there was also a - // whitespace child (because |previous| has moved). - continue; - } - point = runner->LocalToAbsolute(FloatPoint(), kUseTransforms); - if (expand == ExpandScrollMargin::kExpand) - MovePointByScrollMargin(runner, MarginCorner::kTopLeft, point); - return true; - } - - if (runner->IsAtomicInlineLevel()) { - DCHECK(runner->IsBox()); - const LayoutBox* box = ToLayoutBox(runner); - point = FloatPoint(box->Location()); - point = runner->Container()->LocalToAbsolute(point, kUseTransforms); - if (expand == ExpandScrollMargin::kExpand) - MovePointByScrollMargin(box, MarginCorner::kTopLeft, point); - return true; - } - } - - // If the target doesn't have any children or siblings that could be used to - // calculate the scroll position, we must be at the end of the - // document. Scroll to the bottom. - // FIXME: who said anything about scrolling? - if (!runner && GetDocument().View()) { - point = FloatPoint( - 0, GetDocument().View()->LayoutViewport()->ContentsSize().Height()); - return true; - } - return false; -} - -bool LayoutObject::GetLowerRightCorner(ExpandScrollMargin expand, - FloatPoint& point) const { - if (IsSVGChild()) { - point = LocalToAbsoluteQuad(StrokeBoundingBox(), kUseTransforms) - .BoundingBox() - .MaxXMaxYCorner(); - if (expand == ExpandScrollMargin::kExpand) - MovePointByScrollMargin(this, MarginCorner::kBottomRight, point); - return true; - } - if (!IsInline() || IsAtomicInlineLevel()) { - const LayoutBox* box = ToLayoutBox(this); - point = LocalToAbsolute(FloatPoint(box->Size()), kUseTransforms); - if (expand == ExpandScrollMargin::kExpand) - MovePointByScrollMargin(this, MarginCorner::kBottomRight, point); - return true; - } - - const LayoutObject* runner = this; - const LayoutObject* start_continuation = nullptr; - // Find the last text/image child, to get a position. - while (runner) { - if (LayoutObject* runner_last_child = runner->SlowLastChild()) { - runner = runner_last_child; - } else if (runner != this && runner->PreviousSibling()) { - runner = runner->PreviousSibling(); - } else { - const LayoutObject* prev = nullptr; - while (!prev) { - // Check if the current layoutObject has contiunation and move the - // location for finding the layoutObject to the end of continuations if - // there is the continuation. Skip to check the contiunation on - // contiunations section - if (start_continuation == runner) { - start_continuation = nullptr; - } else if (!start_continuation) { - if (const LayoutObject* continuation = EndOfContinuations(runner)) { - start_continuation = runner; - prev = continuation; - break; - } - } - // Prevent to overrun out of own layout tree - if (runner == this) { - return false; - } - runner = runner->Parent(); - if (!runner) - return false; - prev = runner->PreviousSibling(); - } - runner = prev; - } - DCHECK(runner); - if (runner->IsText() || runner->IsAtomicInlineLevel()) { - point = FloatPoint(); - if (runner->IsText()) { - const LayoutText* text = ToLayoutText(runner); - IntRect lines_box = EnclosingIntRect(text->LinesBoundingBox()); - if (!lines_box.MaxX() && !lines_box.MaxY()) - continue; - point.MoveBy(lines_box.MaxXMaxYCorner()); - point = runner->LocalToAbsolute(point, kUseTransforms); - } else { - const LayoutBox* box = ToLayoutBox(runner); - point.MoveBy(FloatPoint(box->FrameRect().MaxXMaxYCorner())); - point = runner->Container()->LocalToAbsolute(point, kUseTransforms); - if (expand == ExpandScrollMargin::kExpand) - MovePointByScrollMargin(box, MarginCorner::kBottomRight, point); - } - return true; - } - } - return true; + LayoutRect rect = AbsoluteBoundingBoxRectHandlingEmptyInline(); + const auto& style = StyleRef(); + rect.ExpandEdges(LayoutUnit(style.ScrollMarginTop()), + LayoutUnit(style.ScrollMarginRight()), + LayoutUnit(style.ScrollMarginBottom()), + LayoutUnit(style.ScrollMarginLeft())); + return rect; } FloatRect LayoutObject::AbsoluteBoundingBoxRectForRange( @@ -3858,6 +3639,12 @@ image); } } + if (RuntimeEnabledFeatures::FirstContentfulPaintPlusPlusEnabled()) { + if (LocalFrameView* frame_view = GetFrameView()) { + frame_view->GetPaintTimingDetector().NotifyBackgroundImageRemoved(*this, + image); + } + } } PositionWithAffinity LayoutObject::CreatePositionWithAffinity(
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h index cd56168..3537e8e1 100644 --- a/third_party/blink/renderer/core/layout/layout_object.h +++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -1553,10 +1553,16 @@ IntRect AbsoluteBoundingBoxRect(MapCoordinatesFlags = 0) const; // FIXME: This function should go away eventually IntRect AbsoluteBoundingBoxRectIgnoringTransforms() const; - // These two handles inline anchors without content as well. - LayoutRect AbsoluteBoundingBoxRectHandlingEmptyAnchor() const; + + // These two functions also handle inlines without content for which the + // location of the result rect (which may be empty) should be the absolute + // location of the inline. This is especially useful to get the bounding + // box of named anchors. + // TODO(crbug.com/953479): After the bug is fixed, investigate whether we + // can combine this with AbsoluteBoundingBoxRect(). + virtual LayoutRect AbsoluteBoundingBoxRectHandlingEmptyInline() const; // This returns an IntRect expanded from - // AbsoluteBoundingBoxRectHandlingEmptyAnchor by ScrollMargin. + // AbsoluteBoundingBoxRectHandlingEmptyInline by ScrollMargin. LayoutRect AbsoluteBoundingBoxRectForScrollIntoView() const; // Build an array of quads in absolute coords for line boxes @@ -2519,13 +2525,6 @@ const ComputedStyle* CachedFirstLineStyle() const; StyleDifference AdjustStyleDifference(StyleDifference) const; - // These are helper functions for AbsoluteBoudingBoxRectHandlingEmptyAnchor() - // and AbsoluteBoundingBoxRectForScrollIntoView(). - enum class ExpandScrollMargin { kExpand, kIgnore }; - LayoutRect AbsoluteBoundingBoxRectHelper(ExpandScrollMargin) const; - bool GetUpperLeftCorner(ExpandScrollMargin, FloatPoint&) const; - bool GetLowerRightCorner(ExpandScrollMargin, FloatPoint&) const; - #if DCHECK_IS_ON() void CheckBlockPositionedObjectsNeedLayout(); #endif
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc index 0717b97..56fbebcd 100644 --- a/third_party/blink/renderer/core/layout/layout_text.cc +++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -338,30 +338,6 @@ return results; } -base::Optional<FloatPoint> LayoutText::GetUpperLeftCorner() const { - DCHECK(!IsBR()); - if (HasLegacyTextBoxes()) { - if (StyleRef().IsHorizontalWritingMode()) { - return FloatPoint(LinesBoundingBox().X(), - FirstTextBox()->Root().LineTop().ToFloat()); - } - return FloatPoint(FirstTextBox()->Root().LineTop().ToFloat(), - LinesBoundingBox().Y()); - } - auto fragments = NGPaintFragment::InlineFragmentsFor(this); - if (!fragments.IsEmpty()) { - const NGPaintFragment* line_box = fragments.begin()->ContainerLineBox(); - DCHECK(line_box); - if (StyleRef().IsHorizontalWritingMode()) { - return FloatPoint(LinesBoundingBox().X(), - line_box->InlineOffsetToContainerBox().top.ToFloat()); - } - return FloatPoint(line_box->InlineOffsetToContainerBox().left.ToFloat(), - LinesBoundingBox().Y()); - } - return base::nullopt; -} - bool LayoutText::HasTextBoxes() const { if (RuntimeEnabledFeatures::LayoutNGEnabled()) { auto fragments = NGPaintFragment::InlineFragmentsFor(this); @@ -1600,19 +1576,18 @@ return 0; } -FloatPoint LayoutText::FirstRunOrigin() const { - if (const NGPaintFragment* fragment = FirstInlineFragment()) { - LayoutPoint origin = fragment->InlineOffsetToContainerBox().ToLayoutPoint(); +LayoutPoint LayoutText::FirstLineBoxTopLeft() const { + if (const NGPaintFragment* fragment = FirstInlineFragment()) + return fragment->InlineOffsetToContainerBox().ToLayoutPoint(); + if (const auto* text_box = FirstTextBox()) { + auto location = text_box->Location(); if (UNLIKELY(HasFlippedBlocksWritingMode())) { - LayoutRect line_box_rect(origin, fragment->Size().ToLayoutSize()); - ContainingBlock()->FlipForWritingMode(line_box_rect); - return FloatPoint(line_box_rect.Location()); + location = ContainingBlock()->FlipForWritingMode(location); + location.Move(-text_box->Width(), LayoutUnit()); } - return FloatPoint(origin); + return location; } - if (const auto* text_box = FirstTextBox()) - return FloatPoint(text_box->Location()); - return FloatPoint(); + return LayoutPoint(); } bool LayoutText::CanOptimizeSetText() const {
diff --git a/third_party/blink/renderer/core/layout/layout_text.h b/third_party/blink/renderer/core/layout/layout_text.h index 99d08167..d066db0 100644 --- a/third_party/blink/renderer/core/layout/layout_text.h +++ b/third_party/blink/renderer/core/layout/layout_text.h
@@ -191,7 +191,7 @@ // Returns the bounding box of visual overflow rects of all line boxes. LayoutRect VisualOverflowRect() const; - FloatPoint FirstRunOrigin() const; + LayoutPoint FirstLineBoxTopLeft() const; virtual void SetText(scoped_refptr<StringImpl>, bool force = false, @@ -222,10 +222,6 @@ InlineTextBox* FirstTextBox() const { return TextBoxes().First(); } InlineTextBox* LastTextBox() const { return TextBoxes().Last(); } - // Returns upper left corner point in local physical coordinates with flipped - // block-flow direction if this object has rendered text. - base::Optional<FloatPoint> GetUpperLeftCorner() const; - // True if we have inline text box children which implies rendered text (or // whitespace) output. bool HasTextBoxes() const;
diff --git a/third_party/blink/renderer/core/layout/layout_text_test.cc b/third_party/blink/renderer/core/layout/layout_text_test.cc index 324f7e9..62d8fb3 100644 --- a/third_party/blink/renderer/core/layout/layout_text_test.cc +++ b/third_party/blink/renderer/core/layout/layout_text_test.cc
@@ -549,41 +549,6 @@ EXPECT_TRUE(GetBasicText()->IsAfterNonCollapsedCharacter(1)); } -TEST_P(ParameterizedLayoutTextTest, GetUpperLeftCorner) { - LoadAhem(); - SetBodyInnerHTML(R"HTML( - <style> - div { - font: 10px/1 Ahem; - width: 5em; - } - </style> - <div>12345 123<span id="target">45</span></div> - )HTML"); - LayoutText* layout_text = GetLayoutTextById("target"); - base::Optional<FloatPoint> upper_left = layout_text->GetUpperLeftCorner(); - EXPECT_TRUE(upper_left.has_value()); - EXPECT_EQ(FloatPoint(30, 10), upper_left.value()); -} - -TEST_P(ParameterizedLayoutTextTest, GetUpperLeftCornerVLR) { - LoadAhem(); - SetBodyInnerHTML(R"HTML( - <style> - div { - font: 10px/1 Ahem; - height: 5em; - writing-mode: vertical-lr; - } - </style> - <div>12345 123<span id="target">45</span></div> - )HTML"); - LayoutText* layout_text = GetLayoutTextById("target"); - base::Optional<FloatPoint> upper_left = layout_text->GetUpperLeftCorner(); - EXPECT_TRUE(upper_left.has_value()); - EXPECT_EQ(FloatPoint(10, 30), upper_left.value()); -} - TEST_P(ParameterizedLayoutTextTest, AbsoluteRects) { LoadAhem(); SetBodyInnerHTML(R"HTML(
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc index d36e73f..166b0ab 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc
@@ -570,10 +570,6 @@ DCHECK(&item_shape_result); item.AssertOffset(item_result->start_offset); - // TODO(kojii): We need to instantiate ShapingLineBreaker here because it - // has item-specific info as context. Should they be part of ShapeLine() to - // instantiate once, or is this just fine since instatiation is not - // expensive? DCHECK_EQ(item_shape_result.StartIndex(), item.StartOffset()); DCHECK_EQ(item_shape_result.EndIndex(), item.EndOffset()); struct ShapeCallbackContext {
diff --git a/third_party/blink/renderer/core/layout/shapes/shape_outside_info.cc b/third_party/blink/renderer/core/layout/shapes/shape_outside_info.cc index b2c7dbc..81a6e3c1 100644 --- a/third_party/blink/renderer/core/layout/shapes/shape_outside_info.cc +++ b/third_party/blink/renderer/core/layout/shapes/shape_outside_info.cc
@@ -478,10 +478,4 @@ return result; } -FloatSize ShapeOutsideInfo::ShapeToLayoutObjectSize(FloatSize size) const { - if (!layout_box_.StyleRef().IsHorizontalWritingMode()) - return size.TransposedSize(); - return size; -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/shapes/shape_outside_info.h b/third_party/blink/renderer/core/layout/shapes/shape_outside_info.h index b2ac9f0..47322a5 100644 --- a/third_party/blink/renderer/core/layout/shapes/shape_outside_info.h +++ b/third_party/blink/renderer/core/layout/shapes/shape_outside_info.h
@@ -97,34 +97,10 @@ void SetReferenceBoxLogicalSize(LayoutSize); void SetPercentageResolutionInlineSize(LayoutUnit); - LayoutUnit ShapeLogicalTop() const { - return ComputedShape().ShapeMarginLogicalBoundingBox().Y() + - LogicalTopOffset(); - } LayoutUnit ShapeLogicalBottom() const { return ComputedShape().ShapeMarginLogicalBoundingBox().MaxY() + LogicalTopOffset(); } - LayoutUnit ShapeLogicalLeft() const { - return ComputedShape().ShapeMarginLogicalBoundingBox().X() + - LogicalLeftOffset(); - } - LayoutUnit ShapeLogicalRight() const { - return ComputedShape().ShapeMarginLogicalBoundingBox().MaxX() + - LogicalLeftOffset(); - } - LayoutUnit ShapeLogicalWidth() const { - return ComputedShape().ShapeMarginLogicalBoundingBox().Width(); - } - LayoutUnit ShapeLogicalHeight() const { - return ComputedShape().ShapeMarginLogicalBoundingBox().Height(); - } - - static std::unique_ptr<ShapeOutsideInfo> CreateInfo( - const LayoutBox& layout_box) { - return base::WrapUnique(new ShapeOutsideInfo(layout_box)); - } - static bool IsEnabledFor(const LayoutBox&); ShapeOutsideDeltas ComputeDeltasForContainingBlockLine( const LineLayoutBlockFlow&, @@ -137,24 +113,22 @@ if (ShapeOutsideInfo* info = info_map.at(&key)) return *info; InfoMap::AddResult result = - info_map.insert(&key, ShapeOutsideInfo::CreateInfo(key)); + info_map.insert(&key, base::WrapUnique(new ShapeOutsideInfo(key))); return *result.stored_value->value; } static void RemoveInfo(const LayoutBox& key) { GetInfoMap().erase(&key); } static ShapeOutsideInfo* Info(const LayoutBox& key) { + if (!IsEnabledFor(key)) + return nullptr; return GetInfoMap().at(&key); } - static bool IsEmpty() { return GetInfoMap().IsEmpty(); } - void MarkShapeAsDirty() { shape_.reset(); } bool IsShapeDirty() { return !shape_.get(); } - LayoutSize ShapeSize() const { return reference_box_logical_size_; } bool IsComputingShape() const { return is_computing_shape_; } LayoutRect ComputedShapePhysicalBoundingBox() const; FloatPoint ShapeToLayoutObjectPoint(FloatPoint) const; - FloatSize ShapeToLayoutObjectSize(FloatSize) const; const Shape& ComputedShape() const; protected: @@ -162,6 +136,8 @@ : layout_box_(layout_box), is_computing_shape_(false) {} private: + static bool IsEnabledFor(const LayoutBox&); + std::unique_ptr<Shape> CreateShapeForImage(StyleImage*, float shape_image_threshold, WritingMode,
diff --git a/third_party/blink/renderer/core/layout/visual_rect_mapping_test.cc b/third_party/blink/renderer/core/layout/visual_rect_mapping_test.cc index cb240ad..fcf0d3b 100644 --- a/third_party/blink/renderer/core/layout/visual_rect_mapping_test.cc +++ b/third_party/blink/renderer/core/layout/visual_rect_mapping_test.cc
@@ -63,17 +63,6 @@ return; } - // The following condition can be false if paintInvalidationContainer is - // a LayoutView and compositing is not enabled. - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled() && - ancestor.IsPaintInvalidationContainer()) { - PaintLayer::MapRectInPaintInvalidationContainerToBacking(ancestor, - slow_map_rect); - LayoutRect temp(geometry_mapper_rect.Rect()); - PaintLayer::MapRectInPaintInvalidationContainerToBacking(ancestor, temp); - geometry_mapper_rect = FloatClipRect(FloatRect(temp)); - } - if (flags & kContainsEnclosingIntRect) { EXPECT_TRUE( EnclosingIntRect(slow_map_rect)
diff --git a/third_party/blink/renderer/core/loader/resource/xsl_style_sheet_resource.cc b/third_party/blink/renderer/core/loader/resource/xsl_style_sheet_resource.cc index a2ff23a..47acd28 100644 --- a/third_party/blink/renderer/core/loader/resource/xsl_style_sheet_resource.cc +++ b/third_party/blink/renderer/core/loader/resource/xsl_style_sheet_resource.cc
@@ -29,6 +29,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/loader/fetch/text_resource_decoder_options.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" namespace blink { @@ -61,6 +62,7 @@ XSLStyleSheetResource* XSLStyleSheetResource::Fetch(FetchParameters& params, ResourceFetcher* fetcher, ResourceClient* client) { + DCHECK(RuntimeEnabledFeatures::XSLTEnabled()); ApplyXSLRequestProperties(params); return ToXSLStyleSheetResource( fetcher->RequestResource(params, XSLStyleSheetResourceFactory(), client));
diff --git a/third_party/blink/renderer/core/paint/box_painter_base.cc b/third_party/blink/renderer/core/paint/box_painter_base.cc index 2fdf041f..96936207 100644 --- a/third_party/blink/renderer/core/paint/box_painter_base.cc +++ b/third_party/blink/renderer/core/paint/box_painter_base.cc
@@ -549,7 +549,7 @@ if (RuntimeEnabledFeatures::FirstContentfulPaintPlusPlusEnabled()) { if (info.image && info.image->IsImageResource()) { PaintTimingDetector::NotifyBackgroundImagePaint( - node, image, info.image, + node, image, info.image->CachedImage(), paint_info.context.GetPaintController() .CurrentPaintChunkProperties()); } @@ -682,7 +682,7 @@ if (RuntimeEnabledFeatures::FirstContentfulPaintPlusPlusEnabled()) { if (info.image && info.image->IsImageResource()) { PaintTimingDetector::NotifyBackgroundImagePaint( - node, image, info.image, + node, image, info.image->CachedImage(), context.GetPaintController().CurrentPaintChunkProperties()); } }
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc b/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc index a96e84dd..fccd7475 100644 --- a/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc +++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc
@@ -5,7 +5,6 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/inspector/identifiers_factory.h" -#include "third_party/blink/renderer/core/layout/layout_box_model_object.h" #include "third_party/blink/renderer/core/layout/layout_image.h" #include "third_party/blink/renderer/core/layout/layout_image_resource.h" #include "third_party/blink/renderer/core/layout/layout_video.h" @@ -18,46 +17,12 @@ #include "third_party/blink/renderer/core/style/style_fetched_image.h" #include "third_party/blink/renderer/platform/geometry/layout_rect.h" #include "third_party/blink/renderer/platform/graphics/image.h" -#include "third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h" namespace blink { namespace { -#ifndef NDEBUG -String GetImageUrl(const LayoutObject& object) { - if (object.IsLayoutImage()) { - const ImageResourceContent* cached_image = - ToLayoutImage(&object)->CachedImage(); - return cached_image ? cached_image->Url().StrippedForUseAsReferrer() : ""; - } - if (object.IsVideo()) { - const ImageResourceContent* cached_image = - ToLayoutVideo(&object)->CachedImage(); - return cached_image ? cached_image->Url().StrippedForUseAsReferrer() : ""; - } - if (object.IsSVGImage()) { - const LayoutImageResource* image_resource = - ToLayoutSVGImage(&object)->ImageResource(); - const ImageResourceContent* cached_image = image_resource->CachedImage(); - return cached_image ? cached_image->Url().StrippedForUseAsReferrer() : ""; - } - DCHECK(ImagePaintTimingDetector::HasBackgroundImage(object)); - const ComputedStyle* style = object.Style(); - StringBuilder concatenated_result; - for (const FillLayer* bg_layer = &style->BackgroundLayers(); bg_layer; - bg_layer = bg_layer->Next()) { - StyleImage* bg_image = bg_layer->GetImage(); - if (!bg_image || !bg_image->IsImageResource()) - continue; - const StyleFetchedImage* fetched_image = To<StyleFetchedImage>(bg_image); - const String url = fetched_image->Url().StrippedForUseAsReferrer(); - concatenated_result.Append(url.Utf8().data(), url.length()); - } - return concatenated_result.ToString(); -} -#endif // In order for |rect_size| to align with the importance of the image, we // use this heuristics to alleviate the effect of scaling. For example, @@ -87,22 +52,6 @@ return visual_size; } -bool AttachedBackgroundImagesAllLoaded(const LayoutObject& object) { - DCHECK(ImagePaintTimingDetector::HasBackgroundImage(object)); - const ComputedStyle* style = object.Style(); - DCHECK(style); - for (const FillLayer* bg_layer = &style->BackgroundLayers(); bg_layer; - bg_layer = bg_layer->Next()) { - StyleImage* bg_image = bg_layer->GetImage(); - // A layout object with background images is not loaded until all of the - // background images are loaded. - if (!bg_image || !bg_image->IsImageResource()) - continue; - if (!bg_image->IsLoaded()) - return false; - } - return true; -} } // namespace // Set a big enough limit for the number of nodes to ensure memory usage is @@ -117,7 +66,9 @@ return a->first_size > b->first_size; // This make sure that two different nodes with the same |first_size| wouldn't // be merged in the set. - return a->node_id > b->node_id; + if (a->node_id != b->node_id) + return a->node_id > b->node_id; + return a->record_id > b->record_id; } ImagePaintTimingDetector::ImagePaintTimingDetector(LocalFrameView* frame_view) @@ -153,23 +104,36 @@ } void ImagePaintTimingDetector::Analyze() { - // These conditions represents the following scenarios: - // 1. candiate being nullptr: no loaded image is found. - // 2. candidate's first paint being null: largest image is still pending - // for timing. We discard the candidate and wait for the next analysis. - // 3. new candidate equals to old candidate: we don't need to update the - // result unless it's a new candidate. ImageRecord* largest_image_record = records_manager_.FindLargestPaintCandidate(); - if (largest_image_record && !largest_image_record->paint_time.is_null() && - largest_image_record != largest_image_paint_) { + // These conditions represents the following scenarios: + // 1. candiate being nullptr: no image is found. We discard the candidate and + // wait for the next analysis. + // 2. candidate's first paint being null: largest image is still pending for + // timing. We discard the candidate and wait for the next analysis. + // 3. new candidate equals to old candidate: we don't need to update the + // result. + if (largest_image_record == largest_image_paint_) + return; + + if (!largest_image_record) { + largest_image_paint_ = nullptr; + frame_view_->GetPaintTimingDetector().DidChangePerformanceTiming(); + } else if (largest_image_record->loaded && + !largest_image_record->paint_time.is_null()) { OnLargestImagePaintDetected(largest_image_record); frame_view_->GetPaintTimingDetector().DidChangePerformanceTiming(); } + // TODO(crbug/949974): when the largest image is still loading, we should + // update the result as the current time. } void ImagePaintTimingDetector::OnPaintFinished() { frame_index_++; + if (need_update_timing_at_frame_end_) { + need_update_timing_at_frame_end_ = false; + Analyze(); + } if (!records_manager_.NeedMeausuringPaintTime()) return; @@ -184,17 +148,22 @@ void ImagePaintTimingDetector::NotifyNodeRemoved(DOMNodeId node_id) { if (!is_recording_) return; + // Todo: check whether it is visible background image. if (!records_manager_.IsRecordedVisibleNode(node_id)) return; records_manager_.SetNodeDetached(node_id); - if (!records_manager_.AreAllVisibleNodesDetached()) - return; + need_update_timing_at_frame_end_ = true; +} - if (!largest_image_paint_) +void ImagePaintTimingDetector::NotifyBackgroundImageRemoved( + DOMNodeId node_id, + const ImageResourceContent* cached_image) { + if (!is_recording_) return; - largest_image_paint_ = nullptr; - // This will dispatch the updated |largest_image_paint_| to the browser. - frame_view_->GetPaintTimingDetector().DidChangePerformanceTiming(); + BackgroundImageId background_image_id = std::make_pair(node_id, cached_image); + if (!records_manager_.IsRecordedVisibleNode(background_image_id)) + return; + records_manager_.SetNodeDetached(background_image_id.first); } void ImagePaintTimingDetector::RegisterNotifySwapTime() { @@ -231,7 +200,6 @@ DCHECK(!images_queued_for_paint_time_.empty()); while (!images_queued_for_paint_time_.empty()) { base::WeakPtr<ImageRecord>& record = images_queued_for_paint_time_.front(); - DCHECK(visible_node_map_.Contains(record->node_id)); if (record->frame_index > last_queued_frame_index) break; record->paint_time = timestamp; @@ -239,29 +207,67 @@ } } -// static -bool ImagePaintTimingDetector::HasBackgroundImage(const LayoutObject& object) { +void ImagePaintTimingDetector::RecordBackgroundImage( + const LayoutObject& object, + const IntSize& intrinsic_size, + const ImageResourceContent* cached_image, + const PropertyTreeState& current_paint_chunk_properties) { + DCHECK(cached_image); + if (!cached_image) + return; Node* node = object.GetNode(); if (!node) - return false; - const ComputedStyle* style = object.Style(); - if (!style) - return false; - for (const FillLayer* bg_layer = &style->BackgroundLayers(); bg_layer; - bg_layer = bg_layer->Next()) { - StyleImage* bg_image = bg_layer->GetImage(); - // Rule out images that doesn't load any image resources, e.g., a gradient. - if (!bg_image || !bg_image->IsImageResource()) - continue; - return true; + return; + DOMNodeId node_id = DOMNodeIds::IdForNode(node); + DCHECK_NE(node_id, kInvalidDOMNodeId); + if (records_manager_.IsRecordedInvisibleNode(node_id)) + return; + + records_manager_.SetNodeReattachedIfNeeded(node_id); + BackgroundImageId background_image_id = std::make_pair(node_id, cached_image); + bool is_recored_visible_node = + records_manager_.IsRecordedVisibleNode(background_image_id); + if (is_recored_visible_node && + !records_manager_.WasVisibleNodeLoaded(background_image_id) && + cached_image->IsLoaded()) { + records_manager_.OnImageLoaded(background_image_id, frame_index_); + return; } - return false; + + if (is_recored_visible_node || !is_recording_) + return; + IntRect visual_rect = object.FragmentsVisualRectBoundingBox(); + // Before the image resource starts loading, <img> has no size info. We wait + // until the size is known. + if (visual_rect.IsEmpty()) + return; + uint64_t rect_size = + frame_view_->GetPaintTimingDetector().CalculateVisualSize( + visual_rect, current_paint_chunk_properties); + rect_size = DownScaleIfIntrinsicSizeIsSmaller( + rect_size, intrinsic_size.Area(), + (visual_rect.Width() * visual_rect.Height())); + + if (rect_size == 0) { + // Each invisible background image is tracked by its node id. In other + // words, when a node is deemed as invisible, all of the background images + // are deemed as invisible. + records_manager_.RecordInvisibleNode(node_id); + } else { + records_manager_.RecordVisibleNode(background_image_id, rect_size, + cached_image->Url()); + if (cached_image->IsLoaded()) + records_manager_.OnImageLoaded(background_image_id, frame_index_); + } + + if (records_manager_.RecordedTooManyNodes()) + HandleTooManyNodes(); } void ImagePaintTimingDetector::RecordImage( const LayoutObject& object, const IntSize& intrinsic_size, - bool is_loaded, + const ImageResourceContent* cached_image, const PropertyTreeState& current_paint_chunk_properties) { // TODO(crbug.com/933479): Use LayoutObject::GeneratingNode() to include // anonymous objects' rect. @@ -271,24 +277,22 @@ DOMNodeId node_id = DOMNodeIds::IdForNode(node); DCHECK_NE(node_id, kInvalidDOMNodeId); + if (records_manager_.IsRecordedInvisibleNode(node_id)) return; records_manager_.SetNodeReattachedIfNeeded(node_id); - if (records_manager_.IsRecordedVisibleNode(node_id) && + bool is_loaded = cached_image->IsLoaded(); + bool is_recored_visible_node = + records_manager_.IsRecordedVisibleNode(node_id); + if (is_recored_visible_node && !records_manager_.WasVisibleNodeLoaded(node_id) && is_loaded) { - // TODO(crbug/936149): This can be simplified after we track each background - // image individually. - bool has_background_image = HasBackgroundImage(object); - if ((!has_background_image && is_loaded) || - (has_background_image && AttachedBackgroundImagesAllLoaded(object))) { - records_manager_.OnImageLoaded(node_id, frame_index_); - return; - } + records_manager_.OnImageLoaded(node_id, frame_index_); + return; } - if (records_manager_.IsRecordedVisibleNode(node_id) || !is_recording_) + if (is_recored_visible_node || !is_recording_) return; IntRect visual_rect = object.FragmentsVisualRectBoundingBox(); // Before the image resource starts loading, <img> has no size info. We wait @@ -306,7 +310,7 @@ if (rect_size == 0) { records_manager_.RecordInvisibleNode(node_id); } else { - records_manager_.RecordVisibleNode(node_id, rect_size, object); + records_manager_.RecordVisibleNode(node_id, rect_size, cached_image->Url()); if (is_loaded) records_manager_.OnImageLoaded(node_id, frame_index_); } @@ -326,14 +330,19 @@ void ImageRecordsManager::SetNodeReattachedIfNeeded( const DOMNodeId& visible_node_id) { - if (!visible_node_map_.Contains(visible_node_id)) - return; if (!detached_ids_.Contains(visible_node_id)) return; detached_ids_.erase(visible_node_id); } base::WeakPtr<ImageRecord> ImageRecordsManager::FindVisibleRecord( + const BackgroundImageId& background_image_id) const { + DCHECK(visible_background_image_map_.Contains(background_image_id)); + return visible_background_image_map_.find(background_image_id) + ->value->AsWeakPtr(); +} + +base::WeakPtr<ImageRecord> ImageRecordsManager::FindVisibleRecord( const DOMNodeId& node_id) const { DCHECK(visible_node_map_.Contains(node_id)); return visible_node_map_.find(node_id)->value->AsWeakPtr(); @@ -342,6 +351,19 @@ void ImageRecordsManager::OnImageLoaded(const DOMNodeId& node_id, unsigned current_frame_index) { base::WeakPtr<ImageRecord> record = FindVisibleRecord(node_id); + OnImageLoadedInternal(record, current_frame_index); +} + +void ImageRecordsManager::OnImageLoaded( + const BackgroundImageId& background_image_id, + unsigned current_frame_index) { + base::WeakPtr<ImageRecord> record = FindVisibleRecord(background_image_id); + OnImageLoadedInternal(record, current_frame_index); +} + +void ImageRecordsManager::OnImageLoadedInternal( + base::WeakPtr<ImageRecord>& record, + unsigned current_frame_index) { SetLoaded(record); QueueToMeasurePaintTime(record, current_frame_index); } @@ -351,12 +373,12 @@ } bool ImageRecordsManager::RecordedTooManyNodes() const { - return visible_node_map_.size() + invisible_node_ids_.size() > + return visible_node_map_.size() + visible_background_image_map_.size() + + invisible_node_ids_.size() > kImageNodeNumberLimit; } void ImageRecordsManager::SetNodeDetached(const DOMNodeId& visible_node_id) { - DCHECK(visible_node_map_.Contains(visible_node_id)); detached_ids_.insert(visible_node_id); } @@ -366,15 +388,17 @@ return last_registered_frame_index < LastQueuedFrameIndex(); } -bool ImageRecordsManager::AreAllVisibleNodesDetached() const { - return visible_node_map_.size() - detached_ids_.size() == 0; -} - bool ImageRecordsManager::WasVisibleNodeLoaded(const DOMNodeId& node_id) const { DCHECK(visible_node_map_.Contains(node_id)); return visible_node_map_.at(node_id)->loaded; } +bool ImageRecordsManager::WasVisibleNodeLoaded( + const BackgroundImageId& background_image_id) const { + DCHECK(visible_background_image_map_.Contains(background_image_id)); + return visible_background_image_map_.at(background_image_id)->loaded; +} + void ImageRecordsManager::QueueToMeasurePaintTime( base::WeakPtr<ImageRecord>& record, unsigned current_frame_index) { @@ -389,19 +413,38 @@ void ImageRecordsManager::RecordVisibleNode(const DOMNodeId& node_id, const uint64_t& visual_size, - const LayoutObject& object) { + const String& url) { + std::unique_ptr<ImageRecord> record = + CreateImageRecord(node_id, nullptr, visual_size, url); + size_ordered_set_.insert(record->AsWeakPtr()); + visible_node_map_.insert(node_id, std::move(record)); +} + +void ImageRecordsManager::RecordVisibleNode( + const BackgroundImageId& background_image_id, + const uint64_t& visual_size, + const String& url) { + std::unique_ptr<ImageRecord> record = CreateImageRecord( + background_image_id.first, background_image_id.second, visual_size, url); + size_ordered_set_.insert(record->AsWeakPtr()); + visible_background_image_map_.insert(background_image_id, std::move(record)); +} + +std::unique_ptr<ImageRecord> ImageRecordsManager::CreateImageRecord( + const DOMNodeId& node_id, + const ImageResourceContent* cached_image, + const uint64_t& visual_size, + const String& url) { DCHECK(!RecordedTooManyNodes()); DCHECK_GT(visual_size, 0u); std::unique_ptr<ImageRecord> record = std::make_unique<ImageRecord>(); + record->record_id = max_record_id_++; record->node_id = node_id; -#ifndef NDEBUG - record->image_url = GetImageUrl(object); -#endif - // Mind that first_size has to be assigned at the push of - // |size_ordered_set_| since it's the sorting key. record->first_size = visual_size; - size_ordered_set_.insert(record->AsWeakPtr()); - visible_node_map_.insert(node_id, std::move(record)); +#ifndef NDEBUG + record->image_url = url; +#endif + return record; } // In the context of FCP++, we define contentful background image as one that @@ -433,17 +476,12 @@ } ImageRecord* ImageRecordsManager::FindLargestPaintCandidate() { - DCHECK_EQ(visible_node_map_.size(), size_ordered_set_.size()); + DCHECK_EQ(visible_node_map_.size() + visible_background_image_map_.size(), + size_ordered_set_.size()); for (auto it = size_ordered_set_.begin(); it != size_ordered_set_.end(); ++it) { if (detached_ids_.Contains((*it)->node_id)) continue; - DCHECK(visible_node_map_.Contains((*it)->node_id)); - // If the largest image is still loading, we report nothing and come - // back later to see if the largest image at that time has finished - // loading. - if (!(*it)->loaded) - return nullptr; return (*it).get(); } return nullptr;
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector.h b/third_party/blink/renderer/core/paint/image_paint_timing_detector.h index cb37474..353a9d32 100644 --- a/third_party/blink/renderer/core/paint/image_paint_timing_detector.h +++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector.h
@@ -22,10 +22,14 @@ class PropertyTreeState; class TracedValue; class Image; +class ImageResourceContent; class ImageRecord : public base::SupportsWeakPtr<ImageRecord> { public: + unsigned record_id; DOMNodeId node_id = kInvalidDOMNodeId; + // Mind that |first_size| has to be assigned before pusing to + // |size_ordered_set_| since it's the sorting key. uint64_t first_size = 0; unsigned frame_index = 0; // The time of the first paint after fully loaded. @@ -36,6 +40,8 @@ #endif }; +typedef std::pair<DOMNodeId, const ImageResourceContent*> BackgroundImageId; + // |ImageRecordsManager| is the manager of all of the images that Largest Image // Paint cares about. Note that an image does not necessarily correspond to a // node; it can also be one of the background images attached to a node. @@ -60,12 +66,19 @@ void RecordInvisibleNode(const DOMNodeId&); void RecordVisibleNode(const DOMNodeId&, const uint64_t& visual_size, - const LayoutObject&); + const String& url); + void RecordVisibleNode(const BackgroundImageId& background_image_id, + const uint64_t& visual_size, + const String& url); size_t CountVisibleNodes() const { return visible_node_map_.size(); } size_t CountInvisibleNodes() const { return invisible_node_ids_.size(); } bool IsRecordedVisibleNode(const DOMNodeId& node_id) const { return visible_node_map_.Contains(node_id); } + bool IsRecordedVisibleNode( + const BackgroundImageId& background_image_id) const { + return visible_background_image_map_.Contains(background_image_id); + } bool IsRecordedInvisibleNode(const DOMNodeId& node_id) const { return invisible_node_ids_.Contains(node_id); } @@ -73,7 +86,11 @@ bool RecordedTooManyNodes() const; bool WasVisibleNodeLoaded(const DOMNodeId&) const; + bool WasVisibleNodeLoaded(const BackgroundImageId& background_image_id) const; void OnImageLoaded(const DOMNodeId&, unsigned current_frame_index); + void OnImageLoaded(const BackgroundImageId&, unsigned current_frame_index); + void OnImageLoadedInternal(base::WeakPtr<ImageRecord>&, + unsigned current_frame_index); bool NeedMeausuringPaintTime() const { return !images_queued_for_paint_time_.empty(); @@ -91,12 +108,23 @@ private: // Find the image record of an visible image. base::WeakPtr<ImageRecord> FindVisibleRecord(const DOMNodeId&) const; + base::WeakPtr<ImageRecord> FindVisibleRecord( + const BackgroundImageId& background_image_id) const; + std::unique_ptr<ImageRecord> CreateImageRecord( + const DOMNodeId&, + const ImageResourceContent* cached_image, + const uint64_t& visual_size, + const String& url); void QueueToMeasurePaintTime(base::WeakPtr<ImageRecord>&, unsigned current_frame_index); void SetLoaded(base::WeakPtr<ImageRecord>&); + + unsigned max_record_id_ = 0; // We will never destroy the pointers within |visible_node_map_|. Once created // they will exist for the whole life cycle of |visible_node_map_|. HashMap<DOMNodeId, std::unique_ptr<ImageRecord>> visible_node_map_; + HashMap<BackgroundImageId, std::unique_ptr<ImageRecord>> + visible_background_image_map_; HashSet<DOMNodeId> invisible_node_ids_; // Use |DOMNodeId| instead of |ImageRecord|* for the efficiency of inserting // and erasing. @@ -139,12 +167,18 @@ ImageRecord* FindLargestPaintCandidate(); void RecordImage(const LayoutObject&, const IntSize& intrinsic_size, - bool is_loaded, + const ImageResourceContent*, const PropertyTreeState& current_paint_chunk_properties); + void RecordBackgroundImage( + const LayoutObject&, + const IntSize& intrinsic_size, + const ImageResourceContent* cached_image, + const PropertyTreeState& current_paint_chunk_properties); static bool IsBackgroundImageContentful(const LayoutObject&, const Image&); static bool HasBackgroundImage(const LayoutObject& object); void OnPaintFinished(); void NotifyNodeRemoved(DOMNodeId); + void NotifyBackgroundImageRemoved(DOMNodeId, const ImageResourceContent*); base::TimeTicks LargestImagePaint() const { return !largest_image_paint_ ? base::TimeTicks() : largest_image_paint_->paint_time; @@ -190,6 +224,8 @@ // no effect on recording the loading status. bool is_recording_ = true; + bool need_update_timing_at_frame_end_ = false; + ImageRecord* largest_image_paint_ = nullptr; ImageRecordsManager records_manager_; Member<LocalFrameView> frame_view_;
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc index b8962b4..6125b8e 100644 --- a/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc +++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
@@ -84,13 +84,19 @@ .records_manager_.FindLargestPaintCandidate(); } - unsigned CountRecords() { + size_t CountVisibleImageRecords() { return GetPaintTimingDetector() .GetImagePaintTimingDetector() .records_manager_.visible_node_map_.size(); } - unsigned CountChildFrameRecords() { + size_t CountVisibleBackgroundImageRecords() { + return GetPaintTimingDetector() + .GetImagePaintTimingDetector() + .records_manager_.visible_background_image_map_.size(); + } + + size_t CountChildFrameRecords() { return GetChildPaintTimingDetector() .GetImagePaintTimingDetector() .records_manager_.visible_node_map_.size(); @@ -206,12 +212,12 @@ <img id="target"></img> )HTML"); UpdateAllLifecyclePhasesAndInvokeCallbackIfAny(); - EXPECT_EQ(CountRecords(), 0u); + EXPECT_EQ(CountVisibleImageRecords(), 0u); SetImageAndPaint("target", 5, 5); UpdateAllLifecyclePhasesAndInvokeCallbackIfAny(); ImageRecord* record = FindLargestPaintCandidate(); EXPECT_TRUE(record); - EXPECT_EQ(CountRecords(), 1u); + EXPECT_EQ(CountVisibleImageRecords(), 1u); } TEST_F(ImagePaintTimingDetectorTest, LargestImagePaint_Largest) { @@ -249,7 +255,8 @@ EXPECT_FALSE(record); } -TEST_F(ImagePaintTimingDetectorTest, LargestImagePaint_IgnoreTheRemoved) { +TEST_F(ImagePaintTimingDetectorTest, + LargestImagePaint_UpdateOnRemovingTheLastImage) { SetBodyInnerHTML(R"HTML( <div id="parent"> <img id="target"></img> @@ -270,6 +277,38 @@ EXPECT_EQ(LargestPaintStoredResult(), base::TimeTicks()); } +TEST_F(ImagePaintTimingDetectorTest, LargestImagePaint_UpdateOnRemoving) { + SetBodyInnerHTML(R"HTML( + <div id="parent"> + <img id="target1"></img> + <img id="target2"></img> + </div> + )HTML"); + SetImageAndPaint("target1", 5, 5); + UpdateAllLifecyclePhasesAndInvokeCallbackIfAny(); + ImageRecord* record1 = FindLargestPaintCandidate(); + EXPECT_TRUE(record1); + EXPECT_NE(LargestPaintStoredResult(), base::TimeTicks()); + base::TimeTicks first_largest_image_paint = LargestPaintStoredResult(); + + SetImageAndPaint("target2", 10, 10); + UpdateAllLifecyclePhasesAndInvokeCallbackIfAny(); + ImageRecord* record2 = FindLargestPaintCandidate(); + EXPECT_TRUE(record2); + EXPECT_NE(LargestPaintStoredResult(), base::TimeTicks()); + base::TimeTicks second_largest_image_paint = LargestPaintStoredResult(); + + EXPECT_NE(record1, record2); + EXPECT_NE(first_largest_image_paint, second_largest_image_paint); + + GetDocument().getElementById("parent")->RemoveChild( + GetDocument().getElementById("target2")); + UpdateAllLifecyclePhasesAndInvokeCallbackIfAny(); + ImageRecord* record1_2 = FindLargestPaintCandidate(); + EXPECT_EQ(record1, record1_2); + EXPECT_EQ(first_largest_image_paint, LargestPaintStoredResult()); +} + TEST_F(ImagePaintTimingDetectorTest, LargestImagePaint_NodeRemovedBetweenRegistrationAndInvocation) { SetBodyInnerHTML(R"HTML( @@ -459,7 +498,7 @@ )HTML"); ImageRecord* record = FindLargestPaintCandidate(); EXPECT_TRUE(record); - EXPECT_EQ(CountRecords(), 1u); + EXPECT_EQ(CountVisibleBackgroundImageRecords(), 1u); } TEST_F(ImagePaintTimingDetectorTest, BackgroundImage_IgnoreBody) { @@ -470,7 +509,7 @@ } </style> )HTML"); - EXPECT_EQ(CountRecords(), 0u); + EXPECT_EQ(CountVisibleBackgroundImageRecords(), 0u); } TEST_F(ImagePaintTimingDetectorTest, BackgroundImage_IgnoreHtml) { @@ -483,7 +522,7 @@ </style> </html> )HTML"); - EXPECT_EQ(CountRecords(), 0u); + EXPECT_EQ(CountVisibleBackgroundImageRecords(), 0u); } TEST_F(ImagePaintTimingDetectorTest, BackgroundImage_IgnoreGradient) { @@ -497,7 +536,25 @@ place-holder </div> )HTML"); - EXPECT_EQ(CountRecords(), 0u); + EXPECT_EQ(CountVisibleBackgroundImageRecords(), 0u); +} + +// We put two background images in the same object, and test whether FCP++ can +// find two different images. +TEST_F(ImagePaintTimingDetectorTest, BackgroundImageTrackedDifferently) { + SetBodyInnerHTML(R"HTML( + <style> + #d { + width: 50px; + height: 50px; + background-image: + url("data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="), + url("data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAAb5JREFUOMulkr1KA0EQgGdvTwwnYmER0gQsrFKmSy+pLESw9Qm0F/ICNnba+h6iEOuAEWslKJKTOyJJvIT72d1xZuOFC0giOLA77O7Mt/PnNptN+I+49Xr9GhH3f3mb0v1ht9vtLAUYYw5ItkgDL3KyD8PhcLvdbl/WarXT3DjLMnAcR/f7/YfxeKwtgC5RKQVhGILWeg4hQ6hUKjWyucmhLFEUuWR3QYBWAZABQ9i5CCmXy16pVALP80BKaaG+70MQBLvzFMjRKKXh8j6FSYKF7ITdEWLa4/ktokN74wiqjSMpnVcbQZqmEJHz+ckeCPFjWKwULpyspAqhdXVXdcnZcPjsIgn+2BsVA8jVYuWlgJ3yBj0icgq2uoK+lg4t+ZvLomSKamSQ4AI5BcMADtMhyNoSgNIISUaFNtwlazcDcBc4gjjVwCWid2usCWroYEhnaqbzFJLUzAHIXRDChXCcQP8zhkSZ5eNLgHAUzwDcRu4CoIRn/wsGUQIIy4Vr9TH6SYFCNzw4nALn5627K4vIttOUOwfa5YnrDYzt/9OLv9I5l8kk5hZ3XLO20b7tbR7zHLy/BX8G0IeBEM7ZN1NGIaFUaKLgAAAAAElFTkSuQmCC"); + } + </style> + <div id="d"></div> + )HTML"); + EXPECT_EQ(CountVisibleBackgroundImageRecords(), 2u); } TEST_F(ImagePaintTimingDetectorTest, DeactivateAfterUserInput) { @@ -509,7 +566,7 @@ SimulateScroll(); SetImageAndPaint("target", 5, 5); UpdateAllLifecyclePhasesAndInvokeCallbackIfAny(); - EXPECT_EQ(CountRecords(), 0u); + EXPECT_EQ(CountVisibleImageRecords(), 0u); } TEST_F(ImagePaintTimingDetectorTest, NullTimeNoCrash) { @@ -533,7 +590,7 @@ SetChildFrameImageAndPaint("target", 5, 5); UpdateAllLifecyclePhasesForTest(); // Ensure main frame doesn't capture this image. - EXPECT_EQ(CountRecords(), 0u); + EXPECT_EQ(CountVisibleImageRecords(), 0u); EXPECT_EQ(CountChildFrameRecords(), 1u); InvokeCallback(); ImageRecord* image = FindChildFrameLargestPaintCandidate(); @@ -558,7 +615,7 @@ ReplaceCallBackQueue(GetChildPaintTimingDetector()); SetChildFrameImageAndPaint("target", 5, 5); UpdateAllLifecyclePhasesForTest(); - EXPECT_EQ(CountRecords(), 0u); + EXPECT_EQ(CountVisibleImageRecords(), 0u); } TEST_F(ImagePaintTimingDetectorTest, Iframe_HalfClippedByMainFrameViewport) { @@ -575,7 +632,7 @@ ReplaceCallBackQueue(GetChildPaintTimingDetector()); SetChildFrameImageAndPaint("target", 10, 10); UpdateAllLifecyclePhasesForTest(); - EXPECT_EQ(CountRecords(), 0u); + EXPECT_EQ(CountVisibleImageRecords(), 0u); EXPECT_EQ(CountChildFrameRecords(), 1u); InvokeCallback(); ImageRecord* image = FindChildFrameLargestPaintCandidate();
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index bdafc29..6a0e3cf8 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -610,29 +610,6 @@ point.MoveBy(-squashing_layer->GetOffsetFromTransformNode()); } -void PaintLayer::MapRectInPaintInvalidationContainerToBacking( - const LayoutBoxModelObject& paint_invalidation_container, - LayoutRect& rect) { - PaintLayer* paint_invalidation_layer = paint_invalidation_container.Layer(); - if (!paint_invalidation_layer->GroupedMapping()) - return; - - GraphicsLayer* squashing_layer = - paint_invalidation_layer->GroupedMapping()->SquashingLayer(); - - PropertyTreeState source_state = - paint_invalidation_container.FirstFragment().LocalBorderBoxProperties(); - PropertyTreeState dest_state = squashing_layer->GetPropertyTreeState(); - - // Move the point into the source_state transform space, map to dest_state - // transform space, then move into squashing layer state. - rect.MoveBy(paint_invalidation_container.FirstFragment().PaintOffset()); - GeometryMapper::SourceToDestinationProjection(source_state.Transform(), - dest_state.Transform()) - .MapRect(rect); - rect.MoveBy(-squashing_layer->GetOffsetFromTransformNode()); -} - void PaintLayer::DirtyVisibleContentStatus() { MarkAncestorChainForFlagsUpdate(); // Non-self-painting layers paint into their ancestor layer, and count as part
diff --git a/third_party/blink/renderer/core/paint/paint_layer.h b/third_party/blink/renderer/core/paint/paint_layer.h index ee1b855..cf7c3f6 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.h +++ b/third_party/blink/renderer/core/paint/paint_layer.h
@@ -568,9 +568,6 @@ static void MapPointInPaintInvalidationContainerToBacking( const LayoutBoxModelObject& paint_invalidation_container, FloatPoint&); - static void MapRectInPaintInvalidationContainerToBacking( - const LayoutBoxModelObject& paint_invalidation_container, - LayoutRect&); bool PaintsWithTransparency(GlobalPaintFlags global_paint_flags) const { return IsTransparent() && !PaintsIntoOwnBacking(global_paint_flags);
diff --git a/third_party/blink/renderer/core/paint/paint_layer_test.cc b/third_party/blink/renderer/core/paint/paint_layer_test.cc index cc6242d..77fb3ce9 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_test.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_test.cc
@@ -1552,15 +1552,10 @@ ToLayoutBoxModelObject(GetLayoutObjectByElementId("squashed"))->Layer(); EXPECT_EQ(kPaintsIntoGroupedBacking, squashed->GetCompositingState()); FloatPoint point; - LayoutRect rect(0, 0, 200, 200); PaintLayer::MapPointInPaintInvalidationContainerToBacking( squashed->GetLayoutObject(), point); EXPECT_EQ(FloatPoint(), point); - PaintLayer::MapRectInPaintInvalidationContainerToBacking( - squashed->GetLayoutObject(), rect); - EXPECT_EQ(LayoutRect(0, 0, 200, 200), rect); - EXPECT_EQ(LayoutPoint(0, 0), squashed->ComputeOffsetFromAncestor( squashed->TransformAncestorOrRoot())); @@ -1572,10 +1567,6 @@ squashed->GetLayoutObject(), point); EXPECT_EQ(FloatPoint(), point); - PaintLayer::MapRectInPaintInvalidationContainerToBacking( - squashed->GetLayoutObject(), rect); - EXPECT_EQ(LayoutRect(0, 0, 200, 200), rect); - EXPECT_EQ(LayoutPoint(0, 0), squashed->ComputeOffsetFromAncestor( squashed->TransformAncestorOrRoot())); }
diff --git a/third_party/blink/renderer/core/paint/paint_timing_detector.cc b/third_party/blink/renderer/core/paint/paint_timing_detector.cc index 74865cb6..47cbe56 100644 --- a/third_party/blink/renderer/core/paint/paint_timing_detector.cc +++ b/third_party/blink/renderer/core/paint/paint_timing_detector.cc
@@ -38,9 +38,10 @@ void PaintTimingDetector::NotifyBackgroundImagePaint( const Node* node, const Image* image, - const StyleImage* cached_image, + const ImageResourceContent* cached_image, const PropertyTreeState& current_paint_chunk_properties) { DCHECK(image); + DCHECK(cached_image); if (!node) return; LayoutObject* object = node->GetLayoutObject(); @@ -48,21 +49,14 @@ return; if (!ImagePaintTimingDetector::IsBackgroundImageContentful(*object, *image)) return; - // TODO(crbug/936149): This check is needed because the |image| and the - // background images in node could have inconsistent state. This can be - // resolved by tracking each background image separately. We will no longer - // need to find background images from a node's layers. - if (!ImagePaintTimingDetector::HasBackgroundImage(*object)) - return; LocalFrameView* frame_view = object->GetFrameView(); if (!frame_view) return; if (!cached_image) return; PaintTimingDetector& detector = frame_view->GetPaintTimingDetector(); - detector.GetImagePaintTimingDetector().RecordImage( - *object, image->Size(), cached_image->IsLoaded(), - current_paint_chunk_properties); + detector.GetImagePaintTimingDetector().RecordBackgroundImage( + *object, image->Size(), cached_image, current_paint_chunk_properties); } // static @@ -78,8 +72,7 @@ return; PaintTimingDetector& detector = frame_view->GetPaintTimingDetector(); detector.GetImagePaintTimingDetector().RecordImage( - object, intrinsic_size, cached_image->IsLoaded(), - current_paint_chunk_properties); + object, intrinsic_size, cached_image, current_paint_chunk_properties); } // static @@ -102,6 +95,16 @@ image_paint_timing_detector_->NotifyNodeRemoved(node_id); } +void PaintTimingDetector::NotifyBackgroundImageRemoved( + const LayoutObject& object, + const ImageResourceContent* cached_image) { + DOMNodeId node_id = DOMNodeIds::ExistingIdForNode(object.GetNode()); + if (node_id == kInvalidDOMNodeId) + return; + image_paint_timing_detector_->NotifyBackgroundImageRemoved(node_id, + cached_image); +} + void PaintTimingDetector::NotifyInputEvent(WebInputEvent::Type type) { if (type == WebInputEvent::kMouseMove || type == WebInputEvent::kMouseEnter || type == WebInputEvent::kMouseLeave ||
diff --git a/third_party/blink/renderer/core/paint/paint_timing_detector.h b/third_party/blink/renderer/core/paint/paint_timing_detector.h index e36eda8..3373d8c 100644 --- a/third_party/blink/renderer/core/paint/paint_timing_detector.h +++ b/third_party/blink/renderer/core/paint/paint_timing_detector.h
@@ -18,7 +18,6 @@ class LayoutObject; class LocalFrameView; class PropertyTreeState; -class StyleImage; class TextPaintTimingDetector; // PaintTimingDetector contains some of paint metric detectors, @@ -33,13 +32,10 @@ public: PaintTimingDetector(LocalFrameView*); - // TODO(crbug/936124): the detector no longer need to look for background - // images in each layer. - // Notify the paint of background image. static void NotifyBackgroundImagePaint( const Node*, const Image*, - const StyleImage* cached_image, + const ImageResourceContent* cached_image, const PropertyTreeState& current_paint_chunk_properties); static void NotifyImagePaint( const LayoutObject&, @@ -47,13 +43,14 @@ const ImageResourceContent* cached_image, const PropertyTreeState& current_paint_chunk_properties); - static void NotifyTextPaint(const LayoutObject& object, - const PropertyTreeState&); + static void NotifyTextPaint(const LayoutObject&, const PropertyTreeState&); void NotifyNodeRemoved(const LayoutObject&); + void NotifyBackgroundImageRemoved(const LayoutObject&, + const ImageResourceContent*); void NotifyPaintFinished(); void NotifyInputEvent(WebInputEvent::Type); bool NeedToNotifyInputOrScroll(); - void NotifyScroll(ScrollType scroll_type); + void NotifyScroll(ScrollType); void DidChangePerformanceTiming(); // |visual_rect| should be an object's bounding rect in the space of
diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc index 9fe4d52..71e7067 100644 --- a/third_party/blink/renderer/core/testing/internals.cc +++ b/third_party/blink/renderer/core/testing/internals.cc
@@ -1744,116 +1744,6 @@ return EventHandlerCount(*document, EventHandlerRegistry::kPointerEvent); } -static PaintLayer* FindLayerForGraphicsLayer(PaintLayer* search_root, - GraphicsLayer* graphics_layer, - IntSize* layer_offset, - String* layer_type) { - *layer_offset = IntSize(); - if (search_root->HasCompositedLayerMapping() && - graphics_layer == - search_root->GetCompositedLayerMapping()->MainGraphicsLayer()) { - // If the |graphicsLayer| sets the scrollingContent layer as its - // scroll parent, consider it belongs to the scrolling layer and - // mark the layer type as "scrolling". - if (!search_root->GetLayoutObject().HasTransformRelatedProperty() && - search_root->ScrollParent() && - search_root->Parent() == search_root->ScrollParent()) { - *layer_type = "scrolling"; - // For hit-test rect visualization to work, the hit-test rect should - // be relative to the scrolling layer and in this case the hit-test - // rect is relative to the element's own GraphicsLayer. So we will have - // to adjust the rect to be relative to the scrolling layer here. - // Only when the element's offsetParent == scroller's offsetParent we - // can compute the element's relative position to the scrolling content - // in this way. - if (search_root->GetLayoutObject().OffsetParent() == - search_root->Parent()->GetLayoutObject().OffsetParent()) { - LayoutBoxModelObject& current = search_root->GetLayoutObject(); - LayoutBoxModelObject& parent = search_root->Parent()->GetLayoutObject(); - layer_offset->SetWidth((parent.OffsetLeft(parent.OffsetParent()) - - current.OffsetLeft(parent.OffsetParent())) - .ToInt()); - layer_offset->SetHeight((parent.OffsetTop(parent.OffsetParent()) - - current.OffsetTop(parent.OffsetParent())) - .ToInt()); - return search_root->Parent(); - } - } - - LayoutRect rect; - PaintLayer::MapRectInPaintInvalidationContainerToBacking( - search_root->GetLayoutObject(), rect); - rect.Move(search_root->GetCompositedLayerMapping() - ->ContentOffsetInCompositingLayer()); - - *layer_offset = IntSize(rect.X().ToInt(), rect.Y().ToInt()); - return search_root; - } - - // If the |graphicsLayer| is a scroller's scrollingContent layer, - // consider this is a scrolling layer. - GraphicsLayer* layer_for_scrolling = - search_root->GetScrollableArea() - ? search_root->GetScrollableArea()->LayerForScrolling() - : nullptr; - if (graphics_layer == layer_for_scrolling) { - *layer_type = "scrolling"; - return search_root; - } - - if (search_root->GetCompositingState() == kPaintsIntoGroupedBacking) { - GraphicsLayer* squashing_layer = - search_root->GroupedMapping()->SquashingLayer(); - if (graphics_layer == squashing_layer) { - *layer_type = "squashing"; - LayoutRect rect; - PaintLayer::MapRectInPaintInvalidationContainerToBacking( - search_root->GetLayoutObject(), rect); - *layer_offset = IntSize(rect.X().ToInt(), rect.Y().ToInt()); - return search_root; - } - } - - GraphicsLayer* layer_for_horizontal_scrollbar = - search_root->GetScrollableArea() - ? search_root->GetScrollableArea()->LayerForHorizontalScrollbar() - : nullptr; - if (graphics_layer == layer_for_horizontal_scrollbar) { - *layer_type = "horizontalScrollbar"; - return search_root; - } - - GraphicsLayer* layer_for_vertical_scrollbar = - search_root->GetScrollableArea() - ? search_root->GetScrollableArea()->LayerForVerticalScrollbar() - : nullptr; - if (graphics_layer == layer_for_vertical_scrollbar) { - *layer_type = "verticalScrollbar"; - return search_root; - } - - GraphicsLayer* layer_for_scroll_corner = - search_root->GetScrollableArea() - ? search_root->GetScrollableArea()->LayerForScrollCorner() - : nullptr; - if (graphics_layer == layer_for_scroll_corner) { - *layer_type = "scrollCorner"; - return search_root; - } - - // Search right to left to increase the chances that we'll choose the top-most - // layers in a grouped mapping for squashing. - for (PaintLayer* child = search_root->LastChild(); child; - child = child->PreviousSibling()) { - PaintLayer* found_layer = FindLayerForGraphicsLayer( - child, graphics_layer, layer_offset, layer_type); - if (found_layer) - return found_layer; - } - - return nullptr; -} - // Given a vector of rects, merge those that are adjacent, leaving empty rects // in the place of no longer used slots. This is intended to simplify the list // of rects returned by an SkRegion (which have been split apart for sorting
diff --git a/third_party/blink/renderer/core/xml/document_xslt.cc b/third_party/blink/renderer/core/xml/document_xslt.cc index ccb2cd6..ab5aa46 100644 --- a/third_party/blink/renderer/core/xml/document_xslt.cc +++ b/third_party/blink/renderer/core/xml/document_xslt.cc
@@ -30,6 +30,7 @@ : processing_instruction_(pi) {} void Invoke(ExecutionContext* execution_context, Event* event) override { + DCHECK(RuntimeEnabledFeatures::XSLTEnabled()); DCHECK_EQ(event->type(), "DOMContentLoaded"); Document& document = *To<Document>(execution_context); @@ -110,6 +111,9 @@ if (!pi->IsXSL()) return false; + if (!RuntimeEnabledFeatures::XSLTEnabled() || !document.GetFrame()) + return true; + auto* listener = MakeGarbageCollected<DOMContentLoadedListener>(pi); document.addEventListener(event_type_names::kDOMContentLoaded, listener, false); @@ -127,6 +131,7 @@ if (!pi->EventListenerForXSLT()) return true; + DCHECK(RuntimeEnabledFeatures::XSLTEnabled()); document.removeEventListener(event_type_names::kDOMContentLoaded, pi->EventListenerForXSLT(), false); pi->ClearEventListenerForXSLT(); @@ -137,8 +142,8 @@ if (!pi->IsXSL()) return false; - if (!document.Parsing() && !pi->IsLoading() && - !DocumentXSLT::HasTransformSourceDocument(document)) { + if (RuntimeEnabledFeatures::XSLTEnabled() && !document.Parsing() && + !pi->IsLoading() && !DocumentXSLT::HasTransformSourceDocument(document)) { if (FindXSLStyleSheet(document) == pi) ApplyXSLTransform(document, pi); }
diff --git a/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc b/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc index cd1b48a..5eebb52 100644 --- a/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc +++ b/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc
@@ -72,6 +72,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_response.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/shared_buffer.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h" #include "third_party/blink/renderer/platform/wtf/text/utf8.h" @@ -1165,6 +1166,9 @@ if (pi->IsCSS()) saw_css_ = true; + if (!RuntimeEnabledFeatures::XSLTEnabled()) + return; + saw_xsl_transform_ = !saw_first_element_ && pi->IsXSL(); if (saw_xsl_transform_ && !DocumentXSLT::HasTransformSourceDocument(*GetDocument())) {
diff --git a/third_party/blink/renderer/core/xml/xsl_style_sheet.h b/third_party/blink/renderer/core/xml/xsl_style_sheet.h index f6c1ebb..d59872e 100644 --- a/third_party/blink/renderer/core/xml/xsl_style_sheet.h +++ b/third_party/blink/renderer/core/xml/xsl_style_sheet.h
@@ -28,6 +28,7 @@ #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/core/css/style_sheet.h" #include "third_party/blink/renderer/core/dom/processing_instruction.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" namespace blink { @@ -36,11 +37,13 @@ static XSLStyleSheet* Create(ProcessingInstruction* parent_node, const String& original_url, const KURL& final_url) { + DCHECK(RuntimeEnabledFeatures::XSLTEnabled()); return MakeGarbageCollected<XSLStyleSheet>(parent_node, original_url, final_url, false); } static XSLStyleSheet* CreateEmbedded(ProcessingInstruction* parent_node, const KURL& final_url) { + DCHECK(RuntimeEnabledFeatures::XSLTEnabled()); return MakeGarbageCollected<XSLStyleSheet>( parent_node, final_url.GetString(), final_url, true); } @@ -52,6 +55,7 @@ Node* stylesheet_root_node, const String& original_url, const KURL& final_url) { + DCHECK(RuntimeEnabledFeatures::XSLTEnabled()); return MakeGarbageCollected<XSLStyleSheet>(document, stylesheet_root_node, original_url, final_url, false); }
diff --git a/third_party/blink/renderer/core/xml/xslt_extensions.cc b/third_party/blink/renderer/core/xml/xslt_extensions.cc index cf972aa..4c65879 100644 --- a/third_party/blink/renderer/core/xml/xslt_extensions.cc +++ b/third_party/blink/renderer/core/xml/xslt_extensions.cc
@@ -30,6 +30,7 @@ #include <libxslt/extensions.h> #include <libxslt/extra.h> #include <libxslt/xsltutils.h> +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/wtf/assertions.h" namespace blink { @@ -74,6 +75,7 @@ } void RegisterXSLTExtensions(xsltTransformContextPtr ctxt) { + DCHECK(RuntimeEnabledFeatures::XSLTEnabled()); xsltRegisterExtFunction(ctxt, (const xmlChar*)"node-set", (const xmlChar*)"http://exslt.org/common", ExsltNodeSetFunction);
diff --git a/third_party/blink/renderer/core/xml/xslt_processor.h b/third_party/blink/renderer/core/xml/xslt_processor.h index 1c8ad94..acfaf8c 100644 --- a/third_party/blink/renderer/core/xml/xslt_processor.h +++ b/third_party/blink/renderer/core/xml/xslt_processor.h
@@ -26,6 +26,7 @@ #include "third_party/blink/renderer/core/dom/node.h" #include "third_party/blink/renderer/core/xml/xsl_style_sheet.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/wtf/hash_map.h" #include "third_party/blink/renderer/platform/wtf/text/string_hash.h" @@ -43,6 +44,7 @@ public: static XSLTProcessor* Create(Document& document) { + DCHECK(RuntimeEnabledFeatures::XSLTEnabled()); return MakeGarbageCollected<XSLTProcessor>(document); }
diff --git a/third_party/blink/renderer/core/xml/xslt_processor.idl b/third_party/blink/renderer/core/xml/xslt_processor.idl index 3f88ab31..ba796f26 100644 --- a/third_party/blink/renderer/core/xml/xslt_processor.idl +++ b/third_party/blink/renderer/core/xml/xslt_processor.idl
@@ -33,6 +33,7 @@ [ Constructor, ConstructorCallWith=Document, + RuntimeEnabled=XSLT, MeasureAs=XSLTProcessor ] interface XSLTProcessor {
diff --git a/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc b/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc index 31a7e7d..c7c37e0 100644 --- a/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc +++ b/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
@@ -67,13 +67,6 @@ } } - Document& target_document = keyframe_effects.at(0)->target()->GetDocument(); - for (const auto& effect : keyframe_effects) { - if (effect->target()->GetDocument() != target_document) { - error_string = "All effects must target elements in the same document"; - return false; - } - } return true; }
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni index 37b7804d..bf16c78a 100644 --- a/third_party/blink/renderer/modules/modules_idl_files.gni +++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -495,6 +495,8 @@ "xr/xr_input_source.idl", "xr/xr_input_source_event.idl", "xr/xr_layer.idl", + "xr/xr_plane.idl", + "xr/xr_plane_detection_state.idl", "xr/xr_pose.idl", "xr/xr_presentation_context.idl", "xr/xr_ray.idl", @@ -511,6 +513,8 @@ "xr/xr_viewer_pose.idl", "xr/xr_viewport.idl", "xr/xr_webgl_layer.idl", + "xr/xr_world_information.idl", + "xr/xr_world_tracking_state.idl", ], "abspath") @@ -827,11 +831,13 @@ "webusb/usb_device_filter.idl", "webusb/usb_device_request_options.idl", "xr/xr_input_source_event_init.idl", + "xr/xr_plane_detection_state_init.idl", "xr/xr_reference_space_event_init.idl", "xr/xr_reference_space_options.idl", "xr/xr_render_state_init.idl", "xr/xr_session_event_init.idl", "xr/xr_webgl_layer_init.idl", + "xr/xr_world_tracking_state_init.idl", ], "abspath")
diff --git a/third_party/blink/renderer/modules/webaudio/audio_node.cc b/third_party/blink/renderer/modules/webaudio/audio_node.cc index 4669a78..4977ccfb 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_node.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_node.cc
@@ -491,30 +491,6 @@ EnableOutputsIfNecessary(); } -void AudioHandler::BreakConnection() { - // The actual work for deref happens completely within the audio context's - // graph lock. In the case of the audio thread, we must use a tryLock to - // avoid glitches. - bool has_lock = false; - if (Context()->IsAudioThread()) { - // Real-time audio thread must not contend lock (to avoid glitches). - has_lock = Context()->TryLock(); - } else { - Context()->lock(); - has_lock = true; - } - - if (has_lock) { - BreakConnectionWithLock(); - Context()->unlock(); - } else { - // We were unable to get the lock, so put this in a list to finish up - // later. - DCHECK(Context()->IsAudioThread()); - Context()->GetDeferredTaskHandler().AddDeferredBreakConnection(*this); - } -} - void AudioHandler::BreakConnectionWithLock() { deferred_task_handler_->AssertGraphOwner(); connection_ref_count_--;
diff --git a/third_party/blink/renderer/modules/webaudio/audio_node.h b/third_party/blink/renderer/modules/webaudio/audio_node.h index 4446cae..ec29ada 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_node.h +++ b/third_party/blink/renderer/modules/webaudio/audio_node.h
@@ -134,12 +134,12 @@ // existing connections from others. // This function must be called after acquiring a connection reference. void MakeConnection(); - // This object will be disconnected from another object. This might have - // remaining connections from others. - // This function must be called before releasing a connection reference. - void BreakConnection(); - // Can be called from main thread or context's audio thread. It must be + // This object will be disconnected from another object. This might have + // remaining connections from others. This function must be called before + // releasing a connection reference. + // + // This can be called from main thread or context's audio thread. It must be // called while the context's graph lock is held. void BreakConnectionWithLock();
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc index fddbb34..d7b4978 100644 --- a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc +++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
@@ -673,9 +673,12 @@ void BaseAudioContext::ReleaseActiveSourceNodes() { DCHECK(IsMainThread()); + + GraphAutoLocker locker(this); + for (auto source_handler : *GetDeferredTaskHandler().GetActiveSourceHandlers()) { - source_handler->BreakConnection(); + source_handler->BreakConnectionWithLock(); } }
diff --git a/third_party/blink/renderer/modules/webaudio/deferred_task_handler.cc b/third_party/blink/renderer/modules/webaudio/deferred_task_handler.cc index fb5f296e..2cba3a6 100644 --- a/third_party/blink/renderer/modules/webaudio/deferred_task_handler.cc +++ b/third_party/blink/renderer/modules/webaudio/deferred_task_handler.cc
@@ -69,11 +69,6 @@ context_graph_mutex_.lock(); } -void DeferredTaskHandler::AddDeferredBreakConnection(AudioHandler& node) { - DCHECK(IsAudioThread()); - deferred_break_connection_list_.push_back(&node); -} - void DeferredTaskHandler::BreakConnections() { DCHECK(IsAudioThread()); AssertGraphOwner(); @@ -88,10 +83,6 @@ } finished_source_handlers_.clear(); } - - for (unsigned i = 0; i < deferred_break_connection_list_.size(); ++i) - deferred_break_connection_list_[i]->BreakConnectionWithLock(); - deferred_break_connection_list_.clear(); } void DeferredTaskHandler::MarkSummingJunctionDirty(
diff --git a/third_party/blink/renderer/modules/webaudio/deferred_task_handler.h b/third_party/blink/renderer/modules/webaudio/deferred_task_handler.h index cc21a33f..0ede5f5 100644 --- a/third_party/blink/renderer/modules/webaudio/deferred_task_handler.h +++ b/third_party/blink/renderer/modules/webaudio/deferred_task_handler.h
@@ -101,9 +101,8 @@ void MarkAudioNodeOutputDirty(AudioNodeOutput*); void RemoveMarkedAudioNodeOutput(AudioNodeOutput*); - // In AudioNode::breakConnection() and deref(), a tryLock() is used for - // calling actual processing, but if it fails keep track here. - void AddDeferredBreakConnection(AudioHandler&); + // Break connections between nodes. This is done on the audio thread with the + // graph lock. void BreakConnections(); void AddRenderingOrphanHandler(scoped_refptr<AudioHandler>); @@ -229,9 +228,6 @@ HashSet<AudioSummingJunction*> dirty_summing_junctions_; HashSet<AudioNodeOutput*> dirty_audio_node_outputs_; - // Only accessed in the audio thread. - Vector<AudioHandler*> deferred_break_connection_list_; - Vector<scoped_refptr<AudioHandler>> rendering_orphan_handlers_; Vector<scoped_refptr<AudioHandler>> deletable_orphan_handlers_;
diff --git a/third_party/blink/renderer/modules/xr/BUILD.gn b/third_party/blink/renderer/modules/xr/BUILD.gn index 3862966..6c32656 100644 --- a/third_party/blink/renderer/modules/xr/BUILD.gn +++ b/third_party/blink/renderer/modules/xr/BUILD.gn
@@ -28,6 +28,10 @@ "xr_input_source_event.h", "xr_layer.cc", "xr_layer.h", + "xr_plane.cc", + "xr_plane.h", + "xr_plane_detection_state.cc", + "xr_plane_detection_state.h", "xr_pose.cc", "xr_pose.h", "xr_presentation_context.cc", @@ -65,6 +69,10 @@ "xr_viewport.h", "xr_webgl_layer.cc", "xr_webgl_layer.h", + "xr_world_information.cc", + "xr_world_information.h", + "xr_world_tracking_state.cc", + "xr_world_tracking_state.h", ] deps = [
diff --git a/third_party/blink/renderer/modules/xr/xr_frame.h b/third_party/blink/renderer/modules/xr/xr_frame.h index e1204e1..589e1f96 100644 --- a/third_party/blink/renderer/modules/xr/xr_frame.h +++ b/third_party/blink/renderer/modules/xr/xr_frame.h
@@ -22,6 +22,7 @@ class XRSession; class XRSpace; class XRViewerPose; +class XRWorldInformation; class XRFrame final : public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); @@ -33,6 +34,7 @@ XRViewerPose* getViewerPose(XRReferenceSpace*, ExceptionState&) const; XRPose* getPose(XRSpace*, XRSpace*, ExceptionState&); + XRWorldInformation* worldInformation() const { return nullptr; } void SetBasePoseMatrix(const TransformationMatrix&); std::unique_ptr<TransformationMatrix> CloneBasePoseMatrix() const;
diff --git a/third_party/blink/renderer/modules/xr/xr_frame.idl b/third_party/blink/renderer/modules/xr/xr_frame.idl index a39ce1b..001a3fb 100644 --- a/third_party/blink/renderer/modules/xr/xr_frame.idl +++ b/third_party/blink/renderer/modules/xr/xr_frame.idl
@@ -10,6 +10,10 @@ ] interface XRFrame { readonly attribute XRSession session; + // More details about the real-world understanding APIs can be found here: + // https://github.com/immersive-web/real-world-geometry/blob/master/plane-detection-explainer.md + [RuntimeEnabled=WebXRPlaneDetection] readonly attribute XRWorldInformation worldInformation; + [RaisesException] XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace); [RaisesException] XRPose? getPose(XRSpace space, XRSpace relativeTo); };
diff --git a/third_party/blink/renderer/modules/xr/xr_plane.cc b/third_party/blink/renderer/modules/xr/xr_plane.cc new file mode 100644 index 0000000..953fb43 --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_plane.cc
@@ -0,0 +1,5 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/xr/xr_plane.h"
diff --git a/third_party/blink/renderer/modules/xr/xr_plane.h b/third_party/blink/renderer/modules/xr/xr_plane.h new file mode 100644 index 0000000..fc579e2 --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_plane.h
@@ -0,0 +1,28 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_PLANE_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_PLANE_H_ + +#include "third_party/blink/renderer/core/geometry/dom_point_read_only.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +class XRPose; +class XRSpace; + +class XRPlane : public ScriptWrappable { + DEFINE_WRAPPERTYPEINFO(); + + public: + XRPose* getPose(XRSpace*) const { return nullptr; } + + String orientation() const { return {}; } + HeapVector<Member<DOMPointReadOnly>> polygon() const { return {}; } +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_PLANE_H_
diff --git a/third_party/blink/renderer/modules/xr/xr_plane.idl b/third_party/blink/renderer/modules/xr/xr_plane.idl new file mode 100644 index 0000000..32540277 --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_plane.idl
@@ -0,0 +1,21 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +enum XRPlaneOrientation { + "horizontal", + "vertical" +}; + +// More details about the plane detection API can be found here: +// https://github.com/immersive-web/real-world-geometry/blob/master/plane-detection-explainer.md +[ + SecureContext, + Exposed=Window, + RuntimeEnabled=WebXRPlaneDetection +] +interface XRPlane { + XRPose getPose(XRReferenceSpace referenceSpace); + readonly attribute FrozenArray<DOMPointReadOnly> polygon; + readonly attribute XRPlaneOrientation? orientation; +};
diff --git a/third_party/blink/renderer/modules/xr/xr_plane_detection_state.cc b/third_party/blink/renderer/modules/xr/xr_plane_detection_state.cc new file mode 100644 index 0000000..174691b --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_plane_detection_state.cc
@@ -0,0 +1,5 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/xr/xr_plane_detection_state.h"
diff --git a/third_party/blink/renderer/modules/xr/xr_plane_detection_state.h b/third_party/blink/renderer/modules/xr/xr_plane_detection_state.h new file mode 100644 index 0000000..66fa47b --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_plane_detection_state.h
@@ -0,0 +1,21 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_PLANE_DETECTION_STATE_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_PLANE_DETECTION_STATE_H_ + +#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" + +namespace blink { + +class XRPlaneDetectionState : public ScriptWrappable { + DEFINE_WRAPPERTYPEINFO(); + + public: + bool enabled() const { return false; } +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_PLANE_DETECTION_STATE_H_
diff --git a/third_party/blink/renderer/modules/xr/xr_plane_detection_state.idl b/third_party/blink/renderer/modules/xr/xr_plane_detection_state.idl new file mode 100644 index 0000000..94573244 --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_plane_detection_state.idl
@@ -0,0 +1,15 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// More details about the plane detection API can be found here: +// https://github.com/immersive-web/real-world-geometry/blob/master/plane-detection-explainer.md +[ + SecureContext, + Exposed=Window, + RuntimeEnabled=WebXRPlaneDetection +] +interface XRPlaneDetectionState { + readonly attribute boolean enabled; +}; +
diff --git a/third_party/blink/renderer/modules/xr/xr_plane_detection_state_init.idl b/third_party/blink/renderer/modules/xr/xr_plane_detection_state_init.idl new file mode 100644 index 0000000..98ed84d --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_plane_detection_state_init.idl
@@ -0,0 +1,10 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// More details about the plane detection API can be found here: +// https://github.com/immersive-web/real-world-geometry/blob/master/plane-detection-explainer.md +dictionary XRPlaneDetectionStateInit { + boolean enabled; +}; +
diff --git a/third_party/blink/renderer/modules/xr/xr_session.h b/third_party/blink/renderer/modules/xr/xr_session.h index 022b976..c3f47a6 100644 --- a/third_party/blink/renderer/modules/xr/xr_session.h +++ b/third_party/blink/renderer/modules/xr/xr_session.h
@@ -38,6 +38,8 @@ class XRRenderStateInit; class XRView; class XRViewerSpace; +class XRWorldTrackingState; +class XRWorldTrackingStateInit; class XRSession final : public EventTargetWithInlineData, public device::mojom::blink::XRSessionClient, @@ -74,6 +76,7 @@ bool environmentIntegration() const { return environment_integration_; } const String& environmentBlendMode() const { return blend_mode_string_; } XRRenderState* renderState() const { return render_state_; } + XRWorldTrackingState* worldTrackingState() { return nullptr; } XRSpace* viewerSpace() const; bool immersive() const; @@ -88,6 +91,7 @@ DEFINE_ATTRIBUTE_EVENT_LISTENER(select, kSelect) void updateRenderState(XRRenderStateInit*, ExceptionState&); + void updateWorldTrackingState(XRWorldTrackingStateInit*) {} ScriptPromise requestReferenceSpace(ScriptState*, const XRReferenceSpaceOptions*);
diff --git a/third_party/blink/renderer/modules/xr/xr_session.idl b/third_party/blink/renderer/modules/xr/xr_session.idl index 518367a..c3af2de 100644 --- a/third_party/blink/renderer/modules/xr/xr_session.idl +++ b/third_party/blink/renderer/modules/xr/xr_session.idl
@@ -33,6 +33,7 @@ attribute EventHandler onend; [RaisesException] void updateRenderState(XRRenderStateInit init); + [CallWith=ScriptState] Promise<XRReferenceSpace> requestReferenceSpace([PermissiveDictionaryConversion] XRReferenceSpaceOptions options); long requestAnimationFrame(XRFrameRequestCallback callback); @@ -42,5 +43,11 @@ [RuntimeEnabled=WebXRHitTest, CallWith=ScriptState] Promise<FrozenArray<XRHitResult>> requestHitTest(XRRay ray, XRSpace space); + [RuntimeEnabled=WebXRPlaneDetection] readonly attribute XRWorldTrackingState worldTrackingState; + // Configures a session with real-world understanding capabilities. + // More details can be found here: + // https://github.com/immersive-web/real-world-geometry/blob/master/plane-detection-explainer.md + [RuntimeEnabled=WebXRPlaneDetection] void updateWorldTrackingState(optional XRWorldTrackingStateInit state); + [CallWith=ScriptState] Promise<void> end(); };
diff --git a/third_party/blink/renderer/modules/xr/xr_world_information.cc b/third_party/blink/renderer/modules/xr/xr_world_information.cc new file mode 100644 index 0000000..5d75930 --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_world_information.cc
@@ -0,0 +1,5 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/xr/xr_world_information.h"
diff --git a/third_party/blink/renderer/modules/xr/xr_world_information.h b/third_party/blink/renderer/modules/xr/xr_world_information.h new file mode 100644 index 0000000..edc31d6b --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_world_information.h
@@ -0,0 +1,24 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_WORLD_INFORMATION_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_WORLD_INFORMATION_H_ + +#include "third_party/blink/renderer/modules/xr/xr_plane.h" + +namespace blink { + +class XRWorldInformation : public ScriptWrappable { + DEFINE_WRAPPERTYPEINFO(); + + public: + HeapVector<Member<XRPlane>> detectedPlanes(bool& is_null) const { + is_null = true; + return {}; + } +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_WORLD_INFORMATION_H_
diff --git a/third_party/blink/renderer/modules/xr/xr_world_information.idl b/third_party/blink/renderer/modules/xr/xr_world_information.idl new file mode 100644 index 0000000..fd3148d --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_world_information.idl
@@ -0,0 +1,15 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// More details about the real-world understanding APIs can be found here: +// https://github.com/immersive-web/real-world-geometry/blob/master/plane-detection-explainer.md +[ + SecureContext, + Exposed=Window, + RuntimeEnabled=WebXRPlaneDetection +] +interface XRWorldInformation { + readonly attribute FrozenArray<XRPlane>? detectedPlanes; +}; +
diff --git a/third_party/blink/renderer/modules/xr/xr_world_tracking_state.cc b/third_party/blink/renderer/modules/xr/xr_world_tracking_state.cc new file mode 100644 index 0000000..591eb7c --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_world_tracking_state.cc
@@ -0,0 +1,5 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/xr/xr_world_tracking_state.h"
diff --git a/third_party/blink/renderer/modules/xr/xr_world_tracking_state.h b/third_party/blink/renderer/modules/xr/xr_world_tracking_state.h new file mode 100644 index 0000000..125b775 --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_world_tracking_state.h
@@ -0,0 +1,23 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_WORLD_TRACKING_STATE_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_WORLD_TRACKING_STATE_H_ + +#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" + +namespace blink { + +class XRPlaneDetectionState; + +class XRWorldTrackingState : public ScriptWrappable { + DEFINE_WRAPPERTYPEINFO(); + + public: + XRPlaneDetectionState* planeDetectionState() const { return nullptr; } +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_WORLD_TRACKING_STATE_H_
diff --git a/third_party/blink/renderer/modules/xr/xr_world_tracking_state.idl b/third_party/blink/renderer/modules/xr/xr_world_tracking_state.idl new file mode 100644 index 0000000..070ee06 --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_world_tracking_state.idl
@@ -0,0 +1,15 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// More details about the real-world understanding APIs can be found here: +// https://github.com/immersive-web/real-world-geometry/blob/master/plane-detection-explainer.md +[ + SecureContext, + Exposed=Window, + RuntimeEnabled=WebXRPlaneDetection +] +interface XRWorldTrackingState { + readonly attribute XRPlaneDetectionState planeDetectionState; +}; +
diff --git a/third_party/blink/renderer/modules/xr/xr_world_tracking_state_init.idl b/third_party/blink/renderer/modules/xr/xr_world_tracking_state_init.idl new file mode 100644 index 0000000..f8fd6bb --- /dev/null +++ b/third_party/blink/renderer/modules/xr/xr_world_tracking_state_init.idl
@@ -0,0 +1,10 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// More details about the real-world understanding APIs can be found here: +// https://github.com/immersive-web/real-world-geometry/blob/master/plane-detection-explainer.md +dictionary XRWorldTrackingStateInit { + XRPlaneDetectionStateInit planeDetectionState; +}; +
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc index 52f3aff..e7ad1eb 100644 --- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc +++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -415,6 +415,10 @@ RuntimeEnabledFeatures::SetWebGLImageChromiumEnabled(enable); } +void WebRuntimeFeatures::EnableXSLT(bool enable) { + RuntimeEnabledFeatures::SetXSLTEnabled(enable); +} + void WebRuntimeFeatures::EnableOverlayScrollbars(bool enable) { RuntimeEnabledFeatures::SetOverlayScrollbarsEnabled(enable); }
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc index e7425dc..b6b430a 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
@@ -8,7 +8,6 @@ #include <utility> #include "cc/layers/layer.h" -#include "cc/layers/picture_layer.h" #include "cc/paint/display_item_list.h" #include "cc/trees/effect_node.h" #include "cc/trees/layer_tree_host.h" @@ -685,104 +684,74 @@ DCHECK_EQ(paint_artifact.PaintChunks().end(), cursor); } -// This class maintains a persistent mask layer and unique stable cc effect IDs -// for reuse across compositing cycles. The mask layer paints a rounded rect, -// which is an updatable parameter of the class. The caller is responsible for -// inserting the layer into layer list and associating with property nodes. -// -// The typical application of the mask layer is to create an isolating effect -// node to paint the clipped contents, and at the end draw the mask layer with -// a kDstIn blend effect. This is why two stable cc effect IDs are provided for -// the convenience of the caller, although they are not directly related to the -// class functionality. -class SynthesizedClip : private cc::ContentLayerClient { - public: - SynthesizedClip() : layer_(cc::PictureLayer::Create(this)) { - mask_isolation_id_ = - CompositorElementIdFromUniqueObjectId(NewUniqueObjectId()); - mask_effect_id_ = - CompositorElementIdFromUniqueObjectId(NewUniqueObjectId()); +void SynthesizedClip::UpdateLayer(bool needs_layer, + const FloatRoundedRect& rrect, + scoped_refptr<const RefCountedPath> path) { + if (!needs_layer) { + layer_.reset(); + return; + } + if (!layer_) { + layer_ = cc::PictureLayer::Create(this); layer_->SetIsDrawable(true); } - ~SynthesizedClip() override { layer_->ClearClient(); } - void Update(const FloatRoundedRect& rrect, - scoped_refptr<const RefCountedPath> path) { - IntRect layer_bounds = EnclosingIntRect(rrect.Rect()); - gfx::Vector2dF new_layer_origin(layer_bounds.X(), layer_bounds.Y()); + IntRect layer_bounds = EnclosingIntRect(rrect.Rect()); + gfx::Vector2dF new_layer_origin(layer_bounds.X(), layer_bounds.Y()); - SkRRect new_local_rrect = rrect; - new_local_rrect.offset(-new_layer_origin.x(), -new_layer_origin.y()); + SkRRect new_local_rrect = rrect; + new_local_rrect.offset(-new_layer_origin.x(), -new_layer_origin.y()); - bool path_in_layer_changed = false; - if (path_ == path) { - path_in_layer_changed = path && layer_origin_ != new_layer_origin; - } else if (!path_ || !path) { - path_in_layer_changed = true; - } else { - SkPath new_path = path->GetSkPath(); - new_path.offset(layer_origin_.x() - new_layer_origin.x(), - layer_origin_.y() - new_layer_origin.y()); - path_in_layer_changed = path_->GetSkPath() != new_path; - } - - if (local_rrect_ != new_local_rrect || path_in_layer_changed) { - layer_->SetNeedsDisplay(); - } - layer_->SetOffsetToTransformParent(new_layer_origin); - layer_->SetBounds(gfx::Size(layer_bounds.Width(), layer_bounds.Height())); - - layer_origin_ = new_layer_origin; - local_rrect_ = new_local_rrect; - path_ = std::move(path); + bool path_in_layer_changed = false; + if (path_ == path) { + path_in_layer_changed = path && layer_origin_ != new_layer_origin; + } else if (!path_ || !path) { + path_in_layer_changed = true; + } else { + SkPath new_path = path->GetSkPath(); + new_path.offset(layer_origin_.x() - new_layer_origin.x(), + layer_origin_.y() - new_layer_origin.y()); + path_in_layer_changed = path_->GetSkPath() != new_path; } - cc::Layer* GetLayer() const { return layer_.get(); } - CompositorElementId GetMaskIsolationId() const { return mask_isolation_id_; } - CompositorElementId GetMaskEffectId() const { return mask_effect_id_; } - - private: - // ContentLayerClient implementation. - gfx::Rect PaintableRegion() final { return gfx::Rect(layer_->bounds()); } - bool FillsBoundsCompletely() const final { return false; } - size_t GetApproximateUnsharedMemoryUsage() const final { return 0; } - - scoped_refptr<cc::DisplayItemList> PaintContentsToDisplayList( - PaintingControlSetting) final { - auto cc_list = base::MakeRefCounted<cc::DisplayItemList>( - cc::DisplayItemList::kTopLevelDisplayItemList); - PaintFlags flags; - flags.setAntiAlias(true); - cc_list->StartPaint(); - if (!path_) { - cc_list->push<cc::DrawRRectOp>(local_rrect_, flags); - } else { - cc_list->push<cc::SaveOp>(); - cc_list->push<cc::TranslateOp>(-layer_origin_.x(), -layer_origin_.x()); - cc_list->push<cc::ClipPathOp>(path_->GetSkPath(), SkClipOp::kIntersect, - true); - SkRRect rrect = local_rrect_; - rrect.offset(layer_origin_.x(), layer_origin_.y()); - cc_list->push<cc::DrawRRectOp>(rrect, flags); - cc_list->push<cc::RestoreOp>(); - } - cc_list->EndPaintOfUnpaired(gfx::Rect(layer_->bounds())); - cc_list->Finalize(); - return cc_list; + if (local_rrect_ != new_local_rrect || path_in_layer_changed) { + layer_->SetNeedsDisplay(); } + layer_->SetOffsetToTransformParent(new_layer_origin); + layer_->SetBounds(gfx::Size(layer_bounds.Width(), layer_bounds.Height())); - private: - scoped_refptr<cc::PictureLayer> layer_; - gfx::Vector2dF layer_origin_; - SkRRect local_rrect_ = SkRRect::MakeEmpty(); - scoped_refptr<const RefCountedPath> path_; - CompositorElementId mask_isolation_id_; - CompositorElementId mask_effect_id_; -}; + layer_origin_ = new_layer_origin; + local_rrect_ = new_local_rrect; + path_ = std::move(path); +} -// TODO(pdr): There is no test that synthetic clip layers are re-used. -cc::Layer* PaintArtifactCompositor::CreateOrReuseSynthesizedClipLayer( +scoped_refptr<cc::DisplayItemList> SynthesizedClip::PaintContentsToDisplayList( + PaintingControlSetting) { + auto cc_list = base::MakeRefCounted<cc::DisplayItemList>( + cc::DisplayItemList::kTopLevelDisplayItemList); + PaintFlags flags; + flags.setAntiAlias(true); + cc_list->StartPaint(); + if (!path_) { + cc_list->push<cc::DrawRRectOp>(local_rrect_, flags); + } else { + cc_list->push<cc::SaveOp>(); + cc_list->push<cc::TranslateOp>(-layer_origin_.x(), -layer_origin_.x()); + cc_list->push<cc::ClipPathOp>(path_->GetSkPath(), SkClipOp::kIntersect, + true); + SkRRect rrect = local_rrect_; + rrect.offset(layer_origin_.x(), layer_origin_.y()); + cc_list->push<cc::DrawRRectOp>(rrect, flags); + cc_list->push<cc::RestoreOp>(); + } + cc_list->EndPaintOfUnpaired(gfx::Rect(layer_->bounds())); + cc_list->Finalize(); + return cc_list; +} + +SynthesizedClip& PaintArtifactCompositor::CreateOrReuseSynthesizedClipLayer( const ClipPaintPropertyNode& node, + bool needs_layer, CompositorElementId& mask_isolation_id, CompositorElementId& mask_effect_id) { auto entry = @@ -792,17 +761,19 @@ }); if (entry == synthesized_clip_cache_.end()) { auto clip = std::make_unique<SynthesizedClip>(); - clip->GetLayer()->SetLayerTreeHost(root_layer_->layer_tree_host()); entry = synthesized_clip_cache_.insert( entry, SynthesizedClipEntry{&node, std::move(clip), false}); } entry->in_use = true; SynthesizedClip& synthesized_clip = *entry->synthesized_clip; - synthesized_clip.Update(node.ClipRect(), node.ClipPath()); + if (needs_layer) { + synthesized_clip.UpdateLayer(needs_layer, node.ClipRect(), node.ClipPath()); + synthesized_clip.Layer()->SetLayerTreeHost(root_layer_->layer_tree_host()); + } mask_isolation_id = synthesized_clip.GetMaskIsolationId(); mask_effect_id = synthesized_clip.GetMaskEffectId(); - return synthesized_clip.GetLayer(); + return synthesized_clip; } static void UpdateCompositorViewportProperties( @@ -1060,7 +1031,7 @@ if (extra_data_for_testing_enabled_) { for (const auto& entry : synthesized_clip_cache_) { extra_data_for_testing_->synthesized_clip_layers.push_back( - entry.synthesized_clip->GetLayer()); + entry.synthesized_clip->Layer()); } } @@ -1159,18 +1130,6 @@ return false; } -static bool MayHaveBackdropFilter( - const cc::EffectNode& effect, - const Vector<const EffectPaintPropertyNode*>& blink_effects) { - if (!effect.backdrop_filters.IsEmpty()) - return true; - if (static_cast<size_t>(effect.id) < blink_effects.size() && - blink_effects[effect.id] && - blink_effects[effect.id]->HasActiveBackdropFilterAnimation()) - return true; - return false; -} - // Every effect is supposed to have render surface enabled for grouping, but we // can omit one if the effect is opacity- or blend-mode-only, render surface is // not forced, and the effect has only one compositing child. This is both for @@ -1182,40 +1141,42 @@ cc::EffectTree& effect_tree, const cc::LayerList& layers, const Vector<const EffectPaintPropertyNode*>& blink_effects) { - // This vector is indexed by effect node id. The value indicates whether we - // have seen the effect but not sure if we should create a render surface for - // it yet. - Vector<bool> pending_render_surfaces; - pending_render_surfaces.resize(effect_tree.size()); + // This vector is indexed by effect node id. The value is the number of layers + // and sub-render-surfaces controlled by this effect. + Vector<int> effect_layer_counts(effect_tree.size()); + // Initialize the vector to count directly controlled layers. for (const auto& layer : layers) { - if (!layer->DrawsContent()) - continue; - bool descendant_may_have_backdrop_filter = false; - auto* effect = effect_tree.Node(layer->effect_tree_index()); - bool may_have_backdrop_filter = - MayHaveBackdropFilter(*effect, blink_effects); - while (!effect->has_render_surface || - // We need to check ancestor of backdrop filter to find render - // surface candidate. - may_have_backdrop_filter) { - if (IsRenderSurfaceCandidate(*effect, blink_effects)) { - // The render surface candidate is seen a second time, which means that - // it has more than one compositing child and needs a render surface. - if (pending_render_surfaces[effect->id] || - // Or the opacity effect has a backdrop-filter descendant. - descendant_may_have_backdrop_filter) { - effect->has_render_surface = true; - if (!may_have_backdrop_filter) - break; - } else { - // We are not sure if the effect should have render surface for now. - pending_render_surfaces[effect->id] = true; - } - } - effect = effect_tree.Node(effect->parent_id); - descendant_may_have_backdrop_filter |= may_have_backdrop_filter; - may_have_backdrop_filter = MayHaveBackdropFilter(*effect, blink_effects); + if (layer->DrawsContent()) + effect_layer_counts[layer->effect_tree_index()]++; + } + + // In the effect tree, parent always has lower id than children, so the + // following loop will check descendants before parents and accumulate + // effect_layer_counts. + for (auto id = effect_tree.size() - 1; + id > cc::EffectTree::kSecondaryRootNodeId; id--) { + auto* effect = effect_tree.Node(id); + if (IsRenderSurfaceCandidate(*effect, blink_effects) && + effect_layer_counts[id] > 1) { + // The render surface candidate needs a render surface because it + // controls more than 1 layer. + effect->has_render_surface = true; } + + // We should not have visited the parent. + DCHECK_NE(-1, effect_layer_counts[effect->parent_id]); + if (effect->has_render_surface) { + // A sub-render-surface counts as one controlled layer of the parent. + effect_layer_counts[effect->parent_id]++; + } else { + // Otherwise all layers count as controlled layers of the parent. + effect_layer_counts[effect->parent_id] += effect_layer_counts[id]; + } + +#if DCHECK_IS_ON() + // Mark we have visited this effect. + effect_layer_counts[id] = -1; +#endif } }
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h index 1823ed92..c9e0991 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h
@@ -11,7 +11,9 @@ #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/memory/scoped_refptr.h" +#include "cc/layers/content_layer_client.h" #include "cc/layers/layer_collections.h" +#include "cc/layers/picture_layer.h" #include "third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h" #include "third_party/blink/renderer/platform/graphics/graphics_layer_client.h" #include "third_party/blink/renderer/platform/graphics/paint/paint_controller.h" @@ -48,6 +50,57 @@ cc::LayerList list_; }; +// This class maintains unique stable cc effect IDs (and optionally a persistent +// mask layer) for reuse across compositing cycles. The mask layer paints a +// rounded rect, which is an updatable parameter of the class. The caller is +// responsible for inserting the mask layer into layer list and associating with +// property nodes. The mask layer may be omitted if the caller determines it is +// not necessary (e.g. because there is no content to mask). +// +// The typical application of the mask layer is to create an isolating effect +// node to paint the clipped contents, and at the end draw the mask layer with +// a kDstIn blend effect. This is why two stable cc effect IDs are provided. +// Even if the mask layer is not present, it's important for the isolation +// effect node to be stable, to minimize render surface damage. +class SynthesizedClip : private cc::ContentLayerClient { + public: + SynthesizedClip() : layer_(nullptr) { + mask_isolation_id_ = + CompositorElementIdFromUniqueObjectId(NewUniqueObjectId()); + mask_effect_id_ = + CompositorElementIdFromUniqueObjectId(NewUniqueObjectId()); + } + ~SynthesizedClip() override { + if (layer_) + layer_->ClearClient(); + } + + void UpdateLayer(bool needs_layer, + const FloatRoundedRect& rrect, + scoped_refptr<const RefCountedPath> path); + + cc::Layer* Layer() { return layer_.get(); } + CompositorElementId GetMaskIsolationId() const { return mask_isolation_id_; } + CompositorElementId GetMaskEffectId() const { return mask_effect_id_; } + + private: + // ContentLayerClient implementation. + gfx::Rect PaintableRegion() final { return gfx::Rect(layer_->bounds()); } + bool FillsBoundsCompletely() const final { return false; } + size_t GetApproximateUnsharedMemoryUsage() const final { return 0; } + + scoped_refptr<cc::DisplayItemList> PaintContentsToDisplayList( + PaintingControlSetting) final; + + private: + scoped_refptr<cc::PictureLayer> layer_; + gfx::Vector2dF layer_origin_; + SkRRect local_rrect_ = SkRRect::MakeEmpty(); + scoped_refptr<const RefCountedPath> path_; + CompositorElementId mask_isolation_id_; + CompositorElementId mask_effect_id_; +}; + // Responsible for managing compositing in terms of a PaintArtifact. // // Owns a subtree of the compositor layer tree, and updates it in response to @@ -233,8 +286,13 @@ std::unique_ptr<ContentLayerClientImpl> ClientForPaintChunk( const PaintChunk&); - cc::Layer* CreateOrReuseSynthesizedClipLayer( + // if |needs_layer| is false, no cc::Layer is created, |mask_effect_id| is + // not set, and the Layer() method on the returned SynthesizedClip returns + // nullptr. + // However, |mask_isolation_id| is always set. + SynthesizedClip& CreateOrReuseSynthesizedClipLayer( const ClipPaintPropertyNode&, + bool needs_layer, CompositorElementId& mask_isolation_id, CompositorElementId& mask_effect_id) final;
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc index b2e84e1..03f226d6 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
@@ -2645,7 +2645,9 @@ // One content layer, no clip mask (because layer doesn't draw content). ASSERT_EQ(1u, RootLayer()->children().size()); ASSERT_EQ(1u, ContentLayerCount()); - ASSERT_EQ(0u, SynthesizedClipLayerCount()); + ASSERT_EQ(1u, SynthesizedClipLayerCount()); + // There is a synthesized clip", but it has no layer backing. + ASSERT_EQ(nullptr, SynthesizedClipLayerAt(0)); const cc::Layer* content0 = RootLayer()->children()[0].get(); @@ -2664,6 +2666,52 @@ EXPECT_EQ(SkBlendMode::kSrcOver, mask_isolation_0.blend_mode); } +TEST_P(PaintArtifactCompositorTest, ReuseSyntheticClip) { + // This tests the simplist case that a single layer needs to be clipped + // by a single composited rounded clip. + FloatSize corner(5, 5); + FloatRoundedRect rrect(FloatRect(50, 50, 300, 200), corner, corner, corner, + corner); + auto c1 = CreateClip(c0(), t0(), rrect); + auto c2 = CreateClip(c0(), t0(), rrect); + + TestPaintArtifact artifact; + artifact.Chunk(t0(), *c1, e0()) + .RectDrawing(FloatRect(0, 0, 0, 0), Color::kBlack); + Update(artifact.Build()); + + const cc::Layer* content0 = RootLayer()->children()[0].get(); + + uint64_t old_stable_id = GetPropertyTrees() + .effect_tree.Node(content0->effect_tree_index()) + ->stable_id; + + TestPaintArtifact repeated_artifact; + repeated_artifact.Chunk(t0(), *c1, e0()) + .RectDrawing(FloatRect(0, 0, 0, 0), Color::kBlack); + Update(repeated_artifact.Build()); + const cc::Layer* content1 = RootLayer()->children()[0].get(); + + // Check that stable ids are reused across updates. + EXPECT_EQ(GetPropertyTrees() + .effect_tree.Node(content1->effect_tree_index()) + ->stable_id, + old_stable_id); + + TestPaintArtifact changed_artifact; + changed_artifact.Chunk(t0(), *c2, e0()) + .RectDrawing(FloatRect(0, 0, 0, 0), Color::kBlack); + Update(changed_artifact.Build()); + const cc::Layer* content2 = RootLayer()->children()[0].get(); + + // The new artifact changed the clip node to c2, so the synthetic clip should + // not be reused. + EXPECT_NE(GetPropertyTrees() + .effect_tree.Node(content2->effect_tree_index()) + ->stable_id, + old_stable_id); +} + TEST_P(PaintArtifactCompositorTest, SynthesizedClipIndirectlyCompositedClipPath) { // This tests the case that a clip node needs to be synthesized due to @@ -3442,13 +3490,36 @@ // render surface. EXPECT_OPACITY(effect_ids[4], 0.4f, kHasRenderSurface); - // Though all children of effect |e| have render surfaces and |e| doesn't - // control any compositing layer, we still give it a render surface for - // simplicity of the algorithm. + // |e| has render surface because it has 3 child render surfaces. EXPECT_OPACITY(effect_tree.Node(effect_ids[4])->parent_id, 0.1f, kHasRenderSurface); } +TEST_P(PaintArtifactCompositorTest, OpacityRenderSurfacesWithFilterChildren) { + auto opacity = CreateOpacityEffect(e0(), 0.1f); + CompositorFilterOperations filter; + filter.AppendBlurFilter(5); + auto filter1 = CreateFilterEffect(*opacity, filter, FloatPoint(), + CompositingReason::kActiveFilterAnimation); + auto filter2 = CreateFilterEffect(*opacity, filter, FloatPoint(), + CompositingReason::kActiveFilterAnimation); + + FloatRect r(150, 150, 100, 100); + Update(TestPaintArtifact() + .Chunk(t0(), c0(), *filter1) + .RectDrawing(r, Color::kWhite) + .Chunk(t0(), c0(), *filter2) + .RectDrawing(r, Color::kWhite) + .Build()); + ASSERT_EQ(2u, ContentLayerCount()); + auto filter_id1 = ContentLayerAt(0)->effect_tree_index(); + auto filter_id2 = ContentLayerAt(1)->effect_tree_index(); + EXPECT_OPACITY(filter_id1, 1.f, kHasRenderSurface); + EXPECT_OPACITY(filter_id2, 1.f, kHasRenderSurface); + EXPECT_OPACITY(GetPropertyTrees().effect_tree.Node(filter_id1)->parent_id, + 0.1f, kHasRenderSurface); +} + TEST_P(PaintArtifactCompositorTest, OpacityAnimationRenderSurfaces) { // The topologies of the effect tree and layer tree are the same as // OpacityRencerSurfaces, except that the layers all have 1.f opacity and
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc index 765f896..292460db 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
@@ -542,30 +542,35 @@ } void PropertyTreeManager::EmitClipMaskLayer() { - if (RuntimeEnabledFeatures::FastBorderRadiusEnabled()) - return; - cc::EffectNode& mask_isolation = *GetEffectTree().Node(current_.effect_id); - if (pending_synthetic_mask_layers_.Contains(mask_isolation.id)) - return; + + bool needs_layer = + !pending_synthetic_mask_layers_.Contains(mask_isolation.id) && + !RuntimeEnabledFeatures::FastBorderRadiusEnabled(); int clip_id = EnsureCompositorClipNode(*current_.clip); CompositorElementId mask_isolation_id, mask_effect_id; - cc::Layer* mask_layer = client_.CreateOrReuseSynthesizedClipLayer( - *current_.clip, mask_isolation_id, mask_effect_id); + SynthesizedClip& clip = client_.CreateOrReuseSynthesizedClipLayer( + *current_.clip, needs_layer, mask_isolation_id, mask_effect_id); // Assignment of mask_isolation.stable_id was delayed until now. // See PropertyTreeManager::SynthesizeCcEffectsForClipsIfNeeded(). DCHECK_EQ(static_cast<uint64_t>(cc::EffectNode::INVALID_STABLE_ID), mask_isolation.stable_id); + mask_isolation.stable_id = mask_isolation_id.GetInternalValue(); + if (!needs_layer) + return; + cc::EffectNode& mask_effect = *GetEffectTree().Node( GetEffectTree().Insert(cc::EffectNode(), current_.effect_id)); mask_effect.stable_id = mask_effect_id.GetInternalValue(); mask_effect.clip_id = clip_id; mask_effect.blend_mode = SkBlendMode::kDstIn; + cc::Layer* mask_layer = clip.Layer(); + const auto& clip_space = current_.clip->LocalTransformSpace(); layer_list_builder_->Add(mask_layer); mask_layer->set_property_tree_sequence_number(
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h index bf15ad1..e89647a 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h +++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h
@@ -30,12 +30,14 @@ class LayerListBuilder; class EffectPaintPropertyNode; class ScrollPaintPropertyNode; +class SynthesizedClip; class TransformPaintPropertyNode; class PropertyTreeManagerClient { public: - virtual cc::Layer* CreateOrReuseSynthesizedClipLayer( + virtual SynthesizedClip& CreateOrReuseSynthesizedClipLayer( const ClipPaintPropertyNode&, + bool needs_layer, CompositorElementId& mask_isolation_id, CompositorElementId& mask_effect_id) = 0; };
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc index f4797a25..8860335 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -122,6 +122,8 @@ // Also parser-blocking scripts (set explicitly in loadPriority) return ResourceLoadPriority::kVeryHigh; case ResourceType::kXSLStyleSheet: + DCHECK(RuntimeEnabledFeatures::XSLTEnabled()); + FALLTHROUGH; case ResourceType::kRaw: case ResourceType::kImportResource: case ResourceType::kScript: @@ -267,6 +269,8 @@ (type == ResourceType::kImage && is_image_set == kImageIsImageSet)); switch (type) { case ResourceType::kXSLStyleSheet: + DCHECK(RuntimeEnabledFeatures::XSLTEnabled()); + FALLTHROUGH; case ResourceType::kCSSStyleSheet: return mojom::RequestContextType::STYLE; case ResourceType::kScript:
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index c7d253e..787c9aeb 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -52,7 +52,7 @@ // It is NOT supported. As a workaround, you can either specify the same // |origin_trial_feature_name| for the feature or add the OT feature to // the |implied_by| list. - // TODO(yashard): Add support for origin trial features in 'depends_on' list + // TODO(https://crbug.com/954679): Add support for origin trial features in 'depends_on' list depends_on: { default: [], valid_type: "list", @@ -1594,9 +1594,14 @@ }, { name: "WebXRHitTest", + // depends_on: ["WebXR"], // TODO(https://crbug.com/954679): uncomment once bug is fixed status: "experimental" }, { + name: "WebXRPlaneDetection", + // depends_on: ["WebXR"], // TODO(https://crbug.com/954679): uncomment once bug is fixed + }, + { name: "WorkerNosniffBlock", status: "stable", }, @@ -1609,5 +1614,9 @@ name: "WorkerTaskQueue", status: "experimental" }, + { + name: "XSLT", + status: "stable", + }, ], }
diff --git a/third_party/blink/renderer/platform/text/capitalize.cc b/third_party/blink/renderer/platform/text/capitalize.cc index 5ddb9f3..a30f811e 100644 --- a/third_party/blink/renderer/platform/text/capitalize.cc +++ b/third_party/blink/renderer/platform/text/capitalize.cc
@@ -32,8 +32,7 @@ string_with_previous[i] = input[i - 1]; } - TextBreakIterator* boundary = - WordBreakIterator({string_with_previous.Characters(), length + 1}); + TextBreakIterator* boundary = WordBreakIterator(string_with_previous.Span()); if (!boundary) return string;
diff --git a/third_party/blink/renderer/platform/wtf/text/string_buffer.h b/third_party/blink/renderer/platform/wtf/text/string_buffer.h index f9d56326..64caaa7 100644 --- a/third_party/blink/renderer/platform/wtf/text/string_buffer.h +++ b/third_party/blink/renderer/platform/wtf/text/string_buffer.h
@@ -29,6 +29,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_STRING_BUFFER_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_STRING_BUFFER_H_ +#include "base/containers/span.h" #include "base/macros.h" #include "third_party/blink/renderer/platform/wtf/allocator.h" #include "third_party/blink/renderer/platform/wtf/assertions.h" @@ -53,6 +54,11 @@ void Shrink(unsigned new_length); + // Prefer Span() to length()/Characters(). + base::span<CharType> Span() { + return base::span<CharType>(Characters(), length()); + } + unsigned length() const { return data_ ? data_->length() : 0; } CharType* Characters() { return length() ? const_cast<CharType*>(data_->GetCharacters<CharType>())
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG index 2b74ca2..dfc540c 100644 --- a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG
@@ -288,6 +288,8 @@ crbug.com/591099 fast/multicol/border-radius-clipped-layer.html [ Pass ] crbug.com/591099 fast/peerconnection/RTCPeerConnection-many.html [ Pass ] crbug.com/591099 fast/replaced/replaced-breaking.html [ Failure Pass ] +# Some outline rect is added double offset. +crbug.com/835484 fast/spatial-navigation/snav-iframe-with-offscreen-focusable-element.html [ Failure ] crbug.com/899902 fast/text/ellipsis-with-self-painting-layer.html [ Pass ] crbug.com/591099 fast/text/emoji-vertical-origin-visual.html [ Failure ] crbug.com/591099 fast/text/font-format-support-color-cff2-vertical.html [ Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json index 9819867f..c03f97d 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -200660,11 +200660,6 @@ {} ] ], - "webrtc/RTCPeerConnection-iceConnectionState.https-expected.txt": [ - [ - {} - ] - ], "webrtc/RTCPeerConnection-iceGatheringState-expected.txt": [ [ {} @@ -481892,7 +481887,7 @@ "support" ], "resources/testharness.js": [ - "cb341db2050ee201a7646e1db22634682b05bc97", + "e57c06d775c90bb65550c0a45621e8883afd4f2e", "support" ], "resources/testharness.js.headers": [ @@ -500419,12 +500414,8 @@ "b28601423de0b987c27db05d4b4061ece60f0129", "support" ], - "webrtc/RTCPeerConnection-iceConnectionState.https-expected.txt": [ - "7ea53f6d9ae2a2a17025fc01713224427e85c327", - "support" - ], "webrtc/RTCPeerConnection-iceConnectionState.https.html": [ - "768da23ddbf7eeed91bf351f080c12b8338696fa", + "1bb07935cc70b767fda1872f4495f0655b6a44c7", "testharness" ], "webrtc/RTCPeerConnection-iceGatheringState-expected.txt": [
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-creation.https.html b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-creation.https.html index 9ad60586d..02886c4 100644 --- a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-creation.https.html +++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-creation.https.html
@@ -125,10 +125,10 @@ otherDoc.body.appendChild(otherElement); let otherEffect = CreateKeyframeEffect(otherElement); - let constructorFunc = function() { new WorkletAnimation( - 'test-animator', [ effect, otherEffect ]); }; - assert_throws('NotSupportedError', constructorFunc); - }, 'If the effects are from different documents, object construction should fail'); + let workletAnimation = new WorkletAnimation( + 'test-animator', [ effect, otherEffect ]); + assert_equals(workletAnimation.playState, 'idle'); + }, 'Creating animation with effects from different documents is allowed'); promise_test(async t => { await runInAnimationWorklet(document.getElementById('simple_animate').textContent);
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-effects-from-different-frames.https.html b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-effects-from-different-frames.https.html new file mode 100644 index 0000000..152b138 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-effects-from-different-frames.https.html
@@ -0,0 +1,48 @@ +<!DOCTYPE html> +<title>Worklet animation can animate effects from different frames</title> +<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="common.js"></script> + +<div id="box"></div> + +<script id="simple_animate" type="text/worklet"> + registerAnimator("test_animator", class { + animate(currentTime, effect) { + let effects = effect.getChildren(); + effects[0].localTime = 500; + effects[1].localTime = 750; + } + }); +</script> + +<script> + promise_test(async t => { + await runInAnimationWorklet(document.getElementById('simple_animate').textContent); + const effect = new KeyframeEffect(box, [{ opacity: 0 }], { duration: 1000 }); + + let iframe = document.createElement('iframe'); + iframe.src = 'resources/iframe.html'; + document.body.appendChild(iframe); + + await waitForAnimationFrameWithCondition(_ => { + return iframe.contentDocument.getElementById('iframe_box') != null; + }); + let iframe_box = iframe.contentDocument.getElementById('iframe_box'); + let iframe_effect = new KeyframeEffect( + iframe_box, [{ opacity: 0 }], { duration: 1000 } + ); + + const animation = new WorkletAnimation('test_animator', [effect, iframe_effect]); + animation.play(); + + await waitForNotNullLocalTime(animation); + assert_equals(getComputedStyle(box).opacity, '0.5'); + assert_equals(getComputedStyle(iframe_box).opacity, '0.25'); + + iframe.remove(); + animation.cancel(); + }, "Effects from different documents can be animated within one worklet animation"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/composited-filters-under-opacity-ref.html b/third_party/blink/web_tests/external/wpt/css/css-color/composited-filters-under-opacity-ref.html new file mode 100644 index 0000000..73b42018 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/composited-filters-under-opacity-ref.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<style> +div { + position: absolute; +} +.content { + width: 100px; + height: 150px; + position: absolute; + background: blue; +} +</style> +Below should be a light blue square in uniform color. +<div style="opacity: 0.5; will-change: opacity"> + <div class="content" style="left: 0"></div> + <div class="content" style="left: 50px"></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/composited-filters-under-opacity.html b/third_party/blink/web_tests/external/wpt/css/css-color/composited-filters-under-opacity.html new file mode 100644 index 0000000..f613748 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/composited-filters-under-opacity.html
@@ -0,0 +1,20 @@ +<link rel="help" href="http://www.w3.org/TR/css3-color/#transparency"> +<link rel="match" href="composited-filters-under-opacity-ref.html"> +<style> +div { + position: absolute; + will-change: opacity; +} +.content { + width: 100px; + height: 150px; + position: absolute; + background: yellow; + filter: invert(100%); +} +</style> +Below should be a light blue square in uniform color. +<div style="opacity: 0.5"> + <div class="content" style="left: 0"></div> + <div class="content" style="left: 50px"></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/beforeunload-synchronous-expected.txt b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/beforeunload-synchronous-expected.txt deleted file mode 100644 index 06da69d..0000000 --- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/beforeunload-synchronous-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL beforeunload event is emitted synchronously assert_equals: invoked synchronously exactly once expected 1 but got 0 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/028-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/028-expected.txt deleted file mode 100644 index fce7548..0000000 --- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/028-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -FAIL scheduler: javascript: URL assert_array_equals: lengths differ, expected 4 got 3 - -assert_array_equals: lengths differ, expected 4 got 3 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/lint.whitelist b/third_party/blink/web_tests/external/wpt/lint.whitelist index f354fd9..27f70db 100644 --- a/third_party/blink/web_tests/external/wpt/lint.whitelist +++ b/third_party/blink/web_tests/external/wpt/lint.whitelist
@@ -185,6 +185,7 @@ SET TIMEOUT: old-tests/submission/Microsoft/history/history_000.htm SET TIMEOUT: paint-timing/resources/subframe-painting.html SET TIMEOUT: payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html +SET TIMEOUT: portals/resources/portals-adopt-predecessor-portal.html SET TIMEOUT: preload/single-download-preload.html SET TIMEOUT: resize-observer/resources/iframe.html SET TIMEOUT: resource-timing/resources/nested-contexts.js
diff --git a/third_party/blink/web_tests/external/wpt/portals/portals-adopt-predecessor.html b/third_party/blink/web_tests/external/wpt/portals/portals-adopt-predecessor.html index 27e4052..90da9186 100644 --- a/third_party/blink/web_tests/external/wpt/portals/portals-adopt-predecessor.html +++ b/third_party/blink/web_tests/external/wpt/portals/portals-adopt-predecessor.html
@@ -22,4 +22,14 @@ }); window.open(`resources/portals-adopt-predecessor.html?test=${test}`); }, "Tests that trying to adopt the predecessor twice will throw an exception."); + + async_test(function(t) { + var test = "adopt-after-event"; + var bc = new BroadcastChannel(`test-${test}`); + bc.onmessage = t.step_func_done(function(e) { + assert_equals(e.data, "passed"); + bc.close(); + }); + window.open(`resources/portals-adopt-predecessor.html?test=${test}`); + }, "Tests that trying to adopt the predecessor after the PortalActivateEvent will throw an exception."); </script>
diff --git a/third_party/blink/web_tests/external/wpt/portals/resources/portals-adopt-predecessor-portal.html b/third_party/blink/web_tests/external/wpt/portals/resources/portals-adopt-predecessor-portal.html index 14d1018..5181748d 100644 --- a/third_party/blink/web_tests/external/wpt/portals/resources/portals-adopt-predecessor-portal.html +++ b/third_party/blink/web_tests/external/wpt/portals/resources/portals-adopt-predecessor-portal.html
@@ -4,21 +4,41 @@ var test = searchParams.get("test"); window.onportalactivate = function(e) { - var portal = e.adoptPredecessor(); - document.body.appendChild(portal); - if (test == "adopt-once") { + var portal = e.adoptPredecessor(); + document.body.appendChild(portal); + if (portal instanceof HTMLPortalElement) { portal.postMessage("adopted", "*"); } } if (test == "adopt-twice") { + var portal = e.adoptPredecessor(); + document.body.appendChild(portal); + try { e.adoptPredecessor(); } catch(e) { - portal.postMessage("passed", "*"); + if (e.name == "InvalidStateError") { + var bc_test = new BroadcastChannel(`test-${test}`); + bc_test.postMessage("passed"); + bc_test.close(); + } } } + if (test == "adopt-after-event") { + setTimeout(function() { + try { + e.adoptPredecessor(); + } catch(e) { + if (e.name == "InvalidStateError") { + var bc_test = new BroadcastChannel(`test-${test}`); + bc_test.postMessage("passed"); + bc_test.close(); + } + } + }); + } } var bc = new BroadcastChannel(`portal-${test}`);
diff --git a/third_party/blink/web_tests/external/wpt/resources/testharness.js b/third_party/blink/web_tests/external/wpt/resources/testharness.js index cb341db2..e57c06d7 100644 --- a/third_party/blink/web_tests/external/wpt/resources/testharness.js +++ b/third_party/blink/web_tests/external/wpt/resources/testharness.js
@@ -1132,7 +1132,7 @@ assert(Math.abs(actual[i] - expected[i]) <= epsilon, "assert_array_approx_equals", description, "property ${i}, expected ${expected} +/- ${epsilon}, expected ${expected} but got ${actual}", - {i:i, expected:expected[i], actual:actual[i]}); + {i:i, expected:expected[i], actual:actual[i], epsilon:epsilon}); } } expose(assert_array_approx_equals, "assert_array_approx_equals");
diff --git a/third_party/blink/web_tests/fast/dom/location-new-window-no-crash-expected.txt b/third_party/blink/web_tests/fast/dom/location-new-window-no-crash-expected.txt index 2d27a0f6..c31eaf3 100644 --- a/third_party/blink/web_tests/fast/dom/location-new-window-no-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/location-new-window-no-crash-expected.txt
@@ -1,4 +1,7 @@ CONSOLE ERROR: line 15: Not allowed to navigate top frame to data URL: data:text/plain,a +CONSOLE ERROR: Not allowed to navigate top frame to data URL: data:text/plain,b +CONSOLE ERROR: Not allowed to navigate top frame to data URL: data:text/plain,i +CONSOLE ERROR: Not allowed to navigate top frame to data URL: data:text/plain,j Tests that manipulating location properties in a just-created window object does not crash. Note: Turn off pop-up blocking to run this in-browser. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/layout/subtree-layout-with-javascript-navigate-crash-expected.txt b/third_party/blink/web_tests/fast/layout/subtree-layout-with-javascript-navigate-crash-expected.txt index ff15046a..3c36d5b 100644 --- a/third_party/blink/web_tests/fast/layout/subtree-layout-with-javascript-navigate-crash-expected.txt +++ b/third_party/blink/web_tests/fast/layout/subtree-layout-with-javascript-navigate-crash-expected.txt
@@ -1 +1 @@ -Test passes if no crash with ASAN. +Test passes if no crash with ASAN.
diff --git a/third_party/blink/web_tests/fast/layout/subtree-layout-with-javascript-navigate-crash.html b/third_party/blink/web_tests/fast/layout/subtree-layout-with-javascript-navigate-crash.html index ed3cb7a..6e811cd 100644 --- a/third_party/blink/web_tests/fast/layout/subtree-layout-with-javascript-navigate-crash.html +++ b/third_party/blink/web_tests/fast/layout/subtree-layout-with-javascript-navigate-crash.html
@@ -1,6 +1,5 @@ <!DOCTYPE html> <body> -Test passes if no crash with ASAN. <input value="boom"> <script> if (window.testRunner) { @@ -15,7 +14,7 @@ input.value = value.substr(0, value.length - 1); window.setTimeout(explode, 0); } else { - window.location.href="javascript:''"; + window.location.href="javascript:'Test passes if no crash with ASAN.'"; if (window.testRunner) testRunner.notifyDone(); }
diff --git a/third_party/blink/web_tests/fast/spatial-navigation/resources/snav-testharness.js b/third_party/blink/web_tests/fast/spatial-navigation/resources/snav-testharness.js index 93f2016c..21061b0 100644 --- a/third_party/blink/web_tests/fast/spatial-navigation/resources/snav-testharness.js +++ b/third_party/blink/web_tests/fast/spatial-navigation/resources/snav-testharness.js
@@ -59,7 +59,10 @@ return elem; } + let step = 0; + let failureTimer = 0; function stepAndAssertMoves(expectedMoves) { + step++; if (expectedMoves.length == 0) { if (gPostAssertsFunc) gAsyncTest.step(gPostAssertsFunc); @@ -73,8 +76,10 @@ let wanted = findElement(expectedId); let receivingDoc = wanted.ownerDocument; let verifyAndAdvance = gAsyncTest.step_func(function() { + clearTimeout(failureTimer); let focused = window.internals.interestedElement; - assert_equals(focused, wanted); + assert_equals(focused, wanted, + 'step ' + step + ': expected focus ' + expectedId + ', actual focus ' + focused.id); // Kick off another async test step. stepAndAssertMoves(expectedMoves); }); @@ -85,6 +90,12 @@ // the succeeding keyup-event, it's safe to assert activeElement. // The keyup-event targets the, perhaps newly, focused document. receivingDoc.addEventListener('keyup', verifyAndAdvance, {once: true}); + // Start a timer to catch the failure of missing keyup event. + failureTimer = setTimeout(gAsyncTest.step_func(function() { + assert_unreached('step ' + step + ': timeout when waiting for focus on ' + expectedId + + ', actual focus on ' + window.internals.interestedElement.id); + gAsyncTest.done(); + }), 1000); triggerMove(direction); }
diff --git a/third_party/blink/web_tests/fast/spatial-navigation/snav-imagemap-overlapped-areas.html b/third_party/blink/web_tests/fast/spatial-navigation/snav-imagemap-overlapped-areas.html index 22aab431f..5ed818a 100644 --- a/third_party/blink/web_tests/fast/spatial-navigation/snav-imagemap-overlapped-areas.html +++ b/third_party/blink/web_tests/fast/spatial-navigation/snav-imagemap-overlapped-areas.html
@@ -6,6 +6,7 @@ </map> <a id="start" href="a"><img src="resources/green.png" width=50px height=50px></a> +<br><br> <div> <img src="resources/green.png" width=200px height=200px usemap="#map"> </div>
diff --git a/third_party/blink/web_tests/http/tests/loading/stop-load-at-commit-expected.txt b/third_party/blink/web_tests/http/tests/loading/stop-load-at-commit-expected.txt index cccc8d2..1b64335a 100644 --- a/third_party/blink/web_tests/http/tests/loading/stop-load-at-commit-expected.txt +++ b/third_party/blink/web_tests/http/tests/loading/stop-load-at-commit-expected.txt
@@ -3,10 +3,10 @@ main frame - didCommitLoadForFrame main frame - didReceiveTitle: main frame - didFinishDocumentLoadForFrame -main frame - didHandleOnloadEventsForFrame -main frame - didFinishLoadForFrame main frame - BeginNavigation request to 'http://127.0.0.1:8000/navigation/resources/pass-and-notify-done.html', http method GET main frame - DidStartNavigation +main frame - didFinishLoadForFrame +main frame - didHandleOnloadEventsForFrame main frame - ReadyToCommitNavigation main frame - didCommitLoadForFrame main frame - didReceiveTitle:
diff --git a/third_party/blink/web_tests/http/tests/misc/onload-detach-during-csp-frame-src-none-expected.txt b/third_party/blink/web_tests/http/tests/misc/onload-detach-during-csp-frame-src-none-expected.txt index 7252be87..8b9dd3c 100644 --- a/third_party/blink/web_tests/http/tests/misc/onload-detach-during-csp-frame-src-none-expected.txt +++ b/third_party/blink/web_tests/http/tests/misc/onload-detach-during-csp-frame-src-none-expected.txt
@@ -1,3 +1,3 @@ -CONSOLE ERROR: Refused to frame '' because it violates the following Content Security Policy directive: "frame-src 'none'". +CONSOLE ERROR: line 11: Refused to frame '' because it violates the following Content Security Policy directive: "frame-src 'none'". PASS
diff --git a/third_party/blink/web_tests/http/tests/security/aboutBlank/security-context-grandchildren-write-lexical-expected.txt b/third_party/blink/web_tests/http/tests/security/aboutBlank/security-context-grandchildren-write-lexical-expected.txt index 9b554b5..b5cc88e 100644 --- a/third_party/blink/web_tests/http/tests/security/aboutBlank/security-context-grandchildren-write-lexical-expected.txt +++ b/third_party/blink/web_tests/http/tests/security/aboutBlank/security-context-grandchildren-write-lexical-expected.txt
@@ -27,3 +27,4 @@ document.baseURI = http://127.0.0.1:8000/security/aboutBlank/security-context-grandchildren-write-lexical.html document.cookie = cookie=parent --- Test ends --- +Helpers loaded!
diff --git a/third_party/blink/web_tests/http/tests/security/aboutBlank/security-context-grandchildren-writeln-lexical-expected.txt b/third_party/blink/web_tests/http/tests/security/aboutBlank/security-context-grandchildren-writeln-lexical-expected.txt index c958521..4a6bea8 100644 --- a/third_party/blink/web_tests/http/tests/security/aboutBlank/security-context-grandchildren-writeln-lexical-expected.txt +++ b/third_party/blink/web_tests/http/tests/security/aboutBlank/security-context-grandchildren-writeln-lexical-expected.txt
@@ -27,3 +27,4 @@ document.baseURI = http://127.0.0.1:8000/security/aboutBlank/security-context-grandchildren-writeln-lexical.html document.cookie = cookie=parent --- Test ends --- +Helpers loaded!
diff --git a/third_party/blink/web_tests/http/tests/security/xss-DENIED-javascript-variations.html b/third_party/blink/web_tests/http/tests/security/xss-DENIED-javascript-variations.html index f502952..2b9ddba 100644 --- a/third_party/blink/web_tests/http/tests/security/xss-DENIED-javascript-variations.html +++ b/third_party/blink/web_tests/http/tests/security/xss-DENIED-javascript-variations.html
@@ -12,18 +12,18 @@ a.location.href = " javascript:document.write('FAIL')"; a.location.href = "javascript\t:document.write('FAIL')"; - try { a.location.href = "javascript\1:document.write('FAIL')"; } catch(e) {} + a.location.href = "javascript:document.write('FAIL')"; a.location.replace(" javascript:document.write('FAIL')"); a.location.replace("javascript\t:document.write('FAIL')"); - try { a.location.replace("javascript\1:document.write('FAIL')"); } catch(e) {} + a.location.replace("javascript:document.write('FAIL')"); a.location = " javascript:document.write('FAIL')"; a.location = "javascript\t:document.write('FAIL')"; - try { a.location = "javascript\1:document.write('FAIL')"; } catch(e) {} + a.location = "javascript:document.write('FAIL')"; } </script>
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png index cb4376da..5ae7251 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/overflow/nested-render-surfaces-with-rotation-expected.png b/third_party/blink/web_tests/platform/mac/compositing/overflow/nested-render-surfaces-with-rotation-expected.png index 98125e0..1600edb 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/overflow/nested-render-surfaces-with-rotation-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/overflow/nested-render-surfaces-with-rotation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/overflow/nested-render-surfaces-with-rotation-expected.png b/third_party/blink/web_tests/platform/win/compositing/overflow/nested-render-surfaces-with-rotation-expected.png index f123843..bf3c809 100644 --- a/third_party/blink/web_tests/platform/win/compositing/overflow/nested-render-surfaces-with-rotation-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/overflow/nested-render-surfaces-with-rotation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png index 671d64d..3c08764 100644 --- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png Binary files differ
diff --git a/third_party/crashpad/README.chromium b/third_party/crashpad/README.chromium index 0b22c6cc..1e9de7d 100644 --- a/third_party/crashpad/README.chromium +++ b/third_party/crashpad/README.chromium
@@ -2,7 +2,7 @@ Short Name: crashpad URL: https://crashpad.chromium.org/ Version: unknown -Revision: a7859e9bc63e54e972906745cbcc1b8543a4fe10 +Revision: c96226c6baa853f43981b0240974e33a0b661f8d License: Apache 2.0 License File: crashpad/LICENSE Security Critical: yes
diff --git a/third_party/crashpad/crashpad/client/crashpad_client_linux_test.cc b/third_party/crashpad/crashpad/client/crashpad_client_linux_test.cc index f61ea44f..68a49e7 100644 --- a/third_party/crashpad/crashpad/client/crashpad_client_linux_test.cc +++ b/third_party/crashpad/crashpad/client/crashpad_client_linux_test.cc
@@ -342,7 +342,7 @@ context); exception_information.thread_id = syscall(SYS_gettid); - ClientInformation info; + ExceptionHandlerProtocol::ClientInformation info; info.exception_information_address = FromPointerCast<decltype(info.exception_information_address)>( &exception_information);
diff --git a/third_party/crashpad/crashpad/handler/handler_main.cc b/third_party/crashpad/crashpad/handler/handler_main.cc index 31686b3..e87d17b7 100644 --- a/third_party/crashpad/crashpad/handler/handler_main.cc +++ b/third_party/crashpad/crashpad/handler/handler_main.cc
@@ -880,7 +880,7 @@ #if defined(OS_LINUX) || defined(OS_ANDROID) if (options.exception_information_address) { - ClientInformation info; + ExceptionHandlerProtocol::ClientInformation info; info.exception_information_address = options.exception_information_address; info.sanitization_information_address = options.sanitization_information_address;
diff --git a/third_party/crashpad/crashpad/handler/linux/crash_report_exception_handler.cc b/third_party/crashpad/crashpad/handler/linux/crash_report_exception_handler.cc index 5401bafa..345e234 100644 --- a/third_party/crashpad/crashpad/handler/linux/crash_report_exception_handler.cc +++ b/third_party/crashpad/crashpad/handler/linux/crash_report_exception_handler.cc
@@ -45,7 +45,7 @@ bool CrashReportExceptionHandler::HandleException( pid_t client_process_id, - const ClientInformation& info, + const ExceptionHandlerProtocol::ClientInformation& info, VMAddress requesting_thread_stack_address, pid_t* requesting_thread_id, UUID* local_report_id) { @@ -67,7 +67,7 @@ bool CrashReportExceptionHandler::HandleExceptionWithBroker( pid_t client_process_id, - const ClientInformation& info, + const ExceptionHandlerProtocol::ClientInformation& info, int broker_sock, UUID* local_report_id) { Metrics::ExceptionEncountered(); @@ -85,7 +85,7 @@ bool CrashReportExceptionHandler::HandleExceptionWithConnection( PtraceConnection* connection, - const ClientInformation& info, + const ExceptionHandlerProtocol::ClientInformation& info, VMAddress requesting_thread_stack_address, pid_t* requesting_thread_id, UUID* local_report_id) {
diff --git a/third_party/crashpad/crashpad/handler/linux/crash_report_exception_handler.h b/third_party/crashpad/crashpad/handler/linux/crash_report_exception_handler.h index 18051656..dba8b63 100644 --- a/third_party/crashpad/crashpad/handler/linux/crash_report_exception_handler.h +++ b/third_party/crashpad/crashpad/handler/linux/crash_report_exception_handler.h
@@ -65,22 +65,24 @@ // ExceptionHandlerServer::Delegate: bool HandleException(pid_t client_process_id, - const ClientInformation& info, + const ExceptionHandlerProtocol::ClientInformation& info, VMAddress requesting_thread_stack_address = 0, pid_t* requesting_thread_id = nullptr, UUID* local_report_id = nullptr) override; - bool HandleExceptionWithBroker(pid_t client_process_id, - const ClientInformation& info, - int broker_sock, - UUID* local_report_id = nullptr) override; + bool HandleExceptionWithBroker( + pid_t client_process_id, + const ExceptionHandlerProtocol::ClientInformation& info, + int broker_sock, + UUID* local_report_id = nullptr) override; private: - bool HandleExceptionWithConnection(PtraceConnection* connection, - const ClientInformation& info, - VMAddress requesting_thread_stack_address, - pid_t* requesting_thread_id, - UUID* local_report_id = nullptr); + bool HandleExceptionWithConnection( + PtraceConnection* connection, + const ExceptionHandlerProtocol::ClientInformation& info, + VMAddress requesting_thread_stack_address, + pid_t* requesting_thread_id, + UUID* local_report_id = nullptr); CrashReportDatabase* database_; // weak CrashReportUploadThread* upload_thread_; // weak
diff --git a/third_party/crashpad/crashpad/handler/linux/exception_handler_server.cc b/third_party/crashpad/crashpad/handler/linux/exception_handler_server.cc index c284212..4cefd8b 100644 --- a/third_party/crashpad/crashpad/handler/linux/exception_handler_server.cc +++ b/third_party/crashpad/crashpad/handler/linux/exception_handler_server.cc
@@ -110,10 +110,13 @@ return (cap_data.effective & (1 << CAP_SYS_PTRACE)) != 0; } -bool SendMessageToClient(int client_sock, ServerToClientMessage::Type type) { - ServerToClientMessage message = {}; +bool SendMessageToClient( + int client_sock, + ExceptionHandlerProtocol::ServerToClientMessage::Type type) { + ExceptionHandlerProtocol::ServerToClientMessage message = {}; message.type = type; - if (type == ServerToClientMessage::kTypeSetPtracer) { + if (type == + ExceptionHandlerProtocol::ServerToClientMessage::kTypeSetPtracer) { message.pid = getpid(); } return LoggingWriteFile(client_sock, &message, sizeof(message)); @@ -134,11 +137,12 @@ case PtraceScope::kRestricted: if (!SendMessageToClient(sock, - ServerToClientMessage::kTypeSetPtracer)) { + ExceptionHandlerProtocol:: + ServerToClientMessage::kTypeSetPtracer)) { return Strategy::kError; } - Errno status; + ExceptionHandlerProtocol::Errno status; if (!LoggingReadFileExactly(sock, &status, sizeof(status))) { return Strategy::kError; } @@ -170,12 +174,13 @@ private: static Strategy TryForkingBroker(int client_sock) { - if (!SendMessageToClient(client_sock, - ServerToClientMessage::kTypeForkBroker)) { + if (!SendMessageToClient( + client_sock, + ExceptionHandlerProtocol::ServerToClientMessage::kTypeForkBroker)) { return Strategy::kError; } - Errno status; + ExceptionHandlerProtocol::Errno status; if (!LoggingReadFileExactly(client_sock, &status, sizeof(status))) { return Strategy::kError; } @@ -369,7 +374,7 @@ } bool ExceptionHandlerServer::ReceiveClientMessage(Event* event) { - ClientToServerMessage message; + ExceptionHandlerProtocol::ClientToServerMessage message; iovec iov; iov.iov_base = &message; iov.iov_len = sizeof(message); @@ -405,15 +410,17 @@ return false; } - if (msg.msg_iov[0].iov_len != sizeof(ClientToServerMessage)) { + if (msg.msg_iov[0].iov_len != + sizeof(ExceptionHandlerProtocol::ClientToServerMessage)) { LOG(ERROR) << "unexpected message size " << msg.msg_iov[0].iov_len; return false; } auto client_msg = - reinterpret_cast<ClientToServerMessage*>(msg.msg_iov[0].iov_base); + reinterpret_cast<ExceptionHandlerProtocol::ClientToServerMessage*>( + msg.msg_iov[0].iov_base); switch (client_msg->type) { - case ClientToServerMessage::kCrashDumpRequest: + case ExceptionHandlerProtocol::ClientToServerMessage::kCrashDumpRequest: return HandleCrashDumpRequest(msg, client_msg->client_info, client_msg->requesting_thread_stack_address, @@ -427,7 +434,7 @@ bool ExceptionHandlerServer::HandleCrashDumpRequest( const msghdr& msg, - const ClientInformation& client_info, + const ExceptionHandlerProtocol::ClientInformation& client_info, VMAddress requesting_thread_stack_address, int client_sock) { cmsghdr* cmsg = CMSG_FIRSTHDR(&msg); @@ -459,8 +466,10 @@ return false; case PtraceStrategyDecider::Strategy::kNoPtrace: - return SendMessageToClient(client_sock, - ServerToClientMessage::kTypeCrashDumpFailed); + return SendMessageToClient( + client_sock, + ExceptionHandlerProtocol::ServerToClientMessage:: + kTypeCrashDumpFailed); case PtraceStrategyDecider::Strategy::kDirectPtrace: delegate_->HandleException( @@ -473,8 +482,9 @@ break; } - return SendMessageToClient(client_sock, - ServerToClientMessage::kTypeCrashDumpComplete); + return SendMessageToClient( + client_sock, + ExceptionHandlerProtocol::ServerToClientMessage::kTypeCrashDumpComplete); } } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/handler/linux/exception_handler_server.h b/third_party/crashpad/crashpad/handler/linux/exception_handler_server.h index 6f13fdc..1b73601c 100644 --- a/third_party/crashpad/crashpad/handler/linux/exception_handler_server.h +++ b/third_party/crashpad/crashpad/handler/linux/exception_handler_server.h
@@ -82,11 +82,12 @@ //! \param[out] local_report_id The unique identifier for the report created //! in the local report database. Optional. //! \return `true` on success. `false` on failure with a message logged. - virtual bool HandleException(pid_t client_process_id, - const ClientInformation& info, - VMAddress requesting_thread_stack_address = 0, - pid_t* requesting_thread_id = nullptr, - UUID* local_report_id = nullptr) = 0; + virtual bool HandleException( + pid_t client_process_id, + const ExceptionHandlerProtocol::ClientInformation& info, + VMAddress requesting_thread_stack_address = 0, + pid_t* requesting_thread_id = nullptr, + UUID* local_report_id = nullptr) = 0; //! \brief Called on the receipt of a crash dump request from a client for a //! crash that should be mediated by a PtraceBroker. @@ -97,10 +98,11 @@ //! \param[out] local_report_id The unique identifier for the report created //! in the local report database. Optional. //! \return `true` on success. `false` on failure with a message logged. - virtual bool HandleExceptionWithBroker(pid_t client_process_id, - const ClientInformation& info, - int broker_sock, - UUID* local_report_id = nullptr) = 0; + virtual bool HandleExceptionWithBroker( + pid_t client_process_id, + const ExceptionHandlerProtocol::ClientInformation& info, + int broker_sock, + UUID* local_report_id = nullptr) = 0; protected: ~Delegate() {} @@ -147,10 +149,11 @@ bool InstallClientSocket(ScopedFileHandle socket); bool UninstallClientSocket(Event* event); bool ReceiveClientMessage(Event* event); - bool HandleCrashDumpRequest(const msghdr& msg, - const ClientInformation& client_info, - VMAddress requesting_thread_stack_address, - int client_sock); + bool HandleCrashDumpRequest( + const msghdr& msg, + const ExceptionHandlerProtocol::ClientInformation& client_info, + VMAddress requesting_thread_stack_address, + int client_sock); std::unordered_map<int, std::unique_ptr<Event>> clients_; std::unique_ptr<Event> shutdown_event_;
diff --git a/third_party/crashpad/crashpad/handler/linux/exception_handler_server_test.cc b/third_party/crashpad/crashpad/handler/linux/exception_handler_server_test.cc index 7d15cbb..1c57fce 100644 --- a/third_party/crashpad/crashpad/handler/linux/exception_handler_server_test.cc +++ b/third_party/crashpad/crashpad/handler/linux/exception_handler_server_test.cc
@@ -103,7 +103,7 @@ } bool HandleException(pid_t client_process_id, - const ClientInformation& info, + const ExceptionHandlerProtocol::ClientInformation& info, VMAddress requesting_thread_stack_address, pid_t* requesting_thread_id = nullptr, UUID* local_report_id = nullptr) override { @@ -134,10 +134,11 @@ return true; } - bool HandleExceptionWithBroker(pid_t client_process_id, - const ClientInformation& info, - int broker_sock, - UUID* local_report_id = nullptr) override { + bool HandleExceptionWithBroker( + pid_t client_process_id, + const ExceptionHandlerProtocol::ClientInformation& info, + int broker_sock, + UUID* local_report_id = nullptr) override { PtraceClient client; bool connected = client.Initialize(broker_sock, client_process_id); EXPECT_TRUE(connected); @@ -165,10 +166,11 @@ Strategy ChooseStrategy(int sock, const ucred& client_credentials) override { if (strategy_ == Strategy::kUseBroker) { - ServerToClientMessage message = {}; - message.type = ServerToClientMessage::kTypeForkBroker; + ExceptionHandlerProtocol::ServerToClientMessage message = {}; + message.type = + ExceptionHandlerProtocol::ServerToClientMessage::kTypeForkBroker; - Errno status; + ExceptionHandlerProtocol::Errno status; bool result = LoggingWriteFile(sock, &message, sizeof(message)) && LoggingReadFileExactly(sock, &status, sizeof(status)); EXPECT_TRUE(result); @@ -220,7 +222,7 @@ ~CrashDumpTest() = default; void MultiprocessParent() override { - ClientInformation info; + ExceptionHandlerProtocol::ClientInformation info; ASSERT_TRUE( LoggingReadFileExactly(ReadPipeHandle(), &info, sizeof(info))); @@ -239,7 +241,7 @@ void MultiprocessChild() override { ASSERT_EQ(close(server_test_->sock_to_client_), 0); - ClientInformation info; + ExceptionHandlerProtocol::ClientInformation info; info.exception_information_address = 42; ASSERT_TRUE(LoggingWriteFile(WritePipeHandle(), &info, sizeof(info)));
diff --git a/third_party/crashpad/crashpad/minidump/minidump_module_writer.cc b/third_party/crashpad/crashpad/minidump/minidump_module_writer.cc index 305d37c..6e533524 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_module_writer.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_module_writer.cc
@@ -31,8 +31,7 @@ namespace crashpad { -MinidumpModuleCodeViewRecordWriter::~MinidumpModuleCodeViewRecordWriter() { -} +MinidumpModuleCodeViewRecordWriter::~MinidumpModuleCodeViewRecordWriter() {} namespace internal { @@ -45,8 +44,7 @@ template <typename CodeViewRecordType> MinidumpModuleCodeViewRecordPDBLinkWriter< - CodeViewRecordType>::~MinidumpModuleCodeViewRecordPDBLinkWriter() { -} + CodeViewRecordType>::~MinidumpModuleCodeViewRecordPDBLinkWriter() {} template <typename CodeViewRecordType> size_t @@ -82,8 +80,7 @@ CodeViewRecordPDB20>; MinidumpModuleCodeViewRecordPDB20Writer:: - ~MinidumpModuleCodeViewRecordPDB20Writer() { -} + ~MinidumpModuleCodeViewRecordPDB20Writer() {} void MinidumpModuleCodeViewRecordPDB20Writer::SetTimestampAndAge( time_t timestamp, @@ -100,8 +97,7 @@ CodeViewRecordPDB70>; MinidumpModuleCodeViewRecordPDB70Writer:: - ~MinidumpModuleCodeViewRecordPDB70Writer() { -} + ~MinidumpModuleCodeViewRecordPDB70Writer() {} void MinidumpModuleCodeViewRecordPDB70Writer::InitializeFromSnapshot( const ModuleSnapshot* module_snapshot) { @@ -115,15 +111,52 @@ SetUUIDAndAge(uuid, age); } +MinidumpModuleCodeViewRecordBuildIDWriter:: + MinidumpModuleCodeViewRecordBuildIDWriter() + : MinidumpModuleCodeViewRecordWriter(), build_id_() {} + +MinidumpModuleCodeViewRecordBuildIDWriter:: + ~MinidumpModuleCodeViewRecordBuildIDWriter() {} + +size_t MinidumpModuleCodeViewRecordBuildIDWriter::SizeOfObject() { + DCHECK_GE(state(), kStateFrozen); + return offsetof(CodeViewRecordBuildID, build_id) + build_id_.size(); +} + +void MinidumpModuleCodeViewRecordBuildIDWriter::SetBuildID( + const std::vector<uint8_t>& build_id) { + DCHECK_EQ(state(), kStateMutable); + build_id_ = build_id; +} + +bool MinidumpModuleCodeViewRecordBuildIDWriter::WriteObject( + FileWriterInterface* file_writer) { + DCHECK_EQ(state(), kStateWritable); + + CodeViewRecordBuildID cv; + cv.signature = CodeViewRecordBuildID::kSignature; + + WritableIoVec iov; + iov.iov_base = &cv; + iov.iov_len = offsetof(CodeViewRecordBuildID, build_id); + std::vector<WritableIoVec> iovecs(1, iov); + + if (!build_id_.empty()) { + iov.iov_base = build_id_.data(); + iov.iov_len = build_id_.size(); + iovecs.push_back(iov); + } + + return file_writer->WriteIoVec(&iovecs); +} + MinidumpModuleMiscDebugRecordWriter::MinidumpModuleMiscDebugRecordWriter() : internal::MinidumpWritable(), image_debug_misc_(), data_(), - data_utf16_() { -} + data_utf16_() {} -MinidumpModuleMiscDebugRecordWriter::~MinidumpModuleMiscDebugRecordWriter() { -} +MinidumpModuleMiscDebugRecordWriter::~MinidumpModuleMiscDebugRecordWriter() {} void MinidumpModuleMiscDebugRecordWriter::SetData(const std::string& data, bool utf16) { @@ -203,8 +236,7 @@ module_.VersionInfo.dwStrucVersion = VS_FFI_STRUCVERSION; } -MinidumpModuleWriter::~MinidumpModuleWriter() { -} +MinidumpModuleWriter::~MinidumpModuleWriter() {} void MinidumpModuleWriter::InitializeFromSnapshot( const ModuleSnapshot* module_snapshot) { @@ -242,9 +274,21 @@ } SetFileTypeAndSubtype(file_type, VFT2_UNKNOWN); - auto codeview_record = - std::make_unique<MinidumpModuleCodeViewRecordPDB70Writer>(); - codeview_record->InitializeFromSnapshot(module_snapshot); + auto build_id = module_snapshot->BuildID(); + + std::unique_ptr<MinidumpModuleCodeViewRecordWriter> codeview_record; + if (!build_id.empty()) { + auto cv_record_build_id = + std::make_unique<MinidumpModuleCodeViewRecordBuildIDWriter>(); + cv_record_build_id->SetBuildID(build_id); + codeview_record = std::move(cv_record_build_id); + } else { + auto cv_record_pdb70 = + std::make_unique<MinidumpModuleCodeViewRecordPDB70Writer>(); + cv_record_pdb70->InitializeFromSnapshot(module_snapshot); + codeview_record = std::move(cv_record_pdb70); + } + SetCodeViewRecord(std::move(codeview_record)); } @@ -372,11 +416,9 @@ } MinidumpModuleListWriter::MinidumpModuleListWriter() - : MinidumpStreamWriter(), modules_(), module_list_base_() { -} + : MinidumpStreamWriter(), modules_(), module_list_base_() {} -MinidumpModuleListWriter::~MinidumpModuleListWriter() { -} +MinidumpModuleListWriter::~MinidumpModuleListWriter() {} void MinidumpModuleListWriter::InitializeFromSnapshot( const std::vector<const ModuleSnapshot*>& module_snapshots) {
diff --git a/third_party/crashpad/crashpad/minidump/minidump_module_writer.h b/third_party/crashpad/crashpad/minidump/minidump_module_writer.h index 555c411..b328bf0 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_module_writer.h +++ b/third_party/crashpad/crashpad/minidump/minidump_module_writer.h
@@ -88,7 +88,8 @@ //! \brief The writer for a CodeViewRecordPDB20 object in a minidump file. //! -//! Most users will want MinidumpModuleCodeViewRecordPDB70Writer instead. +//! Most users will want MinidumpModuleCodeViewRecordPDB70Writer or +//! MinidumpModuleCodeViewRecordBuildIDWriter instead. class MinidumpModuleCodeViewRecordPDB20Writer final : public internal::MinidumpModuleCodeViewRecordPDBLinkWriter< CodeViewRecordPDB20> { @@ -136,6 +137,26 @@ DISALLOW_COPY_AND_ASSIGN(MinidumpModuleCodeViewRecordPDB70Writer); }; +//! \brief The writer for a CodeViewRecordBuildID object in a minidump file. +class MinidumpModuleCodeViewRecordBuildIDWriter final + : public MinidumpModuleCodeViewRecordWriter { + public: + MinidumpModuleCodeViewRecordBuildIDWriter(); + ~MinidumpModuleCodeViewRecordBuildIDWriter() override; + + //! \brief Sets the build ID used for symbol lookup. + void SetBuildID(const std::vector<uint8_t>& build_id); + + private: + // MinidumpWritable: + size_t SizeOfObject() override; + bool WriteObject(FileWriterInterface* file_writer) override; + + std::vector<uint8_t> build_id_; + + DISALLOW_COPY_AND_ASSIGN(MinidumpModuleCodeViewRecordBuildIDWriter); +}; + //! \brief The writer for an IMAGE_DEBUG_MISC object in a minidump file. //! //! Most users will want MinidumpModuleCodeViewRecordPDB70Writer instead.
diff --git a/third_party/crashpad/crashpad/minidump/minidump_module_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_module_writer_test.cc index 8b5fc062..71db3ac 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_module_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_module_writer_test.cc
@@ -265,6 +265,61 @@ expected_debug_utf16)); } +// ExpectModuleWithBuildIDCv() is like ExpectModule( but expects the module to +// have a BuildID CodeView Record. +void ExpectModuleWithBuildIDCv(const MINIDUMP_MODULE* expected, + const MINIDUMP_MODULE* observed, + const std::string& file_contents, + const std::string& expected_module_name, + const std::vector<uint8_t>& expected_build_id) { + EXPECT_EQ(observed->BaseOfImage, expected->BaseOfImage); + EXPECT_EQ(observed->SizeOfImage, expected->SizeOfImage); + EXPECT_EQ(observed->CheckSum, expected->CheckSum); + EXPECT_EQ(observed->TimeDateStamp, expected->TimeDateStamp); + EXPECT_EQ(observed->VersionInfo.dwSignature, + implicit_cast<uint32_t>(VS_FFI_SIGNATURE)); + EXPECT_EQ(observed->VersionInfo.dwStrucVersion, + implicit_cast<uint32_t>(VS_FFI_STRUCVERSION)); + EXPECT_EQ(observed->VersionInfo.dwFileVersionMS, + expected->VersionInfo.dwFileVersionMS); + EXPECT_EQ(observed->VersionInfo.dwFileVersionLS, + expected->VersionInfo.dwFileVersionLS); + EXPECT_EQ(observed->VersionInfo.dwProductVersionMS, + expected->VersionInfo.dwProductVersionMS); + EXPECT_EQ(observed->VersionInfo.dwProductVersionLS, + expected->VersionInfo.dwProductVersionLS); + EXPECT_EQ(observed->VersionInfo.dwFileFlagsMask, + expected->VersionInfo.dwFileFlagsMask); + EXPECT_EQ(observed->VersionInfo.dwFileFlags, + expected->VersionInfo.dwFileFlags); + EXPECT_EQ(observed->VersionInfo.dwFileOS, expected->VersionInfo.dwFileOS); + EXPECT_EQ(observed->VersionInfo.dwFileType, expected->VersionInfo.dwFileType); + EXPECT_EQ(observed->VersionInfo.dwFileSubtype, + expected->VersionInfo.dwFileSubtype); + EXPECT_EQ(observed->VersionInfo.dwFileDateMS, + expected->VersionInfo.dwFileDateMS); + EXPECT_EQ(observed->VersionInfo.dwFileDateLS, + expected->VersionInfo.dwFileDateLS); + EXPECT_EQ(observed->Reserved0, 0u); + EXPECT_EQ(observed->Reserved1, 0u); + + EXPECT_NE(observed->ModuleNameRva, 0u); + base::string16 observed_module_name_utf16 = + MinidumpStringAtRVAAsString(file_contents, observed->ModuleNameRva); + base::string16 expected_module_name_utf16 = + base::UTF8ToUTF16(expected_module_name); + EXPECT_EQ(observed_module_name_utf16, expected_module_name_utf16); + + const CodeViewRecordBuildID* codeview_build_id_record = + MinidumpWritableAtLocationDescriptor<CodeViewRecordBuildID>( + file_contents, observed->CvRecord); + ASSERT_TRUE(codeview_build_id_record); + EXPECT_EQ(memcmp(expected_build_id.data(), + &codeview_build_id_record->build_id, + expected_build_id.size()), + 0); +} + TEST(MinidumpModuleWriter, EmptyModule) { MinidumpFileWriter minidump_file_writer; auto module_list_writer = std::make_unique<MinidumpModuleListWriter>(); @@ -325,9 +380,22 @@ constexpr uint32_t kFileType = VFT_DRV; constexpr uint32_t kFileSubtype = VFT2_DRV_KEYBOARD; static constexpr char kPDBName[] = "statical.pdb"; - static constexpr uint8_t kPDBUUIDBytes[16] = - {0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, - 0x08, 0x19, 0x2a, 0x3b, 0x4c, 0x5d, 0x6e, 0x7f}; + static constexpr uint8_t kPDBUUIDBytes[16] = {0xfe, + 0xdc, + 0xba, + 0x98, + 0x76, + 0x54, + 0x32, + 0x10, + 0x08, + 0x19, + 0x2a, + 0x3b, + 0x4c, + 0x5d, + 0x6e, + 0x7f}; UUID pdb_uuid; pdb_uuid.InitializeFromBytes(kPDBUUIDBytes); constexpr uint32_t kPDBAge = 1; @@ -471,6 +539,50 @@ kDebugUTF16)); } +TEST(MinidumpModuleWriter, OneModule_CodeViewBuildID) { + // MinidumpModuleWriter.OneModule tested with a BuildID CodeView + MinidumpFileWriter minidump_file_writer; + auto module_list_writer = std::make_unique<MinidumpModuleListWriter>(); + + static constexpr char kModuleName[] = "dinosaur"; + static constexpr char kBuildID[] = + "averylonghashcodeormaybeitsjustrandomnumbershardtosay"; + + std::vector<uint8_t> build_id_data(kBuildID, kBuildID + 53); + + auto module_writer = std::make_unique<MinidumpModuleWriter>(); + module_writer->SetName(kModuleName); + + auto codeview_build_id_writer = + std::make_unique<MinidumpModuleCodeViewRecordBuildIDWriter>(); + codeview_build_id_writer->SetBuildID(build_id_data); + module_writer->SetCodeViewRecord(std::move(codeview_build_id_writer)); + + module_list_writer->AddModule(std::move(module_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(module_list_writer))); + + StringFile string_file; + ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); + + ASSERT_GT(string_file.string().size(), + sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + + sizeof(MINIDUMP_MODULE_LIST) + 1 * sizeof(MINIDUMP_MODULE)); + + const MINIDUMP_MODULE_LIST* module_list = nullptr; + ASSERT_NO_FATAL_FAILURE( + GetModuleListStream(string_file.string(), &module_list)); + + EXPECT_EQ(module_list->NumberOfModules, 1u); + + MINIDUMP_MODULE expected = {}; + + ASSERT_NO_FATAL_FAILURE(ExpectModuleWithBuildIDCv(&expected, + &module_list->Modules[0], + string_file.string(), + kModuleName, + build_id_data)); +} + TEST(MinidumpModuleWriter, ThreeModules) { // As good exercise, this test uses three modules, one with a PDB 7.0 link as // its CodeView record, one with no CodeView record, and one with a PDB 2.0 @@ -482,9 +594,22 @@ constexpr uint64_t kModuleBase0 = 0x100101000; constexpr uint32_t kModuleSize0 = 0xf000; static constexpr char kPDBName0[] = "main"; - static constexpr uint8_t kPDBUUIDBytes0[16] = - {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, - 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99}; + static constexpr uint8_t kPDBUUIDBytes0[16] = {0xaa, + 0xbb, + 0xcc, + 0xdd, + 0xee, + 0xff, + 0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99}; UUID pdb_uuid_0; pdb_uuid_0.InitializeFromBytes(kPDBUUIDBytes0); constexpr uint32_t kPDBAge0 = 0; @@ -666,9 +791,22 @@ expect_modules[0].VersionInfo.dwFileType = VFT_APP; module_paths[0] = "/usr/bin/true"; module_pdbs[0] = "true"; - static constexpr uint8_t kUUIDBytes0[16] = - {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, - 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; + static constexpr uint8_t kUUIDBytes0[16] = {0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99, + 0xaa, + 0xbb, + 0xcc, + 0xdd, + 0xee, + 0xff}; uuids[0].InitializeFromBytes(kUUIDBytes0); ages[0] = 10; @@ -682,9 +820,22 @@ expect_modules[1].VersionInfo.dwFileType = VFT_DLL; module_paths[1] = "/usr/lib/libSystem.B.dylib"; module_pdbs[1] = "libSystem.B.dylib.pdb"; - static constexpr uint8_t kUUIDBytes1[16] = - {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; + static constexpr uint8_t kUUIDBytes1[16] = {0x00, + 0x01, + 0x02, + 0x03, + 0x04, + 0x05, + 0x06, + 0x07, + 0x08, + 0x09, + 0x0a, + 0x0b, + 0x0c, + 0x0d, + 0x0e, + 0x0f}; uuids[1].InitializeFromBytes(kUUIDBytes1); ages[1] = 20; @@ -698,9 +849,22 @@ expect_modules[2].VersionInfo.dwFileType = VFT_UNKNOWN; module_paths[2] = "/usr/lib/dyld"; module_pdbs[2] = "/usr/lib/dyld.pdb"; - static constexpr uint8_t kUUIDBytes2[16] = - {0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, - 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0}; + static constexpr uint8_t kUUIDBytes2[16] = {0xff, + 0xfe, + 0xfd, + 0xfc, + 0xfb, + 0xfa, + 0xf9, + 0xf8, + 0xf7, + 0xf6, + 0xf5, + 0xf4, + 0xf3, + 0xf2, + 0xf1, + 0xf0}; uuids[2].InitializeFromBytes(kUUIDBytes2); ages[2] = 30;
diff --git a/third_party/crashpad/crashpad/minidump/test/minidump_writable_test_util.cc b/third_party/crashpad/crashpad/minidump/test/minidump_writable_test_util.cc index 1a832bf..db07b366 100644 --- a/third_party/crashpad/crashpad/minidump/test/minidump_writable_test_util.cc +++ b/third_party/crashpad/crashpad/minidump/test/minidump_writable_test_util.cc
@@ -210,17 +210,13 @@ struct MinidumpModuleCrashpadInfoListTraits { using ListType = MinidumpModuleCrashpadInfoList; enum : size_t { kElementSize = sizeof(MinidumpModuleCrashpadInfoLink) }; - static size_t ElementCount(const ListType* list) { - return list->count; - } + static size_t ElementCount(const ListType* list) { return list->count; } }; struct MinidumpSimpleStringDictionaryListTraits { using ListType = MinidumpSimpleStringDictionary; enum : size_t { kElementSize = sizeof(MinidumpSimpleStringDictionaryEntry) }; - static size_t ElementCount(const ListType* list) { - return list->count; - } + static size_t ElementCount(const ListType* list) { return list->count; } }; struct MinidumpAnnotationListObjectsTraits { @@ -253,17 +249,19 @@ } // namespace template <> -const MINIDUMP_MEMORY_LIST* MinidumpWritableAtLocationDescriptor< - MINIDUMP_MEMORY_LIST>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location) { +const MINIDUMP_MEMORY_LIST* +MinidumpWritableAtLocationDescriptor<MINIDUMP_MEMORY_LIST>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location) { return MinidumpListAtLocationDescriptor<MinidumpMemoryListTraits>( file_contents, location); } template <> -const MINIDUMP_MODULE_LIST* MinidumpWritableAtLocationDescriptor< - MINIDUMP_MODULE_LIST>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location) { +const MINIDUMP_MODULE_LIST* +MinidumpWritableAtLocationDescriptor<MINIDUMP_MODULE_LIST>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location) { return MinidumpListAtLocationDescriptor<MinidumpModuleListTraits>( file_contents, location); } @@ -278,25 +276,28 @@ } template <> -const MINIDUMP_THREAD_LIST* MinidumpWritableAtLocationDescriptor< - MINIDUMP_THREAD_LIST>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location) { +const MINIDUMP_THREAD_LIST* +MinidumpWritableAtLocationDescriptor<MINIDUMP_THREAD_LIST>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location) { return MinidumpListAtLocationDescriptor<MinidumpThreadListTraits>( file_contents, location); } template <> -const MINIDUMP_HANDLE_DATA_STREAM* MinidumpWritableAtLocationDescriptor< - MINIDUMP_HANDLE_DATA_STREAM>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location) { +const MINIDUMP_HANDLE_DATA_STREAM* +MinidumpWritableAtLocationDescriptor<MINIDUMP_HANDLE_DATA_STREAM>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location) { return MinidumpListAtLocationDescriptor<MinidumpHandleDataStreamTraits>( file_contents, location); } template <> -const MINIDUMP_MEMORY_INFO_LIST* MinidumpWritableAtLocationDescriptor< - MINIDUMP_MEMORY_INFO_LIST>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location) { +const MINIDUMP_MEMORY_INFO_LIST* +MinidumpWritableAtLocationDescriptor<MINIDUMP_MEMORY_INFO_LIST>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location) { return MinidumpListAtLocationDescriptor<MinidumpMemoryInfoListTraits>( file_contents, location); } @@ -357,28 +358,51 @@ } // namespace template <> -const CodeViewRecordPDB20* MinidumpWritableAtLocationDescriptor< - CodeViewRecordPDB20>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location) { +const CodeViewRecordPDB20* +MinidumpWritableAtLocationDescriptor<CodeViewRecordPDB20>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location) { return MinidumpCVPDBAtLocationDescriptor<CodeViewRecordPDB20>(file_contents, location); } template <> -const CodeViewRecordPDB70* MinidumpWritableAtLocationDescriptor< - CodeViewRecordPDB70>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location) { +const CodeViewRecordPDB70* +MinidumpWritableAtLocationDescriptor<CodeViewRecordPDB70>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location) { return MinidumpCVPDBAtLocationDescriptor<CodeViewRecordPDB70>(file_contents, location); } -TestUInt32MinidumpWritable::TestUInt32MinidumpWritable(uint32_t value) - : MinidumpWritable(), - value_(value) { +template <> +const CodeViewRecordBuildID* +MinidumpWritableAtLocationDescriptor<CodeViewRecordBuildID>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location) { + const CodeViewRecordBuildID* cv = + reinterpret_cast<const CodeViewRecordBuildID*>( + MinidumpWritableAtLocationDescriptorInternal( + file_contents, + location, + offsetof(CodeViewRecordBuildID, build_id), + true)); + + if (!cv) { + return nullptr; + } + + if (cv->signature != CodeViewRecordBuildID::kSignature) { + return nullptr; + } + + return cv; } -TestUInt32MinidumpWritable::~TestUInt32MinidumpWritable() { -} +TestUInt32MinidumpWritable::TestUInt32MinidumpWritable(uint32_t value) + : MinidumpWritable(), value_(value) {} + +TestUInt32MinidumpWritable::~TestUInt32MinidumpWritable() {} size_t TestUInt32MinidumpWritable::SizeOfObject() { return sizeof(value_);
diff --git a/third_party/crashpad/crashpad/minidump/test/minidump_writable_test_util.h b/third_party/crashpad/crashpad/minidump/test/minidump_writable_test_util.h index 5b176d2..6c706fb 100644 --- a/third_party/crashpad/crashpad/minidump/test/minidump_writable_test_util.h +++ b/third_party/crashpad/crashpad/minidump/test/minidump_writable_test_util.h
@@ -104,6 +104,7 @@ MINIDUMP_ALLOW_OVERSIZED_DATA(MINIDUMP_STRING); MINIDUMP_ALLOW_OVERSIZED_DATA(CodeViewRecordPDB20); MINIDUMP_ALLOW_OVERSIZED_DATA(CodeViewRecordPDB70); +MINIDUMP_ALLOW_OVERSIZED_DATA(CodeViewRecordBuildID); MINIDUMP_ALLOW_OVERSIZED_DATA(MinidumpUTF8String); // minidump_file_writer_test accesses its variable-sized test streams via a @@ -179,14 +180,16 @@ const MINIDUMP_LOCATION_DESCRIPTOR& location); template <> -const MINIDUMP_MEMORY_LIST* MinidumpWritableAtLocationDescriptor< - MINIDUMP_MEMORY_LIST>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location); +const MINIDUMP_MEMORY_LIST* +MinidumpWritableAtLocationDescriptor<MINIDUMP_MEMORY_LIST>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location); template <> -const MINIDUMP_MODULE_LIST* MinidumpWritableAtLocationDescriptor< - MINIDUMP_MODULE_LIST>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location); +const MINIDUMP_MODULE_LIST* +MinidumpWritableAtLocationDescriptor<MINIDUMP_MODULE_LIST>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location); template <> const MINIDUMP_UNLOADED_MODULE_LIST* @@ -195,29 +198,40 @@ const MINIDUMP_LOCATION_DESCRIPTOR& location); template <> -const MINIDUMP_THREAD_LIST* MinidumpWritableAtLocationDescriptor< - MINIDUMP_THREAD_LIST>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location); +const MINIDUMP_THREAD_LIST* +MinidumpWritableAtLocationDescriptor<MINIDUMP_THREAD_LIST>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location); template <> -const MINIDUMP_HANDLE_DATA_STREAM* MinidumpWritableAtLocationDescriptor< - MINIDUMP_HANDLE_DATA_STREAM>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location); +const MINIDUMP_HANDLE_DATA_STREAM* +MinidumpWritableAtLocationDescriptor<MINIDUMP_HANDLE_DATA_STREAM>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location); template <> -const MINIDUMP_MEMORY_INFO_LIST* MinidumpWritableAtLocationDescriptor< - MINIDUMP_MEMORY_INFO_LIST>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location); +const MINIDUMP_MEMORY_INFO_LIST* +MinidumpWritableAtLocationDescriptor<MINIDUMP_MEMORY_INFO_LIST>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location); template <> -const CodeViewRecordPDB20* MinidumpWritableAtLocationDescriptor< - CodeViewRecordPDB20>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location); +const CodeViewRecordPDB20* +MinidumpWritableAtLocationDescriptor<CodeViewRecordPDB20>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location); template <> -const CodeViewRecordPDB70* MinidumpWritableAtLocationDescriptor< - CodeViewRecordPDB70>(const std::string& file_contents, - const MINIDUMP_LOCATION_DESCRIPTOR& location); +const CodeViewRecordPDB70* +MinidumpWritableAtLocationDescriptor<CodeViewRecordPDB70>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location); + +template <> +const CodeViewRecordBuildID* +MinidumpWritableAtLocationDescriptor<CodeViewRecordBuildID>( + const std::string& file_contents, + const MINIDUMP_LOCATION_DESCRIPTOR& location); template <> const MinidumpModuleCrashpadInfoList*
diff --git a/third_party/crashpad/crashpad/snapshot/elf/module_snapshot_elf.cc b/third_party/crashpad/crashpad/snapshot/elf/module_snapshot_elf.cc index 39385a6..cfe07dd 100644 --- a/third_party/crashpad/crashpad/snapshot/elf/module_snapshot_elf.cc +++ b/third_party/crashpad/crashpad/snapshot/elf/module_snapshot_elf.cc
@@ -150,13 +150,10 @@ INITIALIZATION_STATE_DCHECK_VALID(initialized_); *age = 0; - std::unique_ptr<ElfImageReader::NoteReader> notes = - elf_reader_->NotesWithNameAndType(ELF_NOTE_GNU, NT_GNU_BUILD_ID, 64); - std::string desc; - VMAddress desc_addr; - notes->NextNote(nullptr, nullptr, &desc, &desc_addr); - desc.insert(desc.end(), 16 - std::min(desc.size(), size_t{16}), '\0'); - uuid->InitializeFromBytes(reinterpret_cast<const uint8_t*>(&desc[0])); + auto build_id = BuildID(); + build_id.insert( + build_id.end(), 16 - std::min(build_id.size(), size_t{16}), '\0'); + uuid->InitializeFromBytes(build_id.data()); // TODO(scottmg): https://crashpad.chromium.org/bug/229. These are // endian-swapped to match FileID::ConvertIdentifierToUUIDString() in @@ -171,6 +168,21 @@ return base::FilePath(Name()).BaseName().value(); } +std::vector<uint8_t> ModuleSnapshotElf::BuildID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + + std::unique_ptr<ElfImageReader::NoteReader> notes = + elf_reader_->NotesWithNameAndType(ELF_NOTE_GNU, NT_GNU_BUILD_ID, 64); + std::string desc; + VMAddress desc_addr; + notes->NextNote(nullptr, nullptr, &desc, &desc_addr); + + std::vector<uint8_t> build_id; + build_id.reserve(desc.size()); + std::copy(desc.begin(), desc.end(), std::back_inserter(build_id)); + return build_id; +} + std::vector<std::string> ModuleSnapshotElf::AnnotationsVector() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); return std::vector<std::string>();
diff --git a/third_party/crashpad/crashpad/snapshot/elf/module_snapshot_elf.h b/third_party/crashpad/crashpad/snapshot/elf/module_snapshot_elf.h index 15c3f3c..be27242 100644 --- a/third_party/crashpad/crashpad/snapshot/elf/module_snapshot_elf.h +++ b/third_party/crashpad/crashpad/snapshot/elf/module_snapshot_elf.h
@@ -77,6 +77,7 @@ ModuleType GetModuleType() const override; void UUIDAndAge(crashpad::UUID* uuid, uint32_t* age) const override; std::string DebugFileName() const override; + std::vector<uint8_t> BuildID() const override; std::vector<std::string> AnnotationsVector() const override; std::map<std::string, std::string> AnnotationsSimpleMap() const override; std::vector<AnnotationSnapshot> AnnotationObjects() const override;
diff --git a/third_party/crashpad/crashpad/snapshot/mac/module_snapshot_mac.cc b/third_party/crashpad/crashpad/snapshot/mac/module_snapshot_mac.cc index 4160897..947744d 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/module_snapshot_mac.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/module_snapshot_mac.cc
@@ -14,8 +14,8 @@ #include "snapshot/mac/module_snapshot_mac.h" -#include <mach/mach.h> #include <mach-o/loader.h> +#include <mach/mach.h> #include "base/files/file_path.h" #include "base/strings/stringprintf.h" @@ -34,11 +34,9 @@ timestamp_(0), mach_o_image_reader_(nullptr), process_reader_(nullptr), - initialized_() { -} + initialized_() {} -ModuleSnapshotMac::~ModuleSnapshotMac() { -} +ModuleSnapshotMac::~ModuleSnapshotMac() {} bool ModuleSnapshotMac::Initialize( ProcessReaderMac* process_reader, @@ -170,6 +168,11 @@ return base::FilePath(Name()).BaseName().value(); } +std::vector<uint8_t> ModuleSnapshotMac::BuildID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return std::vector<uint8_t>(); +} + std::vector<std::string> ModuleSnapshotMac::AnnotationsVector() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); MachOImageAnnotationsReader annotations_reader(
diff --git a/third_party/crashpad/crashpad/snapshot/mac/module_snapshot_mac.h b/third_party/crashpad/crashpad/snapshot/mac/module_snapshot_mac.h index fe2d40a1..d78c326 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/module_snapshot_mac.h +++ b/third_party/crashpad/crashpad/snapshot/mac/module_snapshot_mac.h
@@ -77,6 +77,7 @@ ModuleType GetModuleType() const override; void UUIDAndAge(crashpad::UUID* uuid, uint32_t* age) const override; std::string DebugFileName() const override; + std::vector<uint8_t> BuildID() const override; std::vector<std::string> AnnotationsVector() const override; std::map<std::string, std::string> AnnotationsSimpleMap() const override; std::vector<AnnotationSnapshot> AnnotationObjects() const override;
diff --git a/third_party/crashpad/crashpad/snapshot/minidump/module_snapshot_minidump.cc b/third_party/crashpad/crashpad/snapshot/minidump/module_snapshot_minidump.cc index b3e33d0..a316e83b 100644 --- a/third_party/crashpad/crashpad/snapshot/minidump/module_snapshot_minidump.cc +++ b/third_party/crashpad/crashpad/snapshot/minidump/module_snapshot_minidump.cc
@@ -14,13 +14,15 @@ #include "snapshot/minidump/module_snapshot_minidump.h" +#include <stddef.h> #include <string.h> +#include "base/logging.h" #include "minidump/minidump_extensions.h" #include "snapshot/minidump/minidump_annotation_reader.h" -#include "snapshot/minidump/minidump_string_reader.h" #include "snapshot/minidump/minidump_simple_string_dictionary_reader.h" #include "snapshot/minidump/minidump_string_list_reader.h" +#include "snapshot/minidump/minidump_string_reader.h" #include "util/misc/pdb_structures.h" namespace crashpad { @@ -33,13 +35,13 @@ annotations_simple_map_(), annotation_objects_(), uuid_(), + build_id_(), name_(), + debug_file_name_(), age_(0), - initialized_() { -} + initialized_() {} -ModuleSnapshotMinidump::~ModuleSnapshotMinidump() { -} +ModuleSnapshotMinidump::~ModuleSnapshotMinidump() {} bool ModuleSnapshotMinidump::Initialize( FileReaderInterface* file_reader, @@ -63,33 +65,68 @@ ReadMinidumpUTF16String(file_reader, minidump_module_.ModuleNameRva, &name_); - if (minidump_module_.CvRecord.Rva != 0) { - CodeViewRecordPDB70 cv; - - if (!file_reader->SeekSet(minidump_module_.CvRecord.Rva)) { - return false; - } - - if (!file_reader->ReadExactly(&cv, sizeof(cv))) { - return false; - } - - if (cv.signature == 'SDSR') { - age_ = cv.age; - uuid_ = cv.uuid; - } else if (cv.signature != '01BN') { - LOG(ERROR) << "Bad CodeView signature in module"; - return false; - } else { - LOG(ERROR) << "NB10 not supported"; - return false; - } + if (minidump_module_.CvRecord.Rva != 0 && + !InitializeModuleCodeView(file_reader)) { + return false; } INITIALIZATION_STATE_SET_VALID(initialized_); return true; } +bool ModuleSnapshotMinidump::InitializeModuleCodeView( + FileReaderInterface* file_reader) { + uint32_t signature; + + DCHECK_NE(minidump_module_.CvRecord.Rva, 0u); + + if (minidump_module_.CvRecord.DataSize < sizeof(signature)) { + LOG(ERROR) << "CodeView record in module too small to contain signature"; + return false; + } + + if (!file_reader->SeekSet(minidump_module_.CvRecord.Rva)) { + return false; + } + + std::vector<uint8_t> cv_record; + cv_record.resize(minidump_module_.CvRecord.DataSize); + + if (!file_reader->ReadExactly(cv_record.data(), cv_record.size())) { + return false; + } + + signature = *reinterpret_cast<uint32_t*>(cv_record.data()); + + if (signature == CodeViewRecordPDB70::kSignature) { + if (cv_record.size() < offsetof(CodeViewRecordPDB70, pdb_name)) { + LOG(ERROR) << "CodeView record in module marked as PDB70 but too small"; + return false; + } + + auto cv_record_pdb70 = + reinterpret_cast<CodeViewRecordPDB70*>(cv_record.data()); + + age_ = cv_record_pdb70->age; + uuid_ = cv_record_pdb70->uuid; + + std::copy(cv_record.begin() + offsetof(CodeViewRecordPDB70, pdb_name), + cv_record.end(), + std::back_inserter(debug_file_name_)); + return true; + } + + if (signature == CodeViewRecordBuildID::kSignature) { + std::copy(cv_record.begin() + offsetof(CodeViewRecordBuildID, build_id), + cv_record.end(), + std::back_inserter(build_id_)); + return true; + } + + LOG(ERROR) << "Bad CodeView signature in module"; + return false; +} + std::string ModuleSnapshotMinidump::Name() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); return name_; @@ -138,10 +175,10 @@ ModuleSnapshot::ModuleType ModuleSnapshotMinidump::GetModuleType() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); switch (minidump_module_.VersionInfo.dwFileType) { - case VFT_APP: - return kModuleTypeExecutable; - case VFT_DLL: - return kModuleTypeSharedLibrary; + case VFT_APP: + return kModuleTypeExecutable; + case VFT_DLL: + return kModuleTypeSharedLibrary; } return kModuleTypeUnknown; } @@ -155,8 +192,12 @@ std::string ModuleSnapshotMinidump::DebugFileName() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); - NOTREACHED(); // https://crashpad.chromium.org/bug/10 - return std::string(); + return debug_file_name_; +} + +std::vector<uint8_t> ModuleSnapshotMinidump::BuildID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return build_id_; } std::vector<std::string> ModuleSnapshotMinidump::AnnotationsVector() const { @@ -201,7 +242,7 @@ MinidumpModuleCrashpadInfo minidump_module_crashpad_info; if (minidump_module_crashpad_info_location->DataSize < - sizeof(minidump_module_crashpad_info)) { + sizeof(minidump_module_crashpad_info)) { LOG(ERROR) << "minidump_module_crashpad_info size mismatch"; return false; } @@ -216,7 +257,7 @@ } if (minidump_module_crashpad_info.version != - MinidumpModuleCrashpadInfo::kVersion) { + MinidumpModuleCrashpadInfo::kVersion) { LOG(ERROR) << "minidump_module_crashpad_info version mismatch"; return false; }
diff --git a/third_party/crashpad/crashpad/snapshot/minidump/module_snapshot_minidump.h b/third_party/crashpad/crashpad/snapshot/minidump/module_snapshot_minidump.h index e6e50c5..023d0d5 100644 --- a/third_party/crashpad/crashpad/snapshot/minidump/module_snapshot_minidump.h +++ b/third_party/crashpad/crashpad/snapshot/minidump/module_snapshot_minidump.h
@@ -75,6 +75,7 @@ ModuleType GetModuleType() const override; void UUIDAndAge(crashpad::UUID* uuid, uint32_t* age) const override; std::string DebugFileName() const override; + std::vector<uint8_t> BuildID() const override; std::vector<std::string> AnnotationsVector() const override; std::map<std::string, std::string> AnnotationsSimpleMap() const override; std::vector<AnnotationSnapshot> AnnotationObjects() const override; @@ -88,12 +89,18 @@ const MINIDUMP_LOCATION_DESCRIPTOR* minidump_module_crashpad_info_location); + // Initializes data from the CodeView record, which usually points toward + // debug symbols. + bool InitializeModuleCodeView(FileReaderInterface* file_reader); + MINIDUMP_MODULE minidump_module_; std::vector<std::string> annotations_vector_; std::map<std::string, std::string> annotations_simple_map_; std::vector<AnnotationSnapshot> annotation_objects_; UUID uuid_; + std::vector<uint8_t> build_id_; std::string name_; + std::string debug_file_name_; uint32_t age_; InitializationStateDcheck initialized_;
diff --git a/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump.cc b/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump.cc index f191cb9..1242b49c 100644 --- a/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump.cc +++ b/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump.cc
@@ -16,6 +16,7 @@ #include <utility> +#include "base/strings/utf_string_conversions.h" #include "minidump/minidump_extensions.h" #include "snapshot/memory_map_region_snapshot.h" #include "snapshot/minidump/minidump_simple_string_dictionary_reader.h" @@ -60,8 +61,7 @@ process_id_(static_cast<pid_t>(-1)), initialized_() {} -ProcessSnapshotMinidump::~ProcessSnapshotMinidump() { -} +ProcessSnapshotMinidump::~ProcessSnapshotMinidump() {} bool ProcessSnapshotMinidump::Initialize(FileReaderInterface* file_reader) { INITIALIZATION_STATE_SET_INITIALIZING(initialized_); @@ -310,6 +310,9 @@ switch (stream_it->second->DataSize) { case sizeof(MINIDUMP_MISC_INFO_5): case sizeof(MINIDUMP_MISC_INFO_4): + full_version_ = base::UTF16ToUTF8(info.BuildString); + full_version_ = full_version_.substr(0, full_version_.find(";")); + FALLTHROUGH; case sizeof(MINIDUMP_MISC_INFO_3): case sizeof(MINIDUMP_MISC_INFO_2): case sizeof(MINIDUMP_MISC_INFO): @@ -347,7 +350,7 @@ } if (sizeof(MINIDUMP_MODULE_LIST) + module_count * sizeof(MINIDUMP_MODULE) != - stream_it->second->DataSize) { + stream_it->second->DataSize) { LOG(ERROR) << "module_list size mismatch"; return false; } @@ -389,7 +392,7 @@ } if (crashpad_info_.module_list.DataSize < - sizeof(MinidumpModuleCrashpadInfoList)) { + sizeof(MinidumpModuleCrashpadInfoList)) { LOG(ERROR) << "module_crashpad_info_list size mismatch"; return false; } @@ -405,8 +408,8 @@ } if (crashpad_info_.module_list.DataSize != - sizeof(MinidumpModuleCrashpadInfoList) + - crashpad_module_count * sizeof(MinidumpModuleCrashpadInfoLink)) { + sizeof(MinidumpModuleCrashpadInfoList) + + crashpad_module_count * sizeof(MinidumpModuleCrashpadInfoLink)) { LOG(ERROR) << "module_crashpad_info_list size mismatch"; return false; } @@ -426,7 +429,8 @@ minidump_links[crashpad_module_index]; if (!module_crashpad_info_links ->insert(std::make_pair(minidump_link.minidump_module_list_index, - minidump_link.location)).second) { + minidump_link.location)) + .second) { LOG(WARNING) << "duplicate module_crashpad_info_list minidump_module_list_index " << minidump_link.minidump_module_list_index; @@ -467,7 +471,8 @@ } if (sizeof(MINIDUMP_MEMORY_INFO_LIST) + - list.NumberOfEntries * list.SizeOfEntry != stream_it->second->DataSize) { + list.NumberOfEntries * list.SizeOfEntry != + stream_it->second->DataSize) { LOG(ERROR) << "memory_info_list size mismatch"; return false; } @@ -480,7 +485,7 @@ } mem_regions_.emplace_back( - std::make_unique<internal::MemoryMapRegionSnapshotMinidump>(info)); + std::make_unique<internal::MemoryMapRegionSnapshotMinidump>(info)); mem_regions_exposed_.emplace_back(mem_regions_.back().get()); } @@ -508,7 +513,7 @@ } if (sizeof(MINIDUMP_THREAD_LIST) + thread_count * sizeof(MINIDUMP_THREAD) != - stream_it->second->DataSize) { + stream_it->second->DataSize) { LOG(ERROR) << "thread_list size mismatch"; return false; } @@ -539,7 +544,8 @@ return false; } - if (!system_snapshot_.Initialize(file_reader_, stream_it->second->Rva)) { + if (!system_snapshot_.Initialize( + file_reader_, stream_it->second->Rva, full_version_)) { return false; }
diff --git a/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump.h b/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump.h index 2df59d2..5713aad8 100644 --- a/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump.h +++ b/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump.h
@@ -149,6 +149,7 @@ internal::ExceptionSnapshotMinidump exception_snapshot_; CPUArchitecture arch_; std::map<std::string, std::string> annotations_simple_map_; + std::string full_version_; FileReaderInterface* file_reader_; // weak pid_t process_id_; InitializationStateDcheck initialized_;
diff --git a/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc b/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc index a03edfb1..a471fbc 100644 --- a/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc +++ b/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc
@@ -18,6 +18,7 @@ #include <dbghelp.h> #include <string.h> +#include <algorithm> #include <memory> #include "base/numerics/safe_math.h" @@ -307,10 +308,10 @@ constexpr uint32_t minidump_module_count = 4; RVA name_rvas[minidump_module_count]; std::string names[minidump_module_count] = { - "libtacotruck", - "libevidencebased", - "libgeorgism", - "librealistutopia", + "libtacotruck", + "libevidencebased", + "libgeorgism", + "librealistutopia", }; minidump_module.BaseOfImage = 0xbadf00d; @@ -331,16 +332,28 @@ EXPECT_TRUE(string_file.Write(&name16[0], size)); } - CodeViewRecordPDB70 cv; - cv.signature = CodeViewRecordPDB70::kSignature; - cv.age = 7; - cv.uuid.InitializeFromString("00112233-4455-6677-8899-aabbccddeeff"); - cv.pdb_name[0] = '\0'; + CodeViewRecordPDB70 pdb70_cv; + pdb70_cv.signature = CodeViewRecordPDB70::kSignature; + pdb70_cv.age = 7; + pdb70_cv.uuid.InitializeFromString("00112233-4455-6677-8899-aabbccddeeff"); + pdb70_cv.pdb_name[0] = '\0'; - minidump_module.CvRecord.Rva = static_cast<RVA>(string_file.SeekGet()); - minidump_module.CvRecord.DataSize = sizeof(cv); + auto pdb70_loc = static_cast<RVA>(string_file.SeekGet()); + auto pdb70_size = sizeof(pdb70_cv); - EXPECT_TRUE(string_file.Write(&cv, sizeof(cv))); + EXPECT_TRUE(string_file.Write(&pdb70_cv, sizeof(pdb70_cv))); + + CodeViewRecordBuildID build_id_cv; + build_id_cv.signature = CodeViewRecordBuildID::kSignature; + + auto build_id_cv_loc = static_cast<RVA>(string_file.SeekGet()); + + EXPECT_TRUE(string_file.Write(&build_id_cv, + offsetof(CodeViewRecordBuildID, build_id))); + EXPECT_TRUE(string_file.Write("atestbuildidbecausewhynot", 25)); + + auto build_id_cv_size = + static_cast<size_t>(string_file.SeekGet() - build_id_cv_loc); MINIDUMP_DIRECTORY minidump_module_list_directory = {}; minidump_module_list_directory.StreamType = kMinidumpStreamTypeModuleList; @@ -355,6 +368,15 @@ for (uint32_t minidump_module_index = 0; minidump_module_index < minidump_module_count; ++minidump_module_index) { + if (minidump_module_index % 2) { + minidump_module.CvRecord.Rva = pdb70_loc; + minidump_module.CvRecord.DataSize = static_cast<uint32_t>(pdb70_size); + } else { + minidump_module.CvRecord.Rva = build_id_cv_loc; + minidump_module.CvRecord.DataSize = + static_cast<uint32_t>(build_id_cv_size); + } + minidump_module.ModuleNameRva = name_rvas[minidump_module_index]; EXPECT_TRUE(string_file.Write(&minidump_module, sizeof(minidump_module))); minidump_module.TimeDateStamp++; @@ -479,12 +501,19 @@ EXPECT_EQ(modules[i]->GetModuleType(), ModuleSnapshot::kModuleTypeExecutable); - uint32_t age; - UUID uuid; - modules[i]->UUIDAndAge(&uuid, &age); + if (i % 2) { + uint32_t age; + UUID uuid; + modules[i]->UUIDAndAge(&uuid, &age); - EXPECT_EQ(uuid.ToString(), "00112233-4455-6677-8899-aabbccddeeff"); - EXPECT_EQ(age, 7U); + EXPECT_EQ(uuid.ToString(), "00112233-4455-6677-8899-aabbccddeeff"); + EXPECT_EQ(age, 7U); + } else { + auto build_id = modules[i]->BuildID(); + std::string build_id_text(build_id.data(), + build_id.data() + build_id.size()); + EXPECT_EQ(build_id_text, "atestbuildidbecausewhynot"); + } } auto annotations_simple_map = modules[0]->AnnotationsSimpleMap(); @@ -619,6 +648,13 @@ minidump_system_info.Cpu.X86CpuInfo.VendorId[1] = cpu_info_bytes[1]; minidump_system_info.Cpu.X86CpuInfo.VendorId[2] = cpu_info_bytes[2]; + MINIDUMP_MISC_INFO_5 minidump_misc_info = {}; + base::string16 build_string; + ASSERT_TRUE(base::UTF8ToUTF16( + "MyOSVersion; MyMachineDescription", 33, &build_string)); + std::copy(build_string.begin(), build_string.end(), + minidump_misc_info.BuildString); + MINIDUMP_DIRECTORY minidump_system_info_directory = {}; minidump_system_info_directory.StreamType = kMinidumpStreamTypeSystemInfo; minidump_system_info_directory.Location.DataSize = @@ -626,16 +662,27 @@ minidump_system_info_directory.Location.Rva = static_cast<RVA>(string_file.SeekGet()); - ASSERT_TRUE(string_file.Write(&minidump_system_info, - sizeof(minidump_system_info))); + ASSERT_TRUE( + string_file.Write(&minidump_system_info, sizeof(minidump_system_info))); + + MINIDUMP_DIRECTORY minidump_misc_info_directory = {}; + minidump_misc_info_directory.StreamType = kMinidumpStreamTypeMiscInfo; + minidump_misc_info_directory.Location.DataSize = sizeof(MINIDUMP_MISC_INFO_5); + minidump_misc_info_directory.Location.Rva = + static_cast<RVA>(string_file.SeekGet()); + + ASSERT_TRUE( + string_file.Write(&minidump_misc_info, sizeof(minidump_misc_info))); header.StreamDirectoryRva = static_cast<RVA>(string_file.SeekGet()); ASSERT_TRUE(string_file.Write(&minidump_system_info_directory, sizeof(minidump_system_info_directory))); + ASSERT_TRUE(string_file.Write(&minidump_misc_info_directory, + sizeof(minidump_misc_info_directory))); header.Signature = MINIDUMP_SIGNATURE; header.Version = MINIDUMP_VERSION; - header.NumberOfStreams = 1; + header.NumberOfStreams = 2; EXPECT_TRUE(string_file.SeekSet(0)); EXPECT_TRUE(string_file.Write(&header, sizeof(header))); @@ -649,6 +696,7 @@ EXPECT_EQ(s->CPUVendor(), "GenuineIntel"); EXPECT_EQ(s->GetOperatingSystem(), SystemSnapshot::OperatingSystem::kOperatingSystemFuchsia); + EXPECT_EQ(s->OSVersionFull(), "MyOSVersion"); int major, minor, bugfix; std::string build; @@ -680,8 +728,8 @@ minidump_system_info_directory.Location.Rva = static_cast<RVA>(string_file.SeekGet()); - ASSERT_TRUE(string_file.Write(&minidump_system_info, - sizeof(minidump_system_info))); + ASSERT_TRUE( + string_file.Write(&minidump_system_info, sizeof(minidump_system_info))); MINIDUMP_THREAD minidump_thread = {}; uint32_t minidump_thread_count = 1; @@ -801,8 +849,8 @@ minidump_system_info_directory.Location.Rva = static_cast<RVA>(string_file.SeekGet()); - ASSERT_TRUE(string_file.Write(&minidump_system_info, - sizeof(minidump_system_info))); + ASSERT_TRUE( + string_file.Write(&minidump_system_info, sizeof(minidump_system_info))); MINIDUMP_THREAD minidump_thread = {}; uint32_t minidump_thread_count = 1; @@ -1015,7 +1063,7 @@ MINIDUMP_DIRECTORY minidump_memory_info_list_directory = {}; minidump_memory_info_list_directory.StreamType = - kMinidumpStreamTypeMemoryInfoList; + kMinidumpStreamTypeMemoryInfoList; minidump_memory_info_list_directory.Location.DataSize = sizeof(minidump_memory_info_list) + minidump_memory_info_count * sizeof(MINIDUMP_MEMORY_INFO); @@ -1043,12 +1091,16 @@ EXPECT_TRUE(process_snapshot.Initialize(&string_file)); std::vector<const MemoryMapRegionSnapshot*> map = - process_snapshot.MemoryMap(); + process_snapshot.MemoryMap(); ASSERT_EQ(map.size(), minidump_memory_info_count); - EXPECT_EQ(memcmp(&map[0]->AsMinidumpMemoryInfo(), &minidump_memory_info_1, - sizeof(minidump_memory_info_1)), 0); - EXPECT_EQ(memcmp(&map[1]->AsMinidumpMemoryInfo(), &minidump_memory_info_2, - sizeof(minidump_memory_info_2)), 0); + EXPECT_EQ(memcmp(&map[0]->AsMinidumpMemoryInfo(), + &minidump_memory_info_1, + sizeof(minidump_memory_info_1)), + 0); + EXPECT_EQ(memcmp(&map[1]->AsMinidumpMemoryInfo(), + &minidump_memory_info_2, + sizeof(minidump_memory_info_2)), + 0); } TEST(ProcessSnapshotMinidump, Stacks) { @@ -1063,9 +1115,21 @@ minidump_thread.ThreadId = 42; minidump_thread.Stack.StartOfMemoryRange = 0xbeefd00d; - std::vector<uint8_t> minidump_stack = { - '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' - }; + std::vector<uint8_t> minidump_stack = {'1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + 'a', + 'b', + 'c', + 'd', + 'e', + 'f'}; minidump_thread.Stack.Memory.DataSize = base::checked_cast<uint32_t>(minidump_stack.size());
diff --git a/third_party/crashpad/crashpad/snapshot/minidump/system_snapshot_minidump.cc b/third_party/crashpad/crashpad/snapshot/minidump/system_snapshot_minidump.cc index 356bd16..06bae48 100644 --- a/third_party/crashpad/crashpad/snapshot/minidump/system_snapshot_minidump.cc +++ b/third_party/crashpad/crashpad/snapshot/minidump/system_snapshot_minidump.cc
@@ -20,17 +20,17 @@ namespace internal { SystemSnapshotMinidump::SystemSnapshotMinidump() - : SystemSnapshot(), - minidump_system_info_(), - initialized_() { -} + : SystemSnapshot(), minidump_system_info_(), initialized_() {} -SystemSnapshotMinidump::~SystemSnapshotMinidump() { -} +SystemSnapshotMinidump::~SystemSnapshotMinidump() {} bool SystemSnapshotMinidump::Initialize(FileReaderInterface* file_reader, - RVA minidump_system_info_rva) { + RVA minidump_system_info_rva, + const std::string& version) { INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + + full_version_ = version; + if (!file_reader->SeekSet(minidump_system_info_rva)) { return false; } @@ -40,7 +40,8 @@ return false; } - if (!ReadMinidumpUTF8String(file_reader, minidump_system_info_.CSDVersionRva, + if (!ReadMinidumpUTF8String(file_reader, + minidump_system_info_.CSDVersionRva, &minidump_build_name_)) { return false; } @@ -52,23 +53,23 @@ CPUArchitecture SystemSnapshotMinidump::GetCPUArchitecture() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); switch (minidump_system_info_.ProcessorArchitecture) { - case kMinidumpCPUArchitectureAMD64: - return kCPUArchitectureX86_64; - case kMinidumpCPUArchitectureX86: - case kMinidumpCPUArchitectureX86Win64: - return kCPUArchitectureX86; - case kMinidumpCPUArchitectureARM: - case kMinidumpCPUArchitectureARM32Win64: - return kCPUArchitectureARM; - case kMinidumpCPUArchitectureARM64: - case kMinidumpCPUArchitectureARM64Breakpad: - return kCPUArchitectureARM64; - case kMinidumpCPUArchitectureMIPS: - return kCPUArchitectureMIPSEL; - // No word on how MIPS64 is signalled + case kMinidumpCPUArchitectureAMD64: + return kCPUArchitectureX86_64; + case kMinidumpCPUArchitectureX86: + case kMinidumpCPUArchitectureX86Win64: + return kCPUArchitectureX86; + case kMinidumpCPUArchitectureARM: + case kMinidumpCPUArchitectureARM32Win64: + return kCPUArchitectureARM; + case kMinidumpCPUArchitectureARM64: + case kMinidumpCPUArchitectureARM64Breakpad: + return kCPUArchitectureARM64; + case kMinidumpCPUArchitectureMIPS: + return kCPUArchitectureMIPSEL; + // No word on how MIPS64 is signalled - default: - return CPUArchitecture::kCPUArchitectureUnknown; + default: + return CPUArchitecture::kCPUArchitectureUnknown; } } @@ -85,9 +86,8 @@ std::string SystemSnapshotMinidump::CPUVendor() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); if (GetCPUArchitecture() == kCPUArchitectureX86) { - const char* ptr = - reinterpret_cast<const char*>(minidump_system_info_.Cpu.X86CpuInfo. - VendorId); + const char* ptr = reinterpret_cast<const char*>( + minidump_system_info_.Cpu.X86CpuInfo.VendorId); return std::string(ptr, ptr + (3 * sizeof(uint32_t))); } else { return std::string(); @@ -130,25 +130,25 @@ return false; } -SystemSnapshot::OperatingSystem - SystemSnapshotMinidump::GetOperatingSystem() const { +SystemSnapshot::OperatingSystem SystemSnapshotMinidump::GetOperatingSystem() + const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); switch (minidump_system_info_.PlatformId) { - case kMinidumpOSMacOSX: - return OperatingSystem::kOperatingSystemMacOSX; - case kMinidumpOSWin32s: - case kMinidumpOSWin32Windows: - case kMinidumpOSWin32NT: - return OperatingSystem::kOperatingSystemWindows; - case kMinidumpOSLinux: - return OperatingSystem::kOperatingSystemLinux; - case kMinidumpOSAndroid: - return OperatingSystem::kOperatingSystemAndroid; - case kMinidumpOSFuchsia: - return OperatingSystem::kOperatingSystemFuchsia; - default: - return OperatingSystem::kOperatingSystemUnknown; + case kMinidumpOSMacOSX: + return OperatingSystem::kOperatingSystemMacOSX; + case kMinidumpOSWin32s: + case kMinidumpOSWin32Windows: + case kMinidumpOSWin32NT: + return OperatingSystem::kOperatingSystemWindows; + case kMinidumpOSLinux: + return OperatingSystem::kOperatingSystemLinux; + case kMinidumpOSAndroid: + return OperatingSystem::kOperatingSystemAndroid; + case kMinidumpOSFuchsia: + return OperatingSystem::kOperatingSystemFuchsia; + default: + return OperatingSystem::kOperatingSystemUnknown; } } @@ -170,8 +170,7 @@ std::string SystemSnapshotMinidump::OSVersionFull() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); - NOTREACHED(); // https://crashpad.chromium.org/bug/10 - return std::string(); + return full_version_; } std::string SystemSnapshotMinidump::MachineDescription() const {
diff --git a/third_party/crashpad/crashpad/snapshot/minidump/system_snapshot_minidump.h b/third_party/crashpad/crashpad/snapshot/minidump/system_snapshot_minidump.h index 71e57891..0f2880e1 100644 --- a/third_party/crashpad/crashpad/snapshot/minidump/system_snapshot_minidump.h +++ b/third_party/crashpad/crashpad/snapshot/minidump/system_snapshot_minidump.h
@@ -38,11 +38,14 @@ //! The file reader must support seeking. //! \param[in] minidump_system_info_rva The file offset in \a file_reader at //! which the thread’s MINIDUMP_SYSTEM_INFO structure is located. + //! \param[in] version The OS version taken from the build string in + //! MINIDUMP_MISC_INFO_4. //! //! \return `true` if the snapshot could be created, `false` otherwise with //! an appropriate message logged. bool Initialize(FileReaderInterface* file_reader, - RVA minidump_system_info_rva); + RVA minidump_system_info_rva, + const std::string& version); CPUArchitecture GetCPUArchitecture() const override; uint32_t CPURevision() const override; @@ -68,9 +71,11 @@ int* daylight_offset_seconds, std::string* standard_name, std::string* daylight_name) const override; + private: MINIDUMP_SYSTEM_INFO minidump_system_info_; std::string minidump_build_name_; + std::string full_version_; InitializationStateDcheck initialized_; DISALLOW_COPY_AND_ASSIGN(SystemSnapshotMinidump);
diff --git a/third_party/crashpad/crashpad/snapshot/module_snapshot.h b/third_party/crashpad/crashpad/snapshot/module_snapshot.h index eea7466..f7eb83c 100644 --- a/third_party/crashpad/crashpad/snapshot/module_snapshot.h +++ b/third_party/crashpad/crashpad/snapshot/module_snapshot.h
@@ -146,6 +146,7 @@ //! Windows with incremental linking. On other platforms \a age will always be //! `0`. //! + //! \sa BuildID() //! \sa DebugFileName() virtual void UUIDAndAge(crashpad::UUID* uuid, uint32_t* age) const = 0; @@ -159,6 +160,20 @@ //! \sa UUIDAndAge() virtual std::string DebugFileName() const = 0; + //! \brief Returns the module’s build ID. + //! + //! On ELF platforms, the build ID is a variable-length byte stream that + //! identifies a library uniquely, and is usually used to look up its debug + //! symbols when stored separately. This will return an empty vector if it is + //! unsupported. + //! + //! BuildID() and UUIDAndAge() are never available in the same place. When + //! UUIDAndAge() is unavailable, it will be filled out with the contents of + //! BuildID() (either 0-padded or truncated) and age will be zero. + //! + //! \sa UUIDAndAge() + virtual std::vector<uint8_t> BuildID() const = 0; + //! \brief Returns string annotations recorded in the module. //! //! This method retrieves annotations recorded in a module. These annotations
diff --git a/third_party/crashpad/crashpad/snapshot/sanitized/module_snapshot_sanitized.cc b/third_party/crashpad/crashpad/snapshot/sanitized/module_snapshot_sanitized.cc index 94cb3d0..32b13578 100644 --- a/third_party/crashpad/crashpad/snapshot/sanitized/module_snapshot_sanitized.cc +++ b/third_party/crashpad/crashpad/snapshot/sanitized/module_snapshot_sanitized.cc
@@ -81,6 +81,10 @@ return snapshot_->DebugFileName(); } +std::vector<uint8_t> ModuleSnapshotSanitized::BuildID() const { + return snapshot_->BuildID(); +} + std::vector<std::string> ModuleSnapshotSanitized::AnnotationsVector() const { // TODO(jperaza): If/when AnnotationsVector() begins to be used, determine // whether and how the content should be sanitized.
diff --git a/third_party/crashpad/crashpad/snapshot/sanitized/module_snapshot_sanitized.h b/third_party/crashpad/crashpad/snapshot/sanitized/module_snapshot_sanitized.h index 4f375ce0..bbe1f5f 100644 --- a/third_party/crashpad/crashpad/snapshot/sanitized/module_snapshot_sanitized.h +++ b/third_party/crashpad/crashpad/snapshot/sanitized/module_snapshot_sanitized.h
@@ -56,6 +56,7 @@ ModuleType GetModuleType() const override; void UUIDAndAge(crashpad::UUID* uuid, uint32_t* age) const override; std::string DebugFileName() const override; + std::vector<uint8_t> BuildID() const override; std::vector<std::string> AnnotationsVector() const override; std::map<std::string, std::string> AnnotationsSimpleMap() const override; std::vector<AnnotationSnapshot> AnnotationObjects() const override;
diff --git a/third_party/crashpad/crashpad/snapshot/test/test_module_snapshot.cc b/third_party/crashpad/crashpad/snapshot/test/test_module_snapshot.cc index 9141edad..ad0c2de 100644 --- a/third_party/crashpad/crashpad/snapshot/test/test_module_snapshot.cc +++ b/third_party/crashpad/crashpad/snapshot/test/test_module_snapshot.cc
@@ -30,11 +30,9 @@ debug_file_name_(), annotations_vector_(), annotations_simple_map_(), - extra_memory_ranges_() { -} + extra_memory_ranges_() {} -TestModuleSnapshot::~TestModuleSnapshot() { -} +TestModuleSnapshot::~TestModuleSnapshot() {} std::string TestModuleSnapshot::Name() const { return name_; @@ -85,6 +83,10 @@ return debug_file_name_; } +std::vector<uint8_t> TestModuleSnapshot::BuildID() const { + return build_id_; +} + std::vector<std::string> TestModuleSnapshot::AnnotationsVector() const { return annotations_vector_; }
diff --git a/third_party/crashpad/crashpad/snapshot/test/test_module_snapshot.h b/third_party/crashpad/crashpad/snapshot/test/test_module_snapshot.h index d1262fa6..fb84aaf4 100644 --- a/third_party/crashpad/crashpad/snapshot/test/test_module_snapshot.h +++ b/third_party/crashpad/crashpad/snapshot/test/test_module_snapshot.h
@@ -64,6 +64,9 @@ uuid_ = uuid; age_ = age; } + void SetBuildID(const std::vector<uint8_t>& build_id) { + build_id_ = build_id; + } void SetDebugFileName(const std::string& debug_file_name) { debug_file_name_ = debug_file_name; } @@ -101,6 +104,7 @@ ModuleType GetModuleType() const override; void UUIDAndAge(crashpad::UUID* uuid, uint32_t* age) const override; std::string DebugFileName() const override; + std::vector<uint8_t> BuildID() const override; std::vector<std::string> AnnotationsVector() const override; std::map<std::string, std::string> AnnotationsSimpleMap() const override; std::vector<AnnotationSnapshot> AnnotationObjects() const override; @@ -117,6 +121,7 @@ ModuleType module_type_; uint32_t age_; crashpad::UUID uuid_; + std::vector<uint8_t> build_id_; std::string debug_file_name_; std::vector<std::string> annotations_vector_; std::map<std::string, std::string> annotations_simple_map_;
diff --git a/third_party/crashpad/crashpad/snapshot/win/module_snapshot_win.cc b/third_party/crashpad/crashpad/snapshot/win/module_snapshot_win.cc index d9d74c1..49d178a8 100644 --- a/third_party/crashpad/crashpad/snapshot/win/module_snapshot_win.cc +++ b/third_party/crashpad/crashpad/snapshot/win/module_snapshot_win.cc
@@ -44,8 +44,7 @@ age_(0), initialized_() {} -ModuleSnapshotWin::~ModuleSnapshotWin() { -} +ModuleSnapshotWin::~ModuleSnapshotWin() {} bool ModuleSnapshotWin::Initialize( ProcessReaderWin* process_reader, @@ -195,6 +194,11 @@ return pdb_name_; } +std::vector<uint8_t> ModuleSnapshotWin::BuildID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return std::vector<uint8_t>(); +} + std::vector<std::string> ModuleSnapshotWin::AnnotationsVector() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); // These correspond to system-logged things on Mac. We don't currently track
diff --git a/third_party/crashpad/crashpad/snapshot/win/module_snapshot_win.h b/third_party/crashpad/crashpad/snapshot/win/module_snapshot_win.h index f18a880..b32216c3 100644 --- a/third_party/crashpad/crashpad/snapshot/win/module_snapshot_win.h +++ b/third_party/crashpad/crashpad/snapshot/win/module_snapshot_win.h
@@ -84,6 +84,7 @@ ModuleType GetModuleType() const override; void UUIDAndAge(crashpad::UUID* uuid, uint32_t* age) const override; std::string DebugFileName() const override; + std::vector<uint8_t> BuildID() const override; std::vector<std::string> AnnotationsVector() const override; std::map<std::string, std::string> AnnotationsSimpleMap() const override; std::vector<AnnotationSnapshot> AnnotationObjects() const override;
diff --git a/third_party/crashpad/crashpad/util/linux/exception_handler_client.cc b/third_party/crashpad/crashpad/util/linux/exception_handler_client.cc index e4548d62..60970695 100644 --- a/third_party/crashpad/crashpad/util/linux/exception_handler_client.cc +++ b/third_party/crashpad/crashpad/util/linux/exception_handler_client.cc
@@ -35,7 +35,8 @@ ExceptionHandlerClient::~ExceptionHandlerClient() = default; -int ExceptionHandlerClient::RequestCrashDump(const ClientInformation& info) { +int ExceptionHandlerClient::RequestCrashDump( + const ExceptionHandlerProtocol::ClientInformation& info) { VMAddress sp = FromPointerCast<VMAddress>(&sp); int status = SendCrashDumpRequest(info, sp); @@ -64,10 +65,12 @@ can_set_ptracer_ = can_set_ptracer; } -int ExceptionHandlerClient::SendCrashDumpRequest(const ClientInformation& info, - VMAddress stack_pointer) { - ClientToServerMessage message; - message.type = ClientToServerMessage::kCrashDumpRequest; +int ExceptionHandlerClient::SendCrashDumpRequest( + const ExceptionHandlerProtocol::ClientInformation& info, + VMAddress stack_pointer) { + ExceptionHandlerProtocol::ClientToServerMessage message; + message.type = + ExceptionHandlerProtocol::ClientToServerMessage::kCrashDumpRequest; message.requesting_thread_stack_address = stack_pointer; message.client_info = info; @@ -105,19 +108,19 @@ } int ExceptionHandlerClient::WaitForCrashDumpComplete() { - ServerToClientMessage message; + ExceptionHandlerProtocol::ServerToClientMessage message; // If the server hangs up, ReadFileExactly will return false without setting // errno. errno = 0; while (ReadFileExactly(server_sock_, &message, sizeof(message))) { switch (message.type) { - case ServerToClientMessage::kTypeForkBroker: { + case ExceptionHandlerProtocol::ServerToClientMessage::kTypeForkBroker: { Signals::InstallDefaultHandler(SIGCHLD); pid_t pid = fork(); if (pid <= 0) { - Errno error = pid < 0 ? errno : 0; + ExceptionHandlerProtocol::Errno error = pid < 0 ? errno : 0; if (!WriteFile(server_sock_, &error, sizeof(error))) { return errno; } @@ -148,16 +151,18 @@ continue; } - case ServerToClientMessage::kTypeSetPtracer: { - Errno result = SetPtracer(message.pid); + case ExceptionHandlerProtocol::ServerToClientMessage::kTypeSetPtracer: { + ExceptionHandlerProtocol::Errno result = SetPtracer(message.pid); if (!WriteFile(server_sock_, &result, sizeof(result))) { return errno; } continue; } - case ServerToClientMessage::kTypeCrashDumpComplete: - case ServerToClientMessage::kTypeCrashDumpFailed: + case ExceptionHandlerProtocol::ServerToClientMessage:: + kTypeCrashDumpComplete: + case ExceptionHandlerProtocol::ServerToClientMessage:: + kTypeCrashDumpFailed: return 0; }
diff --git a/third_party/crashpad/crashpad/util/linux/exception_handler_client.h b/third_party/crashpad/crashpad/util/linux/exception_handler_client.h index 25a8a44..6492a12 100644 --- a/third_party/crashpad/crashpad/util/linux/exception_handler_client.h +++ b/third_party/crashpad/crashpad/util/linux/exception_handler_client.h
@@ -38,7 +38,7 @@ //! //! \param[in] info Information about this client. //! \return 0 on success or an error code on failure. - int RequestCrashDump(const ClientInformation& info); + int RequestCrashDump(const ExceptionHandlerProtocol::ClientInformation& info); //! \brief Uses `prctl(PR_SET_PTRACER, ...)` to set the process with //! process ID \a pid as the ptracer for this process. @@ -53,8 +53,9 @@ void SetCanSetPtracer(bool can_set_ptracer); private: - int SendCrashDumpRequest(const ClientInformation& info, - VMAddress stack_pointer); + int SendCrashDumpRequest( + const ExceptionHandlerProtocol::ClientInformation& info, + VMAddress stack_pointer); int WaitForCrashDumpComplete(); int server_sock_;
diff --git a/third_party/crashpad/crashpad/util/linux/exception_handler_protocol.cc b/third_party/crashpad/crashpad/util/linux/exception_handler_protocol.cc index 3feca69..7ab77d3 100644 --- a/third_party/crashpad/crashpad/util/linux/exception_handler_protocol.cc +++ b/third_party/crashpad/crashpad/util/linux/exception_handler_protocol.cc
@@ -16,10 +16,10 @@ namespace crashpad { -ClientInformation::ClientInformation() +ExceptionHandlerProtocol::ClientInformation::ClientInformation() : exception_information_address(0), sanitization_information_address(0) {} -ClientToServerMessage::ClientToServerMessage() +ExceptionHandlerProtocol::ClientToServerMessage::ClientToServerMessage() : version(kVersion), type(kCrashDumpRequest), client_info() {} } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/linux/exception_handler_protocol.h b/third_party/crashpad/crashpad/util/linux/exception_handler_protocol.h index 0ab3ffd0..d5eb5e8 100644 --- a/third_party/crashpad/crashpad/util/linux/exception_handler_protocol.h +++ b/third_party/crashpad/crashpad/util/linux/exception_handler_protocol.h
@@ -19,81 +19,90 @@ #include <stdint.h> #include <sys/types.h> +#include "base/macros.h" #include "util/file/file_io.h" #include "util/misc/address_types.h" namespace crashpad { +class ExceptionHandlerProtocol { + public: #pragma pack(push, 1) -//! \brief The type used for error reporting. -using Errno = int32_t; -static_assert(sizeof(Errno) >= sizeof(errno), "Errno type is too small"); + //! \brief The type used for error reporting. + using Errno = int32_t; + static_assert(sizeof(Errno) >= sizeof(errno), "Errno type is too small"); -//! \brief A boolean status suitable for communication between processes. -enum Bool : char { kBoolFalse, kBoolTrue }; + //! \brief A boolean status suitable for communication between processes. + enum Bool : char { kBoolFalse, kBoolTrue }; -//! \brief Information about a client registered with an ExceptionHandlerServer. -struct ClientInformation { - //! \brief Constructs this object. - ClientInformation(); + //! \brief Information about a client registered with an + //! ExceptionHandlerServer. + struct ClientInformation { + //! \brief Constructs this object. + ClientInformation(); - //! \brief The address in the client's address space of an - //! ExceptionInformation struct. - VMAddress exception_information_address; + //! \brief The address in the client's address space of an + //! ExceptionInformation struct. + VMAddress exception_information_address; - //! \brief The address in the client's address space of a - //! SanitizationInformation struct, or 0 if there is no such struct. - VMAddress sanitization_information_address; -}; - -//! \brief The message passed from client to server. -struct ClientToServerMessage { - static constexpr int32_t kVersion = 1; - - //! \brief Constructs this object. - ClientToServerMessage(); - - //! \brief Indicates what message version is being used. - int32_t version; - - //! \brief A stack address of the thread sending the message. - VMAddress requesting_thread_stack_address; - - enum Type : uint32_t { - //! \brief Used to request a crash dump for the sending client. - kCrashDumpRequest - } type; - - union { - //! \brief Valid for type == kCrashDumpRequest - ClientInformation client_info; + //! \brief The address in the client's address space of a + //! SanitizationInformation struct, or 0 if there is no such struct. + VMAddress sanitization_information_address; }; -}; -//! \brief The message passed from server to client. -struct ServerToClientMessage { - enum Type : uint32_t { - //! \brief Indicates that the client should fork a PtraceBroker process. - kTypeForkBroker, + //! \brief The message passed from client to server. + struct ClientToServerMessage { + static constexpr int32_t kVersion = 1; - //! \brief Inidicates that the client should set allow the handler to trace - //! it using PR_SET_PTRACER. - kTypeSetPtracer, + //! \brief Constructs this object. + ClientToServerMessage(); - //! \brief Indicates that the handler has completed a requested crash dump. - kTypeCrashDumpComplete, + //! \brief Indicates what message version is being used. + int32_t version; - //! \brief Indicicates that the handler was unable to produce a crash dump. - kTypeCrashDumpFailed - } type; + //! \brief A stack address of the thread sending the message. + VMAddress requesting_thread_stack_address; - //! \brief The handler's process ID. Valid for kTypeSetPtracer. - pid_t pid; -}; + enum Type : uint32_t { + //! \brief Used to request a crash dump for the sending client. + kCrashDumpRequest + } type; + + union { + //! \brief Valid for type == kCrashDumpRequest + ClientInformation client_info; + }; + }; + + //! \brief The message passed from server to client. + struct ServerToClientMessage { + enum Type : uint32_t { + //! \brief Indicates that the client should fork a PtraceBroker process. + kTypeForkBroker, + + //! \brief Inidicates that the client should set allow the handler to + //! trace it using PR_SET_PTRACER. + kTypeSetPtracer, + + //! \brief Indicates that the handler has completed a requested crash + //! dump. + kTypeCrashDumpComplete, + + //! \brief Indicicates that the handler was unable to produce a crash + //! dump. + kTypeCrashDumpFailed + } type; + + //! \brief The handler's process ID. Valid for kTypeSetPtracer. + pid_t pid; + }; #pragma pack(pop) + DISALLOW_IMPLICIT_CONSTRUCTORS(ExceptionHandlerProtocol); +}; + } // namespace crashpad #endif // CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_PROTOCOL_H_
diff --git a/third_party/crashpad/crashpad/util/linux/ptrace_broker.cc b/third_party/crashpad/crashpad/util/linux/ptrace_broker.cc index 4d7e4ced..6ec0af5b 100644 --- a/third_party/crashpad/crashpad/util/linux/ptrace_broker.cc +++ b/third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
@@ -139,9 +139,10 @@ attach_on_stack = true; } - Bool status = kBoolFalse; + ExceptionHandlerProtocol::Bool status = + ExceptionHandlerProtocol::kBoolFalse; if (attach->ResetAttach(request.tid)) { - status = kBoolTrue; + status = ExceptionHandlerProtocol::kBoolTrue; if (!attach_on_stack) { ++attach_count_; } @@ -151,21 +152,23 @@ return errno; } - if (status == kBoolFalse) { - Errno error = errno; + if (status == ExceptionHandlerProtocol::kBoolFalse) { + ExceptionHandlerProtocol::Errno error = errno; if (!WriteFile(sock_, &error, sizeof(error))) { return errno; } } - if (attach_on_stack && status == kBoolTrue) { + if (attach_on_stack && status == ExceptionHandlerProtocol::kBoolTrue) { return RunImpl(); } continue; } case Request::kTypeIs64Bit: { - Bool is_64_bit = ptracer_.Is64Bit() ? kBoolTrue : kBoolFalse; + ExceptionHandlerProtocol::Bool is_64_bit = + ptracer_.Is64Bit() ? ExceptionHandlerProtocol::kBoolTrue + : ExceptionHandlerProtocol::kBoolFalse; if (!WriteFile(sock_, &is_64_bit, sizeof(is_64_bit))) { return errno; } @@ -175,15 +178,15 @@ case Request::kTypeGetThreadInfo: { GetThreadInfoResponse response; response.success = ptracer_.GetThreadInfo(request.tid, &response.info) - ? kBoolTrue - : kBoolFalse; + ? ExceptionHandlerProtocol::kBoolTrue + : ExceptionHandlerProtocol::kBoolFalse; if (!WriteFile(sock_, &response, sizeof(response))) { return errno; } - if (response.success == kBoolFalse) { - Errno error = errno; + if (response.success == ExceptionHandlerProtocol::kBoolFalse) { + ExceptionHandlerProtocol::Errno error = errno; if (!WriteFile(sock_, &error, sizeof(error))) { return errno; } @@ -249,7 +252,7 @@ } } -int PtraceBroker::SendError(Errno err) { +int PtraceBroker::SendError(ExceptionHandlerProtocol::Errno err) { return WriteFile(sock_, &err, sizeof(err)) ? 0 : errno; }
diff --git a/third_party/crashpad/crashpad/util/linux/ptrace_broker.h b/third_party/crashpad/crashpad/util/linux/ptrace_broker.h index 47dd4d9..6a7bfb7 100644 --- a/third_party/crashpad/crashpad/util/linux/ptrace_broker.h +++ b/third_party/crashpad/crashpad/util/linux/ptrace_broker.h
@@ -146,7 +146,7 @@ ThreadInfo info; //! \brief Specifies the success or failure of this call. - Bool success; + ExceptionHandlerProtocol::Bool success; }; #pragma pack(pop) @@ -196,7 +196,7 @@ bool AllocateAttachments(); void ReleaseAttachments(); int RunImpl(); - int SendError(Errno err); + int SendError(ExceptionHandlerProtocol::Errno err); int SendReadError(ReadError err); int SendOpenResult(OpenResult result); int SendFileContents(FileHandle handle);
diff --git a/third_party/crashpad/crashpad/util/linux/ptrace_client.cc b/third_party/crashpad/crashpad/util/linux/ptrace_client.cc index d822d10e..f0d0d50ab 100644 --- a/third_party/crashpad/crashpad/util/linux/ptrace_client.cc +++ b/third_party/crashpad/crashpad/util/linux/ptrace_client.cc
@@ -31,7 +31,7 @@ namespace { bool ReceiveAndLogError(int sock, const std::string& operation) { - Errno error; + ExceptionHandlerProtocol::Errno error; if (!LoggingReadFileExactly(sock, &error, sizeof(error))) { return false; } @@ -69,12 +69,12 @@ return false; } - Bool success; + ExceptionHandlerProtocol::Bool success; if (!LoggingReadFileExactly(sock, &success, sizeof(success))) { return false; } - if (success != kBoolTrue) { + if (success != ExceptionHandlerProtocol::kBoolTrue) { ReceiveAndLogError(sock, "PtraceBroker Attach"); return false; } @@ -159,11 +159,11 @@ return false; } - Bool is_64_bit; + ExceptionHandlerProtocol::Bool is_64_bit; if (!LoggingReadFileExactly(sock_, &is_64_bit, sizeof(is_64_bit))) { return false; } - is_64_bit_ = is_64_bit == kBoolTrue; + is_64_bit_ = is_64_bit == ExceptionHandlerProtocol::kBoolTrue; if (try_direct_memory) { auto direct_mem = std::make_unique<ProcessMemoryLinux>(); @@ -209,7 +209,7 @@ return false; } - if (response.success == kBoolTrue) { + if (response.success == ExceptionHandlerProtocol::kBoolTrue) { *info = response.info; return true; }
diff --git a/third_party/crashpad/crashpad/util/misc/pdb_structures.cc b/third_party/crashpad/crashpad/util/misc/pdb_structures.cc index c62f11c..e904dc63 100644 --- a/third_party/crashpad/crashpad/util/misc/pdb_structures.cc +++ b/third_party/crashpad/crashpad/util/misc/pdb_structures.cc
@@ -18,5 +18,6 @@ const uint32_t CodeViewRecordPDB20::kSignature; const uint32_t CodeViewRecordPDB70::kSignature; +const uint32_t CodeViewRecordBuildID::kSignature; } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/misc/pdb_structures.h b/third_party/crashpad/crashpad/util/misc/pdb_structures.h index d0cc9a3..834cfdc 100644 --- a/third_party/crashpad/crashpad/util/misc/pdb_structures.h +++ b/third_party/crashpad/crashpad/util/misc/pdb_structures.h
@@ -90,12 +90,7 @@ // UUID has a constructor, which makes it non-POD, which makes this structure // non-POD. In order for the default constructor to zero-initialize other // members, an explicit constructor must be provided. - CodeViewRecordPDB70() - : signature(), - uuid(), - age(), - pdb_name() { - } + CodeViewRecordPDB70() : signature(), uuid(), age(), pdb_name() {} //! \brief The magic number identifying this structure version, stored in //! #signature. @@ -127,6 +122,27 @@ uint8_t pdb_name[1]; }; +//! \brief A CodeView record containing an ELF build-id. +//! +//! This identifier comes from the ELF section `NT_GNU_BUILD_ID`. +struct CodeViewRecordBuildID { + //! \brief The magic number identifying this structure version, stored in + //! #signature. + //! + //! In a hex dump, this will appear as “LEpB” when produced by a little-endian + //! machine. + static const uint32_t kSignature = 'BpEL'; + + //! \brief The magic number identifying this structure version, the value of + //! #kSignature. + uint32_t signature; + + //! \brief The build ID for this object. + //! + //! This usually comes from `NT_GNU_BUILD_ID` on ELF objects. + uint8_t build_id[1]; +}; + } // namespace crashpad #endif // CRASHPAD_UTIL_MISC_PDB_STRUCTURES_H_
diff --git a/tools/gritsettings/resource_ids b/tools/gritsettings/resource_ids index 33dc989..5c8eb8c 100644 --- a/tools/gritsettings/resource_ids +++ b/tools/gritsettings/resource_ids
@@ -195,6 +195,9 @@ "components/components_strings.grd": { "messages": [15100], }, + "components/omnibox/resources/omnibox_resources.grd": { + "includes": [17190], + }, "components/policy/resources/policy_templates.grd": { "structures": [17200], },
diff --git a/tools/gritsettings/translation_expectations.pyl b/tools/gritsettings/translation_expectations.pyl index 3a88252..d819a6f 100644 --- a/tools/gritsettings/translation_expectations.pyl +++ b/tools/gritsettings/translation_expectations.pyl
@@ -79,6 +79,7 @@ "chromecast/app/resources/chromecast_settings.grd": "Not UI strings; localized separately", "cloud_print/virtual_driver/win/install/virtual_driver_setup_resources.grd": "Separate release process", "components/components_locale_settings.grd": "Not UI strings; localized separately", + "components/omnibox/resources/omnibox_resources.grd": "Not UI strings; localized separately", "tools/grit/grit/testdata/buildinfo.grd": "Test data", "tools/grit/grit/testdata/chrome/app/generated_resources.grd": "Test data", "tools/grit/grit/testdata/substitute.grd": "Test data",
diff --git a/tools/linux/dump-static-initializers.py b/tools/linux/dump-static-initializers.py index e937d68..6c8fd87c 100755 --- a/tools/linux/dump-static-initializers.py +++ b/tools/linux/dump-static-initializers.py
@@ -18,7 +18,7 @@ 4) at run time, on startup the binary runs all function pointers. The functions in (1) all have mangled names of the form - _GLOBAL__I_foobar.cc + _GLOBAL__I_foobar.cc or __cxx_global_var_initN using objdump, we can disassemble those functions and dump all symbols that they reference. """ @@ -106,14 +106,16 @@ # Regex matching nm output for the symbols we're interested in. # See test_ParseNmLine for examples. -nm_re = re.compile(r'(\S+) (\S+) t (?:_ZN12)?_GLOBAL__(?:sub_)?I_(.*)') +nm_re = re.compile( + r'(\S+) (\S+) t ((?:_ZN12)?_GLOBAL__(?:sub_)?I_|__cxx_global_var_init\d*)(.*)' +) def ParseNmLine(line): """Given a line of nm output, parse static initializers as a - (file, start, size) tuple.""" + (file, start, size, symbol) tuple.""" match = nm_re.match(line) if match: - addr, size, filename = match.groups() - return (filename, int(addr, 16), int(size, 16)) + addr, size, prefix, filename = match.groups() + return (filename, int(addr, 16), int(size, 16), prefix+filename) def test_ParseNmLine(): @@ -121,12 +123,22 @@ parse = ParseNmLine( '0000000001919920 0000000000000008 t ' '_ZN12_GLOBAL__I_safe_browsing_service.cc') - assert parse == ('safe_browsing_service.cc', 26319136, 8), parse + assert parse == ('safe_browsing_service.cc', 26319136, 8, + '_ZN12_GLOBAL__I_safe_browsing_service.cc'), parse parse = ParseNmLine( '00000000026b9eb0 0000000000000024 t ' '_GLOBAL__sub_I_extension_specifics.pb.cc') - assert parse == ('extension_specifics.pb.cc', 40607408, 36), parse + assert parse == ('extension_specifics.pb.cc', 40607408, 36, + '_GLOBAL__sub_I_extension_specifics.pb.cc'), parse + + parse = ParseNmLine( + '0000000002e75a60 0000000000000016 t __cxx_global_var_init') + assert parse == ('', 48716384, 22, '__cxx_global_var_init'), parse + + parse = ParseNmLine( + '0000000002e75a60 0000000000000016 t __cxx_global_var_init89') + assert parse == ('', 48716384, 22, '__cxx_global_var_init89'), parse # Just always run the test; it is fast enough. @@ -134,7 +146,8 @@ def ParseNm(toolchain, binary): - """Given a binary, yield static initializers as (file, start, size) tuples.""" + """Given a binary, yield static initializers as (file, start, size, symbol) + tuples.""" nm = subprocess.Popen([toolchain + 'nm', '-S', binary], stdout=subprocess.PIPE) for line in nm.stdout: @@ -147,7 +160,7 @@ # Example line: # 12354ab: (disassembly, including <FunctionReference>) disassembly_re = re.compile(r'^\s+[0-9a-f]+:.*<(\S+)>') -def ExtractSymbolReferences(toolchain, binary, start, end): +def ExtractSymbolReferences(toolchain, binary, start, end, symbol): """Given a span of addresses, returns symbol references from disassembly.""" cmd = [toolchain + 'objdump', binary, '--disassemble', '--start-address=0x%x' % start, '--stop-address=0x%x' % end] @@ -165,7 +178,7 @@ if ref.startswith('.LC') or ref.startswith('_DYNAMIC'): # Ignore these, they are uninformative. continue - if re.match('_GLOBAL__(?:sub_)?I_', ref): + if re.match(symbol, ref): # Probably a relative jump within this function. continue refs.add(ref) @@ -196,7 +209,7 @@ files = ParseNm(opts.toolchain, binary) if opts.diffable: files = sorted(files) - for filename, addr, size in files: + for filename, addr, size, symbol in files: file_count += 1 ref_output = [] @@ -209,7 +222,7 @@ ref_output.append('[empty ctor, but it still has cost on gcc <4.6]') else: for ref in ExtractSymbolReferences(opts.toolchain, binary, addr, - addr+size): + addr+size, symbol): initializer_count += 1 ref = demangler.Demangle(ref)
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index ac0226e..a409c66 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -24333,6 +24333,9 @@ </enum> <enum name="FtpDataConnectionError"> + <obsolete> + Removed in Chrome 76. + </obsolete> <int value="0" label="Data connection successful"/> <int value="1" label="Local firewall blocked the connection"/> <int value="2" label="Connection timed out"/> @@ -24370,6 +24373,9 @@ </enum> <enum name="FtpServerType2"> + <obsolete> + Removed in Chrome 76. + </obsolete> <summary> FTP server type as defined in net/ftp/ftp_server_type_histograms.h </summary> @@ -32486,8 +32492,6 @@ <int value="-1714128884" label="disable-launcher-search-provider-api"/> <int value="-1713564656" label="ProtectSyncCredentialOnReauth:enabled"/> <int value="-1711751318" label="enable-data-reduction-proxy-lo-fi-preview"/> - <int value="-1711283256" - label="AutofillSaveCardSignInAfterLocalSave:enabled"/> <int value="-1710772665" label="disable-my-files-navigation"/> <int value="-1704472714" label="UseMessagesGoogleComDomain:disabled"/> <int value="-1703709912" label="enable-new-ntp"/> @@ -33019,6 +33023,7 @@ <int value="-920204598" label="ScrollAnchorSerialization:enabled"/> <int value="-918900957" label="AutofillCreditCardAssist:disabled"/> <int value="-918618075" label="enable-service-worker"/> + <int value="-915035507" label="ArcPrintSpoolerExperiment:enabled"/> <int value="-914210146" label="enable-web-based-signin"/> <int value="-913294939" label="DriveFS:enabled"/> <int value="-912456561" label="MidiManagerWinrt:enabled"/> @@ -34427,6 +34432,7 @@ <int value="1340690624" label="WebPaymentsMethodSectionOrderV2:disabled"/> <int value="1343050930" label="ContextualSearchUnityIntegration:enabled"/> <int value="1343516821" label="ignore-previews-blocklist"/> + <int value="1343713259" label="ArcPrintSpoolerExperiment:disabled"/> <int value="1344833841" label="ImeThread:enabled"/> <int value="1346994602" label="SyncPseudoUSSDictionary:enabled"/> <int value="1351830811" label="do-not-ignore-autocomplete-off"/> @@ -34852,8 +34858,6 @@ <int value="1995879122" label="AutocompleteRetentionPolicyEnabled:disabled"/> <int value="1996125159" label="AutoplayMutedVideos:enabled"/> <int value="1997047666" label="NTPSnippetsIncreasedVisibility:disabled"/> - <int value="1999081349" - label="AutofillSaveCardSignInAfterLocalSave:disabled"/> <int value="2000091128" label="enable-touch-hover"/> <int value="2001562962" label="enable-manual-fallback-for-password-saving:enabled"/> @@ -47686,6 +47690,13 @@ <int value="1" label="User proceeded through recurrent error interstitial"/> </enum> +<enum name="RedirectPosition"> + <int value="0" label="Only URL in redirect chain"/> + <int value="1" label="First URL in redirect chain"/> + <int value="2" label="Any middle URL in redirect chain"/> + <int value="3" label="Last redirect in URL chain"/> +</enum> + <enum name="RefcountOperation"> <int value="0" label="Decrement"/> <int value="1" label="Increment"/> @@ -47976,6 +47987,9 @@ </enum> <enum name="RendererUnresponsiveCause"> + <obsolete> + Removed 4/2019. + </obsolete> <int value="0" label="Navigation commit timeout"/> <int value="1" label="Input event ack timeout"/> </enum> @@ -55424,6 +55438,9 @@ </enum> <enum name="TunnelRedirectHistogramValue"> + <obsolete> + Removed in Chrome 76. + </obsolete> <int value="0" label="Subresource fetched using an explicit proxy"/> <int value="1" label="Mainframe fetched using an explicit proxy"/> <int value="2" label="Subresource fetched using an auto-detected proxy"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 533110a..6a611b05 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -6207,6 +6207,26 @@ </summary> </histogram> +<histogram name="Ash.TabletMode.AnimationSmoothness.Enter" units="%"> + <owner>oshima@chromium.org</owner> + <owner>sammiequon@chromium.org</owner> + <summary> + Relative smoothness of animations when entering tablet mode, recorded when + the animation completes. 100% represents ideally smooth 60 frames per + second. + </summary> +</histogram> + +<histogram name="Ash.TabletMode.AnimationSmoothness.Exit" units="%"> + <owner>oshima@chromium.org</owner> + <owner>sammiequon@chromium.org</owner> + <summary> + Relative smoothness of animations when exiting tablet mode, recorded when + the animation completes. 100% represents ideally smooth 60 frames per + second. + </summary> +</histogram> + <histogram name="Ash.TimeBetweenTaskSwitches" units="seconds"> <owner>bruthig@google.com</owner> <owner>tdanderson@google.com</owner> @@ -9366,7 +9386,11 @@ </histogram> <histogram name="Autofill.ResetFullServerCards.SyncServiceStatusOnStateChanged" - enum="SyncUploadState"> + enum="SyncUploadState" expires_after="2019-04-23"> + <obsolete> + Deprecated as of 04/2019 (M76). No longer necessary since we don't mask data + for USS Autofill Wallet anymore. + </obsolete> <owner>sebsg@chromium.org</owner> <summary> Records the sync service state when OnStateChanged is called. @@ -15826,6 +15850,9 @@ <histogram name="ChildProcess.HungRendererCause" enum="RendererUnresponsiveCause" expires_after="M74"> + <obsolete> + Removed 4/2019. + </obsolete> <owner>cmumford@chromium.org</owner> <summary> What the browser was waiting for from the renderer when it was reported as @@ -18945,6 +18972,10 @@ <histogram name="ContentSettings.Popups.StrongBlockerActivationPosition" enum="SafeBrowsingActivationPosition" expires_after="M77"> + <obsolete> + Deprecated in favor of + SubresourceFilter.PageLoad.Activation.RedirectPosition2.Enforcement + </obsolete> <owner>csharrison@chromium.org</owner> <owner>ericrobinson@chromium.org</owner> <summary> @@ -42759,7 +42790,7 @@ </summary> </histogram> -<histogram name="GPU.GpuGeneration" enum="GpuSeriesType" expires_after="M75"> +<histogram name="GPU.GpuGeneration" enum="GpuSeriesType" expires_after="M90"> <owner>sunnyps@chromium.org</owner> <owner>zmo@chromium.org</owner> <summary> @@ -64082,7 +64113,11 @@ </summary> </histogram> -<histogram name="Net.Cronet.PrefsInitTime" units="ms"> +<histogram name="Net.Cronet.PrefsInitTime" units="ms" + expires_after="2019-04-23"> + <obsolete> + Removed 2019-04-23. + </obsolete> <owner>mgersh@chromium.org</owner> <summary> Measures time spent creating the Cronet PrefService, including loading the @@ -65533,13 +65568,20 @@ </summary> </histogram> -<histogram name="Net.FtpDataConnectionErrorCount" enum="FtpDataConnectionError"> +<histogram name="Net.FtpDataConnectionErrorCount" enum="FtpDataConnectionError" + expires_after="2019-04-23"> + <obsolete> + Removed in Chrome 76. + </obsolete> <owner>phajdan.jr@chromium.org</owner> <summary>The number of times each FTP Error was observed.</summary> </histogram> <histogram name="Net.FtpDataConnectionErrorHappened" - enum="FtpDataConnectionError" expires_after="M77"> + enum="FtpDataConnectionError" expires_after="2019-04-23"> + <obsolete> + Removed in Chrome 76. + </obsolete> <owner>phajdan.jr@chromium.org</owner> <summary> The number of Chrome sessions which encountered the indicates FTP Error. @@ -65559,7 +65601,11 @@ </summary> </histogram> -<histogram name="Net.FtpServerTypeCount2" enum="FtpServerType2"> +<histogram name="Net.FtpServerTypeCount2" enum="FtpServerType2" + expires_after="2019-04-23"> + <obsolete> + Removed in Chrome 76. + </obsolete> <owner>phajdan.jr@chromium.org</owner> <summary> Each bucket is the number of times the FTP server type was encountered. @@ -65693,7 +65739,10 @@ </histogram> <histogram name="Net.HadFtpServerType2" enum="FtpServerType2" - expires_after="M77"> + expires_after="2019-04-23"> + <obsolete> + Removed in Chrome 76. + </obsolete> <owner>phajdan.jr@chromium.org</owner> <summary> Each bucket is the number of sessions that encountered a given FTP server @@ -67228,6 +67277,9 @@ <histogram name="Net.Proxy.RedirectDuringConnect" enum="TunnelRedirectHistogramValue" expires_after="2019-05-19"> + <obsolete> + Removed in Chrome 76. + </obsolete> <owner>eroman@chromium.org</owner> <owner>mmenke@chromium.org</owner> <summary> @@ -122104,6 +122156,10 @@ <histogram name="SubresourceFilter.PageLoad.Activation.RedirectPosition" enum="SafeBrowsingActivationPosition"> + <obsolete> + Deprecated in favor of + SubresourceFilter.PageLoad.Activation.RedirectPosition2 + </obsolete> <owner>ericrobinson@chromium.org</owner> <summary> For pages that trigger Safe Browsing activations (not including dry runs), @@ -122113,6 +122169,17 @@ </summary> </histogram> +<histogram + name="SubresourceFilter.PageLoad.Activation.RedirectPosition2.Enforcement" + enum="RedirectPosition" expires_after="M78"> + <owner>ericrobinson@chromium.org</owner> + <owner>csharrison@chromium.org</owner> + <summary> + For pages that match a given subresource_filter activation list, records the + position in the redirect chain of the latest non-NONE list. + </summary> +</histogram> + <histogram name="SubresourceFilter.PageLoad.Activation.WallDuration" units="microseconds" expires_after="2018-08-30"> <owner>csharrison@chromium.org</owner> @@ -136072,9 +136139,19 @@ <owner>kenrb@chromium.org</owner> <owner>kpaulhamus@chromium.org</owner> <summary> - Records the transport used for a WebAuthentication GetAssertion request to - an authenticator device, to help understand the breakdown of authenticator - types in use. + Records the transport used for all WebAuthentication GetAssertion requests + sent to authenticators. This does not necessarily mean that there was a + success response from any given authenticator. + </summary> +</histogram> + +<histogram name="WebAuthentication.GetAssertionResponseTransport" + enum="WebAuthenticationFidoTransport" expires_after="2019-12-31"> + <owner>kenrb@chromium.org</owner> + <owner>kpaulhamus@chromium.org</owner> + <summary> + Records the transport used when an authenticator responds with success to a + WebAuthentication GetAssertion request. </summary> </histogram> @@ -136088,6 +136165,27 @@ </summary> </histogram> +<histogram name="WebAuthentication.MakeCredentialRequestTransport" + enum="WebAuthenticationFidoTransport" expires_after="2019-12-31"> + <owner>kenrb@chromium.org</owner> + <owner>kpaulhamus@chromium.org</owner> + <summary> + Records the transport used for all WebAuthentication MakeCredential requests + sent to authenticators. This does not necessarily mean that there was a + success response from any given authenticator. + </summary> +</histogram> + +<histogram name="WebAuthentication.MakeCredentialResponseTransport" + enum="WebAuthenticationFidoTransport" expires_after="2019-12-31"> + <owner>kenrb@chromium.org</owner> + <owner>kpaulhamus@chromium.org</owner> + <summary> + Records the transport used when an authenticator responds with success to a + WebAuthentication MakeCredential request. + </summary> +</histogram> + <histogram name="WebAuthentication.RelyingPartySecurityCheckFailure" enum="WebAuthenticationRelyingPartySecurityCheckFailure" expires_after="2019-12-31"> @@ -146823,8 +146921,6 @@ </histogram_suffixes> <histogram_suffixes name="ImageFetcherClients" separator="."> - <suffix name="AnswerSuggestions" - label="Showing cache patterns only for AnswerSuggestions."/> <suffix name="AssistantDetails" label="Showing cache patterns only for AssistantDetails."/> <suffix name="ContextualSuggestions"
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index 6b9f0ad..e5e276f 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -6100,6 +6100,13 @@ loaded on the page, but subresource filtering is not actually applied. </summary> </metric> + <metric name="EnforcementRedirectPosition"> + <summary> + An enum denoting where in the redirect chain there was a URL that matched + one of the subresource_filter activation lists, and wasn't marked as + warning. See subresource_filter::RedirectPosition for values. + </summary> + </metric> </event> <event name="Tab.RendererOOM">
diff --git a/tools/perf/process_perf_results.py b/tools/perf/process_perf_results.py index e1620d91..aa7bab4f 100755 --- a/tools/perf/process_perf_results.py +++ b/tools/perf/process_perf_results.py
@@ -4,12 +4,11 @@ # found in the LICENSE file. import argparse +import collections import json import logging import multiprocessing import os -from os import listdir -from os.path import isfile, join, basename import shutil import sys import tempfile @@ -189,7 +188,7 @@ is_ref = '.reference' in benchmark_name enabled = True try: - with open(join(directory, 'test_results.json')) as json_data: + with open(os.path.join(directory, 'test_results.json')) as json_data: json_results = json.load(json_data) if not json_results: # Output is null meaning the test didn't produce any results. @@ -230,18 +229,17 @@ def _handle_perf_logs(benchmark_directory_map, extra_links): """ Upload benchmark logs to logdog and add a page entry for them. """ begin_time = time.time() - benchmark_logs_links = {} + benchmark_logs_links = collections.defaultdict(list) for benchmark_name, directories in benchmark_directory_map.iteritems(): for directory in directories: - with open(join(directory, 'benchmark_log.txt')) as f: - uploaded_link = logdog_helper.text( - name=_generate_unique_logdog_filename(benchmark_name), - data=f.read()) - if benchmark_name in benchmark_logs_links.keys(): + benchmark_log_file = os.path.join(directory, 'benchmark_log.txt') + if os.path.exists(benchmark_log_file): + with open(benchmark_log_file) as f: + uploaded_link = logdog_helper.text( + name=_generate_unique_logdog_filename(benchmark_name), + data=f.read()) benchmark_logs_links[benchmark_name].append(uploaded_link) - else: - benchmark_logs_links[benchmark_name] = [uploaded_link] logdog_file_name = _generate_unique_logdog_filename('Benchmarks_Logs') logdog_stream = logdog_helper.text( @@ -268,7 +266,7 @@ def _get_benchmark_name(directory): - return basename(directory).replace(" benchmark", "") + return os.path.basename(directory).replace(" benchmark", "") def process_perf_results(output_json, configuration_name, @@ -297,15 +295,15 @@ return_code = 0 benchmark_upload_result_map = {} directory_list = [ - f for f in listdir(task_output_dir) - if not isfile(join(task_output_dir, f)) + f for f in os.listdir(task_output_dir) + if not os.path.isfile(os.path.join(task_output_dir, f)) ] benchmark_directory_list = [] benchmarks_shard_map_file = None for directory in directory_list: - for f in listdir(join(task_output_dir, directory)): - path = join(task_output_dir, directory, f) + for f in os.listdir(os.path.join(task_output_dir, directory)): + path = os.path.join(task_output_dir, directory, f) if os.path.isdir(path): benchmark_directory_list.append(path) elif path.endswith('benchmarks_shard_map.json'): @@ -381,7 +379,7 @@ begin_time = time.time() collected_results = [] for directory in directories: - filename = join(directory, 'perf_results.json') + filename = os.path.join(directory, 'perf_results.json') try: with open(filename) as pf: collected_results.append(json.load(pf)) @@ -430,7 +428,7 @@ _merge_perf_results(benchmark_name, results_filename, directories) else: # It was only written to one shard, use that shards data - results_filename = join(directories[0], 'perf_results.json') + results_filename = os.path.join(directories[0], 'perf_results.json') results_size_in_mib = os.path.getsize(results_filename) / (2 ** 20) print 'Uploading perf results from %s benchmark (size %s Mib)' % (
diff --git a/tools/perf/process_perf_results_unittest.py b/tools/perf/process_perf_results_unittest.py index f90d3bd..65dd29c 100755 --- a/tools/perf/process_perf_results_unittest.py +++ b/tools/perf/process_perf_results_unittest.py
@@ -3,11 +3,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import json import os import shutil import sys import tempfile -import json import unittest from core import path_util @@ -218,6 +218,19 @@ class ProcessPerfResults_HardenedUnittest(unittest.TestCase): + def setUp(self): + self._logdog_text = mock.patch( + 'process_perf_results.logdog_helper.text', + return_value = 'http://foo.link') + self._logdog_text.start() + self.addCleanup(self._logdog_text.stop) + + self._logdog_open_text = mock.patch( + 'process_perf_results.logdog_helper.open_text', + return_value=_FakeLogdogStream()) + self._logdog_open_text.start() + self.addCleanup(self._logdog_open_text.stop) + def test_handle_perf_json_test_results_IOError(self): directory_map = { 'benchmark.example': ['directory_that_does_not_exist']} @@ -231,6 +244,24 @@ ppr_module._merge_perf_results('benchmark.example', results_filename, directories) + def test_handle_perf_logs_no_log(self): + tempdir = tempfile.mkdtemp() + try: + dir1 = os.path.join(tempdir, '1') + dir2 = os.path.join(tempdir, '2') + os.makedirs(dir1) + os.makedirs(dir2) + with open(os.path.join(dir1, 'benchmark_log.txt'), 'w') as logfile: + logfile.write('hello world') + directory_map = { + 'benchmark.with.log': [dir1], + 'benchmark.with.no.log': [dir2], + } + extra_links = {} + ppr_module._handle_perf_logs(directory_map, extra_links) + finally: + shutil.rmtree(tempdir) + if __name__ == '__main__': unittest.main()
diff --git a/ui/accessibility/ax_node_data.cc b/ui/accessibility/ax_node_data.cc index 05395c0..b477fa65 100644 --- a/ui/accessibility/ax_node_data.cc +++ b/ui/accessibility/ax_node_data.cc
@@ -855,17 +855,7 @@ result += StateBitfieldToString(state); - result += " (" + base::NumberToString(relative_bounds.bounds.x()) + ", " + - base::NumberToString(relative_bounds.bounds.y()) + ")-(" + - base::NumberToString(relative_bounds.bounds.width()) + ", " + - base::NumberToString(relative_bounds.bounds.height()) + ")"; - - if (relative_bounds.offset_container_id != -1) - result += " offset_container_id=" + - base::NumberToString(relative_bounds.offset_container_id); - - if (relative_bounds.transform && !relative_bounds.transform->IsIdentity()) - result += " transform=" + relative_bounds.transform->ToString(); + result += " " + relative_bounds.ToString(); for (const std::pair<ax::mojom::IntAttribute, int32_t>& int_attribute : int_attributes) {
diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc index 340291d..ada0da2 100644 --- a/ui/base/resource/resource_bundle.cc +++ b/ui/base/resource/resource_bundle.cc
@@ -415,7 +415,7 @@ if (!mangle_localized_strings_) return str; - // IDS_DEFAULT_FONT_SIZE and friends are localization "strings" that are + // IDS_MINIMUM_FONT_SIZE and friends are localization "strings" that are // actually integral constants. These should not be mangled or they become // impossible to parse. int ignored;
diff --git a/ui/chromeos/ime/candidate_window_view.cc b/ui/chromeos/ime/candidate_window_view.cc index c3d8c43..d3d34146 100644 --- a/ui/chromeos/ime/candidate_window_view.cc +++ b/ui/chromeos/ime/candidate_window_view.cc
@@ -25,6 +25,7 @@ #include "ui/native_theme/native_theme.h" #include "ui/views/background.h" #include "ui/views/border.h" +#include "ui/views/bubble/bubble_border.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/label.h" #include "ui/views/layout/box_layout.h" @@ -309,12 +310,13 @@ view->SetWidths(max_shortcut_width, max_candidate_width); } - CandidateWindowBorder* border = static_cast<CandidateWindowBorder*>( - GetBubbleFrameView()->bubble_border()); + std::unique_ptr<CandidateWindowBorder> border = + std::make_unique<CandidateWindowBorder>(); if (new_candidate_window.orientation() == ui::CandidateWindow::VERTICAL) border->set_offset(max_shortcut_width); else border->set_offset(0); + GetBubbleFrameView()->SetBubbleBorder(std::move(border)); } // Update the current candidate window. We'll use candidate_window_ from here. // Note that SelectCandidateAt() uses candidate_window_.
diff --git a/ui/chromeos/ime/infolist_window.cc b/ui/chromeos/ime/infolist_window.cc index bc63378..3bb181b 100644 --- a/ui/chromeos/ime/infolist_window.cc +++ b/ui/chromeos/ime/infolist_window.cc
@@ -242,7 +242,6 @@ } Layout(); - GetBubbleFrameView()->bubble_border()->set_arrow_offset(0); SizeToContents(); }
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb index a5cca79..47c9bf5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -285,6 +285,7 @@ <translation id="4572815280350369984"><ph name="FILE_TYPE" /> கோப்பு</translation> <translation id="457386861538956877">மேலும்...</translation> <translation id="4582497162516204941">Linux (பீட்டா) மூலம் நிறுவு</translation> +<translation id="4584780943629874245">VM செருகு நிரல் மூலம் பகிர்</translation> <translation id="4631887759990505102">கலைஞர்</translation> <translation id="4656293982926141856">இந்தக் கணினி</translation> <translation id="4669606053856530811">இந்தக் கோப்புகளை '<ph name="SOURCE_NAME" />' இன் உறுப்பினர்களுடன் பகிரவில்லை எனில், அவர்கள் அவற்றுக்கான அணுகலை இழப்பார்கள்.</translation> @@ -525,6 +526,7 @@ <translation id="7339898014177206373">புதிய சாளரம்</translation> <translation id="7348749398828259943">யுஎஸ் ஒர்க்மேன் இன்டர்நேஷனல் விசைப்பலகை</translation> <translation id="7359359531237882347"><ph name="NUMBER_OF_ITEMS" /> உள்ளடக்கங்களை நகலெடுக்கிறது...</translation> +<translation id="7379734276381389090"><ph name="NUMBER_OF_ITEMS" /> கோப்புகள் VM செருகு நிரலுடன் பகிரப்பட்டன</translation> <translation id="7389722738210761877">தாய் விசைப்பலகை (TIS 820-2531)</translation> <translation id="7396038720194014279">இந்தி விசைப்பலகை (ஒலிப்புமுறை)</translation> <translation id="7417453074306512035">எத்தியோபிக் விசைப்பலகை</translation> @@ -587,6 +589,7 @@ <translation id="7969525169268594403">ஸ்லோவேனியன்</translation> <translation id="7982283708762922719">உயரம்</translation> <translation id="7987485481246785146">சொரானி குர்டிஷ் அரபிக் விசைப்பலகை</translation> +<translation id="7990715602172183602">ஒரு கோப்புறை VM செருகு நிரலுடன் பகிரப்பட்டது</translation> <translation id="799547531016638432">ஷார்ட்கட்டை அகற்று</translation> <translation id="799923393800005025">பார்க்கலாம்</translation> <translation id="8008366997883261463">ஜாக் ரஸ்ஸல் டெர்ரியர்</translation> @@ -627,6 +630,7 @@ <translation id="8342318071240498787">ஒரே பெயருடைய கோப்பு அல்லது கோப்பகம் ஏற்கனவே உள்ளன.</translation> <translation id="8391950649760071442">ஒலிபெயர்ப்பு (emandi → ఏమండీ)</translation> <translation id="8395901698320285466">பரிமாணங்கள்</translation> +<translation id="8400874747056634633">VM செருகுநிரல் பகிர்வை நிர்வகி</translation> <translation id="8412586565681117057">விரைவு உள்ளீட்டு முறை</translation> <translation id="8418113698656761985">ரோமானியன் விசைப்பலகை</translation> <translation id="8432745813735585631">யுஎஸ் கோல்மேக் விசைப்பலகை</translation>
diff --git a/ui/gfx/color_space.cc b/ui/gfx/color_space.cc index 8facea7..3549274 100644 --- a/ui/gfx/color_space.cc +++ b/ui/gfx/color_space.cc
@@ -408,6 +408,17 @@ return *this; } +ColorSpace ColorSpace::GetWithMatrixAndRange(MatrixID matrix, + RangeID range) const { + ColorSpace result(*this); + if (!IsValid()) + return result; + + result.matrix_ = matrix; + result.range_ = range; + return result; +} + sk_sp<SkColorSpace> ColorSpace::ToSkColorSpace() const { // Unspecified color spaces correspond to the null SkColorSpace. if (!IsValid())
diff --git a/ui/gfx/color_space.h b/ui/gfx/color_space.h index 3ac91ee2..75ad4a4 100644 --- a/ui/gfx/color_space.h +++ b/ui/gfx/color_space.h
@@ -244,6 +244,10 @@ // would be appropriate for blending. ColorSpace GetBlendingColorSpace() const; + // Return a combined color space with has the same primary and transfer than + // the caller but replacing the matrix and range with the given values. + ColorSpace GetWithMatrixAndRange(MatrixID matrix, RangeID range) const; + // This will return nullptr for non-RGB spaces, spaces with non-FULL // range, and unspecified spaces. sk_sp<SkColorSpace> ToSkColorSpace() const;
diff --git a/ui/gfx/color_space_unittest.cc b/ui/gfx/color_space_unittest.cc index fc2483a..2c9a149 100644 --- a/ui/gfx/color_space_unittest.cc +++ b/ui/gfx/color_space_unittest.cc
@@ -147,5 +147,37 @@ } } +TEST(ColorSpace, MixedInvalid) { + ColorSpace color_space; + color_space = color_space.GetWithMatrixAndRange(ColorSpace::MatrixID::INVALID, + ColorSpace::RangeID::INVALID); + EXPECT_TRUE(!color_space.IsValid()); + color_space = color_space.GetWithMatrixAndRange( + ColorSpace::MatrixID::SMPTE170M, ColorSpace::RangeID::LIMITED); + EXPECT_TRUE(!color_space.IsValid()); +} + +TEST(ColorSpace, MixedSRGBWithRec601) { + const ColorSpace expected_color_space = ColorSpace( + ColorSpace::PrimaryID::BT709, ColorSpace::TransferID::IEC61966_2_1, + ColorSpace::MatrixID::SMPTE170M, ColorSpace::RangeID::LIMITED); + ColorSpace color_space = ColorSpace::CreateSRGB(); + color_space = color_space.GetWithMatrixAndRange( + ColorSpace::MatrixID::SMPTE170M, ColorSpace::RangeID::LIMITED); + EXPECT_TRUE(expected_color_space.IsValid()); + EXPECT_EQ(color_space, expected_color_space); +} + +TEST(ColorSpace, MixedHDR10WithRec709) { + const ColorSpace expected_color_space = ColorSpace( + ColorSpace::PrimaryID::BT2020, ColorSpace::TransferID::SMPTEST2084, + ColorSpace::MatrixID::BT709, ColorSpace::RangeID::LIMITED); + ColorSpace color_space = ColorSpace::CreateHDR10(); + color_space = color_space.GetWithMatrixAndRange(ColorSpace::MatrixID::BT709, + ColorSpace::RangeID::LIMITED); + EXPECT_TRUE(expected_color_space.IsValid()); + EXPECT_EQ(color_space, expected_color_space); +} + } // namespace } // namespace gfx
diff --git a/ui/strings/translations/ui_strings_ta.xtb b/ui/strings/translations/ui_strings_ta.xtb index 8a4122c0..5b0fc56 100644 --- a/ui/strings/translations/ui_strings_ta.xtb +++ b/ui/strings/translations/ui_strings_ta.xtb
@@ -109,6 +109,7 @@ <translation id="5137751499640340777">Google அசிஸ்டண்ட்டைத் தொடங்கும்</translation> <translation id="520299402983819650"><ph name="QUANTITY" /> பெ.பை</translation> <translation id="5266161281976477809">கூடுதல் உள்ளடக்கத்தைக் காட்டும் முக்கோணம்</translation> +<translation id="5278860589123563674">அனுப்ப முடியவில்லை</translation> <translation id="528468243742722775">நிறுத்து</translation> <translation id="5329858601952122676">&நீக்கு</translation> <translation id="5395308026110844773"><ph name="IN_PLACE_APP" />ன் மேல் <ph name="DRAGGED_APP_NAME" />ஐ இழுத்துவிடுகிறீர்கள். கோப்புறையை உருவாக்க, விடுவிக்கவும்.</translation>
diff --git a/ui/views/bubble/bubble_border.cc b/ui/views/bubble/bubble_border.cc index e9e26a7..20cca09e 100644 --- a/ui/views/bubble/bubble_border.cc +++ b/ui/views/bubble/bubble_border.cc
@@ -199,10 +199,6 @@ return gfx::Rect(x, y, size.width(), size.height()); } -int BubbleBorder::GetBorderCornerRadius() const { - return corner_radius_.value_or(0); -} - void BubbleBorder::Paint(const views::View& view, gfx::Canvas* canvas) { if (shadow_ == NO_ASSETS) return PaintNoAssets(view, canvas); @@ -306,8 +302,8 @@ SkRRect BubbleBorder::GetClientRect(const View& view) const { gfx::RectF bounds(view.GetLocalBounds()); bounds.Inset(GetInsets()); - return SkRRect::MakeRectXY(gfx::RectFToSkRect(bounds), - GetBorderCornerRadius(), GetBorderCornerRadius()); + return SkRRect::MakeRectXY(gfx::RectFToSkRect(bounds), corner_radius(), + corner_radius()); } void BubbleBorder::PaintNoAssets(const View& view, gfx::Canvas* canvas) { @@ -326,7 +322,7 @@ flags.setStrokeWidth(kBorderThicknessDip); constexpr SkColor kBorderColor = gfx::kGoogleGrey600; flags.setColor(kBorderColor); - canvas->DrawRoundRect(bounds, GetBorderCornerRadius(), flags); + canvas->DrawRoundRect(bounds, corner_radius(), flags); } void BubbleBackground::Paint(gfx::Canvas* canvas, views::View* view) const { @@ -341,7 +337,7 @@ gfx::RectF bounds(view->GetLocalBounds()); bounds.Inset(gfx::InsetsF(border_->GetInsets())); - canvas->DrawRoundRect(bounds, border_->GetBorderCornerRadius(), flags); + canvas->DrawRoundRect(bounds, border_->corner_radius(), flags); } } // namespace views
diff --git a/ui/views/bubble/bubble_border.h b/ui/views/bubble/bubble_border.h index c9f7d34c..b77e751 100644 --- a/ui/views/bubble/bubble_border.h +++ b/ui/views/bubble/bubble_border.h
@@ -169,8 +169,8 @@ bool use_theme_background_color() { return use_theme_background_color_; } // Sets a desired pixel distance between the arrow tip and the outside edge of - // the neighboring border image. For example: |----offset----| - // '(' represents shadow around the '{' edge: ((({ ^ }))) + // the neighboring border image. For example: |----offset----| + // '(' represents shadow around the '{' edge: ((({ ^ }))) // The arrow will still anchor to the same location but the bubble will shift // location to place the arrow |offset| pixels from the perpendicular edge. void set_arrow_offset(int offset) { arrow_offset_ = offset; } @@ -199,7 +199,7 @@ const gfx::Size& contents_size) const; // Returns the corner radius of the current image set. - int GetBorderCornerRadius() const; + int corner_radius() const { return corner_radius_; } // Overridden from Border: void Paint(const View& view, gfx::Canvas* canvas) override; @@ -247,7 +247,7 @@ int arrow_offset_; // Corner radius for the bubble border. If supplied the border will use // material design. - base::Optional<int> corner_radius_; + int corner_radius_ = 0; Shadow shadow_; // Elevation for the MD shadow.
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.cc b/ui/views/bubble/bubble_dialog_delegate_view.cc index e66def25..34969ad 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view.cc +++ b/ui/views/bubble/bubble_dialog_delegate_view.cc
@@ -274,7 +274,7 @@ // If SetArrow() is called before CreateWidget(), there's no need to update // the BubbleFrameView. if (GetBubbleFrameView()) { - GetBubbleFrameView()->bubble_border()->set_arrow(arrow); + GetBubbleFrameView()->SetArrow(arrow); SizeToContents(); } } @@ -445,7 +445,7 @@ color_ = theme->GetSystemColor(ui::NativeTheme::kColorId_BubbleBackground); BubbleFrameView* frame_view = GetBubbleFrameView(); if (frame_view) - frame_view->bubble_border()->set_background_color(color()); + frame_view->SetBackgroundColor(color()); // When there's an opaque layer, the bubble border background won't show // through, so explicitly paint a background color.
diff --git a/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc b/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc index 761a10c..48ce713 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc +++ b/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
@@ -129,7 +129,7 @@ test::TestWidgetObserver bubble_observer(bubble_widget); bubble_widget->Show(); - BubbleBorder* border = bubble_delegate->GetBubbleFrameView()->bubble_border(); + BubbleBorder* border = bubble_delegate->GetBubbleFrameView()->bubble_border_; EXPECT_EQ(bubble_delegate->color(), border->background_color()); EXPECT_FALSE(bubble_observer.widget_closed());
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc index b1234206..e774feca 100644 --- a/ui/views/bubble/bubble_frame_view.cc +++ b/ui/views/bubble/bubble_frame_view.cc
@@ -160,7 +160,7 @@ DCHECK(GetBoundsForClientView().size() == size); DCHECK(GetWidget()->client_view()->size() == size); - const int radius = bubble_border_->GetBorderCornerRadius(); + const int radius = bubble_border_->corner_radius(); const gfx::Insets insets = GetClientInsetsForFrameWidth(GetContentsBounds().width()); @@ -184,7 +184,7 @@ // Convert to RRectF to accurately represent the rounded corners of the // dialog and allow events to pass through the shadows. gfx::RRectF round_contents_bounds(gfx::RectF(GetContentsBounds()), - bubble_border_->GetBorderCornerRadius()); + bubble_border_->corner_radius()); if (bubble_border_->shadow() != BubbleBorder::NO_ASSETS) round_contents_bounds.Outset(BubbleBorder::kBorderThicknessDip); gfx::RectF rectf_point(point.x(), point.y(), 1, 1); @@ -218,8 +218,7 @@ // Use a window mask roughly matching the border in the image assets. const int kBorderStrokeSize = bubble_border_->shadow() == BubbleBorder::NO_ASSETS ? 0 : 1; - const SkScalar kCornerRadius = - SkIntToScalar(bubble_border_->GetBorderCornerRadius()); + const SkScalar kCornerRadius = SkIntToScalar(bubble_border_->corner_radius()); const gfx::Insets border_insets = bubble_border_->GetInsets(); SkRect rect = { SkIntToScalar(border_insets.left() - kBorderStrokeSize), @@ -440,7 +439,7 @@ bubble_border_ = border.get(); if (footnote_container_) - footnote_container_->SetCornerRadius(border->GetBorderCornerRadius()); + footnote_container_->SetCornerRadius(border->corner_radius()); SetBorder(std::move(border)); @@ -453,12 +452,24 @@ return; DCHECK(!footnote_container_); - int radius = bubble_border_ ? bubble_border_->GetBorderCornerRadius() : 0; + int radius = bubble_border_ ? bubble_border_->corner_radius() : 0; footnote_container_ = new FootnoteContainerView(footnote_margins_, view, radius); AddChildView(footnote_container_); } +void BubbleFrameView::SetCornerRadius(int radius) { + bubble_border_->SetCornerRadius(radius); +} + +void BubbleFrameView::SetArrow(BubbleBorder::Arrow arrow) { + bubble_border_->set_arrow(arrow); +} + +void BubbleFrameView::SetBackgroundColor(SkColor color) { + bubble_border_->set_background_color(color); +} + gfx::Rect BubbleFrameView::GetUpdatedWindowBounds( const gfx::Rect& anchor_rect, const BubbleBorder::Arrow delegate_arrow, @@ -546,7 +557,7 @@ // Check if the bounds don't fit in the available bounds. gfx::Rect window_bounds(bubble_border_->GetBounds(anchor_rect, client_size)); if (GetOverflowLength(available_bounds, window_bounds, vertical) > 0) { - BubbleBorder::Arrow arrow = bubble_border()->arrow(); + BubbleBorder::Arrow arrow = bubble_border_->arrow(); // Mirror the arrow and get the new bounds. bubble_border_->set_arrow( vertical ? BubbleBorder::vertical_mirror(arrow) : @@ -570,7 +581,7 @@ const gfx::Rect& anchor_rect, const gfx::Size& client_size, const gfx::Rect& available_bounds) { - BubbleBorder::Arrow arrow = bubble_border()->arrow(); + BubbleBorder::Arrow arrow = bubble_border_->arrow(); DCHECK(BubbleBorder::is_arrow_at_center(arrow) || preferred_arrow_adjustment_ == PreferredArrowAdjustment::kOffset);
diff --git a/ui/views/bubble/bubble_frame_view.h b/ui/views/bubble/bubble_frame_view.h index 2a1708e..c1370276 100644 --- a/ui/views/bubble/bubble_frame_view.h +++ b/ui/views/bubble/bubble_frame_view.h
@@ -76,8 +76,7 @@ // ButtonListener: void ButtonPressed(Button* sender, const ui::Event& event) override; - // Use bubble_border() and SetBubbleBorder(), not border() and SetBorder(). - BubbleBorder* bubble_border() const { return bubble_border_; } + // Use SetBubbleBorder() not SetBorder(). void SetBubbleBorder(std::unique_ptr<BubbleBorder> border); const View* title() const { @@ -99,6 +98,18 @@ preferred_arrow_adjustment_ = adjustment; } + // Get/set the corner radius of the bubble border. + int corner_radius() const { + return bubble_border_ ? bubble_border_->corner_radius() : 0; + } + void SetCornerRadius(int radius); + + // Set the arrow of the bubble border. + void SetArrow(BubbleBorder::Arrow arrow); + + // Set the background color of the bubble border. + void SetBackgroundColor(SkColor color); + // Given the size of the contents and the rect to point at, returns the bounds // of the bubble window. The bubble's arrow location may change if the bubble // does not fit on the monitor or anchor window (if one exists) and @@ -130,13 +141,15 @@ bool IsCloseButtonVisible() const; gfx::Rect GetCloseButtonMirroredBounds() const; + BubbleBorder* bubble_border_for_testing() const { return bubble_border_; } + private: - FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewTest, GetBoundsForClientView); FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewTest, RemoveFootnoteView); FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewTest, LayoutWithIcon); FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewTest, IgnorePossiblyUnintendedClicks); FRIEND_TEST_ALL_PREFIXES(BubbleDelegateTest, CloseReasons); FRIEND_TEST_ALL_PREFIXES(BubbleDialogDelegateViewTest, CloseMethods); + FRIEND_TEST_ALL_PREFIXES(BubbleDialogDelegateViewTest, CreateDelegate); // Mirrors the bubble's arrow location on the |vertical| or horizontal axis, // if the generated window bounds don't fit in the given available bounds.
diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc index 0a882a2..167f4c92 100644 --- a/ui/views/bubble/bubble_frame_view_unittest.cc +++ b/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -105,6 +105,18 @@ available_anchor_window_bounds_ = bounds; } + BubbleBorder::Arrow GetBorderArrow() const { + return bubble_border_for_testing()->arrow(); + } + + SkColor GetBorderBackgroundColor() const { + return bubble_border_for_testing()->background_color(); + } + + gfx::Insets GetBorderInsets() const { + return bubble_border_for_testing()->GetInsets(); + } + // View overrides: const Widget* GetWidget() const override { return widget_.get(); @@ -137,11 +149,11 @@ TEST_F(BubbleFrameViewTest, GetBoundsForClientView) { TestBubbleFrameView frame(this); - EXPECT_EQ(kArrow, frame.bubble_border()->arrow()); - EXPECT_EQ(kColor, frame.bubble_border()->background_color()); + EXPECT_EQ(kArrow, frame.GetBorderArrow()); + EXPECT_EQ(kColor, frame.GetBorderBackgroundColor()); const gfx::Insets content_margins = frame.content_margins(); - const gfx::Insets insets = frame.GetInsets(); + const gfx::Insets insets = frame.GetBorderInsets(); const gfx::Rect client_view_bounds = frame.GetBoundsForClientView(); EXPECT_EQ(insets.left() + content_margins.left(), client_view_bounds.x()); EXPECT_EQ(insets.top() + content_margins.top(), client_view_bounds.y()); @@ -151,11 +163,11 @@ TestBubbleFrameView frame(this); frame.widget_delegate()->SetShouldShowCloseButton(true); frame.ResetWindowControls(); - EXPECT_EQ(kArrow, frame.bubble_border()->arrow()); - EXPECT_EQ(kColor, frame.bubble_border()->background_color()); + EXPECT_EQ(kArrow, frame.GetBorderArrow()); + EXPECT_EQ(kColor, frame.GetBorderBackgroundColor()); const gfx::Insets content_margins = frame.content_margins(); - const gfx::Insets insets = frame.GetInsets(); + const gfx::Insets insets = frame.GetBorderInsets(); const int close_margin = frame.GetCloseButtonForTest()->height() + LayoutProvider::Get()->GetDistanceMetric(DISTANCE_CLOSE_BUTTON_MARGIN); @@ -201,102 +213,102 @@ std::make_unique<BubbleBorder>(kArrow, BubbleBorder::NO_SHADOW, kColor)); // Test that the info bubble displays normally when it fits. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(100, 100, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 100); EXPECT_EQ(window_bounds.y(), 100); // Test bubble not fitting on left. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_RIGHT); + frame.SetArrow(BubbleBorder::TOP_RIGHT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(100, 100, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_RIGHT, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 100); EXPECT_EQ(window_bounds.y(), 100); // Test bubble not fitting on left or top. - frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_RIGHT); + frame.SetArrow(BubbleBorder::BOTTOM_RIGHT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(100, 100, 0, 0), // |anchor_rect| BubbleBorder::Arrow::BOTTOM_RIGHT, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 100); EXPECT_EQ(window_bounds.y(), 100); // Test bubble not fitting on top. - frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_LEFT); + frame.SetArrow(BubbleBorder::BOTTOM_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(100, 100, 0, 0), // |anchor_rect| BubbleBorder::Arrow::BOTTOM_LEFT, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 100); EXPECT_EQ(window_bounds.y(), 100); // Test bubble not fitting on top and right. - frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_LEFT); + frame.SetArrow(BubbleBorder::BOTTOM_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(900, 100, 0, 0), // |anchor_rect| BubbleBorder::Arrow::BOTTOM_LEFT, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.right(), 900); EXPECT_EQ(window_bounds.y(), 100); // Test bubble not fitting on right. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(900, 100, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.right(), 900); EXPECT_EQ(window_bounds.y(), 100); // Test bubble not fitting on bottom and right. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(900, 900, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::BOTTOM_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::BOTTOM_RIGHT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.right(), 900); EXPECT_EQ(window_bounds.bottom(), 900); // Test bubble not fitting at the bottom. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(100, 900, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::BOTTOM_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::BOTTOM_LEFT, frame.GetBorderArrow()); // The window should be right aligned with the anchor_rect. EXPECT_EQ(window_bounds.x(), 100); EXPECT_EQ(window_bounds.bottom(), 900); // Test bubble not fitting at the bottom and left. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_RIGHT); + frame.SetArrow(BubbleBorder::TOP_RIGHT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(100, 900, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_RIGHT, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::BOTTOM_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::BOTTOM_LEFT, frame.GetBorderArrow()); // The window should be right aligned with the anchor_rect. EXPECT_EQ(window_bounds.x(), 100); EXPECT_EQ(window_bounds.bottom(), 900); @@ -306,53 +318,53 @@ // screen but moving it would make matter worse. TEST_F(BubbleFrameViewTest, GetUpdatedWindowBoundsMirroringFails) { TestBubbleFrameView frame(this); - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); frame.GetUpdatedWindowBounds( gfx::Rect(400, 100, 50, 50), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(500, 700), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); } TEST_F(BubbleFrameViewTest, TestMirroringForCenteredArrow) { TestBubbleFrameView frame(this); // Test bubble not fitting above the anchor. - frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_CENTER); + frame.SetArrow(BubbleBorder::BOTTOM_CENTER); frame.GetUpdatedWindowBounds( gfx::Rect(100, 100, 50, 50), // |anchor_rect| BubbleBorder::Arrow::BOTTOM_CENTER, // |delegate_arrow| gfx::Size(500, 700), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_CENTER, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_CENTER, frame.GetBorderArrow()); // Test bubble not fitting below the anchor. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_CENTER); + frame.SetArrow(BubbleBorder::TOP_CENTER); frame.GetUpdatedWindowBounds( gfx::Rect(300, 800, 50, 50), // |anchor_rect| BubbleBorder::Arrow::TOP_CENTER, // |delegate_arrow| gfx::Size(500, 200), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::BOTTOM_CENTER, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::BOTTOM_CENTER, frame.GetBorderArrow()); // Test bubble not fitting to the right of the anchor. - frame.bubble_border()->set_arrow(BubbleBorder::LEFT_CENTER); + frame.SetArrow(BubbleBorder::LEFT_CENTER); frame.GetUpdatedWindowBounds( gfx::Rect(800, 300, 50, 50), // |anchor_rect| BubbleBorder::Arrow::LEFT_CENTER, // |delegate_arrow| gfx::Size(200, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::RIGHT_CENTER, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::RIGHT_CENTER, frame.GetBorderArrow()); // Test bubble not fitting to the left of the anchor. - frame.bubble_border()->set_arrow(BubbleBorder::RIGHT_CENTER); + frame.SetArrow(BubbleBorder::RIGHT_CENTER); frame.GetUpdatedWindowBounds( gfx::Rect(100, 300, 50, 50), // |anchor_rect| BubbleBorder::Arrow::RIGHT_CENTER, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::LEFT_CENTER, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::LEFT_CENTER, frame.GetBorderArrow()); } // Test that the arrow will not be mirrored when @@ -366,7 +378,7 @@ BubbleBorder::Arrow::TOP_RIGHT, // |delegate_arrow| gfx::Size(500, 500), // |client_size| false); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.GetBorderArrow()); // The coordinates should be pointing to anchor_rect from TOP_RIGHT. EXPECT_EQ(window_bounds.right(), 100); EXPECT_EQ(window_bounds.y(), 900); @@ -386,51 +398,51 @@ // added for MD mode. // Test that the bubble displays normally when it fits. - frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_CENTER); + frame.SetArrow(BubbleBorder::BOTTOM_CENTER); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(500, 900, 50, 50), // |anchor_rect| BubbleBorder::Arrow::BOTTOM_CENTER, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::BOTTOM_CENTER, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::BOTTOM_CENTER, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x() + window_bounds.width() / 2, 525); - frame.bubble_border()->set_arrow(BubbleBorder::LEFT_CENTER); + frame.SetArrow(BubbleBorder::LEFT_CENTER); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(100, 400, 50, 50), // |anchor_rect| BubbleBorder::Arrow::LEFT_CENTER, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::LEFT_CENTER, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::LEFT_CENTER, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.y() + window_bounds.height() / 2, 425); - frame.bubble_border()->set_arrow(BubbleBorder::RIGHT_CENTER); + frame.SetArrow(BubbleBorder::RIGHT_CENTER); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(900, 400, 50, 50), // |anchor_rect| BubbleBorder::Arrow::RIGHT_CENTER, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::RIGHT_CENTER, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::RIGHT_CENTER, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.y() + window_bounds.height() / 2, 425); // Test bubble not fitting left screen edge. - frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_CENTER); + frame.SetArrow(BubbleBorder::BOTTOM_CENTER); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(100, 900, 50, 50), // |anchor_rect| BubbleBorder::Arrow::BOTTOM_CENTER, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::BOTTOM_CENTER, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::BOTTOM_CENTER, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 0); // Test bubble not fitting right screen edge. - frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_CENTER); + frame.SetArrow(BubbleBorder::BOTTOM_CENTER); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(900, 900, 50, 50), // |anchor_rect| BubbleBorder::Arrow::BOTTOM_CENTER, // |delegate_arrow| gfx::Size(500, 500), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::BOTTOM_CENTER, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::BOTTOM_CENTER, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.right(), 1000); } @@ -445,110 +457,110 @@ std::make_unique<BubbleBorder>(kArrow, BubbleBorder::NO_SHADOW, kColor)); // Test that the bubble displays normally when it fits. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(200, 200, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 200); EXPECT_EQ(window_bounds.y(), 200); // Test bubble not fitting on left for anchor window displays left aligned // with the left side of the anchor rect. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_RIGHT); + frame.SetArrow(BubbleBorder::TOP_RIGHT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(200, 200, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_RIGHT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 200); EXPECT_EQ(window_bounds.y(), 200); // Test bubble not fitting on left or top displays left and top aligned // with the left and bottom sides of the anchor rect. - frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_RIGHT); + frame.SetArrow(BubbleBorder::BOTTOM_RIGHT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(200, 200, 0, 0), // |anchor_rect| BubbleBorder::Arrow::BOTTOM_RIGHT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 200); EXPECT_EQ(window_bounds.y(), 200); // Test bubble not fitting on top displays top aligned with the bottom side of // the anchor rect. - frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_LEFT); + frame.SetArrow(BubbleBorder::BOTTOM_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(200, 200, 0, 0), // |anchor_rect| BubbleBorder::Arrow::BOTTOM_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 200); EXPECT_EQ(window_bounds.y(), 200); // Test bubble not fitting on top and right displays right and top aligned // with the right and bottom sides of the anchor rect. - frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_LEFT); + frame.SetArrow(BubbleBorder::BOTTOM_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(500, 200, 0, 0), // |anchor_rect| BubbleBorder::Arrow::BOTTOM_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.right(), 500); EXPECT_EQ(window_bounds.y(), 200); // Test bubble not fitting on right display in line with the right edge of // the anchor rect. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(500, 200, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.right(), 500); EXPECT_EQ(window_bounds.y(), 200); // Test bubble not fitting on bottom and right displays in line with the right // edge of the anchor rect and the bottom in line with the top of the anchor // rect. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(500, 500, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::BOTTOM_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::BOTTOM_RIGHT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.right(), 500); EXPECT_EQ(window_bounds.bottom(), 500); // Test bubble not fitting at the bottom displays line with the top of the // anchor rect. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(200, 500, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::BOTTOM_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::BOTTOM_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 200); EXPECT_EQ(window_bounds.bottom(), 500); // Test bubble not fitting at the bottom and left displays right aligned with // the anchor rect and the bottom in line with the top of the anchor rect. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_RIGHT); + frame.SetArrow(BubbleBorder::TOP_RIGHT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(200, 500, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_RIGHT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::BOTTOM_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::BOTTOM_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 200); EXPECT_EQ(window_bounds.bottom(), 500); } @@ -571,13 +583,13 @@ // | |_________________|__________| // |________________________| frame.SetAvailableAnchorWindowBounds(gfx::Rect(700, 200, 400, 400)); - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(800, 300, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.GetBorderArrow()); // The window should be right aligned with the anchor_rect. EXPECT_EQ(window_bounds.right(), 800); EXPECT_EQ(window_bounds.y(), 300); @@ -592,13 +604,13 @@ // | |_______| | // |____________________________| frame.SetAvailableAnchorWindowBounds(gfx::Rect(700, 700, 400, 400)); - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(800, 800, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::BOTTOM_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::BOTTOM_RIGHT, frame.GetBorderArrow()); // The window should be right aligned with the anchor_rect. EXPECT_EQ(window_bounds.right(), 800); EXPECT_EQ(window_bounds.bottom(), 800); @@ -613,13 +625,13 @@ // | |_______| // |________________________| frame.SetAvailableAnchorWindowBounds(gfx::Rect(700, 200, 400, 400)); - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(800, 500, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::BOTTOM_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::BOTTOM_RIGHT, frame.GetBorderArrow()); // The window should be right aligned with the anchor_rect. EXPECT_EQ(window_bounds.right(), 800); EXPECT_EQ(window_bounds.bottom(), 500); @@ -636,13 +648,13 @@ // Test bubble fitting anchor window and not fitting screen on right. frame.SetAvailableAnchorWindowBounds(gfx::Rect(700, 200, 400, 400)); - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(800, 300, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.GetBorderArrow()); // The window should be right aligned with the anchor_rect. EXPECT_EQ(window_bounds.right(), 800); EXPECT_EQ(window_bounds.y(), 300); @@ -654,7 +666,7 @@ BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); // The window should be right aligned with the anchor_rect. EXPECT_EQ(window_bounds.x(), 700); EXPECT_EQ(window_bounds.y(), 300); @@ -672,47 +684,47 @@ std::make_unique<BubbleBorder>(kArrow, BubbleBorder::NO_SHADOW, kColor)); // Test that the bubble displays normally when it fits. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(200, 200, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 200); // Test bubble not fitting left window edge displayed against left window // edge. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_RIGHT); + frame.SetArrow(BubbleBorder::TOP_RIGHT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(200, 200, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_RIGHT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 100); // Test bubble not fitting right window edge displays against the right edge // of the anchor window. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(500, 200, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.right(), 600); // Test bubble fitting anchor window and not fitting screen on right displays // against the right edge of the screen. frame.SetAvailableAnchorWindowBounds(gfx::Rect(800, 300, 500, 500)); - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(900, 500, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(250, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.right(), 1000); } @@ -731,48 +743,48 @@ // Test that the bubble exiting right side of anchor window displays against // left edge of anchor window bounds if larger than anchor window. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_LEFT); + frame.SetArrow(BubbleBorder::TOP_LEFT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(300, 300, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_LEFT, // |delegate_arrow| gfx::Size(600, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_LEFT, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.x(), 200); // Test that the bubble exiting left side of anchor window displays against // right edge of anchor window bounds if larger than anchor window. - frame.bubble_border()->set_arrow(BubbleBorder::TOP_RIGHT); + frame.SetArrow(BubbleBorder::TOP_RIGHT); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(300, 300, 0, 0), // |anchor_rect| BubbleBorder::Arrow::TOP_RIGHT, // |delegate_arrow| gfx::Size(600, 250), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::TOP_RIGHT, frame.GetBorderArrow()); // Check that the right edge of the bubble equals the right edge of the // anchor window. EXPECT_EQ(window_bounds.right(), 700); // Test that the bubble exiting bottom side of anchor window displays against // top edge of anchor window bounds if larger than anchor window. - frame.bubble_border()->set_arrow(BubbleBorder::LEFT_TOP); + frame.SetArrow(BubbleBorder::LEFT_TOP); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(400, 400, 0, 0), // |anchor_rect| BubbleBorder::Arrow::LEFT_TOP, // |delegate_arrow| gfx::Size(250, 600), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::LEFT_TOP, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::LEFT_TOP, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.y(), 200); // Test that the bubble exiting top side of anchor window displays against // bottom edge of anchor window bounds if larger than anchor window. - frame.bubble_border()->set_arrow(BubbleBorder::LEFT_BOTTOM); + frame.SetArrow(BubbleBorder::LEFT_BOTTOM); window_bounds = frame.GetUpdatedWindowBounds( gfx::Rect(300, 300, 0, 0), // |anchor_rect| BubbleBorder::Arrow::LEFT_BOTTOM, // |delegate_arrow| gfx::Size(250, 600), // |client_size| true); // |adjust_to_fit_available_bounds| - EXPECT_EQ(BubbleBorder::LEFT_BOTTOM, frame.bubble_border()->arrow()); + EXPECT_EQ(BubbleBorder::LEFT_BOTTOM, frame.GetBorderArrow()); EXPECT_EQ(window_bounds.bottom(), 700); } @@ -781,7 +793,7 @@ TestBubbleFrameView frame(this); gfx::Rect preferred_rect(frame.GetPreferredSize()); // Expect that a border has been added to the preferred size. - preferred_rect.Inset(frame.bubble_border()->GetInsets()); + preferred_rect.Inset(frame.GetBorderInsets()); gfx::Size expected_size(kPreferredClientWidth + kExpectedAdditionalWidth, kPreferredClientHeight + kExpectedAdditionalHeight); @@ -815,7 +827,7 @@ TestBubbleFrameView frame(this); gfx::Rect minimum_rect(frame.GetMinimumSize()); // Expect that a border has been added to the minimum size. - minimum_rect.Inset(frame.bubble_border()->GetInsets()); + minimum_rect.Inset(frame.GetBorderInsets()); gfx::Size expected_size(kMinimumClientWidth + kExpectedAdditionalWidth, kMinimumClientHeight + kExpectedAdditionalHeight); @@ -830,7 +842,7 @@ // (unlimited). See http://crbug.com/506206. EXPECT_EQ(gfx::Size(), maximum_rect.size()); #else - maximum_rect.Inset(frame.bubble_border()->GetInsets()); + maximum_rect.Inset(frame.GetBorderInsets()); // Should ignore the contents view's maximum size and use the preferred size. gfx::Size expected_size(kPreferredClientWidth + kExpectedAdditionalWidth,
diff --git a/ui/views/controls/menu/menu_scroll_view_container.cc b/ui/views/controls/menu/menu_scroll_view_container.cc index 50e9b3a..a984f0e 100644 --- a/ui/views/controls/menu/menu_scroll_view_container.cc +++ b/ui/views/controls/menu/menu_scroll_view_container.cc
@@ -189,11 +189,6 @@ return arrow_ != BubbleBorder::NONE; } -void MenuScrollViewContainer::SetBubbleArrowOffset(int offset) { - DCHECK(HasBubbleBorder()); - bubble_border_->set_arrow_offset(offset); -} - MenuItemView* MenuScrollViewContainer::GetFootnote() const { MenuItemView* footnote = content_view_->GetLastItem(); if (!footnote || footnote->GetType() != MenuItemView::HIGHLIGHTED) @@ -346,7 +341,7 @@ scroll_view_->GetContents()->SetBorder(CreateEmptyBorder(insets)); } - corner_radius_ = bubble_border_->GetBorderCornerRadius(); + corner_radius_ = bubble_border_->corner_radius(); SetBorder(std::unique_ptr<Border>(bubble_border_)); SetBackground(std::make_unique<BubbleBackground>(bubble_border_));
diff --git a/ui/views/controls/menu/menu_scroll_view_container.h b/ui/views/controls/menu/menu_scroll_view_container.h index 7c8548b..5552b0d 100644 --- a/ui/views/controls/menu/menu_scroll_view_container.h +++ b/ui/views/controls/menu/menu_scroll_view_container.h
@@ -29,9 +29,6 @@ // External function to check if the bubble border is used. bool HasBubbleBorder() const; - // Offsets the Arrow from the default location. - void SetBubbleArrowOffset(int offset); - void SetFootnoteView(View* view); // View overrides.
diff --git a/ui/webui/resources/cr_elements/cr_action_menu/BUILD.gn b/ui/webui/resources/cr_elements/cr_action_menu/BUILD.gn index 9ff9ceb09..f092b5a 100644 --- a/ui/webui/resources/cr_elements/cr_action_menu/BUILD.gn +++ b/ui/webui/resources/cr_elements/cr_action_menu/BUILD.gn
@@ -14,6 +14,7 @@ deps = [ "//ui/webui/resources/js:assert", "//ui/webui/resources/js:util", + "//ui/webui/resources/js/cr/ui:focus_row", "//ui/webui/resources/js/cr/ui:focus_without_ink", ] externs_list = [ "$externs_path/pending.js" ]
diff --git a/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html b/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html index 8d66c290..0ef9510f 100644 --- a/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html +++ b/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html
@@ -1,6 +1,7 @@ <link rel="import" href="../../html/polymer.html"> <link rel="import" href="../../html/assert.html"> +<link rel="import" href="../../html/cr/ui/focus_row.html"> <link rel="import" href="../../html/cr/ui/focus_without_ink.html"> <link rel="import" href="../../html/util.html"> <link rel="import" href="../shared_vars_css.html">
diff --git a/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js b/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js index 3f6a80f..27b9569 100644 --- a/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js +++ b/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.js
@@ -186,6 +186,15 @@ return this.$.dialog; }, + /** + * @return {!Array<!Element>} + * @private + */ + getOptions_: function() { + return Array.from(this.querySelectorAll('.dropdown-item')) + .map(cr.ui.FocusRow.getFocusableElement); + }, + /** @private */ removeListeners_: function() { window.removeEventListener('resize', this.boundClose_); @@ -247,9 +256,8 @@ let selectNext = e.key == 'ArrowDown'; if (e.key == 'Enter') { // If a menu item has focus, don't change focus or close menu on 'Enter'. - const options = this.querySelectorAll('.dropdown-item'); const focusedIndex = - Array.prototype.indexOf.call(options, getDeepActiveElement()); + this.getOptions_().indexOf(assert(getDeepActiveElement())); if (focusedIndex != -1) { return; } @@ -313,10 +321,9 @@ // hidden/disabled. let counter = 0; let nextOption = null; - const options = this.querySelectorAll('.dropdown-item'); + const options = this.getOptions_(); const numOptions = options.length; - let focusedIndex = - Array.prototype.indexOf.call(options, getDeepActiveElement()); + let focusedIndex = options.indexOf(assert(getDeepActiveElement())); // Handle case where nothing is focused and up is pressed. if (focusedIndex === -1 && step === -1) {
diff --git a/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.js b/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.js index d5d449bd..10b29c1 100644 --- a/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.js +++ b/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.js
@@ -61,6 +61,11 @@ this.$.checkbox.focus(); }, + /** @return {!Element} */ + getFocusableElement: function() { + return this.$.checkbox; + }, + /** @private */ checkedChanged_: function() { this.$.checkbox.setAttribute(
diff --git a/ui/webui/resources/js/cr/ui/focus_row.js b/ui/webui/resources/js/cr/ui/focus_row.js index cf8583c0..6ca61bb 100644 --- a/ui/webui/resources/js/cr/ui/focus_row.js +++ b/ui/webui/resources/js/cr/ui/focus_row.js
@@ -266,7 +266,8 @@ */ onKeydown_(e) { const elements = this.getFocusableElements(); - const currentElement = /** @type {!Element} */ (e.currentTarget); + const currentElement = cr.ui.FocusRow.getFocusableElement( + /** @type {!Element} */ (e.currentTarget)); const elementIndex = elements.indexOf(currentElement); assert(elementIndex >= 0);
diff --git a/ui/webui/resources/js/cr/ui/focus_row_behavior.js b/ui/webui/resources/js/cr/ui/focus_row_behavior.js index 64c5e21..16ffc368 100644 --- a/ui/webui/resources/js/cr/ui/focus_row_behavior.js +++ b/ui/webui/resources/js/cr/ui/focus_row_behavior.js
@@ -26,7 +26,12 @@ * @param {!Event} e */ onFocus(row, e) { - this.listItem_.lastFocused = e.path[0]; + const element = e.path[0]; + const focusableElement = cr.ui.FocusRow.getFocusableElement(element); + if (element != focusableElement) { + focusableElement.focus(); + } + this.listItem_.lastFocused = focusableElement; } /**