diff --git a/DEPS b/DEPS index ac6af6c..938c8ad 100644 --- a/DEPS +++ b/DEPS
@@ -86,7 +86,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '1231663280a834ae37f7240e377524828cb3efa3', + 'v8_revision': '8457e810efd34381448d51d93f50079cf1f6a812', # 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. @@ -224,7 +224,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '6cee78256b6c519ab026582e369676d75fdf6878', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'f31cb3b806c925e898266f5350fd2ab6f7217dd8', 'condition': 'checkout_ios', }, @@ -411,7 +411,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'b272c6655f995248ac6194554493ff1caf36d7dc', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'deb0ebc0777b94225b2619b75d04b3b3e0334972', 'condition': 'checkout_linux', },
diff --git a/WATCHLISTS b/WATCHLISTS index 1a31a0a..1974def 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -126,6 +126,9 @@ 'arc_power': { 'filepath': 'components/arc/power/', }, + 'arc_video_accelerator': { + 'filepath': 'components/arc/video_accelerator', + }, 'ash': { 'filepath': 'ash/', }, @@ -1539,6 +1542,9 @@ 'usb': { 'filepath': '/usb/', }, + 'v4l2': { + 'filepath': 'media/gpu/v4l2', + }, 'vaapi': { 'filepath': 'media/gpu/vaapi', }, @@ -1693,6 +1699,7 @@ 'cernekee@chromium.org', 'snanda@chromium.org'], 'arc_power': ['ejcaruso+watch@chromium.org'], + 'arc_video_accelerator': ['hiroh+watch@chromium.org'], 'ash': ['kalyan.kondapally@intel.com', 'sadrul@chromium.org'], 'assistant': ['croissant-eng+reviews@chromium.org'], @@ -2332,6 +2339,7 @@ 'ui_strings': ['srahim+watch@chromium.org'], 'usb': ['cco3+watch@chromium.org', 'mattreynolds+watch@chromium.org'], + 'v4l2': ['hiroh+watch@chromium.org'], 'vaapi': ['vaapi-reviews@chromium.org'], 'valgrind': ['bruening+watch@chromium.org', 'glider+watch@chromium.org'],
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebResourceRequestAdapter.java b/android_webview/glue/java/src/com/android/webview/chromium/WebResourceRequestAdapter.java index 68490ae..0dba191 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebResourceRequestAdapter.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebResourceRequestAdapter.java
@@ -21,6 +21,10 @@ mRequest = request; } + /* package */ AwWebResourceRequest getAwResourceRequest() { + return mRequest; + } + @Override public Uri getUrl() { return Uri.parse(mRequest.url);
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebkitToSharedGlueConverter.java b/android_webview/glue/java/src/com/android/webview/chromium/WebkitToSharedGlueConverter.java index 07c83361..0f2c761 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebkitToSharedGlueConverter.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebkitToSharedGlueConverter.java
@@ -5,9 +5,11 @@ package com.android.webview.chromium; import android.webkit.ServiceWorkerWebSettings; +import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; +import org.chromium.android_webview.AwContentsClient.AwWebResourceRequest; import org.chromium.android_webview.AwServiceWorkerSettings; import org.chromium.android_webview.AwSettings; @@ -36,4 +38,9 @@ ServiceWorkerSettingsAdapter adapter = (ServiceWorkerSettingsAdapter) settings; return adapter.getAwSettings(); } + + public static AwWebResourceRequest getWebResourceRequest(WebResourceRequest request) { + WebResourceRequestAdapter adapter = (WebResourceRequestAdapter) request; + return adapter.getAwResourceRequest(); + } }
diff --git a/android_webview/java/strings/translations/android_webview_strings_ja.xtb b/android_webview/java/strings/translations/android_webview_strings_ja.xtb index 987e195..86544ab 100644 --- a/android_webview/java/strings/translations/android_webview_strings_ja.xtb +++ b/android_webview/java/strings/translations/android_webview_strings_ja.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ja"> -<translation id="3572484393913897457">システムのWebViewライセンス</translation> +<translation id="3572484393913897457">システムの WebView ライセンス</translation> <translation id="7096034533295549981">動画を読み込み中</translation> <translation id="8916631167640856213">この機能はこのバージョンのAndroidではサポートされていません。</translation> </translationbundle> \ No newline at end of file
diff --git a/android_webview/support_library/BUILD.gn b/android_webview/support_library/BUILD.gn index 4f3a14c..10d2d01 100644 --- a/android_webview/support_library/BUILD.gn +++ b/android_webview/support_library/BUILD.gn
@@ -11,6 +11,7 @@ "java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerClientAdapter.java", "java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerControllerAdapter.java", "java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerSettingsAdapter.java", + "java/src/org/chromium/support_lib_glue/SupportLibWebResourceRequest.java", "java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java", "java/src/org/chromium/support_lib_glue/SupportLibWebViewChromium.java", "java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java",
diff --git a/android_webview/support_library/boundary_interfaces/BUILD.gn b/android_webview/support_library/boundary_interfaces/BUILD.gn index 2f475ab..854014a 100644 --- a/android_webview/support_library/boundary_interfaces/BUILD.gn +++ b/android_webview/support_library/boundary_interfaces/BUILD.gn
@@ -15,6 +15,7 @@ "src/org/chromium/support_lib_boundary/StaticsBoundaryInterface.java", "src/org/chromium/support_lib_boundary/VisualStateCallbackBoundaryInterface.java", "src/org/chromium/support_lib_boundary/WebResourceErrorBoundaryInterface.java", + "src/org/chromium/support_lib_boundary/WebResourceRequestBoundaryInterface.java", "src/org/chromium/support_lib_boundary/WebSettingsBoundaryInterface.java", "src/org/chromium/support_lib_boundary/WebViewClientBoundaryInterface.java", "src/org/chromium/support_lib_boundary/WebViewProviderBoundaryInterface.java",
diff --git a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/WebResourceRequestBoundaryInterface.java b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/WebResourceRequestBoundaryInterface.java new file mode 100644 index 0000000..20d430d --- /dev/null +++ b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/WebResourceRequestBoundaryInterface.java
@@ -0,0 +1,10 @@ +// 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. + +package org.chromium.support_lib_boundary; + +/** + * Boundary interface for WebResourceRequest. + */ +public interface WebResourceRequestBoundaryInterface { public boolean isRedirect(); }
diff --git a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/WebkitToCompatConverterBoundaryInterface.java b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/WebkitToCompatConverterBoundaryInterface.java index 20d1866..12690f2 100644 --- a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/WebkitToCompatConverterBoundaryInterface.java +++ b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/WebkitToCompatConverterBoundaryInterface.java
@@ -4,6 +4,7 @@ package org.chromium.support_lib_boundary; +import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import java.lang.reflect.InvocationHandler; @@ -16,4 +17,6 @@ /* SupportLibraryWebSettings */ InvocationHandler convertSettings(WebSettings webSettings); /* SupportLibServiceWorkerSettings */ InvocationHandler convertServiceWorkerSettings( /* ServiceWorkerWebSettings */ Object serviceWorkerWebSettings); + /* SupportLibraryWebResourceRequest */ InvocationHandler convertWebResourceRequest( + WebResourceRequest request); }
diff --git a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/util/Features.java b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/util/Features.java index 18b14abe..c611d18 100644 --- a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/util/Features.java +++ b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/util/Features.java
@@ -76,4 +76,8 @@ // ServiceWorkerWebSettingsCompat.setBlockNetworkLoads public static final String SERVICE_WORKER_BLOCK_NETWORK_LOADS = "SERVICE_WORKER_BLOCK_NETWORK_LOADS"; + + // WebResourceRequest.isRedirect + public static final String WEB_RESOURCE_REQUEST_IS_REDIRECT = + "WEB_RESOURCE_REQUEST_IS_REDIRECT"; }
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebResourceRequest.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebResourceRequest.java new file mode 100644 index 0000000..f5b0c96 --- /dev/null +++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebResourceRequest.java
@@ -0,0 +1,24 @@ +// 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. + +package org.chromium.support_lib_glue; + +import org.chromium.android_webview.AwContentsClient.AwWebResourceRequest; +import org.chromium.support_lib_boundary.WebResourceRequestBoundaryInterface; + +/** + * Adapter between AwWebResourceRequest and WebResourceRequestBoundaryInterface. + */ +public class SupportLibWebResourceRequest implements WebResourceRequestBoundaryInterface { + private final AwWebResourceRequest mAwRequest; + + SupportLibWebResourceRequest(AwWebResourceRequest request) { + mAwRequest = request; + } + + @Override + public boolean isRedirect() { + return mAwRequest.isRedirect; + } +}
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java index 7e7585b..c684b4c 100644 --- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java +++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java
@@ -48,7 +48,8 @@ Features.RECEIVE_WEB_RESOURCE_ERROR, Features.RECEIVE_HTTP_ERROR, Features.SAFE_BROWSING_HIT, - Features.SHOULD_OVERRIDE_WITH_REDIRECTS + Features.SHOULD_OVERRIDE_WITH_REDIRECTS, + Features.WEB_RESOURCE_REQUEST_IS_REDIRECT }; // clang-format on
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java index 0116e5b..e23a7c9b 100644 --- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java +++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java
@@ -5,6 +5,7 @@ package org.chromium.support_lib_glue; import android.webkit.ServiceWorkerWebSettings; +import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import com.android.webview.chromium.WebkitToSharedGlueConverter; @@ -38,4 +39,12 @@ WebkitToSharedGlueConverter.getServiceWorkerSettings( (ServiceWorkerWebSettings) serviceWorkerWebSettings))); } + + // WebResourceRequestBoundaryInterface + @Override + public InvocationHandler convertWebResourceRequest(WebResourceRequest request) { + return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor( + new SupportLibWebResourceRequest( + WebkitToSharedGlueConverter.getWebResourceRequest(request))); + } }
diff --git a/ash/components/strings/ash_components_strings_es-419.xtb b/ash/components/strings/ash_components_strings_es-419.xtb index c6f0a6f..d729d7d 100644 --- a/ash/components/strings/ash_components_strings_es-419.xtb +++ b/ash/components/strings/ash_components_strings_es-419.xtb
@@ -42,6 +42,7 @@ <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, luego <ph name="TAB" /> o <ph name="RIGHT" /></translation> <translation id="2699509451653686398">Guardar la página web actual en Favoritos</translation> <translation id="2750942583782703988">Volver a cargar la página actual</translation> +<translation id="2764005613199379871">Hacer foco en la barra de direcciones en la búsqueda</translation> <translation id="2789868185375229787">Alejar la página</translation> <translation id="2804480015716812239">Presiona <ph name="ALT" /> y haz clic en un vínculo</translation> <translation id="2830827904629746450">Acoplar una ventana a la derecha</translation> @@ -53,6 +54,7 @@ <translation id="3105917916468784889">Tomar captura de pantalla</translation> <translation id="3126026824346185272">Ctrl</translation> <translation id="3140353188828248647">Enfoque en la barra de direcciones</translation> +<translation id="3256109297135787951">Dejar de destacar un elemento en la biblioteca</translation> <translation id="3288816184963444640">Cerrar la ventana actual</translation> <translation id="3407560819924487926">Mostrar el Administrador de tareas</translation> <translation id="3422679037938588196">Ir a la coincidencia de búsqueda anterior</translation> @@ -67,6 +69,7 @@ <translation id="3720939646656082033">Abrir el vínculo en una pestaña nueva y cambiar a esa pestaña</translation> <translation id="3725795051337497754">Cerrar la pestaña actual</translation> <translation id="3751033133896282964">Deshacer la última acción</translation> +<translation id="3792178297143798024">Abrir el elemento destacado en la biblioteca</translation> <translation id="379295446891231126"><ph name="CTRL" /><ph name="SEPARATOR" /> 1 a 8</translation> <translation id="3837047332182291558">Aumentar el brillo del teclado (solo para teclados retroiluminados)</translation> <translation id="3976863468609830880">Hacer clic en el último ícono de la biblioteca</translation> @@ -153,11 +156,13 @@ <translation id="7787242579016742662">Abrir un archivo en el navegador</translation> <translation id="7822267121073044318">Cambiar al método de entrada del siguiente idioma</translation> <translation id="7917881398263220094">Detener la carga de la página actual</translation> +<translation id="7952165122793773711">Ir a las pestañas 1 a 8</translation> <translation id="8025696740288105292"><ph name="CTRL" /><ph name="SEPARATOR1" /><ph name="SHIFT" /><ph name="SEPARATOR2" /><ph name="PLUS" /> o <ph name="MINUS" /></translation> <translation id="8026334261755873520">Eliminar datos de navegación</translation> <translation id="8104889575691864804">Mostrar menú de apps</translation> <translation id="8130528849632411619">Ir al principio del documento</translation> <translation id="8147954207400281792"><ph name="CTRL" /><ph name="SEPARATOR" /><ph name="K" /> o <ph name="E" /></translation> +<translation id="8232835244134740473">Alternar el foco entre el área de estado (donde se muestra la imagen de tu cuenta), el Selector, la barra de direcciones, la barra de favoritos (si está visible), la página web que se abre y la barra de descargas (si está visible)</translation> <translation id="8234414138295101081">Rotar la pantalla 90 grados</translation> <translation id="8264941229485248811">Mostrar u ocultar el inspector de Herramientas para desarrolladores</translation> <translation id="836869401750819675">Abrir la página de descargas</translation>
diff --git a/ash/components/strings/ash_components_strings_es.xtb b/ash/components/strings/ash_components_strings_es.xtb index ff63dd2..47ca49b7 100644 --- a/ash/components/strings/ash_components_strings_es.xtb +++ b/ash/components/strings/ash_components_strings_es.xtb
@@ -162,7 +162,7 @@ <translation id="8104889575691864804">Mostrar menú de aplicación</translation> <translation id="8130528849632411619">Ir al principio del documento</translation> <translation id="8147954207400281792"><ph name="CTRL" /><ph name="SEPARATOR" /><ph name="K" /> o <ph name="E" /></translation> -<translation id="8232835244134740473">Alternar entre la barra de estado (donde aparece la imagen de la cuenta), el menú de aplicaciones, la barra de direcciones, la barra de marcadores (si está visible), la página web que está abierta y la barra de descargas (si está visible).</translation> +<translation id="8232835244134740473">Alternar el elemento seleccionado entre la barra de estado (donde aparece la imagen de la cuenta), el menú de aplicaciones, la barra de direcciones, la barra de marcadores (si está visible), la página web que está abierta y la barra de descargas (si está visible).</translation> <translation id="8234414138295101081">Girar la pantalla 90 grados</translation> <translation id="8264941229485248811">Mostrar u ocultar el inspector de herramientas para desarrolladores</translation> <translation id="836869401750819675">Abrir la página Descargas</translation>
diff --git a/ash/components/strings/ash_components_strings_ko.xtb b/ash/components/strings/ash_components_strings_ko.xtb index 8509cb05..1b9ead2 100644 --- a/ash/components/strings/ash_components_strings_ko.xtb +++ b/ash/components/strings/ash_components_strings_ko.xtb
@@ -42,6 +42,7 @@ <translation id="2685170433750953446"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />을 누르고 <ph name="TAB" /> 또는 <ph name="RIGHT" /></translation> <translation id="2699509451653686398">현재 웹페이지를 북마크로 저장</translation> <translation id="2750942583782703988">현재 페이지를 새로고침</translation> +<translation id="2764005613199379871">검색주소창에 포커스를 둡니다.</translation> <translation id="2789868185375229787">페이지를 축소</translation> <translation id="2804480015716812239"><ph name="ALT" />를 누른 상태에서 링크를 클릭</translation> <translation id="2830827904629746450">오른쪽에 창 고정</translation> @@ -53,6 +54,7 @@ <translation id="3105917916468784889">스크린샷 찍기</translation> <translation id="3126026824346185272">Ctrl</translation> <translation id="3140353188828248647">주소 표시줄로 이동</translation> +<translation id="3256109297135787951">실행기에 있는 항목에서 강조표시를 삭제합니다.</translation> <translation id="3288816184963444640">현재 창 닫기</translation> <translation id="3407560819924487926">작업 관리자 호출</translation> <translation id="3422679037938588196">검색과 일치하는 이전 항목으로 이동</translation> @@ -67,6 +69,7 @@ <translation id="3720939646656082033">새 탭에서 링크를 열고 새 탭으로 전환</translation> <translation id="3725795051337497754">현재 탭 닫기</translation> <translation id="3751033133896282964">마지막 작업 실행취소</translation> +<translation id="3792178297143798024">실행기에서 강조표시된 항목을 엽니다.</translation> <translation id="379295446891231126"><ph name="CTRL" /><ph name="SEPARATOR" /> 1부터 8</translation> <translation id="3837047332182291558">키보드 밝게(백라이트 키보드만 해당)</translation> <translation id="3976863468609830880">실행기의 마지막 아이콘 클릭</translation> @@ -153,11 +156,13 @@ <translation id="7787242579016742662">브라우저에서 파일 열기</translation> <translation id="7822267121073044318">다음 언어 입력 방법으로 전환</translation> <translation id="7917881398263220094">현재 페이지 로드를 중지</translation> +<translation id="7952165122793773711">1~8번째 탭으로 이동합니다.</translation> <translation id="8025696740288105292"><ph name="CTRL" /><ph name="SEPARATOR1" /><ph name="SHIFT" /><ph name="SEPARATOR2" /><ph name="PLUS" /> 또는 <ph name="MINUS" /></translation> <translation id="8026334261755873520">인터넷 사용 기록 삭제</translation> <translation id="8104889575691864804">앱 메뉴 표시</translation> <translation id="8130528849632411619">문서 처음으로 이동</translation> <translation id="8147954207400281792"><ph name="CTRL" /><ph name="SEPARATOR" /><ph name="K" /> 또는 <ph name="E" /></translation> +<translation id="8232835244134740473">상태 영역(계정 사진이 표시되는 곳), 런처, 검색주소창, 북마크바(표시된 경우), 열려 있는 웹페이지, 다운로드바(표시된 경우) 사이에 포커스를 전환합니다.</translation> <translation id="8234414138295101081">화면 90도 회전</translation> <translation id="8264941229485248811">Developer Tools 검사기 표시 또는 숨기기</translation> <translation id="836869401750819675">다운로드 페이지 열기</translation>
diff --git a/ash/shelf/back_button_unittest.cc b/ash/shelf/back_button_unittest.cc index 84d946e..fa9060a 100644 --- a/ash/shelf/back_button_unittest.cc +++ b/ash/shelf/back_button_unittest.cc
@@ -71,7 +71,7 @@ DISALLOW_COPY_AND_ASSIGN(BackButtonTest); }; -// Verify that the back button is only visible in tablet mode. +// Verify that the back button is visible in tablet mode. TEST_F(BackButtonTest, Visibility) { ASSERT_TRUE(back_button()->layer()); EXPECT_EQ(0.f, back_button()->layer()->opacity()); @@ -85,6 +85,22 @@ EXPECT_EQ(0.f, back_button()->layer()->opacity()); } +// Verify that the back button is visible in tablet mode, if the initial shelf +// alignment is on the left or right. +TEST_F(BackButtonTest, VisibilityWithVerticalShelf) { + test_api()->shelf_view()->shelf()->SetAlignment(SHELF_ALIGNMENT_LEFT); + ASSERT_TRUE(back_button()->layer()); + EXPECT_EQ(0.f, back_button()->layer()->opacity()); + + Shell::Get()->tablet_mode_controller()->EnableTabletModeWindowManager(true); + test_api()->RunMessageLoopUntilAnimationsDone(); + EXPECT_EQ(1.f, back_button()->layer()->opacity()); + + Shell::Get()->tablet_mode_controller()->EnableTabletModeWindowManager(false); + test_api()->RunMessageLoopUntilAnimationsDone(); + EXPECT_EQ(0.f, back_button()->layer()->opacity()); +} + TEST_F(BackButtonTest, BackKeySequenceGenerated) { // Enter tablet mode; the back button is not visible in non tablet mode. Shell::Get()->tablet_mode_controller()->EnableTabletModeWindowManager(true);
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc index 1365309..b56929ac 100644 --- a/ash/shelf/shelf_view.cc +++ b/ash/shelf/shelf_view.cc
@@ -327,11 +327,7 @@ overflow_button_->set_context_menu_controller(this); ConfigureChildView(overflow_button_); AddChildView(overflow_button_); - - GetBackButton()->layer()->SetOpacity(IsTabletModeEnabled() ? 1.f : 0.f); - GetBackButton()->SetFocusBehavior( - IsTabletModeEnabled() ? FocusBehavior::ALWAYS : FocusBehavior::NEVER); - + UpdateBackButton(); // We'll layout when our bounds change. } @@ -821,6 +817,7 @@ CalculateIdealBounds(&overflow_bounds); views::ViewModelUtils::SetViewBoundsToIdealBounds(*view_model_); overflow_button_->SetBoundsRect(overflow_bounds); + UpdateBackButton(); } void ShelfView::UpdateShelfItemBackground(SkColor color) { @@ -2082,9 +2079,7 @@ } } - GetBackButton()->layer()->SetOpacity(IsTabletModeEnabled() ? 1.f : 0.f); - GetBackButton()->SetFocusBehavior( - IsTabletModeEnabled() ? FocusBehavior::ALWAYS : FocusBehavior::NEVER); + UpdateBackButton(); } bool ShelfView::IsRepostEvent(const ui::Event& event) { @@ -2137,4 +2132,10 @@ return true; } +void ShelfView::UpdateBackButton() { + GetBackButton()->layer()->SetOpacity(IsTabletModeEnabled() ? 1.f : 0.f); + GetBackButton()->SetFocusBehavior( + IsTabletModeEnabled() ? FocusBehavior::ALWAYS : FocusBehavior::NEVER); +} + } // namespace ash
diff --git a/ash/shelf/shelf_view.h b/ash/shelf/shelf_view.h index 9c35f24..d6d8216 100644 --- a/ash/shelf/shelf_view.h +++ b/ash/shelf/shelf_view.h
@@ -400,6 +400,9 @@ bool CanPrepareForDrag(Pointer pointer, const ui::LocatedEvent& event); + // Updates the back button opacity and focus behavior based on tablet mode. + void UpdateBackButton(); + // The model; owned by Launcher. ShelfModel* model_;
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index 086e6ff4..c2d3517 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -32,6 +32,7 @@ <translation id="1658406695958299976">Todavía no se pudo verificar tu contraseña. Ten en cuenta que, si cambiaste tu contraseña recientemente, podrás usar la nueva cuando salgas. Aquí deberás usar la contraseña anterior.</translation> <translation id="1677472565718498478">Tiempo restante <ph name="TIME" /></translation> <translation id="1698760176351776263">Dirección IPv6: <ph name="ADDRESS" /></translation> +<translation id="170389796989115980">Es posible que el administrador del dispositivo controle tu actividad.</translation> <translation id="1734367976349034509">Este dispositivo está administrado por una empresa</translation> <translation id="1746730358044914197">Tu administrador configura los métodos de entrada.</translation> <translation id="1747827819627189109">Teclado en pantalla habilitado</translation> @@ -46,6 +47,7 @@ <translation id="1942830294380034169">Botón de superposición</translation> <translation id="1951012854035635156">Asistente</translation> <translation id="1957803754585243749">0°</translation> +<translation id="1957958912175573503">Establecer el idioma</translation> <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation> <translation id="1995660704900986789">Apagar</translation> <translation id="2012624427112548395">Ctrl+Buscar+H</translation> @@ -81,6 +83,8 @@ <translation id="2653659639078652383">Enviar</translation> <translation id="2675319268637823299">Un administrador inhabilitó el acceso múltiple para <ph name="USER_EMAIL" />. Todos los usuarios deben salir de sus cuentas para continuar.</translation> +<translation id="2696763960464195425">Se borrará tu información cuando salgas de la cuenta. <ph name="LEARN_MORE" /></translation> +<translation id="2700493154570097719">Establecer el teclado</translation> <translation id="2718395828230677721">Luz nocturna</translation> <translation id="2727977024730340865">Conexión a un cargador de baja potencia. Es posible que la carga de la batería no sea confiable.</translation> <translation id="2761704814324807722">Bandeja de estado, hora <ph name="TIME" />, <ph name="BATTERY" /></translation> @@ -330,6 +334,7 @@ <translation id="8673028979667498656">270°</translation> <translation id="8676770494376880701">Cargador de baja potencia conectado</translation> <translation id="8734991477317290293">Es posible que alguien esté intentando determinar qué teclas presionaste</translation> +<translation id="8809737090443522491">Escribe el nombre de la app o el documento</translation> <translation id="8814190375133053267">Wi-Fi</translation> <translation id="8814715559352963456">Si mueves las ventanas a otro escritorio, puede producirse un comportamiento inesperado.
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index 6da2e87..1fd5d19 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -32,6 +32,7 @@ <translation id="1658406695958299976">비밀번호를 여전히 확인할 수 없습니다. 참고: 최근에 비밀번호를 변경한 경우 로그아웃해야 새로운 비밀번호가 적용됩니다. 이전 비밀번호를 사용해 보세요.</translation> <translation id="1677472565718498478"><ph name="TIME" /> 남음</translation> <translation id="1698760176351776263">IPv6 주소: <ph name="ADDRESS" /></translation> +<translation id="170389796989115980">기기 관리자가 내 활동을 모니터링할 수도 있습니다.</translation> <translation id="1734367976349034509">기업에서 관리하는 기기입니다.</translation> <translation id="1746730358044914197">입력 방법은 관리자가 설정합니다.</translation> <translation id="1747827819627189109">터치 키보드 사용 설정됨</translation> @@ -46,6 +47,7 @@ <translation id="1942830294380034169">오버플로 버튼</translation> <translation id="1951012854035635156">어시스턴트</translation> <translation id="1957803754585243749">0°</translation> +<translation id="1957958912175573503">언어 설정</translation> <translation id="1969011864782743497"><ph name="DEVICE_NAME" />(USB)</translation> <translation id="1995660704900986789">끄기</translation> <translation id="2012624427112548395">Ctrl+Search+H</translation> @@ -81,6 +83,8 @@ <translation id="2653659639078652383">제출</translation> <translation id="2675319268637823299">관리자가 <ph name="USER_EMAIL" />의 멀티 로그인을 허용하지 않았습니다. 계속하려면 모든 사용자가 로그아웃해야 합니다.</translation> +<translation id="2696763960464195425">로그아웃하면 사용자 정보가 삭제됩니다. <ph name="LEARN_MORE" /></translation> +<translation id="2700493154570097719">키보드 설정</translation> <translation id="2718395828230677721">야간 조명</translation> <translation id="2727977024730340865">저출력 충전기에 연결되었습니다. 배터리 충전 상태가 불안정합니다.</translation> <translation id="2761704814324807722">상태 표시줄, 시간 <ph name="TIME" />, <ph name="BATTERY" /></translation> @@ -330,6 +334,7 @@ <translation id="8673028979667498656">270°</translation> <translation id="8676770494376880701">저출력 충전기 연결됨</translation> <translation id="8734991477317290293">키 입력 내용을 도용하려는 시도일 수 있습니다.</translation> +<translation id="8809737090443522491">앱 또는 문서 이름 입력</translation> <translation id="8814190375133053267">Wi-Fi</translation> <translation id="8814715559352963456">창을 다른 데스크톱으로 이동하면 예기치 못한 동작이 나타날 수 있습니다.
diff --git a/base/android/callback_android.cc b/base/android/callback_android.cc index dbf1432..d0f8e9ce 100644 --- a/base/android/callback_android.cc +++ b/base/android/callback_android.cc
@@ -5,6 +5,7 @@ #include "base/android/callback_android.h" #include "base/android/jni_array.h" +#include "base/android/jni_string.h" #include "base/android/scoped_java_ref.h" #include "jni/Callback_jni.h" @@ -13,25 +14,29 @@ void RunCallbackAndroid(const JavaRef<jobject>& callback, const JavaRef<jobject>& arg) { - Java_Helper_onObjectResultFromNative(base::android::AttachCurrentThread(), - callback, arg); + Java_Helper_onObjectResultFromNative(AttachCurrentThread(), callback, arg); } void RunCallbackAndroid(const JavaRef<jobject>& callback, bool arg) { - Java_Helper_onBooleanResultFromNative(base::android::AttachCurrentThread(), - callback, static_cast<jboolean>(arg)); + Java_Helper_onBooleanResultFromNative(AttachCurrentThread(), callback, + static_cast<jboolean>(arg)); } void RunCallbackAndroid(const JavaRef<jobject>& callback, int arg) { - Java_Helper_onIntResultFromNative(base::android::AttachCurrentThread(), - callback, arg); + Java_Helper_onIntResultFromNative(AttachCurrentThread(), callback, arg); +} + +void RunStringCallbackAndroid(const JavaRef<jobject>& callback, + const std::string& arg) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef<jstring> java_string = ConvertUTF8ToJavaString(env, arg); + Java_Helper_onObjectResultFromNative(env, callback, java_string); } void RunCallbackAndroid(const JavaRef<jobject>& callback, const std::vector<uint8_t>& arg) { - JNIEnv* env = base::android::AttachCurrentThread(); - base::android::ScopedJavaLocalRef<jbyteArray> j_bytes = - base::android::ToJavaByteArray(env, arg); + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef<jbyteArray> j_bytes = ToJavaByteArray(env, arg); Java_Helper_onObjectResultFromNative(env, callback, j_bytes); }
diff --git a/base/android/callback_android.h b/base/android/callback_android.h index 5cefe0f..c4d1b33 100644 --- a/base/android/callback_android.h +++ b/base/android/callback_android.h
@@ -24,6 +24,9 @@ void BASE_EXPORT RunCallbackAndroid(const JavaRef<jobject>& callback, int arg); +void BASE_EXPORT RunStringCallbackAndroid(const JavaRef<jobject>& callback, + const std::string& arg); + void BASE_EXPORT RunCallbackAndroid(const JavaRef<jobject>& callback, const std::vector<uint8_t>& arg);
diff --git a/base/containers/span.h b/base/containers/span.h index c9f55d2..3ae12470 100644 --- a/base/containers/span.h +++ b/base/containers/span.h
@@ -272,34 +272,34 @@ // [span.comparison], span comparison operators // Relational operators. Equality is a element-wise comparison. -template <typename T> -constexpr bool operator==(span<T> lhs, span<T> rhs) noexcept { +template <typename T, typename U> +constexpr bool operator==(span<T> lhs, span<U> rhs) noexcept { return std::equal(lhs.cbegin(), lhs.cend(), rhs.cbegin(), rhs.cend()); } -template <typename T> -constexpr bool operator!=(span<T> lhs, span<T> rhs) noexcept { +template <typename T, typename U> +constexpr bool operator!=(span<T> lhs, span<U> rhs) noexcept { return !(lhs == rhs); } -template <typename T> -constexpr bool operator<(span<T> lhs, span<T> rhs) noexcept { +template <typename T, typename U> +constexpr bool operator<(span<T> lhs, span<U> rhs) noexcept { return std::lexicographical_compare(lhs.cbegin(), lhs.cend(), rhs.cbegin(), rhs.cend()); } -template <typename T> -constexpr bool operator<=(span<T> lhs, span<T> rhs) noexcept { +template <typename T, typename U> +constexpr bool operator<=(span<T> lhs, span<U> rhs) noexcept { return !(rhs < lhs); } -template <typename T> -constexpr bool operator>(span<T> lhs, span<T> rhs) noexcept { +template <typename T, typename U> +constexpr bool operator>(span<T> lhs, span<U> rhs) noexcept { return rhs < lhs; } -template <typename T> -constexpr bool operator>=(span<T> lhs, span<T> rhs) noexcept { +template <typename T, typename U> +constexpr bool operator>=(span<T> lhs, span<U> rhs) noexcept { return !(lhs < rhs); }
diff --git a/base/containers/span_unittest.cc b/base/containers/span_unittest.cc index c5ddc60..2620f103 100644 --- a/base/containers/span_unittest.cc +++ b/base/containers/span_unittest.cc
@@ -367,6 +367,11 @@ constexpr span<const int> span3(kArray3); EXPECT_FALSE(span1 == span3); + + static double kArray4[] = {2.0, 7.0, 1.0, 8.0, 3.0}; + span<double> span4(kArray4); + + EXPECT_EQ(span3, span4); } TEST(SpanTest, Inequality) { @@ -381,6 +386,11 @@ constexpr span<const int> span3(kArray3); EXPECT_FALSE(span1 != span3); + + static double kArray4[] = {1.0, 4.0, 6.0, 8.0, 9.0}; + span<double> span4(kArray4); + + EXPECT_NE(span3, span4); } TEST(SpanTest, LessThan) { @@ -395,6 +405,11 @@ constexpr span<const int> span3(kArray3); EXPECT_FALSE(span1 < span3); + + static double kArray4[] = {2.0, 3.0, 5.0, 7.0, 11.0, 13.0}; + span<double> span4(kArray4); + + EXPECT_LT(span3, span4); } TEST(SpanTest, LessEqual) { @@ -410,6 +425,11 @@ constexpr span<const int> span3(kArray3); EXPECT_FALSE(span1 <= span3); + + static double kArray4[] = {2.0, 3.0, 5.0, 7.0, 11.0, 13.0}; + span<double> span4(kArray4); + + EXPECT_LE(span3, span4); } TEST(SpanTest, GreaterThan) { @@ -424,6 +444,11 @@ constexpr span<const int> span3(kArray3); EXPECT_FALSE(span1 > span3); + + static double kArray4[] = {2.0, 3.0, 5.0, 7.0, 11.0}; + span<double> span4(kArray4); + + EXPECT_GT(span3, span4); } TEST(SpanTest, GreaterEqual) { @@ -439,6 +464,11 @@ constexpr span<const int> span3(kArray3); EXPECT_FALSE(span1 >= span3); + + static double kArray4[] = {2.0, 3.0, 5.0, 7.0, 11.0}; + span<double> span4(kArray4); + + EXPECT_GE(span3, span4); } TEST(SpanTest, AsBytes) {
diff --git a/base/optional.h b/base/optional.h index 1192940..c1d11ca 100644 --- a/base/optional.h +++ b/base/optional.h
@@ -574,39 +574,57 @@ return *this; } - constexpr const T* operator->() const { return &value(); } + constexpr const T* operator->() const { + CHECK(storage_.is_populated_); + return &storage_.value_; + } - constexpr T* operator->() { return &value(); } + constexpr T* operator->() { + CHECK(storage_.is_populated_); + return &storage_.value_; + } - constexpr const T& operator*() const& { return value(); } + constexpr const T& operator*() const & { + CHECK(storage_.is_populated_); + return storage_.value_; + } - constexpr T& operator*() & { return value(); } + constexpr T& operator*() & { + CHECK(storage_.is_populated_); + return storage_.value_; + } - constexpr const T&& operator*() const&& { return std::move(value()); } + constexpr const T&& operator*() const && { + CHECK(storage_.is_populated_); + return std::move(storage_.value_); + } - constexpr T&& operator*() && { return std::move(value()); } + constexpr T&& operator*() && { + CHECK(storage_.is_populated_); + return std::move(storage_.value_); + } constexpr explicit operator bool() const { return storage_.is_populated_; } constexpr bool has_value() const { return storage_.is_populated_; } constexpr T& value() & { - DCHECK(storage_.is_populated_); + CHECK(storage_.is_populated_); return storage_.value_; } constexpr const T& value() const & { - DCHECK(storage_.is_populated_); + CHECK(storage_.is_populated_); return storage_.value_; } constexpr T&& value() && { - DCHECK(storage_.is_populated_); + CHECK(storage_.is_populated_); return std::move(storage_.value_); } constexpr const T&& value() const && { - DCHECK(storage_.is_populated_); + CHECK(storage_.is_populated_); return std::move(storage_.value_); }
diff --git a/base/posix/unix_domain_socket.cc b/base/posix/unix_domain_socket.cc index 578a53c..7c087a5 100644 --- a/base/posix/unix_domain_socket.cc +++ b/base/posix/unix_domain_socket.cc
@@ -189,6 +189,11 @@ } if (msg.msg_flags & MSG_TRUNC || msg.msg_flags & MSG_CTRUNC) { + if (msg.msg_flags & MSG_CTRUNC) { + // Extraordinary case, not caller fixable. Log something. + LOG(ERROR) << "recvmsg returned MSG_CTRUNC flag, buffer len is " + << msg.msg_controllen; + } for (unsigned i = 0; i < wire_fds_len; ++i) close(wire_fds[i]); errno = EMSGSIZE;
diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc b/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc index fd6dc774..dff554f 100644 --- a/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc +++ b/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc
@@ -386,6 +386,10 @@ arraysize(shared_scheduler_workers_), "The size of |shared_com_scheduler_workers_| must match " "|shared_scheduler_workers_|"); + static_assert(arraysize(shared_com_scheduler_workers_[0]) == + arraysize(shared_scheduler_workers_[0]), + "The size of |shared_com_scheduler_workers_| must match " + "|shared_scheduler_workers_|"); #endif // defined(OS_WIN) DCHECK(!g_manager_is_alive); g_manager_is_alive = true; @@ -431,6 +435,15 @@ } #endif // defined(OS_WIN) +// static +SchedulerSingleThreadTaskRunnerManager::ContinueOnShutdown +SchedulerSingleThreadTaskRunnerManager::TraitsToContinueOnShutdown( + const TaskTraits& traits) { + if (traits.shutdown_behavior() == TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) + return IS_CONTINUE_ON_SHUTDOWN; + return IS_NOT_CONTINUE_ON_SHUTDOWN; +} + template <typename DelegateType> scoped_refptr< SchedulerSingleThreadTaskRunnerManager::SchedulerSingleThreadTaskRunner> @@ -541,7 +554,8 @@ SchedulerWorker*& SchedulerSingleThreadTaskRunnerManager::GetSharedSchedulerWorkerForTraits< SchedulerWorkerDelegate>(const TaskTraits& traits) { - return shared_scheduler_workers_[GetEnvironmentIndexForTraits(traits)]; + return shared_scheduler_workers_[GetEnvironmentIndexForTraits(traits)] + [TraitsToContinueOnShutdown(traits)]; } #if defined(OS_WIN) @@ -549,7 +563,8 @@ SchedulerWorker*& SchedulerSingleThreadTaskRunnerManager::GetSharedSchedulerWorkerForTraits< SchedulerWorkerCOMDelegate>(const TaskTraits& traits) { - return shared_com_scheduler_workers_[GetEnvironmentIndexForTraits(traits)]; + return shared_com_scheduler_workers_[GetEnvironmentIndexForTraits(traits)] + [TraitsToContinueOnShutdown(traits)]; } #endif // defined(OS_WIN) @@ -585,23 +600,28 @@ { AutoSchedulerLock auto_lock(lock_); for (size_t i = 0; i < arraysize(shared_scheduler_workers_); ++i) { - local_shared_scheduler_workers[i] = shared_scheduler_workers_[i]; - shared_scheduler_workers_[i] = nullptr; + for (size_t j = 0; j < arraysize(shared_scheduler_workers_[i]); ++j) { + local_shared_scheduler_workers[i][j] = shared_scheduler_workers_[i][j]; + shared_scheduler_workers_[i][j] = nullptr; #if defined(OS_WIN) - local_shared_com_scheduler_workers[i] = shared_com_scheduler_workers_[i]; - shared_com_scheduler_workers_[i] = nullptr; + local_shared_com_scheduler_workers[i][j] = + shared_com_scheduler_workers_[i][j]; + shared_com_scheduler_workers_[i][j] = nullptr; #endif } + } } for (size_t i = 0; i < arraysize(local_shared_scheduler_workers); ++i) { - if (local_shared_scheduler_workers[i]) - UnregisterSchedulerWorker(local_shared_scheduler_workers[i]); + for (size_t j = 0; j < arraysize(local_shared_scheduler_workers[i]); ++j) { + if (local_shared_scheduler_workers[i][j]) + UnregisterSchedulerWorker(local_shared_scheduler_workers[i][j]); #if defined(OS_WIN) - if (local_shared_com_scheduler_workers[i]) - UnregisterSchedulerWorker(local_shared_com_scheduler_workers[i]); + if (local_shared_com_scheduler_workers[i][j]) + UnregisterSchedulerWorker(local_shared_com_scheduler_workers[i][j]); #endif } + } } } // namespace internal
diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager.h b/base/task_scheduler/scheduler_single_thread_task_runner_manager.h index 1153a7b0..610b24f 100644 --- a/base/task_scheduler/scheduler_single_thread_task_runner_manager.h +++ b/base/task_scheduler/scheduler_single_thread_task_runner_manager.h
@@ -80,6 +80,15 @@ private: class SchedulerSingleThreadTaskRunner; + enum ContinueOnShutdown { + IS_CONTINUE_ON_SHUTDOWN, + IS_NOT_CONTINUE_ON_SHUTDOWN, + CONTINUE_ON_SHUTDOWN_COUNT, + }; + + static ContinueOnShutdown TraitsToContinueOnShutdown( + const TaskTraits& traits); + template <typename DelegateType> scoped_refptr<SchedulerSingleThreadTaskRunner> CreateTaskRunnerWithTraitsImpl( const TaskTraits& traits, @@ -110,10 +119,17 @@ std::vector<scoped_refptr<SchedulerWorker>> workers_; int next_worker_id_ = 0; - SchedulerWorker* shared_scheduler_workers_[ENVIRONMENT_COUNT] = {}; - + // Workers for SingleThreadTaskRunnerThreadMode::SHARED tasks. It is + // important to have separate threads for CONTINUE_ON_SHUTDOWN and non- + // CONTINUE_ON_SHUTDOWN to avoid being in a situation where a + // CONTINUE_ON_SHUTDOWN task effectively blocks shutdown by preventing a + // BLOCK_SHUTDOWN task to be scheduled. https://crbug.com/829786 + SchedulerWorker* shared_scheduler_workers_[ENVIRONMENT_COUNT] + [CONTINUE_ON_SHUTDOWN_COUNT] = {}; #if defined(OS_WIN) - SchedulerWorker* shared_com_scheduler_workers_[ENVIRONMENT_COUNT] = {}; + SchedulerWorker* shared_com_scheduler_workers_[ENVIRONMENT_COUNT] + [CONTINUE_ON_SHUTDOWN_COUNT] = + {}; #endif // defined(OS_WIN) // Set to true when Start() is called.
diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc b/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc index add274e..bd7c134 100644 --- a/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc +++ b/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
@@ -20,6 +20,7 @@ #include "base/threading/platform_thread.h" #include "base/threading/simple_thread.h" #include "base/threading/thread.h" +#include "base/threading/thread_restrictions.h" #include "testing/gtest/include/gtest/gtest.h" #if defined(OS_WIN) @@ -194,6 +195,51 @@ }); } +// Regression test for https://crbug.com/829786 +TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, + ContinueOnShutdownDoesNotBlockBlockShutdown) { + WaitableEvent task_has_started(WaitableEvent::ResetPolicy::MANUAL, + WaitableEvent::InitialState::NOT_SIGNALED); + WaitableEvent task_can_continue(WaitableEvent::ResetPolicy::MANUAL, + WaitableEvent::InitialState::NOT_SIGNALED); + + // Post a CONTINUE_ON_SHUTDOWN task that waits on + // |task_can_continue| to a shared SingleThreadTaskRunner. + single_thread_task_runner_manager_ + ->CreateSingleThreadTaskRunnerWithTraits( + {TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, + SingleThreadTaskRunnerThreadMode::SHARED) + ->PostTask(FROM_HERE, base::BindOnce( + [](WaitableEvent* task_has_started, + WaitableEvent* task_can_continue) { + task_has_started->Signal(); + ScopedAllowBaseSyncPrimitivesForTesting + allow_base_sync_primitives; + task_can_continue->Wait(); + }, + Unretained(&task_has_started), + Unretained(&task_can_continue))); + + task_has_started.Wait(); + + // Post a BLOCK_SHUTDOWN task to a shared SingleThreadTaskRunner. + single_thread_task_runner_manager_ + ->CreateSingleThreadTaskRunnerWithTraits( + {TaskShutdownBehavior::BLOCK_SHUTDOWN}, + SingleThreadTaskRunnerThreadMode::SHARED) + ->PostTask(FROM_HERE, DoNothing()); + + // Shutdown should not hang even though the first task hasn't finished. + task_tracker_.Shutdown(); + + // Let the first task finish. + task_can_continue.Signal(); + + // Tear down from the test body to prevent accesses to |task_can_continue| + // after it goes out of scope. + TearDownSingleThreadTaskRunnerManager(); +} + namespace { class TaskSchedulerSingleThreadTaskRunnerManagerCommonTest
diff --git a/base/threading/post_task_and_reply_impl.cc b/base/threading/post_task_and_reply_impl.cc index 4eba45a..5aacdad 100644 --- a/base/threading/post_task_and_reply_impl.cc +++ b/base/threading/post_task_and_reply_impl.cc
@@ -10,7 +10,6 @@ #include "base/debug/leak_annotations.h" #include "base/logging.h" #include "base/memory/ref_counted.h" -#include "base/sequence_checker.h" #include "base/sequenced_task_runner.h" #include "base/threading/sequenced_task_runner_handle.h" @@ -18,56 +17,93 @@ namespace { -// This relay class remembers the sequence that it was created on, and ensures -// that both the |task| and |reply| Closures are deleted on this same sequence. -// Also, |task| is guaranteed to be deleted before |reply| is run or deleted. -// -// If RunReplyAndSelfDestruct() doesn't run because the originating execution -// context is no longer available, then the |task| and |reply| Closures are -// leaked. Leaking is considered preferable to having a thread-safetey -// violations caused by invoking the Closure destructor on the wrong sequence. class PostTaskAndReplyRelay { public: PostTaskAndReplyRelay(const Location& from_here, OnceClosure task, OnceClosure reply) - : sequence_checker_(), - from_here_(from_here), - origin_task_runner_(SequencedTaskRunnerHandle::Get()), - reply_(std::move(reply)), - task_(std::move(task)) {} + : from_here_(from_here), + task_(std::move(task)), + reply_(std::move(reply)) {} + PostTaskAndReplyRelay(PostTaskAndReplyRelay&&) = default; ~PostTaskAndReplyRelay() { - DCHECK(sequence_checker_.CalledOnValidSequence()); + if (reply_) { + // This can run: + // 1) On origin sequence, when: + // 1a) Posting |task_| fails. + // 1b) |reply_| is cancelled before running. + // 1c) The DeleteSoon() below is scheduled. + // 2) On destination sequence, when: + // 2a) |task_| is cancelled before running. + // 2b) Posting |reply_| fails. + + if (!reply_task_runner_->RunsTasksInCurrentSequence()) { + // Case 2a) or 2b). + // + // Destroy callbacks asynchronously on |reply_task_runner| since their + // destructors can rightfully be affine to it. As always, DeleteSoon() + // might leak its argument if the target execution environment is + // shutdown (e.g. MessageLoop deleted, TaskScheduler shutdown). + // + // Note: while it's obvious why |reply_| can be affine to + // |reply_task_runner|, the reason that |task_| can also be affine to it + // is that it if neither tasks ran, |task_| may still hold an object + // which was intended to be moved to |reply_| when |task_| ran (such an + // object's destruction can be affine to |reply_task_runner_| -- e.g. + // https://crbug.com/829122). + auto relay_to_delete = + std::make_unique<PostTaskAndReplyRelay>(std::move(*this)); + ANNOTATE_LEAKING_OBJECT_PTR(relay_to_delete.get()); + reply_task_runner_->DeleteSoon(from_here_, std::move(relay_to_delete)); + } + + // Case 1a), 1b), 1c). + // + // Callbacks will be destroyed synchronously at the end of this scope. + } else { + // This can run when both callbacks have run or have been moved to another + // PostTaskAndReplyRelay instance. If |reply_| is null, |task_| must be + // null too. + DCHECK(!task_); + } } - void RunTaskAndPostReply() { - std::move(task_).Run(); - origin_task_runner_->PostTask( - from_here_, BindOnce(&PostTaskAndReplyRelay::RunReplyAndSelfDestruct, - base::Unretained(this))); + // No assignment operator because of const members. + PostTaskAndReplyRelay& operator=(PostTaskAndReplyRelay&&) = delete; + + // Static function is used because it is not possible to bind a method call to + // a non-pointer type. + static void RunTaskAndPostReply(PostTaskAndReplyRelay relay) { + DCHECK(relay.task_); + std::move(relay.task_).Run(); + + // Keep a reference to the reply TaskRunner for the PostTask() call before + // |relay| is moved into a callback. + scoped_refptr<SequencedTaskRunner> reply_task_runner = + relay.reply_task_runner_; + + reply_task_runner->PostTask( + relay.from_here_, + BindOnce(&PostTaskAndReplyRelay::RunReply, std::move(relay))); } private: - void RunReplyAndSelfDestruct() { - DCHECK(sequence_checker_.CalledOnValidSequence()); - - // Ensure |task_| has already been released before |reply_| to ensure that - // no one accidentally depends on |task_| keeping one of its arguments alive - // while |reply_| is executing. - DCHECK(!task_); - - std::move(reply_).Run(); - - // Cue mission impossible theme. - delete this; + // Static function is used because it is not possible to bind a method call to + // a non-pointer type. + static void RunReply(PostTaskAndReplyRelay relay) { + DCHECK(!relay.task_); + DCHECK(relay.reply_); + std::move(relay.reply_).Run(); } - const SequenceChecker sequence_checker_; const Location from_here_; - const scoped_refptr<SequencedTaskRunner> origin_task_runner_; - OnceClosure reply_; OnceClosure task_; + OnceClosure reply_; + const scoped_refptr<SequencedTaskRunner> reply_task_runner_ = + SequencedTaskRunnerHandle::Get(); + + DISALLOW_COPY_AND_ASSIGN(PostTaskAndReplyRelay); }; } // namespace @@ -77,23 +113,13 @@ bool PostTaskAndReplyImpl::PostTaskAndReply(const Location& from_here, OnceClosure task, OnceClosure reply) { - DCHECK(!task.is_null()) << from_here.ToString(); - DCHECK(!reply.is_null()) << from_here.ToString(); - PostTaskAndReplyRelay* relay = - new PostTaskAndReplyRelay(from_here, std::move(task), std::move(reply)); - // PostTaskAndReplyRelay self-destructs after executing |reply|. On the flip - // side though, it is intentionally leaked if the |task| doesn't complete - // before the origin sequence stops executing tasks. Annotate |relay| as leaky - // to avoid having to suppress every callsite which happens to flakily trigger - // this race. - ANNOTATE_LEAKING_OBJECT_PTR(relay); - if (!PostTask(from_here, BindOnce(&PostTaskAndReplyRelay::RunTaskAndPostReply, - Unretained(relay)))) { - delete relay; - return false; - } + DCHECK(task) << from_here.ToString(); + DCHECK(reply) << from_here.ToString(); - return true; + return PostTask(from_here, + BindOnce(&PostTaskAndReplyRelay::RunTaskAndPostReply, + PostTaskAndReplyRelay(from_here, std::move(task), + std::move(reply)))); } } // namespace internal
diff --git a/base/threading/post_task_and_reply_impl.h b/base/threading/post_task_and_reply_impl.h index 696a655..54038ce 100644 --- a/base/threading/post_task_and_reply_impl.h +++ b/base/threading/post_task_and_reply_impl.h
@@ -18,17 +18,20 @@ // custom execution context. // // If you're looking for a concrete implementation of PostTaskAndReply, you -// probably want base::TaskRunner. -// -// TODO(fdoray): Move this to the anonymous namespace of base/task_runner.cc. +// probably want base::TaskRunner or base/task_scheduler/post_task.h class BASE_EXPORT PostTaskAndReplyImpl { public: virtual ~PostTaskAndReplyImpl() = default; - // Posts |task| by calling PostTask(). On completion, |reply| is posted to the - // sequence or thread that called this. Can only be called when - // SequencedTaskRunnerHandle::IsSet(). Both |task| and |reply| are guaranteed - // to be deleted on the sequence or thread that called this. + // Posts |task| by calling PostTask(). On completion, posts |reply| to the + // origin sequence. Can only be called when + // SequencedTaskRunnerHandle::IsSet(). Each callback is deleted synchronously + // after running, or scheduled for asynchronous deletion on the origin + // sequence if it can't run (e.g. if a TaskRunner skips it on shutdown). See + // SequencedTaskRunner::DeleteSoon() for when objects scheduled for + // asynchronous deletion can be leaked. Note: All //base task posting APIs + // require callbacks to support deletion on the posting sequence if they can't + // be scheduled. bool PostTaskAndReply(const Location& from_here, OnceClosure task, OnceClosure reply);
diff --git a/base/threading/post_task_and_reply_impl_unittest.cc b/base/threading/post_task_and_reply_impl_unittest.cc index 6678c95..319327d 100644 --- a/base/threading/post_task_and_reply_impl_unittest.cc +++ b/base/threading/post_task_and_reply_impl_unittest.cc
@@ -6,12 +6,12 @@ #include <utility> +#include "base/auto_reset.h" #include "base/bind.h" #include "base/bind_helpers.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/test/test_simple_task_runner.h" -#include "base/threading/thread_task_runner_handle.h" +#include "base/test/test_mock_time_task_runner.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -57,53 +57,141 @@ MockObject() = default; MOCK_METHOD1(Task, void(scoped_refptr<ObjectToDelete>)); - MOCK_METHOD0(Reply, void()); + MOCK_METHOD1(Reply, void(scoped_refptr<ObjectToDelete>)); private: DISALLOW_COPY_AND_ASSIGN(MockObject); }; +class MockRunsTasksInCurrentSequenceTaskRunner : public TestMockTimeTaskRunner { + public: + MockRunsTasksInCurrentSequenceTaskRunner( + TestMockTimeTaskRunner::Type type = + TestMockTimeTaskRunner::Type::kStandalone) + : TestMockTimeTaskRunner(type) {} + + void RunUntilIdleWithRunsTasksInCurrentSequence() { + AutoReset<bool> reset(&runs_tasks_in_current_sequence_, true); + RunUntilIdle(); + } + + void ClearPendingTasksWithRunsTasksInCurrentSequence() { + AutoReset<bool> reset(&runs_tasks_in_current_sequence_, true); + ClearPendingTasks(); + } + + // TestMockTimeTaskRunner: + bool RunsTasksInCurrentSequence() const override { + return runs_tasks_in_current_sequence_; + } + + private: + ~MockRunsTasksInCurrentSequenceTaskRunner() override = default; + + bool runs_tasks_in_current_sequence_ = false; + + DISALLOW_COPY_AND_ASSIGN(MockRunsTasksInCurrentSequenceTaskRunner); +}; + +class PostTaskAndReplyImplTest : public testing::Test { + protected: + PostTaskAndReplyImplTest() = default; + + void PostTaskAndReplyToMockObject() { + // Expect the post to succeed. + EXPECT_TRUE( + PostTaskAndReplyTaskRunner(post_runner_.get()) + .PostTaskAndReply( + FROM_HERE, + BindOnce(&MockObject::Task, Unretained(&mock_object_), + MakeRefCounted<ObjectToDelete>(&delete_task_flag_)), + BindOnce(&MockObject::Reply, Unretained(&mock_object_), + MakeRefCounted<ObjectToDelete>(&delete_reply_flag_)))); + + // Expect the first task to be posted to |post_runner_|. + EXPECT_TRUE(post_runner_->HasPendingTask()); + EXPECT_FALSE(reply_runner_->HasPendingTask()); + EXPECT_FALSE(delete_task_flag_); + EXPECT_FALSE(delete_reply_flag_); + } + + scoped_refptr<MockRunsTasksInCurrentSequenceTaskRunner> post_runner_ = + MakeRefCounted<MockRunsTasksInCurrentSequenceTaskRunner>(); + scoped_refptr<MockRunsTasksInCurrentSequenceTaskRunner> reply_runner_ = + MakeRefCounted<MockRunsTasksInCurrentSequenceTaskRunner>( + TestMockTimeTaskRunner::Type::kBoundToThread); + testing::StrictMock<MockObject> mock_object_; + bool delete_task_flag_ = false; + bool delete_reply_flag_ = false; + + private: + DISALLOW_COPY_AND_ASSIGN(PostTaskAndReplyImplTest); +}; + } // namespace -TEST(PostTaskAndReplyImplTest, PostTaskAndReply) { - scoped_refptr<TestSimpleTaskRunner> post_runner(new TestSimpleTaskRunner); - scoped_refptr<TestSimpleTaskRunner> reply_runner(new TestSimpleTaskRunner); - ThreadTaskRunnerHandle task_runner_handle(reply_runner); +TEST_F(PostTaskAndReplyImplTest, PostTaskAndReply) { + PostTaskAndReplyToMockObject(); - testing::StrictMock<MockObject> mock_object; - bool delete_flag = false; + EXPECT_CALL(mock_object_, Task(_)); + post_runner_->RunUntilIdleWithRunsTasksInCurrentSequence(); + testing::Mock::VerifyAndClear(&mock_object_); + // The task should have been deleted right after being run. + EXPECT_TRUE(delete_task_flag_); + EXPECT_FALSE(delete_reply_flag_); - EXPECT_TRUE(PostTaskAndReplyTaskRunner(post_runner.get()) - .PostTaskAndReply( - FROM_HERE, - BindOnce(&MockObject::Task, Unretained(&mock_object), - MakeRefCounted<ObjectToDelete>(&delete_flag)), - BindOnce(&MockObject::Reply, Unretained(&mock_object)))); + // Expect the reply to be posted to |reply_runner_|. + EXPECT_FALSE(post_runner_->HasPendingTask()); + EXPECT_TRUE(reply_runner_->HasPendingTask()); - // Expect the task to be posted to |post_runner|. - EXPECT_TRUE(post_runner->HasPendingTask()); - EXPECT_FALSE(reply_runner->HasPendingTask()); - EXPECT_FALSE(delete_flag); + EXPECT_CALL(mock_object_, Reply(_)); + reply_runner_->RunUntilIdleWithRunsTasksInCurrentSequence(); + testing::Mock::VerifyAndClear(&mock_object_); + EXPECT_TRUE(delete_task_flag_); + // The reply should have been deleted right after being run. + EXPECT_TRUE(delete_reply_flag_); - EXPECT_CALL(mock_object, Task(_)); - post_runner->RunUntilIdle(); - testing::Mock::VerifyAndClear(&mock_object); + // Expect no pending task in |post_runner_| and |reply_runner_|. + EXPECT_FALSE(post_runner_->HasPendingTask()); + EXPECT_FALSE(reply_runner_->HasPendingTask()); +} - // |task| should have been deleted right after being run. - EXPECT_TRUE(delete_flag); +TEST_F(PostTaskAndReplyImplTest, TaskDoesNotRun) { + PostTaskAndReplyToMockObject(); - // Expect the reply to be posted to |reply_runner|. - EXPECT_FALSE(post_runner->HasPendingTask()); - EXPECT_TRUE(reply_runner->HasPendingTask()); + // Clear the |post_runner_|. Both callbacks should be scheduled for deletion + // on the |reply_runner_|. + post_runner_->ClearPendingTasksWithRunsTasksInCurrentSequence(); + EXPECT_FALSE(post_runner_->HasPendingTask()); + EXPECT_TRUE(reply_runner_->HasPendingTask()); + EXPECT_FALSE(delete_task_flag_); + EXPECT_FALSE(delete_reply_flag_); - EXPECT_CALL(mock_object, Reply()); - reply_runner->RunUntilIdle(); - testing::Mock::VerifyAndClear(&mock_object); - EXPECT_TRUE(delete_flag); + // Run the |reply_runner_|. Both callbacks should be deleted. + reply_runner_->RunUntilIdleWithRunsTasksInCurrentSequence(); + EXPECT_TRUE(delete_task_flag_); + EXPECT_TRUE(delete_reply_flag_); +} - // Expect no pending task in |post_runner| and |reply_runner|. - EXPECT_FALSE(post_runner->HasPendingTask()); - EXPECT_FALSE(reply_runner->HasPendingTask()); +TEST_F(PostTaskAndReplyImplTest, ReplyDoesNotRun) { + PostTaskAndReplyToMockObject(); + + EXPECT_CALL(mock_object_, Task(_)); + post_runner_->RunUntilIdleWithRunsTasksInCurrentSequence(); + testing::Mock::VerifyAndClear(&mock_object_); + // The task should have been deleted right after being run. + EXPECT_TRUE(delete_task_flag_); + EXPECT_FALSE(delete_reply_flag_); + + // Expect the reply to be posted to |reply_runner_|. + EXPECT_FALSE(post_runner_->HasPendingTask()); + EXPECT_TRUE(reply_runner_->HasPendingTask()); + + // Clear the |reply_runner_| queue without running tasks. The reply callback + // should be deleted. + reply_runner_->ClearPendingTasksWithRunsTasksInCurrentSequence(); + EXPECT_TRUE(delete_task_flag_); + EXPECT_TRUE(delete_reply_flag_); } } // namespace internal
diff --git a/build/android/incremental_install/installer.py b/build/android/incremental_install/installer.py index 9094bf00..a5eff693a 100755 --- a/build/android/incremental_install/installer.py +++ b/build/android/incremental_install/installer.py
@@ -227,10 +227,11 @@ finalize_timer = _Execute(use_concurrency, release_installer_lock, save_cache) logging.info( - 'Took %s seconds (setup=%s, install=%s, libs=%s, dex=%s, finalize=%s)', - main_timer.GetDelta(), setup_timer.GetDelta(), install_timer.GetDelta(), - push_native_timer.GetDelta(), push_dex_timer.GetDelta(), - finalize_timer.GetDelta()) + 'Install of %s took %s seconds ' + '(setup=%s, install=%s, libs=%s, dex=%s, finalize=%s)', + os.path.basename(apk.path), main_timer.GetDelta(), setup_timer.GetDelta(), + install_timer.GetDelta(), push_native_timer.GetDelta(), + push_dex_timer.GetDelta(), finalize_timer.GetDelta()) if show_proguard_warning: logging.warning('Target had proguard enabled, but incremental install uses ' 'non-proguarded .dex files. Performance characteristics '
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index ad368581..0a73ab9 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -381,6 +381,23 @@ } } +# Copy a list of file into a destination directory. Potentially renaming +# files are they are copied. This also ensures that symlinks are followed +# during the copy (i.e. the symlinks are never copied, only their content). +# +# Variables: +# dest: Destination directory path. +# sources: List of source files or directories to copy to dest. +# renaming_sources: Optional list of source file paths that will be renamed +# during the copy operation. If provided, renaming_destinations is required. +# renaming_destinations: Optional list of destination file paths, required +# when renaming_sources is provided. Both lists should have the same size +# and matching entries. +# args: Optional. Additionnal arguments to the copy_ex.py script. +# +# The following variables have the usual GN meaning: data, deps, inputs, +# outputs, testonly, visibility. +# template("copy_ex") { set_sources_assignment_filter([]) action(target_name) { @@ -907,10 +924,13 @@ # # Variables # main_class: The class containing the program entry point. - # jar_file: Optional first classpath entry. - # script_name: Name of the script to generate. # build_config: Path to .build_config for the jar (contains classpath). + # jar_path: Optional. First classpath entry to be inserted before + # the classpath extracted from the build_config. + # script_name: Name of the script to generate. # wrapper_script_args: List of extra arguments to pass to the executable. + # bootclasspath: Optional. list of zip/jar file paths to add to the boot + # class path when the script will invoke javac. # template("java_binary_script") { action(target_name) { @@ -1157,6 +1177,32 @@ } } + # TODO(digit): Document this! + # + # Variables: + # testonly: + # build_config: + # input_jar_path: + # output_jar_path: + # enable_build_hooks: + # enable_build_hooks_android: + # supports_android: + # emma_instrument: + # jar_excluded_patterns: Optional list of .class file patterns to exclude + # from the final .jar file. + # jar_included_patterns: OPtional list of .class file patterns to include + # in the final .jar file. jar_excluded_patterns take precedence over this. + # strip_resource_classes: + # alternative_android_sdk_ijar: + # alternative_android_sdk_ijar_dep: + # alternative_android_sdk: + # deps: + # java_files: + # java_sources_file: + # inputs: + # data_deps: + # visibility: + # template("process_java_prebuilt") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) @@ -1220,9 +1266,6 @@ if (defined(invoker.deps)) { deps += invoker.deps } - if (defined(invoker.public_deps)) { - public_deps = invoker.public_deps - } _android_sdk_jar = android_sdk_jar if (defined(invoker.alternative_android_sdk_jar)) { _android_sdk_jar = invoker.alternative_android_sdk_jar @@ -1276,9 +1319,6 @@ if (defined(invoker.deps)) { deps += invoker.deps } - if (defined(invoker.public_deps)) { - public_deps = invoker.public_deps - } inputs = [ _build_config, _desugar_input_jar, @@ -1323,9 +1363,6 @@ if (defined(invoker.deps)) { deps += invoker.deps } - if (defined(invoker.public_deps)) { - public_deps = invoker.public_deps - } inputs = [ _build_config, _filter_input_jar, @@ -1362,9 +1399,6 @@ if (defined(invoker.deps)) { deps += invoker.deps } - if (defined(invoker.public_deps)) { - public_deps = invoker.public_deps - } forward_variables_from(invoker, [ @@ -1392,9 +1426,6 @@ if (defined(invoker.deps)) { deps += invoker.deps } - if (defined(invoker.public_deps)) { - public_deps = invoker.public_deps - } dest = _output_jar_path sources = [ _previous_output_jar, @@ -1484,8 +1515,7 @@ # The default is to use 'aapt' to generate the file from the content # of the resource directories. # - # alternative_android_sdk_jar: Alternative android.jar to use. - # TODO(digit): Not sure this is needed here. + # alternative_android_sdk_jar: Alternative system android.jar to use. # # shared_resources: (optional) # If true, generate an R.java file that uses non-final resource ID @@ -2292,6 +2322,66 @@ } } + # Compile Java source files into a .jar file, potentially using an + # annotation processor, and/or the errorprone compiler. + # + # Note that the only way to specify custom annotation processors is + # by using build_config to point to a file that corresponds to a java-related + # target that includes javac:processor_classes entries (i.e. there is no + # variable here that can be used for this purpose). + # + # Note also the peculiar use of java_files / java_sources_file. The content + # of the java_files list and the java_sources_file file must match exactly. + # This rule uses java_files only to list the inputs to the action that + # calls the javac.py script, but will pass the list of Java source files + # with the '@${java_sources_file}" command-line syntax. Not a problem in + # practice since this is only called from java_library_impl() that sets up + # the variables properly. + # + # Variables: + # java_files: Optional list of Java source file paths. + # srcjar_deps: Optional list of .srcjar dependencies (not file paths). + # The corresponding source files they contain will be compiled too. + # java_sources_file: Optional path to file containing list of Java source + # file paths. This must always be provided if java_files is not empty + # and must match it exactly. + # build_config: Path to the .build_config file of the corresponding + # java_library_impl() target. The following entries will be used by this + # template: javac:srcjars, deps_info:javac_full_classpath, + # deps_info:javac_full_interface_classpath, javac:processor_classpath, + # javac:processor_classes + # javac_jar_path: Path to the final output .jar file. + # javac_args: Optional list of extra arguments to pass to javac. + # chromium_code: Whether this corresponds to Chromium-specific sources. + # requires_android: True if these sources can only run on Android. + # alternative_android_sdk_ijar: Optional path to alternative Android system + # interface jar file (android.jar). Ignored it !requires_android. + # alternative_android_sdk_ijar_dep: If alternative_android_sdk_ijar is + # provided, this should be the dependency target that generates the + # alternative .jar file. + # additional_jar_files: Optional list of files to copy into the resulting + # .jar file (by default, only .class files are put there). Each entry + # has the 'srcPath:dstPath' format. + # enable_incremental_javac_override: Optional. If provided, determines + # whether incremental javac compilation (based on jmake) is enabled. + # Otherwise, decision is based on the global enable_incremental_javac + # build arg variable. + # enable_errorprone: Optional. If True, use the errorprone compiler to + # check for error-prone constructs in the language. If not provided, + # whether this is enabled depends on chromium_code and the global + # use_errorprone_java_compiler variable. + # apk_name: Optional APK name. If provided, will tell javac.py to also + # generate an .apk.jar.info file under size-info/${apk_name}.apk.jar.info + # provider_configurations: Optional list of paths to Java service + # provider configuration files [1]. These will be copied under + # META-INF/services/ in the final .jar file. + # processor_args_javac: List of annotation processor arguments, each one + # will be passed to javac as -A<entry>. + # deps: Dependencies for the corresponding target. + # testonly: Usual meaning (should be True for test-only targets) + # + # [1] https://docs.oracle.com/javase/7/docs/api/java/util/ServiceLoader.html + # template("compile_java") { forward_variables_from(invoker, [ "testonly" ]) @@ -2328,11 +2418,6 @@ _enable_incremental_javac = enable_incremental_javac } - _manifest_entries = [] - if (defined(invoker.manifest_entries)) { - _manifest_entries = invoker.manifest_entries - } - _srcjar_deps = [] if (defined(invoker.srcjar_deps)) { _srcjar_deps += invoker.srcjar_deps @@ -2403,9 +2488,6 @@ rebase_path(_android_sdk_ijar, root_build_dir) args += [ "--bootclasspath=$_rebased_android_sdk_ijar" ] } - foreach(e, _manifest_entries) { - args += [ "--manifest-entry=" + e ] - } if (_chromium_code) { args += [ "--chromium-code=1" ] } @@ -2452,6 +2534,127 @@ } } + # A rule that will handle multiple Java-related targets. + # + # The caller can provide a list of source files with 'java_files' + # and 'srcjar_deps', or a prebuilt .jar file through 'jar_path'. + # + # In the case of a 'java_binary' target type, it can even provide none of + # that (and the rule will just generate its wrapper script). + # + # The template will process the input .jar file (either the prebuilt one, + # or the result of compiling the sources), for example to apply Proguard, + # but also other ranges of bytecode-level rewriting schemes. + # + # Variables: + # type: type of Java target, valid values: 'java_library', 'java_binary', + # 'junit_binary', 'java_annotation_processor', and 'android_apk' + # main_target_name: optional. If provided, overrides target_name when + # creating sub-targets (e.g. "${main_target_name}__build_config") and + # some output files (e.g. "${main_target_name}.sources"). Only used + # for 'android_apk' types at the moment, where main_target_name will + # be the name of the main APK target. + # supports_android: Optional. True if target can run on Android. + # requires_android: Optional. True if target can only run on Android. + # java_files: Optional list of Java source file paths for this target. + # srcjar_deps: Optional list of .srcjar targets (not file paths). The Java + # source files they contain will also be compiled for this target. + # java_sources_file: Optional path to a file which will be written with + # the content of java_files. If not provided, the file will be written + # under $target_gen_dir/$main_target_name.sources. Ignored if + # java_files is empty. If not + # jar_path: Optional path to a prebuilt .jar file for this target. + # Mutually exclusive with java_files and srcjar_deps. + # final_jar_path: Optional path to the final output .jar file (after + # processing). If not provided, the output will go under + # $root_build_dir/lib.java/ + # output_name: Optional output name for the final jar path. Ignored if + # final_jar_path is provided. Otherwise, used to determine the name + # of the final jar. If not provided, the default is to use the same + # name as jar_path, if provided, or main_target_name. + # dex_path: Optional. Path to the output dex.jar file for this target. + # Ignored if !supports_android. + # main_class: Main Java class name for 'java_binary', 'junit_binary' and + # 'java_annotation_processor' target types. Should not be set for other + # ones. + # deps: Dependencies for this target. + # testonly: True iff target should only be used for tests. + # no_build_hooks: Disables bytecode rewriting of asserts and android + # resources methods. + # chromium_code: Optional. Whether this is Chromium-specific code. If not + # provided, this is determined automatically, based on the location of + # the source files (i.e. anything under third_party/ is not + # Chromium-specific unless it is in a 'chromium' sub-directory). + # emma_never_instrument: Optional. If provided, whether to forbid + # instrumentation with the Emma coverage processor. If not provided, + # this is controlled by the global emma_coverage build arg variable + # and only used for non-test Chromium code. + # alternative_android_sdk_jar: Optional. Alternative Android system + # android.jar to use. + # alternative_android_sdk_ijar: Optional alternative Android system + # interface jar path (i.e. the alternative_android_sdk_jar file processed + # by the ijar tool). + # alternative_android_sdk_ijar_dep: Optional. Dependency target that + # generates alternative_android_sdk_ijar (if the latter is provided). + # annotation_processor_deps: Optional list of dependencies corresponding + # to annotation processors used to compile these sources. + # input_jars_paths: Optional list of additional .jar file paths, which will + # be added to the compile-time classpath when building this target (but + # not to the runtime classpath). + # classpath_deps: Optional list of additional java library dependencies, + # whose .jar files will be added to the compile-time classpath when + # building this target (but not to the runtime classpath). + # gradle_treat_as_prebuilt: Cause generate_gradle.py to reference this + # library via its built .jar rather than including its .java sources. + # proguard_enabled: Optional. True to enable ProGuard obfuscation. + # proguard_configs: Optional list of additional proguard config file paths. + # bypass_platform_checks: Optional. If True, platform checks will not + # be performed. They are used to verify that every target with + # requires_android only depends on targets that, at least supports_android. + # Similarly, if a target has !supports_android, then it cannot depend on + # any other target that has requires_android. + # include_java_resources: Optional. If True, include Java (not Android) + # resources into final .jar file. + # android_manifest_for_lint: Optional path to Android manifest to use + # if Android linting is enabled. Ignored for 'android_apk' types + # (since the value of android_manifest will be used instead). + # lint_suppressions_file: Optional lint suppressions input file. + # jar_excluded_patterns: Optional list of .class file patterns to exclude + # from the final .jar file. + # jar_included_patterns: Optional list of .class file patterns to include + # in the final .jar file. jar_excluded_patterns take precedence over this. + # + # For 'android_apk' targets only: + # + # apk_path: Path to the final APK file. + # android_manifest: Path to AndroidManifest.xml file for the APK. + # android_manifest_dep: Optional. Dependency target that generates + # android_manifest. + # apk_under_test: For 'android_apk' targets used to test other APKs, + # this is the target name of APK being tested. + # incremental_allowed: Optional (default false). True to allow the + # generation of incremental APKs ('android_apk' targets only). + # incremental_apk_path: If incremental_allowed, path to the incremental + # output APK. + # incremental_install_json_path: If incremental_allowed, path to the output + # incremental install json configuration file. + # non_native_packed_relocations: Optional. True if the target Android + # system does not support compressed relocations in native shared + # libraries. + # shared_libraries_runtime_deps_file: Optional. Path to a file listing the + # native shared libraries required at runtime by + # secondary_abi_shared_libraries_runtime_deps_file: + # + # + # For 'java_binary' and 'junit_binary' targets only. Ignored by others: + # + # bootclasspath: Optional list of boot class paths used by the generated + # wrapper script. + # wrapper_script_name: Optional name for the generated wrapper script. + # Default is main target name. + # wrapper_script_args: Optional list of extra arguments used by the + # generated wrapper script. + # template("java_library_impl") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) @@ -2606,33 +2809,33 @@ _build_config_target_name = "${_main_target_name}__build_config" write_build_config(_build_config_target_name) { - forward_variables_from( - invoker, - [ - "alternative_android_sdk_ijar", - "annotation_processor_deps", - "apk_path", - "apk_under_test", - "classpath_deps", - "gradle_treat_as_prebuilt", - "incremental_allowed", - "incremental_apk_path", - "incremental_install_json_path", - "proguard_enabled", - "non_native_packed_relocations", - "shared_libraries_runtime_deps_file", - "secondary_abi_shared_libraries_runtime_deps_file", - "input_jars_paths", - "main_class", - "proguard_configs", - "type", - ]) + forward_variables_from(invoker, + [ + "alternative_android_sdk_ijar", + "annotation_processor_deps", + "classpath_deps", + "gradle_treat_as_prebuilt", + "proguard_enabled", + "proguard_configs", + "input_jars_paths", + "main_class", + "type", + ]) if (type == "android_apk") { - forward_variables_from(invoker, - [ - "android_manifest", - "android_manifest_dep", - ]) + forward_variables_from( + invoker, + [ + "android_manifest", + "android_manifest_dep", + "apk_path", + "apk_under_test", + "incremental_allowed", + "incremental_apk_path", + "incremental_install_json_path", + "non_native_packed_relocations", + "shared_libraries_runtime_deps_file", + "secondary_abi_shared_libraries_runtime_deps_file", + ]) } build_config = _build_config is_prebuilt = _is_prebuilt @@ -2698,8 +2901,6 @@ "alternative_android_sdk_ijar_dep", "enable_errorprone", "enable_incremental_javac_override", - "manifest_entries", - "processors_javac", "processor_args_javac", "provider_configurations", "javac_args",
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 7ec268f..ea1c7ed 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -1561,8 +1561,7 @@ # 2. Remove the thin_archive config, so that the .a file actually contains all # .o files, instead of just references to .o files in the build directoy config("thin_archive") { - # TODO(crbug.com/830843): Re-enable for Android after fixing supersize. - if (is_posix && !is_nacl && !is_android) { + if (is_posix && !is_nacl) { # TODO(thomasanderson): Enable on ChromeOS builds once # https://crbug.com/829956 is fixed. if (default_toolchain != "//build/toolchain/cros:target") {
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 72c663a..c235590 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -1380,7 +1380,7 @@ tree_impl->set_content_source_id(content_source_id_); - tree_impl->SetLocalSurfaceId(local_surface_id_); + tree_impl->set_local_surface_id(local_surface_id_); has_pushed_local_surface_id_ = true; if (pending_page_scale_animation_) {
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 9536d2b..1d73e54 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -180,7 +180,7 @@ } void DidActivateSyncTree() override { // Make sure the active tree always has a valid LocalSurfaceId. - host_impl_->active_tree()->SetLocalSurfaceId( + host_impl_->active_tree()->set_local_surface_id( viz::LocalSurfaceId(1, base::UnguessableToken::Deserialize(2u, 3u))); } void WillPrepareTiles() override {} @@ -242,7 +242,7 @@ bool init = host_impl_->InitializeRenderer(layer_tree_frame_sink_.get()); host_impl_->SetViewportSize(gfx::Size(10, 10)); host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 1.f, 1.f); - host_impl_->active_tree()->SetLocalSurfaceId( + host_impl_->active_tree()->set_local_surface_id( viz::LocalSurfaceId(1, base::UnguessableToken::Deserialize(2u, 3u))); // Set the viz::BeginFrameArgs so that methods which use it are able to. host_impl_->WillBeginImplFrame(viz::CreateBeginFrameArgsForTesting( @@ -3532,7 +3532,7 @@ host_impl_->active_tree()->BuildPropertyTreesForTesting(); host_impl_->active_tree()->DidBecomeActive(); host_impl_->active_tree()->HandleScrollbarShowRequestsFromMain(); - host_impl_->active_tree()->SetLocalSurfaceId( + host_impl_->active_tree()->set_local_surface_id( viz::LocalSurfaceId(1, base::UnguessableToken::Deserialize(2u, 3u))); DrawFrame(); @@ -9020,7 +9020,7 @@ root->test_properties()->AddChild(std::move(child)); layer_tree_host_impl->active_tree()->SetRootLayerForTesting(std::move(root)); layer_tree_host_impl->active_tree()->BuildPropertyTreesForTesting(); - layer_tree_host_impl->active_tree()->SetLocalSurfaceId( + layer_tree_host_impl->active_tree()->set_local_surface_id( viz::LocalSurfaceId(1, base::UnguessableToken::Deserialize(2u, 3u))); TestFrameData frame;
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index a28e2e8..fa670fe 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -469,7 +469,7 @@ target_tree->set_content_source_id(content_source_id()); - target_tree->SetLocalSurfaceId(local_surface_id()); + target_tree->set_local_surface_id(local_surface_id()); target_tree->pending_page_scale_animation_ = std::move(pending_page_scale_animation_); @@ -963,13 +963,6 @@ host_impl_->SetNeedUpdateGpuRasterizationStatus(); } -void LayerTreeImpl::SetLocalSurfaceId( - const viz::LocalSurfaceId& local_surface_id) { - CHECK(!settings().enable_surface_synchronization || !viewport_size_invalid_ || - local_surface_id_ != local_surface_id); - local_surface_id_ = local_surface_id; -} - void LayerTreeImpl::SetRasterColorSpace( int raster_color_space_id, const gfx::ColorSpace& raster_color_space) {
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h index 089d42b..3815722 100644 --- a/cc/trees/layer_tree_impl.h +++ b/cc/trees/layer_tree_impl.h
@@ -300,7 +300,9 @@ void set_content_source_id(uint32_t id) { content_source_id_ = id; } uint32_t content_source_id() { return content_source_id_; } - void SetLocalSurfaceId(const viz::LocalSurfaceId& id); + void set_local_surface_id(const viz::LocalSurfaceId& id) { + local_surface_id_ = id; + } const viz::LocalSurfaceId& local_surface_id() const { return local_surface_id_; }
diff --git a/chrome/android/java/res/layout/url_action_container.xml b/chrome/android/java/res/layout/url_action_container.xml index 23a2038..db93d6d 100644 --- a/chrome/android/java/res/layout/url_action_container.xml +++ b/chrome/android/java/res/layout/url_action_container.xml
@@ -12,27 +12,27 @@ <org.chromium.chrome.browser.widget.TintedImageButton android:id="@+id/delete_button" - style="@style/LocationBarButton" + style="@style/LocationBarActionButton" android:src="@drawable/btn_delete_24dp" android:visibility="invisible" android:contentDescription="@string/accessibility_toolbar_btn_delete_url" /> <org.chromium.chrome.browser.widget.TintedImageButton android:id="@+id/mic_button" - style="@style/LocationBarButton" + style="@style/LocationBarActionButton" android:src="@drawable/btn_mic" android:visibility="invisible" android:contentDescription="@string/accessibility_toolbar_btn_mic" /> <org.chromium.chrome.browser.widget.TintedImageButton android:id="@+id/bookmark_button" - style="@style/LocationBarButton" + style="@style/LocationBarActionButton" android:visibility="gone" android:contentDescription="@string/accessibility_menu_bookmark" /> <org.chromium.chrome.browser.widget.TintedImageButton android:id="@+id/save_offline_button" - style="@style/LocationBarButton" + style="@style/LocationBarActionButton" android:nextFocusForward="@+id/menu_button" android:src="@drawable/ic_file_download_white_24dp" android:visibility="gone"
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml index 93d15445..3f32af9 100644 --- a/chrome/android/java/res/values-v17/styles.xml +++ b/chrome/android/java/res/values-v17/styles.xml
@@ -548,6 +548,8 @@ <!-- Misc styles --> <style name="LocationBarButton"> <item name="android:background">@null</item> + </style> + <style name="LocationBarActionButton" parent="LocationBarButton"> <item name="android:layout_width">@dimen/location_bar_icon_width</item> <item name="android:layout_height">match_parent</item> <item name="android:scaleType">center</item>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index 256e07f..bf12a23 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -23,7 +23,6 @@ import android.os.StrictMode; import android.provider.Browser; import android.support.annotation.Nullable; -import android.support.customtabs.CustomTabsCallback; import android.support.customtabs.CustomTabsIntent; import android.support.customtabs.CustomTabsSessionToken; import android.support.v4.app.ActivityOptionsCompat; @@ -135,6 +134,7 @@ // Whether there is any speculative page loading associated with the session. private boolean mHasSpeculated; private CustomTabObserver mTabObserver; + private CustomTabNavigationEventObserver mTabNavigationEventObserver; private String mSpeculatedUrl; @@ -258,6 +258,7 @@ // initializeMainTab(). PageLoadMetrics.addObserver(mMetricsObserver); tab.addObserver(mTabObserver); + tab.addObserver(mTabNavigationEventObserver); } @Override @@ -270,6 +271,7 @@ @Override public void tabRemoved(Tab tab) { tab.removeObserver(mTabObserver); + tab.removeObserver(mTabNavigationEventObserver); PageLoadMetrics.removeObserver(mMetricsObserver); } }; @@ -648,12 +650,14 @@ tab.getView().requestFocus(); mTabObserver = new CustomTabObserver( getApplication(), mSession, mIntentDataProvider.isOpenedByChrome()); + mTabNavigationEventObserver = new CustomTabNavigationEventObserver(mSession); mMetricsObserver = new PageLoadMetricsObserver(mConnection, mSession, tab, mTabObserver); // Immediately add the observer to PageLoadMetrics to catch early events that may // be generated in the middle of tab initialization. PageLoadMetrics.addObserver(mMetricsObserver); tab.addObserver(mTabObserver); + tab.addObserver(mTabNavigationEventObserver); prepareTabBackground(tab); } @@ -727,7 +731,6 @@ @Override public void onPauseWithNative() { super.onPauseWithNative(); - mConnection.notifyNavigationEvent(mSession, CustomTabsCallback.TAB_HIDDEN); if (mWebappTimeSpentLogger != null) { mWebappTimeSpentLogger.onPause(); } @@ -770,6 +773,8 @@ if (mUsingHiddenTab && !tab.isLoading() && !tab.isShowingErrorPage()) { mTabObserver.onPageLoadStarted(tab, params.getUrl()); mTabObserver.onPageLoadFinished(tab); + mTabNavigationEventObserver.onPageLoadStarted(tab, params.getUrl()); + mTabNavigationEventObserver.onPageLoadFinished(tab); } // No actual load to do if tab already has the exact correct url.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabNavigationEventObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabNavigationEventObserver.java new file mode 100644 index 0000000..2a7aa61 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabNavigationEventObserver.java
@@ -0,0 +1,64 @@ +// 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. + +package org.chromium.chrome.browser.customtabs; + +import android.support.customtabs.CustomTabsCallback; +import android.support.customtabs.CustomTabsSessionToken; + +import org.chromium.chrome.browser.tab.EmptyTabObserver; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.components.security_state.ConnectionSecurityLevel; + +/** + * An observer for firing navigation events on {@link CustomTabsCallback}. + */ +public class CustomTabNavigationEventObserver extends EmptyTabObserver { + // An operation was aborted (due to user action). Should match the value in net_error_list.h. + private static final int NET_ERROR_ABORTED = -3; + + private final CustomTabsSessionToken mSessionToken; + + public CustomTabNavigationEventObserver(CustomTabsSessionToken sessionToken) { + mSessionToken = sessionToken; + } + + @Override + public void onPageLoadStarted(Tab tab, String url) { + CustomTabsConnection.getInstance().notifyNavigationEvent( + mSessionToken, CustomTabsCallback.NAVIGATION_STARTED); + } + + @Override + public void onPageLoadFinished(Tab tab) { + CustomTabsConnection.getInstance().notifyNavigationEvent( + mSessionToken, CustomTabsCallback.NAVIGATION_FINISHED); + } + + @Override + public void onPageLoadFailed(Tab tab, int errorCode) { + int navigationEvent = errorCode == NET_ERROR_ABORTED ? CustomTabsCallback.NAVIGATION_ABORTED + : CustomTabsCallback.NAVIGATION_FAILED; + CustomTabsConnection.getInstance().notifyNavigationEvent(mSessionToken, navigationEvent); + } + + @Override + public void onShown(Tab tab) { + CustomTabsConnection.getInstance().notifyNavigationEvent( + mSessionToken, CustomTabsCallback.TAB_SHOWN); + } + + @Override + public void onHidden(Tab tab) { + CustomTabsConnection.getInstance().notifyNavigationEvent( + mSessionToken, CustomTabsCallback.TAB_HIDDEN); + } + + @Override + public void onDidAttachInterstitialPage(Tab tab) { + if (tab.getSecurityLevel() != ConnectionSecurityLevel.DANGEROUS) return; + CustomTabsConnection.getInstance().notifyNavigationEvent( + mSessionToken, CustomTabsCallback.NAVIGATION_FAILED); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabObserver.java index e04f3a87..2acf0e4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabObserver.java
@@ -5,16 +5,16 @@ package org.chromium.chrome.browser.customtabs; import android.app.Application; -import android.graphics.Bitmap; import android.graphics.Rect; +import android.net.Uri; import android.os.SystemClock; -import android.support.customtabs.CustomTabsCallback; import android.support.customtabs.CustomTabsSessionToken; import android.text.TextUtils; import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.R; import org.chromium.chrome.browser.prerender.ExternalPrerenderHandler; +import org.chromium.chrome.browser.share.ShareHelper; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabObserver; @@ -59,15 +59,15 @@ R.dimen.custom_tabs_screenshot_height); Rect bounds = ExternalPrerenderHandler.estimateContentSize(application, false); if (bounds.width() == 0 || bounds.height() == 0) { - mContentBitmapWidth = (int) Math.round(desiredWidth); - mContentBitmapHeight = (int) Math.round(desiredHeight); + mContentBitmapWidth = Math.round(desiredWidth); + mContentBitmapHeight = Math.round(desiredHeight); } else { // Compute a size that scales the content bitmap to fit one (or both) dimensions, // but also preserves aspect ratio. float scale = Math.min(desiredWidth / bounds.width(), desiredHeight / bounds.height()); - mContentBitmapWidth = (int) Math.round(bounds.width() * scale); - mContentBitmapHeight = (int) Math.round(bounds.height() * scale); + mContentBitmapWidth = Math.round(bounds.width() * scale); + mContentBitmapHeight = Math.round(bounds.height() * scale); } } mOpenedByChrome = openedByChrome; @@ -103,30 +103,18 @@ mCurrentState = STATE_WAITING_LOAD_FINISH; } else if (mCurrentState == STATE_WAITING_LOAD_FINISH) { if (mCustomTabsConnection != null) { - mCustomTabsConnection.notifyNavigationEvent( - mSession, CustomTabsCallback.NAVIGATION_ABORTED); mCustomTabsConnection.sendNavigationInfo( - mSession, tab.getUrl(), tab.getTitle(), null); + mSession, tab.getUrl(), tab.getTitle(), (Uri) null); } mPageLoadStartedTimestamp = SystemClock.elapsedRealtime(); } if (mCustomTabsConnection != null) { mCustomTabsConnection.setSendNavigationInfoForSession(mSession, false); - mCustomTabsConnection.notifyNavigationEvent( - mSession, CustomTabsCallback.NAVIGATION_STARTED); mNavigationInfoCaptureTrigger.onNewNavigation(); } } @Override - public void onShown(Tab tab) { - if (mCustomTabsConnection != null) { - mCustomTabsConnection.notifyNavigationEvent( - mSession, CustomTabsCallback.TAB_SHOWN); - } - } - - @Override public void onHidden(Tab tab) { mNavigationInfoCaptureTrigger.onHide(tab); } @@ -134,10 +122,6 @@ @Override public void onPageLoadFinished(Tab tab) { long pageLoadFinishedTimestamp = SystemClock.elapsedRealtime(); - if (mCustomTabsConnection != null) { - mCustomTabsConnection.notifyNavigationEvent( - mSession, CustomTabsCallback.NAVIGATION_FINISHED); - } if (mCurrentState == STATE_WAITING_LOAD_FINISH && mIntentReceivedTimestamp > 0) { String histogramPrefix = mOpenedByChrome ? "ChromeGeneratedCustomTab" : "CustomTabs"; @@ -183,19 +167,11 @@ public void onDidAttachInterstitialPage(Tab tab) { if (tab.getSecurityLevel() != ConnectionSecurityLevel.DANGEROUS) return; resetPageLoadTracking(); - if (mCustomTabsConnection != null) { - mCustomTabsConnection.notifyNavigationEvent( - mSession, CustomTabsCallback.NAVIGATION_FAILED); - } } @Override public void onPageLoadFailed(Tab tab, int errorCode) { resetPageLoadTracking(); - if (mCustomTabsConnection != null) { - mCustomTabsConnection.notifyNavigationEvent( - mSession, CustomTabsCallback.NAVIGATION_FAILED); - } } @Override @@ -223,13 +199,11 @@ if (!mCustomTabsConnection.shouldSendNavigationInfoForSession(mSession)) return; if (tab.getWebContents() == null) return; - tab.getWebContents().getContentBitmapAsync( - mContentBitmapWidth, mContentBitmapHeight, (Bitmap bitmap) -> { - if (TextUtils.isEmpty(tab.getTitle()) && bitmap == null) return; + ShareHelper.captureScreenshotForContents(tab.getWebContents(), mContentBitmapWidth, + mContentBitmapHeight, (Uri snapshotPath) -> { + if (TextUtils.isEmpty(tab.getTitle()) && snapshotPath == null) return; mCustomTabsConnection.sendNavigationInfo( - mSession, tab.getUrl(), tab.getTitle(), bitmap); + mSession, tab.getUrl(), tab.getTitle(), snapshotPath); }); - - return; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java index 7b91fbd..854bce11 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
@@ -1012,10 +1012,15 @@ * @param session The session to use for getting client callback. * @param url The current url for the tab. * @param title The current title for the tab. - * @param screenshot A screenshot of the tab contents. + * @param snapshotPath Uri location for screenshot of the tab contents which is publicly + * available for sharing. */ public void sendNavigationInfo( - CustomTabsSessionToken session, String url, String title, Bitmap screenshot) { } + CustomTabsSessionToken session, String url, String title, Uri snapshotPath) {} + + // TODO(yfriedman): Remove when internal code is deleted. + public void sendNavigationInfo( + CustomTabsSessionToken session, String url, String title, Bitmap snapshotPath) {} /** * Called when the bottom bar for the custom tab has been hidden or shown completely by user @@ -1042,7 +1047,7 @@ * @param navigationEvent The navigation event code, defined in {@link CustomTabsCallback} * @return true for success. */ - boolean notifyNavigationEvent(CustomTabsSessionToken session, int navigationEvent) { + public boolean notifyNavigationEvent(CustomTabsSessionToken session, int navigationEvent) { CustomTabsCallback callback = mClientManager.getCallbackForSession(session); if (callback == null) return false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java index efbfd26..e72096c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
@@ -45,6 +45,7 @@ import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.CachedMetrics; import org.chromium.chrome.R; +import org.chromium.content_public.browser.WebContents; import org.chromium.ui.UiUtils; import java.io.File; @@ -366,54 +367,60 @@ }.execute(); } - /** - * Persists the screenshot file and notifies the file provider that the file is ready to be - * accessed by the client. - * - * The bitmap is compressed to JPEG before being written to the file. - * - * @param screenshot The screenshot bitmap to be written to file. - * @param callback The callback that will be called once the bitmap is saved. - */ - public static void saveScreenshotToDisk(final Bitmap screenshot, final Context context, - final Callback<Uri> callback) { - if (screenshot == null) { - callback.onResult(null); - return; + private static class ExternallyVisibleUriCallback implements Callback<String> { + private Callback<Uri> mComposedCallback; + ExternallyVisibleUriCallback(Callback<Uri> cb) { + mComposedCallback = cb; } - new AsyncTask<Void, Void, Uri>() { - @Override - protected Uri doInBackground(Void... params) { - FileOutputStream fOut = null; - try { - File path = new File(UiUtils.getDirectoryForImageCapture(context) + "/" - + SHARE_IMAGES_DIRECTORY_NAME); - if (path.exists() || path.mkdir()) { - String fileName = String.valueOf(System.currentTimeMillis()); - File saveFile = File.createTempFile(fileName, JPEG_EXTENSION, path); - fOut = new FileOutputStream(saveFile); - screenshot.compress(Bitmap.CompressFormat.JPEG, 85, fOut); - return ApiCompatibilityUtils.getUriForImageCaptureFile(saveFile); - } - } catch (IOException ie) { - Log.w(TAG, "Ignoring IOException when saving screenshot.", ie); - } finally { - StreamUtil.closeQuietly(fOut); + @Override + public void onResult(final String path) { + if (TextUtils.isEmpty(path)) { + mComposedCallback.onResult(null); + return; + } + + new AsyncTask<Void, Void, Uri>() { + @Override + protected Uri doInBackground(Void... v) { + return ApiCompatibilityUtils.getUriForImageCaptureFile(new File(path)); } - return null; + @Override + protected void onPostExecute(Uri uri) { + mComposedCallback.onResult(uri); + } } + .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + } - @Override - protected void onPostExecute(Uri fileUri) { - fileUri = ApplicationStatus.getStateForApplication() - != ApplicationState.HAS_DESTROYED_ACTIVITIES - ? fileUri - : null; - callback.onResult(fileUri); - } - }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + // TODO(yfriedman): Remove after internal tree is updated. + public static void saveScreenshotToDisk( + Bitmap screenshot, Context context, Callback<Uri> callback) {} + + /** + * Captures a screenshot for the provided web contents, persists it and notifies the file + * provider that the file is ready to be accessed by the client. + * + * The screenshot is compressed to JPEG before being written to the file. + * + * @param contents The WebContents instance for which to capture a screenshot. + * @param width The desired width of the resulting screenshot, or 0 for "auto." + * @param height The desired height of the resulting screenshot, or 0 for "auto." + * @param callback The callback that will be called once the screenshot is saved. + */ + public static void captureScreenshotForContents( + WebContents contents, int width, int height, Callback<Uri> callback) { + try { + String path = UiUtils.getDirectoryForImageCapture(ContextUtils.getApplicationContext()) + + File.separator + SHARE_IMAGES_DIRECTORY_NAME; + contents.getContentBitmapAsync( + width, height, path, new ExternallyVisibleUriCallback(callback)); + } catch (IOException e) { + Log.e(TAG, "Error getting content bitmap: ", e); + callback.onResult(null); + } } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareMenuActionHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareMenuActionHandler.java index 74523c3a..4c0d76e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareMenuActionHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareMenuActionHandler.java
@@ -18,7 +18,6 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.ChromeFileProvider; import org.chromium.components.ui_metrics.CanonicalURLResult; -import org.chromium.content_public.browser.ContentBitmapCallback; import org.chromium.content_public.browser.WebContents; import org.chromium.net.GURLUtils; @@ -196,15 +195,14 @@ if (blockingUri == null) return; // Start screenshot capture and notify the provider when it is ready. - ContentBitmapCallback callback = - (bitmap) -> ShareHelper.saveScreenshotToDisk(bitmap, mainActivity, result -> { + Callback<Uri> callback = (saveFile) -> { // Unblock the file once it is saved to disk. - ChromeFileProvider.notifyFileReady(blockingUri, result); - }); + ChromeFileProvider.notifyFileReady(blockingUri, saveFile); + }; if (sScreenshotCaptureSkippedForTesting) { - callback.onFinishGetBitmap(null); + callback.onResult(null); } else { - webContents.getContentBitmapAsync(0, 0, callback); + ShareHelper.captureScreenshotForContents(webContents, 0, 0, callback); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java index 2c85df5..426d895 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -51,6 +51,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutManager; import org.chromium.chrome.browser.customtabs.CustomTabAppMenuPropertiesDelegate; import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider; +import org.chromium.chrome.browser.customtabs.CustomTabNavigationEventObserver; import org.chromium.chrome.browser.customtabs.CustomTabsConnection; import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.document.DocumentUtils; @@ -251,19 +252,25 @@ } protected void initializeUI(Bundle savedInstanceState) { + Tab tab = getActivityTab(); + // Make display mode available before page load. - getActivityTab().getTabWebContentsDelegateAndroid().setDisplayMode( - mWebappInfo.displayMode()); + tab.getTabWebContentsDelegateAndroid().setDisplayMode(mWebappInfo.displayMode()); + + // Add the navigation event observer before starting the load in order to capture the start + // event. + if (getBrowserSession() != null) { + tab.addObserver(new CustomTabNavigationEventObserver(getBrowserSession())); + } // We do not load URL when restoring from saved instance states. if (savedInstanceState == null) { - getActivityTab().loadUrl( + tab.loadUrl( new LoadUrlParams(mWebappInfo.uri().toString(), PageTransition.AUTO_TOPLEVEL)); } else { - if (NetworkChangeNotifier.isOnline()) getActivityTab().reloadIgnoringCache(); + if (NetworkChangeNotifier.isOnline()) tab.reloadIgnoringCache(); } - - getActivityTab().addObserver(createTabObserver()); + tab.addObserver(createTabObserver()); } @Override
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index ae2ce62c..f2d1ea9 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -328,6 +328,7 @@ "java/src/org/chromium/chrome/browser/customtabs/CustomTabBottomBarDelegate.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabDelegateFactory.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java", + "java/src/org/chromium/chrome/browser/customtabs/CustomTabNavigationEventObserver.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabObserver.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java", "java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionService.java", @@ -1906,6 +1907,7 @@ "javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenDialogTest.java", "javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenManagerTest.java", "javatests/src/org/chromium/chrome/browser/webapps/TestFetchStorageCallback.java", + "javatests/src/org/chromium/chrome/browser/webapps/TrustedWebActivityTest.java", "javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java", "javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java", "javatests/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/TrustedWebActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/TrustedWebActivityTest.java new file mode 100644 index 0000000..10b22cfc --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/TrustedWebActivityTest.java
@@ -0,0 +1,179 @@ +// 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. + +package org.chromium.chrome.browser.webapps; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import static org.chromium.base.ThreadUtils.runOnUiThreadBlocking; + +import android.content.Intent; +import android.os.Bundle; +import android.support.customtabs.CustomTabsCallback; +import android.support.customtabs.CustomTabsIntent; +import android.support.customtabs.CustomTabsSession; +import android.support.customtabs.TrustedWebUtils; +import android.support.test.filters.SmallTest; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.test.util.CallbackHelper; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.Feature; +import org.chromium.chrome.browser.ChromeSwitches; +import org.chromium.chrome.browser.ShortcutHelper; +import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils; +import org.chromium.chrome.browser.firstrun.FirstRunStatus; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabTestUtils; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.util.ChromeTabUtils; +import org.chromium.content.browser.test.NativeLibraryTestRule; +import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.ui.base.PageTransition; + +/** + * Instrumentation tests for Trusted Web Activities (TWA) backed by {@link WebappActivity}. + */ +@RunWith(ChromeJUnit4ClassRunner.class) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) +public class TrustedWebActivityTest { + @Rule + public final WebappActivityTestRule mWebappActivityRule = new WebappActivityTestRule(); + + @Rule + public final NativeLibraryTestRule mNativeLibraryTestRule = new NativeLibraryTestRule(); + + private static final String TEST_PAGE = "/chrome/test/data/android/google.html"; + private static final String TEST_PAGE_2 = "/chrome/test/data/android/test.html"; + private static final String TEST_PAGE_3 = "/chrome/test/data/android/simple.html"; + + // A generic failure occurred. Should match the value in net_error_list.h. + private static final int NET_ERROR_FAILED = -2; + + private String mTestPage; + private String mTestPage2; + private String mTestPage3; + + @Before + public void setUp() throws Exception { + runOnUiThreadBlocking(() -> FirstRunStatus.setFirstRunFlowComplete(true)); + mNativeLibraryTestRule.loadNativeLibraryNoBrowserProcess(); + mTestPage = mWebappActivityRule.getTestServer().getURL(TEST_PAGE); + mTestPage2 = mWebappActivityRule.getTestServer().getURL(TEST_PAGE_2); + mTestPage3 = mWebappActivityRule.getTestServer().getURL(TEST_PAGE_3); + } + + @After + public void tearDown() throws Exception { + runOnUiThreadBlocking(() -> FirstRunStatus.setFirstRunFlowComplete(false)); + } + + /** + * Tests that the navigation callbacks run. + */ + @Test + @SmallTest + @Feature({"Webapps"}) + public void testNavigationCallbacks() throws Exception { + final CallbackHelper startedCallback = new CallbackHelper(); + final CallbackHelper finishedCallback = new CallbackHelper(); + final CallbackHelper failedCallback = new CallbackHelper(); + final CallbackHelper abortedCallback = new CallbackHelper(); + final CallbackHelper shownCallback = new CallbackHelper(); + final CallbackHelper hiddenCallback = new CallbackHelper(); + + CustomTabsSession session = CustomTabsTestUtils.bindWithCallback(new CustomTabsCallback() { + @Override + public void onNavigationEvent(int navigationEvent, Bundle extras) { + switch (navigationEvent) { + case CustomTabsCallback.NAVIGATION_STARTED: + startedCallback.notifyCalled(); + break; + case CustomTabsCallback.NAVIGATION_FINISHED: + finishedCallback.notifyCalled(); + break; + case CustomTabsCallback.NAVIGATION_FAILED: + failedCallback.notifyCalled(); + break; + case CustomTabsCallback.NAVIGATION_ABORTED: + abortedCallback.notifyCalled(); + break; + case CustomTabsCallback.TAB_SHOWN: + shownCallback.notifyCalled(); + break; + case CustomTabsCallback.TAB_HIDDEN: + hiddenCallback.notifyCalled(); + break; + default: + fail("Unknown navigation event: " + navigationEvent); + } + } + }); + WebappActivity activity = runTrustedWebActivityAndWaitForIdle(session, mTestPage); + Tab tab = activity.getActivityTab(); + + startedCallback.waitForCallback(0); + finishedCallback.waitForCallback(0); + assertEquals(mTestPage, tab.getUrl()); + assertFalse(tab.isHidden()); + + // Fake sending the activity to the background. + runOnUiThreadBlocking(activity::onPause); + runOnUiThreadBlocking(activity::onStop); + runOnUiThreadBlocking(() -> activity.onWindowFocusChanged(false)); + hiddenCallback.waitForCallback(0); + assertTrue(tab.isHidden()); + + // Fake bringing the activity back to the foreground. + runOnUiThreadBlocking(() -> activity.onWindowFocusChanged(true)); + runOnUiThreadBlocking(activity::onStart); + runOnUiThreadBlocking(activity::onResume); + shownCallback.waitForCallback(0); + assertFalse(tab.isHidden()); + + // Start two page loads, triggering navigation aborted and finished events. + ChromeTabUtils.waitForTabPageLoadStart(tab, () -> runOnUiThreadBlocking(() -> { + tab.loadUrl(new LoadUrlParams(mTestPage2, PageTransition.LINK)); + }), CallbackHelper.WAIT_TIMEOUT_SECONDS); + ChromeTabUtils.waitForTabPageLoadStart(tab, () -> runOnUiThreadBlocking(() -> { + tab.loadUrl(new LoadUrlParams(mTestPage3, PageTransition.LINK)); + }), CallbackHelper.WAIT_TIMEOUT_SECONDS); + abortedCallback.waitForCallback(0); + finishedCallback.waitForCallback(1); + assertEquals(mTestPage3, tab.getUrl()); + + // Simulate a generic network error, triggering the failed event. + runOnUiThreadBlocking(() -> TabTestUtils.simulatePageLoadFailed(tab, NET_ERROR_FAILED)); + failedCallback.waitForCallback(0); + } + + private WebappActivity runTrustedWebActivityAndWaitForIdle( + CustomTabsSession session, String url) throws Exception { + Intent intent = mWebappActivityRule.createIntent(); + addTwaExtrasToIntent(intent, session); + mWebappActivityRule.startWebappActivity(intent.putExtra(ShortcutHelper.EXTRA_URL, url)); + mWebappActivityRule.waitUntilSplashscreenHides(); + mWebappActivityRule.waitUntilIdle(); + WebappActivity activity = mWebappActivityRule.getActivity(); + assertEquals(WebappActivity.ACTIVITY_TYPE_TWA, activity.getActivityType()); + return activity; + } + + private void addTwaExtrasToIntent(Intent webappIntent, CustomTabsSession session) { + CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder(session).build(); + Intent intent = customTabsIntent.intent; + intent.setAction(Intent.ACTION_VIEW); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + webappIntent.putExtras(intent.getExtras()); + webappIntent.putExtra(TrustedWebUtils.EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY, true); + } +}
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb index a0cd7b4..de0ec62b 100644 --- a/chrome/app/resources/chromium_strings_am.xtb +++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium ነባሪ አሳሹን ማወቅ ወይም ማቀናበር አልቻለም</translation> <translation id="1967743265616885482">ተመሳሳይ ስም ያለው ሞዱል ከChromium ጋር የሚጋጭ መሆኑ ይታወቃል።</translation> <translation id="2008474315282236005">ይሄ 1 ንጥል ከዚህ መሣሪያ ይሰርዛል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ <ph name="USER_EMAIL" /> ሆነው ወደ Chromium ይግቡ።</translation> -<translation id="2077129598763517140">ሲገኝ የሃርድዌር ማጣደፍን ተጠቀም</translation> <translation id="2117378023188580026">ይህን ዝማኔ ለመተግበር አስተዳዳሪዎ Chromiumን ዳግም እንዲያስጀምሩ ይጠይቀዎታል</translation> <translation id="2119636228670142020">&ስለChromium ስርዓተ ክወና</translation> <translation id="2158734852934720349">Chromium OS የክፍት ምንጭ ፈቃዶች</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">Chromiumን ወደ የእርስዎ የተግባር አሞሌ ያያይዙ</translation> <translation id="3889543394854987837">Chromiumን ለመክፈት እና ማሰስ ለመጀመር ስምዎን ጠቅ ያድርጉት።</translation> <translation id="3898493977366060150">የድር አሰሳ በGoogle ዘመናዊ ይሆናል</translation> -<translation id="390894725198123737">Mac ላይ የይለፍ ቃላት በእርስዎ Keychain ላይ ሊቀመጡ ይችላሉ፣ እና ይህን የOS X መለያ በሚጋሩ ሌሎች የChromium ተጠቃሚዎች ሊደረስባቸው ወይም ሊሰመሩ ይችላሉ።</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />የአሁኖቹን ቅንብሮች<ph name="END_LINK" /> ሪፖርት በማድረግ Chromium የተሻለ እንዲሆን ያግዙ</translation> <translation id="4050175100176540509">አስፈላጊ የደህንነት ማሻሻያዎች እና አዲስ ባህሪያት በቅርብ ጊዜው ስሪቱ ላይ ይገኛሉ።</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" />ን ይምረጡ</translation> -<translation id="4077262827416206768">ይህ ለውጥ እንዲተገበር እባክዎ የChromium መስኮቶችን ይዝጉና Chromiumን ዳግም ያስጀምሩ።</translation> <translation id="421369550622382712">ለChromium ምርጥ መተግበሪያዎችን፣ ጨዋታዎችን፣ ቅጥያዎችን እና ገጽታዎችን ያግኙ።</translation> <translation id="4222580632002216401">አሁን ወደ Chromium ገብተዋል! ማመሳሰል በአስተዳዳሪዎ ተሰናክሏል።</translation> <translation id="4224199872375172890">Chromium የተዘመነ ነው።</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">ወደ Chromium መግባት በዚህ መሣሪያ አስተዳዳሪ ተሰናክሏል።</translation> <translation id="4423735387467980091">Chromiumን ያብጁ እና ይቆጣጠሩ</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium በአንድ ሰዓት ውስጥ እንደገና ይጀምራል}one{በ# ሰዓቶች ውስጥ Chromium እንደገና ይጀምራል}other{በ# ሰዓቶች ውስጥ Chromium እንደገና ይጀምራል}}</translation> -<translation id="4458285410772214805">ይሄ ለውጥ እንዲተገበር እባክዎ ይውጡ እና እንደገና ይግቡ።</translation> <translation id="4469812139324097969">Chromium ለሆነ ጊዜ ያህል ዳግም ስላልተጀመረ ጊዜው አልፎበታል። አንድ ዝማኔ አለ እና ልክ ዳግም ሲያስጀምሩት ይተገበራል።</translation> <translation id="4488554488975128561">አደገኛ መተግበሪያዎች እና ጣቢያዎች እንዲገኙ ለማገዝ አንዳንድ የሥርዓት መረጃን እና የገጽ ይዘትን ለGoogle በመላክ Chromium ደህንነቱ ይበልጥ የተጠበቀ እና ለመጠቀም ይበልጥ የቀለለ እንዲሆን ማድረግ ይችላሉ።</translation> <translation id="4567424176335768812">እንደ <ph name="USER_EMAIL_ADDRESS" /> ሆነው ገብተዋል። አሁን የእርስዎን ዕልባቶች፣ ታሪክ እና ሌሎች ቅንብሮች በመለያ በገቡ ሁሉም መሣሪያዎችዎ ላይ መድረስ ይችላሉ።</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">Chromiumን በዚህ ቋንቋ አሳይ</translation> <translation id="5726838626470692954">የእርስዎ አስተዳዳሪ እርስዎን አስወግደውና መልሰው ወደ Chromium ማከል አለባቸው።</translation> <translation id="5768914737813585044">Chromium OS በዚህ ቋንቋ አሳይ</translation> -<translation id="5772805321386874569">(የChromium <ph name="BEGIN_BUTTON" />ዳግም መጀመር<ph name="END_BUTTON" /> ያስፈልገዋል)</translation> <translation id="5796460469508169315">Chromium ዝግጁ ሊሆን ትንሽ ቀርቶታል።</translation> <translation id="5820394555380036790">Chromium ስርዓተ ክወና</translation> <translation id="5862307444128926510">ወደ Chromium እንኳን በደህና መጡ</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb index 55712fa6..3289933 100644 --- a/chrome/app/resources/chromium_strings_ar.xtb +++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">يتعذَّر على Chromium تحديد المتصفح الافتراضي أو تعيينه</translation> <translation id="1967743265616885482">هناك وحدة تحمل الاسم نفسه ومعروف أنها تتعارض مع Chromium.</translation> <translation id="2008474315282236005">سيعمل هذا على حذف عنصر واحد من هذا الجهاز. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chromium كـ <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">استخدام تسريع الأجهزة عند توفره</translation> <translation id="2117378023188580026">يطلب المشرف إعادة تشغيل Chromium لتطبيق هذا التحديث.</translation> <translation id="2119636228670142020">حول ن&ظام التشغيل Chromium</translation> <translation id="2158734852934720349">تراخيص مفتوحة المصدر لنظام التشغيل Chromium</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">تثبيت Chromium على شريط المهام</translation> <translation id="3889543394854987837">انقر على اسمك لفتح Chromium وبدء التصفح.</translation> <translation id="3898493977366060150">تصفُح الويب من خلال ميزات Google الذكية</translation> -<translation id="390894725198123737">في نظام التشغيل Mac، قد يتم حفظ كلمات المرور في تطبيق Keychain والدخول إليها أو مزامنتها من قبل مستخدمي Chromium الآخرين الذين يشاركون حساب نظام التشغيل X هذا.</translation> <translation id="4036079820698952681">ساعد في تحسين Chromium بالإبلاغ عن <ph name="BEGIN_LINK" />الإعدادات الحالية<ph name="END_LINK" /></translation> <translation id="4050175100176540509">تحسينات الأمان المهمة والميزات الجديدة متاحة في أحدث إصدار.</translation> <translation id="407254336480250557">تحديد <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">يُرجى إغلاق جميع نوافذ Chromium وإعادة تشغيل Chromium حتى يسري هذا التغيير.</translation> <translation id="421369550622382712">اكتشف تطبيقات، وألعاب، وإضافات، ومظاهر رائعة لمتصفح Chromium.</translation> <translation id="4222580632002216401">لقد سجلت الدخول الآن إلى Chromium! عطّل المشرف المزامنة.</translation> <translation id="4224199872375172890">Chromium محدّث.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">عطَّل مشرف هذا الجهاز تسجيل الدخول إلى Chromium.</translation> <translation id="4423735387467980091">تخصيص Chromium والتحكم فيه</translation> <translation id="4449801103833300785">{0,plural, =1{ستتم إعادة تشغيل Chromium خلال ساعة واحدة}zero{ستتم إعادة تشغيل Chromium خلال # ساعة}two{ستتم إعادة تشغيل Chromium خلال ساعتين (#)}few{ستتم إعادة تشغيل Chromium خلال # ساعات}many{ستتم إعادة تشغيل Chromium خلال # ساعةً}other{ستتم إعادة تشغيل Chromium خلال # ساعة}}</translation> -<translation id="4458285410772214805">يُرجى الخروج ثم تسجيل الدخول حتى يسري هذا التغيير.</translation> <translation id="4469812139324097969">Chromium غير محدّث لأنه لم تتم إعادة تشغيله منذ فترة. هناك تحديث متوفر وسيتم تطبيقه بمجرد إعادة تشغيله.</translation> <translation id="4488554488975128561">يمكنك المساعدة في جعل Chromium أكثر أمانًا وأسهل استخدامًا بإرسال بعض معلومات النظام ومحتوى الصفحة تلقائيًا إلى Google للمساعدة في اكتشاف التطبيقات والمواقع الضارة.</translation> <translation id="4567424176335768812">لقد سجلت دخولك باعتبارك <ph name="USER_EMAIL_ADDRESS" />. ويُمكنك الآن الاستمتاع بالدخول إلى الإشارات المرجعية، والسجلّ، والإعدادات الأخرى على جميع الأجهزة التي تسجّل الدخول إليها.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">عرض Chromium بهذه اللغة</translation> <translation id="5726838626470692954">يجب على مديرك إزالتك وإضافتك مرة أخرى إلى Chromium.</translation> <translation id="5768914737813585044">عرض نظام التشغيل Chromium بهذه اللغة</translation> -<translation id="5772805321386874569">(<ph name="BEGIN_BUTTON" />إعادة تشغيل<ph name="END_BUTTON" /> Chromium مطلوبة)</translation> <translation id="5796460469508169315">Chromium جاهز تقريبًا.</translation> <translation id="5820394555380036790">نظام التشغيل Chromium</translation> <translation id="5862307444128926510">مرحبًا بك في Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb index dcf39cd..12435f0 100644 --- a/chrome/app/resources/chromium_strings_bg.xtb +++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium не може да определи или зададе браузъра по подразбиране</translation> <translation id="1967743265616885482">Известно е, че модул със същото име влиза в конфликт с Chromium.</translation> <translation id="2008474315282236005">1 елемент ще се изтрие от това устройство. За да извлечете данните си по-късно, влезте в Chromium като <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Да се използва хардуерно ускорение, когато е налице</translation> <translation id="2117378023188580026">Администраторът ви моли да рестартирате Chromium, за да се приложи тази актуализация</translation> <translation id="2119636228670142020">Всичко за &Chromium OS</translation> <translation id="2158734852934720349">Лицензи за отворен код за Chromium OS</translation> @@ -85,11 +84,9 @@ <translation id="3852700440713538496">Закачване на Chromium към лентата на задачите</translation> <translation id="3889543394854987837">Кликнете върху името си, за да отворите Chromium и да започнете да сърфирате.</translation> <translation id="3898493977366060150">Интелигентен начин за сърфиране в мрежата, създаден от Google</translation> -<translation id="390894725198123737">Под Mac паролите може да се запазват в Keychain и да се използват или синхронизират от други потребители на Chromium, споделящи този профил в OS X.</translation> <translation id="4036079820698952681">Помогнете за подобряването на Chromium, като подадете сигнал за <ph name="BEGIN_LINK" />текущите настройки<ph name="END_LINK" /></translation> <translation id="4050175100176540509">В последната версия са налице важни подобрения в сигурността и нови функции.</translation> <translation id="407254336480250557">Изберете <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> <ph name="SMALL_PRODUCT_LOGO" /></translation> -<translation id="4077262827416206768">Моля, затворете всички прозорци на Chromium и го стартирайте отново, за да влезе в сила тази промяна.</translation> <translation id="421369550622382712">Открийте отлични приложения, игри, разширения и теми за Chromium.</translation> <translation id="4222580632002216401">Вече влязохте в Chromium! Синхронизирането е деактивирано от администратора ви.</translation> <translation id="4224199872375172890">Chromium е актуален.</translation> @@ -103,7 +100,6 @@ <translation id="4421155425831608516">Функцията за влизане в Chromium е деактивирана от администратора на това устройство.</translation> <translation id="4423735387467980091">Персонализиране и контролиране на Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium ще стартира отново след един час}other{Chromium ще стартира отново след # часа}}</translation> -<translation id="4458285410772214805">Моля, излезте от профила си и влезте отново, за да влезе в сила тази промяна.</translation> <translation id="4469812139324097969">Chromium не е актуален, защото не е бил стартиран отново известно време. Налице е актуализация, която ще бъде приложена веднага, когато рестартирате.</translation> <translation id="4488554488975128561">Можете да ни помогнете да направим браузъра Chromium по-надежден и по-лесен за използване, като автоматично изпращате до Google системна информация и част от съдържанието на страниците, за да ни съдействате при откриването на опасни приложения и сайтове.</translation> <translation id="4567424176335768812">Влезли сте като <ph name="USER_EMAIL_ADDRESS" />. Сега имате достъп до отметките, историята и другите си настройки на всички устройства, на които сте влезли.</translation> @@ -138,7 +134,6 @@ <translation id="5698481217667032250">Показване на Chromium на този език</translation> <translation id="5726838626470692954">Мениджърът ви трябва да ви премахне от Chromium и да ви добави отново.</translation> <translation id="5768914737813585044">Показване на Chromium OS на този език</translation> -<translation id="5772805321386874569">(изисква <ph name="BEGIN_BUTTON" />рестартиране<ph name="END_BUTTON" /> на Chromium)</translation> <translation id="5796460469508169315">Chromium е почти готов.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Добре дошли в Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb index ae3208a..7335b2ed 100644 --- a/chrome/app/resources/chromium_strings_bn.xtb +++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium ডিফল্ট ব্রাউজার নির্ধারণ বা সেট করতে পারছে না</translation> <translation id="1967743265616885482">একই নামের একটি মডিউল Chromium সঙ্গে বিরোধে জ্ঞাত হয়েছে৷</translation> <translation id="2008474315282236005">এটি এই ডিভাইস থেকে ১টি আইটেম মুছে দেবে। আপনার ডেটা পরে পুনরুদ্ধার করার জন্য, Chromium এ <ph name="USER_EMAIL" /> হিসেবে প্রবেশ করুন।</translation> -<translation id="2077129598763517140">যখনই উপলব্ধ তখন হার্ডওয়্যার অ্যাক্সিলারেশন ব্যবহার করুন</translation> <translation id="2117378023188580026">এই আপডেটটি প্রয়োগ করতে আপনার অ্যাডমিনিস্ট্রেটর চান যে আপনি Chromium আবার চালু করুন</translation> <translation id="2119636228670142020">&Chromium OS সম্পর্কে</translation> <translation id="2158734852934720349">Chromium OS মুক্ত উৎসে লাইসেন্সগুলি</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Chromium কে আপনার কার্যদণ্ডে পিন করুন</translation> <translation id="3889543394854987837">Chromium খোলার জন্য আপনার নামের উপরে ক্লিক করুন এবং ব্রাউজ করা শুরু করুন৷</translation> <translation id="3898493977366060150">Google স্মার্ট ব্যবহার করে ওয়েব ব্রাউজিং</translation> -<translation id="390894725198123737">Mac এ, পাসওয়ার্ডগুলি আপনার Keychain এ সংরক্ষিত হতে পারে এবং এই OS X অ্যাকাউন্টটি শেয়ার করে এমন অন্য Chromium ব্যবহারকারীরা এটি অ্যাক্সেস বা সিঙ্ক করতে পারবে।</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />বর্তমান সেটিংসের<ph name="END_LINK" /> প্রতিবেদন করে Chromium কে আরও ভালো করে তুলতে সাহায্য করুন</translation> <translation id="4050175100176540509">গুরুত্বপূর্ণ নিরাপত্তা উন্নতি এবং নতুন বৈশিষ্ট্যগুলি সর্বশেষ সংস্করণে উপলব্ধ।</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> বেছে নিন</translation> -<translation id="4077262827416206768">দয়া করে সব Chromium উইন্ডো বন্ধ করুন এবং এই পরিবর্তন কার্যকরী করতে Chromium আবার চালু করুন৷</translation> <translation id="421369550622382712">Chromium-এর জন্য খুব ভালো অ্যাপ্লিকেশান, গেম, এক্সটেনশন এবং থিমসমূহ আবিষ্কার করুন৷</translation> <translation id="4222580632002216401">আপনি এখন Chromium এ প্রবেশ করেছেন! আপনার প্রশাসক দ্বারা সিঙ্ক অক্ষম করা আছে৷</translation> <translation id="4224199872375172890">Chromium আপ-টু-ডেট আছে৷</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">এই ডিভাইসের প্রশাসক Chromium এর মাধ্যমে সাইন-ইন করা অক্ষম করেছেন।</translation> <translation id="4423735387467980091">Chromium কাস্টমাইজ ও নিয়ন্ত্রণ করুন</translation> <translation id="4449801103833300785">{0,plural, =1{এক ঘণ্টার মধ্যে Chromium রিলঞ্চ করা হবে}one{# ঘণ্টার মধ্যে Chromium রিলঞ্চ করা হবে}other{# ঘণ্টার মধ্যে Chromium রিলঞ্চ করা হবে}}</translation> -<translation id="4458285410772214805">দয়া করে পরিবর্তনটি সম্ভব করতে প্রস্থান করুন এবং পুনরায় প্রবেশ করুন৷</translation> <translation id="4469812139324097969">Chromium পুরানো হয়ে গেছে কারণ কিছু সময় ধরে এটিকে পুনঃলঞ্চ করা হয়নি। একটি আপডেট উপলব্ধ রয়েছে এবং আপনি পুনঃলঞ্চ করার সাথে সাথেই এটি প্রয়োগ করা হবে।</translation> <translation id="4488554488975128561">বিপজ্জনক অ্যাপ্লিকেশান এবং সাইট শনাক্ত করতে সহায়তা দিতে স্বয়ংক্রিয়ভাবে কিছু তথ্য ও পৃষ্ঠা সামগ্রী Google এ পাঠানোর মাধ্যমে Chromium কে আরও নিরাপদ ও সহজে ব্যবহারযোগ্য করে তুলতে সাহায্য করতে পারেন।</translation> <translation id="4567424176335768812">আপনি <ph name="USER_EMAIL_ADDRESS" /> হিসাবে প্রবেশ করেছেন৷ এখন আপনি আপনার সমস্ত প্রবেশ করা ডিভাইসে আপনার বুকমার্ক, ইতিহাস এবং অন্যান্য সেটিংস অ্যাক্সেস করতে পারেন৷</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">এই ভাষায় Chromium প্রদর্শন করুন</translation> <translation id="5726838626470692954">আপনার পরিচালককে আপনাকে অবশ্যই Chromium থেকে সরিয়ে আবার যোগ করতে হবে।</translation> <translation id="5768914737813585044">এই ভাষায় Chromium OS প্রদর্শন করুন</translation> -<translation id="5772805321386874569">(Chromium <ph name="BEGIN_BUTTON" />আবার চালু করা<ph name="END_BUTTON" /> প্রয়োজন)</translation> <translation id="5796460469508169315">Chromium প্রায় প্রস্তুত।</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Chromium-এ স্বাগতম</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index 8ad12ed..99e1313 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium no pot determinar ni definir el navegador predeterminat</translation> <translation id="1967743265616885482">Se sap que un mòdul amb el mateix nom entra en conflicte amb Chromium.</translation> <translation id="2008474315282236005">Amb aquesta acció, se suprimirà 1 element d'aquest dispositiu. Per recuperar les teves dades més endavant, inicia la sessió a Chromium com a <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Utilitza l'acceleració per maquinari quan estigui disponible</translation> <translation id="2117378023188580026">L'administrador et demana que reiniciïs Chromium per aplicar aquesta actualització</translation> <translation id="2119636228670142020">Quant a &Chromium OS</translation> <translation id="2158734852934720349">Llicències de programari lliure de Chromium OS</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Ancora Chromium a la barra de tasques</translation> <translation id="3889543394854987837">Feu clic al vostre nom per obrir Chromium i començar a navegar.</translation> <translation id="3898493977366060150">Navegació web amb les eines intel·ligents de Google</translation> -<translation id="390894725198123737">En un Mac, és possible que les contrasenyes es desin a Keychain i que altres usuaris de Chromium que comparteixin aquest compte d'OS X puguin accedir-hi i sincronitzar-les.</translation> <translation id="4036079820698952681">Informa de la <ph name="BEGIN_LINK" />configuració actual<ph name="END_LINK" /> per ajudar-nos a millorar Chromium</translation> <translation id="4050175100176540509">La versió més recent incorpora millores de seguretat i funcions noves importants.</translation> <translation id="407254336480250557">Selecciona <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Tanqueu totes les finestres de Chromium i torneu-lo a iniciar perquè s'apliqui aquest canvi.</translation> <translation id="421369550622382712">Descobriu aplicacions, jocs, extensions i temes genials per a Chromium.</translation> <translation id="4222580632002216401">Heu iniciat la sessió a Chromium. El vostre administrador ha desactivat la sincronització.</translation> <translation id="4224199872375172890">Chromium està actualitzat.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">L'administrador d'aquest dispositiu ha desactivat l'inici de sessió a Chromium.</translation> <translation id="4423735387467980091">Personalitza i controla Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium es reiniciarà d'aquí a una hora}other{Chromium es reiniciarà d'aquí a # hores}}</translation> -<translation id="4458285410772214805">Tanqueu la sessió i torneu a iniciar-la perquè aquest canvi es faci efectiu.</translation> <translation id="4469812139324097969">Chromium no està actualitzat perquè fa temps que no s'inicia. Hi ha una actualització disponible i s'aplicarà tan aviat com el tornis a iniciar.</translation> <translation id="4488554488975128561">Per fer que Chromium sigui més segur i més fàcil d'utilitzar, envia automàticament algunes dades del sistema i contingut de les pàgines a Google per ajudar a detectar les aplicacions i els llocs perillosos.</translation> <translation id="4567424176335768812">Heu iniciat la sessió com a <ph name="USER_EMAIL_ADDRESS" />. Ja podeu accedir a les vostres adreces d'interès, al vostre historial i a altres paràmetres en tots els dispositius en què hàgiu iniciat la sessió.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Mostra Chromium en aquest idioma</translation> <translation id="5726838626470692954">El gestor t'ha de suprimir i tornar a afegir a Chromium.</translation> <translation id="5768914737813585044">Mostra Chromium OS en aquest idioma</translation> -<translation id="5772805321386874569">(cal <ph name="BEGIN_BUTTON" />reiniciar<ph name="END_BUTTON" /> Chromium)</translation> <translation id="5796460469508169315">Chromium ja està quasi llest.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Us donem la benvinguda a Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb index eaf28a8..348aaf0 100644 --- a/chrome/app/resources/chromium_strings_cs.xtb +++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium nemůže určit ani nastavit výchozí prohlížeč</translation> <translation id="1967743265616885482">O modulu se stejným názvem je známo, že u něj dochází ke konfliktu s prohlížečem Chromium.</translation> <translation id="2008474315282236005">Z tohoto zařízení bude smazána 1 položka. Budete-li chtít své údaje později načíst, přihlaste se do prohlížeče Chromium jako <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">V případě dostupnosti použít hardwarovou akceleraci</translation> <translation id="2117378023188580026">Váš administrátor vás žádá, abyste kvůli použití této aktualizace Chromium restartovali</translation> <translation id="2119636228670142020">O systému &Chromium OS</translation> <translation id="2158734852934720349">Chromium OS – licence open source</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">Připněte si Chromium na hlavní panel</translation> <translation id="3889543394854987837">Chcete-li otevřít Chromium a začít procházet Internet, klikněte na svoje jméno.</translation> <translation id="3898493977366060150">Procházení webu s chytrými funkcemi Google</translation> -<translation id="390894725198123737">V počítačích Mac se hesla mohou ukládat do úložiště Keychain a mohou k nim přistupovat nebo je synchronizovat i další uživatelé aplikace Chromium, kteří sdílejí tento účet systému OS X.</translation> <translation id="4036079820698952681">Pomozte s vylepšováním prohlížeče Chromium tím, že nahlásíte <ph name="BEGIN_LINK" />aktuální nastavení<ph name="END_LINK" /></translation> <translation id="4050175100176540509">V nejnovější verzi jsou k dispozici důležitá vylepšení zabezpečení a nové funkce.</translation> <translation id="407254336480250557">Vyberte <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" />.</translation> -<translation id="4077262827416206768">Aby se změny projevily, zavřete prosím všechna okna prohlížeče Chromium a spusťte jej znovu.</translation> <translation id="421369550622382712">Objevte skvělé aplikace, hry, rozšíření a motivy prohlížeče Chromium.</translation> <translation id="4222580632002216401">Nyní jste v prohlížeči Chromium přihlášeni. Synchronizace je ale deaktivována správcem.</translation> <translation id="4224199872375172890">Chromium je aktuální.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">Přihlášení do prohlížeče Chromium je administrátorem tohoto zařízení zakázáno.</translation> <translation id="4423735387467980091">Přizpůsobit a ovládat Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium se za hodinu restartuje}few{Chromium se za # hodiny restartuje}many{Chromium se za # hodiny restartuje}other{Chromium se za # hodin restartuje}}</translation> -<translation id="4458285410772214805">Chcete-li, aby se změny projevily, odhlaste se a znovu se přihlaste.</translation> <translation id="4469812139324097969">Prohlížeč Chromium není aktuální, protože nějakou dobu nebyl restartován. Je k dispozici aktualizace, která bude použita po restartování.</translation> <translation id="4488554488975128561">Automatickým hlášením některých informací o systému a obsahu stránek do Googlu můžete pomoci rozpoznávat nebezpečné aplikace a weby a zvýšit tak bezpečnost prohlížeče Chromium a usnadnit jeho používání.</translation> <translation id="4567424176335768812">Jste přihlášeni pomocí účtu <ph name="USER_EMAIL_ADDRESS" />. Nyní můžete přistupovat ke všem svým záložkám, historii a dalším nastavením ve všech přihlášených zařízeních.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">Zobrazit Chromium v tomto jazyce</translation> <translation id="5726838626470692954">Správce vás musí odebrat a poté vás do prohlížeče Chromium znovu přidat.</translation> <translation id="5768914737813585044">Zobrazit Chromium OS v tomto jazyce</translation> -<translation id="5772805321386874569">(vyžaduje <ph name="BEGIN_BUTTON" />restartování<ph name="END_BUTTON" /> prohlížeče Chromium)</translation> <translation id="5796460469508169315">Prohlížeč Chromium je téměř připraven.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Vítejte v prohlížeči Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index 27a65cf..8449d01 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium kan ikke fastlægge eller angive standardbrowseren</translation> <translation id="1967743265616885482">Et modul med samme navn er i strid med Chromium.</translation> <translation id="2008474315282236005">Denne handling sletter ét element på denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind på Chromium som <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Brug hardwareacceleration, når det er muligt</translation> <translation id="2117378023188580026">Din administrator anmoder om, at du genstarter Chromium for at anvende denne opdatering</translation> <translation id="2119636228670142020">Om &Chromium OS</translation> <translation id="2158734852934720349">Chromium OS open source-licenser</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Fastgør Chromium til proceslinjen</translation> <translation id="3889543394854987837">Klik på dit navn for at åbne Chromium og gå i gang med at browse.</translation> <translation id="3898493977366060150">Webbrowsing med Googles smarte funktioner</translation> -<translation id="390894725198123737">På Mac kan adgangskoder blive gemt i din Keychain, og andre Chromium-brugere, der deler denne OS X-konto, kan få adgang til eller synkronisere adgangskoderne.</translation> <translation id="4036079820698952681">Hjælp med at gøre Chromium bedre ved at rapportere de <ph name="BEGIN_LINK" />aktuelle indstillinger<ph name="END_LINK" />.</translation> <translation id="4050175100176540509">Vigtige sikkerhedsforbedringer og nye funktioner er tilgængelige i den seneste version.</translation> <translation id="407254336480250557">Vælg <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Luk alle Chromium-vinduer, og genstart Chromium, før denne ændring kan træde i kraft.</translation> <translation id="421369550622382712">Find fantastiske apps, spil, udvidelser og temaer til Chromium.</translation> <translation id="4222580632002216401">Du er nu logget ind på Chromium. Synkronisering er deaktiveret af din administrator.</translation> <translation id="4224199872375172890">Chromium er opdateret.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Login til Chromium er deaktiveret af administratoren af denne enhed.</translation> <translation id="4423735387467980091">Tilpas og kontrollér Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium genstarter om en time}one{Chromium genstarter om # time}other{Chromium genstarter om # timer}}</translation> -<translation id="4458285410772214805">Du skal logge ud og logge ind igen, for at denne ændring kan træde i kraft.</translation> <translation id="4469812139324097969">Chromium er forældet, da den ikke er blevet genstartet i et stykke tid. Der er en tilgængelig opdatering, som anvendes, så snart du genstarter.</translation> <translation id="4488554488975128561">Du kan gøre Chromium mere sikker og lettere at bruge ved automatisk at sende nogle systemoplysninger og sideindhold til Google som en hjælp til at registrere skadelige apps og websites.</translation> <translation id="4567424176335768812">Du er logget ind som <ph name="USER_EMAIL_ADDRESS" />. Nu kan du få adgang til dine bogmærker, din historik og andre indstillinger på alle de enheder, hvor du er logget ind.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Vis Chromium på dette sprog</translation> <translation id="5726838626470692954">Din administrator skal fjerne dig fra Chromium og tilføje dig igen.</translation> <translation id="5768914737813585044">Vis Chromium OS på dette sprog</translation> -<translation id="5772805321386874569">(kræver en <ph name="BEGIN_BUTTON" />genstart<ph name="END_BUTTON" /> af Chromium)</translation> <translation id="5796460469508169315">Chromium er næsten klar.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Velkommen til Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb index dba6308..d3fda2f 100644 --- a/chrome/app/resources/chromium_strings_de.xtb +++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium kann den Standardbrowser nicht bestimmen oder festlegen</translation> <translation id="1967743265616885482">Es ist bekannt, dass ein Modul mit dem gleichen Namen einen Konflikt mit Chromium verursacht.</translation> <translation id="2008474315282236005">Dadurch wird 1 Element von diesem Gerät gelöscht. Wenn Sie Ihre Daten später abrufen möchten, melden Sie sich als <ph name="USER_EMAIL" /> in Chromium an.</translation> -<translation id="2077129598763517140">Hardwarebeschleunigung verwenden, falls verfügbar</translation> <translation id="2117378023188580026">Laut Ihrem Administrator sollten Sie Chromium neu starten, um dieses Update durchzuführen</translation> <translation id="2119636228670142020">Über &Chromium OS</translation> <translation id="2158734852934720349">Open Source-Lizenzen für Chromium OS</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Chromium an Ihre Taskleiste anheften</translation> <translation id="3889543394854987837">Klicken Sie auf Ihren Namen, um Chromium zu öffnen und im Web zu surfen.</translation> <translation id="3898493977366060150">Smart surfen mit Google</translation> -<translation id="390894725198123737">Auf einem Mac können Passwörter in Ihrem Schlüsselbund gespeichert und von anderen Chromium-Nutzern über dieses OS X-Konto abgerufen oder synchronisiert werden.</translation> <translation id="4036079820698952681">Helfen Sie uns mit Ihrem Feedback zu den <ph name="BEGIN_LINK" />aktuellen Einstellungen<ph name="END_LINK" /> bei der Verbesserung von Chromium</translation> <translation id="4050175100176540509">Wichtige Sicherheitsverbesserungen und neue Funktionen sind in der aktuellen Version verfügbar.</translation> <translation id="407254336480250557">Wählen Sie <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> aus</translation> -<translation id="4077262827416206768">Schließen Sie bitte alle Chromium-Fenster und starten Sie Chromium neu, damit diese Änderung wirksam wird.</translation> <translation id="421369550622382712">Entdecken Sie tolle Apps, Spiele, Erweiterungen und Designs für Chromium.</translation> <translation id="4222580632002216401">Sie sind nun in Chromium angemeldet. Die Synchronisierung wurde von Ihrem Administrator deaktiviert.</translation> <translation id="4224199872375172890">Chromium ist auf dem neuesten Stand.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Die Anmeldung in Chromium wurde vom Administrator dieses Geräts deaktiviert.</translation> <translation id="4423735387467980091">Chromium anpassen und einstellen</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium wird in einer Stunde neu gestartet}other{Chromium wird in # Stunden neu gestartet}}</translation> -<translation id="4458285410772214805">Melden Sie sich ab und wieder an, damit diese Änderung wirksam wird.</translation> <translation id="4469812139324097969">Chromium ist veraltet, da es über einen längeren Zeitraum nicht neu gestartet wurde. Ein Update ist verfügbar und wird übernommen, sobald Sie Chromium neu starten.</translation> <translation id="4488554488975128561">Sie können dazu beitragen, die Verwendung von Chromium sicherer und nutzerfreundlicher zu machen, indem Sie einige Systeminformationen und Seiteninhalte automatisch an Google senden. Google kann so schädliche Apps und Websites besser erfassen.</translation> <translation id="4567424176335768812">Sie sind als <ph name="USER_EMAIL_ADDRESS" /> angemeldet. Auf allen Geräten, auf denen Sie angemeldet sind, sind nun Ihre Lesezeichen, Ihr Verlauf und andere Einstellungen verfügbar.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Chromium in dieser Sprache anzeigen</translation> <translation id="5726838626470692954">Ihr Administrator muss Sie aus Chromium entfernen und dann wieder hinzufügen.</translation> <translation id="5768914737813585044">Chromium OS in dieser Sprache anzeigen</translation> -<translation id="5772805321386874569">Ein <ph name="BEGIN_BUTTON" />Neustart<ph name="END_BUTTON" /> von Chromium ist erforderlich.</translation> <translation id="5796460469508169315">Chromium ist gleich bereit.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Willkommen bei Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb index bd06d2f9..230ca54 100644 --- a/chrome/app/resources/chromium_strings_el.xtb +++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Το Chromium δεν μπορεί να καθορίσει ή να ορίσει το προεπιλεγμένο πρόγραμμα περιήγησης</translation> <translation id="1967743265616885482">Έχει διαπιστωθεί ότι μια λειτουργική μονάδα με το ίδιο όνομα βρίσκεται σε διένεξη με το Chromium.</translation> <translation id="2008474315282236005">Με αυτήν την ενέργεια θα διαγραφεί 1 στοιχείο από αυτήν τη συσκευή. Για να ανακτήσετε τα δεδομένα σας αργότερα, συνδεθείτε στο Chromium ως <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Χρήση της επιτάχυνσης υλικού όταν είναι διαθέσιμη</translation> <translation id="2117378023188580026">Ο διαχειριστής σας ζητάει να επανεκκινήσετε το Chromium, προκειμένου να εφαρμοστεί αυτή η ενημέρωση</translation> <translation id="2119636228670142020">Σχετικά με το &Chromium OS</translation> <translation id="2158734852934720349">Άδειες λογισμικού ανοικτού κώδικα του Chromium OS</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Καρφιτσώστε το Chromium στη γραμμή εργασιών σας</translation> <translation id="3889543394854987837">Κάντε κλικ στο όνομά σας, για να ανοίξετε το Chromium και να ξεκινήσετε την περιήγηση.</translation> <translation id="3898493977366060150">Περιήγηση στον ιστό με το Google smarts</translation> -<translation id="390894725198123737">Στο Mac, οι κωδικοί πρόσβασης μπορεί να αποθηκευτούν στο Keychain και ενδέχεται άλλοι χρήστες του Chromium, που μοιράζονται αυτόν τον λογαριασμό OS X, να αποκτήσουν πρόσβαση σε αυτούς ή να τους συγχρονίσουν.</translation> <translation id="4036079820698952681">Συμβάλετε στη βελτίωση του Chromium, αναφέροντας τις <ph name="BEGIN_LINK" />τρέχουσες ρυθμίσεις<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Στην πιο πρόσφατη έκδοση διατίθενται σημαντικές βελτιώσεις ασφάλειας και νέες λειτουργίες.</translation> <translation id="407254336480250557">Επιλέξτε <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Κλείστε όλα τα παράθυρα του Chromium και επανεκκινήστε το Chromium για την εφαρμογή αυτής της αλλαγής.</translation> <translation id="421369550622382712">Ανακαλύψτε καταπληκτικές εφαρμογές, παιχνίδια, επεκτάσεις και θέματα για το Chromium.</translation> <translation id="4222580632002216401">Έχετε πλέον συνδεθεί στο Chromium! Ο συγχρονισμός έχει απενεργοποιηθεί από το διαχειριστή σας.</translation> <translation id="4224199872375172890">Το Chromium έχει ενημερωθεί.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Η σύνδεση στο Chromium είναι απενεργοποιημένη από τον διαχειριστή αυτής της συσκευής.</translation> <translation id="4423735387467980091">Προσαρμογή και έλεγχος του Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Το Chromium θα επανεκκινηθεί σε μία ώρα}other{Το Chromium θα επανεκκινηθεί σε # ώρες}}</translation> -<translation id="4458285410772214805">Για να εφαρμοστεί αυτή η αλλαγή, αποσυνδεθείτε και συνδεθείτε ξανά.</translation> <translation id="4469812139324097969">Το Chromium δεν είναι ενημερωμένο επειδή δεν έχει γίνει επανεκκίνησή του για αρκετό χρονικό διάστημα. Υπάρχει διαθέσιμη ενημέρωση και θα γίνει εφαρμογή της μόλις κάνετε επανεκκίνηση.</translation> <translation id="4488554488975128561">Μπορείτε να βοηθήσετε να κάνουμε το Chromium πιο ασφαλές και εύχρηστο, αποστέλλοντας αυτόματα ορισμένες πληροφορίες συστήματος και περιεχόμενο σελίδων στην Google, για να διευκολυνθεί ο εντοπισμός επικίνδυνων εφαρμογών και ιστοτόπων.</translation> <translation id="4567424176335768812">Έχετε συνδεθεί ως <ph name="USER_EMAIL_ADDRESS" />. Τώρα μπορείτε να αποκτήσετε πρόσβαση στους σελιδοδείκτες, το ιστορικό και σε άλλες ρυθμίσεις από όλες τις συσκευές στις οποίες έχετε συνδεθεί.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Να εμφανίζεται το Chromium σε αυτήν τη γλώσσα</translation> <translation id="5726838626470692954">Ο διαχειριστής πρέπει να σας αφαιρέσει και να σας προσθέσει ξανά στο Chromium.</translation> <translation id="5768914737813585044">Να εμφανίζεται το Chromium OS σε αυτήν τη γλώσσα</translation> -<translation id="5772805321386874569">(απαιτείται <ph name="BEGIN_BUTTON" />επανεκκίνηση<ph name="END_BUTTON" /> του Chromium)</translation> <translation id="5796460469508169315">Το Chromium είναι σχεδόν έτοιμο.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Καλώς ήρθατε στο Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index 270d7d3..db40cf9 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium cannot determine or set the default browser</translation> <translation id="1967743265616885482">A module with the same name has been known to conflict with Google Chrome.</translation> <translation id="2008474315282236005">This will delete 1 item from this device. To retrieve your data later, sign in to Chromium as <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Use hardware acceleration when available</translation> <translation id="2117378023188580026">Your administrator asks that you relaunch Chromium to apply this update</translation> <translation id="2119636228670142020">About &Chromium OS</translation> <translation id="2158734852934720349">Chromium OS open source licences</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">Pin Chromium to your taskbar</translation> <translation id="3889543394854987837">Click your name to open Chromium and start browsing.</translation> <translation id="3898493977366060150">Web browsing with Google smarts</translation> -<translation id="390894725198123737">On Mac, passwords may be saved to your Keychain and accessed or synced by other Chromium users sharing this OS X account.</translation> <translation id="4036079820698952681">Help make Chromium better by reporting the <ph name="BEGIN_LINK" />current settings<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Important security improvements and new features are available in the latest version.</translation> <translation id="407254336480250557">Select <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Please close all Chromium windows and relaunch Chromium for this change to take effect.</translation> <translation id="421369550622382712">Discover great apps, games, extensions and themes for Chromium.</translation> <translation id="4222580632002216401">You're now signed in to Chromium! Sync is disabled by your administrator.</translation> <translation id="4224199872375172890">Chromium is up to date.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">Sign in to Chromium is disabled by the administrator of this device.</translation> <translation id="4423735387467980091">Customise and control Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium will relaunch in an hour}other{Chromium will relaunch in # hours}}</translation> -<translation id="4458285410772214805">Please sign out and sign in again for this change to take effect.</translation> <translation id="4469812139324097969">Chromium is out of date because it hasn't been relaunched for a while. An update is available and will be applied as soon as you relaunch.</translation> <translation id="4488554488975128561">You can help make Chromium safer and easier to use by automatically sending some system information and page content to Google to help detect dangerous apps and sites.</translation> <translation id="4567424176335768812">You're signed in as <ph name="USER_EMAIL_ADDRESS" />. Now you can access your bookmarks, history and other settings on all your signed in devices.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">Display Chromium in this language</translation> <translation id="5726838626470692954">Your manager must remove and add you back to Chromium.</translation> <translation id="5768914737813585044">Display Chromium OS in this language</translation> -<translation id="5772805321386874569">(requires Chromium <ph name="BEGIN_BUTTON" />restart<ph name="END_BUTTON" />)</translation> <translation id="5796460469508169315">Chromium is almost ready.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Welcome to Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb index bf0ed79d..864d24a 100644 --- a/chrome/app/resources/chromium_strings_es-419.xtb +++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium no puede determinar ni establecer el navegador predeterminado</translation> <translation id="1967743265616885482">Un módulo con el mismo nombre provoca un conflicto con Chromium.</translation> <translation id="2008474315282236005">Esta acción borrará 1 elemento de este dispositivo. Si más adelante deseas recuperar los datos, accede a tu cuenta en Chromium como <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Usar aceleración de hardware cuando esté disponible</translation> <translation id="2117378023188580026">Tu administrador te solicita que reinicies Chromium para aplicar esta actualización</translation> <translation id="2119636228670142020">Acerca de &Chromium OS</translation> <translation id="2158734852934720349">Licencias de código abierto del Sistema operativo Chromium</translation> @@ -85,11 +84,9 @@ <translation id="3852700440713538496">Cómo fijar Chromium a la barra de tareas</translation> <translation id="3889543394854987837">Haz clic en tu nombre para abrir Chromium y empezar a navegar.</translation> <translation id="3898493977366060150">Navegación en Internet con las funciones inteligentes de Google</translation> -<translation id="390894725198123737">En dispositivos Mac, las contraseñas pueden guardarse en la aplicación Keychain. Los usuarios de Chromium con los que compartes esta cuenta del sistema operativo X pueden acceder a las contraseñas o sincronizarlas.</translation> <translation id="4036079820698952681">Informa tu <ph name="BEGIN_LINK" />configuración actual<ph name="END_LINK" /> para ayudarnos a mejorar Chromium</translation> <translation id="4050175100176540509">La última versión proporciona importantes mejoras de seguridad y nuevas funciones.</translation> <translation id="407254336480250557">Selecciona <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Cierra todas las ventanas de Chromium y el vuelve a iniciarlo para que este cambio se aplique.</translation> <translation id="421369550622382712">Descubre aplicaciones, juegos, extensiones y temas increíbles para Chromium.</translation> <translation id="4222580632002216401">Accediste a Chromium. El administrador inhabilitó la sincronización.</translation> <translation id="4224199872375172890">Chromium está actualizado.</translation> @@ -103,7 +100,6 @@ <translation id="4421155425831608516">El administrador de este dispositivo inhabilitó el acceso a Chromium.</translation> <translation id="4423735387467980091">Personaliza y controla Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium se volverá a iniciar en una hora}other{Chromium se volverá a iniciar en # horas}}</translation> -<translation id="4458285410772214805">Cierra la sesión y vuelve a iniciarla para que se aplique el cambio.</translation> <translation id="4469812139324097969">Chromium no está actualizado porque no se reinició por un tiempo. Cuando lo reinicies, se aplicará la actualización disponible.</translation> <translation id="4488554488975128561">Puedes ayudar a que Chromium sea más seguro y fácil de usar si envías de forma automática información del sistema y contenido de la página a Google para ayudar a detectar apps y sitios peligrosos.</translation> <translation id="4567424176335768812">Accediste como <ph name="USER_EMAIL_ADDRESS" />. Ahora puedes ir a los favoritos, al historial y a otras opciones en todos los dispositivos en los que hayas accedido.</translation> @@ -138,7 +134,6 @@ <translation id="5698481217667032250">Mostrar Chromium en este idioma</translation> <translation id="5726838626470692954">Tu administrador debe quitarte y volver a agregarte en Chromium.</translation> <translation id="5768914737813585044">Mostrar el SO Chromium en este idioma</translation> -<translation id="5772805321386874569">(Es necesario <ph name="BEGIN_BUTTON" />reiniciar<ph name="END_BUTTON" /> Chromium).</translation> <translation id="5796460469508169315">Chromium está casi listo.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Bienvenido a Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb index 0b5723e2..c1dd6ac 100644 --- a/chrome/app/resources/chromium_strings_es.xtb +++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium no puede determinar ni establecer el navegador predeterminado</translation> <translation id="1967743265616885482">Se ha detectado que un módulo con el mismo nombre provoca un conflicto con Chromium.</translation> <translation id="2008474315282236005">Se eliminará un elemento de este dispositivo. Para recuperar tus datos en otro momento, inicia sesión en Chromium como <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Utilizar aceleración por hardware cuando esté disponible</translation> <translation id="2117378023188580026">Tu administrador pide que reinicies Chromium para aplicar esta actualización</translation> <translation id="2119636228670142020">Información de &Chromium OS</translation> <translation id="2158734852934720349">Licencias de código abierto de Chromium OS</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">Ancla Chromium a la barra de tareas</translation> <translation id="3889543394854987837">Haz clic en tu nombre para abrir Chromium y empezar a navegar.</translation> <translation id="3898493977366060150">Navegación web con soluciones inteligentes de Google</translation> -<translation id="390894725198123737">En los ordenadores Mac, las contraseñas se pueden guardar en el llavero, y otros usuarios de Chromium que compartan esta cuenta de OS X pueden acceder a ellas o sincronizarlas.</translation> <translation id="4036079820698952681">Genera un informe de la <ph name="BEGIN_LINK" />configuración actual<ph name="END_LINK" /> para ayudar a mejorar Chromium</translation> <translation id="4050175100176540509">En la última versión puedes encontrar mejoras de seguridad importantes y nuevas funciones.</translation> <translation id="407254336480250557">Selecciona <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> <ph name="SMALL_PRODUCT_LOGO" /></translation> -<translation id="4077262827416206768">Cierra todas las ventanas de Chromium y vuelve a iniciarlo para que se aplique el cambio.</translation> <translation id="421369550622382712">Descubre aplicaciones, juegos, extensiones y temas increíbles para Chromium.</translation> <translation id="4222580632002216401">Has iniciado sesión en Chromium. El administrador ha inhabilitado la sincronización.</translation> <translation id="4224199872375172890">Chromium está actualizado.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">El administrador de este dispositivo ha inhabilitado el inicio de sesión en Chromium.</translation> <translation id="4423735387467980091">Personaliza y controla Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium se volverá a iniciar en una hora}other{Chromium se volverá a iniciar en # horas}}</translation> -<translation id="4458285410772214805">Cierra la sesión y vuelve a iniciarla para que se aplique el cambio.</translation> <translation id="4469812139324097969">Chromium no está actualizado porque hace algún tiempo que no se reinicia. Hay una actualización disponible, que se aplicará en cuanto lo reinicies.</translation> <translation id="4488554488975128561">Ayuda a que Chromium sea más seguro y se pueda utilizar más fácilmente enviando de forma automática información del sistema y contenido de las páginas a Google para que pueda detectar aplicaciones y sitios web peligrosos.</translation> <translation id="4567424176335768812">Has iniciado sesión como <ph name="USER_EMAIL_ADDRESS" />. Ahora puedes acceder a tus marcadores, a tu historial y a otras opciones en todos los dispositivos en los que hayas iniciado sesión.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">Mostrar Chromium en este idioma</translation> <translation id="5726838626470692954">Tu administrador debe quitarte de Chromium y volver a añadirte.</translation> <translation id="5768914737813585044">Mostrar Chromium OS en este idioma</translation> -<translation id="5772805321386874569">(se debe <ph name="BEGIN_BUTTON" />reiniciar<ph name="END_BUTTON" /> Chromium)</translation> <translation id="5796460469508169315">Chromium está casi listo.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Te damos la bienvenida a Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb index ef6f435..cc61923 100644 --- a/chrome/app/resources/chromium_strings_et.xtb +++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium ei saa määrata ega seadistada vaikebrauserit</translation> <translation id="1967743265616885482">Samanimeline moodul põhjustab teadaolevalt Chromiumiga vastuolusid.</translation> <translation id="2008474315282236005">See kustutab seadmest ühe üksuse. Hiljem oma andmete toomiseks logige Chromiumi sisse kasutajana <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Kasuta võimaluse korral riistvarakiirendust</translation> <translation id="2117378023188580026">Administraator palub teil Chromiumi selle värskenduse rakendamiseks uuesti käivitada</translation> <translation id="2119636228670142020">Teave &Chromium OS-i kohta</translation> <translation id="2158734852934720349">Chromium OS-i avatud lähtekoodi litsentsid</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Chromiumi kinnitamine tegumiribale</translation> <translation id="3889543394854987837">Chromiumi avamiseks ja sirvimise alustamiseks klõpsake oma nimel.</translation> <translation id="3898493977366060150">Veebi sirvimine Google'i nutikate funktsioonidega</translation> -<translation id="390894725198123737">Macis võidakse paroolid salvestada rakendusse Keychain ja teised Chromiumi kasutajad, kes kasutavad sama OS X-i kontot, saavad neid paroole kasutada ning sünkroonida.</translation> <translation id="4036079820698952681">Aidake Chromiumi paremaks muuta, teavitades meid <ph name="BEGIN_LINK" />praegustest seadetest<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Uusimas versioonis on saadaval olulised turvatäiendused ja uued funktsioonid.</translation> <translation id="407254336480250557">Valige <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Muudatuse rakendamiseks sulgege kõik Chromiumi aknad ja taaskäivitage Chromium.</translation> <translation id="421369550622382712">Avastage Chromiumi jaoks suurepäraseid rakendusi, mänge, laiendusi ja teemasid.</translation> <translation id="4222580632002216401">Olete nüüd Chromiumi sisse logitud. Administraator on sünkroonimise keelanud.</translation> <translation id="4224199872375172890">Chromium on ajakohane.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Administraator on selles seadmes Chromiumisse sisselogimise keelanud.</translation> <translation id="4423735387467980091">Chromiumi kohandamine ja juhtimine</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium käivitatakse uuesti tunni aja pärast}other{Chromium käivitatakse uuesti # tunni pärast}}</translation> -<translation id="4458285410772214805">Muudatuse jõustamiseks logige välja ja uuesti sisse.</translation> <translation id="4469812139324097969">Chromium on aegunud, kuna seda ei ole tükk aega taaskäivitatud. Saadaval on värskendus, mis rakendatakse taaskäivitamisel.</translation> <translation id="4488554488975128561">Saate aidata muuta Chromiumi turvalisemaks ja hõlpsamini kasutatavaks, kui lubate saata Google'ile automaatselt teatud süsteemiteavet ning lehesisu, mis aitab tuvastada ohtlikke rakendusi ja saite.</translation> <translation id="4567424176335768812">Olete sisse logitud aadressiga <ph name="USER_EMAIL_ADDRESS" />. Nüüd on teil juurdepääs oma järjehoidjatele, ajaloole ja muudele seadetele kõigis seadmetes, kuhu olete sisse logitud.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Kuva Chromium selles keeles</translation> <translation id="5726838626470692954">Haldur peab teid Chromiumist eemaldama ja uuesti lisama.</translation> <translation id="5768914737813585044">Kuva Chromium OS selles keeles</translation> -<translation id="5772805321386874569">(nõuab Chromiumi <ph name="BEGIN_BUTTON" />taaskäivitamist<ph name="END_BUTTON" />)</translation> <translation id="5796460469508169315">Chromium on peaaegu valmis.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Tere tulemast Chromiumi</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb index 87d7c87..862836e 100644 --- a/chrome/app/resources/chromium_strings_fa.xtb +++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium نمیتواند مرورگر پیشفرض را تعیین یا تنظیم کند</translation> <translation id="1967743265616885482">یک مدول همنام با Chromium تداخل دارد.</translation> <translation id="2008474315282236005">این کار یک مورد را از این دستگاه حذف میکند. برای بازیابی دادههایتان در فرصتی دیگر، با <ph name="USER_EMAIL" /> به سیستم Chromium وارد شوید.</translation> -<translation id="2077129598763517140">در صورت امکان از شتاب سختافزاری استفاده شود</translation> <translation id="2117378023188580026">سرپرست سیستم از شما میخواهد برای اعمال این بهروزرسانی، Chromium را راهاندازی مجدد کنید</translation> <translation id="2119636228670142020">درباره &سیستم عامل Chromium </translation> <translation id="2158734852934720349">مجوزهای منبع باز سیستم عامل Chromium</translation> @@ -86,11 +85,9 @@ <translation id="3852700440713538496">Chromium به نوار وظیفه شما پین شود</translation> <translation id="3889543394854987837">برای باز کردن Chromium و شروع به مرور، روی نامتان کلیک کنید.</translation> <translation id="3898493977366060150">مرور وب با هوشمندیهای Google</translation> -<translation id="390894725198123737">در Mac ممکن است گذرواژهها در Keychain شما ذخیره شوند و سایر کاربران Chromium که این حساب OS X را دارند به آن دسترسی داشته باشند یا بتوانند همگامسازی کنند.</translation> <translation id="4036079820698952681">با گزارش <ph name="BEGIN_LINK" />تنظیمات کنونی<ph name="END_LINK" />، به بهتر شدن Chromium کمک کنید</translation> <translation id="4050175100176540509">بهبودهای امنیتی مهم و ویژگیهای جدید در جدیدترین نسخه در دسترس است.</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> را انتخاب کنید</translation> -<translation id="4077262827416206768">لطفاً همه پنجرههای Chromium را ببندید و Chromium را برای اعمال این تغییر دوباره راهاندازی کنید.</translation> <translation id="421369550622382712">برنامهها، بازیها، افزونهها و طرحهای زمینه Chromium را کشف کنید.</translation> <translation id="4222580632002216401">اکنون وارد Chromium شدید! سرپرست سیستم شما همگامسازی را از کار انداخته است.</translation> <translation id="4224199872375172890">Chromium بهروز است.</translation> @@ -104,7 +101,6 @@ <translation id="4421155425831608516">سرپرست این دستگاه ورود به سیستم Chromium را غیرفعال کرده است.</translation> <translation id="4423735387467980091">سفارشی کردن و کنترل Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium یک ساعت دیگر راهاندازی مجدد میشود}one{Chromium # ساعت دیگر راهاندازی مجدد میشود}other{Chromium # ساعت دیگر راهاندازی مجدد میشود}}</translation> -<translation id="4458285410772214805">لطفاً از سیستم خارج شوید و دوباره وارد آن شوید تا این تغییر اعمال شود.</translation> <translation id="4469812139324097969">Chromium قدیمی است چون برای مدتی راهاندازی مجدد نشده است. یک نسخه بهروز دردسترس است و بهمحض راهاندازی مجدد اعمال خواهد شد.</translation> <translation id="4488554488975128561">میتوانید با ارسال خودکار برخی از اطلاعات سیستم و محتوای صفحه به Google، Chromium را ایمنتر و آسانتر کنید. Google از این اطلاعات برای شناسایی برنامهها و سایتهای خطرناک استفاده میکند.</translation> <translation id="4567424176335768812">با حساب <ph name="USER_EMAIL_ADDRESS" /> وارد سیستم شدهاید. اکنون در همه دستگاههایی که با آنها به سیستم وارد شدهاید میتوانید به نشانکها، سابقه و دیگر تنظیماتتان دسترسی داشته باشید.</translation> @@ -139,7 +135,6 @@ <translation id="5698481217667032250">نمایش Chromium به این زبان</translation> <translation id="5726838626470692954">مدیر شما باید شما را از Chromium حذف و دوباره به آن اضافه کند.</translation> <translation id="5768914737813585044">نمایش سیستم عامل Chromium به این زبان</translation> -<translation id="5772805321386874569">(Chromium باید <ph name="BEGIN_BUTTON" />راهاندازی مجدد<ph name="END_BUTTON" /> شود)</translation> <translation id="5796460469508169315">Chromium تقریباً آماده است.</translation> <translation id="5820394555380036790">سیستم عامل Chromium </translation> <translation id="5862307444128926510">به Chromium خوش آمدید</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb index 33dbea4d..8119d73 100644 --- a/chrome/app/resources/chromium_strings_fi.xtb +++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium ei voi tunnistaa tai asettaa oletusselainta.</translation> <translation id="1967743265616885482">Samanniminen moduuli on aiheuttanut aiemmin ristiriitoja Chromiumin kanssa.</translation> <translation id="2008474315282236005">Tämä poistaa yhden kohteen pysyvästi laitteelta. Jos haluat palauttaa tiedot myöhemmin, kirjaudu Chromiumiin käyttäjänä <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Käytä laitteistokiihdytystä, jos mahdollista</translation> <translation id="2117378023188580026">Ylläpitäjä pyytää Chromiumin uudelleenkäynnistystä, jotta tämä päivitys voidaan ottaa käyttöön.</translation> <translation id="2119636228670142020">Tietoja &Chromium-käyttöjärjestelmästä</translation> <translation id="2158734852934720349">Chromium-käyttöjärjestelmän avoimen lähdekoodin lisenssit</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Chromiumin kiinnittäminen tehtäväpalkkiin</translation> <translation id="3889543394854987837">Avaa Chromium klikkaamalla nimeäsi ja aloita selaaminen.</translation> <translation id="3898493977366060150">Verkkoselaaminen Googlen älykkäillä ratkaisuilla</translation> -<translation id="390894725198123737">Macilla salasanat voidaan tallentaa Avainnippuusi, ja muut Chromium-käyttäjät, jotka jakavat saman OS X -käyttöjärjestelmän tilin, voivat käyttää tai synkronoida niitä.</translation> <translation id="4036079820698952681">Auta parantamaan Chromiumia ilmoittamalla <ph name="BEGIN_LINK" />nykyiset asetukset<ph name="END_LINK" />.</translation> <translation id="4050175100176540509">Uusimmassa versiossa on käytettävissä tärkeitä turvallisuusparannuksia ja uusia ominaisuuksia.</translation> <translation id="407254336480250557">Valitse <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" />.</translation> -<translation id="4077262827416206768">Sulje kaikki Chromium-ikkunat ja käynnistä Chromium uudelleen, niin muutos tulee voimaan.</translation> <translation id="421369550622382712">Löydät hienoja sovelluksia, pelejä, laajennuksia ja teemoja Chromiumille.</translation> <translation id="4222580632002216401">Olet nyt kirjautunut sisään Chromiumiin! Järjestelmänvalvoja on poistanut synkronoinnin käytöstä.</translation> <translation id="4224199872375172890">Chromium on ajan tasalla.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Tämän laitteen järjestelmänvalvoja on poistanut käytöstä Chromiumiin kirjautumisen.</translation> <translation id="4423735387467980091">Chromiumin muokkaus ja hallinta</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium käynnistetään uudelleen tunnin kuluttua}other{Chromium käynnistetään uudelleen # tunnin kuluttua}}</translation> -<translation id="4458285410772214805">Kirjaudu ulos ja kirjaudu uudelleen sisään, jotta muutos tulee voimaan.</translation> <translation id="4469812139324097969">Chromium on vanhentunut, koska sitä ei ole käynnistetty uudelleen viime aikoina. Päivitys on saatavilla, ja se otetaan käyttöön uudelleenkäynnistyksen jälkeen.</translation> <translation id="4488554488975128561">Voit auttaa meitä kehittämään Chromiumin turvallisuutta ja käytettävyyttä lähettämällä automaattisesti joitain järjestelmän tietoja ja sivun sisältöjä Googlelle. Näin autat havaitsemaan vaarallisia sovelluksia ja sivustoja.</translation> <translation id="4567424176335768812">Olet kirjautunut Chromeen tilillä <ph name="USER_EMAIL_ADDRESS" />. Nyt voit käyttää kirjanmerkkejäsi, historiaa ja muita asetuksia kaikilla laitteilla, joihin olet kirjautunut.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Näytä Chromium tällä kielellä</translation> <translation id="5726838626470692954">Ylläpitäjän täytyy poistaa sinut Chromiumista ja lisätä sinut sen jälkeen uudelleen.</translation> <translation id="5768914737813585044">Näytä Chromium-käyttöjärjestelmä tällä kielellä</translation> -<translation id="5772805321386874569">(vaatii Chromiumin <ph name="BEGIN_BUTTON" />uudelleenkäynnistyksen<ph name="END_BUTTON" />)</translation> <translation id="5796460469508169315">Chromium on lähes valmis.</translation> <translation id="5820394555380036790">Chromium-käyttöjärjestelmä</translation> <translation id="5862307444128926510">Tervetuloa Chromiumiin</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb index 2fdc12cc..5e603d0 100644 --- a/chrome/app/resources/chromium_strings_fil.xtb +++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Hindi matukoy o maitakda ng Chromium ang default na browser</translation> <translation id="1967743265616885482">May module na may kaparehong pangalan ang natuklasang sumasalungat sa Chromium.</translation> <translation id="2008474315282236005">Magde-delete ito ng 1 item sa device na ito. Upang makuha ang iyong data sa ibang pagkakataon, mag-sign in sa Chromium bilang <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Gamitin ang pagpapabilis ng hardware kapag available</translation> <translation id="2117378023188580026">Hinihiling sa iyo ng administrator mo na muli mong ilunsad ang Chromium para malapat ang update na ito</translation> <translation id="2119636228670142020">Tungkol sa &Chromium OS</translation> <translation id="2158734852934720349">Mga lisensya ng open source ng Chromium OS</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">I-pin ang Chromium sa iyong taskbar</translation> <translation id="3889543394854987837">I-click ang iyong pangalan upang buksan ang Chromium at simulan ang pagba-browse.</translation> <translation id="3898493977366060150">Pag-browse sa web gamit ang mga smart na feature ng Google</translation> -<translation id="390894725198123737">Sa Mac, maaaring ma-save ang mga password sa iyong Keychain at ma-access o ma-sync ng ibang mga user ng Chromium na nagbabahagi ng OS X account na ito.</translation> <translation id="4036079820698952681">Tulungang pahusayin ang Chromium sa pamamagitan ng pag-ulat sa <ph name="BEGIN_LINK" />mga kasalukuyang setting<ph name="END_LINK" /></translation> <translation id="4050175100176540509">May available na mahahalagang pagpapahusay sa seguridad at mga bagong feature sa pinakabagong bersyon.</translation> <translation id="407254336480250557">Piliin ang <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Pakisara ang lahat ng window sa Chromium at muling ilunsad ang Chromium upang magkabisa ang pagbabagong ito.</translation> <translation id="421369550622382712">Tumuklas ng mahuhusay na app, laro, extension at tema para sa Chromium.</translation> <translation id="4222580632002216401">Naka-sign in ka na ngayon sa Chromium! Na-disable ng iyong administrator ang pag-sync.</translation> <translation id="4224199872375172890">Napapanahon ang Chromium.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">Na-disable ng administrator ng device na ito ang pag-sign in sa Chromium.</translation> <translation id="4423735387467980091">I-customize at kontrolin ang Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Malulunsad muli ang Chromium sa loob ng isang oras}one{Malulunsad muli ang Chromium sa loob ng # oras}other{Malulunsad muli ang Chromium sa loob ng # na oras}}</translation> -<translation id="4458285410772214805">Mangyaring mag-sign out at mag-sign in muli upang magkabisa ang pagbabagong ito.</translation> <translation id="4469812139324097969">Luma na ang Chromium dahil matagal na itong hindi muling nailunsad. Available ang isang update at ilalapat ito sa sandaling muli mo itong inilunsad.</translation> <translation id="4488554488975128561">Makakatulong kang gawing mas ligtas at madaling gamitin ang Chromium sa pamamagitan ng awtomatikong pagpapadala ng ilang impormasyon ng system at content ng page sa Google upang makatulong na tumukoy ng mga mapanganib na app at site.</translation> <translation id="4567424176335768812">Naka-sign in ka bilang <ph name="USER_EMAIL_ADDRESS" />. Maaari mo na ngayong i-access ang iyong mga bookmark, kasaysayan, at iba pang setting sa lahat ng iyong device na naka-sign in.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">Ipakita ang Chromium sa wikang ito</translation> <translation id="5726838626470692954">Maaaring inalis at idinagdag kang muli ng iyong manager sa Chromium.</translation> <translation id="5768914737813585044">Ipakita ang Chromium OS sa wikang ito</translation> -<translation id="5772805321386874569">(kinakailangang <ph name="BEGIN_BUTTON" />i-restart<ph name="END_BUTTON" /> ang Chromium)</translation> <translation id="5796460469508169315">Halos handa na ang Chromium.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Maligayang Pagdating sa Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb index 53b490e..6e931e6 100644 --- a/chrome/app/resources/chromium_strings_fr.xtb +++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -30,7 +30,6 @@ <translation id="1966382378801805537">Impossible d'identifier ou de définir le navigateur par défaut avec Chromium</translation> <translation id="1967743265616885482">Nous avons constaté qu'un module du même nom n'est pas compatible avec Chromium.</translation> <translation id="2008474315282236005">Cette action aura pour effet de supprimer 1 élément de cet appareil. Pour récupérer vos données ultérieurement, connectez-vous à Chromium en tant que <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Utiliser l'accélération matérielle (le cas échéant)</translation> <translation id="2117378023188580026">Votre administrateur vous demande de relancer Chromium pour installer cette mise à jour</translation> <translation id="2119636228670142020">À propos de &Chromium OS</translation> <translation id="2158734852934720349">Licences Chromium OS Open Source</translation> @@ -88,11 +87,9 @@ <translation id="3852700440713538496">Épingler Chromium à votre barre des tâches</translation> <translation id="3889543394854987837">Cliquez sur votre nom pour ouvrir Chromium et commencer à naviguer.</translation> <translation id="3898493977366060150">Navigation sur le Web avec les fonctionnalités intelligentes de Google</translation> -<translation id="390894725198123737">Sur Mac, les mots de passe peuvent être enregistrés dans votre trousseau. D'autres utilisateurs de Chromium partageant ce compte OS X peuvent les consulter ou les synchroniser.</translation> <translation id="4036079820698952681">Aidez-nous à améliorer Chromium en nous signalant vos <ph name="BEGIN_LINK" />paramètres actuels<ph name="END_LINK" /></translation> <translation id="4050175100176540509">La dernière version propose d'importantes améliorations de la sécurité ainsi que de nouvelles fonctionnalités.</translation> <translation id="407254336480250557">Sélectionnez <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> <ph name="SMALL_PRODUCT_LOGO" />.</translation> -<translation id="4077262827416206768">Pour que cette modification soit prise en compte, veuillez fermer toutes les fenêtres de Chromium, puis relancer le logiciel.</translation> <translation id="421369550622382712">Découvrez des applications, des jeux, des extensions et des thèmes exceptionnels pour Chromium.</translation> <translation id="4222580632002216401">Vous êtes maintenant connecté à Chromium. La synchronisation a été désactivée par votre administrateur.</translation> <translation id="4224199872375172890">Chromium est à jour.</translation> @@ -106,7 +103,6 @@ <translation id="4421155425831608516">L'option de connexion à Chromium a été désactivée par l'administrateur de cet appareil.</translation> <translation id="4423735387467980091">Personnaliser et contrôler Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium va être relancé dans une heure}one{Chromium va être relancé dans # heure}other{Chromium va être relancé dans # heures}}</translation> -<translation id="4458285410772214805">Pour que cette modification soit prise en compte, veuillez vous déconnecter, puis vous reconnecter.</translation> <translation id="4469812139324097969">Chromium n'est plus à jour, car il n'a pas été relancé depuis quelque temps. La mise à jour disponible sera installée dès que vous le relancerez.</translation> <translation id="4488554488975128561">Vous pouvez nous aider à rendre Chromium plus sûr et plus facile à utiliser en nous envoyant automatiquement des informations système et du contenu de page. Cela nous aidera à détecter les applications et les sites dangereux.</translation> <translation id="4567424176335768812">Vous êtes connecté avec l'adresse e-mail <ph name="USER_EMAIL_ADDRESS" />. Vous pouvez maintenant accéder à vos favoris, à l'historique et aux autres paramètres sur tous les appareils sur lesquels vous êtes connecté.</translation> @@ -141,7 +137,6 @@ <translation id="5698481217667032250">Afficher Chromium dans cette langue</translation> <translation id="5726838626470692954">Votre administrateur doit vous supprimer de Chromium et vous y rajouter.</translation> <translation id="5768914737813585044">Afficher Chromium OS dans cette langue</translation> -<translation id="5772805321386874569">(nécessite le <ph name="BEGIN_BUTTON" />redémarrage<ph name="END_BUTTON" /> de Chromium)</translation> <translation id="5796460469508169315">Chromium est presque prêt</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Bienvenue dans Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb index fd5ebed..609598c 100644 --- a/chrome/app/resources/chromium_strings_gu.xtb +++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium ડિફૉલ્ટ બ્રાઉઝરને નિર્ધારિત અથવા સેટ કરી શકતું નથી</translation> <translation id="1967743265616885482">આ જ નામનું એક મોડ્યુલ Chromium સાથે વિરોધાભાસમાં જાણમાં આવ્યું છે.</translation> <translation id="2008474315282236005">આ, 1 આઇટમને આ ઉપકરણમાંથી કાઢી નાખશે. પછીથી તમારો ડેટા પુનઃપ્રાપ્ત કરવા માટે, Chromium માં <ph name="USER_EMAIL" /> તરીકે સાઇન ઇન કરો.</translation> -<translation id="2077129598763517140">હાર્ડવેર ઍક્સિલરેશન ઉપલબ્ધ હોવા પર ઉપયોગ કરો</translation> <translation id="2117378023188580026">તમારા વ્યવસ્થાપક કહે છે કે આ અપડેટ લાગુ કરવા માટે Chromium ફરીથી લૉન્ચ કરો</translation> <translation id="2119636228670142020">&Chromium OS વિશે</translation> <translation id="2158734852934720349">Chromium OS ખુલ્લા સ્ત્રોત લાઇસેંસેસ</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">તમારા ટાસ્કબારમાં Chromium ને પિન કરો</translation> <translation id="3889543394854987837">Chromium ને ખોલવા માટે તમારા નામને ક્લિક કરો અને બ્રાઉઝ કરવાનું પ્રારંભ કરો.</translation> <translation id="3898493977366060150">Google સ્માર્ટ સાથે વેબ બ્રાઉઝ કરો</translation> -<translation id="390894725198123737">Mac પર, પાસવર્ડ્સ તમારા કીચેન પર સાચવી શકાય છે અને આ OS X એકાઉન્ટ શેર કરતાં અન્ય Chromium વપરાશકર્તાઓ દ્વારા ઍક્સેસ અથવા સમન્વયિત કરી શકાય છે.</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />વર્તમાન સેટિંગ્સ<ph name="END_LINK" />ની જાણ કરીને Chromium ને બહેતર બનાવવામાં સહાય કરો</translation> <translation id="4050175100176540509">નવીનતમ સંસ્કરણમાં મહત્વપૂર્ણ સુરક્ષા સુધારણાઓ અને નવી સુવિધાઓ ઉપલબ્ધ છે.</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> પસંદ કરો</translation> -<translation id="4077262827416206768">કૃપા કરીને બધી Chromium વિંડોઝને બંધ કરો અને આ ફેરફારને પ્રભાવમાં લાવવા માટે Chromium ને ફરી શરૂ કરો.</translation> <translation id="421369550622382712">Chromium માટે શ્રેષ્ઠ એપ્લીકેશન્સ, રમતો, એક્સટેન્શન્સ અને થીમ્સ શોધો.</translation> <translation id="4222580632002216401">તમે હવે Chromium માં સાઇન ઇન છો! સમન્વયન તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલું છે.</translation> <translation id="4224199872375172890">Chromium અપ ટૂ ડેટ છે.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">આ ઉપકરણના વ્યવસ્થાપકે Chromiumમાં સાઇન ઇન કરવાનું બંધ કરેલ છે.</translation> <translation id="4423735387467980091">Chromium ને કસ્ટમાઇઝ અને નિયંત્રિત કરો</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium એક કલાકમાં ફરીથી લૉન્ચ થશે}one{Chromium # કલાકમાં ફરીથી લૉન્ચ થશે}other{Chromium # કલાકમાં ફરીથી લૉન્ચ થશે}}</translation> -<translation id="4458285410772214805">કૃપા કરીને આ પરિવર્તનને પ્રભાવમાં લાવવા માટે સાઇન આઉટ કરો અને ફરીથી સાઇન ઇન કરો.</translation> <translation id="4469812139324097969">Chromium જૂનું થઈ ગયું છે કારણ કે તે ઘણા સમયથી ફરીથી લોંચ કરવામાં આવ્યું નથી. અપડેટ ઉપલબ્ધ છે અને તે તમે જેવું જ ફરીથી લોંચ કરશો, લાગુ થઈ જશે.</translation> <translation id="4488554488975128561">તમે જોખમી અૅપ્લિકેશનો અને સાઇટ્સ શોધવામાં સહાય કરવા માટે Google ને કેટલીક સિસ્ટમ માહિતી અને પૃષ્ઠ સામગ્રી આપમેળે મોકલીને Chromium ને વધુ સુરક્ષિત તથા ઉપયોગમાં સરળ બનાવવામાં સહાય કરી શકો છો.</translation> <translation id="4567424176335768812">તમે <ph name="USER_EMAIL_ADDRESS" /> તરીકે સાઇન ઇન છો. હવે તમે તમારા બધા સાઇન ઇન કરેલા ઉપકરણો પર તમારા બુકમાર્ક્સ, ઇતિહાસ અને અન્ય સેટિંગ્સને ઍક્સેસ કરી શકો છો.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">આ ભાષામાં Chromium પ્રદર્શિત કરો</translation> <translation id="5726838626470692954">તમારા સંચાલકે તમને Chromium માંથી દૂર કરી અને તેના પર પાછા ઉમેરવા આવશ્યક છે.</translation> <translation id="5768914737813585044">આ ભાષામાં Chromium OS પ્રદર્શિત કરો</translation> -<translation id="5772805321386874569">(Chromium <ph name="BEGIN_BUTTON" />પુનઃપ્રારંભ કરવું<ph name="END_BUTTON" /> આવશ્યક છે)</translation> <translation id="5796460469508169315">Chromium લગભગ તૈયાર છે.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Chromium માં સ્વાગત છે</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb index 244bef1..7e2a3219 100644 --- a/chrome/app/resources/chromium_strings_hi.xtb +++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">क्रोमियम, डिफ़ॉल्ट ब्राउज़र को निर्धारित या सेट नहीं कर सकता</translation> <translation id="1967743265616885482">समान नाम वाला मॉड्यूल क्रोमियम का विरोध करने के लिए जाना जाता है.</translation> <translation id="2008474315282236005">ऐसा करने से इस डिवाइस से 1 आइटम हट जाएगा. बाद में अपना डेटा पाने के लिए, Chromium में <ph name="USER_EMAIL" /> के रूप में प्रवेश करें.</translation> -<translation id="2077129598763517140">उपलब्ध होने पर हार्डवेयर त्वरण का उपयोग करें</translation> <translation id="2117378023188580026">आपके एडमिन का कहना है कि यह अपडेट लागू करने के लिए आप क्रोमियम को फिर से लॉन्च करें</translation> <translation id="2119636228670142020">&क्रोमियम OS के बारे में</translation> <translation id="2158734852934720349">क्रोमियम OS ओपन सोर्स लाइसेंस</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">क्रोमियम को अपने टास्कबार में पिन करें</translation> <translation id="3889543394854987837">क्रोमियम को खोलने और ब्राउज़ करना प्रारंभ करने के लिए अपना नाम क्लिक करें.</translation> <translation id="3898493977366060150">Google स्मार्ट के ज़रिए वेब ब्राउज़ करें</translation> -<translation id="390894725198123737">Mac पर, पासवर्ड आपके कीचेन पर सहेजे जा सकते हैं और उन्हें इस OS X खाते को साझा करने वाले अन्य क्रोमियम उपयोगकर्ताओं द्वारा ऐक्सेस या समन्वयित किया जा सकता है.</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />अभी वाली सेटिंग<ph name="END_LINK" /> की रिपोर्ट करके क्रोमियम को बेहतर बनाने में सहायता करें</translation> <translation id="4050175100176540509">महत्वपूर्ण सुरक्षा सुधार और नई सुविधाएं नवीनतम वर्शन में उपलब्ध हैं.</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />क्रोमियम<ph name="END_BOLD" /> चुनें</translation> -<translation id="4077262827416206768">इस परिवर्तन को प्रभावी बनाने के लिए कृपया सभी क्रोमियम विंडो को बंद करके क्रोमियम को पुन: लॉन्च करें.</translation> <translation id="421369550622382712">क्रोमियम के लिए शानदार ऐप्स, गेम, एक्सटेंशन और थीम खोजें.</translation> <translation id="4222580632002216401">अब आप क्रोमियम में प्रवेश हैं! समन्वयन को आपके व्यवस्थापक द्वारा अक्षम किया गया है.</translation> <translation id="4224199872375172890">क्रोमियम अद्यतित है.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">इस डिवाइस के व्यवस्थापक ने क्रोमियम में साइन इन करने की सुविधा बंद कर दी है.</translation> <translation id="4423735387467980091">क्रोमियम कस्टमाइज़ करें और नियंत्रित करें</translation> <translation id="4449801103833300785">{0,plural, =1{क्रोमियम एक घंटे के अंदर फिर से लॉन्च होगा}one{क्रोमियम # घंटों के अंदर फिर से लॉन्च होगा}other{क्रोमियम # घंटों के अंदर फिर से लॉन्च होगा}}</translation> -<translation id="4458285410772214805">इस परिवर्तन के प्रभावी होने के लिए, कृपया प्रस्थान करें और पुन: प्रवेश करें.</translation> <translation id="4469812139324097969">क्रोमियम पुराना हो गया है क्योंकि उसे कुछ समय से फिर से लॉन्च नहीं किया गया है. एक अपडेट उपलब्ध है और जैसे ही आप फिर से लॉन्च करेंगे, अपडेट लागू कर दिया जाएगा.</translation> <translation id="4488554488975128561">खतरनाक ऐप्लिकेशन और साइटों का पता लगाने में सहायता करने के लिए Google को अपने आप कुछ सिस्टम जानकारी और पेज सामग्री भेजकर आप क्रोमियम को उपयोग में अधिक सुरक्षित और अधिक आसान बनाने में सहायता कर सकते हैं.</translation> <translation id="4567424176335768812">आपने <ph name="USER_EMAIL_ADDRESS" /> के रूप में प्रवेश किया हुआ है. अब आप अपने सभी प्रवेश किए हुए डिवाइस पर अपने बुकमार्क, इतिहास, और अन्य सेटिंग की एक्सेस कर सकेंगे.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">क्रोमियम इस भाषा में दिखाएं</translation> <translation id="5726838626470692954">आपके प्रबंधक को आपको क्रोमियम से निकालना और वापस जोड़ना होगा.</translation> <translation id="5768914737813585044">क्रोमियम OS इस भाषा में दिखाएं</translation> -<translation id="5772805321386874569">(क्रोमियम <ph name="BEGIN_BUTTON" />पुन: प्रारंभ<ph name="END_BUTTON" /> करना आवश्यक है)</translation> <translation id="5796460469508169315">क्रोमियम लगभग तैयार है.</translation> <translation id="5820394555380036790">क्रोमियम OS</translation> <translation id="5862307444128926510">क्रोमियम में आपका स्वागत है</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb index de9c1718..8d09a38 100644 --- a/chrome/app/resources/chromium_strings_hr.xtb +++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium ne može utvrditi niti postaviti zadani preglednik</translation> <translation id="1967743265616885482">Modul s tim nazivom već je bio u konfliktu s preglednikom Chromium.</translation> <translation id="2008474315282236005">Time će se izbrisati jedna stavka s uređaja. Da biste kasnije dohvatili svoje podatke, prijavite se na Chromium kao <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Upotrijebi hardversko ubrzanje kada je dostupno</translation> <translation id="2117378023188580026">Vaš administrator traži da ponovo pokrenete Chromium radi primjene tog ažuriranja</translation> <translation id="2119636228670142020">O OS-u &Chromium</translation> <translation id="2158734852934720349">Licence otvorenog izvornog koda OS-a Chromium</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Prikvačite Chromium na programsku traku</translation> <translation id="3889543394854987837">Kliknite svoje ime da biste otvorili Chromium i počeli s pregledavanjem.</translation> <translation id="3898493977366060150">Pregledavanje weba uz pametne Googleove značajke</translation> -<translation id="390894725198123737">Na Mac računalima zaporke se mogu spremati u vaš Keychain, a drugi korisnici Chromiuma koji dijele ovaj OS X račun mogu im pristupiti ili ih sinkronizirati.</translation> <translation id="4036079820698952681">Pomognite poboljšati Chromium tako što ćete prijaviti <ph name="BEGIN_LINK" />trenutačne postavke<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Najnovija verzija sadrži važna sigurnosna poboljšanja i nove značajke.</translation> <translation id="407254336480250557">Odaberite <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Zatvorite sve prozore preglednika Chromium i ponovo pokrenite Chromium da bi ta promjena postala aktivna.</translation> <translation id="421369550622382712">Otkrijte sjajne aplikacije, igre, proširenja i teme za Chromium.</translation> <translation id="4222580632002216401">Sada ste prijavljeni na Chromium! Administrator je onemogućio sinkronizaciju.</translation> <translation id="4224199872375172890">Chromium je ažuran.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Administrator ovog uređaja onemogućio je prijavu na Chromium.</translation> <translation id="4423735387467980091">Prilagodite Chromium i upravljajte njime</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium će se ponovo pokrenuti za sat vremena}one{Chromium će se ponovo pokrenuti za # sat}few{Chromium će se ponovo pokrenuti za # sata}other{Chromium će se ponovo pokrenuti za # sati}}</translation> -<translation id="4458285410772214805">Odjavite se i prijavite se ponovo da bi ta promjena postala aktivna.</translation> <translation id="4469812139324097969">Chromium je zastario jer dulje vrijeme nije ponovo pokrenut. Ažuriranje je dostupno i primijenit će se čim ponovo pokrenete proizvod.</translation> <translation id="4488554488975128561">Možete pomoći da Chromium bude sigurniji i jednostavniji za upotrebu tako što ćete omogućiti da se Googleu automatski šalju neki podaci o sustavu i sadržaju stranice u svrhu otkrivanja opasnih aplikacija i web-lokacija.</translation> <translation id="4567424176335768812">Prijavljeni ste kao <ph name="USER_EMAIL_ADDRESS" />. Sada možete pristupiti svojim oznakama, povijesti i drugim postavkama na svim uređajima na kojima se prijavljujete.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Prikaži Chromium na tom jeziku</translation> <translation id="5726838626470692954">Upravitelj vas mora ukloniti i vratiti u Chromium.</translation> <translation id="5768914737813585044">Prikaži OS Chromium na tom jeziku</translation> -<translation id="5772805321386874569">(potrebno je <ph name="BEGIN_BUTTON" />ponovo pokrenuti<ph name="END_BUTTON" /> Chromium)</translation> <translation id="5796460469508169315">Chromium će uskoro biti spreman.</translation> <translation id="5820394555380036790">OS Chromium</translation> <translation id="5862307444128926510">Dobro došli u Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb index f382eff4..6303293 100644 --- a/chrome/app/resources/chromium_strings_hu.xtb +++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">A Chromium problémába ütközött az alapértelmezett böngésző megállapításakor vagy beállításakor</translation> <translation id="1967743265616885482">Egy ugyanilyen nevű modul ismereteink szerint ütközik a Chromiummal.</translation> <translation id="2008474315282236005">Ezzel egyetlen elemet töröl erről az eszközről. Az adatok későbbi lekéréséhez jelentkezzen be a Chromiumba a következő e-mail-címmel: <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Hardveres gyorsítás alkalmazása lehetőség szerint</translation> <translation id="2117378023188580026">Rendszergazdája arra kéri, hogy indítsa újra a Chromiumot a frissítés alkalmazásához</translation> <translation id="2119636228670142020">A &Chromium OS névjegye</translation> <translation id="2158734852934720349">Chromium OS nyílt forráskódú licencek</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Chromium rögzítése a tálcán</translation> <translation id="3889543394854987837">Kattintson a nevére a Chromium megnyitásához és a böngészés megkezdéséhez.</translation> <translation id="3898493977366060150">Webes böngészés Google-okostelefonokkal</translation> -<translation id="390894725198123737">Mac típusú számítógépen a rendszer a Keychain alkalmazásba mentheti a jelszavakat, amelyek hozzáférhetők vagy szinkronizálhatók lesznek azon Chromium-felhasználók számára, akik ugyanezzel az OS X-fiókkal rendelkeznek.</translation> <translation id="4036079820698952681">Segítsen a Chromium fejlesztésében a <ph name="BEGIN_LINK" />jelenlegi beállítások<ph name="END_LINK" /> elküldésével</translation> <translation id="4050175100176540509">A legújabb verzióban fontos biztonsági fejlesztések és új funkciók érhetők el.</translation> <translation id="407254336480250557">Válassza a <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> lehetőséget</translation> -<translation id="4077262827416206768">Kérjük, zárjon be minden ablakot, majd indítsa újra a Chromiumot a módosítás életbe léptetéséhez.</translation> <translation id="421369550622382712">Fedezzen fel nagyszerű alkalmazásokat, játékokat, bővítményeket és témákat a Chromiumhoz.</translation> <translation id="4222580632002216401">Bejelentkezett a Chromiumba! A szinkronizálást a rendszergazdája letiltotta.</translation> <translation id="4224199872375172890">A Chromium naprakész.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">A Chromium böngészőbe való bejelentkezést letiltotta az eszköz rendszergazdája.</translation> <translation id="4423735387467980091">A Chromium személyre szabása és beállításai</translation> <translation id="4449801103833300785">{0,plural, =1{A Chromium 1 órán belül újraindul}other{A Chromium # órán belül újraindul}}</translation> -<translation id="4458285410772214805">Kérjük, jelentkezzen ki, majd jelentkezzen be újra a módosítás aktiválásához.</translation> <translation id="4469812139324097969">A Chromium elavult, mert nem volt újraindítva egy ideje. Megjelent egy frissítés, amelyik az újraindítás után azonnal érvénybe lép.</translation> <translation id="4488554488975128561">A rendszer-információk és oldaltartalmak automatikus küldésével segítséget nyújthat a Google-nak a Chromium használatának biztonságosabbá és egyszerűbbé tételéhez, illetve a veszélyes alkalmazások és webhelyek felderítéséhez.</translation> <translation id="4567424176335768812">A(z) <ph name="USER_EMAIL_ADDRESS" /> címmel van bejelentkezve. Elérheti könyvjelzőit, előzményeit és más beállításait minden olyan eszközön, amelyen bejelentkezett.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">A Chromium megjelenítése ezen a nyelven</translation> <translation id="5726838626470692954">A kezelőjének el kell távolítania, majd újra hozzá kell adnia Önt a Chromiumhoz.</translation> <translation id="5768914737813585044">A Chromium operációs rendszer megjelenítése ezen a nyelven</translation> -<translation id="5772805321386874569">(a Chromium <ph name="BEGIN_BUTTON" />újraindítását<ph name="END_BUTTON" /> igényli)</translation> <translation id="5796460469508169315">A Chromium majdnem készen áll.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Üdvözli a Chromium!</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index 4a97dc4..eb0f7b13 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium tidak dapat menentukan atau menyetel browser default</translation> <translation id="1967743265616885482">Modul dengan nama yang sama biasanya konflik dengan Chromium.</translation> <translation id="2008474315282236005">Tindakan ini akan menghapus 1 item dari perangkat. Untuk mengambil data nanti, login ke Chromium sebagai <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Gunakan akselerasi hardware jika tersedia</translation> <translation id="2117378023188580026">Administrator meminta Anda meluncurkan ulang Chromium untuk menerapkan update ini</translation> <translation id="2119636228670142020">Tentang &Chromium OS</translation> <translation id="2158734852934720349">Lisensi sumber terbuka Chromium OS</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Sematkan Chromium di bilah tugas</translation> <translation id="3889543394854987837">Klik nama Anda untuk membuka Chromium dan mulai menjelajah.</translation> <translation id="3898493977366060150">Browsing web dengan fitur smart dari Google</translation> -<translation id="390894725198123737">Di Mac, sandi disimpan pada Keychain Anda dan diakses atau disinkronkan oleh pengguna Chromium lain yang membagikan akun OS X ini.</translation> <translation id="4036079820698952681">Bantu Chromium jadi lebih baik dengan melaporkan <ph name="BEGIN_LINK" />setelan saat ini<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Peningkatan keamanan dan fitur baru yang penting tersedia di versi terbaru.</translation> <translation id="407254336480250557">Pilih <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Tutup semua jendela Chromium dan luncurkan ulang Chromium agar perubahan ini diterapkan.</translation> <translation id="421369550622382712">Temukan aplikasi, game, ekstensi, dan tema yang hebat untuk Chromium.</translation> <translation id="4222580632002216401">Sekarang Anda telah masuk ke Chromium! Sinkronisasi dinonaktifkan oleh administrator Anda.</translation> <translation id="4224199872375172890">Chromium sudah diperbarui.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Login ke Chromium dinonaktifkan oleh administrator perangkat ini.</translation> <translation id="4423735387467980091">Menyesuaikan dan mengontrol Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium akan diluncurkan ulang dalam satu jam}other{Chromium akan diluncurkan ulang dalam # jam}}</translation> -<translation id="4458285410772214805">Keluar dan masuk lagi agar perubahan ini diterapkan.</translation> <translation id="4469812139324097969">Chromium telah kedaluwarsa karena tidak diluncurkan selama beberapa waktu. Pembaruan telah tersedia dan akan diterapkan setelah Anda meluncurkan ulang.</translation> <translation id="4488554488975128561">Anda dapat membantu menjadikan Chromium lebih aman dan lebih mudah digunakan, dengan mengirim sebagian informasi sistem dan konten halaman secara otomatis ke Google untuk membantu mendeteksi aplikasi dan situs berbahaya.</translation> <translation id="4567424176335768812">Anda masuk sebagai <ph name="USER_EMAIL_ADDRESS" />. Kini Anda dapat mengakses bookmark, histori, dan setelan lainnya pada seluruh perangkat yang Anda masuki.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Tampilkan Chromium dalam bahasa ini</translation> <translation id="5726838626470692954">Pengelola harus menghapus dan menambahkan Anda kembali ke Chromium.</translation> <translation id="5768914737813585044">Tampilkan Chromium OS dalam bahasa ini</translation> -<translation id="5772805321386874569">(Chromium perlu <ph name="BEGIN_BUTTON" />dimulai ulang<ph name="END_BUTTON" />)</translation> <translation id="5796460469508169315">Chromium hampir siap.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Selamat Datang di Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb index e64b1be9..af25b7d 100644 --- a/chrome/app/resources/chromium_strings_it.xtb +++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium non è in grado di determinare o impostare il browser predefinito</translation> <translation id="1967743265616885482">Un modulo con lo stesso nome risulta in conflitto con Chromium.</translation> <translation id="2008474315282236005">Verrà eliminato 1 elemento da questo dispositivo. Per recuperare i dati in un secondo momento, accedi a Chromium come <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Usa accelerazione hardware quando disponibile</translation> <translation id="2117378023188580026">L'amministratore ti chiede di riavviare Chromium per installare questo aggiornamento</translation> <translation id="2119636228670142020">Informazioni su &Chromium OS</translation> <translation id="2158734852934720349">Licenze open source di Chromium OS</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Aggiungi Chromium alla barra delle applicazioni</translation> <translation id="3889543394854987837">Fai clic sul tuo nome per aprire Chromium e iniziare a navigare.</translation> <translation id="3898493977366060150">Navigazione sul Web con l'esperienza di Google</translation> -<translation id="390894725198123737">Su Mac, le password possono essere salvate in Accesso Portachiavi e sono accessibili o sincronizzate da parte di altri utenti Chromium che utilizzano lo stesso account OS X.</translation> <translation id="4036079820698952681">Contribuisci a migliorare Chromium indicando le <ph name="BEGIN_LINK" />impostazioni attuali<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Nell'ultima versione sono stati apportati miglioramenti rilevanti in materia di sicurezza e sono state aggiunte nuove funzioni.</translation> <translation id="407254336480250557">Seleziona <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Chiudi tutte le finestre di Chromium e riavvia Chromium per applicare la modifica.</translation> <translation id="421369550622382712">Scopri app, giochi, estensioni e temi straordinari per Chromium.</translation> <translation id="4222580632002216401">Hai eseguito l'accesso a Chromium. La sincronizzazione è stata disattivata dall'amministratore.</translation> <translation id="4224199872375172890">Chromium è aggiornato.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">L'accesso a Chromium è disattivato dall'amministratore del dispositivo.</translation> <translation id="4423735387467980091">Personalizza e controlla Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium verrà riavviato tra un'ora}other{Chromium verrà riavviato tra # ore}}</translation> -<translation id="4458285410772214805">Esci ed esegui di nuovo l'accesso per applicare la modifica.</translation> <translation id="4469812139324097969">Chromium non è aggiornato perché non viene riavviato da un po'. È disponibile un aggiornamento che verrà applicato non appena riavvierai.</translation> <translation id="4488554488975128561">Puoi contribuire a rendere Chromium più sicuro e più facile da utilizzare inviando automaticamente a Google alcune informazioni sul sistema e alcuni contenuti delle pagine per contribuire a rilevare app e siti pericolosi.</translation> <translation id="4567424176335768812">Hai eseguito l'accesso come <ph name="USER_EMAIL_ADDRESS" />. Ora puoi accedere ai tuoi Preferiti, alla tua cronologia e ad altre impostazioni su tutti i tuoi dispositivi su cui esegui l'accesso.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Visualizza Chromium in questa lingua</translation> <translation id="5726838626470692954">Il gestore deve rimuoverti e aggiungerti di nuovo a Chromium.</translation> <translation id="5768914737813585044">Visualizza Chromium OS in questa lingua</translation> -<translation id="5772805321386874569">(è necessario <ph name="BEGIN_BUTTON" />riavviare<ph name="END_BUTTON" /> Chromium)</translation> <translation id="5796460469508169315">Chromium è quasi pronto.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Benvenuto in Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb index a8cc4d3..77550cb 100644 --- a/chrome/app/resources/chromium_strings_iw.xtb +++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">ב-Chromium לא ניתן לקבוע או להגדיר את דפדפן ברירת המחדל</translation> <translation id="1967743265616885482">מודול בעל אותו שם מתנגש עם Chromium.</translation> <translation id="2008474315282236005">הפעולה הזו תמחק פריט אחד מהמכשיר. כדי לשחזר את הנתונים מאוחר יותר, היכנס אל Chromium עם <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">השתמש בהאצת חומרה כשניתן</translation> <translation id="2117378023188580026">לפי בקשת מנהל המערכת, יש להפעיל מחדש את Chromium כדי להחיל את העדכון הזה</translation> <translation id="2119636228670142020">מידע על &מערכת ההפעלה של Chromium</translation> <translation id="2158734852934720349">רישיונות קוד פתוח של מערכת ההפעלה של Chromium</translation> @@ -85,11 +84,9 @@ <translation id="3852700440713538496">הצמד את Chromium לשורת המשימות</translation> <translation id="3889543394854987837">לחץ על השם שלך כדי לפתוח את Chromium ולהתחיל לגלוש.</translation> <translation id="3898493977366060150">גלישה באינטרנט עם Google Smarts</translation> -<translation id="390894725198123737">אם אתה משתמש ב-Mac, ייתכן שסיסמאות יישמרו ב-Keychain שלך, ומשתמשי Chromium אחרים החולקים את חשבון OS X הזה יוכלו לגשת אליהן או לסנכרן אותן.</translation> <translation id="4036079820698952681">דיווח על <ph name="BEGIN_LINK" />ההגדרות הנוכחיות<ph name="END_LINK" /> יעזור לשפר את Chromium</translation> <translation id="4050175100176540509">הגרסה החדשה כוללת שיפורי בטיחות חשובים ותכונות חדשות.</translation> <translation id="407254336480250557">בחר ב-<ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">סגור את כל החלונות של Chromium והפעל אותו מחדש כדי שהשינוי ייכנס לתוקף.</translation> <translation id="421369550622382712">גלה יישומים, משחקים, תוספים ועיצובים מעולים בשביל Chromium.</translation> <translation id="4222580632002216401">אתה מחובר כעת ל-Chromium! הסנכרון הושבת על ידי מנהל המערכת שלך.</translation> <translation id="4224199872375172890">Chromium מעודכן.</translation> @@ -103,7 +100,6 @@ <translation id="4421155425831608516">מנהל המערכת של המכשיר הזה השבית את הכניסה אל Chromium.</translation> <translation id="4423735387467980091">התאם אישית ושלוט ב-Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium יופעל מחדש בעוד שעה}two{Chromium יופעל מחדש בעוד # שעות}many{Chromium יופעל מחדש בעוד # שעות}other{Chromium יופעל מחדש בעוד # שעות}}</translation> -<translation id="4458285410772214805">צא מהמערכת והיכנס שוב כדי שהשינוי ייכנס לתוקף.</translation> <translation id="4469812139324097969">Chromium אינו מעודכן מכיוון שהוא לא הופעל בזמן האחרון. יש עדכון זמין והוא יחול ברגע שתבצע הפעלה מחדש.</translation> <translation id="4488554488975128561">תוכל לעזור בשיפור האבטחה וקלות השימוש של Chromium על-ידי שליחה אוטומטית של חלק מפרטי המערכת ותוכן הדף אל Google כדי לעזור בזיהוי של יישומים ואתרים מסוכנים.</translation> <translation id="4567424176335768812">נכנסת למערכת בתור <ph name="USER_EMAIL_ADDRESS" />. כעת אתה יכול לגשת אל הסימניות, ההיסטוריה והגדרות אחרות שלך בכל המכשירים שבהם אתה מחובר לחשבון.</translation> @@ -138,7 +134,6 @@ <translation id="5698481217667032250">הצג את Chromium בשפה זו</translation> <translation id="5726838626470692954">המנהל שלך צריך להסיר אותך מ-Chromium ולאחר מכן להוסיף אותך חזרה.</translation> <translation id="5768914737813585044">הצג את Chromium OS בשפה זו</translation> -<translation id="5772805321386874569">(נדרש <ph name="BEGIN_BUTTON" />אתחול<ph name="END_BUTTON" /> של Chromium)</translation> <translation id="5796460469508169315">Chromium כמעט מוכן.</translation> <translation id="5820394555380036790">מערכת ההפעלה של Chromium</translation> <translation id="5862307444128926510">ברוכים הבאים ל-Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb index 5b33502..c36b4bb3 100644 --- a/chrome/app/resources/chromium_strings_ja.xtb +++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium では既定のブラウザを判定または設定できません</translation> <translation id="1967743265616885482">同じ名前のモジュールは Chromium と競合することがわかっています。</translation> <translation id="2008474315282236005">この端末から 1 件の項目を削除します。後でデータを取得するには、<ph name="USER_EMAIL" /> として Chromium にログインしてください。</translation> -<translation id="2077129598763517140">ハードウェア アクセラレーションが使用可能な場合は使用する</translation> <translation id="2117378023188580026">管理者が、このアップデートを適用するために Chromium を再起動するよう求めています</translation> <translation id="2119636228670142020">Chromium OS について(&C)</translation> <translation id="2158734852934720349">Chromium OS オープンソース ライセンス</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Chromium をタスクバーにピン留めする</translation> <translation id="3889543394854987837">Chromium を開いてブラウジングを始めるには、名前をクリックしてください。</translation> <translation id="3898493977366060150">Google の最先端技術を活用したウェブ ブラウジング</translation> -<translation id="390894725198123737">Mac では、パスワードはキーチェーンに保存され、この Mac OS X アカウントを共有する別の Chromium ユーザーからアクセスされたり同期されたりする可能性があります。</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />現在の設定<ph name="END_LINK" />を送信して Chromium の品質向上にご協力ください</translation> <translation id="4050175100176540509">最新バージョンに更新すると、重要なセキュリティ更新と新機能が適用されます。</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> を選択します</translation> -<translation id="4077262827416206768">変更内容を反映するには、すべての Chromium ウィンドウを閉じてから Chromium を再起動してください。</translation> <translation id="421369550622382712">Chromium の優れたアプリ、ゲーム、拡張機能、テーマをぜひご利用ください。</translation> <translation id="4222580632002216401">Chromium にログインしています。同期は管理者によって無効にされています。</translation> <translation id="4224199872375172890">Chromium は最新版です。</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Chromium へのログインは、この端末の管理者によって無効にされています。</translation> <translation id="4423735387467980091">Chromium の設定</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium は 1 時間後に再起動されます}other{Chromium は # 時間後に再起動されます}}</translation> -<translation id="4458285410772214805">変更内容を反映するには、一度ログアウトして、もう一度ログインしてください。</translation> <translation id="4469812139324097969">Chromium はしばらく再起動していないため最新ではありません。再起動するとすぐにアップデートが適用されます。</translation> <translation id="4488554488975128561">危険なアプリやサイトの検出に役立てるために一部のシステム情報やページのコンテンツを Google に自動送信して、Chromium の安全性と利便性の向上にご協力ください。</translation> <translation id="4567424176335768812"><ph name="USER_EMAIL_ADDRESS" /> としてログインしています。ログインしているすべてのデバイスで、ブックマーク、履歴、その他の設定にアクセスできます。</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Chromium をこの言語で表示</translation> <translation id="5726838626470692954">Chromium へのユーザーの削除と追加は管理者が行う必要があります。</translation> <translation id="5768914737813585044">Chromium OS をこの言語で表示</translation> -<translation id="5772805321386874569">(Chromium を<ph name="BEGIN_BUTTON" />再起動<ph name="END_BUTTON" />する必要があります)</translation> <translation id="5796460469508169315">もうすぐ Chromium を使用できます。</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Chromium へようこそ</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb index adfeefb63..c850b0a7 100644 --- a/chrome/app/resources/chromium_strings_kn.xtb +++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -11,7 +11,7 @@ <translation id="1298199220304005244">Chromium OS ಅನ್ನು ಬಳಸುತ್ತಿರುವುದರ ಜೊತೆಗೆ ಸಹಾಯವನ್ನು ಪಡೆಯಿರಿ</translation> <translation id="1396446129537741364">Chromium ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ತೋರಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ.</translation> <translation id="1414495520565016063">ನೀವು Chromium ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿರುವಿರಿ!</translation> -<translation id="1444754455097148408">Chromium ಮುಕ್ತ ಮೂಲ ಪರವಾನಗಿಗಳು</translation> +<translation id="1444754455097148408">Chromium ಓಪನ್ ಸೋರ್ಸ್ ಪರವಾನಗಿಗಳು</translation> <translation id="1502360822835740515">Chromium ಅನ್ನು ನಿಮ್ಮ ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಆಗಿಸಿ</translation> <translation id="151962892725702025">ನಿಮ್ಮ ಡೊಮೇನ್ನಲ್ಲಿ ಸಿಂಕ್ ಮಾಡುವ ಸೌಲಭ್ಯವಿಲ್ಲದ ಕಾರಣ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಲು Chromium OS ಗೆ ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ.</translation> <translation id="1585657529869845941">ಇದು ಕಂಡುಬಂದಲ್ಲಿ, <ph name="BEGIN_BOLD" />ಹೇಗಾದರೂ ಬದಲಿಸಿ<ph name="END_BOLD" /> ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ</translation> @@ -29,10 +29,9 @@ <translation id="1966382378801805537">ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಅನ್ನು ನಿರ್ಧರಿಸಲು ಅಥವಾ ಹೊಂದಿಸಲು Chromium ಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ</translation> <translation id="1967743265616885482">ಒಂದೇ ಹೆಸರಿರುವ ಮಾಡ್ಯುಲ್ ಮತ್ತು Chromium ಜೊತೆಗೆ ಘರ್ಷಣೆ ಆಗಬಹುದು.</translation> <translation id="2008474315282236005">ಈ ಸಾಧನದಿಂದ 1 ಐಟಂ ಅನ್ನು ಇದು ಅಳಿಸುತ್ತದೆ. ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಮರುಪಡೆಯಲು, <ph name="USER_EMAIL" /> ನಂತೆ Chromium ಗೆ ಸೈನ್ಇನ್ ಮಾಡಿ.</translation> -<translation id="2077129598763517140">ಲಭ್ಯವಿರುವಾಗ ಹಾರ್ಡ್ವೇರ್ ಆಕ್ಸಲರೇಶನ್ ಬಳಸು</translation> <translation id="2117378023188580026">ಈ ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chromium ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ ಎಂದು ನಿರ್ವಾಹಕ ನಿಮ್ಮನ್ನು ಕೇಳುತ್ತದೆ</translation> <translation id="2119636228670142020">&Chromium OS ಕುರಿತು</translation> -<translation id="2158734852934720349">Chromium OS ಮುಕ್ತ ಮೂಲ ಪರವಾನಗಿಗಳು</translation> +<translation id="2158734852934720349">Chromium OS ಓಪನ್ ಸೋರ್ಸ್ ಪರವಾನಗಿಗಳು</translation> <translation id="2241627712206172106">ನೀವು ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ಹಂಚಿಕೊಂಡರೆ, ಸ್ನೇಹಿತರು ಮತ್ತು ಕುಟುಂಬದವರು ಪ್ರತ್ಯೇಕವಾಗಿ ಬ್ರೌಸ್ ಮಾಡಬಹುದು ಮತ್ತು Chromium ಅನ್ನು ಅವರಿಗೆ ಬೇಕಾದಂತೆ ಹೊಂದಿಸಿಕೊಳ್ಳಬಹುದು.</translation> <translation id="2265088490657775772">ನಿಮ್ಮ iPhone ನಲ್ಲಿ Chromium ಪಡೆದುಕೊಳ್ಳಿ</translation> <translation id="2347108572062610441">ನೀವು Chromium ಪ್ರಾರಂಭಿಸಿದಾಗ ಯಾವ ಪುಟ ತೋರಿಸಬೇಕೆಂಬುದನ್ನು ಈ ವಿಸ್ತರಣೆಯು ಬದಲಾಯಿಸಿದೆ.</translation> @@ -85,11 +84,9 @@ <translation id="3852700440713538496">ನಿಮ್ಮ ಕಾರ್ಯಪಟ್ಟಿಗೆ Chromium ಅನ್ನು ಪಿನ್ ಮಾಡಿ</translation> <translation id="3889543394854987837">Chromium ತೆರೆಯಲು ಮತ್ತು ಬ್ರೌಸ್ ಮಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಲು ನಿಮ್ಮ ಹೆಸರನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ.</translation> <translation id="3898493977366060150">Google ಸ್ಮಾರ್ಟ್ಗಳ ಮೂಲಕ ವೆಬ್ ಬ್ರೌಸ್ ಮಾಡುವಿಕೆ</translation> -<translation id="390894725198123737">Mac ನಲ್ಲಿ, ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಿಮ್ಮ ಕೀಚೈನ್ನಲ್ಲಿ ಉಳಿಸಬಹುದು ಹಾಗೂ ಈ OS X ಖಾತೆಯನ್ನು ಹಂಚಿಕೊಂಡಿರುವ ಇತರ Chromium ಬಳಕೆದಾರರು ಇದನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಅಥವಾ ಸಿಂಕ್ ಮಾಡಬಹುದು.</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />ಪ್ರಸ್ತುತ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು<ph name="END_LINK" /> ವರದಿ ಮಾಡುವ ಮೂಲಕ Chromium ಅನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡಿ</translation> <translation id="4050175100176540509">ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಯಲ್ಲಿ ಪ್ರಮುಖವಾದ ಭದ್ರತಾ ಸುಧಾರಣೆಗಳು ಮತ್ತು ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳು ಲಭ್ಯವಿದೆ.</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> ಆಯ್ಕೆಮಾಡಿ</translation> -<translation id="4077262827416206768">ಎಲ್ಲಾ Chromium ವಿಂಡೋಗಳನ್ನು ದಯವಿಟ್ಟು ಮುಚ್ಚಿರಿ ಮತ್ತು ಈ ಬದಲಾವಣೆಯು ಪರಿಣಾಮವನ್ನು ಬೀರುವುದಕ್ಕಾಗಿ Chromium ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಿ.</translation> <translation id="421369550622382712">Chromium ಗಾಗಿ ಅದ್ಭುತ ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಗೇಮ್ಗಳು, ವಿಸ್ತರಣೆಗಳು ಹಾಗೂ ಥೀಮ್ಗಳನ್ನು ಅನ್ವೇಷಿಸಿ.</translation> <translation id="4222580632002216401">ಇದೀಗ ನೀವು Chromium ಗೆ ಸೈನ್ ಇನ್ ಆಗಿರುವಿರಿ! ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ಸಿಂಕ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation> <translation id="4224199872375172890">Chromium ಅನ್ನು ನವೀಕರಿಸಿದೆ.</translation> @@ -103,7 +100,6 @@ <translation id="4421155425831608516">ಈ ಸಾಧನದ ನಿರ್ವಾಹಕರಿಂದ Chromium ಗೆ ಸೈನ್ ಇನ್ ಆಗುವುದನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation> <translation id="4423735387467980091">Chromium ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ</translation> <translation id="4449801103833300785">{0,plural, =1{ಗಂಟೆಯಲ್ಲಿ Chromium ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{# ಗಂಟೆಯಲ್ಲಿ Chromium ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{# ಗಂಟೆಯಲ್ಲಿ Chromium ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation> -<translation id="4458285410772214805">ದಯವಿಟ್ಟು ಈ ಬದಲಾವಣೆಯು ಕಾರ್ಯಗತವಾಗಲು ಸೈನ್ ಔಟ್ ಮಾಡಿ ಹಾಗೂ ಮತ್ತೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation> <translation id="4469812139324097969">Chromium ಮರುಆರಂಭಿಸದೇ ಇರುವ ಕಾರಣದಿಂದ ಅದರ ಅವಧಿ ಮುಗಿದಿದೆ. ಒಂದು ಅಪ್ಡೇಟ್ ಲಭ್ಯವಿದ್ದು ನೀವು ಮರುಪ್ರಾರಂಭಿಸಿದ ತಕ್ಷಣವೇ ಅದನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="4488554488975128561">ಅಪಾಯಕಾರಿ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಸೈಟ್ಗಳ ಪತ್ತೆಗೆ ಸಹಾಯಮಾಡಲು Google ಗೆ ಕೆಲವು ಸಿಸ್ಟಂ ಮಾಹಿತಿ ಮತ್ತು ಪುಟ ವಿಷಯವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುವ ಮೂಲಕ, ನೀವು Chromium ಅನ್ನು ಬಳಸುವುದಕ್ಕಾಗಿ ಸುರಕ್ಷಿತ ಮತ್ತು ಸರಳವಾಗಿ ಮಾಡಲು ಸಹಾಯ ಮಾಡಬಹುದು.</translation> <translation id="4567424176335768812"><ph name="USER_EMAIL_ADDRESS" /> ನಂತೆ ಸೈನ್ ಇನ್ ಮಾಡಿರುವಿರಿ. ನೀವು ಇದೀಗ ನಿಮ್ಮ ಎಲ್ಲಾ ಸೈನ್ ಇನ್ ಮಾಡಿರುವ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಇತಿಹಾಸ ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಬಹುದು.</translation> @@ -138,7 +134,6 @@ <translation id="5698481217667032250">ಈ ಭಾಷೆಯಲ್ಲಿ Chromium ಪ್ರದರ್ಶಿಸು</translation> <translation id="5726838626470692954">ನಿಮ್ಮ ಮ್ಯಾನೇಜರ್ ನಿಮ್ಮನ್ನು ತೆಗೆದುಹಾಕಿ ಮತ್ತು ಮರಳಿ Chromium ಗೆ ಸೇರಿಸಬೇಕು.</translation> <translation id="5768914737813585044">ಈ ಭಾಷೆಯಲ್ಲಿ Chromium OS ಪ್ರದರ್ಶಿಸು</translation> -<translation id="5772805321386874569">(Chromium <ph name="BEGIN_BUTTON" />ಮರುಪ್ರಾರಂಭ<ph name="END_BUTTON" /> ಅಗತ್ಯವಿದೆ)</translation> <translation id="5796460469508169315">Chromium ಬಹುತೇಕ ಸಿದ್ಧಗೊಂಡಿದೆ.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Chromium ಗೆ ಸುಸ್ವಾಗತ</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb index 0c61c20..650094f 100644 --- a/chrome/app/resources/chromium_strings_ko.xtb +++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium에서 기본 브라우저를 확인하거나 설정할 수 없습니다.</translation> <translation id="1967743265616885482">같은 이름의 모듈이 Chromium과 충돌하는 것으로 알려져 있습니다.</translation> <translation id="2008474315282236005">항목 1개가 기기에서 삭제됩니다. 나중에 데이터를 가져오려면 Chromium에 <ph name="USER_EMAIL" />(으)로 로그인하세요.</translation> -<translation id="2077129598763517140">가능한 경우 하드웨어 가속 사용</translation> <translation id="2117378023188580026">관리자가 이 업데이트를 적용하려면 사용자가 Chromium을 다시 시작하도록 설정했습니다.</translation> <translation id="2119636228670142020">Chromium OS 정보</translation> <translation id="2158734852934720349">Chromium OS 오픈소스 라이선스</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">Chromium을 작업 표시줄에 고정</translation> <translation id="3889543394854987837">Chromium을 열고 탐색을 시작하려면 내 이름을 클릭하세요.</translation> <translation id="3898493977366060150">Google과 스마트하게 웹을 탐색하세요</translation> -<translation id="390894725198123737">Mac에서는 비밀번호가 키체인에 저장되어 이 OS X 계정을 공유하는 다른 Chromium 사용자가 액세스하거나 동기화할 수 있습니다.</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />현재 설정<ph name="END_LINK" />을 보고하여 Chromium 개선에 참여</translation> <translation id="4050175100176540509">최신 버전에는 중요한 보안 개선사항 및 새로운 기능이 포함되어 있습니다.</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /><ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> 선택</translation> -<translation id="4077262827416206768">모든 Chromium 창을 닫은 뒤 다시 Chromium을 실행하면 변경 사항이 반영됩니다.</translation> <translation id="421369550622382712">Chromium에 유용한 앱, 게임, 확장 프로그램, 테마를 찾아보세요.</translation> <translation id="4222580632002216401">Chromium에 로그인했습니다! 관리자가 동기화를 사용 중지했습니다.</translation> <translation id="4224199872375172890">Chromium이 최신 버전입니다.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">이 기기의 관리자에 의해 Chromium 로그인이 사용 중지되었습니다.</translation> <translation id="4423735387467980091">Chromium 맞춤설정 및 제어</translation> <translation id="4449801103833300785">{0,plural, =1{1시간 후에 Chromium 다시 시작}other{#시간 후에 Chromium 다시 시작}}</translation> -<translation id="4458285410772214805">변경사항을 적용하려면 로그아웃했다가 다시 로그인하세요.</translation> <translation id="4469812139324097969">한동안 사용하지 않아 Chromium의 버전이 오래되었습니다. 업데이트를 사용할 수 있으며 다시 시작하면 바로 업데이트됩니다.</translation> <translation id="4488554488975128561">위험한 앱과 사이트를 감지할 수 있도록 일부 시스템 정보와 페이지 콘텐츠를 Google로 자동 전송함으로써 Chromium을 더 안전하고 편리하게 사용할 수 있습니다.</translation> <translation id="4567424176335768812"><ph name="USER_EMAIL_ADDRESS" />(으)로 로그인되어 있습니다. 이제 로그인한 모든 기기에서 북마크, 방문 기록 및 기타 설정에 액세스할 수 있습니다.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">이 언어로 Chromium 표시</translation> <translation id="5726838626470692954">관리자가 나를 삭제한 후 다시 Chromium에 추가해야 합니다.</translation> <translation id="5768914737813585044">이 언어로 Chromium OS 표시</translation> -<translation id="5772805321386874569">(Chromium을 <ph name="BEGIN_BUTTON" />다시 시작<ph name="END_BUTTON" />해야 함)</translation> <translation id="5796460469508169315">Chromium 준비가 거의 완료되었습니다.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Chromium에 오신 것을 환영합니다.</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb index 356cd08..1f837cc 100644 --- a/chrome/app/resources/chromium_strings_lt.xtb +++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">„Chromium“ nepavyko aptikti arba nustatyti numatytosios naršyklės</translation> <translation id="1967743265616885482">Modulis tokiu pačiu pavadinimu žinomas kaip prieštaraujantis „Chromium“.</translation> <translation id="2008474315282236005">Atlikus šį veiksmą iš šio įrenginio bus ištrintas 1 elementas. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chromium“ kaip <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Kai galima, naudoti aparatinės įrangos paspartinimą</translation> <translation id="2117378023188580026">Administratorius prašo paleisti iš naujo „Chromium“, kad galėtų pritaikyti šį naujinį</translation> <translation id="2119636228670142020">Apie &„Chromium“ OS</translation> <translation id="2158734852934720349">„Chromium“ OS atvirojo šaltinio licencijos</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">„Chromium“ prisegimas prie užduočių juostos</translation> <translation id="3889543394854987837">Spustelėkite savo vardą, kad atidarytumėte „Chromium“ ir pradėtumėte naršyti.</translation> <translation id="3898493977366060150">Žiniatinklio naršymas naudojant „Google“ išmaniąsias funkcijas</translation> -<translation id="390894725198123737">„Mac“ kompiuteriuose slaptažodžiai gali būti išsaugoti naudojant „Keychain“, o juos gali pasiekti arba sinchronizuoti kiti „Chromium“ naudotojai, bendrai naudojantys šią „OS X“ paskyrą.</translation> <translation id="4036079820698952681">Padėkite tobulinti „Chromium“ pateikę ataskaitą apie <ph name="BEGIN_LINK" />dabartinius nustatymus<ph name="END_LINK" />.</translation> <translation id="4050175100176540509">Naujausios versijos programoje įdiegti svarbūs saugos patobulinimai ir pasiekiamos naujos funkcijos.</translation> <translation id="407254336480250557">Pasirinkite <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Uždarykite visus „Chromium“ langus ir iš naujo paleiskite „Chromium“, kad šis pakeitimas pradėtų galioti.</translation> <translation id="421369550622382712">Atraskite puikių „Chromium“ programų, žaidimų, plėtinių ir temų.</translation> <translation id="4222580632002216401">Dabar esate prisijungę prie „Chromium“. Administratorius neleidžia sinchronizuoti.</translation> <translation id="4224199872375172890">„Chromium“ naujausios versijos.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">Prisijungimo prie „Chromium“ funkciją išjungė šio įrenginio administratorius.</translation> <translation id="4423735387467980091">Tinkinkite ir valdykite „Chromium“</translation> <translation id="4449801103833300785">{0,plural, =1{„Chromium“ bus paleista iš naujo po valandos}one{„Chromium“ bus paleista iš naujo po # valandos}few{„Chromium“ bus paleista iš naujo po # valandų}many{„Chromium“ bus paleista iš naujo po # valandos}other{„Chromium“ bus paleista iš naujo po # valandų}}</translation> -<translation id="4458285410772214805">Atsijunkite ir prisijunkite iš naujo, kad šis pakeitimas būtų pritaikytas.</translation> <translation id="4469812139324097969">„Chromium“ pasenusi, nes kurį laiką nebuvo paleista iš naujo. Naujinys pasiekiamas ir jis bus pritaikytas, kai paleisite „Chromium“ iš naujo.</translation> <translation id="4488554488975128561">Galite padėti sustiprinti „Chromium“ saugą ir palengvinti jos naudojimą automatiškai „Google“ siųsdami tam tikrą sistemos informaciją ir puslapių turinį, kad padėtumėte aptikti pavojingas programas ir svetaines.</translation> <translation id="4567424176335768812">Esate prisijungę kaip <ph name="USER_EMAIL_ADDRESS" />. Dabar galite pasiekti savo žymes, istoriją ir kitus nustatymus visuose įrenginiuose, kuriuose esate prisijungę.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">Pateikti „Chromium“ šia kalba</translation> <translation id="5726838626470692954">Valdytojas turi jus pašalinti ir vėl pridėti prie „Chromium“.</translation> <translation id="5768914737813585044">Pateikti „Chromium“ OS šia kalba</translation> -<translation id="5772805321386874569">(„Chromium“ būtina <ph name="BEGIN_BUTTON" />paleisti iš naujo<ph name="END_BUTTON" />)</translation> <translation id="5796460469508169315">„Chromium“ beveik paruošta.</translation> <translation id="5820394555380036790">„Chromium“ OS</translation> <translation id="5862307444128926510">Sveiki, tai „Chromium“</translation>
diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb index f302924..3d66293 100644 --- a/chrome/app/resources/chromium_strings_lv.xtb +++ b/chrome/app/resources/chromium_strings_lv.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium nevar noteikt vai iestatīt noklusējuma pārlūku.</translation> <translation id="1967743265616885482">Ir zināms, ka modulis ar tādu pašu nosaukumu konfliktē ar Chromium.</translation> <translation id="2008474315282236005">Veicot šo darbību, no šīs ierīces tiks dzēsts 1 vienums. Lai vēlāk izgūtu datus, pierakstieties pārlūkā Chromium kā <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Izmantot aparatūras paātrināšanas režīmu, kad tas ir pieejams</translation> <translation id="2117378023188580026">Lai lietotu šo atjauninājumu, administrators lūdz restartēt pārlūku Chromium.</translation> <translation id="2119636228670142020">Par &Chromium OS</translation> <translation id="2158734852934720349">Chromium OS atklātā pirmkoda licences</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Piespraudiet pārlūku Chromium uzdevumjoslai</translation> <translation id="3889543394854987837">Noklikšķiniet uz sava vārda, lai atvērtu Chromium un sāktu pārlūkošanu.</translation> <translation id="3898493977366060150">Tīmekļa pārlūkošana, izmantojot Google viedās tehnoloģijas</translation> -<translation id="390894725198123737">Operētājsistēmā Mac paroles var tikt saglabātas sistēmā Keychain, un citi Chromium lietotāji, kuri koplieto šo OS X kontu, var piekļūt tām un sinhronizēt tās.</translation> <translation id="4036079820698952681">Palīdziet uzlabot pārlūku Chromium, ziņojot par <ph name="BEGIN_LINK" />pašreizējiem iestatījumiem<ph name="END_LINK" />.</translation> <translation id="4050175100176540509">Jaunākajā versijā ir pieejami svarīgi drošības uzlabojumi un jaunas funkcijas.</translation> <translation id="407254336480250557">Atlasiet <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Aizveriet visus Chromium logus un atkārtoti palaidiet Chromium, lai šīs izmaiņas stātos spēkā.</translation> <translation id="421369550622382712">Atklājiet lieliskas lietotnes, spēles, paplašinājumus un motīvus, ko varat izmantot pārlūkā Chromium.</translation> <translation id="4222580632002216401">Jūs esat pierakstījies operētājsistēmā Chromium. Jūsu administrators ir atspējojis sinhronizēšanu.</translation> <translation id="4224199872375172890">Chromium ir atjaunināts.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Šīs ierīces administrators ir atspējojis pierakstīšanos pārlūkā Chromium.</translation> <translation id="4423735387467980091">Pielāgot un kontrolēt Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium tiks palaists atkārtoti pēc stundas}zero{Chromium tiks palaists atkārtoti pēc # stundām}one{Chromium tiks palaists atkārtoti pēc # stundas}other{Chromium tiks palaists atkārtoti pēc # stundām}}</translation> -<translation id="4458285410772214805">Lūdzu, izrakstieties un pierakstieties vēlreiz, lai šīs izmaiņas stātos spēkā.</translation> <translation id="4469812139324097969">Pārlūks Chromium ir novecojis, jo jau kādu laiku tas nav restartēts. Atjauninājums ir pieejams un tiks lietots, tiklīdz veiksiet atkārtotu palaišanu.</translation> <translation id="4488554488975128561">Varat palīdzēt uzlabot Chromium drošību un lietošanas ērtumu, automātiski nosūtot noteiktu sistēmas informāciju un lapas saturu Google serveriem, lai palīdzētu noteikt bīstamas lietotnes un vietnes.</translation> <translation id="4567424176335768812">Jūs esat pierakstījies kā <ph name="USER_EMAIL_ADDRESS" />. Tagad varat piekļūt savām grāmatzīmēm, vēsturei un citiem iestatījumiem visās ierīcēs, kurās esat pierakstījies.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Rādīt Chromium šajā valodā</translation> <translation id="5726838626470692954">Jūsu konta pārzinim ir jānoņem jūs no pārlūka Chromium un atkal jāpievieno.</translation> <translation id="5768914737813585044">Rādīt Chromium OS šajā valodā</translation> -<translation id="5772805321386874569">(ir <ph name="BEGIN_BUTTON" />jārestartē<ph name="END_BUTTON" /> operētājsistēma Chromium)</translation> <translation id="5796460469508169315">Chromium ir gandrīz gatavs!</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Laipni lūdzam pārlūkā Chromium!</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index d647232..eadcba5 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium-ത്തിന് ഡിഫോൾട്ട് ബ്രൗസർ നിർണ്ണയിക്കാനോ സജ്ജമാക്കാനോ കഴിയില്ല</translation> <translation id="1967743265616885482">സമാന നാമത്തിലുള്ള ഒരു മൊഡ്യൂൾ Chromium-മായി വൈരുദ്ധ്യം പുലർത്തുന്നതിന് അറിയപ്പെട്ടതാണ്.</translation> <translation id="2008474315282236005">ഇത് ഈ ഉപകരണത്തിൽ നിന്നും ഒരിനം ഇല്ലാതാക്കും. പിന്നീട് നിങ്ങളുടെ വിവരങ്ങൾ വീണ്ടെടുക്കാൻ, <ph name="USER_EMAIL" /> എന്നയാളായി Chromium-ത്തിൽ സൈൻ ഇൻ ചെയ്യുക.</translation> -<translation id="2077129598763517140">ലഭ്യമാകുമ്പോൾ ഹാർഡ്വെയർ ത്വരിതപ്പെടുത്തൽ ഉപയോഗിക്കുക</translation> <translation id="2117378023188580026">ഈ അപ്ഡേറ്റ് പ്രയോഗിക്കുന്നതിന് Chromium വീണ്ടും സമാരംഭിക്കാൻ നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ ആവശ്യപ്പെടുന്നു</translation> <translation id="2119636228670142020">&Chromium OS-നെക്കുറിച്ച്</translation> <translation id="2158734852934720349">Chromium OS ഓപ്പൺ സോഴ്സ് ലൈസൻസുകൾ</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">Chromium-ത്തെ നിങ്ങളുടെ ടാസ്ക്ബാറിൽ പിൻ ചെയ്യുക</translation> <translation id="3889543394854987837">Chromium തുറന്ന് ബ്രൗസിംഗ് ആരംഭിക്കാൻ നിങ്ങളുടെ പേരിൽ ക്ലിക്കുചെയ്യുക.</translation> <translation id="3898493977366060150">Google ഉപയോഗിച്ചുള്ള വെബ് ബ്രൗസിംഗ് മികവുറ്റതാണ്</translation> -<translation id="390894725198123737">Mac-ൽ പാസ്വേഡുകൾ നിങ്ങളുടെ കീചെയിനിൽ സംരക്ഷിക്കാം ഒപ്പം ഈ OS X അക്കൗണ്ട് പങ്കിടുന്ന മറ്റ് Chromium ഉപയോക്താക്കൾക്ക് ഇത് ആക്സസ്സ് ചെയ്യാനോ സമന്വയിപ്പിക്കാനോ കഴിഞ്ഞേക്കാം.</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />നിലവിലെ ക്രമീകരണം<ph name="END_LINK" /> റിപ്പോർട്ടുചെയ്തുകൊണ്ട് Chromium മികച്ചതാക്കാൻ സഹായിക്കുക</translation> <translation id="4050175100176540509">ഏറ്റവും പുതിയ പതിപ്പിൽ പ്രധാനപ്പെട്ട സുരക്ഷ മെച്ചപ്പെടുത്തലുകളും പുതിയ ഫീച്ചറുകളും ലഭ്യമാണ്.</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> തിരഞ്ഞെടുക്കുക</translation> -<translation id="4077262827416206768">ഈ മാറ്റം പ്രാബല്യത്തിൽ വരുന്നതിനായി എല്ലാ Chromium വിൻഡോകളും അടച്ചതിനുശേഷം വീണ്ടും സമാരംഭിക്കുക.</translation> <translation id="421369550622382712">Chromium-നായി മികച്ച അപ്ലിക്കേഷനുകളും വിപുലീകരണങ്ങളും തീമുകളും കണ്ടെത്തുക.</translation> <translation id="4222580632002216401">നിങ്ങൾ ഇപ്പോൾ Chromium-ലേക്ക് സൈൻ ഇൻ ചെയ്തു! നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ സമന്വയം പ്രവർത്തനരഹിതമാക്കി.</translation> <translation id="4224199872375172890">Chromium കാലികമാണ്.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">Chromium-ത്തിലെ സൈൻ ഇൻ ചെയ്യൽ, ഈ ഉപകരണത്തിന്റെ അഡ്മിനിസ്ട്രേറ്റർ പ്രവർത്തനരഹിതമാക്കി.</translation> <translation id="4423735387467980091">Chromium ഇഷ്ടാനുസൃതമാക്കുക, നിയന്ത്രിക്കുക</translation> <translation id="4449801103833300785">{0,plural, =1{ഒരു മണിക്കൂറിനുള്ളിൽ Chromium വീണ്ടും സമാരംഭിക്കും}other{# മണിക്കൂറിനുള്ളിൽ Chromium വീണ്ടും സമാരംഭിക്കും}}</translation> -<translation id="4458285410772214805">ഈ മാറ്റം പ്രാബല്യത്തിൽ വരുന്നതിന് സൈൻ ഔട്ട് ചെയ്ത് വീണ്ടും സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="4469812139324097969">അൽപ്പസമയത്തിനുള്ളിൽ വീണ്ടും ആരംഭിക്കാത്തതിനാൽ Chromium കാലഹരണപ്പെട്ടു. അപ്ഡേറ്റ് ലഭ്യമായതിനാൽ നിങ്ങൾ വീണ്ടും ആരംഭിച്ചയുടനെ അത് അപ്ഡേറ്റുചെയ്യും.</translation> <translation id="4488554488975128561">അപകടകരമായ ആപ്സുകളെയും സൈറ്റുകളെയും തിരിച്ചറിയാൻ സഹായിക്കുന്ന ചില സിസ്റ്റം വിവരങ്ങളും പേജ് ഉള്ളടക്കവും സ്വയമേവ Google-ന് അയയ്ക്കുന്നതിലൂടെ നിങ്ങൾക്ക് Chromium-ത്തിന്റെ ഉപയോഗം കൂടുതൽ സുരക്ഷിതവും എളുപ്പവുമാക്കാൻ സഹായിക്കാം.</translation> <translation id="4567424176335768812">നിങ്ങൾ <ph name="USER_EMAIL_ADDRESS" /> ആയി സൈൻ ഇൻ ചെയ്തിരിക്കുന്നു. സൈൻ ഇൻ ചെയ്തിരിക്കുന്ന എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്മാർക്കുകളും ചരിത്രവും മറ്റ് ക്രമീകരണങ്ങളും ആക്സസ്സുചെയ്യാൻ ഇപ്പോൾ നിങ്ങൾക്കാകും.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">ഈ ഭാഷയിൽ Chromium പ്രദർശിപ്പിക്കുക</translation> <translation id="5726838626470692954">നിങ്ങളുടെ മാനേജർ നിങ്ങളെ നീക്കംചെയ്ത് Chromium-ത്തിലേക്ക് തിരികെ ചേർക്കേണ്ടതാണ്.</translation> <translation id="5768914737813585044">ഈ ഭാഷയിൽ Chromium OS പ്രദർശിപ്പിക്കുക</translation> -<translation id="5772805321386874569">( Chromium <ph name="BEGIN_BUTTON" />പുനരാരംഭിക്കൽ<ph name="END_BUTTON" /> ആവശ്യമാണ്)</translation> <translation id="5796460469508169315">Chromium ഏകദേശം തയാറായിക്കഴിഞ്ഞു.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Chromium-ത്തിലേക്ക് സ്വാഗതം</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb index cc19354..ddf781f 100644 --- a/chrome/app/resources/chromium_strings_mr.xtb +++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -30,7 +30,6 @@ <translation id="1966382378801805537">Chromium डीफॉल्ट ब्राउझर निर्धारित किंवा सेट करू शकत नाही</translation> <translation id="1967743265616885482">यासारख्या नावाचे मॉड्यूल Chromium बरोबर विरोधाकरिता ओळखले जाते.</translation> <translation id="2008474315282236005">हे या डिव्हाइस मधून 1 आयटम हटवेल. नंतर आपला डेटा पुनर्प्राप्त करण्यासाठी, Chromium मध्ये <ph name="USER_EMAIL" /> म्हणून साइन इन करा.</translation> -<translation id="2077129598763517140">उपलब्ध असेल तेव्हा हार्डवेअर ऍक्सीलरेशन वापरा</translation> <translation id="2117378023188580026">हे अपडेट लागू करण्यासाठी तुमच्या अॅडमिनिस्ट्रेटरने तुम्हाला Chromium पुन्हा लाँच करण्यास सांगितले आहे</translation> <translation id="2119636228670142020">&Chromium OS बद्दल</translation> <translation id="2158734852934720349">Chromium OS खुला स्त्रोत परवाने</translation> @@ -88,11 +87,9 @@ <translation id="3852700440713538496">Chromium ला आपल्या टास्कबारवर पिन करा</translation> <translation id="3889543394854987837">Chromium उघडण्यासाठी आपले नाव क्लिक करा आणि ब्राउझिंग प्रारंभ करा.</translation> <translation id="3898493977366060150">Google smarts सह वेब ब्राउझिंग</translation> -<translation id="390894725198123737">Mac वर, पासवर्ड हे आपल्या किचेनमध्ये सेव्ह केले जातात आणि हे OS X खाते सामायिक करून इतर Chromium वापरकर्त्यांकडून त्यामध्ये प्रवेश केला जाऊ शकतो किंवा संकालित केले जाऊ शकतात.</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />वर्तमान सेटिंग्ज<ph name="END_LINK" /> चा अहवाल देऊन Chromium उत्कृष्ट बनविण्यात मदत करा</translation> <translation id="4050175100176540509">नवीनतम आवृत्तीमध्ये महत्त्वाच्या सुरक्षितता सुधारणा आणि नवीन वैशिष्ट्ये उपलब्ध आहेत.</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /> निवडा</translation> -<translation id="4077262827416206768">कृपया हा बदल प्रभावी होण्यासाठी सर्व Chromium विंडो बंद करा आणि Chromium पुन्हा लाँच करा.</translation> <translation id="421369550622382712">Chromium साठी उत्कृष्ट अॅप्स, गेम, विस्तार आणि थीम शोधा</translation> <translation id="4222580632002216401">आपण आता Chromium वर साइन इन केले आहे! आपल्या प्रशासकाद्वारे संकालन अक्षम केले गेले आहे.</translation> <translation id="4224199872375172890">Chromium अद्ययावत आहे.</translation> @@ -106,7 +103,6 @@ <translation id="4421155425831608516">या डीव्हाइसच्या प्रशासकाने Chromium मध्ये साइन इन बंद केले आहे.</translation> <translation id="4423735387467980091">Chromium सानुकूल करा आणि नियंत्रित करा</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium एका तासात रीलाँच होईल}one{Chromium # तासामध्ये पुन्हा रीलाँच होईल}other{Chromium # तासांमध्ये पुन्हा रीलाँच होईल}}</translation> -<translation id="4458285410772214805">कृपया हा बदल प्रभावी होण्यासाठी साइन आउट करा आणि साइन इन करा.</translation> <translation id="4469812139324097969">Chromium कालबाह्य झाले आहे कारण हे काही क्षणात पुन्हा लाँच झाले नाही. एक अपडेट उपलब्ध आहे आणि आपण पुन्हा लाँच केल्यावर ते लगेच लागू होईल.</translation> <translation id="4488554488975128561">धोकादायम अॅप्स आणि साइट शोधण्यात मदत करण्यासाठी Google ला काही सिस्टम माहिती आणि पृष्ठ सामग्री स्वयंचलितपणे पाठवून आपण Chromium सुरक्षित आणि वापरण्यास सुलभ बनविण्यात मदत करू शकता.</translation> <translation id="4567424176335768812">आपण <ph name="USER_EMAIL_ADDRESS" /> म्हणून साइन इन केले आहे. आता आपण आपल्या सर्व साइन इन केलेल्या डिव्हाइसेसवरील आपल्या बुकमार्क, इतिहास आणि अन्य सेटिंग्जवर प्रवेश करू शकता.</translation> @@ -141,7 +137,6 @@ <translation id="5698481217667032250">Chromium या भाषेत प्रदर्शित करा</translation> <translation id="5726838626470692954">आपल्या व्यवस्थापकाने आपल्याला Chromium वरून काढणे आणि परत जोडणे आवश्यक आहे.</translation> <translation id="5768914737813585044">Chromium OS या भाषेत प्रदर्शित करा</translation> -<translation id="5772805321386874569">(Chromium <ph name="BEGIN_BUTTON" />रीस्टार्ट<ph name="END_BUTTON" /> करणे आवश्यक)</translation> <translation id="5796460469508169315">Chromium जवळजवळ तयार आहे</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Chromium वर आपले स्वागत आहे</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb index 2510517..753cebb 100644 --- a/chrome/app/resources/chromium_strings_ms.xtb +++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium tidak dapat menentukan atau menetapkan penyemak imbas lalai</translation> <translation id="1967743265616885482">Modul dengan nama yang sama telah diketahui bercanggah dengan Chromium.</translation> <translation id="2008474315282236005">Tindakan ini akan memadamkan 1 item daripada peranti ini. Untuk mendapatkan kembali data anda kemudian, log masuk ke Chromium sebagai <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Gunakan pecutan perkakasan apabila tersedia</translation> <translation id="2117378023188580026">Pentadbir anda meminta anda melancarkan semula Chromium untuk menggunakan kemas kini ini</translation> <translation id="2119636228670142020">Mengenai &Chromium OS</translation> <translation id="2158734852934720349">Lesen sumber terbuka Chromium OS</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Sematkan Chromium pada bar tugas anda</translation> <translation id="3889543394854987837">Klik nama anda untuk membuka Chromium dan mula menyemak imbas.</translation> <translation id="3898493977366060150">Penyemakan imbas web dengan Google smarts</translation> -<translation id="390894725198123737">Pada Mac, kata laluan boleh disimpan pada Keychain anda dan boleh diakses atau disegerakkan oleh pengguna Chromium lain yang berkongsi akaun OS X ini.</translation> <translation id="4036079820698952681">Bantu jadikan Chromium lebih baik dengan melaporkan <ph name="BEGIN_LINK" />tetapan semasa<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Peningkatan keselamatan penting dan ciri baharu tersedia dalam versi terkini.</translation> <translation id="407254336480250557">Pilih <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Sila tutup semua tetingkap Chromium dan lancarkan semula Chromium agar perubahan ini boleh dilaksanakan.</translation> <translation id="421369550622382712">Temui apl, permainan, sambungan dan tema yang hebat untuk Chromium.</translation> <translation id="4222580632002216401">Anda kini sedang log masuk ke Chromium! Penyegerakan dilumpuhkan oleh pentadbir anda.</translation> <translation id="4224199872375172890">Chromium telah dikemas kini</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Log masuk ke Chromium dilumpuhkan oleh pentadbir peranti ini.</translation> <translation id="4423735387467980091">Sesuaikan dan kawal Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium akan dilancarkan semula dalam masa sejam}other{Chromium akan dilancarkan semula dalam masa # jam}}</translation> -<translation id="4458285410772214805">Sila log keluar dan log masuk semula supaya perubahan ini boleh dilaksanakan.</translation> <translation id="4469812139324097969">Chromium sudah usang kerana telah lama tidak dilancarkan. Terdapat kemas kini tersedia dan akan digunakan sebaik sahaja anda melancarkannya semula.</translation> <translation id="4488554488975128561">Anda boleh membantu menjadikan Chromium lebih selamat dan mudah digunakan dengan menghantar secara automatik beberapa maklumat sistem dan kandungan halaman kepada Google untuk membantu mengesan apl dan tapak yang berbahaya.</translation> <translation id="4567424176335768812">Anda telah log masuk sebagai <ph name="USER_EMAIL_ADDRESS" />. Sekarang anda boleh mengakses penanda halaman, sejarah dan tetapan anda yang lain pada semua peranti yang anda gunakan untuk log masuk.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Paparkan Chromium dalam bahasa ini</translation> <translation id="5726838626470692954">Pengurus anda mesti mengalih keluar dan menambahkan anda kembali pada Chromium.</translation> <translation id="5768914737813585044">Paparkan OS Chromium dalam bahasa ini</translation> -<translation id="5772805321386874569">(memerlukan Chromium <ph name="BEGIN_BUTTON" />dimulakan semula<ph name="END_BUTTON" />)</translation> <translation id="5796460469508169315">Chromium hampir sedia.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Selamat datang ke Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb index 96e7599..4a54053 100644 --- a/chrome/app/resources/chromium_strings_nl.xtb +++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium kan de standaardbrowser niet bepalen of instellen</translation> <translation id="1967743265616885482">Van een module met dezelfde naam is bekend dat deze conflicteert met Chromium.</translation> <translation id="2008474315282236005">Hiermee wordt 1 item verwijderd van dit apparaat. Als je je gegevens later wilt terughalen, log je in bij Chromium als <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Hardwareversnelling gebruiken indien beschikbaar</translation> <translation id="2117378023188580026">Je beheerder vraagt je Chromium opnieuw te starten om deze update toe te passen</translation> <translation id="2119636228670142020">Over &Chromium OS</translation> <translation id="2158734852934720349">Open-sourcelicenties van Chromium OS</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">Chromium vastzetten op je taakbalk</translation> <translation id="3889543394854987837">Klik op je naam om Chromium te openen en begin met surfen.</translation> <translation id="3898493977366060150">Browsen met innovaties van Google</translation> -<translation id="390894725198123737">Wachtwoorden kunnen op de Mac worden opgeslagen in je sleutelhanger en worden geopend of gesynchroniseerd door andere Chromium-gebruikers die dit OS X-account delen.</translation> <translation id="4036079820698952681">Help Chromium beter te maken door de <ph name="BEGIN_LINK" />huidige instellingen<ph name="END_LINK" /> te melden</translation> <translation id="4050175100176540509">Er zijn belangrijke beveiligingsverbeteringen en nieuwe functies beschikbaar in de nieuwste versie.</translation> <translation id="407254336480250557">Selecteer <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Sluit alle Chromium-vensters en start Chromium opnieuw om de wijziging toe te passen.</translation> <translation id="421369550622382712">Ontdek fantastische apps, games, extensies en thema's voor Chromium.</translation> <translation id="4222580632002216401">Je bent nu ingelogd bij Chromium! Synchronisatie is uitgeschakeld door je beheerder.</translation> <translation id="4224199872375172890">Chromium is bijgewerkt.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">Inloggen bij Chromium is uitgeschakeld door de beheerder van dit apparaat.</translation> <translation id="4423735387467980091">Chromium aanpassen en beheren</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium wordt over een uur opnieuw gestart}other{Chromium wordt over # uur opnieuw gestart}}</translation> -<translation id="4458285410772214805">Log uit en log weer in om deze wijziging door te voeren.</translation> <translation id="4469812139324097969">Chromium is verouderd omdat het programma al een tijd niet opnieuw is gestart. Er is een update beschikbaar die wordt toegepast zodra je het programma opnieuw start.</translation> <translation id="4488554488975128561">Je kunt helpen Chromium veiliger en gebruiksvriendelijker te maken door automatisch bepaalde systeeminformatie en paginacontent naar Google te verzenden om te helpen bij de detectie van gevaarlijke apps en sites.</translation> <translation id="4567424176335768812">Je bent ingelogd als <ph name="USER_EMAIL_ADDRESS" />. Je hebt nu toegang tot je bladwijzers, geschiedenis en andere instellingen op al je apparaten waarop je bent ingelogd.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">Chromium weergeven in deze taal</translation> <translation id="5726838626470692954">Je beheerder moet je uit Chromium verwijderen en vervolgens weer toevoegen.</translation> <translation id="5768914737813585044">Chromium OS weergeven in deze taal</translation> -<translation id="5772805321386874569">(je moet Chromium <ph name="BEGIN_BUTTON" />opnieuw starten<ph name="END_BUTTON" />)</translation> <translation id="5796460469508169315">Chromium is bijna klaar.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Welkom bij Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb index c07a2bc..3bd95a8c 100644 --- a/chrome/app/resources/chromium_strings_no.xtb +++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium kan ikke fastslå eller angi standardnettleseren</translation> <translation id="1967743265616885482">Vi har tidligere lagt merke til at en modul med det samme navnet, har kommet i konflikt med Chromium.</translation> <translation id="2008474315282236005">Dette sletter 1 element fra denne enheten. For å hente dataene dine igjen senere må du logge på Chromium som <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Bruk maskinvareakselerasjon når det er tilgjengelig</translation> <translation id="2117378023188580026">Administratoren din ber deg om å starte Chromium på nytt for at denne oppdateringen skal tas i bruk</translation> <translation id="2119636228670142020">Om &Chromium OS</translation> <translation id="2158734852934720349">Åpen kildekode-lisenser for Chromium OS</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Fest Chromium til oppgavelinjen</translation> <translation id="3889543394854987837">Klikk på navnet ditt for å åpne Chromium og starte surfingen.</translation> <translation id="3898493977366060150">Surfing med Googles smarte funksjoner</translation> -<translation id="390894725198123737">På Mac kan det hende at passord blir lagret i nøkkelringen. Andre Chromium-brukere som deler denne OS X-kontoen, har i så fall adgang til og kan synkronisere med disse passordene.</translation> <translation id="4036079820698952681">Bidra til å gjøre Chromium bedre ved å rapportere de <ph name="BEGIN_LINK" />nåværende innstillingene<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Viktige sikkerhetsforbedringer og nye funksjoner er tilgjengelige i den nyeste versjonen.</translation> <translation id="407254336480250557">Velg <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Lukk alle Chromium-vinduer og start Chromium på nytt for at denne endringen skal tre i kraft.</translation> <translation id="421369550622382712">Oppdag flotte apper, spill, utvidelser og temaer for Chromium.</translation> <translation id="4222580632002216401">Du er nå logget på Chromium. Synkronisering er deaktivert av administratoren din.</translation> <translation id="4224199872375172890">Chromium er oppdatert.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Administratoren av denne enheten har deaktivert pålogging til Chromium.</translation> <translation id="4423735387467980091">Tilpass og kontrollér Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium startes på nytt om én time}other{Chromium startes på nytt om # timer}}</translation> -<translation id="4458285410772214805">Logg deg av og så på igjen for at denne endringen skal tre i kraft.</translation> <translation id="4469812139324097969">Chromium er utdatert fordi den ikke har vært startet på nytt på en stund. En oppdatering er tilgjengelig og tas i bruk når du starter Chromium på nytt.</translation> <translation id="4488554488975128561">Du kan bidra til å gjøre Chromium tryggere og enklere å bruke ved å sende Google noe systeminformasjon og sideinnhold automatisk. Dette hjelper oss med å oppdage farlige apper og nettsteder.</translation> <translation id="4567424176335768812">Du er logget på som <ph name="USER_EMAIL_ADDRESS" />. Nå kan du bruke bokmerkene, loggen og andre innstillinger på alle enhetene du er logget på.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Vis Chromium på dette språket</translation> <translation id="5726838626470692954">Administratoren din må fjerne og legge deg til i Chromium på nytt.</translation> <translation id="5768914737813585044">Vis Chromium OS på dette språket</translation> -<translation id="5772805321386874569">(krever at Chromium <ph name="BEGIN_BUTTON" />startes på nytt<ph name="END_BUTTON" />)</translation> <translation id="5796460469508169315">Chromium er nesten klar.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Velkommen til Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb index 5820bf9..d7657129 100644 --- a/chrome/app/resources/chromium_strings_pl.xtb +++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium nie może określić ani ustawić domyślnej przeglądarki</translation> <translation id="1967743265616885482">Znane są przypadki konfliktu modułu o takiej nazwie z Chromium.</translation> <translation id="2008474315282236005">Spowoduje to usunięcie 1 elementu z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chromium jako <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Użyj akceleracji sprzętowej, gdy jest dostępna</translation> <translation id="2117378023188580026">Administrator prosi Cię o ponowne uruchomienie Chromium, by przeglądarka mogła zainstalować tę aktualizację</translation> <translation id="2119636228670142020">System operacyjny &Chromium – informacje</translation> <translation id="2158734852934720349">Licencje oprogramowania typu open source w Chromium OS</translation> @@ -85,11 +84,9 @@ <translation id="3852700440713538496">Przypinanie Chromium na pasku zadań</translation> <translation id="3889543394854987837">Otwórz Chromium, klikając swoją nazwę i rozpocznij przeglądanie.</translation> <translation id="3898493977366060150">Przeglądanie stron internetowych za pomocą inteligentnych rozwiązań Google</translation> -<translation id="390894725198123737">Na Macach hasła można zapisywać w pęku kluczy. Inni użytkownicy Chromium dzielący to konto OS X mogą z nich korzystać i je synchronizować.</translation> <translation id="4036079820698952681">Pomóż ulepszyć Chromium, zgłaszając <ph name="BEGIN_LINK" />bieżące ustawienia<ph name="END_LINK" /></translation> <translation id="4050175100176540509">W najnowszej wersji zostały wprowadzone ważne poprawki bezpieczeństwa i nowe funkcje.</translation> <translation id="407254336480250557">Wybierz <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Zamknij wszystkie okna Chromium i uruchom go ponownie, by zmiany zostały wprowadzone.</translation> <translation id="421369550622382712">Odkryj znakomite aplikacje, gry, rozszerzenia i motywy do Chromium.</translation> <translation id="4222580632002216401">Jesteś zalogowany w Chromium. Administrator wyłączył synchronizację.</translation> <translation id="4224199872375172890">Masz aktualną wersję Chromium.</translation> @@ -103,7 +100,6 @@ <translation id="4421155425831608516">Logowanie się w Chromium zostało wyłączone przez administratora tego urządzenia.</translation> <translation id="4423735387467980091">Dostosowywanie i kontrolowanie Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium uruchomi się ponownie za godzinę}few{Chromium uruchomi się ponownie za # godziny}many{Chromium uruchomi się ponownie za # godzin}other{Chromium uruchomi się ponownie za # godziny}}</translation> -<translation id="4458285410772214805">Wyloguj się i zaloguj ponownie, by zmiana zaczęła obowiązywać.</translation> <translation id="4469812139324097969">Chromium jest nieaktualny, ponieważ od pewnego czasu nie był uruchamiany. Dostępna jest aktualizacja, która zostanie zastosowana natychmiast po ponownym uruchomieniu.</translation> <translation id="4488554488975128561">Możesz przyczynić się do zwiększenia bezpieczeństwa i komfortu korzystania z Chromium, automatycznie wysyłając do Google pewne informacje o systemie i część zawartości stron, by pomóc w wykrywaniu niebezpiecznych aplikacji i witryn.</translation> <translation id="4567424176335768812">Jesteś zalogowany jako <ph name="USER_EMAIL_ADDRESS" />. Teraz możesz korzystać ze swoich zakładek, historii i innych ustawień na wszystkich zalogowanych urządzeniach.</translation> @@ -138,7 +134,6 @@ <translation id="5698481217667032250">Wyświetlaj Chromium w tym języku</translation> <translation id="5726838626470692954">Twój menedżer musi Cię usunąć i ponownie dodać w Chromium.</translation> <translation id="5768914737813585044">Wyświetlaj system operacyjny Chromium w tym języku</translation> -<translation id="5772805321386874569">(wymaga <ph name="BEGIN_BUTTON" />ponownego uruchomienia<ph name="END_BUTTON" /> Chromium)</translation> <translation id="5796460469508169315">Chromium jest prawie gotowy.</translation> <translation id="5820394555380036790">System operacyjny Chromium</translation> <translation id="5862307444128926510">Chromium – witamy!</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb index cb06a54e..35845d65 100644 --- a/chrome/app/resources/chromium_strings_pt-BR.xtb +++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">O Chromium não pode determinar ou definir o navegador padrão</translation> <translation id="1967743265616885482">Um módulo com o mesmo nome é conhecido por entrar em conflito com o Chromium.</translation> <translation id="2008474315282236005">Essa ação excluirá 1 item deste dispositivo. Para recuperar seus dados mais tarde, faça login no Chromium como <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Usar aceleração de hardware quando disponível</translation> <translation id="2117378023188580026">Seu administrador pede que você reinicie o Chromium para que essa atualização seja aplicada</translation> <translation id="2119636228670142020">Sobre o &Chromium OS</translation> <translation id="2158734852934720349">Licenças de código aberto do Chromium OS</translation> @@ -85,11 +84,9 @@ <translation id="3852700440713538496">Fixar o Chromium na barra de tarefas</translation> <translation id="3889543394854987837">Clique no seu nome para abrir o Chromium e começar a navegar.</translation> <translation id="3898493977366060150">Navegação na Web com a tecnologia do Google</translation> -<translation id="390894725198123737">No Mac, as senhas podem ser salvas no seu Keychain e acessadas ou sincronizadas por outros usuários do Chromium que compartilhem essa conta OS X.</translation> <translation id="4036079820698952681">Ajude a melhorar o Chromium informando as <ph name="BEGIN_LINK" />configurações atuais<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Melhorias de segurança importantes e novos recursos estão disponíveis na versão mais recente.</translation> <translation id="407254336480250557">Selecione o <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Feche todas as janelas do Chromium e reinicie o Chromium para que a alteração entre em vigor.</translation> <translation id="421369550622382712">Descubra ótimos aplicativos, jogos, extensões e temas para o Chromium.</translation> <translation id="4222580632002216401">Agora, você está conectado ao Chromium. A sincronização está desativada por seu administrador.</translation> <translation id="4224199872375172890">O Chromium está atualizado.</translation> @@ -103,7 +100,6 @@ <translation id="4421155425831608516">O login no Chromium foi desativado pelo administrador deste dispositivo.</translation> <translation id="4423735387467980091">Personalizar e controlar o Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{O Chromium será reiniciado em 1 hora}one{O Chromium será reiniciado em # hora}other{O Chromium será reiniciado em # horas}}</translation> -<translation id="4458285410772214805">Saia e faça login novamente para que esta alteração entre em vigor.</translation> <translation id="4469812139324097969">O Chromium está desatualizado porque não foi reiniciado durante algum tempo. Uma atualização está disponível e será aplicada assim que você reiniciá-lo.</translation> <translation id="4488554488975128561">Você pode ajudar a tornar o Chromium mais seguro e mais fácil de usar, enviando automaticamente algumas informações do sistema e conteúdos de página ao Google para ajudar a detectar apps e sites perigosos.</translation> <translation id="4567424176335768812">Você está conectado como <ph name="USER_EMAIL_ADDRESS" />. Agora você pode acessar seus favoritos, histórico e outras configurações em todos os seus dispositivos conectados.</translation> @@ -138,7 +134,6 @@ <translation id="5698481217667032250">Exibir Chromium neste idioma</translation> <translation id="5726838626470692954">É necessário que seu administrador remova e adicione você novamente ao Chromium.</translation> <translation id="5768914737813585044">Exibir o Chromium OS neste idioma</translation> -<translation id="5772805321386874569">(requer a <ph name="BEGIN_BUTTON" />reinicialização<ph name="END_BUTTON" /> do Chromium)</translation> <translation id="5796460469508169315">O Chromium está quase pronto.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Bem-vindo ao Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb index eb8aa6b..21c3902 100644 --- a/chrome/app/resources/chromium_strings_pt-PT.xtb +++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">O Chromium não consegue determinar ou definir o navegador predefinido</translation> <translation id="1967743265616885482">É conhecido um módulo com o mesmo nome que entra em conflito com o Chromium.</translation> <translation id="2008474315282236005">Esta ação elimina 1 item deste dispositivo. Para recuperar os dados mais tarde, inicie sessão no Chromium como <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Utilizar aceleração de hardware sempre que estiver disponível</translation> <translation id="2117378023188580026">O seu administrador solicita-lhe que reinicie o Chromium para aplicar esta atualização.</translation> <translation id="2119636228670142020">Acerca do SO &Chromium</translation> <translation id="2158734852934720349">Licenças de código aberto do SO Chromium</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Afixar o Chromium na barra de tarefas</translation> <translation id="3889543394854987837">Clique no seu nome para abrir o Chromium e começar a navegar.</translation> <translation id="3898493977366060150">Navegação na Web com a inteligência da Google</translation> -<translation id="390894725198123737">No Mac, as palavras-passe podem ser guardadas no Porta-chaves e podem ser sincronizadas ou acedidas por outros utilizadores do Chromium que partilhem esta conta OS X.</translation> <translation id="4036079820698952681">Ajude a melhorar o Chromium ao comunicar as <ph name="BEGIN_LINK" />definições atuais<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Estão disponíveis na versão mais recente melhorias de segurança importantes e novas funcionalidades.</translation> <translation id="407254336480250557">Selecione o <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Feche todas as janelas do Chromium e reinicie o Chromium para que esta alteração seja aplicada.</translation> <translation id="421369550622382712">Descubra aplicações, jogos, extensões e temas fantásticos para o Chromium.</translation> <translation id="4222580632002216401">Tem agora sessão iniciada no Chromium! A sincronização foi desativada pelo seu gestor.</translation> <translation id="4224199872375172890">O Chromium está atualizado.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">O início de sessão no Chromium foi desativado pelo gestor deste dispositivo.</translation> <translation id="4423735387467980091">Personalizar e controlar o Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{O Chromium será reiniciado dentro de uma hora}other{O Chromium será reiniciado dentro de # horas}}</translation> -<translation id="4458285410772214805">Termine sessão e volte a iniciar sessão para que esta alteração tenha efeito.</translation> <translation id="4469812139324097969">O Chromium está desatualizado porque não é reiniciado há algum tempo. Está disponível uma atualização que será aplicada logo que o reinicie.</translation> <translation id="4488554488975128561">Pode ajudar a tornar o Chromium mais seguro e fácil de utilizar ao enviar automaticamente algumas informações do sistema e conteúdo de páginas para a Google para ajudar a detetar aplicações e sites perigosos.</translation> <translation id="4567424176335768812">Tem sessão iniciada como <ph name="USER_EMAIL_ADDRESS" />. Agora, pode aceder aos seus marcadores, ao histórico e a outras definições em todos os dispositivos com sessão iniciada.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Apresentar o Chromium neste idioma</translation> <translation id="5726838626470692954">O seu gestor tem de o remover e adicionar novamente ao Chromium.</translation> <translation id="5768914737813585044">Apresentar o SO Chromium neste idioma</translation> -<translation id="5772805321386874569">(é necessário <ph name="BEGIN_BUTTON" />reiniciar<ph name="END_BUTTON" /> o Chromium)</translation> <translation id="5796460469508169315">O Chromium está quase pronto.</translation> <translation id="5820394555380036790">SO Chromium</translation> <translation id="5862307444128926510">Bem-vindo ao Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb index d23f258..545685ec 100644 --- a/chrome/app/resources/chromium_strings_ro.xtb +++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium nu poate determina sau seta browserul prestabilit</translation> <translation id="1967743265616885482">Despre un modul cu același nume se cunoaște că intră în conflict cu Chromium.</translation> <translation id="2008474315282236005">Astfel, se va șterge 1 element de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chromium ca <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Utilizează accelerarea hardware când este disponibilă</translation> <translation id="2117378023188580026">Administratorul solicită să relansezi Chromium pentru a aplica această actualizare</translation> <translation id="2119636228670142020">Despre sistemul de operare &Chromium</translation> <translation id="2158734852934720349">Licențe open source pentru sistemul de operare Chromium</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Fixează Chromium pe bara de activități</translation> <translation id="3889543394854987837">Dați clic pe numele dvs. pentru a deschide Chromium și a începe să navigați.</translation> <translation id="3898493977366060150">Navigare pe web cu ingeniozitatea Google</translation> -<translation id="390894725198123737">Pe Mac, parolele pot fi salvate în aplicația Keychain și pot fi accesate sau sincronizate de alți utilizatori Chromium care folosesc același cont de OS X.</translation> <translation id="4036079820698952681">Contribuie la îmbunătățirea browserului Chromium raportând <ph name="BEGIN_LINK" />setările actuale<ph name="END_LINK" /></translation> <translation id="4050175100176540509">În cea mai recentă versiune sunt disponibile îmbunătățiri de securitate și funcții noi importante.</translation> <translation id="407254336480250557">Selectează <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Închideți toate ferestrele Chromium și reporniți sistemul de operare pentru ca această modificare să aibă efect.</translation> <translation id="421369550622382712">Descoperă aplicații, jocuri, extensii și teme extraordinare pentru Chromium.</translation> <translation id="4222580632002216401">Acum sunteți conectat(ă) la Chromium! Sincronizarea este dezactivată de administrator.</translation> <translation id="4224199872375172890">Chromium este actualizat.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Conectarea la Chromium este dezactivată de administratorul acestui dispozitiv.</translation> <translation id="4423735387467980091">Personalizați și controlați Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium se va relansa într-o oră}few{Chromium se va relansa în # ore}other{Chromium se va relansa în # de ore}}</translation> -<translation id="4458285410772214805">Pentru ca modificarea să fie aplicată, deconectați-vă și conectați-vă din nou.</translation> <translation id="4469812139324097969">Chromium este neactualizat, deoarece în ultimul timp nu a fost repornit. Este disponibilă o actualizare, iar aceasta va fi aplicată după repornire.</translation> <translation id="4488554488975128561">Ne poți ajuta să facem Chromium mai sigur și mai ușor de folosit trimițând automat anumite informații despre sistem și conținutul paginii la Google pentru a detecta aplicațiile și site-urile periculoase.</translation> <translation id="4567424176335768812">V-ați conectat ca <ph name="USER_EMAIL_ADDRESS" />. Acum vă puteți accesa marcajele, istoricul și alte setări de pe toate dispozitivele pe care v-ați conectat.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Afișează Chromium în această limbă</translation> <translation id="5726838626470692954">Administratorul trebuie să te elimine și să te adauge din nou în Chromium.</translation> <translation id="5768914737813585044">Afișează sistemul de operare Chromium în această limbă</translation> -<translation id="5772805321386874569">(necesită <ph name="BEGIN_BUTTON" />repornirea<ph name="END_BUTTON" /> Chromium)</translation> <translation id="5796460469508169315">Chromium este aproape configurat.</translation> <translation id="5820394555380036790">Sistemul de operare Chromium</translation> <translation id="5862307444128926510">Bun venit la Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb index 2a24114f..bb639de 100644 --- a/chrome/app/resources/chromium_strings_ru.xtb +++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium не удалось определить или задать браузер по умолчанию</translation> <translation id="1967743265616885482">Известно, что модуль с таким названием конфликтует с Chromium.</translation> <translation id="2008474315282236005">С устройства будет удален 1 объект. Чтобы восстановить данные позже, войдите в Chromium как <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Использовать аппаратное ускорение (при наличии)</translation> <translation id="2117378023188580026">Администратор просит перезапустить Chromium для установки обновления</translation> <translation id="2119636228670142020">О &Chromium OS</translation> <translation id="2158734852934720349">Лицензии Chromium OS на ПО с открытым исходным кодом</translation> @@ -85,11 +84,9 @@ <translation id="3852700440713538496">Как прикрепить Chromium на панель задач</translation> <translation id="3889543394854987837">Нажмите на свое имя, чтобы войти в Chromium.</translation> <translation id="3898493977366060150">Технологии Google для простого и быстрого поиска в Интернете.</translation> -<translation id="390894725198123737">Если пароли на Mac сохраняются с помощью функции "Связка ключей", их могут просматривать и синхронизировать все пользователи Chromium, у которых есть доступ к этому аккаунту OS X.</translation> <translation id="4036079820698952681">Отправьте отчет о <ph name="BEGIN_LINK" />текущих настройках Chromium<ph name="END_LINK" />, чтобы помочь нам улучшить браузер</translation> <translation id="4050175100176540509">В последней версии улучшена защита и добавлены новые функции.</translation> <translation id="407254336480250557">Выберите <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Закройте все окна Chromium и перезапустите программу, чтобы изменения вступили в силу.</translation> <translation id="421369550622382712">Широкий выбор приложений, игр, расширений и тем для Chromium.</translation> <translation id="4222580632002216401">Добро пожаловать в Chromium! Синхронизация отключена администратором.</translation> <translation id="4224199872375172890">Вы используете актуальную версию Chromium.</translation> @@ -103,7 +100,6 @@ <translation id="4421155425831608516">Вход в Chromium отключен администратором устройства.</translation> <translation id="4423735387467980091">Настройка и управление Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium перезапустится через 1 час}one{Chromium перезапустится через # час}few{Chromium перезапустится через # часа}many{Chromium перезапустится через # часов}other{Chromium перезапустится через # часа}}</translation> -<translation id="4458285410772214805">Чтобы изменения вступили в силу, выполните вход еще раз.</translation> <translation id="4469812139324097969">Для текущей версии Chromium доступно обновление. Оно будет установлено при перезапуске приложения.</translation> <translation id="4488554488975128561">Вы можете автоматически отправлять системную информацию и контент страниц в Google, чтобы помочь улучшить распознавание опасных приложений и сайтов. Давайте вместе сделаем Chromium ещё удобнее и безопаснее!</translation> <translation id="4567424176335768812">Вы вошли с помощью аккаунта <ph name="USER_EMAIL_ADDRESS" />. Ваши закладки, история и другие настройки теперь доступны на всех устройствах, где вы используете этот аккаунт.</translation> @@ -138,7 +134,6 @@ <translation id="5698481217667032250">Отображать Chromium на этом языке</translation> <translation id="5726838626470692954">Администратор устройства должен удалить ваш аккаунт из Chromium и добавить его снова</translation> <translation id="5768914737813585044">Отображать Chromium OS на этом языке</translation> -<translation id="5772805321386874569">(необходимо <ph name="BEGIN_BUTTON" />перезапустить<ph name="END_BUTTON" /> Chromium)</translation> <translation id="5796460469508169315">Chromium почти готов к работе</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Добро пожаловать в Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index 4ea93dd..d76b6672 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium nedokáže určiť alebo nastaviť predvolený prehliadač</translation> <translation id="1967743265616885482">Zistilo sa, že modul s rovnakým názvom spôsobuje konflikt s prehliadačom Chromium.</translation> <translation id="2008474315282236005">Táto akcia odstráni zo zariadenia jednu položku. Ak budete chcieť svoje údaje neskôr opäť načítať, prihláste sa do prehliadača Chromium ako <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Používať hardvérovú akceleráciu (keď je dostupná)</translation> <translation id="2117378023188580026">Správca vás žiada o reštartovanie prehliadača Chromium na použitie tejto aktualizácie</translation> <translation id="2119636228670142020">Informácie o systéme &Chromium OS</translation> <translation id="2158734852934720349">Licencie open source systému OS Chromium</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">Pripnutie prehliadača Chromium na panel úloh</translation> <translation id="3889543394854987837">Ak chcete otvoriť prehliadač Chromium a začať prehliadať, kliknite na svoje meno.</translation> <translation id="3898493977366060150">Prehliadanie webu pomocou inteligentných doplnkov Googlu</translation> -<translation id="390894725198123737">Na počítačoch Mac sa heslá môžu ukladať do aplikácie Keychain. Ostatní používatelia prehliadača Chromium, ktorí zdieľajú tento účet systému OS X, k nim môžu pristupovať a môžu ich synchronizovať.</translation> <translation id="4036079820698952681">Nahláste <ph name="BEGIN_LINK" />aktuálne nastavenia<ph name="END_LINK" /> a pomôžte tak zlepšiť prehliadač Chromium</translation> <translation id="4050175100176540509">V najnovšej verzii sú k dispozícii dôležité vylepšenia zabezpečenia a nové funkcie.</translation> <translation id="407254336480250557">Vyberte <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Ak chcete, aby sa prejavila táto zmena, uzavrite všetky okná prehliadača Chromium a znova ho spustite.</translation> <translation id="421369550622382712">Objavte skvelé aplikácie, hry, rozšírenia a motívy pre prehliadač Chromium.</translation> <translation id="4222580632002216401">Prihlásili ste sa do prehliadača Chromium. Synchronizácia je zakázaná administrátorom.</translation> <translation id="4224199872375172890">Prehliadač Chromium bol aktualizovaný.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">Prihlásenie do prehliadača Chromium je zakázané správcom tohto zariadenia.</translation> <translation id="4423735387467980091">Prispôsobiť a spravovať Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium sa znova spustí do jednej hodiny}few{Chromium sa znova spustí do # hodín}many{Chromium sa znova spustí do # hodiny}other{Chromium sa znova spustí do # hodín}}</translation> -<translation id="4458285410772214805">Ak chcete, aby sa zmeny prejavili, odhláste sa a znova sa prihláste.</translation> <translation id="4469812139324097969">Chromium je zastaraný, pretože nebol dlhší čas reštartovaný. K dispozícii je aktualizácia, ktorá bude uplatnená po najbližšom opätovnom spustení.</translation> <translation id="4488554488975128561">Automatickým odosielaním niektorých informácií o systéme a obsahu stránok môžete prispieť k lepšiemu rozpoznávaniu nebezpečných aplikácií a webov a zvýšiť tak zabezpečenie prehliadača Chromium a zjednodušiť jeho používanie.</translation> <translation id="4567424176335768812">Ste prihlásený/-á ako <ph name="USER_EMAIL_ADDRESS" />. Teraz môžete na všetkých zariadeniach, kde ste prihlásený/-á, pristupovať k svojim záložkám, histórii a ďalším nastaveniam.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">Zobraziť Chromium v tomto jazyku</translation> <translation id="5726838626470692954">Správca vás musí odstrániť a znova pridať do prehliadača Chromium.</translation> <translation id="5768914737813585044">Zobraziť Chromium OS v tomto jazyku</translation> -<translation id="5772805321386874569">(vyžaduje <ph name="BEGIN_BUTTON" />reštartovanie<ph name="END_BUTTON" /> prehliadača Chromium)</translation> <translation id="5796460469508169315">Prehliadač Chromium je takmer pripravený</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Vitajte v prehliadači Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index e439e251..6a2efad 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium ne more določiti ali nastaviti privzetega brskalnika</translation> <translation id="1967743265616885482">Modul z istim imenom je že bil v sporu s Chromiumom.</translation> <translation id="2008474315282236005">S tem bo iz te naprave izbrisan 1 element. Če želite pozneje prenesti podatke, se v Chromium prijavite kot <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Uporabi strojno pospeševanje, če je na voljo</translation> <translation id="2117378023188580026">Skrbnik prosi, da za uveljavitev te posodobitve znova zaženete Chromium</translation> <translation id="2119636228670142020">O sistemu &Chromium OS</translation> <translation id="2158734852934720349">Odprtokodne licence za Chromium OS</translation> @@ -90,11 +89,9 @@ <translation id="3852700440713538496">Pripenjanje Chromiuma v opravilno vrstico</translation> <translation id="3889543394854987837">Kliknite ime, da odprete Chromium in začnete brskati.</translation> <translation id="3898493977366060150">Brskanje po spletu z Googlovimi pametnimi rešitvami</translation> -<translation id="390894725198123737">V računalnikih Mac so gesla morda shranjena v orodju Keychain, pri čemer lahko do njih dostopajo ali jih sinhronizirajo drugi uporabniki Chromiuma, s katerimi si delite ta račun v sistemu OS X.</translation> <translation id="4036079820698952681">Pomagajte izboljšati Chromium s poročanjem o <ph name="BEGIN_LINK" />trenutnih nastavitvah<ph name="END_LINK" /></translation> <translation id="4050175100176540509">V najnovejši različici so na voljo pomembne varnostne izboljšave in nove funkcije.</translation> <translation id="407254336480250557">Izberite <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Zaprite vsa okna Chromiuma in ga zaženite znova, da bo ta sprememba začela veljati.</translation> <translation id="421369550622382712">Odkrijte zanimive aplikacije, igre, razširitve in teme za Chromium.</translation> <translation id="4222580632002216401">Zdaj ste prijavljeni v Chromium. Sinhronizacijo je onemogočil skrbnik.</translation> <translation id="4224199872375172890">Chromium je posodobljen.</translation> @@ -108,7 +105,6 @@ <translation id="4421155425831608516">Prijavo v Chromium je onemogočil skrbnik te naprave.</translation> <translation id="4423735387467980091">Prilagajanje in nadziranje Chromiuma</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium se bo znova zagnal čez eno uro}one{Chromium se bo znova zagnal čez # uro}two{Chromium se bo znova zagnal čez # uri}few{Chromium se bo znova zagnal čez # ure}other{Chromium se bo znova zagnal čez # ur}}</translation> -<translation id="4458285410772214805">Odjavite se in znova prijavite, da bodo te spremembe začele veljati.</translation> <translation id="4469812139324097969">Chromium je zastarel, ker ga že nekaj časa niste znova zagnali. Na voljo je posodobitev, ki bo nameščena, takoj ko ga znova zaženete.</translation> <translation id="4488554488975128561">S samodejnim pošiljanjem nekaterih informacij o sistemu in vsebine strani Googlu, s čimer pomagate pri hitrejšem zaznavanju nevarnih aplikacij in spletnih mest, lahko pomagate narediti Chromium varnejši in preprostejši za uporabo.</translation> <translation id="4567424176335768812">Prijavljeni ste kot <ph name="USER_EMAIL_ADDRESS" />. Zdaj imate dostop do zaznamkov, zgodovine in drugih nastavitev v vseh napravah, v katerih ste prijavljeni.</translation> @@ -143,7 +139,6 @@ <translation id="5698481217667032250">Prikaži Chromium v tem jeziku</translation> <translation id="5726838626470692954">Skrbnik vas mora odstraniti iz Chromiuma in vas znova dodati.</translation> <translation id="5768914737813585044">Prikaži Chromium OS v tem jeziku</translation> -<translation id="5772805321386874569">(zahteva <ph name="BEGIN_BUTTON" />vnovični zagon<ph name="END_BUTTON" /> Chromiuma)</translation> <translation id="5796460469508169315">Chromium je skoraj pripravljen.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Pozdravljeni v Chromiumu</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb index 22228e8..4577c37 100644 --- a/chrome/app/resources/chromium_strings_sr.xtb +++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium не може да одреди ни да подеси подразумевани прегледач</translation> <translation id="1967743265616885482">Модул истог назива се већ сукобљавао са Chromium-ом.</translation> <translation id="2008474315282236005">Овим ћете избрисати 1 ставку са овог уређаја. Да бисте касније вратили податке, пријавите се у Chromium као <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Користи хардверско убрзање када је доступно</translation> <translation id="2117378023188580026">Администратор тражи да поново покренете Chromium да бисте применили ово ажурирање</translation> <translation id="2119636228670142020">О &Chromium ОС-у</translation> <translation id="2158734852934720349">Лиценце отвореног кода за Chromium ОС</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">Закачите Chromium на траку задатака</translation> <translation id="3889543394854987837">Кликните на име да бисте отворили Chromium и почните да прегледате.</translation> <translation id="3898493977366060150">Веб-прегледање помоћу паметних Google функција</translation> -<translation id="390894725198123737">На Mac-у лозинке могу да се чувају у Keychain и други корисници Chromium-а који деле овај ОС X налог могу да им приступају или да их синхронизују.</translation> <translation id="4036079820698952681">Помозите да побољшамо Chromium тако што ћете послати извештај о <ph name="BEGIN_LINK" />актуелним подешавањима<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Важна безбедносна побољшања и нове функције су доступни у најновијој верзији.</translation> <translation id="407254336480250557">Изаберите <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Затворите све Chromium прозоре и рестартујте Chromium да би ова промена ступила на снагу.</translation> <translation id="421369550622382712">Откријте одличне апликације, игре, додатке и теме за Chromium.</translation> <translation id="4222580632002216401">Сада сте пријављени у Chromium! Администратор је онемогућио синхронизацију.</translation> <translation id="4224199872375172890">Chromium је ажуриран.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">Пријављивање у Chromium је онемогућио администратор овог уређаја.</translation> <translation id="4423735387467980091">Прилагодите и контролишите Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Поново ћемо покренути Chromium за један сат}one{Поново ћемо покренути Chromium за # сат}few{Поново ћемо покренути Chromium за # сата}other{Поново ћемо покренути Chromium за # сати}}</translation> -<translation id="4458285410772214805">Одјавите се и поново се пријавите да би ова промена ступила на снагу.</translation> <translation id="4469812139324097969">Chromium је застарео јер дуго није поново покренут. Ажурирање је доступно и биће примењено чим га поново покренете.</translation> <translation id="4488554488975128561">Можете да помогнете да Chromium буде безбеднији и лакши за коришћење тако што ћете Google-у аутоматски слати неке системске информације и садржаје страница да бисмо открили опасне апликације и сајтове.</translation> <translation id="4567424176335768812">Пријављени сте као <ph name="USER_EMAIL_ADDRESS" />. Сада можете да приступате обележивачима, историји и другим подешавањима на свим уређајима на којима сте пријављени.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">Приказуј Chromium на овом језику</translation> <translation id="5726838626470692954">Менаџер мора да вас уклони из Chromium-а, па да вас поново дода.</translation> <translation id="5768914737813585044">Приказуј Chromium ОС на овом језику</translation> -<translation id="5772805321386874569">(захтева <ph name="BEGIN_BUTTON" />поновно покретање<ph name="END_BUTTON" /> Chromium-а)</translation> <translation id="5796460469508169315">Chromium је скоро спреман.</translation> <translation id="5820394555380036790">Chromium ОС</translation> <translation id="5862307444128926510">Добро дошли у Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb index 2a07c9a..15debdf 100644 --- a/chrome/app/resources/chromium_strings_sv.xtb +++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium kan inte fastställa eller ange standardwebbläsaren</translation> <translation id="1967743265616885482">En modul med samma namn har tidigare varit i konflikt med Chromium.</translation> <translation id="2008474315282236005">Ett objekt tas bort från enheten. Logga in i Chromium som <ph name="USER_EMAIL" /> om du vill kunna återställa datan senare.</translation> -<translation id="2077129598763517140">Använd maskinvaruacceleration när det är tillgängligt</translation> <translation id="2117378023188580026">Administratören meddelar att du bör starta om Chromium så att uppdateringen tillämpas</translation> <translation id="2119636228670142020">Om &Chromium OS</translation> <translation id="2158734852934720349">Licenser för öppen källkod för Chromium OS</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">Fäst Chromium i aktivitetsfältet</translation> <translation id="3889543394854987837">Öppna Chromium genom att klicka på ditt namn och börja surfa.</translation> <translation id="3898493977366060150">Surfa smart med Google</translation> -<translation id="390894725198123737">På Mac kan lösenord sparas på nyckelringen. Andra Chromium-användare som använder det här OS X-kontot kan komma åt lösenorden och synkronisera dem.</translation> <translation id="4036079820698952681">Hjälp oss att förbättra Chromium genom att rapportera dina <ph name="BEGIN_LINK" />aktuella inställningar<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Den senaste versionen har viktiga säkerhetsförbättringar och nya funktioner.</translation> <translation id="407254336480250557">Välj <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Du måste stänga alla Chromium-fönster och starta om Chromium för att ändringen ska börja gälla.</translation> <translation id="421369550622382712">Upptäck fantastiska appar, spel, tillägg och teman för Chromium.</translation> <translation id="4222580632002216401">Nu är du inloggad på Chromium. Synkronisering har inaktiverats av administratören.</translation> <translation id="4224199872375172890">Chromium är uppdaterat.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">Inloggning i Chromium har inaktiverats av enhetens administratör.</translation> <translation id="4423735387467980091">Anpassa och kontrollera Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Om en timme startas Chromium om}other{Om # timmar startas Chromium om}}</translation> -<translation id="4458285410772214805">Den här ändringen träder inte i kraft förrän du loggat ut och sedan loggar in igen.</translation> <translation id="4469812139324097969">Chromium är inaktuellt eftersom det inte har startats om på ett tag. Det finns en uppdatering tillgänglig som tillämpas så snart du startar om.</translation> <translation id="4488554488975128561">Du kan bidra till att göra Chromium säkrare och enklare att använda genom låta viss systeminformation och visst sidinnehåll skickas till Google automatiskt i syfte att identifiera skadliga appar och webbplatser.</translation> <translation id="4567424176335768812">Du är inloggad som <ph name="USER_EMAIL_ADDRESS" />. Nu kan du komma åt dina bokmärken, historik och andra inställningar på alla enheter som du är inloggad på.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">Visa Chromium på det här språket</translation> <translation id="5726838626470692954">Den ansvariga måste ta bort och lägga till dig i Chromium på nytt.</translation> <translation id="5768914737813585044">Visa Chromium OS på det här språket</translation> -<translation id="5772805321386874569">(Chromium måste <ph name="BEGIN_BUTTON" />startas om<ph name="END_BUTTON" />)</translation> <translation id="5796460469508169315">Chromium är nästan klart.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Välkommen till Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb index 3f4291b8..53aaf8a 100644 --- a/chrome/app/resources/chromium_strings_sw.xtb +++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -31,7 +31,6 @@ <translation id="1966382378801805537">Chromium haijafaulu kubainisha wala kuweka kivinjari chaguo-msingi</translation> <translation id="1967743265616885482">Kijenzi kilicho na jina sawa kimejulikana kuwa na ukinzani na Chromium.</translation> <translation id="2008474315282236005">Hatua hii itafuta kipengee 1 kwenye kifaa hiki. Ili urejeshe data yako baadaye, ingia katika Chromium ukitumia <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Tumia uongezaji kasi wa maunzi wakati unapatikana</translation> <translation id="2117378023188580026">Msimamizi wako anakuomba uwashe Chromium upya ili utumie sasisho</translation> <translation id="2119636228670142020">Kuhusu Chromium OS</translation> <translation id="2158734852934720349">Leseni za programu huria kwenye Chromium OS</translation> @@ -89,11 +88,9 @@ <translation id="3852700440713538496">Tundika Chromium kwenye upau wa kazi wa kompyuta yako</translation> <translation id="3889543394854987837">Bofya jina lako ili ufungue Chromium na uanze kuvinjari.</translation> <translation id="3898493977366060150">Kuvinjari kwenye wavuti kwa kutumia programu mahiri za Google</translation> -<translation id="390894725198123737">Kwenye Mac, manenosiri yanaweza kuhifadhiwa kwenye Msururu wako wa kitufe na yanaweza kufikiwa au kusawazishwa na watumiaji wengine wa Chromium wanaoshiriki akaunti hii ya OS X.</translation> <translation id="4036079820698952681">Saidia kuboresha Chromium kwa kuripoti kuhusu <ph name="BEGIN_LINK" />mipangilio ya sasa<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Maboresho muhimu ya usalama na vipengele vipya vinapatikana katika toleo jipya.</translation> <translation id="407254336480250557">Chagua <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Tafadhali funga madirisha yote ya Chromium na uizindue upya Chromium ili mabadiliko haya yaanze kufanya kazi.</translation> <translation id="421369550622382712">Gundua programu, michezo, viendelezi na mandhari bora ya Chromium.</translation> <translation id="4222580632002216401">Sasa umeingia kwenye Chromium! Usawazishaji umezimwa na msimamizi wako.</translation> <translation id="4224199872375172890">Chromium imesasishwa.</translation> @@ -107,7 +104,6 @@ <translation id="4421155425831608516">Msimamizi wa kifaa hiki amezima kipengele cha kuingia katika akaunti ya Chromium.</translation> <translation id="4423735387467980091">Dhibiti na ugeuze Chromium ikufae</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium itaanza upya baada ya saa moja}other{Chromium itaanza upya baada ya saa #}}</translation> -<translation id="4458285410772214805">Tafadhali toka na uingie tena ili mabadiliko haya yafanye kazi.</translation> <translation id="4469812139324097969">Muda wa matumizi wa Chromium umeisha kwa sababu haijafunguliwa upya kwa muda mrefu. Sasisho linapatikana na litaanza kutumika pindi tu utakapofungua upya.</translation> <translation id="4488554488975128561">Unaweza kusaidia kuifanya Chromium salama na rahisi zaidi kutumia kwa kutuma kiotomatiki maelezo fulani ya mfumo na maudhui ya ukurasa kwa Google ili kusaidia kugundua programu na tovuti hatari.</translation> <translation id="4567424176335768812">Umeingia katika akaunti kama <ph name="USER_EMAIL_ADDRESS" />. Sasa unaweza kupata alamisho, historia, na mipangilio yako mingine kwenye vifaa vyako vyote vilivyoingia katika akaunti.</translation> @@ -142,7 +138,6 @@ <translation id="5698481217667032250">Onyesha Chromium katika lugha hii</translation> <translation id="5726838626470692954">Lazima msimamizi wako akuondoe na kukuongeza tena kwenye Chromium.</translation> <translation id="5768914737813585044">Onyesha Mfumo wa Uendeshaji wa Chromium katika lugha hii</translation> -<translation id="5772805321386874569">(inahitaji uanzishaji upya wa <ph name="BEGIN_BUTTON" />Chromium<ph name="END_BUTTON" />)</translation> <translation id="5796460469508169315">Chromium inakaribia kuwa tayari.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Karibu kwenye Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb index df9c45e..648fa8a 100644 --- a/chrome/app/resources/chromium_strings_ta.xtb +++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">இயல்புநிலை உலாவியைக் கண்டறியவோ அமைக்கவோ Chromium ஆல் முடியவில்லை</translation> <translation id="1967743265616885482">இதே பெயரைக் கொண்ட தொகுதிக்கூறு, Chromium உடன் முரண்பட்டிருப்பதாக அறியப்பட்டுள்ளது.</translation> <translation id="2008474315282236005">வெளியேறினால், இந்தச் சாதனத்திலிருந்து ஓர் உருப்படி நீக்கப்படும். பின்னர் தரவை மீட்டமைக்க, Chromium இல் <ph name="USER_EMAIL" /> எனும் முகவரியின் மூலம் உள்நுழையவும்.</translation> -<translation id="2077129598763517140">கிடைக்கும்போது வன்பொருளின் முடுக்கத்தைப் பயன்படுத்தவும்</translation> <translation id="2117378023188580026">இந்தப் புதுப்பிப்பைப் பயன்படுத்த, Chromiumஐ மீண்டும் தொடங்கும்படி உங்கள் நிர்வாகி பரிந்துரைக்கிறார்</translation> <translation id="2119636228670142020">&Chromium OS அறிமுகம்</translation> <translation id="2158734852934720349">Chromium OS ஓப்பன் சோர்ஸ் உரிமங்கள்</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">பணிப்பட்டியில் Chromiumஐப் பொருத்தவும்</translation> <translation id="3889543394854987837">Chromium ஐத் திறந்து, உலாவலைத் தொடங்க உங்கள் பெயரைக் கிளிக் செய்யவும்.</translation> <translation id="3898493977366060150">Google ஸ்மார்ட்ஸ் மூலம் இணையத்தில் உலாவுதல்</translation> -<translation id="390894725198123737">Mac இல், கடவுச்சொற்கள் உங்கள் Keychain இல் சேமிக்கப்படலாம், இந்த OS X கணக்கைப் பகிரும் பிற Chromium பயனர்களால் அவற்றை அணுகவோ ஒத்திசைக்கவோ முடியும்.</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />தற்போதைய அமைப்புகளைப்<ph name="END_LINK" /> பற்றிய அறிக்கையை அனுப்பி, Chromiumஐ இன்னும் சிறந்ததாக்க உதவவும்</translation> <translation id="4050175100176540509">முக்கியப் பாதுகாப்பு மேம்பாடுகளும், புதிய அம்சங்களும் சமீபத்திய பதிப்பில் கிடைக்கின்றன.</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" />ஐத் தேர்ந்தெடுக்கவும்</translation> -<translation id="4077262827416206768">இந்த மாற்றம் செயல்பாட்டிற்கு வர, அனைத்து Chromium சாளரங்களையும் மூடி, Chromium ஐ மீண்டும் தொடங்குக.</translation> <translation id="421369550622382712">Chromiumக்கான சிறந்த பயன்பாடுகள், கேம்கள், நீட்டிப்புகள் மற்றும் தீம்களைக் கண்டறியவும்.</translation> <translation id="4222580632002216401">தற்போது Chromium இல் உள்நுழைந்துள்ளீர்கள்! உங்கள் நிர்வாகியால் ஒத்திசைவு முடக்கப்பட்டுள்ளது.</translation> <translation id="4224199872375172890">Chromium புதுப்பித்த நிலையில் உள்ளது.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Chromium இல் உள்நுழைவதை, இந்தச் சாதனத்தின் நிர்வாகி முடக்கியுள்ளார்.</translation> <translation id="4423735387467980091">Chromium ஐ தனிப்பயனாக்கி கட்டுப்படுத்துக</translation> <translation id="4449801103833300785">{0,plural, =1{ஒரு மணிநேரத்திற்குள் Chromium மீண்டும் தொடங்கும்}other{ # மணிநேரத்திற்குள் Chromium மீண்டும் தொடங்கும்}}</translation> -<translation id="4458285410772214805">இந்த மாற்றம் செயல்பாட்டிற்கு வர, வெளியேறி, மீண்டும் உள்நுழைக.</translation> <translation id="4469812139324097969">சிறிது காலமாக மறுதொடக்கம் செய்யப்படாததால், Chromium காலாவதியாகிவிட்டது. புதுப்பிப்பு உள்ளது. நீங்கள் மறுதொடக்கம் செய்தவுடன் பயன்படுத்தப்படும்.</translation> <translation id="4488554488975128561">ஆபத்தான பயன்பாடுகளையும் தளங்களையும் கண்டறிவதற்கு உதவியாக, சில சாதனத் தகவலையும் பக்க உள்ளடக்கத்தையும் Googleக்குத் தானாக அனுப்புவதன் மூலம், Chromiumஐ எளிதாகவும் பாதுகாப்பாகவும் பயன்படுத்தும்படி மேம்படுத்துவதற்கு நீங்கள் உதவலாம்.</translation> <translation id="4567424176335768812">நீங்கள் <ph name="USER_EMAIL_ADDRESS" /> ஆக உள்நுழைந்துள்ளீர்கள். தற்போது உங்கள் புக்மார்க்குகள், வரலாறு மற்றும் பிற அமைப்புகளை நீங்கள் உள்நுழைந்துள்ள எல்லா சாதனங்களிலும் அணுகலாம்.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Chromiumஐ இந்த மொழியில் காட்டு</translation> <translation id="5726838626470692954">நிர்வாகி உங்களை Chromium இலிருந்து அகற்றி, மீண்டும் சேர்க்க வேண்டும்.</translation> <translation id="5768914737813585044">Chromium OSஐ இந்த மொழியில் காட்டு</translation> -<translation id="5772805321386874569">(Chromium ஐ <ph name="BEGIN_BUTTON" />மறுதொடக்கம்<ph name="END_BUTTON" /> செய்வது அவசியமாகும்)</translation> <translation id="5796460469508169315">Chromium கிட்டத்தட்ட தயாராகிவிட்டது.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Chromium க்கு வரவேற்கிறோம்</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb index f5a7c4c..4c7e969 100644 --- a/chrome/app/resources/chromium_strings_te.xtb +++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium డిఫాల్ట్ బ్రౌజర్ను నిశ్చయించలేదు లేదా సెట్ చేయలేదు</translation> <translation id="1967743265616885482">Chromiumతో వైరుధ్యం అయ్యే అదే పేరుతో మాడ్యూల్ ఉంది.</translation> <translation id="2008474315282236005">ఇది ఈ పరికరం నుండి 1 అంశాన్ని తొలగిస్తుంది. మీ డేటాను తర్వాత తిరిగి పొందడానికి, Chromiumకి <ph name="USER_EMAIL" /> వలె సైన్ ఇన్ చేయండి.</translation> -<translation id="2077129598763517140">హార్డ్వేర్ త్వరితం అందుబాటులో ఉన్నప్పుడు ఉపయోగించు</translation> <translation id="2117378023188580026">ఈ అప్డేట్ని వర్తింపజేయడం కోసం మీరు Chromiumని పునఃప్రారంభించాలని మీ నిర్వాహకుడు కోరుతున్నారు</translation> <translation id="2119636228670142020">&Chromium OS గురించి</translation> <translation id="2158734852934720349">Chromium OS ఓపెన్ సోర్స్ లైసెన్స్లు</translation> @@ -85,11 +84,9 @@ <translation id="3852700440713538496">Chromiumని మీ విధి పట్టీకి పిన్ చేయండి</translation> <translation id="3889543394854987837">Chromiumని తెరిచి, బ్రౌజింగ్ను ప్రారంభించడానికి మీ పేరుని క్లిక్ చేయండి.</translation> <translation id="3898493977366060150">Google స్మార్ట్లతో వెబ్ బ్రౌజింగ్</translation> -<translation id="390894725198123737">Macలో, పాస్వర్డ్లు మీ కీచెయిన్కి సేవ్ చేయబడవచ్చు మరియు ఈ OS X ఖాతాను భాగస్వామ్యం చేసుకునే ఇతర Chromium వినియోగదారులు వాటిని ప్రాప్యత చేయవచ్చు లేదా సమకాలీకరించవచ్చు.</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />ప్రస్తుత సెట్టింగ్లను<ph name="END_LINK" /> నివేదించడం ద్వారా Chromiumని మెరుగుపరచడంలో సహాయపడండి</translation> <translation id="4050175100176540509">ముఖ్యమైన భద్రతా మెరుగుదలలు మరియు కొత్త లక్షణాలు తాజా సంస్కరణలో అందుబాటులో ఉన్నాయి.</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" />ని ఎంచుకోండి</translation> -<translation id="4077262827416206768">దయచేసి అన్ని Chromium విండోలను మూసివేసి, ఈ మార్పు ప్రభావాన్ని కావడం కోసం Chromiumని మళ్లీ ప్రారంభించండి.</translation> <translation id="421369550622382712">Chromium కోసం గొప్ప అనువర్తనాలు, ఆటలు, పొడిగింపులు మరియు థీమ్లను కనుగొనండి.</translation> <translation id="4222580632002216401">ఇప్పుడు మీరు Chromiumకు సైన్ ఇన్ చేసారు! మీ నిర్వాహకులు సమకాలీకరణను నిలిపివేసారు.</translation> <translation id="4224199872375172890">Chromium తాజాగా ఉంది.</translation> @@ -103,7 +100,6 @@ <translation id="4421155425831608516">Chromiumకు సైన్ ఇన్ చేయడాన్ని ఈ పరికరం యొక్క నిర్వాహకులు నిలిపివేసారు.</translation> <translation id="4423735387467980091">Chromiumను అనుకూలీకరించండి మరియు నియంత్రించండి</translation> <translation id="4449801103833300785">{0,plural, =1{ఒక గంటలో Chromium తిరిగి ప్రారంభించబడుతుంది}other{# గంటలలో Chromium తిరిగి ప్రారంభించబడుతుంది}}</translation> -<translation id="4458285410772214805">దయచేసి ఈ మార్పు ప్రభావవంతం కావడానికి సైన్ అవుట్ చేసి, మళ్లీ సైన్ ఇన్ చేయండి.</translation> <translation id="4469812139324097969">Chromiumని కొంత కాలంగా పునఃప్రారంభించనందున దాని గడువు తేదీ ముగిసింది. నవీకరణ అందుబాటులో ఉంది, మీరు పునఃప్రారంభించిన తక్షణం వర్తింపజేయబడుతుంది.</translation> <translation id="4488554488975128561">హానికరమైన అనువర్తనాలు మరియు సైట్లను గుర్తించడంలో సహాయపడటానికి కొంత సిస్టమ్ సమాచారాన్ని మరియు పేజీ కంటెంట్ను Googleకి స్వయంచాలకంగా పంపడం ద్వారా మీరు Chromiumని ఉపయోగించడానికి సురక్షితమైనదిగా మరియు సులభమైనదిగా చేయడంలో సహాయపడవచ్చు.</translation> <translation id="4567424176335768812">మీరు <ph name="USER_EMAIL_ADDRESS" />గా సైన్ ఇన్ చేసారు. ఇప్పుడు మీరు మీ సైన్ ఇన్ చేసిన అన్ని పరికరాల్లో మీ బుక్మార్క్లు, చరిత్ర మరియు ఇతర సెట్టింగ్లను ప్రాప్యత చేయవచ్చు.</translation> @@ -138,7 +134,6 @@ <translation id="5698481217667032250">Chromiumను ఈ భాషలో ప్రదర్శించు</translation> <translation id="5726838626470692954">మీ నిర్వాహకులు తప్పనిసరిగా మిమ్మల్ని Chromium నుండి తీసివేసి, తిరిగి జోడించాలి.</translation> <translation id="5768914737813585044">Chromium OSను ఈ భాషలో ప్రదర్శించు</translation> -<translation id="5772805321386874569">(Chromium <ph name="BEGIN_BUTTON" />పునఃప్రారంభం<ph name="END_BUTTON" /> అవసరం)</translation> <translation id="5796460469508169315">Chromium దాదాపు సిద్ధంగా ఉంది.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Chromiumకు స్వాగతం</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb index d6d39ed..55b19bc 100644 --- a/chrome/app/resources/chromium_strings_th.xtb +++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium ไม่สามารถกำหนดหรือตั้งค่าเบราว์เซอร์เริ่มต้น</translation> <translation id="1967743265616885482">เป็นที่ทราบกันว่าโมดูลที่มีชื่อเดียวกันนี้จะขัดแย้งกับ Chromium</translation> <translation id="2008474315282236005">การดำเนินการนี้จะลบ 1 รายการออกจากอุปกรณ์นี้ หากต้องการดึงข้อมูลภายหลัง ให้ลงชื่อเข้าใช้ Chromium ด้วย <ph name="USER_EMAIL" /></translation> -<translation id="2077129598763517140">ใช้การเร่งฮาร์ดแวร์เมื่อสามารถใช้ได้</translation> <translation id="2117378023188580026">ผู้ดูแลระบบขอให้คุณเปิด Chromium ขึ้นมาใหม่เพื่อใช้การอัปเดตนี้</translation> <translation id="2119636228670142020">เกี่ยวกับ &Chromium OS</translation> <translation id="2158734852934720349">ใบอนุญาตโอเพนซอร์สของ Chromium OS</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">ตรึง Chromium กับแถบงาน</translation> <translation id="3889543394854987837">คลิกชื่อของคุณเพื่อเปิด Chromium และเริ่มท่องเว็บ</translation> <translation id="3898493977366060150">การท่องเว็บพร้อมฟีเจอร์เจ๋งๆ จาก Google</translation> -<translation id="390894725198123737">สำหรับ Mac ระบบจะบันทึกรหัสผ่านไว้ใน Keychain และผู้ใช้ Chromium คนอื่นๆ ที่แชร์บัญชี OS X นี้อาจสามารถเข้าถึงหรือซิงค์รหัสผ่านนี้ได้</translation> <translation id="4036079820698952681">ช่วยให้ Chromium ดียิ่งขึ้นด้วยการรายงาน<ph name="BEGIN_LINK" />การตั้งค่าปัจจุบัน<ph name="END_LINK" /></translation> <translation id="4050175100176540509">การปรับปรุงด้านความปลอดภัยที่สำคัญและฟีเจอร์ใหม่ๆ พร้อมให้บริการในเวอร์ชันล่าสุด</translation> <translation id="407254336480250557">เลือก <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">โปรดปิดหน้าต่าง Chromium ทั้งหมดและเปิด Chromium อีกครั้งเพื่อให้การเปลี่ยนแปลงนี้มีผล</translation> <translation id="421369550622382712">พบกับแอป เกม ส่วนขยาย และธีมเด็ดๆ สำหรับ Chromium</translation> <translation id="4222580632002216401">ขณะนี้คุณลงชื่อเข้าใช้ Chromium แล้ว! การซิงค์ถูกปิดใช้งานโดยผู้ดูแลระบบของคุณ</translation> <translation id="4224199872375172890">Chromium อัปเดตแล้ว</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">ผู้ดูแลระบบอุปกรณ์เครื่องนี้ปิดไม่ให้ลงชื่อเข้าใช้ Chromium</translation> <translation id="4423735387467980091">กำหนดค่าและควบคุม Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium จะเปิดขึ้นมาใหม่ภายใน 1 ชั่วโมง}other{Chromium จะเปิดขึ้นมาใหม่ภายใน # ชั่วโมง}}</translation> -<translation id="4458285410772214805">โปรดออกจากระบบ และลงชื่อเข้าใช้อีกครั้งเพื่อให้การเปลี่ยนแปลงนี้มีผล</translation> <translation id="4469812139324097969">Chromium ล้าสมัยเพราะไม่ได้เปิดใหม่มาระยะหนึ่งแล้ว มีเวอร์ชันอัปเดตพร้อมใช้งานและระบบจะนำเวอร์ชันอัปเดตดังกล่าวไปใช้เมื่อคุณเปิดเครื่องใหม่</translation> <translation id="4488554488975128561">คุณสามารถช่วยปรับปรุงให้ Chromium ปลอดภัยและใช้งานง่ายขึ้นด้วยการส่งข้อมูลบางอย่างของระบบและเนื้อหาของหน้าเว็บไปยัง Google เพื่อช่วยตรวจหาแอปและเว็บไซต์ที่เป็นอันตราย</translation> <translation id="4567424176335768812">คุณกำลังลงชื่อเข้าใช้เป็น <ph name="USER_EMAIL_ADDRESS" /> ตอนนี้คุณสามารถเข้าถึงบุ๊กมาร์ก ประวัติการเข้าชม และการตั้งค่าอื่นๆ บนอุปกรณ์ทั้งหมดที่ลงชื่อเข้าใช้</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">แสดง Chromium ในภาษานี้</translation> <translation id="5726838626470692954">ผู้จัดการต้องนำคุณออกแล้วเพิ่มคุณกลับเข้าไปใน Chromium ใหม่</translation> <translation id="5768914737813585044">แสดงระบบปฏิบัติการ Chromium ในภาษานี้</translation> -<translation id="5772805321386874569">(จำเป็นต้อง <ph name="BEGIN_BUTTON" />รีสตาร์ท<ph name="END_BUTTON" /> Chromium)</translation> <translation id="5796460469508169315">Chromium เกือบจะพร้อมใช้งานแล้ว</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">ยินดีต้อนรับสู่ Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb index afc117b..a2925af 100644 --- a/chrome/app/resources/chromium_strings_tr.xtb +++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium, varsayılan tarayıcıyı tespit edemiyor veya ayarlayamıyor</translation> <translation id="1967743265616885482">Aynı isme sahip bir modülün Chromium'la çakıştığı bilinmektedir.</translation> <translation id="2008474315282236005">Bu işlem 1 öğeyi bu cihazdan silecektir. Verilerinizi daha sonra geri almak için Chromium'da <ph name="USER_EMAIL" /> hesabıyla oturum açın.</translation> -<translation id="2077129598763517140">Kullanılabilir olduğunda donanım hızlandırmayı kullan</translation> <translation id="2117378023188580026">Yöneticiniz bu güncellemeyi uygulamak için Chromium'u yeniden başlatmanızı istiyor</translation> <translation id="2119636228670142020">&Chromium OS hakkında</translation> <translation id="2158734852934720349">Chromium OS açık kaynak lisansları</translation> @@ -85,11 +84,9 @@ <translation id="3852700440713538496">Chromium'u görev çubuğunuza sabitleme</translation> <translation id="3889543394854987837">Chromium'u açmak ve göz atmaya başlamak için adınızı tıklayın.</translation> <translation id="3898493977366060150">Google Smarts ile web'e göz atma</translation> -<translation id="390894725198123737">Mac bilgisayarlarda şifreler Keychain uygulamanızda saklanabilir ve bu OS X hesabını paylaşan diğer Chromium kullanıcıları bu şifrelere erişilebilir veya şifreleri senkronize edilebilir.</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />Mevcut ayarlarınızı<ph name="END_LINK" /> bildirerek Chromium'u daha iyi hale getirmemize yardımcı olun</translation> <translation id="4050175100176540509">Son sürümde güvenlikle ilgili önemli iyileştirmeler ve yeni özellikler mevcuttur.</translation> <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" />'u seçin</translation> -<translation id="4077262827416206768">Lütfen tüm Chromium pencerelerini kapatın ve bu değişikliğin geçerli olması için Chromium'u yeniden başlatın.</translation> <translation id="421369550622382712">Chromium'a özgü harika uygulamaları, oyunları, uzantıları ve temaları keşfedin.</translation> <translation id="4222580632002216401">Chromium'da oturum açtınız! Senkronizasyon, yöneticiniz tarafından devre dışı bırakıldı.</translation> <translation id="4224199872375172890">Chromium güncel durumda.</translation> @@ -103,7 +100,6 @@ <translation id="4421155425831608516">Chromium'da oturum açma işlevi, bu cihazın yöneticisi tarafından devre dışı bırakılmıştır.</translation> <translation id="4423735387467980091">Chromium'u özelleştirin ve kontrol edin</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium bir saat içinde yeniden başlatılacak}other{Chromium # saat içinde yeniden başlatılacak}}</translation> -<translation id="4458285410772214805">Bu değişikliğin geçerli olabilmesi için lütfen çıkış yapıp tekrar oturum açın.</translation> <translation id="4469812139324097969">Bir süredir çalıştırılmadığından Chromium güncel değil. Kullanılabilir bir güncelleme var ve yeniden başlattığınızda hemen uygulanacak.</translation> <translation id="4488554488975128561">Tehlikeli uygulamalar ve sitelerin tespit edilmesine yardımcı olmak üzere Google'a bazı sistem bilgilerini ve sayfa içeriklerini otomatik olarak göndererek, Chromium'un daha güvenli olmasını ve daha kolay kullanılmasını sağlayabilirsiniz.</translation> <translation id="4567424176335768812"><ph name="USER_EMAIL_ADDRESS" /> olarak oturum açtınız. Şimdi oturum açtığınız tüm cihazlarda yer işaretlerinize, geçmişinize ve diğer ayarlarınıza erişebilirsiniz.</translation> @@ -138,7 +134,6 @@ <translation id="5698481217667032250">Chromium'u bu dilde görüntüle</translation> <translation id="5726838626470692954">Yöneticinizin sizi Chromium'dan kaldırması ve daha sonra tekrar eklemesi gerekir.</translation> <translation id="5768914737813585044">Chromium OS'yi bu dilde görüntüle</translation> -<translation id="5772805321386874569">(Chromium'un <ph name="BEGIN_BUTTON" />yeniden başlatılmasını<ph name="END_BUTTON" /> gerektirir)</translation> <translation id="5796460469508169315">Chromium neredeyse hazır.</translation> <translation id="5820394555380036790">Chromium OS</translation> <translation id="5862307444128926510">Chromium'a Hoş Geldiniz</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb index 110f4219..fac28fa 100644 --- a/chrome/app/resources/chromium_strings_uk.xtb +++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium не може визначити чи встановити веб-переглядач за умовчанням</translation> <translation id="1967743265616885482">Відомо, що модуль із такою назвою конфліктує з Chromium.</translation> <translation id="2008474315282236005">1 елемент буде видалено з цього пристрою. Щоб відновити дані пізніше, увійдіть в обліковий запис Chromium як <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Використовувати апаратне прискорення, якщо доступно</translation> <translation id="2117378023188580026">Адміністратор просить перезапустити Chromium, щоб застосувати це оновлення</translation> <translation id="2119636228670142020">Про &ОС Chromium</translation> <translation id="2158734852934720349">Ліцензії ОС Chromium із відкритим кодом</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Як закріпити значок Chromium на панелі завдань</translation> <translation id="3889543394854987837">Натисніть своє ім’я, щоб відкрити Chromium і розпочати перегляд сайтів.</translation> <translation id="3898493977366060150">Перегляд веб-сторінок із розумними функціями Google</translation> -<translation id="390894725198123737">В ОС Mac паролі можуть зберігатися в системі Keychain, де їх можуть застосовувати чи синхронізувати інші користувачі Chromium, які спільно користуються цим обліковим записом ОС X.</translation> <translation id="4036079820698952681">Допоможіть покращити Chromium, надсилаючи звіти про <ph name="BEGIN_LINK" />поточні налаштування<ph name="END_LINK" /></translation> <translation id="4050175100176540509">В останній версії покращено безпеку та додано нові функції.</translation> <translation id="407254336480250557">Виберіть <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Щоб зміна почала діяти, закрийте всі вікна Chromium і перезапустіть його.</translation> <translation id="421369550622382712">Знаходьте чудові додатки, ігри, розширення й теми для Chromium.</translation> <translation id="4222580632002216401">Ви ввійшли в Chromium. Проте ваш адміністратор вимкнув синхронізацію.</translation> <translation id="4224199872375172890">У вас остання версія Chromium.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Адміністратор цього пристрою вимкнув вхід у Chromium.</translation> <translation id="4423735387467980091">Налаштування та керування Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium перезапуститься через годину}one{Chromium перезапуститься через # годину}few{Chromium перезапуститься через # години}many{Chromium перезапуститься через # годин}other{Chromium перезапуститься через # години}}</translation> -<translation id="4458285410772214805">Щоб зміна почала діяти, вийдіть і ввійдіть знову.</translation> <translation id="4469812139324097969">Chromium застарів, оскільки протягом якогось часу його не перезапускали. Оновлення доступне та буде застосоване одразу після перезапуску.</translation> <translation id="4488554488975128561">Ви можете зробити Chromium безпечнішим і простішим у користуванні, автоматично надсилаючи в Google деяку інформацію про систему та вміст сторінок, щоб допомогти виявляти небезпечні додатки й сайти.</translation> <translation id="4567424176335768812">Ви ввійшли як <ph name="USER_EMAIL_ADDRESS" />. Ваші закладки, історія й інші налаштування будуть доступні на всіх пристроях, на яких ви ввійдете в цей обліковий запис.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Вибрати цю мову для Chromium</translation> <translation id="5726838626470692954">Вашому адміністратору потрібно вилучити й знову додати вас у Chromium.</translation> <translation id="5768914737813585044">Вибрати цю мову для ОС Chromium</translation> -<translation id="5772805321386874569">(потрібно <ph name="BEGIN_BUTTON" />перезапустити<ph name="END_BUTTON" /> Chromium)</translation> <translation id="5796460469508169315">Chromium майже готовий.</translation> <translation id="5820394555380036790">ОС Chromium</translation> <translation id="5862307444128926510">Вітаємо в Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb index 045489f..94aec09 100644 --- a/chrome/app/resources/chromium_strings_vi.xtb +++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium không thể xác định hoặc đặt trình duyệt mặc định</translation> <translation id="1967743265616885482">Một mô-đun có cùng tên đã được xác định là xung đột với Chromium.</translation> <translation id="2008474315282236005">Thao tác này sẽ xóa 1 mục khỏi thiết bị này. Để truy xuất dữ liệu của bạn sau, hãy đăng nhập vào Chromium dưới dạng <ph name="USER_EMAIL" />.</translation> -<translation id="2077129598763517140">Sử dụng chế độ tăng tốc phần cứng khi khả dụng</translation> <translation id="2117378023188580026">Quản trị viên của bạn yêu cầu bạn chạy lại Chromium để áp dụng bản cập nhật này</translation> <translation id="2119636228670142020">Giới thiệu về &Chromium OS</translation> <translation id="2158734852934720349">Giấy phép nguồn mở Chromium OS</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">Ghim Chromium vào thanh tác vụ của bạn</translation> <translation id="3889543394854987837">Nhấp vào tên của bạn để mở Chromium và bắt đầu duyệt web.</translation> <translation id="3898493977366060150">Duyệt web bằng Google smarts</translation> -<translation id="390894725198123737">Trên máy Mac, mật khẩu có thể được lưu vào Keychain và được truy cập hoặc đồng bộ hóa bởi những người dùng Chromium khác dùng chung tài khoản OS X này.</translation> <translation id="4036079820698952681">Giúp cải thiện Chromium bằng cách báo cáo <ph name="BEGIN_LINK" />cài đặt hiện tại<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Cải thiện bảo mật quan trọng và tính năng mới có trong phiên bản mới nhất.</translation> <translation id="407254336480250557">Chọn <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">Hãy đóng tất cả cửa sổ Chromium và chạy lại Chromium để thay đổi này có hiệu lực.</translation> <translation id="421369550622382712">Khám phá các ứng dụng, trò chơi, tiện ích và chủ đề tuyệt vời cho Chromium.</translation> <translation id="4222580632002216401">Bạn hiện đã đăng nhập vào Chromium! Quản trị viên của bạn đã tắt tính năng Đồng bộ hóa.</translation> <translation id="4224199872375172890">Chromium đã được cập nhật.</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">Quản trị viên của thiết bị này đã tắt tính năng đăng nhập vào Chromium.</translation> <translation id="4423735387467980091">Tùy chỉnh và điều khiển Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium sẽ khởi động lại sau một giờ}other{Chromium sẽ khởi động lại sau # giờ}}</translation> -<translation id="4458285410772214805">Vui lòng đăng xuất và đăng nhập lại để thay đổi này có hiệu lực.</translation> <translation id="4469812139324097969">Chromium đã lỗi thời vì ứng dụng này chưa được chạy lại trong một thời gian. Đã có bản cập nhật và bản cập nhật này sẽ được áp dụng ngay khi bạn chạy lại.</translation> <translation id="4488554488975128561">Bạn có thể giúp Chromium an toàn và dễ sử dụng hơn bằng cách tự động gửi một số thông tin hệ thống và nội dung trang cho Google để giúp phát hiện các ứng dụng và trang web nguy hiểm.</translation> <translation id="4567424176335768812">Bạn đã đăng nhập với tên <ph name="USER_EMAIL_ADDRESS" />. Bây giờ, bạn có thể truy cập dấu trang, lịch sử và các cài đặt khác trên tất cả những thiết bị đã đăng nhập của bạn.</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">Hiển thị Chromium bằng ngôn ngữ này</translation> <translation id="5726838626470692954">Người quản lý của bạn phải xóa và thêm lại bạn vào Chromium.</translation> <translation id="5768914737813585044">Hiển thị Chromium OS bằng ngôn ngữ này</translation> -<translation id="5772805321386874569">(yêu cầu Chromium <ph name="BEGIN_BUTTON" />khởi động lại<ph name="END_BUTTON" />)</translation> <translation id="5796460469508169315">Chromium gần như đã sẵn sàng.</translation> <translation id="5820394555380036790">Hệ điều hành Chromium</translation> <translation id="5862307444128926510">Chào mừng bạn đến với Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb index ec8797a4..b86165a 100644 --- a/chrome/app/resources/chromium_strings_zh-CN.xtb +++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium 无法确定或设置默认浏览器</translation> <translation id="1967743265616885482">已发现一个同名的模块与 Chromium 存在冲突。</translation> <translation id="2008474315282236005">这会从这台设备上删除 1 项内容。如果日后想要检索您的数据,届时请以 <ph name="USER_EMAIL" /> 的身份登录 Chromium。</translation> -<translation id="2077129598763517140">使用硬件加速模式(如果可用)</translation> <translation id="2117378023188580026">您的管理员要求您重新启动 Chromium 以应用此项更新</translation> <translation id="2119636228670142020">关于 Chromium 操作系统(&C)</translation> <translation id="2158734852934720349">Chromium操作系统开放源代码许可</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">将 Chromium 固定到任务栏</translation> <translation id="3889543394854987837">点击您的姓名即可打开Chromium并开始浏览。</translation> <translation id="3898493977366060150">利用 Google 的智能技术浏览网页</translation> -<translation id="390894725198123737">在 Mac 上,密码可能会保存到您的钥匙串 (Keychain) 中,这将导致共用此 OS X 帐号的其他 Chromium 用户都能够访问或同步处理这些密码。</translation> <translation id="4036079820698952681">报告<ph name="BEGIN_LINK" />当前设置<ph name="END_LINK" />,协助我们改进 Chromium</translation> <translation id="4050175100176540509">最新版本不仅在安全性方面做出了重要改进,还提供了多项新功能。</translation> <translation id="407254336480250557">选择 <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">请关闭所有 Chromium 窗口,然后重新启动 Chromium,以便让此更改生效。</translation> <translation id="421369550622382712">在这里,您可以找到适用于 Chromium 的精彩应用、游戏、扩展程序和主题背景。</translation> <translation id="4222580632002216401">您现在已登录 Chromium!不过,管理员已停用同步功能。</translation> <translation id="4224199872375172890">Chromium 已是最新版本。</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">此设备的管理员已禁止登录 Chromium。</translation> <translation id="4423735387467980091">自定义及控制 Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium 将在 1 小时后重新启动}other{Chromium 将在 # 小时后重新启动}}</translation> -<translation id="4458285410772214805">请先退出,然后重新登录,以便此更改生效。</translation> <translation id="4469812139324097969">Chromium 已有一段时间未重新启动,因此现在已不是最新版本。目前有可用更新,系统会在您重新启动 Chromium 后应用这些更新。</translation> <translation id="4488554488975128561">通过允许自动向 Google 发送某些系统信息和网页内容以帮助检测危险应用和网站,您可助力我们提高 Chromium 的安全性和易用性。</translation> <translation id="4567424176335768812">您已使用 <ph name="USER_EMAIL_ADDRESS" /> 的身份登录。现在您可在已登录的所有设备上访问您的书签、历史记录和其他设置。</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">以这种语言显示 Chromium</translation> <translation id="5726838626470692954">您的管理员必须先将您移除,然后再将您重新添加到 Chromium。</translation> <translation id="5768914737813585044">以这种语言显示 Chromium 操作系统</translation> -<translation id="5772805321386874569">(需要<ph name="BEGIN_BUTTON" />重新启动<ph name="END_BUTTON" /> Chromium)</translation> <translation id="5796460469508169315">Chromium 即将准备就绪。</translation> <translation id="5820394555380036790">Chromium 操作系统</translation> <translation id="5862307444128926510">欢迎使用 Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb index 54be1827..a21fad2 100644 --- a/chrome/app/resources/chromium_strings_zh-TW.xtb +++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -29,7 +29,6 @@ <translation id="1966382378801805537">Chromium 無法偵測或設定預設瀏覽器</translation> <translation id="1967743265616885482">已知相同名稱的模組會與 Chromium 衝突。</translation> <translation id="2008474315282236005">登出後,系統會將 1 個項目從這個裝置上刪除。日後如要重新取得你的資料,請以 <ph name="USER_EMAIL" /> 身分登入 Chromium。</translation> -<translation id="2077129598763517140">在可用時使用硬體加速</translation> <translation id="2117378023188580026">你的管理員請你重新啟動 Chromium,以套用這項更新</translation> <translation id="2119636228670142020">關於 Chromium 作業系統(&C)</translation> <translation id="2158734852934720349">Chromium 作業系統開放原始碼授權</translation> @@ -87,11 +86,9 @@ <translation id="3852700440713538496">將 Chromium 固定至工作列</translation> <translation id="3889543394854987837">按一下你的名稱即可開啟 Chromium 並開始瀏覽。</translation> <translation id="3898493977366060150">採用 Google 技術的網路瀏覽體驗</translation> -<translation id="390894725198123737">在 Mac 上,密碼會儲存在您的 Keychain 中,因此其他共用這個 OS X 帳戶的 Chromium 使用者都能存取或同步處理這些密碼。</translation> <translation id="4036079820698952681">只要回報<ph name="BEGIN_LINK" />目前的設定<ph name="END_LINK" />,就能助我們一臂之力,讓 Chromium 更臻完美</translation> <translation id="4050175100176540509">最新版本包含重要的安全性改善與新功能。</translation> <translation id="407254336480250557">選取 [<ph name="SMALL_PRODUCT_LOGO" /> Chromium]<ph name="BEGIN_BOLD" /><ph name="END_BOLD" /></translation> -<translation id="4077262827416206768">請關閉所有 Chromium 視窗,並且重新啟用 Chromium,這項變更即會生效。</translation> <translation id="421369550622382712">探索 Chromium 專用的優質應用程式、遊戲、擴充功能和主題。</translation> <translation id="4222580632002216401">你現在已登入 Chromium!但管理員已關閉同步功能。</translation> <translation id="4224199872375172890">Chromium 目前是最新版本。</translation> @@ -105,7 +102,6 @@ <translation id="4421155425831608516">這部裝置的管理員停用了 Chromium 的登入功能。</translation> <translation id="4423735387467980091">自訂及控制 Chromium</translation> <translation id="4449801103833300785">{0,plural, =1{Chromium 將於 1 小時後重新啟動}other{Chromium 將於 # 小時後重新啟動}}</translation> -<translation id="4458285410772214805">請先登出,然後重新登入,這項變更才會生效。</translation> <translation id="4469812139324097969">Chromium 已有一段時間未重新啟動,現用版本因此過舊。重新啟動後,即會套用可用的更新。</translation> <translation id="4488554488975128561">你可以選擇自動傳送部分系統資訊和網頁內容給 Google,協助我們偵測危險的應用程式和網站,讓 Chromium 變得更安全、更好用。</translation> <translation id="4567424176335768812">你已使用 <ph name="USER_EMAIL_ADDRESS" /> 的身分登入,可以在所有登入的裝置上使用你的書籤、紀錄和其他設定。</translation> @@ -140,7 +136,6 @@ <translation id="5698481217667032250">將 Chromium 的介面文字設為這種語言</translation> <translation id="5726838626470692954">管理員必須先將你移除,再重新加入 Chromium 中。</translation> <translation id="5768914737813585044">將 Chromium 作業系統的介面文字設為這種語言</translation> -<translation id="5772805321386874569">(必須<ph name="BEGIN_BUTTON" />重新啟動<ph name="END_BUTTON" /> Chromium)</translation> <translation id="5796460469508169315">Chromium 即將準備就緒。</translation> <translation id="5820394555380036790">Chromium 作業系統</translation> <translation id="5862307444128926510">歡迎使用 Chromium</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index f1e1932..53d8e157 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">የተ&ዘጋውን መስኮት ዳግም ክፈት</translation> <translation id="2731700343119398978">እባክዎ ይጠብቁ...</translation> <translation id="2731710757838467317">የእርስዎ ክትትል የሚደረግበት ተጠቃሚ በመፍጠር ላይ። ይሄ ትንሽ ጊዜ ሊወስድ ይችላል።</translation> -<translation id="2733364097704495499">አታሚ <ph name="PRINTER_NAME" />ን በGoogle ደመና ህትመት ላይ ማስመዝገብ ይፈልጋሉ?</translation> <translation id="2735438478659026460">የመዳፊት ጠቋሚው ሲቆም በራስ-ሰር ጠቅ አድርግ</translation> <translation id="2735712963799620190">የጊዜ ሰሌዳ</translation> <translation id="2737363922397526254">ሰብስብ...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">የደመና አገልግሎቶችን አንቃ</translation> <translation id="3599863153486145794">ታሪክን በመለያ ከገቡ ሁሉም መሣሪያዎች ላይ ያጸዳል። የእርስዎ Google መለያ <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> ላይ ሌሎች የአሰሳ ታሪክ ዓይነቶች ሊኖረው ይችላል</translation> <translation id="3600792891314830896">ድምጽን በሚያጫውቱ ጣቢያዎች ላይ ድምጸ-ከል አድርግ</translation> +<translation id="3602290021589620013">ቅድመ-ዕይታ</translation> <translation id="3603533104205588786">አንድ ገጽ ዕልባት ለማድረግ ኮከቡን ጠቅ ማድረግ ይችላሉ</translation> <translation id="3603622770190368340">የአውታረ መረብ እውቅና ማረጋገጫ ያግኙ</translation> <translation id="3604048165392640554">ምንም የተንቀሳቃሽ ስልክ ግንኙነት አልተገኘም። በሌሎች መሣሪያዎችዎ ላይ ቅጽበታዊ እንደ ሞደም መጠቀምን ያብሩና እንደገና ይሞክሩ። <a target="_blank" href="<ph name="URL" />">የበለጠ ለመረዳት</a></translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 669a0ea..75651ac 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -870,7 +870,7 @@ <translation id="2327492829706409234">تمكين التطبيق</translation> <translation id="2329597144923131178">سجّل الدخول للحصول على الإشارات المرجعية، والسجل، وكلمات المرور، والإعدادات الأخرى على كل أجهزتك.</translation> <translation id="2332131598580221120">عرض في المتجر</translation> -<translation id="2332742915001411729">إعادة تعيين على الإعدادات الافتراضية</translation> +<translation id="2332742915001411729">إعادة الضبط على الإعداد التلقائي</translation> <translation id="2335122562899522968">تُعين هذه الصفحة ملفات تعريف الارتباط.</translation> <translation id="2336228925368920074">وضع إشارة على جميع علامات التبويب...</translation> <translation id="2336381494582898602">Powerwash</translation> @@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">إعادة ف&تح النافذة المغلقة</translation> <translation id="2731700343119398978">يرجى الانتظار...</translation> <translation id="2731710757838467317">يُمكنك إنشاء مستخدم يخضع للإدارة. قد يستغرق هذا الأمر بعض الوقت.</translation> -<translation id="2733364097704495499">هل ترغب في تسجيل الطابعة <ph name="PRINTER_NAME" /> في الطباعة في السحاب من Google؟</translation> <translation id="2735438478659026460">النقر تلقائيًا عند توقف مؤشر الماوس</translation> <translation id="2735712963799620190">الجدول الزمني</translation> <translation id="2737363922397526254">تصغير...</translation> @@ -1721,6 +1720,7 @@ <translation id="3596235046596950091">تمكين خدمات السحاب</translation> <translation id="3599863153486145794">يمسح السجل من كل الأجهزة التي تم تسجيل الدخول عليها. وقد يتضمن حسابك في Google نماذج أخرى من سجل التصفح في <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">كتم صوت المواقع التي تُشغّل الصوت</translation> +<translation id="3602290021589620013">معاينة</translation> <translation id="3603533104205588786">يمكنك النقر على النجمة لوضع إشارة على إحدى الصفحات</translation> <translation id="3603622770190368340">الحصول على شهادة الشبكة</translation> <translation id="3604048165392640554">لم يتم العثور على اتصال الجوّال. يمكنك تشغيل الاتصال الفوري على أجهزتك الأخرى وإعادة المحاولة. <a target="_blank" href="<ph name="URL" />">مزيد من المعلومات</a></translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 6acb5a05..7985773 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1137,7 +1137,6 @@ <translation id="2731392572903530958">По&вторно отваряне на затворения прозорец</translation> <translation id="2731700343119398978">Моля, изчакайте...</translation> <translation id="2731710757838467317">Контролираният потребител се създава. Това може да отнеме малко време.</translation> -<translation id="2733364097704495499">Искате ли да регистрирате принтера <ph name="PRINTER_NAME" /> в Google Отпечатване в облак?</translation> <translation id="2735438478659026460">Автоматично кликване при спиране на курсора на мишката</translation> <translation id="2735712963799620190">График</translation> <translation id="2737363922397526254">Свиване...</translation> @@ -1719,6 +1718,7 @@ <translation id="3596235046596950091">Активиране на услугите в облака</translation> <translation id="3599863153486145794">Изчиства историята от всички устройства, на които сте влезли в профила си в Google. В него може да има други видове история на сърфиране, съхранявани на адрес <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Спиране на звука, възпроизвеждан от сайтовете</translation> +<translation id="3602290021589620013">Визуализация</translation> <translation id="3603533104205588786">Можете да кликнете върху иконата на звезда, за да запазите отметка към страница</translation> <translation id="3603622770190368340">Получаване на мрежов сертификат</translation> <translation id="3604048165392640554">Не бе намерена мобилна връзка. Включете функцията за незабавен тетъринг на другите си устройства и опитайте отново. <a target="_blank" href="<ph name="URL" />">Научете повече</a></translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 02f5f89f..318a0731 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1127,7 +1127,6 @@ <translation id="2731392572903530958">বন্ধ হওয়া উইল্ডো পুনরায়&খুলুন</translation> <translation id="2731700343119398978">অনুগ্রহ করে অপেক্ষা করুন...</translation> <translation id="2731710757838467317">আপনার তত্বাবধানে থাকা ব্যবহারকারী তৈরি করা হচ্ছে৷ এটি কয়েক মিনিট সময় নিতে পারে৷</translation> -<translation id="2733364097704495499">আপনি কি Google ক্লাউড মুদ্রণে মুদ্রকটিকে <ph name="PRINTER_NAME" /> নিবন্ধিত করতে চান?</translation> <translation id="2735438478659026460">মাউস কার্সার বন্ধ হয়ে গেলে নিজে থেকে ক্লিক করুন</translation> <translation id="2735712963799620190">সময়সূচি</translation> <translation id="2737363922397526254">সঙ্কুচিত করুন...</translation> @@ -1695,6 +1694,7 @@ <translation id="3596235046596950091">ক্লাউড পরিষেবাগুলি সক্ষম করুন</translation> <translation id="3599863153486145794">সমস্ত সাইন-ইন করা ডিভাইসগুলি থেকে ইতিহাস মুছে ফেলে। <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> এ আপনার Google অ্যাকাউন্টের অন্যান্য ধরনের ব্রাউজিংয়ের ইতিহাস থাকতে পারে।</translation> <translation id="3600792891314830896">সাউন্ড প্লে করা হয় যে সাইটগুলিতে সেগুলি মিউট করুন</translation> +<translation id="3602290021589620013">পূর্বরূপ</translation> <translation id="3603533104205588786">একটি পৃষ্ঠাকে বুকমার্ক করতে তারকা আইকনটিতে ক্লিক করুন৷</translation> <translation id="3603622770190368340">নেটওয়ার্ক শংসাপত্র প্রাপ্ত করুন</translation> <translation id="3604048165392640554">কোনও মোবাইল সংযোগ পাওয়া যায়নি। আপনার অন্যান্য ডিভাইসগুলিতে ঝটপট টিথারিং চালু করে আবার চেষ্টা করুন। <a target="_blank" href="<ph name="URL" />">আরও জানুন</a></translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index bee29d2b..f5013d0f 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1139,7 +1139,6 @@ <translation id="2731392572903530958">T&orna a obrir la finestra tancada</translation> <translation id="2731700343119398978">Espereu...</translation> <translation id="2731710757838467317">S'està creant l'usuari supervisat. Pot ser que aquest procés tardi una estona.</translation> -<translation id="2733364097704495499">Voleu registrar la impressora <ph name="PRINTER_NAME" /> a Google Cloud Print?</translation> <translation id="2735438478659026460">Fes clic automàticament quan s'aturi el cursor del ratolí</translation> <translation id="2735712963799620190">Programació</translation> <translation id="2737363922397526254">Redueix...</translation> @@ -1720,6 +1719,7 @@ <translation id="3596235046596950091">Activa els serveis en núvol</translation> <translation id="3599863153486145794">Esborra l'historial de tots els dispositius en què tinguis iniciada la sessió. A <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />, trobaràs altres maneres d'explorar l'historial del teu compte de Google.</translation> <translation id="3600792891314830896">Silencia els llocs web que reprodueixen so</translation> +<translation id="3602290021589620013">Previsualitza</translation> <translation id="3603533104205588786">Pots fer clic a l'estrella per afegir la pàgina a les adreces d'interès</translation> <translation id="3603622770190368340">Obtenció del certificat de xarxa</translation> <translation id="3604048165392640554">No s'ha trobat cap connexió mòbil. Activa Compartició de xarxa instantània als altres dispositius i torna-ho a provar. <a target="_blank" href="<ph name="URL" />">Més informació</a></translation> @@ -2548,7 +2548,7 @@ <translation id="4927314534488570958">Cal tenir <ph name="PLUGIN_NAME" /> per mostrar alguns elements d'aquesta pàgina</translation> <translation id="4927753642311223124">No hi ha cap notificació, podeu continuar.</translation> <translation id="4927846293686536410">Inicia la sessió per tenir les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració en tots els dispositius. A més, iniciaràs la sessió automàticament als serveis de Google.</translation> -<translation id="4929386379796360314">Imprimeix les destinacions</translation> +<translation id="4929386379796360314">Destinacions d'impressió</translation> <translation id="4931132176527519925">Projecta sempre els vídeos</translation> <translation id="4933484234309072027">incrustada a <ph name="URL" /></translation> <translation id="493571969993549666">Afegeix un usuari supervisat</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 5ab1ca86..02f8507 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1141,7 +1141,6 @@ <translation id="2731392572903530958">Znovu ot&evřít zavřené okno</translation> <translation id="2731700343119398978">Čekejte prosím...</translation> <translation id="2731710757838467317">Vytváření dozorovaného uživatele. Může to chvíli trvat.</translation> -<translation id="2733364097704495499">Chcete tiskárnu <ph name="PRINTER_NAME" /> zaregistrovat do služby Google Cloud Print?</translation> <translation id="2735438478659026460">Automaticky kliknout, když se kurzor myši zastaví.</translation> <translation id="2735712963799620190">Plán</translation> <translation id="2737363922397526254">Sbalit...</translation> @@ -1721,6 +1720,7 @@ <translation id="3596235046596950091">Aktivovat cloudové služby</translation> <translation id="3599863153486145794">Vymaže historii ze všech zařízení, na kterých jste přihlášeni. Na stránce <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> mohou být k dispozici další druhy historie prohlížení zaznamenané ve vašem účtu Google.</translation> <translation id="3600792891314830896">Ztlumit weby, které přehrávají zvuky</translation> +<translation id="3602290021589620013">Náhled</translation> <translation id="3603533104205588786">Stránku přidáte do záložek kliknutím na hvězdičku</translation> <translation id="3603622770190368340">Získání certifikátu sítě</translation> <translation id="3604048165392640554">Nebylo nalezeno žádné mobilní připojení. Zapněte na svých dalších zařízeních dynamický tethering a zkuste to znovu. <a target="_blank" href="<ph name="URL" />">Další informace</a></translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index d2de4815..76eea36 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1138,7 +1138,6 @@ <translation id="2731392572903530958">G&enåbn lukket vindue</translation> <translation id="2731700343119398978">Vent et øjeblik...</translation> <translation id="2731710757838467317">Din administrerede bruger oprettes. Dette kan tage et øjeblik.</translation> -<translation id="2733364097704495499">Vil du registrere printeren <ph name="PRINTER_NAME" /> til Google Cloudprinter?</translation> <translation id="2735438478659026460">Klik automatisk, når musemarkøren stopper</translation> <translation id="2735712963799620190">Tidsplan</translation> <translation id="2737363922397526254">Skjul...</translation> @@ -1723,6 +1722,7 @@ <translation id="3596235046596950091">Aktivér skytjenester</translation> <translation id="3599863153486145794">Rydder historikken på alle enheder, hvor du er logget ind. Din Google-konto kan have andre former for browserhistorik på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Lyden slås fra for websites, der afspiller lyd</translation> +<translation id="3602290021589620013">Eksempelvisning</translation> <translation id="3603533104205588786">Du kan klikke på stjernen for at tilføje siden som bogmærke</translation> <translation id="3603622770190368340">Få fat i et netværkscertifikat</translation> <translation id="3604048165392640554">Der blev ikke fundet nogen mobilforbindelse. Aktivér Øjeblikkelig netdeling på dine andre enheder, og prøv igen. <a target="_blank" href="<ph name="URL" />">Få flere oplysninger</a></translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index c3a26f86..e2c00fda 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1136,7 +1136,6 @@ <translation id="2731392572903530958">Geschlossenes Fenster wieder öffn&en</translation> <translation id="2731700343119398978">Bitte warten...</translation> <translation id="2731710757838467317">Der betreute Nutzer wird erstellt. Bitte warten...</translation> -<translation id="2733364097704495499">Möchten Sie den Drucker <ph name="PRINTER_NAME" /> für Google Cloud Print registrieren?</translation> <translation id="2735438478659026460">Bei Anhalten des Mauszeigers automatisch klicken</translation> <translation id="2735712963799620190">Zeitplan</translation> <translation id="2737363922397526254">Minimieren...</translation> @@ -1718,6 +1717,7 @@ <translation id="3596235046596950091">Clouddienste aktivieren</translation> <translation id="3599863153486145794">Löscht den Verlauf bei allen angemeldeten Geräten. Möglicherweise verfügt Ihr Google-Konto unter <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> über andere Browserverläufe.</translation> <translation id="3600792891314830896">Websites stummschalten, die Ton wiedergeben</translation> +<translation id="3602290021589620013">Vorschau</translation> <translation id="3603533104205588786">Sie können auf den Stern klicken, um eine Seite als Lesezeichen zu speichern</translation> <translation id="3603622770190368340">Netzwerkzertifikat anfordern</translation> <translation id="3604048165392640554">Keine Mobilfunkverbindung gefunden. Aktivieren Sie das Instant Tethering auf Ihren anderen Geräten und versuchen Sie es noch einmal. <a target="_blank" href="<ph name="URL" />">Weitere Informationen</a></translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index a41481b..998c48b 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1141,7 +1141,6 @@ <translation id="2731392572903530958">Εκ νέου ά&νοιγμα κλειστού παραθύρου</translation> <translation id="2731700343119398978">Περιμένετε…</translation> <translation id="2731710757838467317">Δημιουργία του χρήστη υπό επίβλεψη. Η διαδικασία ενδέχεται να διαρκέσει λίγη ώρα.</translation> -<translation id="2733364097704495499">Θέλετε να καταχωρίσετε τον εκτυπωτή <ph name="PRINTER_NAME" /> στο Google Cloud Print;</translation> <translation id="2735438478659026460">Να γίνεται αυτόματα κλικ όταν σταματά ο δείκτης του ποντικιού</translation> <translation id="2735712963799620190">Χρονοδιάγραμμα</translation> <translation id="2737363922397526254">Σύμπτυξη...</translation> @@ -1723,6 +1722,7 @@ <translation id="3596235046596950091">Ενεργοποίηση υπηρεσιών cloud</translation> <translation id="3599863153486145794">Διαγράφει το ιστορικό από όλες τις συνδεδεμένες συσκευές. Ο Λογαριασμός σας Google ενδέχεται να διαθέτει άλλες μορφές ιστορικού περιήγησης στη διεύθυνση <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Σίγαση ιστοτόπων που αναπαράγουν ήχο</translation> +<translation id="3602290021589620013">Προεπισκόπηση</translation> <translation id="3603533104205588786">Μπορείτε να κάνετε κλικ στο αστέρι για να προσθέσετε σελιδοδείκτη σε μια σελίδα</translation> <translation id="3603622770190368340">Απόκτηση πιστοποιητικού δικτύου</translation> <translation id="3604048165392640554">Δεν βρέθηκε σύνδεση στο διαδίκτυο. Ενεργοποιήστε την Άμεση σύνδεση στις άλλες συσκευές σας και προσπαθήστε ξανά. <a target="_blank" href="<ph name="URL" />">Μάθετε περισσότερα</a></translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index f9c12d6..39e2d3a 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">R&eopen Closed Window</translation> <translation id="2731700343119398978">Please wait…</translation> <translation id="2731710757838467317">Creating your supervised user. This may take a few moments.</translation> -<translation id="2733364097704495499">Do you wish to register the printer <ph name="PRINTER_NAME" /> to Google Cloud Print?</translation> <translation id="2735438478659026460">Automatically click when the mouse cursor stops</translation> <translation id="2735712963799620190">Schedule</translation> <translation id="2737363922397526254">Collapse...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Enable cloud services</translation> <translation id="3599863153486145794">Clears history from all signed-in devices. Your Google account may have other forms of browsing history at <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Mute sites that play sound</translation> +<translation id="3602290021589620013">Preview</translation> <translation id="3603533104205588786">You can click the star to bookmark a page</translation> <translation id="3603622770190368340">Obtain network certificate</translation> <translation id="3604048165392640554">No mobile connection found. Turn on Instant Tethering on your other devices and try again. <a target="_blank" href="<ph name="URL" />">Learn more</a></translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index c67a8cf0..64051b0 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -517,6 +517,7 @@ <translation id="177336675152937177">Datos de aplicaciones alojadas</translation> <translation id="1774349594977710164">Tu teléfono también desbloquea tus otros dispositivos <ph name="DEVICE_TYPE" />, debido a que se sincronizan automáticamente.</translation> <translation id="1774833706453699074">Agregar las páginas abiertas a Favoritos...</translation> +<translation id="1775381402323441512">Información del video</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> <translation id="177694132944350798">Tus datos se encriptaron con tu contraseña de Google el <ph name="TIME" />. Ingresa la contraseña para iniciar la sincronización.</translation> <translation id="1779652936965200207">Ingresa esta clave de acceso en "<ph name="DEVICE_NAME" />":</translation> @@ -559,6 +560,7 @@ <translation id="1829192082282182671">Alejar</translation> <translation id="1830550083491357902">No has accedido.</translation> <translation id="1832511806131704864">Cambio de teléfono actualizado</translation> +<translation id="1834503245783133039">No se pudo realizar la descarga: <ph name="FILE_NAME" /></translation> <translation id="1838374766361614909">Borrar la búsqueda</translation> <translation id="1838709767668011582">Sitio de Google</translation> <translation id="1839704667838141620">Cambiar la forma de compartir este archivo</translation> @@ -695,6 +697,7 @@ <translation id="2079053412993822885">Si eliminas uno de tus propios certificados, ya no podrás utilizarlo para identificarte.</translation> <translation id="2079545284768500474">Deshacer</translation> <translation id="2080070583977670716">Más opciones de configuración</translation> +<translation id="2084108471225856927">Configuración del dispositivo</translation> <translation id="2085470240340828803">Ya existe un archivo llamado "<ph name="FILENAME" />". ¿Qué acción quieres realizar?</translation> <translation id="2087822576218954668">Imprimir: <ph name="PRINT_NAME" /></translation> <translation id="2089566709556890888">Navega de forma segura con Google Chrome</translation> @@ -1134,7 +1137,6 @@ <translation id="2731392572903530958">Volv&er a abrir una ventana cerrada</translation> <translation id="2731700343119398978">Espera...</translation> <translation id="2731710757838467317">Se está creando el usuario supervisado. Esta acción puede tardar unos minutos.</translation> -<translation id="2733364097704495499">¿Quieres registrar la impresora <ph name="PRINTER_NAME" /> en Google Cloud Print?</translation> <translation id="2735438478659026460">Hacer clic automáticamente cuando se detenga el cursor del mouse</translation> <translation id="2735712963799620190">Cronograma</translation> <translation id="2737363922397526254">Contraer...</translation> @@ -1417,6 +1419,7 @@ <translation id="3130528281680948470">El dispositivo se restablecerá y todas las cuentas de usuario y los datos locales se eliminarán. Esta acción no se puede deshacer.</translation> <translation id="313205617302240621">¿Olvidaste la contraseña?</translation> <translation id="3135204511829026971">Girar pantalla</translation> +<translation id="313963229645891001">Descargando, <ph name="STATUS" /></translation> <translation id="3139925690611372679">Avatar amarillo predeterminado</translation> <translation id="3140353188828248647">Enfoque en la barra de direcciones</translation> <translation id="3141318088920353606">Escuchando…</translation> @@ -1544,6 +1547,7 @@ <translation id="3326821416087822643">Comprimiendo <ph name="FILE_NAME" />…</translation> <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation> <translation id="3331974543021145906">Información de la aplicación</translation> +<translation id="3335337277364016868">Año de grabación</translation> <translation id="3335947283844343239">Volver a abrir pestaña cerrada</translation> <translation id="3340978935015468852">configuración</translation> <translation id="3341703758641437857">Permitir el acceso a las URL del archivo</translation> @@ -1605,6 +1609,7 @@ <translation id="3435738964857648380">Seguridad</translation> <translation id="3435896845095436175">Habilitar</translation> <translation id="3436038974659740746">Ortografía personalizada</translation> +<translation id="3437801641691368414">Hora de creación</translation> <translation id="3438633801274389918">Ninja</translation> <translation id="3439153939049640737">Permitir siempre que <ph name="HOST" /> acceda al micrófono</translation> <translation id="3439970425423980614">Abriendo PDF en vista previa</translation> @@ -1648,6 +1653,7 @@ <translation id="3487007233252413104">función anónima</translation> <translation id="348780365869651045">Esperando a AppCache...</translation> <translation id="3488065109653206955">Parcialmente activado</translation> +<translation id="348999362308956431">Descarga completa: <ph name="FILE_NAME" /></translation> <translation id="3492788708641132712">La sincronización no está funcionando. Vuelve a acceder a tu cuenta.</translation> <translation id="3493881266323043047">Validez</translation> <translation id="3494769164076977169">Preguntarme cuando un sitio intente descargar archivos automáticamente después del primer archivo (recomendado)</translation> @@ -1712,6 +1718,7 @@ <translation id="3596235046596950091">Habilitar los servicios de nube</translation> <translation id="3599863153486145794">Borra el historial de todos los dispositivos en los que accediste. Es posible que tu cuenta de Google tenga otros formularios del historial de navegación en <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Silenciar los sitios que reproducen sonido</translation> +<translation id="3602290021589620013">Vista previa</translation> <translation id="3603533104205588786">Puedes hacer clic en la estrella para agregar una página a favoritos</translation> <translation id="3603622770190368340">Obtener certificado de red</translation> <translation id="3604048165392640554">No se encontró ninguna conexión móvil. Activa la conexión instantánea mediante dispositivo portátil en tus dispositivos y vuelve a intentarlo. <a target="_blank" href="<ph name="URL" />">Más información</a></translation> @@ -1750,6 +1757,7 @@ <translation id="3646789916214779970">Restablecer el tema predeterminado</translation> <translation id="3648348069317717750">Se detectó <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Se capturó la foto.</translation> +<translation id="3650952250015018111">Permitir que "<ph name="APP_NAME" />" acceda a:</translation> <translation id="3651488188562686558">Se desconecta de Wi-Fi.</translation> <translation id="3652817283076144888">Inicializando</translation> <translation id="3653999333232393305">Seguir permitiendo que <ph name="HOST" /> acceda al micrófono</translation> @@ -1862,6 +1870,7 @@ <translation id="381202950560906753">Agregar otra</translation> <translation id="3812525830114410218">Certificado incorrecto</translation> <translation id="3813296892522778813">Consulta la <ph name="BEGIN_LINK_CHROMIUM" />Ayuda de Google Chrome<ph name="END_LINK_CHROMIUM" /> si no encuentras lo que estás buscando</translation> +<translation id="3817579325494460411">No proporcionada</translation> <translation id="3819007103695653773">Permitir que todos los sitios envíen mensajes de inserción en segundo plano</translation> <translation id="3819752733757735746">Accesibilidad mejorada (controlar la computadora con solo uno o dos cambios)</translation> <translation id="3819800052061700452">&Pantalla completa</translation> @@ -1955,6 +1964,7 @@ <translation id="394984172568887996">Importado de Internet Explorer</translation> <translation id="3950820424414687140">Acceder</translation> <translation id="3954354850384043518">En curso</translation> +<translation id="3954469006674843813"><ph name="WIDTH" /> × <ph name="HEIGHT" /> (<ph name="REFRESH_RATE" /> Hertz)</translation> <translation id="3955193568934677022">Permitir que los sitios reproduzcan contenido protegido (recomendado)</translation> <translation id="3956702100721821638">No se pudo establecer la conexión con Google Play</translation> <translation id="3958088479270651626">Importar favoritos y configuración</translation> @@ -2034,6 +2044,7 @@ <ph name="EXTENSION_FILE" /></translation> <translation id="4087470595660267445">Instala apps y juegos de Google Play en tu Chromebook. <a target="_blank" href="<ph name="URL" />">Más información</a></translation> <translation id="4088095054444612037">Aceptar la invitación realizada al grupo</translation> +<translation id="4089235344645910861">Se guardó la configuración y comenzó la sincronización.</translation> <translation id="4090103403438682346">Habilita el acceso verificado.</translation> <translation id="4090535558450035482">(Esta extensión está administrada y no puede eliminarse).</translation> <translation id="4091434297613116013">hojas de papel</translation> @@ -2113,6 +2124,7 @@ <translation id="4244238649050961491">Encontrar más apps para la pluma stylus</translation> <translation id="424546999567421758">Se detectó un uso elevado del disco</translation> <translation id="424726838611654458">Abrir siempre en Adobe Reader</translation> +<translation id="4247901771970415646">No se puede sincronizar con <ph name="USERNAME" /></translation> <translation id="4249248555939881673">Esperando la conexión de red...</translation> <translation id="4249373718504745892">Se bloqueó el acceso de esta página a la cámara y el micrófono.</translation> <translation id="424963718355121712">Las apps deben proceder del host al que afecten</translation> @@ -2150,6 +2162,7 @@ <translation id="4305227814872083840">largo (2 s)</translation> <translation id="4306119971288449206">Las apps deben incluir el encabezado content-type "<ph name="CONTENT_TYPE" />"</translation> <translation id="4309420042698375243"><ph name="NUM_KILOBYTES" />K (<ph name="NUM_KILOBYTES_LIVE" />K en vivo)</translation> +<translation id="4309915981827077375">Información general</translation> <translation id="4310139701823742692">El archivo no tiene el formato correcto. Verifica el archivo PPD y vuelve a intentarlo.</translation> <translation id="431076611119798497">&Detalles</translation> <translation id="4312866146174492540">Bloquear (predeterminado)</translation> @@ -2198,6 +2211,7 @@ <translation id="4409697491990005945">Márgenes</translation> <translation id="4411578466613447185">Firmante del código</translation> <translation id="4412698727486357573">Centro de ayuda</translation> +<translation id="44141919652824029">¿Deseas permitir que "<ph name="APP_NAME" />" obtenga la lista de los dispositivos USB conectados?</translation> <translation id="4414232939543644979">Nueva ventana de &incógnito</translation> <translation id="4415748029120993980">Curva elíptica SECG secp384r1 (también conocido como NIST P-384)</translation> <translation id="4419409365248380979">Permitir siempre que <ph name="HOST" /> configure las cookies</translation> @@ -2291,6 +2305,7 @@ <translation id="4565377596337484307">Ocultar contraseña</translation> <translation id="4567772783389002344">Agregar palabra</translation> <translation id="4568213207643490790">Este dispositivo no permite cuentas de Google.</translation> +<translation id="4568854179928172494">Hora de modificación</translation> <translation id="4569747168316751899">Cuando esté inactivo</translation> <translation id="4572659312570518089">La autenticación se canceló mientras se establecía la conexión a "<ph name="DEVICE_NAME" />".</translation> <translation id="4572815280350369984">Archivo <ph name="FILE_TYPE" /></translation> @@ -2334,6 +2349,7 @@ <translation id="4640525840053037973">Iniciar sesión con tu Cuenta de Google</translation> <translation id="4641539339823703554">Chrome no pudo establecer la hora del sistema. Comprueba la hora más abajo y corrígela si es necesario.</translation> <translation id="4643612240819915418">Abrir vide&o en una nueva pestaña</translation> +<translation id="4644818355646995778">Descargando, <ph name="PERCENT_REMAINING" /></translation> <translation id="4645676300727003670">&Conservar</translation> <translation id="4647090755847581616">&Cerrar pestaña</translation> <translation id="4647697156028544508">Ingresa el PIN para "<ph name="DEVICE_NAME" />":</translation> @@ -2721,6 +2737,7 @@ <translation id="5250372599208556903"><ph name="SEARCH_ENGINE_NAME" /> usa tu ubicación para proporcionarte contenido local. Puedes cambiar esta configuración en <ph name="SETTINGS_LINK" />.</translation> <translation id="5252456968953390977">Itinerancia:</translation> <translation id="5252653240322147470">El PIN debe tener <ph name="MAXIMUM" /> dígitos como máximo</translation> +<translation id="5253070652067921974">Creado por</translation> <translation id="5254368820972107711">Mostrar los archivos que se quitarán</translation> <translation id="52550593576409946">No se pudo iniciar la aplicación del kiosco.</translation> <translation id="5255315797444241226">La frase de contraseña que ingresaste es incorrecta.</translation> @@ -2799,6 +2816,7 @@ <translation id="5353252989841766347">Exportar contraseñas desde Chrome</translation> <translation id="5355097969896547230">Encontrar nuevamente</translation> <translation id="5355926466126177564">La extensión "<ph name="EXTENSION_NAME" />" cambió la página que se muestra al llevar a cabo búsquedas desde el cuadro multifunción.</translation> +<translation id="5358764674931277">Velocidad de fotogramas</translation> <translation id="5360150013186312835">Mostrar en la barra de herramientas</translation> <translation id="5362741141255528695">Seleccionar archivo de clave privada.</translation> <translation id="5363109466694494651">Utilizar la función Powerwash y revertir</translation> @@ -2835,6 +2853,7 @@ <translation id="5414566801737831689">Leer los íconos de los sitios web que visites</translation> <translation id="5417312524372586921">Temas del navegador</translation> <translation id="5419294236999569767">Hora del sistema</translation> +<translation id="5420438158931847627">Determina la nitidez del texto y las imágenes</translation> <translation id="5422221874247253874">Punto de acceso</translation> <translation id="5422781158178868512">Lo sentimos, tu dispositivo de almacenamiento externo no se reconoció.</translation> <translation id="5423849171846380976">Activado</translation> @@ -3020,6 +3039,9 @@ <translation id="5678550637669481956">Se concedió acceso de lectura y escritura a <ph name="VOLUME_NAME" />.</translation> <translation id="5678955352098267522">Leer los datos en <ph name="WEBSITE_1" /></translation> <translation id="5684661240348539843">Identificador de recursos</translation> +<translation id="5686799162999241776"><ph name="BEGIN_BOLD" />No se puede cerrar la conexión de un archivo o disco virtual<ph name="END_BOLD" /> + <ph name="LINE_BREAKS" /> + Cierra todos los elementos en un archivo o disco virtual y vuelve a intentarlo.</translation> <translation id="5687326903064479980">Zona horaria</translation> <translation id="5689516760719285838">Ubicación</translation> <translation id="56907980372820799">Vincular datos</translation> @@ -3028,6 +3050,7 @@ <translation id="5694501201003948907">Comprimiendo $1 elementos…</translation> <translation id="5696143504434933566">Informar abuso de "<ph name="EXTENSION_NAME" />"</translation> <translation id="5699533844376998780">Se agregó la extensión "<ph name="EXTENSION_NAME" />".</translation> +<translation id="5700087501958648444">Información de audio</translation> <translation id="570043786759263127">Apps y servicios de Google Play</translation> <translation id="5700836101007545240">Tu administrador inhabilitó la opción Agregar conexión</translation> <translation id="5701381305118179107">Centrar</translation> @@ -3585,6 +3608,7 @@ <translation id="656398493051028875">Eliminando "<ph name="FILENAME" />"…</translation> <translation id="6567688344210276845">No se pudo cargar el ícono '<ph name="ICON" />' para las acciones de la página.</translation> <translation id="657402800789773160">&Volver a cargar esta página</translation> +<translation id="6577284282025554716">Se canceló la descarga: <ph name="FILE_NAME" /></translation> <translation id="6578664922716508575">Encriptar las contraseñas sincronizadas con tu contraseña y nombre de usuario de Google</translation> <translation id="6580151766480067746">Versión de ARC</translation> <translation id="6581162200855843583">Vínculo de Google Drive</translation> @@ -4047,6 +4071,7 @@ <translation id="7297443947353982503">Nombre de usuario o contraseña incorrectos o error de autenticación EAP</translation> <translation id="729761647156315797">Seleccionar tu idioma y teclado</translation> <translation id="7299337219131431707">Habilitar navegación como invitado</translation> +<translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{Es posible que esta app evite que Chrome funcione correctamente.}other{Es posible que estas apps eviten que Chrome funcione correctamente.}}</translation> <translation id="7303900363563182677">No se permite que este sitio vea el texto ni las imágenes que se copiaron en el portapapeles</translation> <translation id="730515362922783851">Intercambiar datos con cualquier dispositivo de la red local o Internet</translation> <translation id="7308002049209013926">Usa Launcher para acceder a actividades y apps nuevas rápidamente. Presiona Alt + mayúscula + L para acceder.</translation> @@ -4302,6 +4327,7 @@ <translation id="7707922173985738739">Usa los datos móviles.</translation> <translation id="7709152031285164251">Error: <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Transmitir…</translation> +<translation id="7711920809702896782">Información de la imagen</translation> <translation id="7714307061282548371">Se permiten las cookies de <ph name="DOMAIN" /></translation> <translation id="7714464543167945231">Certificado</translation> <translation id="7716781361494605745">URL de directivas de la autoridad de certificación de Netscape</translation> @@ -4420,6 +4446,7 @@ <translation id="7886917304091689118">Se está ejecutando en Chrome</translation> <translation id="7887334752153342268">Duplicar</translation> <translation id="7887864092952184874">Mouse Bluetooth sincronizado</translation> +<translation id="7889565820482017512">Tamaño de la pantalla</translation> <translation id="7889966925761734854">Buscar</translation> <translation id="7892100671754994880">Siguiente usuario</translation> <translation id="7893008570150657497">Acceder a fotos, música y otros medios desde tu computadora</translation> @@ -4523,6 +4550,7 @@ <translation id="8026334261755873520">Eliminar datos de navegación</translation> <translation id="8028060951694135607">Recuperación de claves de Microsoft</translation> <translation id="8028134359912645720">Mantén presionadas las teclas Ctrl, Alt, mayúscula o de Launcher para ver las combinaciones de teclas que permiten acceder de manera directa a esos modificadores.</translation> +<translation id="8028803902702117856">Descargando <ph name="SIZE" />, <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">Tamaño</translation> <translation id="8030656706657716245">Agregar impresora</translation> <translation id="8032244173881942855">No se puede transmitir la pestaña</translation> @@ -4779,6 +4807,7 @@ <translation id="84613761564611563">Se solicitó la IU de configuración de redes; espera…</translation> <translation id="8461914792118322307">Proxy</translation> <translation id="8463215747450521436">Es posible que el administrador haya eliminado o inhabilitado este usuario supervisado. Comunícate con el administrador si deseas seguir accediendo como este usuario.</translation> +<translation id="846374874681391779">Barra de descargas</translation> <translation id="8463955938112983119">Se inhabilitó <ph name="PLUGIN_NAME" />.</translation> <translation id="8464132254133862871">Esta cuenta de usuario no es elegible para el servicio.</translation> <translation id="8465252176946159372">No válido</translation> @@ -4794,6 +4823,7 @@ <translation id="8477384620836102176">&General</translation> <translation id="8480082892550707549">Aunque hayas descargado archivos de este sitio anteriormente, es posible que en este momento el sitio esté pirateado. Intenta descargar el archivo más tarde.</translation> <translation id="8480869669560681089">Dispositivo desconocido de <ph name="VENDOR_NAME" /></translation> +<translation id="8481187309597259238">Confirmar el permiso para USB</translation> <translation id="8483248364096924578">Dirección IP</translation> <translation id="8487678622945914333">Acercar</translation> <translation id="8487693399751278191">Importar favoritos ahora...</translation> @@ -5180,6 +5210,7 @@ <translation id="9094033019050270033">Actualizar contraseña</translation> <translation id="9094982973264386462">Quitar</translation> <translation id="9095253524804455615">Quitar</translation> +<translation id="9099674669267916096">Cantidad de páginas</translation> <translation id="9100765901046053179">Configuración avanzada</translation> <translation id="9101691533782776290">Iniciar aplicación</translation> <translation id="9102610709270966160">Habilitar extensión</translation> @@ -5271,6 +5302,7 @@ <translation id="939736085109172342">Nueva carpeta</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> comparte una pestaña de Chrome y audio.</translation> <translation id="942954117721265519">No hay imágenes en este directorio.</translation> +<translation id="943972244133411984">Modificado por</translation> <translation id="945522503751344254">Enviar comentarios</translation> <translation id="952992212772159698">No activado</translation> <translation id="957960681186851048">Este sitio intentó descargar varios archivos automáticamente</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index ac57222..93f5409 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -700,7 +700,7 @@ <translation id="2079053412993822885">Si eliminas uno de tus propios certificados, ya no podrás utilizarlo para identificarte.</translation> <translation id="2079545284768500474">Deshacer</translation> <translation id="2080070583977670716">Más opciones</translation> -<translation id="2084108471225856927">Ajustes del dispositivo</translation> +<translation id="2084108471225856927">Configuración del dispositivo</translation> <translation id="2085470240340828803">Ya existe un archivo "<ph name="FILENAME" />". ¿Qué quieres hacer?</translation> <translation id="2087822576218954668">Imprimir: <ph name="PRINT_NAME" /></translation> <translation id="2089566709556890888">Navega de forma segura con Google Chrome</translation> @@ -1073,7 +1073,7 @@ <translation id="264810637653812429">No se han podido encontrar dispositivos compatibles.</translation> <translation id="2648831393319960979">El dispositivo se está añadiendo a tu cuenta. Esta acción puede tardar unos minutos...</translation> <translation id="2649045351178520408">ASCII codificado en Base64, cadena de certificados</translation> -<translation id="2651353619134567122">Enviar datos del sistema. Este dispositivo envía a Google datos de diagnósticos y uso del dispositivo y las aplicaciones automáticamente. Puedes cambiar esta opción en cualquier momento en los <ph name="BEGIN_LINK1" />ajustes<ph name="END_LINK1" /> del dispositivo. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi actividad. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation> +<translation id="2651353619134567122">Enviar datos del sistema. Este dispositivo envía a Google datos de diagnósticos y uso del dispositivo y las aplicaciones automáticamente. Puedes cambiar esta opción en cualquier momento en los <ph name="BEGIN_LINK1" />ajustes<ph name="END_LINK1" /> del dispositivo. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi Actividad. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation> <translation id="2653033005692233957">No se ha podido completar la búsqueda</translation> <translation id="2653266418988778031">Si eliminas el certificado de CA, el navegador ya no podrá confiar en ningún certificado emitido por esa entidad emisora de certificados.</translation> <translation id="2653659639078652383">Enviar</translation> @@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">Volv&er a abrir ventana cerrada</translation> <translation id="2731700343119398978">Espera...</translation> <translation id="2731710757838467317">Se está creando el usuario supervisado. Esta acción puede tardar unos minutos.</translation> -<translation id="2733364097704495499">¿Quieres registrar la impresora <ph name="PRINTER_NAME" /> en Google Cloud Print?</translation> <translation id="2735438478659026460">Hacer clic automáticamente cuando se detenga el cursor del ratón</translation> <translation id="2735712963799620190">Programar</translation> <translation id="2737363922397526254">Ocultar...</translation> @@ -1431,7 +1430,7 @@ <translation id="3141318088920353606">Escuchando...</translation> <translation id="3141917231319778873">"<ph name="DEVICE_NAME" />" no admite la solicitud proporcionada.</translation> <translation id="3143515551205905069">Cancelar sincronización</translation> -<translation id="3143695347784622594">Enviar datos del sistema. Envía automáticamente datos de diagnósticos y uso del dispositivo y las aplicaciones a Google. Puedes cambiar esta opción en cualquier momento en los <ph name="BEGIN_LINK1" />ajustes<ph name="END_LINK1" /> del dispositivo. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi actividad. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation> +<translation id="3143695347784622594">Enviar datos del sistema. Envía automáticamente datos de diagnósticos y uso del dispositivo y las aplicaciones a Google. Puedes cambiar esta opción en cualquier momento en los <ph name="BEGIN_LINK1" />ajustes<ph name="END_LINK1" /> del dispositivo. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi Actividad. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation> <translation id="3144126448740580210">LISTO</translation> <translation id="3144647712221361880">Abrir enlace como</translation> <translation id="3149510190863420837">Aplicaciones de Chrome</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Habilitar servicios en la nube</translation> <translation id="3599863153486145794">Borra el historial de todos los dispositivos en los que hayas iniciado sesión. Es posible que tu cuenta de Google tenga otros tipos de historial de navegación en <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Silenciar los sitios web que reproducen sonidos</translation> +<translation id="3602290021589620013">Vista previa</translation> <translation id="3603533104205588786">Puedes hacer clic en la estrella para añadir esta página a marcadores</translation> <translation id="3603622770190368340">Obtener certificado de red</translation> <translation id="3604048165392640554">No se ha encontrado ninguna conexión móvil. Activa la conexión compartida instantánea en tus otros dispositivos e inténtalo de nuevo. <a target="_blank" href="<ph name="URL" />">Más información</a></translation> @@ -2508,7 +2508,7 @@ <translation id="4883178195103750615">Exportar marcadores a archivo HTML...</translation> <translation id="4883436287898674711">Todos los sitios de <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Administrador de tareas</translation> -<translation id="4883898390143004266">Permitir que las apps detecten la ubicación. Usa el servicio de ubicación de Google para mejorar la ubicación de las aplicaciones. Es posible que Google recoja datos de ubicación periódicamente y que los utilice de forma anónima para mejorar la precisión de la ubicación y los servicios basados en la ubicación. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation> +<translation id="4883898390143004266">Permitir que las aplicaciones detecten la ubicación. Usa el servicio de ubicación de Google para mejorar la ubicación de las aplicaciones. Es posible que Google recoja datos de ubicación periódicamente y que los utilice de forma anónima para mejorar la precisión de la ubicación y los servicios basados en la ubicación. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation> <translation id="4884740091792292473"><ph name="BEGIN_PARAGRAPH1" />Crear copia de seguridad en Google Drive. Cambia de dispositivo o restaura tus datos fácilmente en cualquier momento. La copia de seguridad incluye datos de las aplicaciones.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Los datos de aplicaciones pueden ser cualquier tipo de información que guarden las aplicaciones (según la configuración de los desarrolladores), incluyendo datos que pueden ser sensibles (como contactos, mensajes y fotos).<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Los datos de la copia de seguridad no se tienen en cuenta para calcular tu espacio de almacenamiento de Google Drive.<ph name="END_PARAGRAPH3" /> @@ -2910,7 +2910,7 @@ <translation id="5487521232677179737">Borrar los datos</translation> <translation id="5488093641312826914">Se ha copiado <ph name="COPIED_ITEM_NAME" /></translation> <translation id="5488468185303821006">Permitir en modo incógnito</translation> -<translation id="5491110079163012109">Enviar datos del sistema. Envía automáticamente datos de diagnósticos y uso del dispositivo y las aplicaciones a Google. El propietario aplica esta configuración y puede elegir si se envían datos de uso y diagnósticos de este dispositivo a Google Puedes ver esta opción en los ajustes. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi actividad. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation> +<translation id="5491110079163012109">Enviar datos del sistema. Envía automáticamente datos de diagnósticos y uso del dispositivo y las aplicaciones a Google. El propietario aplica esta configuración y puede elegir si se envían datos de uso y diagnósticos de este dispositivo a Google. Puedes ver esta opción en los ajustes. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi Actividad. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation> <translation id="5493792505296048976">pantalla encendida</translation> <translation id="5494362494988149300">Abrir al &finalizar</translation> <translation id="5494920125229734069">Seleccionar todo</translation> @@ -3581,7 +3581,7 @@ <translation id="6528513914570774834">Permitir que otros usuarios de este dispositivo usen esta red</translation> <translation id="652948702951888897">Historial de Chrome</translation> <translation id="653019979737152879">Sincronizando <ph name="FILE_NAME" />...</translation> -<translation id="6530681427077572136">Enviar datos del sistema. Este dispositivo envía a Google datos de diagnósticos y uso del dispositivo y las aplicaciones automáticamente. Puedes cambiar esta opción en cualquier momento en los ajustes del dispositivo. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi actividad. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation> +<translation id="6530681427077572136">Enviar datos del sistema. Este dispositivo envía a Google datos de diagnósticos y uso del dispositivo y las aplicaciones automáticamente. Puedes cambiar esta opción en cualquier momento en los ajustes del dispositivo. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi Actividad. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation> <translation id="6531282281159901044">Conservar archivo peligroso</translation> <translation id="6534583978616527129">Iniciar la conexión</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Nota:<ph name="END_BOLD" /> Habilita esta opción solo si tienes conciencia de los efectos de esta acción o si se te ha pedido que lo hagas, ya que la recogida de datos puede reducir el rendimiento.</translation> @@ -4207,7 +4207,7 @@ <translation id="7507930499305566459">Certificado de respuesta de estado</translation> <translation id="7508545000531937079">Presentación de diapositivas</translation> <translation id="7513029293694390567">Permite iniciar sesión automáticamente en sitios web con credenciales almacenadas. Si esta función está inhabilitada, se te solicitará la confirmación cada vez que intentes iniciar sesión en un sitio web.</translation> -<translation id="7515154058529101840"><ph name="BEGIN_PARAGRAPH1" />Permitir que las apps detecten la ubicación. Usa el servicio de ubicación de Google para mejorar la ubicación de las aplicaciones. Es posible que Google recoja datos de ubicación periódicamente y que los utilice de forma anónima para mejorar la precisión de la ubicación y los servicios basados en la ubicación.<ph name="END_PARAGRAPH1" /> +<translation id="7515154058529101840"><ph name="BEGIN_PARAGRAPH1" />Permitir que las aplicaciones detecten la ubicación. Usa el servicio de ubicación de Google para mejorar la ubicación de las aplicaciones. Es posible que Google recoja datos de ubicación periódicamente y que los utilice de forma anónima para mejorar la precisión de la ubicación y los servicios basados en la ubicación.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />El servicio de ubicación de Google utiliza fuentes como las redes Wi‑Fi y móviles y sensores para ayudar a determinar la ubicación de tu dispositivo. Este servicio está disponible si la opción Ubicación del dispositivo está activada .<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Para inhabilitar la ubicación, desactiva la opción Ubicación del dispositivo. También puedes inhabilitar el uso de sensores y redes Wi‑Fi o móviles para determinar la ubicación en los ajustes de ubicación.<ph name="END_PARAGRAPH3" /></translation> <translation id="7517569744831774757">Restablece los ajustes a la configuración predeterminada original.</translation> @@ -4426,7 +4426,7 @@ <translation id="7851457902707056880">El inicio de sesión se ha restringido únicamente a la cuenta del propietario. Reinicia el sistema e inicia sesión con la cuenta del propietario. El ordenador se reiniciará automáticamente en 30 segundos.</translation> <translation id="7851716364080026749">Bloquear siempre el acceso a la cámara y al micrófono</translation> <translation id="7853747251428735">Más herramienta&s</translation> -<translation id="7856006446339184955">Enviar datos del sistema. Este dispositivo envía a Google datos de diagnósticos y uso del dispositivo y las aplicaciones automáticamente. El propietario aplica esta <ph name="BEGIN_LINK1" />configuración<ph name="END_LINK1" />. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi actividad. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation> +<translation id="7856006446339184955">Enviar datos del sistema. Este dispositivo envía a Google datos de diagnósticos y uso del dispositivo y las aplicaciones automáticamente. El propietario aplica esta <ph name="BEGIN_LINK1" />configuración<ph name="END_LINK1" />. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi Actividad. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation> <translation id="7857117644404132472">Añadir excepción</translation> <translation id="7857949311770343000">¿Es esta la página Nueva pestaña que esperabas?</translation> <translation id="786073089922909430">Servicio: <ph name="ARC_PROCESS_NAME" /></translation> @@ -4847,7 +4847,7 @@ <translation id="8534656636775144800">¡Vaya! No se ha podido vincular el dominio. Inténtalo de nuevo.</translation> <translation id="8535005006684281994">URL de renovación de certificado de Netscape</translation> <translation id="8539727552378197395">No (HttpOnly)</translation> -<translation id="8541166929715485291">Enviar datos del sistema. Envía automáticamente datos de diagnósticos y uso del dispositivo y las aplicaciones a Google. El propietario aplica esta configuración y puede elegir si se envían datos de uso y diagnósticos de este dispositivo a Google. Puedes ver esta opción en los <ph name="BEGIN_LINK1" />ajustes<ph name="END_LINK1" />. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi actividad. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation> +<translation id="8541166929715485291">Enviar datos del sistema. Envía automáticamente datos de diagnósticos y uso del dispositivo y las aplicaciones a Google. El propietario aplica esta configuración y puede elegir si se envían datos de uso y diagnósticos de este dispositivo a Google. Puedes ver esta opción en los <ph name="BEGIN_LINK1" />ajustes<ph name="END_LINK1" />. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi Actividad. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation> <translation id="8545107379349809705">Ocultar información...</translation> <translation id="8545575359873600875">Tu contraseña no se ha podido verificar. El administrador de este usuario supervisado puede haber cambiado la contraseña recientemente. Si es así, la nueva contraseña se aplicará la próxima vez que inicies sesión. Prueba a utilizar la contraseña antigua.</translation> <translation id="8546186510985480118">Queda poco espacio en el dispositivo</translation> @@ -5255,7 +5255,7 @@ <translation id="9157697743260533322">Se ha producido un error al configurar las actualizaciones automáticas para todos los usuarios (error de lanzamiento preliminar: <ph name="ERROR_NUMBER" />)</translation> <translation id="9158715103698450907">¡Vaya! Se ha producido un problema de comunicación de red durante el proceso de autenticación. Comprueba tu conexión de red e inténtalo de nuevo.</translation> <translation id="9161070040817969420">Submarcos de: <ph name="PARENT_SITE" /></translation> -<translation id="916501514001398070">Enviar datos del sistema. Este dispositivo envía a Google datos de diagnósticos y uso del dispositivo y las aplicaciones automáticamente. El propietario aplica esta configuración. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi actividad. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation> +<translation id="916501514001398070">Enviar datos del sistema. Este dispositivo envía a Google datos de diagnósticos y uso del dispositivo y las aplicaciones automáticamente. El propietario aplica esta configuración. Si has activado la opción Actividad en la Web y en Aplicaciones, esta información se almacenará en tu cuenta para que puedas gestionarla en la sección Mi Actividad. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation> <translation id="9169496697824289689">Ver combinaciones de teclas</translation> <translation id="9169931577761441333">Añadir <ph name="APP_NAME" /> a la pantalla de inicio</translation> <translation id="9170397650136757332">Mueve el dedo ligeramente para capturar todas las partes de tu huella digital</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index cf90b454..f9f8885 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">A&va suletud aken uuesti</translation> <translation id="2731700343119398978">Oodake ...</translation> <translation id="2731710757838467317">Jälgitava kasutaja loomine. Selleks võib kuluda natuke aega.</translation> -<translation id="2733364097704495499">Kas soovite registreerida printeri <ph name="PRINTER_NAME" /> Google'i pilvprintimises?</translation> <translation id="2735438478659026460">Automaatne klõpsamine hiirekursori peatumisel</translation> <translation id="2735712963799620190">Ajakava</translation> <translation id="2737363922397526254">Ahenda ...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Luba pilveteenused</translation> <translation id="3599863153486145794">Kustutab ajaloo kõigist sisselogitud seadmetest. Aadressil <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> võib teie Google'i kontol olla muus vormis sirvimisajalugu.</translation> <translation id="3600792891314830896">Heli esitavad saidid vaigistatakse</translation> +<translation id="3602290021589620013">Eelvaade</translation> <translation id="3603533104205588786">Lehe järjehoidjatesse lisamiseks klõpsake tärnil</translation> <translation id="3603622770190368340">Võrgusertifikaadi hankimine</translation> <translation id="3604048165392640554">Mobiilsideühendust ei leitud. Lülitage teistes seadmetes sisse automaatne jagamine ja proovige uuesti. <a target="_blank" href="<ph name="URL" />">Lisateave</a></translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index fba699cf..55ac61d 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1136,7 +1136,6 @@ <translation id="2731392572903530958">با&ز کردن مجدد پنجره بسته</translation> <translation id="2731700343119398978">لطفاً صبر کنید...</translation> <translation id="2731710757838467317">در حال ایجاد کاربر نظارتشده شما. این کار ممکن است چند لحظه طول بکشد.</translation> -<translation id="2733364097704495499">آیا میخواهید چاپگر <ph name="PRINTER_NAME" /> را در Google Cloud Print ثبت کنید؟</translation> <translation id="2735438478659026460">کلیک کردن بهطور خودکار وقتی نشانگر موشواره متوقف میشود</translation> <translation id="2735712963799620190">زمانبندی</translation> <translation id="2737363922397526254">کوچک کردن...</translation> @@ -1718,6 +1717,7 @@ <translation id="3596235046596950091">فعال کردن سرویسهای ابری</translation> <translation id="3599863153486145794">سابقه را از همه دستگاههای به سیستم واردشده پاک میکند. ممکن است حساب Google شما اشکال دیگری از سابقه مرور در <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> داشته باشد.</translation> <translation id="3600792891314830896">سایتهایی که صدا پخش میکنند بیصدا شوند</translation> +<translation id="3602290021589620013">پیشنمایش</translation> <translation id="3603533104205588786">میتوانید برای نشانکگذاری صفحهای، روی ستاره کلیک کنید</translation> <translation id="3603622770190368340">دریافت گواهینامه شبکه</translation> <translation id="3604048165392640554">اتصال داده شبکه همراهی پیدا نشد. «اتصال فوری به اینترنت با تلفن همراه» را در دستگاههای دیگرتان روشن کنید و دوباره امتحان کنید. <a target="_blank" href="<ph name="URL" />">بیشتر بدانید</a></translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 4bc158cef..1ec3a7a 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1141,7 +1141,6 @@ <translation id="2731392572903530958">Avaa suljettu ikkuna uud&elleen</translation> <translation id="2731700343119398978">Odota...</translation> <translation id="2731710757838467317">Valvottua käyttäjääsi luodaan. Tässä voi kestää hetki.</translation> -<translation id="2733364097704495499">Haluatko rekisteröidä tulostimen <ph name="PRINTER_NAME" /> Google Cloud Printiin?</translation> <translation id="2735438478659026460">Klikkaa automaattisesti, kun hiiren osoitin pysähtyy</translation> <translation id="2735712963799620190">Aikataulu</translation> <translation id="2737363922397526254">Tiivistä...</translation> @@ -1723,6 +1722,7 @@ <translation id="3596235046596950091">Ota pilvipalvelut käyttöön</translation> <translation id="3599863153486145794">Tyhjentää kaikkien sisäänkirjautuneiden laitteiden historian. Google-tililläsi voi olla muuta toimintaa osoitteessa <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Mykistä ääniä toistavat sivustot</translation> +<translation id="3602290021589620013">Esikatselu</translation> <translation id="3603533104205588786">Voit lisätä sivun kirjanmerkkeihin klikkaamalla tähteä.</translation> <translation id="3603622770190368340">Hanki verkkovarmenne</translation> <translation id="3604048165392640554">Mobiiliyhteyttä ei löytynyt. Ota yhteyden pikajakaminen käyttöön muilla laitteillasi ja yritä uudelleen. <a target="_blank" href="<ph name="URL" />">Lisätietoja</a></translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index ecbd522..53c42283 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">M&uling Buksan ang Nakasarang Window</translation> <translation id="2731700343119398978">Mangyaring maghintay...</translation> <translation id="2731710757838467317">Ginagawa ang iyong pinangangasiwaang user. Maaari itong tumagal ng ilang sandali.</translation> -<translation id="2733364097704495499">Gusto mo bang iparehistro ang printer na <ph name="PRINTER_NAME" /> sa Google Cloud Print?</translation> <translation id="2735438478659026460">Awtomatikong i-click kapag huminto ang cursor ng mouse</translation> <translation id="2735712963799620190">Iskedyul</translation> <translation id="2737363922397526254">Tiklupin...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">I-enable ang mga serbisyo sa cloud</translation> <translation id="3599863153486145794">Kini-clear ang history sa lahat ng naka-sign in na device. Maaaring may iba pang anyo ng history ng pag-browse ang iyong Google Account sa <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">I-mute ang mga site na nagpe-play ng tunog</translation> +<translation id="3602290021589620013">I-preview</translation> <translation id="3603533104205588786">Maaari mong i-click ang star upang mag-bookmark ng page</translation> <translation id="3603622770190368340">Kunin ang certificate ng network</translation> <translation id="3604048165392640554">Walang nahanap na koneksyon sa mobile. I-on ang Instant na Pag-tether sa iyong iba pang device at subukang muli. <a target="_blank" href="<ph name="URL" />">Matuto pa</a></translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index c95df8d3..de807bd 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">&Rouvrir la fenêtre fermée</translation> <translation id="2731700343119398978">Veuillez patienter…</translation> <translation id="2731710757838467317">Création de l'utilisateur supervisé en cours. Cette opération peut prendre quelques instants…</translation> -<translation id="2733364097704495499">Voulez-vous enregistrer l'imprimante <ph name="PRINTER_NAME" /> sur Google Cloud Print ?</translation> <translation id="2735438478659026460">Cliquer automatiquement en cas d'arrêt du curseur de la souris</translation> <translation id="2735712963799620190">Calendrier</translation> <translation id="2737363922397526254">Réduire...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Activer les services cloud</translation> <translation id="3599863153486145794">Efface l'historique de tous les appareils sur lesquels vous êtes connecté à votre compte Google. Ce dernier peut conserver d'autres formes d'historique de navigation sur la page <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Couper le son des sites</translation> +<translation id="3602290021589620013">Aperçu</translation> <translation id="3603533104205588786">Vous pouvez cliquer sur l'étoile pour ajouter une page à vos favoris</translation> <translation id="3603622770190368340">Obtenir un certificat réseau</translation> <translation id="3604048165392640554">Aucune connexion mobile détectée. Activez le partage de connexion instantané sur vos autres appareils et réessayez. <a target="_blank" href="<ph name="URL" />">En savoir plus</a></translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 036f437..8de88b2 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1121,7 +1121,6 @@ <translation id="2731392572903530958">બંધ કરેલી વિંડો ફ&રીથી ખોલો</translation> <translation id="2731700343119398978">કૃપા કરીને રાહ જુઓ...</translation> <translation id="2731710757838467317">તમારો નિરીક્ષિત વપરાશકર્તા બનાવી રહ્યું છે. આમાં થોડો સમય લાગી શકે છે.</translation> -<translation id="2733364097704495499">શું તમે Google મેઘ મુદ્રણ પર પ્રિન્ટર <ph name="PRINTER_NAME" /> ને નોંધાવવા માગો છો?</translation> <translation id="2735438478659026460">માઉસ કર્સર રોકાઈ જાય ત્યારે આપમેળે ક્લિક કરો</translation> <translation id="2735712963799620190">શેડ્યૂલ</translation> <translation id="2737363922397526254">સંકુચિત કરો...</translation> @@ -1693,6 +1692,7 @@ <translation id="3596235046596950091">મેઘ સેવાઓ સક્ષમ કરો</translation> <translation id="3599863153486145794">બધા સાઇન ઇન કરેલ ઉપકરણોમાંથી ઇતિહાસ સાફ કરે છે. તમારા Google એકાઉન્ટમાં <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> પર બ્રાઉઝિંગ ઇતિહાસના અન્ય સ્વરૂપો હોઈ શકે છે.</translation> <translation id="3600792891314830896">જે સાઇટ અવાજ ચલાવતી હોય તેઓનો અવાજ બંધ કરો</translation> +<translation id="3602290021589620013">પૂર્વાવલોકન કરો</translation> <translation id="3603533104205588786">એક પેજને બુકમાર્ક કરવા માટે તમે તારા પર ક્લિક કરી શકો છો</translation> <translation id="3603622770190368340">નેટવર્ક પ્રમાણપત્ર મેળવો</translation> <translation id="3604048165392640554">કોઈ મોબાઇલ કનેક્શન મળ્યું નથી. તમારા અન્ય ઉપકરણો પર ઝટપટ ટિથરિંગ ચાલુ કરો અને ફરી પ્રયાસ કરો. <a target="_blank" href="<ph name="URL" />">વધુ જાણો</a></translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 251301e..34378c5c 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">बंद की गई विंडो पु&न: खोलें</translation> <translation id="2731700343119398978">कृपया प्रतीक्षा करें...</translation> <translation id="2731710757838467317">आपका निगरानी में रखा गया उपयोगकर्ता बनाया जा रहा है. इसमें कुछ समय लग सकता है.</translation> -<translation id="2733364097704495499">क्या आप <ph name="PRINTER_NAME" /> प्रिंटर को Google क्लाउड प्रिंटर से पंजीकृत करना चाहते हैं?</translation> <translation id="2735438478659026460">माउस कर्सर के रुक जाने पर अपने आप क्लिक करें</translation> <translation id="2735712963799620190">शेड्यूल</translation> <translation id="2737363922397526254">संक्षिप्त करें...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">क्लाउड सेवाएं सक्षम करें</translation> <translation id="3599863153486145794">प्रवेश किए हुए सभी डिवाइसों से इतिहास साफ़ कर देता है. आपके Google खाते में <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> पर अन्य प्रकार के ब्राउज़िंग इतिहास हो सकतेे हैं.</translation> <translation id="3600792891314830896">आवाज़ चलाने वाली साइटों की आवाज़ बंद करें</translation> +<translation id="3602290021589620013">पूर्वावलोकन</translation> <translation id="3603533104205588786">पेज को बुकमार्क करने के लिए आप तारे पर क्लिक कर सकते हैं</translation> <translation id="3603622770190368340">नेटवर्क प्रमाणपत्र प्राप्त करें</translation> <translation id="3604048165392640554">कोई मोबाइल कनेक्शन नहीं मिला. अपने दूसरे डिवाइसों पर झटपट टेदरिंग चालू करें और दोबारा कोशिश करें. <a target="_blank" href="<ph name="URL" />">अधिक जानें</a></translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 0af25c1..ba97f43 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">P&onovo otvori zatvoreni prozor</translation> <translation id="2731700343119398978">Pričekajte...</translation> <translation id="2731710757838467317">Izrađuje se zaštićeni korisnik. To može potrajati nekoliko trenutaka.</translation> -<translation id="2733364097704495499">Želite li registrirati pisač <ph name="PRINTER_NAME" /> na usluzi Google Cloud Print?</translation> <translation id="2735438478659026460">Automatski klikni kada se pokazivač miša zaustavi</translation> <translation id="2735712963799620190">Raspored</translation> <translation id="2737363922397526254">Sažmi...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Omogući usluge u oblaku</translation> <translation id="3599863153486145794">Briše povijest na svim uređajima na kojima ste prijavljeni. Na vašem Google računu možda postoje drugi oblici povijesti pregledavanja na stranici <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Isključen je zvuk na web-lokacijama koje ga reproduciraju</translation> +<translation id="3602290021589620013">Pregled</translation> <translation id="3603533104205588786">Stranicu možete označiti klikom na zvjezdicu</translation> <translation id="3603622770190368340">Dobivanje certifikata mreže</translation> <translation id="3604048165392640554">Mobilna veza nije pronađena. Uključite Automatsko modemsko povezivanje na drugim uređajima i pokušajte ponovo. <a target="_blank" href="<ph name="URL" />">Saznajte više</a></translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index eb0257b6..6e3358b 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1141,7 +1141,6 @@ <translation id="2731392572903530958">Bezárt ablak újram&egnyitása</translation> <translation id="2731700343119398978">Kérjük, várjon...</translation> <translation id="2731710757838467317">Felügyelt felhasználó létrehozása. Ez eltarthat egy ideig.</translation> -<translation id="2733364097704495499">Szeretné regisztrálni a(z) <ph name="PRINTER_NAME" /> nyomtatót a Google Cloud Print szolgáltatásban?</translation> <translation id="2735438478659026460">Automatikus kattintás, ha az egérmutató megáll</translation> <translation id="2735712963799620190">Ütemezés</translation> <translation id="2737363922397526254">Listanézet...</translation> @@ -1723,6 +1722,7 @@ <translation id="3596235046596950091">Felhőszolgáltatások engedélyezése</translation> <translation id="3599863153486145794">Törli az előzményeket valamennyi bejelentkezett eszközről. Előfordulhat, hogy a böngészési előzmények más formái még megtalálhatók Google-fiókjában a <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> webhelyen.</translation> <translation id="3600792891314830896">Elnémítja a hangot lejátszó webhelyeket</translation> +<translation id="3602290021589620013">Előnézet</translation> <translation id="3603533104205588786">Az oldalt úgy is hozzáadhatja a könyvjelzőkhöz, hogy a csillagra kattint</translation> <translation id="3603622770190368340">Hálózati tanúsítvány beszerzése</translation> <translation id="3604048165392640554">Nem található mobilkapcsolat. Kapcsolja be az Azonnali internetmegosztás funkciót más eszközein, és próbálja újra. <a target="_blank" href="<ph name="URL" />">További információ</a>.</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index f619adbc..70a9365c 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1140,7 +1140,6 @@ <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="2733364097704495499">Ingin mendaftarkan printer <ph name="PRINTER_NAME" /> ke Google Cloud Print?</translation> <translation id="2735438478659026460">Klik secara otomatis saat kursor berhenti</translation> <translation id="2735712963799620190">Jadwal</translation> <translation id="2737363922397526254">Ciutkan...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Aktifkan layanan awan</translation> <translation id="3599863153486145794">Menghapus histori dari semua perangkat yang dibuat login. Akun Google Anda mungkin memiliki bentuk histori browsing lain di <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Mematikan suara situs yang memutar suara</translation> +<translation id="3602290021589620013">Pratinjau</translation> <translation id="3603533104205588786">Anda dapat mengklik bintang untuk mem-bookmark halaman</translation> <translation id="3603622770190368340">Mendapatkan sertifikat jaringan</translation> <translation id="3604048165392640554">Koneksi seluler tidak ditemukan. Aktifkan Tethering Instan di perangkat lain dan coba lagi. <a target="_blank" href="<ph name="URL" />">Pelajari lebih lanjut</a></translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 61187632..32c36e4 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1139,7 +1139,6 @@ <translation id="2731392572903530958">R&iapri finestra chiusa</translation> <translation id="2731700343119398978">Attendi...</translation> <translation id="2731710757838467317">Creazione dell'utente controllato in corso. Potrebbero essere necessari alcuni istanti.</translation> -<translation id="2733364097704495499">Desideri registrare la stampante <ph name="PRINTER_NAME" /> su Google Cloud Print?</translation> <translation id="2735438478659026460">Clic automatico all'arresto del puntatore del mouse</translation> <translation id="2735712963799620190">Pianificazione</translation> <translation id="2737363922397526254">Comprimi...</translation> @@ -1719,6 +1718,7 @@ <translation id="3596235046596950091">Attiva servizi cloud</translation> <translation id="3599863153486145794">Consente di cancellare la cronologia da tutti i dispositivi su cui hai eseguito l'accesso. Il tuo account Google potrebbe avere altri tipi di cronologia di navigazione all'indirizzo <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Disattiva l'audio nei siti che riproducono suoni</translation> +<translation id="3602290021589620013">Anteprima</translation> <translation id="3603533104205588786">Puoi fare clic sulla stella per aggiungere una pagina ai preferiti</translation> <translation id="3603622770190368340">Ottieni certificato di rete</translation> <translation id="3604048165392640554">Nessuna connessione mobile trovata. Attiva la funzione Tethering istantaneo sugli altri dispositivi e riprova. <a target="_blank" href="<ph name="URL" />">Ulteriori informazioni</a></translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index b462b45..31acdac9 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1137,7 +1137,6 @@ <translation id="2731392572903530958">פתח מ&חדש חלון שנסגר</translation> <translation id="2731700343119398978">המתן...</translation> <translation id="2731710757838467317">יוצר את המשתמש בפיקוח. התהליך עשוי להימשך מספר רגעים.</translation> -<translation id="2733364097704495499">האם ברצונך לרשום את המדפסת <ph name="PRINTER_NAME" /> ל-Google Cloud Print?</translation> <translation id="2735438478659026460">קליק אוטומטי כשסמן העכבר עוצר</translation> <translation id="2735712963799620190">לוח זמנים</translation> <translation id="2737363922397526254">כווץ...</translation> @@ -1719,6 +1718,7 @@ <translation id="3596235046596950091">הפעלת שירותי ענן</translation> <translation id="3599863153486145794">ניקוי ההיסטוריה מכל המכשירים שבהם המשתמש נכנס לחשבון. ייתכן שלחשבון Google שלך יהיו צורות אחרות של היסטוריית גלישה בכתובת <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">השתקת אתרים שמשמיעים צלילים</translation> +<translation id="3602290021589620013">תצוגה מקדימה</translation> <translation id="3603533104205588786">בלחיצה על סימן הכוכב אפשר להוסיף דף לסימניות</translation> <translation id="3603622770190368340">השג אישור רשת</translation> <translation id="3604048165392640554">לא נמצא חיבור נייד. הפעל במכשירים שלך שיתוף מיידי של אינטרנט בין ניידים ונסה שוב. <a target="_blank" href="<ph name="URL" />">מידע נוסף</a></translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index bdabbb3..8a412a7 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1141,7 +1141,6 @@ <translation id="2731392572903530958">閉じたウインドウを開く(&E)</translation> <translation id="2731700343119398978">お待ちください...</translation> <translation id="2731710757838467317">監視対象ユーザーを作成しています。この処理には数分かかる場合があります。</translation> -<translation id="2733364097704495499">プリンタ <ph name="PRINTER_NAME" /> を Google クラウド プリントに登録しますか?</translation> <translation id="2735438478659026460">マウスカーソルの停止時に自動的にクリックする</translation> <translation id="2735712963799620190">スケジュール</translation> <translation id="2737363922397526254">折りたたむ...</translation> @@ -1723,6 +1722,7 @@ <translation id="3596235046596950091">クラウド サービスを有効にする</translation> <translation id="3599863153486145794">ログインしているすべての端末の履歴を削除します。お使いの Google アカウントの <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> に、他の形式の閲覧履歴が記録されている場合があります。</translation> <translation id="3600792891314830896">音声が再生されるサイトをミュートする</translation> +<translation id="3602290021589620013">プレビュー</translation> <translation id="3603533104205588786">ページをブックマークするにはスターアイコンをクリックします</translation> <translation id="3603622770190368340">ネットワーク証明書を取得</translation> <translation id="3604048165392640554">モバイル接続が見つかりませんでした。他の端末でインスタント テザリングをオンにしてもう一度お試しください。<a target="_blank" href="<ph name="URL" />">詳細</a></translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 25197a6..fc836eb9 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1122,7 +1122,6 @@ <translation id="2731392572903530958">ಮು&ಚ್ಚಿದ ವಿಂಡೋವನ್ನು ಮತ್ತೆ ತೆರೆ</translation> <translation id="2731700343119398978">ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ...</translation> <translation id="2731710757838467317">ನಿಮ್ಮ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ. ಇದಕ್ಕೆ ಸ್ವಲ್ಪ ಸಮಯವಾಗಬಹುದು.</translation> -<translation id="2733364097704495499">ನೀವು <ph name="PRINTER_NAME" /> ಮುದ್ರಕವನ್ನು Google ಮೇಘ ಮುದ್ರಣದಲ್ಲಿ ನೋಂದಾಯಿಸಲು ಇಚ್ಚಿಸುವಿರಾ?</translation> <translation id="2735438478659026460">ಮೌಸ್ ಕರ್ಸರ್ ನಿಂತಾಗ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕ್ಲಿಕ್ ಮಾಡಿ</translation> <translation id="2735712963799620190">ವೇಳಾಪಟ್ಟಿ</translation> <translation id="2737363922397526254">ಕುಗ್ಗಿಸು...</translation> @@ -1694,6 +1693,7 @@ <translation id="3596235046596950091">ಮೇಘ ಸೇವೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="3599863153486145794">ಸೈನ್-ಇನ್ ಮಾಡಿರುವ ಎಲ್ಲ ಸಾಧನಗಳಿಂದ ಇತಿಹಾಸವನ್ನು ತೆರವುಗೊಳಿಸುತ್ತದೆ. ನಿಮ್ಮ Google ಖಾತೆಯು <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> ನಲ್ಲಿ ಇತರ ವಿಧಗಳ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಹೊಂದಿರಬಹುದು.</translation> <translation id="3600792891314830896">ಕೆಲವು ಸೈಟ್ಗಳಲ್ಲಿ ಧ್ವನಿ ಪ್ಲೇ ಆಗುವುದನ್ನು ಮ್ಯೂಟ್ ಮಾಡಿ</translation> +<translation id="3602290021589620013">ಪೂರ್ವವೀಕ್ಷಣೆ</translation> <translation id="3603533104205588786">ಪುಟವನ್ನು ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಲು ನೀವು ನಕ್ಷತ್ರವನ್ನು ಕ್ಲಿಕ್ ಮಾಡಬಹುದು</translation> <translation id="3603622770190368340">ನೆಟ್ವರ್ಕ್ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಪಡೆದುಕೊಳ್ಳಿ</translation> <translation id="3604048165392640554">ಯಾವುದೇ ಮೊಬೈಲ್ ಸಂಪರ್ಕ ಕಂಡುಬಂದಿಲ್ಲ. ನಿಮ್ಮ ಇತರ ಸಾಧನಗಳಲ್ಲಿ ತತ್ಕ್ಷಣದ ಟೆಥರಿಂಗ್ ಅನ್ನು ಆನ್ ಮಾಡಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ. <a target="_blank" href="<ph name="URL" />">ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</a></translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index d44d87f3..69c0dfe 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -521,6 +521,7 @@ <translation id="177336675152937177">호스팅된 앱 데이터</translation> <translation id="1774349594977710164">휴대전화가 <ph name="DEVICE_TYPE" />(과)와 자동으로 동기화되므로 해당 기기도 잠금 해제합니다.</translation> <translation id="1774833706453699074">열린 페이지를 북마크에 추가...</translation> +<translation id="1775381402323441512">동영상 정보</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> <translation id="177694132944350798"><ph name="TIME" />자로 데이터가 Google 비밀번호로 암호화되었습니다. 동기화를 시작하려면 비밀번호를 입력하세요.</translation> <translation id="1779652936965200207">다음 패스키를 '<ph name="DEVICE_NAME" />'에 입력하세요.</translation> @@ -563,6 +564,7 @@ <translation id="1829192082282182671">축소(&O)</translation> <translation id="1830550083491357902">로그인하지 않음</translation> <translation id="1832511806131704864">휴대전화 변경사항이 업데이트됨</translation> +<translation id="1834503245783133039">다운로드 실패: <ph name="FILE_NAME" /></translation> <translation id="1838374766361614909">검색어 지우기</translation> <translation id="1838709767668011582">Google 사이트</translation> <translation id="1839704667838141620">파일 공유 방법을 변경하세요.</translation> @@ -699,6 +701,7 @@ <translation id="2079053412993822885">인증서 중 하나를 삭제하면 더 이상 삭제한 인증서를 사용하여 신원을 확인할 수 없습니다.</translation> <translation id="2079545284768500474">실행취소</translation> <translation id="2080070583977670716">설정 더보기</translation> +<translation id="2084108471225856927">기기 설정</translation> <translation id="2085470240340828803">이름이 '<ph name="FILENAME" />'인 파일이 이미 존재합니다. 원하는 작업을 선택하세요.</translation> <translation id="2087822576218954668">인쇄: <ph name="PRINT_NAME" /></translation> <translation id="2089566709556890888">Chrome으로 안전하게 탐색</translation> @@ -1138,7 +1141,6 @@ <translation id="2731392572903530958">닫은 창 다시 열기(&E)</translation> <translation id="2731700343119398978">잠시 기다려 주세요...</translation> <translation id="2731710757838467317">관리 대상 사용자를 만드는 중입니다. 몇 분 정도 소요될 수 있습니다.</translation> -<translation id="2733364097704495499"><ph name="PRINTER_NAME" /> 프린터를 Google 클라우드 프린트에 등록하시겠습니까?</translation> <translation id="2735438478659026460">마우스 커서가 멈추면 자동으로 클릭</translation> <translation id="2735712963799620190">일정</translation> <translation id="2737363922397526254">접기...</translation> @@ -1421,6 +1423,7 @@ <translation id="3130528281680948470">기기가 초기화되고 사용자 계정과 로컬 데이터가 모두 삭제됩니다. 이 작업은 취소할 수 없습니다.</translation> <translation id="313205617302240621">비밀번호 찾기</translation> <translation id="3135204511829026971">화면 회전</translation> +<translation id="313963229645891001">다운로드 중, <ph name="STATUS" /></translation> <translation id="3139925690611372679">기본 노란색 아바타</translation> <translation id="3140353188828248647">주소 표시줄로 이동</translation> <translation id="3141318088920353606">듣는 중...</translation> @@ -1548,6 +1551,7 @@ <translation id="3326821416087822643"><ph name="FILE_NAME" /> 압축 중...</translation> <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation> <translation id="3331974543021145906">앱 정보</translation> +<translation id="3335337277364016868">녹음된 연도</translation> <translation id="3335947283844343239">닫은 탭 다시 열기</translation> <translation id="3340978935015468852">설정</translation> <translation id="3341703758641437857">파일 URL에 대한 액세스 허용</translation> @@ -1609,6 +1613,7 @@ <translation id="3435738964857648380">보안</translation> <translation id="3435896845095436175">사용</translation> <translation id="3436038974659740746">사용자 정의 맞춤법</translation> +<translation id="3437801641691368414">만든 시간</translation> <translation id="3438633801274389918">닌자</translation> <translation id="3439153939049640737"><ph name="HOST" />에서 마이크에 액세스하도록 항상 허용</translation> <translation id="3439970425423980614">미리보기에서 PDF 여는 중</translation> @@ -1652,6 +1657,7 @@ <translation id="3487007233252413104">익명의 함수</translation> <translation id="348780365869651045">AppCache를 기다리는 중...</translation> <translation id="3488065109653206955">부분적으로 활성화됨</translation> +<translation id="348999362308956431">다운로드 완료: <ph name="FILE_NAME" /></translation> <translation id="3492788708641132712">동기화가 작동하지 않습니다. 다시 로그인하세요.</translation> <translation id="3493881266323043047">유효성</translation> <translation id="3494769164076977169">사이트에서 첫 파일 다운로드 후 자동으로 파일을 다운로드하려고 할 때 확인(권장)</translation> @@ -1716,6 +1722,7 @@ <translation id="3596235046596950091">클라우드 서비스 사용</translation> <translation id="3599863153486145794">로그인된 모든 기기에서 방문 기록을 지웁니다. Google 계정의 내 활동(<ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />)에는 인터넷 사용 기록이 다른 형식으로 남아 있을 수도 있습니다.</translation> <translation id="3600792891314830896">소리를 재생하는 사이트 음소거</translation> +<translation id="3602290021589620013">미리보기</translation> <translation id="3603533104205588786">별표를 클릭하여 페이지를 북마크에 추가할 수 있습니다.</translation> <translation id="3603622770190368340">네트워크 인증서 받기</translation> <translation id="3604048165392640554">모바일 연결을 찾을 수 없습니다. 다른 기기에서 인스턴트 테더링을 사용 설정한 다음 다시 시도하세요. <a target="_blank" href="<ph name="URL" />">자세히 알아보기</a></translation> @@ -1754,6 +1761,7 @@ <translation id="3646789916214779970">테마 기본값으로 다시 설정</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> 발견됨</translation> <translation id="3649138363871392317">사진이 캡처되었습니다.</translation> +<translation id="3650952250015018111">'<ph name="APP_NAME" />'이(가) 다음 기기에 액세스하도록 허용합니다.</translation> <translation id="3651488188562686558">Wi-Fi 연결 해제</translation> <translation id="3652817283076144888">초기화 중</translation> <translation id="3653999333232393305"><ph name="HOST" />에서 마이크에 액세스하도록 계속 허용</translation> @@ -1866,6 +1874,7 @@ <translation id="381202950560906753">다른 지문 추가</translation> <translation id="3812525830114410218">잘못된 인증서</translation> <translation id="3813296892522778813">원하는 자료를 찾지 못했다면 <ph name="BEGIN_LINK_CHROMIUM" />Chrome 도움말<ph name="END_LINK_CHROMIUM" />을 참조하세요.</translation> +<translation id="3817579325494460411">입력하지 않음</translation> <translation id="3819007103695653773">모든 사이트에서 푸시 메시지를 보낼 수 있도록 허용</translation> <translation id="3819752733757735746">스위치 제어(스위치 1~2회 사용으로 컴퓨터 제어)</translation> <translation id="3819800052061700452">전체화면(&F)</translation> @@ -1959,6 +1968,7 @@ <translation id="394984172568887996">IE에서 가져온 북마크</translation> <translation id="3950820424414687140">로그인</translation> <translation id="3954354850384043518">진행 중</translation> +<translation id="3954469006674843813"><ph name="WIDTH" />x<ph name="HEIGHT" />(<ph name="REFRESH_RATE" />Hz)</translation> <translation id="3955193568934677022">사이트에서 보호된 콘텐츠를 재생하도록 허용(권장)</translation> <translation id="3956702100721821638">Google Play에 접속할 수 없음</translation> <translation id="3958088479270651626">북마크 및 설정 가져오기</translation> @@ -2037,6 +2047,7 @@ <translation id="4087089424473531098">확장 프로그램(파일: <ph name="EXTENSION_FILE" />)을 만들었습니다.</translation> <translation id="4087470595660267445">Chromebook에 Google Play의 앱 및 게임을 설치합니다. <a target="_blank" href="<ph name="URL" />">자세히 알아보기</a></translation> <translation id="4088095054444612037">그룹 공유 승인</translation> +<translation id="4089235344645910861">설정이 저장되었으며, 동기화가 시작되었습니다.</translation> <translation id="4090103403438682346">인증 액세스 서비스 사용</translation> <translation id="4090535558450035482">(관리되는 확장 프로그램으로 삭제할 수 없습니다.)</translation> <translation id="4091434297613116013">장</translation> @@ -2116,6 +2127,7 @@ <translation id="4244238649050961491">스타일러스 앱 더보기</translation> <translation id="424546999567421758">디스크 사용률이 높음</translation> <translation id="424726838611654458">항상 Adobe Reader에서 열기</translation> +<translation id="4247901771970415646"><ph name="USERNAME" />과(와) 동기화할 수 없음</translation> <translation id="4249248555939881673">네트워크 연결 대기 중...</translation> <translation id="4249373718504745892">카메라와 마이크 액세스가 차단된 페이지입니다.</translation> <translation id="424963718355121712">앱은 영향을 미치는 호스트에서 제공되어야 합니다</translation> @@ -2153,6 +2165,7 @@ <translation id="4305227814872083840">길게(2초)</translation> <translation id="4306119971288449206">앱은 '<ph name="CONTENT_TYPE" />' 콘텐츠 유형으로 제공되어야 합니다</translation> <translation id="4309420042698375243"><ph name="NUM_KILOBYTES" />K(<ph name="NUM_KILOBYTES_LIVE" />K 활성)</translation> +<translation id="4309915981827077375">일반 정보</translation> <translation id="4310139701823742692">파일 형식이 잘못되었습니다. PPD 파일을 확인하고 다시 시도하세요.</translation> <translation id="431076611119798497">세부정보(&D)</translation> <translation id="4312866146174492540">차단(기본값)</translation> @@ -2201,6 +2214,7 @@ <translation id="4409697491990005945">여백</translation> <translation id="4411578466613447185">코드 서명자</translation> <translation id="4412698727486357573">고객센터</translation> +<translation id="44141919652824029">'<ph name="APP_NAME" />'이(가) 연결된 USB 기기의 목록을 읽도록 허용하시겠습니까?</translation> <translation id="4414232939543644979">새 시크릿 창(&I)</translation> <translation id="4415748029120993980">SECG 타원 곡선 secp384r1(또는 NIST P-384)</translation> <translation id="4419409365248380979"><ph name="HOST" />에서 항상 쿠키를 설정하도록 허용</translation> @@ -2294,6 +2308,7 @@ <translation id="4565377596337484307">비밀번호 감추기</translation> <translation id="4567772783389002344">단어 추가</translation> <translation id="4568213207643490790">죄송합니다. 이 기기에서는 Google 계정을 사용할 수 없습니다.</translation> +<translation id="4568854179928172494">수정한 시간</translation> <translation id="4569747168316751899">유휴 상태일 때</translation> <translation id="4572659312570518089">'<ph name="DEVICE_NAME" />'에 연결하는 동안 인증이 취소되었습니다.</translation> <translation id="4572815280350369984"><ph name="FILE_TYPE" /> 파일</translation> @@ -2337,6 +2352,7 @@ <translation id="4640525840053037973">Google 계정으로 로그인</translation> <translation id="4641539339823703554">Chrome에서 시스템 시간을 설정할 수 없습니다. 아래에서 시간을 확인한 다음 필요한 경우 수정해 주세요.</translation> <translation id="4643612240819915418">새 탭에서 동영상 열기(&O)</translation> +<translation id="4644818355646995778">다운로드 중, <ph name="PERCENT_REMAINING" /></translation> <translation id="4645676300727003670">계속(&K)</translation> <translation id="4647090755847581616">탭 닫기(&C)</translation> <translation id="4647697156028544508">'<ph name="DEVICE_NAME" />'의 PIN을 입력하세요:</translation> @@ -2724,6 +2740,7 @@ <translation id="5250372599208556903"><ph name="SEARCH_ENGINE_NAME" />에서 내 위치를 사용하여 지역에 맞는 콘텐츠를 제공합니다. 이 설정은 <ph name="SETTINGS_LINK" />에서 변경할 수 있습니다.</translation> <translation id="5252456968953390977">로밍</translation> <translation id="5252653240322147470">PIN은 <ph name="MAXIMUM" />자리 미만이어야 합니다.</translation> +<translation id="5253070652067921974">만든 사람</translation> <translation id="5254368820972107711">삭제할 파일 표시</translation> <translation id="52550593576409946">키오스크 애플리케이션을 실행할 수 없습니다.</translation> <translation id="5255315797444241226">입력한 암호가 잘못되었습니다.</translation> @@ -2802,6 +2819,7 @@ <translation id="5353252989841766347">Chrome에서 비밀번호 내보내기</translation> <translation id="5355097969896547230">다시 찾기</translation> <translation id="5355926466126177564">검색주소창에서 검색하면 표시되는 페이지가 '<ph name="EXTENSION_NAME" />' 확장 프로그램으로 인해 변경되었습니다.</translation> +<translation id="5358764674931277">프레임 속도</translation> <translation id="5360150013186312835">툴바에서 보기</translation> <translation id="5362741141255528695">비공개 키 파일을 선택합니다.</translation> <translation id="5363109466694494651">Powerwash 및 되돌리기</translation> @@ -2838,6 +2856,7 @@ <translation id="5414566801737831689">방문하는 웹사이트의 아이콘 조회</translation> <translation id="5417312524372586921">브라우저 테마</translation> <translation id="5419294236999569767">시스템 시간</translation> +<translation id="5420438158931847627">텍스트와 이미지의 선명도를 결정합니다.</translation> <translation id="5422221874247253874">액세스포인트</translation> <translation id="5422781158178868512">죄송합니다. 외부 저장장치를 인식하지 못했습니다.</translation> <translation id="5423849171846380976">활성화됨</translation> @@ -3023,6 +3042,9 @@ <translation id="5678550637669481956"><ph name="VOLUME_NAME" />에 대한 읽기/쓰기 액세스 권한이 부여되었습니다.</translation> <translation id="5678955352098267522"><ph name="WEBSITE_1" />에서 데이터 읽기</translation> <translation id="5684661240348539843">애셋 식별자</translation> +<translation id="5686799162999241776"><ph name="BEGIN_BOLD" />아카이브 또는 가상 디스크의 연결을 해제할 수 없습니다.<ph name="END_BOLD" /> + <ph name="LINE_BREAKS" /> + 아카이브 또는 가상 디스크에 있는 모든 파일을 닫은 다음 다시 시도해 보세요.</translation> <translation id="5687326903064479980">시간대</translation> <translation id="5689516760719285838">위치</translation> <translation id="56907980372820799">데이터 연결</translation> @@ -3031,6 +3053,7 @@ <translation id="5694501201003948907">$1개 항목 압축 중...</translation> <translation id="5696143504434933566">'<ph name="EXTENSION_NAME" />'의 악용사례 신고</translation> <translation id="5699533844376998780">확장 프로그램 '<ph name="EXTENSION_NAME" />'이(가) 추가되었습니다.</translation> +<translation id="5700087501958648444">오디오 정보</translation> <translation id="570043786759263127">Google Play 앱 및 서비스</translation> <translation id="5700836101007545240">관리자가 연결 추가를 허용하지 않았습니다.</translation> <translation id="5701381305118179107">가운데</translation> @@ -3588,6 +3611,7 @@ <translation id="656398493051028875">'<ph name="FILENAME" />' 삭제 중...</translation> <translation id="6567688344210276845">페이지 작업의 아이콘('<ph name="ICON" />')을 로드하지 못했습니다.</translation> <translation id="657402800789773160">페이지 새로고침(&R)</translation> +<translation id="6577284282025554716">다운로드 취소됨: <ph name="FILE_NAME" /></translation> <translation id="6578664922716508575">Google 사용자 이름과 비밀번호로 동기화 데이터 암호화</translation> <translation id="6580151766480067746">ARC 버전</translation> <translation id="6581162200855843583">Google 드라이브 링크</translation> @@ -4050,6 +4074,7 @@ <translation id="7297443947353982503">사용자 이름 또는 비밀번호가 잘못되었거나 EAP 인증에 실패했습니다.</translation> <translation id="729761647156315797">언어 및 키보드 선택</translation> <translation id="7299337219131431707">게스트로 로그인 허용</translation> +<translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{이 애플리케이션으로 인해 Chrome이 제대로 작동하지 않을 수 있습니다.}other{이 애플리케이션으로 인해 Chrome이 제대로 작동하지 않을 수 있습니다.}}</translation> <translation id="7303900363563182677">이 사이트는 클립보드에 복사된 텍스트 및 이미지에 액세스할 수 없습니다.</translation> <translation id="730515362922783851">로컬 네트워크 또는 인터넷의 모든 기기와 데이터 교환</translation> <translation id="7308002049209013926">런처를 사용하여 새로운 앱과 활동으로 빠르게 이동하세요. 키보드를 사용하여 이동하려면 Alt + Shift + L을 누르면 됩니다.</translation> @@ -4305,6 +4330,7 @@ <translation id="7707922173985738739">모바일 데이터 사용</translation> <translation id="7709152031285164251">실패 - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">전송(&C)...</translation> +<translation id="7711920809702896782">이미지 정보</translation> <translation id="7714307061282548371"><ph name="DOMAIN" />의 쿠키를 허용함</translation> <translation id="7714464543167945231">인증서</translation> <translation id="7716781361494605745">Netscape 인증 기관 정책 URL</translation> @@ -4423,6 +4449,7 @@ <translation id="7886917304091689118">Chrome에서 실행 중</translation> <translation id="7887334752153342268">새 탭에서 보기</translation> <translation id="7887864092952184874">블루투스 마우스 페어링됨</translation> +<translation id="7889565820482017512">디스플레이 크기</translation> <translation id="7889966925761734854">찾기</translation> <translation id="7892100671754994880">다음 사용자</translation> <translation id="7893008570150657497">컴퓨터에서 사진, 음악, 기타 미디어에 액세스</translation> @@ -4526,6 +4553,7 @@ <translation id="8026334261755873520">인터넷 사용 기록 삭제</translation> <translation id="8028060951694135607">Microsoft Key Recovery</translation> <translation id="8028134359912645720">Ctrl, Alt, Shift 또는 런처 키를 길게 누르면 각 키로 사용할 수 있는 단축키를 확인할 수 있습니다.</translation> +<translation id="8028803902702117856"><ph name="SIZE" /> 다운로드 중, <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">크기</translation> <translation id="8030656706657716245">프린터 추가</translation> <translation id="8032244173881942855">탭을 전송할 수 없습니다.</translation> @@ -4781,6 +4809,7 @@ <translation id="84613761564611563">네트워크 구성 UI를 요청했습니다. 잠시만 기다려 주세요.</translation> <translation id="8461914792118322307">프록시</translation> <translation id="8463215747450521436">이 관리 대상 사용자가 삭제되었거나 사용 중지되었습니다. 이 사용자로 계속 로그인하려면 관리자에게 문의하세요.</translation> +<translation id="846374874681391779">다운로드바</translation> <translation id="8463955938112983119"><ph name="PLUGIN_NAME" />은(는) 사용 중지되었습니다.</translation> <translation id="8464132254133862871">서비스를 받을 수 없는 사용자 계정입니다.</translation> <translation id="8465252176946159372">잘못된 값입니다.</translation> @@ -4796,6 +4825,7 @@ <translation id="8477384620836102176">일반(&G)</translation> <translation id="8480082892550707549">이전에 이 사이트에서 파일을 다운로드한 경우에도 사이트가 일시적으로 안전하지 않을(해킹됨) 수 있습니다. 나중에 다운로드하세요.</translation> <translation id="8480869669560681089"><ph name="VENDOR_NAME" />의 알 수 없는 기기</translation> +<translation id="8481187309597259238">USB 권한 확인</translation> <translation id="8483248364096924578">IP 주소</translation> <translation id="8487678622945914333">확대</translation> <translation id="8487693399751278191">지금 북마크 가져오기...</translation> @@ -5182,6 +5212,7 @@ <translation id="9094033019050270033">비밀번호 업데이트</translation> <translation id="9094982973264386462">제거</translation> <translation id="9095253524804455615">제거</translation> +<translation id="9099674669267916096">페이지 수</translation> <translation id="9100765901046053179">고급 설정</translation> <translation id="9101691533782776290">앱 실행</translation> <translation id="9102610709270966160">확장 프로그램 사용</translation> @@ -5273,6 +5304,7 @@ <translation id="939736085109172342">새 폴더</translation> <translation id="942532530371314860"><ph name="APP_NAME" />에서 Chrome 탭과 오디오를 공유 중입니다.</translation> <translation id="942954117721265519">이 디렉토리에 이미지가 없습니다.</translation> +<translation id="943972244133411984">수정한 사용자</translation> <translation id="945522503751344254">의견 보내기</translation> <translation id="952992212772159698">활성화되지 않음</translation> <translation id="957960681186851048">이 사이트에서 여러 파일을 자동으로 다운로드하려고 함</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 75b3b89d..30071f5 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1140,7 +1140,6 @@ <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="2733364097704495499">Ar norite užregistruoti spausdintuvą „<ph name="PRINTER_NAME" />“, kad būtų galima naudoti „Google“ spausdinimą iš debesies?</translation> <translation id="2735438478659026460">Automatiškai spustelėti sustojus pelės žymekliui</translation> <translation id="2735712963799620190">Tvarkaraštis</translation> <translation id="2737363922397526254">Sutraukti...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Įgalinti debesies paslaugas</translation> <translation id="3599863153486145794">Išvaloma visų įrenginių, prie kurių prisijungta, istorija. „Google“ paskyroje gali būti kito tipo naršymo istorijos, kuri pasiekiama adresu <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Nutildyti svetaines, kurios leidžia garsą</translation> +<translation id="3602290021589620013">Peržiūra</translation> <translation id="3603533104205588786">Galite spustelėti žvaigždutę, kad pažymėtumėte puslapį</translation> <translation id="3603622770190368340">Gauti tinklo sertifikatą</translation> <translation id="3604048165392640554">Mobilusis ryšys nerastas. Įjunkite momentinį įrenginio kaip modemo naudojimą kituose savo įrenginiuose ir bandykite dar kartą. <a target="_blank" href="<ph name="URL" />">Sužinokite daugiau</a></translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 475a2f7..43e414b9 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">Vēlr&eiz atvērt aizvērto logu</translation> <translation id="2731700343119398978">Lūdzu, uzgaidiet...</translation> <translation id="2731710757838467317">Notiek jūsu uzraudzītā lietotāja izveide. Šis process var ilgt kādu laiku.</translation> -<translation id="2733364097704495499">Vai vēlaties reģistrēt printeri <ph name="PRINTER_NAME" /> pakalpojumā Google mākoņdruka?</translation> <translation id="2735438478659026460">Automātiski noklikšķināt, kad peles kursors apstājas</translation> <translation id="2735712963799620190">Grafiks</translation> <translation id="2737363922397526254">Sakļaut...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Iespējot mākoņa pakalpojumus</translation> <translation id="3599863153486145794">Notīra vēsturi no visām ierīcēm, kurās esat pierakstījies. Jūsu Google kontam vietnē <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> var būt citu veidu pārlūkošanas vēstures dati.</translation> <translation id="3600792891314830896">Izslēgt skaņu vietnēm, kurās tiek atskaņota skaņa</translation> +<translation id="3602290021589620013">Priekšskatīt</translation> <translation id="3603533104205588786">Varat noklikšķināt uz zvaigznītes, lai saglabātu lapu kā grāmatzīmi</translation> <translation id="3603622770190368340">Tīkla sertifikāta iegūšana</translation> <translation id="3604048165392640554">Netika atrasts mobilo datu savienojums. Ieslēdziet tūlītējo piesaisti citās savās ierīcēs un mēģiniet vēlreiz. <a target="_blank" href="<ph name="URL" />">Uzziniet vairāk</a>.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 0cb25dd..0fca4516 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1134,7 +1134,6 @@ <translation id="2731392572903530958">അടച്ച വിന്ഡോ വീ&ണ്ടും തുറക്കുക</translation> <translation id="2731700343119398978">കാത്തിരിക്കുക...</translation> <translation id="2731710757838467317">നിങ്ങളുടെ സൂപ്പർവൈസുചെയ്ത ഉപയോക്താവിനെ സൃഷ്ടിക്കുന്നു. ഇതിന് കുറച്ചുസമയമെടുക്കാം.</translation> -<translation id="2733364097704495499">Google ക്ലൗഡ് പ്രിന്ററിൽ നിങ്ങൾക്ക് പ്രിന്റർ <ph name="PRINTER_NAME" /> രജിസ്റ്റർ ചെയ്യണമെന്നുണ്ടോ?</translation> <translation id="2735438478659026460">മൗസ് കഴ്സർ നിലയ്ക്കുമ്പോള് സ്വമേധയാ ക്ലിക്ക് ചെയ്യുക</translation> <translation id="2735712963799620190">ഷെഡ്യൂള്</translation> <translation id="2737363922397526254">സങ്കോചിപ്പിക്കുക...</translation> @@ -1711,6 +1710,7 @@ <translation id="3596235046596950091">ക്ലൗഡ് സേവനങ്ങൾ പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="3599863153486145794">സൈൻ ഇൻ ചെയ്ത എല്ലാ ഉപകരണങ്ങളിൽ നിന്നും ചരിത്രം മായ്ക്കുന്നു. നിങ്ങളുടെ Google അക്കൗണ്ടിന് <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> എന്നതിൽ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രങ്ങളുണ്ടായിരിക്കാം.</translation> <translation id="3600792891314830896">ശബ്ദം പ്ലേ ചെയ്യുന്ന സൈറ്റുകളെ മ്യൂട്ട് ചെയ്യുക</translation> +<translation id="3602290021589620013">പ്രിവ്യൂ</translation> <translation id="3603533104205588786">ഒരു പേജ് ബുക്ക്മാർക്ക് ചെയ്യാൻ നക്ഷത്ര ചിഹ്നത്തിൽ ക്ലിക്കുചെയ്യുക</translation> <translation id="3603622770190368340">നെറ്റ്വർക്ക് സർട്ടിഫിക്കറ്റ് ലഭ്യമാക്കുക</translation> <translation id="3604048165392640554">മൊബൈൽ കണക്ഷനൊന്നും കണ്ടെത്തിയില്ല. നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിലെ തൽക്ഷണ ടെതറിംഗ് ഓണാക്കിയ ശേഷം വീണ്ടും ശ്രമിക്കുക. <a target="_blank" href="<ph name="URL" />">കൂടുതലറിയുക</a></translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 219d0d2b..1430da02 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1135,7 +1135,6 @@ <translation id="2731392572903530958">बंद केलेली विंडो पु&न्हा उघडा</translation> <translation id="2731700343119398978">कृपया प्रतीक्षा करा...</translation> <translation id="2731710757838467317">आपला पर्यवेक्षी वापरकर्ता तयार करत आहे. यास काही क्षण लागू शकतात.</translation> -<translation id="2733364097704495499">आपण Google क्लाउड प्रिंट मध्ये <ph name="PRINTER_NAME" /> प्रिंटरची नोंदणी करू इच्छिता?</translation> <translation id="2735438478659026460">माउसचा कर्सर थांबल्यावर आपोआप क्लिक करा</translation> <translation id="2735712963799620190">शेड्यूल</translation> <translation id="2737363922397526254">संकुचित करा...</translation> @@ -1709,6 +1708,7 @@ <translation id="3596235046596950091">क्लाउड सेवा सक्षम करा</translation> <translation id="3599863153486145794">साइन-इन केलेल्या सर्व डिव्हाइसमधून इतिहास साफ करते. तुमच्या Google खात्यामध्ये <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> वर कदाचित ब्राउझिंगचे इतर फॉर्म असतील.</translation> <translation id="3600792891314830896">ध्वनी प्ले करणाऱ्या साइट म्युट करा</translation> +<translation id="3602290021589620013">पूर्वावलोकन</translation> <translation id="3603533104205588786">तुम्ही पेज बुकमार्क करण्यासाठी तारावर क्लिक करू शकता</translation> <translation id="3603622770190368340">नेटवर्क प्रमाणपत्र प्राप्त करा</translation> <translation id="3604048165392640554">कोणतेही मोबाइल कनेक्शन सापडले नाही. तुमच्या दुसऱ्या डीव्हाइसवर इन्स्टंट टेदरिंग चालू करा आणि पुन्हा प्रयत्न करा. <a target="_blank" href="<ph name="URL" />">अधिक जाणून घ्या</a></translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 74410cdf..a516e508 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1141,7 +1141,6 @@ <translation id="2731392572903530958">B&uka Semula Tetingkap Yang Ditutup</translation> <translation id="2731700343119398978">Sila tunggu...</translation> <translation id="2731710757838467317">Menghasilkan pengguna diselia anda. Proses Ini mungkin mengambil sedkit masa.</translation> -<translation id="2733364097704495499">Adakah anda ingin mendaftarkan pencetak <ph name="PRINTER_NAME" /> dengan Google Cloud Print?</translation> <translation id="2735438478659026460">Klik secara automatik apabila kursor tetikus berhenti</translation> <translation id="2735712963799620190">Jadual</translation> <translation id="2737363922397526254">Runtuhkan...</translation> @@ -1723,6 +1722,7 @@ <translation id="3596235046596950091">Dayakan perkhidmatan awan</translation> <translation id="3599863153486145794">Mengosongkan sejarah daripada semua peranti yang dilog masuk. Akaun Google anda mungkin mempunyai sejarah penyemakan imbas dalam bentuk lain di <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Redam tapak yang memainkan bunyi</translation> +<translation id="3602290021589620013">Pratonton</translation> <translation id="3603533104205588786">Anda boleh mengklik bintang untuk menandai halaman</translation> <translation id="3603622770190368340">Dapatkan sijil rangkaian</translation> <translation id="3604048165392640554">Tiada sambungan mudah alih ditemui. Hidupkan Penambatan Segera pada peranti anda yang lain dan cuba lagi. <a target="_blank" href="<ph name="URL" />">Ketahui lebih lanjut</a></translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 6889ca1..26de258 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1140,7 +1140,6 @@ <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="2733364097704495499">Wil je de printer <ph name="PRINTER_NAME" /> registreren voor Google Cloudprinter?</translation> <translation id="2735438478659026460">Automatisch klikken wanneer de muisaanwijzer stopt</translation> <translation id="2735712963799620190">Schema</translation> <translation id="2737363922397526254">Samenvouwen...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Cloudservices inschakelen</translation> <translation id="3599863153486145794">Hiermee wordt de geschiedenis van alle ingelogde apparaten gewist. Er kunnen andere vormen van browsegeschiedenis zijn opgeslagen voor je Google-account op <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Sites dempen die geluid afspelen</translation> +<translation id="3602290021589620013">Voorbeeld</translation> <translation id="3603533104205588786">Je kunt op de ster klikken om een bladwijzer voor een pagina in te stellen</translation> <translation id="3603622770190368340">Netwerkcertificaat verkrijgen</translation> <translation id="3604048165392640554">Geen mobiele verbinding gevonden. Schakel Instant-tethering op je andere apparaten in en probeer het opnieuw. <a target="_blank" href="<ph name="URL" />">Meer informatie</a></translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 310167c487..6f106efe 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1136,7 +1136,6 @@ <translation id="2731392572903530958">Å&pne det lukkede vinduet igjen</translation> <translation id="2731700343119398978">Vent litt …</translation> <translation id="2731710757838467317">Oppretter den administrerte brukeren din. Dette kan ta litt tid.</translation> -<translation id="2733364097704495499">Vil du registrere skriveren <ph name="PRINTER_NAME" /> i Google Cloud Print?</translation> <translation id="2735438478659026460">Klikk automatisk når musepekeren stopper</translation> <translation id="2735712963799620190">Tidsplan</translation> <translation id="2737363922397526254">Skjul</translation> @@ -1717,6 +1716,7 @@ <translation id="3596235046596950091">Slå på skytjenester</translation> <translation id="3599863153486145794">Tømmer loggen på alle påloggede enheter. Det kan hende Google-kontoen din har andre typer nettlesingslogger på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Kutt lyden for nettsteder som spiller av lyd</translation> +<translation id="3602290021589620013">Forhåndsvisning</translation> <translation id="3603533104205588786">Du kan klikke på stjernen for å sette en side som bokmerke</translation> <translation id="3603622770190368340">Hent nettverkssertifikat</translation> <translation id="3604048165392640554">Fant ingen mobiltilkobling. Slå på Umiddelbar internettdeling på de andre enhetene dine, og prøv på nytt. <a target="_blank" href="<ph name="URL" />">Finn ut mer</a></translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 1bc6a2f1..1392f813 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">Otwórz ponowni&e zamknięte okno</translation> <translation id="2731700343119398978">Czekaj...</translation> <translation id="2731710757838467317">Tworzę użytkownika nadzorowanego. Może to potrwać kilka minut.</translation> -<translation id="2733364097704495499">Czy chcesz zarejestrować drukarkę <ph name="PRINTER_NAME" /> w Google Cloud Print?</translation> <translation id="2735438478659026460">Automatyczne kliknięcie po zatrzymaniu kursora myszy</translation> <translation id="2735712963799620190">Harmonogram</translation> <translation id="2737363922397526254">Zwiń...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Włącz usługi w chmurze</translation> <translation id="3599863153486145794">Usuwa historię ze wszystkich urządzeń, na których jesteś zalogowany. Inne rodzaje historii przeglądania mogą być nadal dostępne na Twoim koncie Google na <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Wycisz strony, które odtwarzają dźwięk</translation> +<translation id="3602290021589620013">Podgląd</translation> <translation id="3603533104205588786">Aby dodać stronę do zakładek, możesz kliknąć gwiazdkę</translation> <translation id="3603622770190368340">Pobierz certyfikat sieci</translation> <translation id="3604048165392640554">Nie znaleziono połączenia komórkowego. Włącz Instant Tethering na drugim urządzeniu i spróbuj jeszcze raz. <a target="_blank" href="<ph name="URL" />">Więcej informacji</a></translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 0f065c0..cb35cb4 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">R&eabrir janela fechada</translation> <translation id="2731700343119398978">Aguarde...</translation> <translation id="2731710757838467317">Criando seu usuário supervisionado. Isso pode demorar alguns instantes.</translation> -<translation id="2733364097704495499">Você deseja registrar a impressora <ph name="PRINTER_NAME" /> no Google Cloud Print?</translation> <translation id="2735438478659026460">Clicar automaticamente quando o cursor do mouse parar</translation> <translation id="2735712963799620190">Programar</translation> <translation id="2737363922397526254">Recolher...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Ativar serviços em nuvem</translation> <translation id="3599863153486145794">Limpa o histórico de todos os dispositivos conectados. Sua Conta do Google pode ter outras formas de histórico de navegação em <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Silenciar sites que reproduzem sons</translation> +<translation id="3602290021589620013">Visualizar</translation> <translation id="3603533104205588786">Você pode clicar no ícone da estrela para adicionar uma página aos favoritos</translation> <translation id="3603622770190368340">Obter certificado de rede</translation> <translation id="3604048165392640554">Nenhuma conexão móvel encontrada. Ative o tethering instantâneo nos seus outros dispositivos e tente novamente. <a target="_blank" href="<ph name="URL" />">Saiba mais</a></translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 8ca1563..f8dbd35 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1141,7 +1141,6 @@ <translation id="2731392572903530958">Voltar a Abrir a Jan&ela Fechada</translation> <translation id="2731700343119398978">Aguarde...</translation> <translation id="2731710757838467317">A criar o utilizador supervisionado. Isto poderá demorar alguns momentos.</translation> -<translation id="2733364097704495499">Pretende registar a impressora <ph name="PRINTER_NAME" /> no Google Cloud Print?</translation> <translation id="2735438478659026460">Clicar automaticamente quando o cursor do rato parar</translation> <translation id="2735712963799620190">Programação</translation> <translation id="2737363922397526254">Reduzir...</translation> @@ -1724,6 +1723,7 @@ <translation id="3596235046596950091">Ativar serviços na nuvem</translation> <translation id="3599863153486145794">Limpa o histórico de todos os dispositivos com sessão iniciada. A sua Conta Google pode ter outras formas do histórico de navegação em <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Desativar o som dos sites que reproduzem som</translation> +<translation id="3602290021589620013">Pré-visualizar</translation> <translation id="3603533104205588786">Pode clicar na estrela para adicionar uma página aos marcadores</translation> <translation id="3603622770190368340">Obter certificado de rede</translation> <translation id="3604048165392640554">Nenhuma ligação móvel encontrada. Ative a ligação via telemóvel instantânea nos seus outros dispositivos e tente novamente. <a target="_blank" href="<ph name="URL" />">Saiba mais</a></translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 5fdf0e6..500140a 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">R&edeschide fereastra închisă</translation> <translation id="2731700343119398978">Așteptați...</translation> <translation id="2731710757838467317">Se creează utilizatorul monitorizat. Poate dura câteva momente.</translation> -<translation id="2733364097704495499">Înregistrați imprimanta <ph name="PRINTER_NAME" /> la Google Cloud Print?</translation> <translation id="2735438478659026460">Se dă clic automat când cursorul mouse-ului se oprește</translation> <translation id="2735712963799620190">Program</translation> <translation id="2737363922397526254">Restrânge...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Activează serviciile cloud</translation> <translation id="3599863153486145794">Șterge istoricul de pe toate dispozitivele conectate. Contul Google poate să ofere alte forme ale istoricului de navigare la <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Dezactivează sunetul pentru site-urile care îl redau</translation> +<translation id="3602290021589620013">Previzualizare</translation> <translation id="3603533104205588786">Poți da clic pe pictograma stea pentru a marca o pagină</translation> <translation id="3603622770190368340">Obțineți certificatul de rețea</translation> <translation id="3604048165392640554">Nu s-a găsit o conexiune mobilă. Activează Tetheringul instantaneu pe celelalte dispozitive și încearcă din nou. <a target="_blank" href="<ph name="URL" />">Află mai multe</a></translation> @@ -5197,7 +5197,7 @@ <translation id="9064275926664971810">Activează completarea automată pentru a completa formularele cu un singur clic</translation> <translation id="9064939804718829769">Se transferă...</translation> <translation id="9065203028668620118">Editează</translation> -<translation id="9066782832737749352">Transformarea textului în vorbire</translation> +<translation id="9066782832737749352">Redarea vocală a textului</translation> <translation id="9070219033670098627">Comută la altă persoană</translation> <translation id="907148966137935206">Nu permite niciunui site să afișeze ferestre pop-up (recomandat)</translation> <translation id="9071637495340542136">Se instalează <ph name="APP_NAME" />...</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 372a73a..381fb52c 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1141,7 +1141,6 @@ <translation id="2731392572903530958">Открыть закрытое окно</translation> <translation id="2731700343119398978">Подождите…</translation> <translation id="2731710757838467317">Создание контролируемого пользователя. Операция может занять несколько минут.</translation> -<translation id="2733364097704495499">Зарегистрировать принтер <ph name="PRINTER_NAME" /> в приложении "Виртуальный принтер Google"?</translation> <translation id="2735438478659026460">Автоматически регистрировать нажатие кнопки мыши, когда указатель останавливается</translation> <translation id="2735712963799620190">Расписание</translation> <translation id="2737363922397526254">Свернуть...</translation> @@ -1723,6 +1722,7 @@ <translation id="3596235046596950091">Включить облачные сервисы</translation> <translation id="3599863153486145794">Удаление истории со всех устройств, на которых выполнен вход в аккаунт. Информация о других ваших действиях в Интернете может также храниться на странице <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Отключить звуки на сайтах</translation> +<translation id="3602290021589620013">Предварительный просмотр</translation> <translation id="3603533104205588786">Нажмите на значок звездочки</translation> <translation id="3603622770190368340">Получение сетевого сертификата</translation> <translation id="3604048165392640554">Мобильное подключение отсутствует. Включите мгновенную точку доступа на других устройствах и повторите попытку. <a target="_blank" href="<ph name="URL" />">Подробнее…</a></translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index bf7b81e..ebf487f 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">Znova o&tvoriť zatvorené okno</translation> <translation id="2731700343119398978">Počkajte...</translation> <translation id="2731710757838467317">Vytvára sa kontrolovaný používateľ. Môže to chvíľu trvať.</translation> -<translation id="2733364097704495499">Chcete zaregistrovať tlačiareň <ph name="PRINTER_NAME" /> do služby Google Cloud Print?</translation> <translation id="2735438478659026460">Automaticky kliknúť po zastavení kurzora myši</translation> <translation id="2735712963799620190">Rozvrh</translation> <translation id="2737363922397526254">Zbaliť...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Povoliť cloudové služby</translation> <translation id="3599863153486145794">Vymaže históriu zo všetkých prihlásených zariadení. Váš účet Google môže mať ďalšie formy histórie prehliadania na adrese <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Vypnutie zvuku webov, ktoré prehrávajú zvuk</translation> +<translation id="3602290021589620013">Ukážka</translation> <translation id="3603533104205588786">Stránku uložíte ako záložku kliknutím na hviezdičku</translation> <translation id="3603622770190368340">Získanie certifkátu siete</translation> <translation id="3604048165392640554">Nenašlo sa žiadne mobilné pripojenie. Zapnite Dynamický tethering na svojich ďalších zariadeniach a skúste to znova. <a target="_blank" href="<ph name="URL" />">Ďalšie informácie</a></translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index a2522ff..dbce6b0 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1141,7 +1141,6 @@ <translation id="2731392572903530958">&Znova odpri zaprto okno</translation> <translation id="2731700343119398978">Počakajte ...</translation> <translation id="2731710757838467317">Ustvarjanje zaščitenega uporabnika. To lahko traja nekaj časa.</translation> -<translation id="2733364097704495499">Ali želite tiskalnik <ph name="PRINTER_NAME" /> registrirati v storitvi Google Tiskanje v oblaku?</translation> <translation id="2735438478659026460">Samodejni klik, ko se miškin kazalec ustavi</translation> <translation id="2735712963799620190">Razpored</translation> <translation id="2737363922397526254">Strni ...</translation> @@ -1723,6 +1722,7 @@ <translation id="3596235046596950091">Omogočanje storitev v oblaku</translation> <translation id="3599863153486145794">Izbriše zgodovino iz vseh naprav, v katerih ste prijavljeni. V Google Računu so morda druge vrste zgodovine brskanja na <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Izklop zvoka na spletnih mestih, ki predvajajo zvok</translation> +<translation id="3602290021589620013">Predogled</translation> <translation id="3603533104205588786">Če želite dodati stran med zaznamke, lahko kliknete zvezdico</translation> <translation id="3603622770190368340">Prejemanje omrežnega potrdila</translation> <translation id="3604048165392640554">Mobilne povezave ni bilo mogoče najti. V drugih napravah vklopite takojšnjo povezavo z internetom prek mobilnega telefona in poskusite znova. <a target="_blank" href="<ph name="URL" />">Več o tem</a></translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index edce954f..6981a34 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1136,7 +1136,6 @@ <translation id="2731392572903530958">П&оново отвори затворени прозор</translation> <translation id="2731700343119398978">Сачекајте…</translation> <translation id="2731710757838467317">Правимо корисника под надзором. То ће можда потрајати пар тренутака.</translation> -<translation id="2733364097704495499">Желите ли да региструјете штампач <ph name="PRINTER_NAME" /> за Google Cloud штампање?</translation> <translation id="2735438478659026460">Аутоматски кликни када се курсор миша заустави</translation> <translation id="2735712963799620190">Распоред</translation> <translation id="2737363922397526254">Скупи...</translation> @@ -1718,6 +1717,7 @@ <translation id="3596235046596950091">Омогући клауд услуге</translation> <translation id="3599863153486145794">Брише историју са свих уређаја на којима сте пријављени. Google налог може да има друге облике историје прегледања на <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Искључи звук сајтова који пуштају звук</translation> +<translation id="3602290021589620013">Преглед</translation> <translation id="3603533104205588786">Можете да обележите страницу кликом на звездицу</translation> <translation id="3603622770190368340">Добијање сертификата мреже</translation> <translation id="3604048165392640554">Нисмо пронашли ниједну мобилну везу. Укључите тренутно привезивање на другом уређају, па пробајте поново. <a target="_blank" href="<ph name="URL" />">Сазнајте више</a></translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 83e8183..90f6664 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1139,7 +1139,6 @@ <translation id="2731392572903530958">Ö&ppna ett stängt fönster igen</translation> <translation id="2731700343119398978">Vänta ...</translation> <translation id="2731710757838467317">Skapar din hanterade användare. Det kan ta en liten stund.</translation> -<translation id="2733364097704495499">Vill du registrera skrivaren <ph name="PRINTER_NAME" /> i Google Cloud Print?</translation> <translation id="2735438478659026460">Klicka automatiskt när muspekaren stannar</translation> <translation id="2735712963799620190">Schema</translation> <translation id="2737363922397526254">Dölj...</translation> @@ -1721,6 +1720,7 @@ <translation id="3596235046596950091">Aktivera molntjänster</translation> <translation id="3599863153486145794">Historik rensas från alla inloggade enheter. Det kan finnas andra former av webbhistorik i Google-kontot på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Stäng av ljudet på webbplatser</translation> +<translation id="3602290021589620013">Förhandsgranskning</translation> <translation id="3603533104205588786">Du kan lägga till ett bokmärke för sidan genom att klicka på stjärnan</translation> <translation id="3603622770190368340">Skaffa nätverkscertifikat</translation> <translation id="3604048165392640554">Ingen mobilanslutning hittades. Aktivera direktinternetdelning på dina andra enheter och försök igen. <a target="_blank" href="<ph name="URL" />">Läs mer</a></translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index d420701..935b7b8 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1137,7 +1137,6 @@ <translation id="2731392572903530958">Fungua &Tena Dirisha Lililofungwa</translation> <translation id="2731700343119398978">Tafadhali subiri...</translation> <translation id="2731710757838467317">Mtumiaji unayemsimamiwa anaongezwa. Huenda ikachukua dakika chache.</translation> -<translation id="2733364097704495499">Je, ungependa kusajili printa <ph name="PRINTER_NAME" /> kwenye Google Cloud Print?</translation> <translation id="2735438478659026460">Bofya kiotomatiki kiteuzi cha kipanya kinaposimama</translation> <translation id="2735712963799620190">Ratiba</translation> <translation id="2737363922397526254">Kunja...</translation> @@ -1716,6 +1715,7 @@ <translation id="3596235046596950091">Washa huduma za wingu</translation> <translation id="3599863153486145794">Hufuta historia kwenye vifaa vyote ulivyotumia kuingia katika akaunti. Huenda Akaunti yako ya Google ikawa na aina nyingine za historia ya kuvinjari kwenye <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Zima sauti katika tovuti</translation> +<translation id="3602290021589620013">Hakiki</translation> <translation id="3603533104205588786">Unaweza kubofya nyota ili ualamishe ukurasa</translation> <translation id="3603622770190368340">Pata cheti cha mtandao</translation> <translation id="3604048165392640554">Hamna muunganisho wa data ya simu ya mkononi. Washa Mtandao wa Kusambazwa Papo Hapo kwenye vifaa vyako vingine kisha ujaribu tena. <a target="_blank" href="<ph name="URL" />">Pata maelezo zaidi</a></translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 4384b992..ae34566 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1141,7 +1141,6 @@ <translation id="2731392572903530958">மூடப்பட்ட சாளரத்தை மீ&ண்டும் திற</translation> <translation id="2731700343119398978">காத்திருக்கவும்...</translation> <translation id="2731710757838467317">உங்கள் கண்காணிக்கப்படும் பயனரை உருவாக்குகிறது. இதற்கு ஒரு சில நிமிடங்கள் ஆகலாம்.</translation> -<translation id="2733364097704495499">பிரிண்டர் <ph name="PRINTER_NAME" /> ஐ Google கிளவுடு அச்சுடன் பதிவுசெய்ய விரும்புகிறீர்களா?</translation> <translation id="2735438478659026460">மவுஸ் கர்சர் நிற்கும் போது, தானாகக் கிளிக் செய்</translation> <translation id="2735712963799620190">திட்ட அட்டவணை</translation> <translation id="2737363922397526254">சுருக்கு...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">மேகக்கணிச் சேவைகளை இயக்கு</translation> <translation id="3599863153486145794">உள்நுழைந்த எல்லாச் சாதனங்களிலிருந்தும் வரலாற்றை அழிக்கும். உங்கள் Google கணக்கு, <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> என்ற இணைப்பில் உலாவல் வரலாறு தொடர்பான பிற தகவல்களைக் கொண்டிருக்கக்கூடும்.</translation> <translation id="3600792891314830896">ஒலியை இயக்கும் தளங்களில் ஒலியடக்கு</translation> +<translation id="3602290021589620013">மாதிரிக்காட்சி</translation> <translation id="3603533104205588786">பக்கத்தைப் புத்தகக்குறியிட, நட்சத்திரத்தைக் கிளிக் செய்யலாம்</translation> <translation id="3603622770190368340">நெட்வொர்க் சான்றிதழ் பெறுதல்</translation> <translation id="3604048165392640554">மொபைல் இணைப்பு இல்லை. உங்கள் பிற சாதனங்களில் உடனடி இணைப்பு முறையை இயக்கி, மீண்டும் முயலவும். <a target="_blank" href="<ph name="URL" />">மேலும் அறிக</a></translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index d41dc194..c828ceb7 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1125,7 +1125,6 @@ <translation id="2731392572903530958">మూ&సిన విండోని మళ్ళీ తెరువు</translation> <translation id="2731700343119398978">దయచేసి వేచి ఉండండి...</translation> <translation id="2731710757838467317">మీ పర్యవేక్షించబడే వినియోగదారుని సృష్టిస్తోంది. దీనికి కొంత సమయం పట్టవచ్చు.</translation> -<translation id="2733364097704495499">మీరు <ph name="PRINTER_NAME" /> ప్రింటర్ను Google మేఘ ముద్రణకు నమోదు చేయాలనుకుంటున్నారా?</translation> <translation id="2735438478659026460">మౌస్ కర్సర్ ఆపినప్పుడు స్వయంచాలకంగా క్లిక్ అవుతుంది</translation> <translation id="2735712963799620190">షెడ్యూల్</translation> <translation id="2737363922397526254">కుదించు...</translation> @@ -1697,6 +1696,7 @@ <translation id="3596235046596950091">క్లౌడ్ సేవలను ప్రారంభించు</translation> <translation id="3599863153486145794">సైన్ ఇన్ చేసిన అన్ని పరికరాల నుండి చరిత్రను తొలగిస్తుంది. మీ Google ఖాతా <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />లో ఇతర రూపాల్లో ఉన్న బ్రౌజింగ్ చరిత్రను కలిగి ఉండవచ్చు.</translation> <translation id="3600792891314830896">ధ్వనిని ప్లే చేసే సైట్లను మ్యూట్ చేయండి</translation> +<translation id="3602290021589620013">పరిదృశ్యం</translation> <translation id="3603533104205588786">మీరు పేజీని బుక్మార్క్ చేసేందుకు నక్షత్రం గుర్తును క్లిక్ చేయవచ్చు</translation> <translation id="3603622770190368340">నెట్వర్క్ ప్రమాణపత్రాన్ని పొందండి</translation> <translation id="3604048165392640554">మొబైల్ కనెక్షన్ కనుగొనబడలేదు. మీ ఇతర పరికరాలలో తక్షణ టీథెరింగ్ను ఆన్ చేసి మళ్లీ ప్రయత్నించండి. <a target="_blank" href="<ph name="URL" />">మరింత తెలుసుకోండి</a></translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index a881eac..75d20fb 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">เ&ปิดหน้าต่างที่ถูกปิดขึ้นใหม่</translation> <translation id="2731700343119398978">โปรดรอสักครู่...</translation> <translation id="2731710757838467317">กำลังสร้างผู้ใช้ภายใต้การดูแล อาจใช้เวลาสักครู่</translation> -<translation id="2733364097704495499">คุณต้องการลงทะเบียนเครื่องพิมพ์ <ph name="PRINTER_NAME" /> ไปยัง Google Cloud Print ไหม</translation> <translation id="2735438478659026460">คลิกอัตโนมัติเมื่อเคอร์เซอร์เมาส์หยุด</translation> <translation id="2735712963799620190">กำหนดการ</translation> <translation id="2737363922397526254">ยุบ...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">เปิดใช้บริการระบบคลาวด์</translation> <translation id="3599863153486145794">ล้างประวัติจากอุปกรณ์ที่ลงชื่อเข้าใช้ทั้งหมด บัญชี Google อาจมีประวัติการท่องเว็บรูปแบบอื่นๆ ที่ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /></translation> <translation id="3600792891314830896">ปิดเสียงไซต์ที่เล่นเสียง</translation> +<translation id="3602290021589620013">ดูตัวอย่าง</translation> <translation id="3603533104205588786">คุณสามารถคลิกดาวเพื่อบุ๊กมาร์กหน้า</translation> <translation id="3603622770190368340">รับใบรับรองเครือข่าย</translation> <translation id="3604048165392640554">ไม่พบการเชื่อมต่อมือถือ เปิดการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือแบบด่วนในอุปกรณ์เครื่องอื่นๆ แล้วลองอีกครั้ง <a target="_blank" href="<ph name="URL" />">เรียนรู้เพิ่มเติม</a></translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index e940c953..c93b8c7 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">Kapatılan Pencereyi T&ekrar Aç</translation> <translation id="2731700343119398978">Lütfen bekleyin...</translation> <translation id="2731710757838467317">Denetlenen kullanıcınız oluşturuluyor. Bu işlem birkaç saniye sürebilir.</translation> -<translation id="2733364097704495499"><ph name="PRINTER_NAME" /> adlı yazıcıyı Google Cloud Print'e kaydettirmek istiyor musunuz?</translation> <translation id="2735438478659026460">Fare imleci durduğunda otomatik tıkla</translation> <translation id="2735712963799620190">Program</translation> <translation id="2737363922397526254">Daralt...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Bulut hizmetlerini etkinleştir</translation> <translation id="3599863153486145794">Oturumunuzun açık olduğu tüm cihazlarda geçmişi temizler. Google Hesabınızın <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> adresinde başka biçimlerde tarama geçmişi olabilir.</translation> <translation id="3600792891314830896">Ses çalan sitelerin sesini kapat</translation> +<translation id="3602290021589620013">Önizleme</translation> <translation id="3603533104205588786">Sayfaya yer işareti koymak için yıldızı tıklayabilirsiniz</translation> <translation id="3603622770190368340">Ağ sertifikası edinme</translation> <translation id="3604048165392640554">Mobil bağlantı bulunamadı. Diğer cihazlarınızda Anında Tethering'i açın ve tekrar deneyin. <a target="_blank" href="<ph name="URL" />">Daha fazla bilgi</a></translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 33687f9..d3bdc4e 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">В&ідкрити закрите вікно знову</translation> <translation id="2731700343119398978">Зачекайте...</translation> <translation id="2731710757838467317">Створення контрольованого користувача. Це може тривати якийсь час.</translation> -<translation id="2733364097704495499">Зареєструвати принтер <ph name="PRINTER_NAME" /> у Google Cloud Print?</translation> <translation id="2735438478659026460">Автоматично натискати, коли курсор миші зупиняється</translation> <translation id="2735712963799620190">Графік</translation> <translation id="2737363922397526254">Згорнути...</translation> @@ -1722,6 +1721,7 @@ <translation id="3596235046596950091">Увімкнути хмарні сервіси</translation> <translation id="3599863153486145794">Очищує історію на всіх пристроях, на яких ви ввійшли в обліковий запис. У вашому обліковому записі Google на сторінці <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> можуть бути інші форми історії веб-перегляду.</translation> <translation id="3600792891314830896">Вимкнути звук на сайтах, які відтворюють його</translation> +<translation id="3602290021589620013">Попередній перегляд</translation> <translation id="3603533104205588786">Щоб створити закладку сторінки, натисніть значок зірочки</translation> <translation id="3603622770190368340">Отримати сертифікат мережі</translation> <translation id="3604048165392640554">Мобільне з’єднання не знайдено. Увімкніть миттєвий режим модема на інших пристроях і повторіть спробу. <a target="_blank" href="<ph name="URL" />">Докладніше</a></translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 6b03ee9..59c51d1 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1141,7 +1141,6 @@ <translation id="2731392572903530958">&Mở lại Cửa sổ đã Đóng</translation> <translation id="2731700343119398978">Vui lòng chờ...</translation> <translation id="2731710757838467317">Tạo người dùng được giám sát của bạn. Quá trình này có thể mất ít phút.</translation> -<translation id="2733364097704495499">Bạn có muốn đăng ký máy in <ph name="PRINTER_NAME" /> với Google Cloud Print?</translation> <translation id="2735438478659026460">Tự động nhấp chuột khi con trỏ dừng lại</translation> <translation id="2735712963799620190">Lịch biểu</translation> <translation id="2737363922397526254">Thu gọn...</translation> @@ -1723,6 +1722,7 @@ <translation id="3596235046596950091">Bật dịch vụ đám mây</translation> <translation id="3599863153486145794">Xóa lịch sử khỏi tất cả các thiết bị đã đăng nhập. Tài khoản Google của bạn có thể có các dạng lịch sử duyệt web khác tại <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="3600792891314830896">Tắt tiếng trên các trang web phát âm thanh</translation> +<translation id="3602290021589620013">Xem trước</translation> <translation id="3603533104205588786">Bạn có thể nhấp vào dấu sao để đánh dấu một trang</translation> <translation id="3603622770190368340">Nhận chứng chỉ mạng</translation> <translation id="3604048165392640554">Không tìm thấy kết nối di động nào. Hãy bật Chia sẻ kết nối tức thì trên thiết bị khác của bạn và thử lại. <a target="_blank" href="<ph name="URL" />">Tìm hiểu thêm</a></translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 082e2ec..2580464c 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1133,7 +1133,6 @@ <translation id="2731392572903530958">重新打开关闭的窗口(&E)</translation> <translation id="2731700343119398978">请稍候...</translation> <translation id="2731710757838467317">正在创建您的受监管用户,这可能需要一段时间。</translation> -<translation id="2733364097704495499">要将打印机“<ph name="PRINTER_NAME" />”注册到 Google 云打印吗?</translation> <translation id="2735438478659026460">鼠标光标停止时自动点击</translation> <translation id="2735712963799620190">排定时间</translation> <translation id="2737363922397526254">收起...</translation> @@ -1709,6 +1708,7 @@ <translation id="3596235046596950091">启用云服务</translation> <translation id="3599863153486145794">清除所有登录过的设备上的历史记录。您的 Google 帐号在 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 上可能有其他形式的浏览记录。</translation> <translation id="3600792891314830896">将播放声音的网站静音</translation> +<translation id="3602290021589620013">预览</translation> <translation id="3603533104205588786">点击星形图标即可为网页添加书签</translation> <translation id="3603622770190368340">获取网络证书</translation> <translation id="3604048165392640554">未找到任何移动网络连接。请在您的其他设备上打开即时网络共享,然后重试。<a target="_blank" href="<ph name="URL" />">了解详情</a></translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index c017681..b9aa56d8 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1140,7 +1140,6 @@ <translation id="2731392572903530958">重新開啟先前關閉的視窗(&E)</translation> <translation id="2731700343119398978">請稍候...</translation> <translation id="2731710757838467317">正在建立受監管使用者。這可能需要幾分鐘的時間。</translation> -<translation id="2733364097704495499">你要將印表機 <ph name="PRINTER_NAME" /> 註冊到 Google 雲端列印嗎?</translation> <translation id="2735438478659026460">滑鼠游標停止時自動點擊</translation> <translation id="2735712963799620190">設定時間</translation> <translation id="2737363922397526254">收合...</translation> @@ -1723,6 +1722,7 @@ <translation id="3596235046596950091">啟用雲端服務</translation> <translation id="3599863153486145794">將歷史紀錄從所有登入帳戶的裝置上清除。你的 Google 帳戶可能會儲存其他形式的瀏覽紀錄,請參閱 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />。</translation> <translation id="3600792891314830896">將播放音訊的網站設為靜音</translation> +<translation id="3602290021589620013">預覽</translation> <translation id="3603533104205588786">按一下星號即可將網頁加入書籤</translation> <translation id="3603622770190368340">取得網路憑證</translation> <translation id="3604048165392640554">找不到行動數據連線。請開啟其他裝置的即時網路共用功能,然後再試一次。<a target="_blank" href="<ph name="URL" />">瞭解詳情</a></translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb index e209940..8883599 100644 --- a/chrome/app/resources/google_chrome_strings_am.xtb +++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Chrome ጊዜው አልፎበታል</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome በ1 ደቂቃ ውስጥ ዳግም ይጀመራል}one{Chrome በ# ደቂቃዎች ውስጥ ዳግም ይጀመራል}other{Chrome በ# ደቂቃዎች ውስጥ ዳግም ይጀመራል}}</translation> <translation id="2063848847527508675">Chrome OS ዝማኔውን ለመተግበር ዳግም መጀመር አለበት።</translation> -<translation id="2077129598763517140">ሲገኝ የሃርድዌር ማጣደፍን ተጠቀም</translation> <translation id="2084710999043359739">ወደ Chrome አክል</translation> <translation id="2094919256425865063">የሆነው ሆኖ Chrome ይቁም?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome አሁን ዳግም ይጀምራል}=1{Chrome በ1 ሰከንድ ዳግም ይጀምራል}one{Chrome በ# ሰከንዶች ዳግም ይጀምራል}other{Chrome በ# ሰከንዶች ዳግም ይጀምራል}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">የChrome ውሂብዎ ከዚህ መለያ ጋር ይገናኝ?</translation> <translation id="4251625577313994583">በእርስዎ iPhone ላይ Chromeን ያግኙት</translation> <translation id="4293420128516039005">Chromeን በመላ መሣሪያዎችዎ ላይ ለማሳመር እና ግላዊነት ለማላበስ</translation> -<translation id="4309555186815777032">(የChrome <ph name="BEGIN_BUTTON" />ዳግም መጀመር<ph name="END_BUTTON" /> ያስፈልገዋል)</translation> <translation id="4328355335528187361">Google Chrome ገንቢ (mDNS-In)</translation> <translation id="4331809312908958774">Chrome ስርዓተ ክወና</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> ወደ Chrome ታክሏል</translation> <translation id="4407807842708586359">Google Chrome ስርዓተ ክወና</translation> -<translation id="4458285410772214805">ይሄ ለውጥ እንዲተገበር እባክዎ ይውጡ እና እንደገና ይግቡ።</translation> <translation id="4458462641685292929">በGoogle Chrome ላይ ሌላ ሥርዓተ ክወና በሂደት ላይ ነው። እባክዎ በኋላ ላይ እንደገና ይሞክሩ።</translation> <translation id="4480040274068703980">Chrome OS እየተገባ ሳለ በተፈጠረ አንድ ስህተት ምክንያት ውሂብዎን ማመሳሰል አልቻለም።</translation> <translation id="4561051373932531560">Google Chrome ድር ላይ ያለ ስልክ ቁጥር ጠቅ እንዲያደርጉት እና በSkype እንዲደውሉለት ያስችልዎታል!</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">በChrome ውስጥ</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome የእርስዎን ውሂብ ማመሳሰል አልቻለም። እባክዎ የእርስዎን የማመሳሰያ የይለፍ ሐረግ ያዘምኑ።</translation> -<translation id="5037239767309817516">ለውጡ እንዲተገበር እባክዎ ሁሉንም የGoogle Chrome መስኮቶችን ይዝጉና እንደገና ያስጀምሩት።</translation> <translation id="5131923704757666404">{0,plural, =1{በአንድ ሰዓት ውስጥ Chrome እንደገና ይጀመራል}one{በ# ሰዓቶች ውስጥ Chrome እንደገና ይጀመራል}other{በ# ሰዓቶች ውስጥ Chrome እንደገና ይጀመራል}}</translation> <translation id="5132929315877954718">ለGoogle Chrome ምርጥ መተግበሪያዎችን፣ ጨዋታዎችን፣ ቅጥያዎችን እና ገጽታዎችን ያግኙ።</translation> <translation id="5166975452760862670">Google Chrome በዚህ ቋንቋ እየታየ ነው</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">ሰርጥ ተለውጧል። ለውጦችን ለመተግበር መሳሪያዎን ዳግም ያስጀምሩ።</translation> <translation id="5895138241574237353">እንደገና ጀምር</translation> <translation id="5906655207909574370">የተዘመነ ለመሆን ጥቂት ብቻ ቀርቷል! ዝማኔውን ለማጠናቀቅ መሣሪያዎን ዳግም ያስጀምሩት።</translation> -<translation id="5931853610562009806">Mac ላይ የይለፍ ቃላት በእርስዎ Keychain ላይ ሊቀመጡ ይችላሉ፣ እና ይህን የOS X መለያ በሚጋሩ ሌሎች የChrome ተጠቃሚዎች ሊደረስባቸው ወይም ሊሰመሩ ይችላሉ።</translation> <translation id="5940385492829620908">የእርስዎ ድር፣ ዕልባቶች እና ሌሎች የChrome ነገሮች እዚህ ይኖራሉ።</translation> <translation id="5941830788786076944">Google Chromeን መነሻ ማሰሻ አድርግ</translation> <translation id="6014844626092547096">አሁን ወደ Chrome ገብተዋል! ማመሳሰል በአስተዳዳሪዎ ተሰናክሏል።</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb index 19877b3e..7aa39bb 100644 --- a/chrome/app/resources/google_chrome_strings_ar.xtb +++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -42,7 +42,6 @@ <translation id="1877026089748256423">إصدار Chrome قديم</translation> <translation id="2007150628464581396">{0,plural, =1{ستتم إعادة تشغيل Chrome خلال دقيقة واحدة}zero{ستتم إعادة تشغيل Chrome خلال # دقيقة}two{ستتم إعادة تشغيل Chrome خلال دقيقتين (#)}few{ستتم إعادة تشغيل Chrome خلال # دقائق}many{ستتم إعادة تشغيل Chrome خلال # دقيقةً}other{ستتم إعادة تشغيل Chrome خلال # دقيقة}}</translation> <translation id="2063848847527508675">يلزم إعادة تشغيل نظام التشغيل Chrome حتى يتم تطبيق التحديث.</translation> -<translation id="2077129598763517140">استخدام تسريع الأجهزة عند توفره</translation> <translation id="2084710999043359739">إضافة إلى Chrome</translation> <translation id="2094919256425865063">هل تريد الخروج من Chrome على أي حال؟</translation> <translation id="210890598424854131">{0,plural, =0{ستتم إعادة تشغيل Chrome الآن}=1{ستتم إعادة تشغيل Chrome خلال ثانية واحدة}two{ستتم إعادة تشغيل Chrome خلال ثانيتين (#)}few{ستتم إعادة تشغيل Chrome خلال # ثوانٍ}many{ستتم إعادة تشغيل Chrome خلال # ثانيةً}other{ستتم إعادة تشغيل Chrome خلال # ثانية}}</translation> @@ -127,12 +126,10 @@ <translation id="4251615635259297716">هل ترغب في ربط بياناتك في Chrome بهذا الحساب؟</translation> <translation id="4251625577313994583">الحصول على Chrome على جهاز iPhone</translation> <translation id="4293420128516039005">يمكنك تسجيل الدخول لمزامنة Chrome وتخصيصه على جميع أجهزتك.</translation> -<translation id="4309555186815777032">(<ph name="BEGIN_BUTTON" />إعادة تشغيل<ph name="END_BUTTON" /> Chrome مطلوبة)</translation> <translation id="4328355335528187361">إصدار مطوّري البرامج من Google Chrome (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">تمت إضافة <ph name="EXTENSION_NAME" /> إلى Chrome</translation> <translation id="4407807842708586359">نظام تشغيل Google Chrome</translation> -<translation id="4458285410772214805">يُرجى الخروج ثم تسجيل الدخول حتى يسري هذا التغيير.</translation> <translation id="4458462641685292929">عملية أخرى على Google Chrome قيد التقدم. يُرجى المحاولة مرة أخرى لاحقًا.</translation> <translation id="4480040274068703980">تعذر على نظام التشغيل Chrome مزامنة البيانات نظرًا لوجود خطأ في تسجيل الدخول.</translation> <translation id="4561051373932531560">يتيح لك Google Chrome النقر على رقم هاتف على الويب والاتصال به باستخدام Skype!</translation> @@ -157,7 +154,6 @@ <translation id="495931528404527476">في Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">تعذر على Google Chrome مزامنة البيانات. يُرجى تحديث عبارة مرور المزامنة.</translation> -<translation id="5037239767309817516">يُرجى إغلاق جميع نوافذ Google Chrome وإعادة تشغيله حتى يسري هذا التغيير.</translation> <translation id="5131923704757666404">{0,plural, =1{ستتم إعادة تشغيل Chrome خلال ساعة واحدة}zero{ستتم إعادة تشغيل Chrome خلال # ساعة}two{ستتم إعادة تشغيل Chrome خلال ساعتين (#)}few{ستتم إعادة تشغيل Chrome خلال # ساعات}many{ستتم إعادة تشغيل Chrome خلال # ساعةً}other{ستتم إعادة تشغيل Chrome خلال # ساعة}}</translation> <translation id="5132929315877954718">يمكنك اكتشاف تطبيقات، وألعاب، وإضافات، ومظاهر رائعة لمتصفح Google Chrome.</translation> <translation id="5166975452760862670">يتم عرض Google Chrome بهذه اللغة</translation> @@ -183,7 +179,6 @@ <translation id="5877064549588274448">تم تغيير القناة. يمكنك إعادة تشغيل الجهاز لتدخل التغييرات حيز التنفيذ.</translation> <translation id="5895138241574237353">إعادة التشغيل</translation> <translation id="5906655207909574370">أوشك التحديث على الانتهاء! أعِد تشغيل الجهاز لإنهاء التحديث.</translation> -<translation id="5931853610562009806">في نظام التشغيل Mac، قد يتم حفظ كلمات المرور في تطبيق Keychain والدخول إليها أو مزامنتها من قبل مستخدمي Chrome الآخرين الذين يشاركون حساب نظام التشغيل X هذا.</translation> <translation id="5940385492829620908">الويب والإشارات المرجعية وغيرها من عناصر Chrome توجد هنا.</translation> <translation id="5941830788786076944">جعل Google Chrome المتصفّح الافتراضي</translation> <translation id="6014844626092547096">لقد سجلت الدخول الآن إلى Chrome! عطّل المشرف المزامنة.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb index 7628e32..c4bd6c5b6 100644 --- a/chrome/app/resources/google_chrome_strings_bg.xtb +++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -42,7 +42,6 @@ <translation id="1877026089748256423">Chrome не е актуален</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome ще се рестартира след 1 минута}other{Chrome ще се рестартира след # минути}}</translation> <translation id="2063848847527508675">Chrome OS трябва да се рестартира, за да приложи актуализацията.</translation> -<translation id="2077129598763517140">Да се използва хардуерно ускорение, когато е налице</translation> <translation id="2084710999043359739">Добавяне</translation> <translation id="2094919256425865063">Искате ли да затворите Chrome въпреки това?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome ще се рестартира сега}=1{Chrome ще се рестартира след 1 секунда}other{Chrome ще се рестартира след # секунди}}</translation> @@ -127,12 +126,10 @@ <translation id="4251615635259297716">Да се свържат ли данните ви в Chrome с този профил?</translation> <translation id="4251625577313994583">Изтеглете Chrome за своя iPhone</translation> <translation id="4293420128516039005">Влезте в профила си, за да синхронизирате и персонализирате Chrome на всичките си устройства</translation> -<translation id="4309555186815777032">(изисква <ph name="BEGIN_BUTTON" />рестартиране<ph name="END_BUTTON" /> на Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">Разширението <ph name="EXTENSION_NAME" /> бе добавено към Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Моля, излезте от профила си и влезте отново, за да влезе в сила тази промяна.</translation> <translation id="4458462641685292929">Извършва се друго действие, свързано с Google Chrome. Моля, опитайте отново по-късно.</translation> <translation id="4480040274068703980">Chrome OS не можа да синхронизира данните ви поради грешка при влизане в профила.</translation> <translation id="4561051373932531560">Google Chrome ви позволява да кликнете върху телефонен номер в мрежата и да се обадите до него със Skype!</translation> @@ -157,7 +154,6 @@ <translation id="495931528404527476">В Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome не можа да синхронизира данните ви. Моля, актуализирайте пропуска си за синхронизиране.</translation> -<translation id="5037239767309817516">Моля, затворете всички прозорци на Google Chrome и го стартирайте отново, за да влезе в сила промяната.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome ще стартира отново след един час}other{Chrome ще стартира отново след # часа}}</translation> <translation id="5132929315877954718">Открийте отлични приложения, игри, разширения и теми за Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome се показва на този език</translation> @@ -181,7 +177,6 @@ <translation id="5877064549588274448">Каналът бе променен. Рестартирайте устройството си, за да се приложат промените.</translation> <translation id="5895138241574237353">Рестартиране</translation> <translation id="5906655207909574370">Актуализирането почти завърши! Остава само да рестартирате устройството си.</translation> -<translation id="5931853610562009806">Под Mac паролите може да се запазват в Keychain и да се използват или синхронизират от други потребители на Chrome, споделящи този профил в OS X.</translation> <translation id="5940385492829620908">Тук ще намерите посещаваните от вас места в мрежата, отметките и другите си неща в Chrome.</translation> <translation id="5941830788786076944">Искам Google Chrome да бъде браузърът по подразбиране</translation> <translation id="6014844626092547096">Вече влязохте в Chrome! Синхронизирането е деактивирано от администратора ви.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb index 37f9c75..87ae853 100644 --- a/chrome/app/resources/google_chrome_strings_bn.xtb +++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -42,7 +42,6 @@ <translation id="1877026089748256423">Chrome পুরানো হয়ে গেছে</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome ১ মিনিটের মধ্যে আবার চালু করা হবে}one{Chrome # মিনিটের মধ্যে আবার চালু করা হবে}other{Chrome # মিনিটের মধ্যে আবার চালু করা হবে}}</translation> <translation id="2063848847527508675">আপডেটটি প্রয়োগ করতে Chrome OS আবার চালু করা প্রয়োজন।</translation> -<translation id="2077129598763517140">যখনই উপলব্ধ তখন হার্ডওয়্যার অ্যাক্সিলারেশন ব্যবহার করুন</translation> <translation id="2084710999043359739">Chrome এ জুড়ুন</translation> <translation id="2094919256425865063">তা স্বত্তেও Chrome বন্ধ করবেন?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome এখনই আবার চালু করা হবে}=1{Chrome ১ সেকেন্ডের মধ্যে আবার চালু করা হবে}one{Chrome # সেকেন্ডের মধ্যে আবার চালু করা হবে}other{Chrome # সেকেন্ডের মধ্যে আবার চালু করা হবে}}</translation> @@ -127,12 +126,10 @@ <translation id="4251615635259297716">এই অ্যাকাউন্টে আপনার Chrome ডেটা লিঙ্ক করবেন?</translation> <translation id="4251625577313994583">আপনার iPhone এ Chrome ইনস্টল করুন</translation> <translation id="4293420128516039005">আপনার সব ডিভাইস জুড়ে Chrome সিঙ্ক করতে এবং নিজের মতো সাজিয়ে নিতে সাইন-ইন করুন</translation> -<translation id="4309555186815777032">(Chrome <ph name="BEGIN_BUTTON" />আবার চালু করা<ph name="END_BUTTON" /> প্রয়োজন)</translation> <translation id="4328355335528187361">Google Chrome ডেভেলপার (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">Chrome-এ <ph name="EXTENSION_NAME" /> যোগ করা হয়েছে</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">দয়া করে পরিবর্তনটি সম্ভব করতে প্রস্থান করুন এবং পুনরায় প্রবেশ করুন৷</translation> <translation id="4458462641685292929">Google Chrome এ আরেকটি ক্রিয়াকলাপ প্রক্রিয়ায় আছে। দয়া করে পরে আবার চেষ্টা করুন৷</translation> <translation id="4480040274068703980">সাইন ইনে ত্রুটির কারণে Chrome OS আপনার ডেটা সিঙ্ক করতে পারেনি৷</translation> <translation id="4561051373932531560">Google Chrome আপনাকে ওয়েবে কোনো ফোন নম্বরে ক্লিক করতে এবং Skype-এর মাধ্যমে সেটিতে কল করতে দেয়!</translation> @@ -157,7 +154,6 @@ <translation id="495931528404527476">Chrome-এ</translation> <translation id="4990567037958725628">Google Chrome ক্যানারি</translation> <translation id="5028489144783860647">Google Chrome আপনার ডেটা সিঙ্ক করতে পারেনি৷ দয়া করে আপনার সিঙ্ক পাসফ্রেজ আপডেট করুন৷</translation> -<translation id="5037239767309817516">দয়া করে সব Google Chrome উইন্ডো বন্ধ করুন এবং এই পরিবর্তনকে প্রভাবশালী করতে এটিকে পুনঃলঞ্চ করুন৷ </translation> <translation id="5131923704757666404">{0,plural, =1{এক ঘণ্টার মধ্যে Chrome রিলঞ্চ করা হবে}one{# ঘণ্টার মধ্যে Chrome রিলঞ্চ করা হবে}other{# ঘণ্টার মধ্যে Chrome রিলঞ্চ করা হবে}}</translation> <translation id="5132929315877954718">Google Chrome-এর দুর্দান্ত অ্যাপ্লিকেশান, গেম, এক্সটেনশান এবং থিম আবিষ্কার করুন৷</translation> <translation id="5166975452760862670">Google Chrome এই ভাষায় প্রদর্শিত হচ্ছে</translation> @@ -183,7 +179,6 @@ <translation id="5877064549588274448">চ্যানেল পরিবর্তিত হয়েছে৷ পরিবর্তনগুলি প্রয়োগ করার জন্য আপনার ডিভাইস আবার শুরু করুন৷</translation> <translation id="5895138241574237353">পুনর্সূচনা</translation> <translation id="5906655207909574370">প্রায় আপ-টু-ডেট হয়েছে! আপডেট শেষ করতে আপনার ডিভাইস আবার চালু করুন।</translation> -<translation id="5931853610562009806">Mac এ, পাসওয়ার্ডগুলি আপনার Keychain এ সংরক্ষিত হতে পারে এবং এই OS X অ্যাকাউন্টটি শেয়ার করে এমন অন্য Chrome ব্যবহারকারীরা এটি অ্যাক্সেস বা সিঙ্ক করতে পারবে।</translation> <translation id="5940385492829620908">আপনার ওয়েব, বুকমার্ক, এবং Chrome এর অন্যান্য জিনিস এখানে রয়েছে৷</translation> <translation id="5941830788786076944">Google Chrome-কে ডিফল্ট ব্রাউজার করুন</translation> <translation id="6014844626092547096">আপনি এখন Chrome এ প্রবেশ করেছেন! আপনার প্রশাসক দ্বারা সিঙ্ক অক্ষম করা আছে৷</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index aab77584..5dbde67 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome no està actualitzat</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome es reiniciarà d'aquí a 1 minut}other{Chrome es reiniciarà d'aquí a # minuts}}</translation> <translation id="2063848847527508675">Cal reiniciar Chrome OS per aplicar l'actualització.</translation> -<translation id="2077129598763517140">Utilitza l'acceleració per maquinari quan estigui disponible</translation> <translation id="2084710999043359739">Afegeix a Chrome</translation> <translation id="2094919256425865063">Vols sortir de Chrome igualment?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome es reiniciarà ara}=1{Chrome es reiniciarà d'aquí a 1 segon}other{Chrome es reiniciarà d'aquí a # segons}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Voleu enllaçar les vostres dades de Chrome amb aquest compte?</translation> <translation id="4251625577313994583">baixa Chrome al dispositiu iPhone</translation> <translation id="4293420128516039005">Inicia la sessió per sincronitzar i personalitzar Chrome en tots els teus dispositius</translation> -<translation id="4309555186815777032">(cal <ph name="BEGIN_BUTTON" />reiniciar<ph name="END_BUTTON" /> Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> s'ha afegit a Chrome</translation> <translation id="4407807842708586359">SO de Google Chrome</translation> -<translation id="4458285410772214805">Tanqueu la sessió i torneu a iniciar-la perquè aquest canvi es faci efectiu.</translation> <translation id="4458462641685292929">Hi ha una altra operació en curs a Google Chrome. Torna-ho a provar més tard.</translation> <translation id="4480040274068703980">Chrome OS no ha pogut sincronitzar les vostres dades a causa d'un error en iniciar la sessió.</translation> <translation id="4561051373932531560">Google Chrome us permet fer clic en un número de telèfon al web i trucar-hi amb Skype!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">A Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome no ha pogut sincronitzar les dades. Actualitzeu la frase de contrasenya de sincronització.</translation> -<translation id="5037239767309817516">Tanqueu totes les finestres de Google Chrome i torneu a iniciar el programa perquè aquest canvi tingui efecte.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome es reiniciarà d'aquí a una hora}other{Chrome es reiniciarà d'aquí a # hores}}</translation> <translation id="5132929315877954718">Descobriu aplicacions, jocs, extensions i temes genials per a Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome es mostra en aquest idioma</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">El canal ha canviat. Reinicieu el dispositiu perquè s'apliquin els canvis.</translation> <translation id="5895138241574237353">Reinicia</translation> <translation id="5906655207909574370">Gairebé heu acabat. Reinicieu el dispositiu per completar l'actualització.</translation> -<translation id="5931853610562009806">En un Mac, és possible que les contrasenyes es desin a Keychain i que altres usuaris de Chrome que comparteixin aquest compte d'OS X puguin accedir-hi i sincronitzar-les.</translation> <translation id="5940385492829620908">El vostre web, les adreces d'interès i altres coses de Chrome resideixen aquí.</translation> <translation id="5941830788786076944">Estableix Google Chrome com el navegador predeterminat</translation> <translation id="6014844626092547096">Heu iniciat la sessió a Chrome. El vostre administrador ha desactivat la sincronització.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb index 7c46ad0..a6a5fea 100644 --- a/chrome/app/resources/google_chrome_strings_cs.xtb +++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Chrome je zastaralý</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome se za 1 minutu restartuje}few{Chrome se za # minuty restartuje}many{Chrome se za # minuty restartuje}other{Chrome se za # minut restartuje}}</translation> <translation id="2063848847527508675">Aktualizace se použije po restartování systému Chrome OS.</translation> -<translation id="2077129598763517140">V případě dostupnosti použít hardwarovou akceleraci</translation> <translation id="2084710999043359739">Přidat do prohlížeče Chrome</translation> <translation id="2094919256425865063">Přesto Chrome ukončit?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome se teď restartuje}=1{Chrome se za 1 sekundu restartuje}few{Chrome se za # sekundy restartuje}many{Chrome se za # sekundy restartuje}other{Chrome se za # sekund restartuje}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">Chcete propojit údaje prohlížeče Chrome s tímto účtem?</translation> <translation id="4251625577313994583">stáhněte si Chrome do iPhonu</translation> <translation id="4293420128516039005">Po přihlášení si budete moci Chrome synchronizovat a upravit na různých zařízeních</translation> -<translation id="4309555186815777032">(vyžaduje <ph name="BEGIN_BUTTON" />restartování<ph name="END_BUTTON" /> prohlížeče Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">Do Chromu bylo přidáno rozšíření <ph name="EXTENSION_NAME" /></translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Chcete-li, aby se změny projevily, odhlaste se a znovu se přihlaste.</translation> <translation id="4458462641685292929">V prohlížeči Google Chrome právě probíhá jiná operace. Zkuste to znovu později.</translation> <translation id="4480040274068703980">Chrome OS vaše data nemohl synchronizovat z důvodu chyby při přihlášení.</translation> <translation id="4561051373932531560">Google Chrome umožňuje kliknout na telefonní číslo na webu a volat na něj prostřednictvím aplikace Skype.</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">V Chromu</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome vaše data nemohl synchronizovat. Aktualizujte prosím heslovou frázi pro synchronizaci.</translation> -<translation id="5037239767309817516">Aby se změna projevila, zavřete prosím všechna okna aplikace Google Chrome a spusťte ji znovu.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome se za hodinu restartuje}few{Chrome se za # hodiny restartuje}many{Chrome se za # hodiny restartuje}other{Chrome se za # hodin restartuje}}</translation> <translation id="5132929315877954718">Objevte skvělé aplikace, hry, rozšíření a motivy prohlížeče Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome se zobrazuje v tomto jazyce</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">Verze byla změněna. Změny se projeví po restartování zařízení.</translation> <translation id="5895138241574237353">Restartovat</translation> <translation id="5906655207909574370">Aktualizace je téměř hotova! Dokončíte ji restartováním zařízení.</translation> -<translation id="5931853610562009806">V počítačích Mac se hesla mohou ukládat do úložiště Keychain a mohou k nim přistupovat nebo je synchronizovat i další uživatelé aplikace Chrome, kteří sdílejí tento účet systému OS X.</translation> <translation id="5940385492829620908">Zde jsou k dispozici vaše weby, záložky a další obsah Chromu.</translation> <translation id="5941830788786076944">Nastavit Google Chrome jako výchozí prohlížeč</translation> <translation id="6014844626092547096">Nyní jste v Chromu přihlášeni. Synchronizace je ale deaktivována správcem.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index f03dee8..2a900253 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome er forældet</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome genstarter om 1 minut}one{Chrome genstarter om # minut}other{Chrome genstarter om # minutter}}</translation> <translation id="2063848847527508675">Chrome OS skal genstartes, før opdateringen kan anvendes.</translation> -<translation id="2077129598763517140">Brug hardwareacceleration, når det er muligt</translation> <translation id="2084710999043359739">Føj til Chrome</translation> <translation id="2094919256425865063">Vil du slutte Chrome alligevel?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome genstarter nu}=1{Chrome genstarter om 1 sekund}one{Chrome genstarter om # sekund}other{Chrome genstarter om # sekunder}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Vil du linke dine Chrome-data til denne konto?</translation> <translation id="4251625577313994583">få Chrome på din iPhone</translation> <translation id="4293420128516039005">Log ind for at synkronisere og tilpasse Chrome på alle dine enheder</translation> -<translation id="4309555186815777032">(kræver en <ph name="BEGIN_BUTTON" />genstart<ph name="END_BUTTON" /> af Chrome)</translation> <translation id="4328355335528187361">Udviklerversionen af Google Chrome (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> er føjet til Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Du skal logge ud og logge ind igen, for at denne ændring kan træde i kraft.</translation> <translation id="4458462641685292929">En anden handling i Google Chrome er i gang. Prøv igen senere.</translation> <translation id="4480040274068703980">Chrome OS kunne ikke synkronisere dine data på grund af en fejl under login.</translation> <translation id="4561051373932531560">Med Google Chrome kan du klikke på et telefonnummer på nettet og ringe op til det via Skype!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">I Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome kunne ikke synkronisere dine data. Opdater din adgangssætning til synkronisering.</translation> -<translation id="5037239767309817516">Luk alle vinduer i Google Chrome, og genstart, så denne ændring kan træde i kraft.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome genstarter om en time}one{Chrome genstarter om # time}other{Chrome genstarter om # timer}}</translation> <translation id="5132929315877954718">Find fantastiske apps, spil, udvidelser og temaer til Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome vises på dette sprog</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">Kanalen er ændret. Genstart din enhed for at anvende ændringerne.</translation> <translation id="5895138241574237353">Genstart</translation> <translation id="5906655207909574370">Næsten opdateret. Genstart din enhed for at afslutte opdateringen.</translation> -<translation id="5931853610562009806">På Mac kan adgangskoder blive gemt i din Keychain, og andre Chrome-brugere, der deler denne OS X-konto, kan få adgang til eller synkronisere adgangskoderne.</translation> <translation id="5940385492829620908">Dit webindhold, dine bogmærker og andre Chrome-ting kan findes her.</translation> <translation id="5941830788786076944">Gør Google Chrome til din standardbrowser</translation> <translation id="6014844626092547096">Du er nu logget ind i Chrome. Synkronisering er deaktiveret af din administrator.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb index d3fcf93..93379394 100644 --- a/chrome/app/resources/google_chrome_strings_de.xtb +++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome ist veraltet.</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome wird in 1 Minute neu gestartet}other{Chrome wird in # Minuten neu gestartet}}</translation> <translation id="2063848847527508675">Chrome OS muss neu gestartet werden, um das Update zu übernehmen.</translation> -<translation id="2077129598763517140">Hardwarebeschleunigung verwenden, falls verfügbar</translation> <translation id="2084710999043359739">Zu Chrome hinzufügen</translation> <translation id="2094919256425865063">Chrome trotzdem beenden?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome wird jetzt neu gestartet}=1{Chrome wird in 1 Sekunde neu gestartet}other{Chrome wird in # Sekunden neu gestartet}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Ihre Chrome-Daten mit diesem Konto verknüpfen?</translation> <translation id="4251625577313994583">Chrome auf das iPhone herunterladen</translation> <translation id="4293420128516039005">Wenn Sie sich anmelden, wird Chrome auf allen Ihren Geräten synchronisiert und personalisiert</translation> -<translation id="4309555186815777032">Ein <ph name="BEGIN_BUTTON" />Neustart<ph name="END_BUTTON" /> von Chrome ist erforderlich.</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> wurde Chrome hinzugefügt</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Melden Sie sich ab und wieder an, damit diese Änderung wirksam wird.</translation> <translation id="4458462641685292929">In Google Chrome wird eine andere Aktion durchgeführt. Bitte versuchen Sie es später noch einmal.</translation> <translation id="4480040274068703980">Chrome OS konnte Ihre Daten aufgrund eines Fehlers bei der Anmeldung nicht synchronisieren.</translation> <translation id="4561051373932531560">In Google Chrome können Sie auf eine Telefonnummer im Web klicken und diese mit Skype anrufen.</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">In Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome konnte Ihre Daten nicht synchronisieren. Bitte aktualisieren Sie Ihre Passphrase für die Synchronisierung.</translation> -<translation id="5037239767309817516">Schließen Sie alle Google Chrome-Fenster und starten Sie die App neu, damit diese Änderung wirksam wird.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome wird in einer Stunde neu gestartet}other{Chrome wird in # Stunden neu gestartet}}</translation> <translation id="5132929315877954718">Entdecken Sie tolle Apps, Spiele, Erweiterungen und Designs für Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome wird in dieser Sprache angezeigt</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">Kanal wurde geändert. Starten Sie Ihr Gerät neu, um die Änderungen zu übernehmen.</translation> <translation id="5895138241574237353">Neu starten</translation> <translation id="5906655207909574370">Fast fertig! Starten Sie Ihr Gerät neu, um die Aktualisierung abzuschließen.</translation> -<translation id="5931853610562009806">Auf einem Mac können Passwörter in Ihrem Schlüsselbund gespeichert und von anderen Chrome-Nutzern über dieses OS X-Konto abgerufen oder synchronisiert werden.</translation> <translation id="5940385492829620908">Hier können Sie im Web surfen und Ihre Lesezeichen und andere Chrome-Inhalte speichern.</translation> <translation id="5941830788786076944">Google Chrome als Standardbrowser festlegen</translation> <translation id="6014844626092547096">Sie sind nun in Chrome angemeldet. Die Synchronisierung wurde von Ihrem Administrator deaktiviert.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb index 8341538..fbb81f3e 100644 --- a/chrome/app/resources/google_chrome_strings_el.xtb +++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -42,7 +42,6 @@ <translation id="1877026089748256423">Το Chrome δεν είναι ενημερωμένο</translation> <translation id="2007150628464581396">{0,plural, =1{Η επανεκκίνηση του Chrome θα γίνει σε 1 λεπτό}other{Η επανεκκίνηση του Chrome θα γίνει σε # λεπτά}}</translation> <translation id="2063848847527508675">Για να εφαρμοστεί η ενημέρωση, πρέπει να γίνει επανεκκίνηση του Chrome OS.</translation> -<translation id="2077129598763517140">Χρήση της επιτάχυνσης υλικού όταν είναι διαθέσιμη</translation> <translation id="2084710999043359739">Προσθήκη στο Chrome</translation> <translation id="2094919256425865063">Να τερματιστεί η λειτουργία του Chrome ούτως ή άλλως;</translation> <translation id="210890598424854131">{0,plural, =0{Η επανεκκίνηση του Chrome θα γίνει τώρα}=1{Η επανεκκίνηση του Chrome θα γίνει σε 1 δευτερόλεπτο}other{Η επανεκκίνηση του Chrome θα γίνει σε # δευτερόλεπτα}}</translation> @@ -127,12 +126,10 @@ <translation id="4251615635259297716">Να συνδεθούν τα δεδομένα σας στο Chrome με αυτόν το λογαριασμό;</translation> <translation id="4251625577313994583">λήψη Chrome στο iPhone</translation> <translation id="4293420128516039005">Συνδεθείτε, για να συγχρονίσετε και να εξατομικεύσετε το Chrome στις συσκευές σας</translation> -<translation id="4309555186815777032">(απαιτείται <ph name="BEGIN_BUTTON" />επανεκκίνηση<ph name="END_BUTTON" /> του Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">Η επέκταση <ph name="EXTENSION_NAME" /> προστέθηκε στο Chrome</translation> <translation id="4407807842708586359">Λειτουργικό σύστημα Google Chrome</translation> -<translation id="4458285410772214805">Για να εφαρμοστεί αυτή η αλλαγή, αποσυνδεθείτε και συνδεθείτε ξανά.</translation> <translation id="4458462641685292929">Μια άλλη λειτουργία βρίσκεται σε εξέλιξη στο Google Chrome. Δοκιμάστε ξανά αργότερα.</translation> <translation id="4480040274068703980">Το Chrome OS δεν μπόρεσε να συγχρονίσει τα δεδομένα σας λόγω σφάλματος κατά τη σύνδεση.</translation> <translation id="4561051373932531560">Το Google Chrome σάς επιτρέπει να κάνετε κλικ σε έναν τηλεφωνικό αριθμό στον ιστό και να τον καλέσετε με το Skype!</translation> @@ -157,7 +154,6 @@ <translation id="495931528404527476">Στο Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Το Google Chrome δεν κατάφερε να συγχρονίσει τα δεδομένα σας. Ενημερώστε τη φράση πρόσβασης συγχρονισμού.</translation> -<translation id="5037239767309817516">Κλείστε όλα τα παράθυρα του Google Chrome και επανεκκινήστε τον για να εφαρμοστεί αυτή η αλλαγή.</translation> <translation id="5131923704757666404">{0,plural, =1{Το Chrome θα επανεκκινηθεί σε μία ώρα}other{Το Chrome θα επανεκκινηθεί σε # ώρες}}</translation> <translation id="5132929315877954718">Ανακαλύψτε υπέροχες εφαρμογές, παιχνίδια, επεκτάσεις και θέματα για το Google Chrome.</translation> <translation id="5166975452760862670">Το Google Chrome εμφανίζεται σε αυτήν τη γλώσσα</translation> @@ -183,7 +179,6 @@ <translation id="5877064549588274448">Το κανάλι έχει αλλάξει. Επανεκκινήστε τη συσκευή σας για να εφαρμόσετε τις αλλαγές.</translation> <translation id="5895138241574237353">Επανεκκίνηση</translation> <translation id="5906655207909574370">Η ενημέρωση σχεδόν ολοκληρώθηκε! Επανεκκινήστε τη συσκευή σας για να ολοκληρωθεί η ενημέρωση.</translation> -<translation id="5931853610562009806">Στο Mac, οι κωδικοί πρόσβασης μπορεί να αποθηκευτούν στο Keychain και ενδέχεται άλλοι χρήστες του Chrome, που μοιράζονται αυτόν τον λογαριασμό OS X, να αποκτήσουν πρόσβαση σε αυτούς ή να τους συγχρονίσουν.</translation> <translation id="5940385492829620908">Εδώ μπορείτε να βρείτε τις ιστοσελίδες, τους σελιδοδείκτες σας και άλλα δεδομένα του Chrome.</translation> <translation id="5941830788786076944">Ορισμός Google Chrome ως προεπιλεγμένο πρόγραμμα περιήγησης</translation> <translation id="6014844626092547096">Έχετε πλέον συνδεθεί στο Chrome! Ο συγχρονισμός έχει απενεργοποιηθεί από το διαχειριστή σας.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index ef2ab98..b21c2d1 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Chrome is out of date</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome will relaunch in 1 minute}other{Chrome will relaunch in # minutes}}</translation> <translation id="2063848847527508675">Chrome OS needs to be restarted to apply the update.</translation> -<translation id="2077129598763517140">Use hardware acceleration when available</translation> <translation id="2084710999043359739">Add to Chrome</translation> <translation id="2094919256425865063">Quit Chrome anyway?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome will relaunch now}=1{Chrome will relaunch in 1 second}other{Chrome will relaunch in # seconds}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">Link my Chrome data to this account</translation> <translation id="4251625577313994583">get Chrome on your iPhone</translation> <translation id="4293420128516039005">Sign in to sync and personalise Chrome across your devices</translation> -<translation id="4309555186815777032">(requires Chrome <ph name="BEGIN_BUTTON" />restart<ph name="END_BUTTON" />)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> has been added to Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Please sign out and sign in again for this change to take effect.</translation> <translation id="4458462641685292929">Another operation on Google Chrome is in progress. Please try again later.</translation> <translation id="4480040274068703980">Chrome OS could not sync your data due to an error signing in.</translation> <translation id="4561051373932531560">Google Chrome lets you click a phone number on the web and call it with Skype!</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">In Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome could not sync your data. Please update your Sync passphrase.</translation> -<translation id="5037239767309817516">Please close all Google Chrome windows and relaunch it for this change to take effect.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome will relaunch in an hour}other{Chrome will relaunch in # hours}}</translation> <translation id="5132929315877954718">Discover great apps, games, extensions and themes for Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome is displayed in this language</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">Channel changed. Restart your device to apply changes.</translation> <translation id="5895138241574237353">Restart</translation> <translation id="5906655207909574370">Nearly up to date! Restart your device to finish updating.</translation> -<translation id="5931853610562009806">On Mac, passwords may be saved to your Keychain and accessed or synced by other Chrome users sharing this OS X account.</translation> <translation id="5940385492829620908">Your web, bookmarks and other Chrome stuff live here.</translation> <translation id="5941830788786076944">Make Google Chrome the default browser</translation> <translation id="6014844626092547096">You're now signed in to Chrome! Sync is disabled by your administrator.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb index e0096b52..5e67868 100644 --- a/chrome/app/resources/google_chrome_strings_es-419.xtb +++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome no está actualizado.</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome se reiniciará en 1 minuto}other{Chrome se reiniciará en # minutos}}</translation> <translation id="2063848847527508675">El Sistema operativo Chrome debe reiniciarse para que se aplique la actualización.</translation> -<translation id="2077129598763517140">Usar aceleración de hardware cuando esté disponible</translation> <translation id="2084710999043359739">Agregar a Chrome</translation> <translation id="2094919256425865063">¿Deseas salir de Chrome de todos modos?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome se reiniciará ahora}=1{Chrome se reiniciará en 1 segundo}other{Chrome se reiniciará en # segundos}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">¿Quieres vincular tus datos de Google Chrome con esta cuenta?</translation> <translation id="4251625577313994583">obtener Chrome para tu iPhone</translation> <translation id="4293420128516039005">Accede para sincronizar y personalizar Chrome en todos tus dispositivos</translation> -<translation id="4309555186815777032">(Es necesario <ph name="BEGIN_BUTTON" />reiniciar<ph name="END_BUTTON" /> Chrome).</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">SO Chrome</translation> <translation id="4343195214584226067">Se agregó <ph name="EXTENSION_NAME" /> a Chrome</translation> <translation id="4407807842708586359">SO de Google Chrome</translation> -<translation id="4458285410772214805">Cierra la sesión y vuelve a iniciarla para que se aplique el cambio.</translation> <translation id="4458462641685292929">Hay otra operación en Google Chrome en curso. Vuelve a intentarlo más tarde.</translation> <translation id="4480040274068703980">El Sistema operativo Chrome no pudo sincronizar los datos porque se produjo un error de acceso.</translation> <translation id="4561051373932531560">Google Chrome te permite hacer clic en un número de teléfono en la web y ¡llamarlo por Skype!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">En Chrome</translation> <translation id="4990567037958725628">Google Chrome Canario</translation> <translation id="5028489144783860647">Google Chrome no pudo sincronizar los datos. Actualiza la frase de contraseña de sincronización.</translation> -<translation id="5037239767309817516">Cierra todas las ventanas de Google Chrome y reinicia el navegador para que se aplique el cambio.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome se reiniciará en una hora}other{Chrome se reiniciará # horas}}</translation> <translation id="5132929315877954718">Descubre aplicaciones, juegos, extensiones y temas geniales para Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome se muestra en este idioma</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">Se cambió el canal. Reinicia el dispositivo para aplicar los cambios.</translation> <translation id="5895138241574237353">Reiniciar</translation> <translation id="5906655207909574370">El dispositivo está casi actualizado. Reinícialo para completar la actualización.</translation> -<translation id="5931853610562009806">En dispositivos Mac, las contraseñas pueden guardarse en la aplicación Keychain. Los usuarios de Chrome con los que compartes esta cuenta del sistema operativo X pueden acceder a las contraseñas o sincronizarlas.</translation> <translation id="5940385492829620908">Aquí puedes encontrar tus páginas web, favoritos y otros contenidos de Chrome.</translation> <translation id="5941830788786076944">Haga de Google Chrome su navegador predeterminado</translation> <translation id="6014844626092547096">Accediste a Chrome. El administrador inhabilitó la sincronización.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb index e4e121c7..86ec37a 100644 --- a/chrome/app/resources/google_chrome_strings_es.xtb +++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Chrome no está actualizado</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome se volverá a iniciar en 1 minuto}other{Chrome se volverá a iniciar en # minutos}}</translation> <translation id="2063848847527508675">Chrome OS se debe reiniciar para que se aplique la actualización.</translation> -<translation id="2077129598763517140">Utilizar aceleración por hardware cuando esté disponible</translation> <translation id="2084710999043359739">Añadir a Chrome</translation> <translation id="2094919256425865063">¿Quieres cerrar Chrome de todas formas?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome se volverá a iniciar ahora}=1{Chrome se volverá a iniciar en 1 segundo}other{Chrome se volverá a iniciar en # segundos}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">¿Quieres vincular tus datos de Chrome a esta cuenta?</translation> <translation id="4251625577313994583">descarga Chrome en tu iPhone</translation> <translation id="4293420128516039005">Inicia sesión para sincronizar y personalizar Chrome en todos tus dispositivos</translation> -<translation id="4309555186815777032">(se debe <ph name="BEGIN_BUTTON" />reiniciar<ph name="END_BUTTON" /> Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> se ha añadido a Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Cierra la sesión y vuelve a iniciarla para que se aplique el cambio.</translation> <translation id="4458462641685292929">Hay otra operación en curso en Google Chrome. Vuelve a intentarlo más tarde.</translation> <translation id="4480040274068703980">Chrome OS no ha podido sincronizar los datos debido a un error de inicio de sesión.</translation> <translation id="4561051373932531560">Google Chrome te permite hacer clic en un número de teléfono en la Web y llamar mediante Skype.</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">En Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome no ha podido sincronizar los datos. Actualiza la frase de contraseña de sincronización.</translation> -<translation id="5037239767309817516">Cierra todas las ventanas de Google Chrome y reinicia el navegador para que se aplique el cambio.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome se volverá a iniciar en una hora}other{Chrome se volverá a iniciar en # horas}}</translation> <translation id="5132929315877954718">Descubre formidables aplicaciones, juegos, extensiones y temas para Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome se muestra en este idioma</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">Se ha cambiado el canal. Reinicia el dispositivo para aplicar los cambios.</translation> <translation id="5895138241574237353">Reiniciar</translation> <translation id="5906655207909574370">El dispositivo está casi actualizado. Reinícialo para completar la actualización.</translation> -<translation id="5931853610562009806">En los ordenadores Mac, las contraseñas se pueden guardar en el llavero, y otros usuarios de Chrome que compartan esta cuenta de OS X pueden acceder a ellas o sincronizarlas.</translation> <translation id="5940385492829620908">Aquí puedes encontrar tus páginas web, tus marcadores y otros contenidos de Chrome.</translation> <translation id="5941830788786076944">Establecer Google Chrome como navegador predeterminado</translation> <translation id="6014844626092547096">Has iniciado sesión en Chrome. El administrador ha inhabilitado la sincronización.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb index fab8ad9d..86ffe8b 100644 --- a/chrome/app/resources/google_chrome_strings_et.xtb +++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -42,7 +42,6 @@ <translation id="1877026089748256423">Chrome on aegunud</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome käivitatakse uuesti 1 minuti pärast}other{Chrome käivitatakse uuesti # minuti pärast}}</translation> <translation id="2063848847527508675">Chrome OS tuleb värskenduse rakendamiseks taaskäivitada.</translation> -<translation id="2077129598763517140">Kasuta võimaluse korral riistvarakiirendust</translation> <translation id="2084710999043359739">Chrome'i lisamine</translation> <translation id="2094919256425865063">Kas väljuda Chrome'ist ikkagi?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome käivitatakse kohe uuesti}=1{Chrome käivitatakse uuesti 1 sekundi pärast}other{Chrome käivitatakse uuesti # sekundi pärast}}</translation> @@ -127,12 +126,10 @@ <translation id="4251615635259297716">Kas soovite linkida Chrome'i andmed selle kontoga?</translation> <translation id="4251625577313994583">hankige oma iPhone'ile Chrome</translation> <translation id="4293420128516039005">Logige sisse, et Chrome kõigis oma seadmetes sünkroonida ja isikupärastada</translation> -<translation id="4309555186815777032">(nõuab Chrome'i <ph name="BEGIN_BUTTON" />taaskäivitamist<ph name="END_BUTTON" />)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> on Chrome'i lisatud</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Muudatuse jõustamiseks logige välja ja uuesti sisse.</translation> <translation id="4458462641685292929">Teine toiming on Google Chrome'is pooleli. Proovige hiljem uuesti.</translation> <translation id="4480040274068703980">Chrome OS ei saanud teie andmeid sünkroonida sisselogimisvea tõttu.</translation> <translation id="4561051373932531560">Google Chrome võimaldab teil veebis telefoninumbril klõpsata ja sellele Skype'i abil helistada!</translation> @@ -157,7 +154,6 @@ <translation id="495931528404527476">Chrome'is</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome ei saanud teie andmeid sünkroonida. Värskendage oma sünkroonimisparooli.</translation> -<translation id="5037239767309817516">Muudatuse rakendamiseks sulgege kõik Google Chrome'i aknad ja taaskäivitage Chrome.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome käivitatakse uuesti tunni aja pärast}other{Chrome käivitatakse uuesti # tunni pärast}}</translation> <translation id="5132929315877954718">Avastage Google Chrome'i jaoks suurepäraseid rakendusi, mänge, laiendusi ja teemasid.</translation> <translation id="5166975452760862670">Google Chrome kuvatakse selles keeles</translation> @@ -183,7 +179,6 @@ <translation id="5877064549588274448">Kanal on muutunud. Muudatuste rakendamiseks taaskäivitage oma seade.</translation> <translation id="5895138241574237353">Taaskäivitamine</translation> <translation id="5906655207909574370">Seade on peaaegu ajakohane. Värskenduse lõpuleviimiseks taaskäivitage seade.</translation> -<translation id="5931853610562009806">Macis võidakse paroolid salvestada rakendusse Keychain ja teised Chrome'i kasutajad, kes kasutavad sama OS X-i kontot, saavad neid paroole kasutada ning sünkroonida.</translation> <translation id="5940385492829620908">Siin asuvad teie veeb, järjehoidjad ja muu Chrome'i kraam.</translation> <translation id="5941830788786076944">Tee Google Chrome vaikebrauseriks</translation> <translation id="6014844626092547096">Olete nüüd Chrome'i sisse logitud. Administraator on sünkroonimise keelanud.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb index 5d6c1f7b..5d085990 100644 --- a/chrome/app/resources/google_chrome_strings_fa.xtb +++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">نسخه Chrome قدیمی است</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome ۱ دقیقه دیگر راهاندازی مجدد میشود}one{Chrome # دقیقه دیگر راهاندازی مجدد میشود}other{Chrome # دقیقه دیگر راهاندازی مجدد میشود}}</translation> <translation id="2063848847527508675">برای اعمال بهروزرسانی، سیستمعامل Chrome باید راهاندازی مجدد شود.</translation> -<translation id="2077129598763517140">در صورت امکان از شتاب سختافزاری استفاده شود</translation> <translation id="2084710999043359739">افزودن به Chrome</translation> <translation id="2094919256425865063">درهرصورت از Chrome خارج میشوید؟</translation> <translation id="210890598424854131">{0,plural, =0{Chrome هماکنون راهاندازی مجدد میشود}=1{Chrome ۱ ثانیه دیگر راهاندازی مجدد میشود}one{Chrome # ثانیه دیگر راهاندازی مجدد میشود}other{Chrome # ثانیه دیگر راهاندازی مجدد میشود}}</translation> @@ -125,13 +124,11 @@ <translation id="4251615635259297716">دادههای Chrome شما به این حساب مرتبط شوند؟</translation> <translation id="4251625577313994583">نصب Chrome در iPhone</translation> <translation id="4293420128516039005">برای همگامسازی و شخصیسازی Chrome در همه دستگاههایتان، به سیستم وارد شوید</translation> -<translation id="4309555186815777032">(Chrome باید <ph name="BEGIN_BUTTON" />راهاندازی مجدد<ph name="END_BUTTON" /> شود)</translation> <translation id="4328355335528187361">Google Chrome نسخه Dev، (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS </translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> به Chrome اضافه شده است</translation> <translation id="4407807842708586359">سیستم عامل Google Chrome</translation> -<translation id="4458285410772214805">لطفاً از سیستم خارج شوید و دوباره وارد آن شوید تا این تغییر اعمال شود.</translation> <translation id="4458462641685292929">عملکرد دیگری در Google Chrome درحال انجام است. لطفاً بعداً دوباره امتحان کنید.</translation> <translation id="4480040274068703980">به دلیل وجود یک خطای ورود به سیستم، سیستمعامل Chrome قادر به همگامسازی دادههایتان نبود.</translation> <translation id="4561051373932531560">Google Chrome به شما اجازه میدهد بر روی شماره تلفن روی وب کلیک کرده و از طریق Skype تماس بگیرید!</translation> @@ -156,7 +153,6 @@ <translation id="495931528404527476">در Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome قادر به همگامسازی دادههای شما نبود. لطفاً رمز عبارتی همگامسازی خود را بهروز کنید.</translation> -<translation id="5037239767309817516">لطفاً همه پنجرههای Google Chrome را ببندید و برای اعمال این تغییر، دوباره آن را راهاندازی کنید.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome یک ساعت دیگر راهاندازی مجدد میشود}one{Chrome # ساعت دیگر راهاندازی مجدد میشود}other{Chrome # ساعت دیگر راهاندازی مجدد میشود}}</translation> <translation id="5132929315877954718">برنامههای کاربردی، بازیها، افزونهها و طرحهای زمینه فوقالعاده را برای Google Chrome کاوش کنید.</translation> <translation id="5166975452760862670">Google Chrome به این زبان نشان داده میشود</translation> @@ -180,7 +176,6 @@ <translation id="5877064549588274448">کانال تغییر کرد. برای اعمال تغییرات دستگاه خود را مجدداً راهاندازی کنید.</translation> <translation id="5895138241574237353">راهاندازی مجدد</translation> <translation id="5906655207909574370">تقریباً بهروز شده است! برای تمام کردن بهروزرسانی، دستگاهتان را دوباره راهاندازی کنید.</translation> -<translation id="5931853610562009806">در Mac ممکن است گذرواژهها در Keychain شما ذخیره شوند و سایر کاربران Chrome که این حساب OS X را دارند به آن دسترسی داشته باشند یا بتوانند همگامسازی کنند.</translation> <translation id="5940385492829620908">وب، نشانکها و موارد دیگر Chrome شما در اینجا هستند.</translation> <translation id="5941830788786076944">Google Chrome مرورگر پیشفرض شود</translation> <translation id="6014844626092547096">اکنون وارد Chrome شدید! سرپرست سیستم شما همگامسازی را از کار انداخته است.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb index e0fafd7..0d0f0be 100644 --- a/chrome/app/resources/google_chrome_strings_fi.xtb +++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome on vanhentunut</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome käynnistetään uudelleen 1 minuutin kuluttua}other{Chrome käynnistetään uudelleen # minuutin kuluttua}}</translation> <translation id="2063848847527508675">Chrome-käyttöjärjestelmä täytyy käynnistää uudelleen, jotta päivitys voidaan ottaa käyttöön.</translation> -<translation id="2077129598763517140">Käytä laitteistokiihdytystä, jos mahdollista</translation> <translation id="2084710999043359739">Lisää Chromeen</translation> <translation id="2094919256425865063">Suljetaanko Chrome silti?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome käynnistetään uudelleen nyt}=1{Chrome käynnistetään uudelleen 1 sekunnin kuluttua}other{Chrome käynnistetään uudelleen # sekunnin kuluttua}}</translation> @@ -125,13 +124,11 @@ <translation id="4251615635259297716">Linkitetäänkö Chrome-tiedot tähän tiliin?</translation> <translation id="4251625577313994583">lataa Chrome iPhoneen</translation> <translation id="4293420128516039005">Kirjaudu sisään, niin voit synkronoida Chromen ja tehdä siitä yksilöllisemmän kaikilla laitteilla.</translation> -<translation id="4309555186815777032">(vaatii Chromen <ph name="BEGIN_BUTTON" />uudelleenkäynnistyksen<ph name="END_BUTTON" />)</translation> <translation id="4328355335528187361">Google Chromen kehittäjäversio (saapuva mDNS)</translation> <translation id="4331809312908958774">Chrome OS </translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> on lisätty Chromeen</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Kirjaudu ulos ja kirjaudu uudelleen sisään, jotta muutos tulee voimaan.</translation> <translation id="4458462641685292929">Toinen Google Chrome ‑prosessi on jo käynnissä. Yritä myöhemmin uudelleen.</translation> <translation id="4480040274068703980">Chrome-käyttöjärjestelmä ei voi synkronoida tietoja kirjautumisvirheen vuoksi.</translation> <translation id="4561051373932531560">Google Chromen avulla voit klikata puhelinnumeroa verkossa ja soittaa siihen Skypellä!</translation> @@ -156,7 +153,6 @@ <translation id="495931528404527476">Chromessa</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome ei voinut synkronoida tietoja. Päivitä synkronoinnin tunnuslause.</translation> -<translation id="5037239767309817516">Sulje kaikki Chrome-ikkunat ja käynnistä selain uudelleen, jotta muutos tulee voimaan.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome käynnistetään uudelleen tunnin kuluttua}other{Chrome käynnistetään uudelleen # tunnin kuluttua}}</translation> <translation id="5132929315877954718">Löydät hienoja sovelluksia, pelejä ja teemoja Google Chromelle.</translation> <translation id="5166975452760862670">Google Chrome näytetään tällä kielellä.</translation> @@ -180,7 +176,6 @@ <translation id="5877064549588274448">Kanava vaihdettiin. Ota muutokset käyttöön käynnistämällä laite uudelleen.</translation> <translation id="5895138241574237353">Käynnistä uudelleen</translation> <translation id="5906655207909574370">Melkein ajan tasalla. Viimeistele päivitys käynnistämällä laite uudelleen.</translation> -<translation id="5931853610562009806">Macilla salasanat voidaan tallentaa Avainnippuusi, ja muut Chrome-käyttäjät, jotka jakavat saman OS X -käyttöjärjestelmän tilin, voivat käyttää tai synkronoida niitä.</translation> <translation id="5940385492829620908">Tämä on verkkosi, kirjanmerkkiesi ja muun Chrome-sisältösi koti.</translation> <translation id="5941830788786076944">Tee Google Chromesta oletusselain</translation> <translation id="6014844626092547096">Olet nyt kirjautunut sisään Chromeen! Järjestelmänvalvoja on poistanut synkronoinnin käytöstä.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb index 010461ac..5321f08 100644 --- a/chrome/app/resources/google_chrome_strings_fil.xtb +++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Luma na ang Chrome</translation> <translation id="2007150628464581396">{0,plural, =1{Muling ilulunsad ang Chrome sa loob ng 1 minuto}one{Muling ilulunsad ang Chrome sa loob ng # minuto}other{Muling ilulunsad ang Chrome sa loob ng # na minuto}}</translation> <translation id="2063848847527508675">Kailangang ma-restart ang Chrome OS upang mailapat ang update.</translation> -<translation id="2077129598763517140">Gamitin ang pagpapabilis ng hardware kapag available</translation> <translation id="2084710999043359739">Idagdag sa Chrome</translation> <translation id="2094919256425865063">Umalis pa rin sa Chrome?</translation> <translation id="210890598424854131">{0,plural, =0{Muli nang ilulunsad ang Chrome}=1{Muling ilulunsad ang Chrome sa loob ng 1 segundo}one{Muling ilulunsad ang Chrome sa loob ng # segundo}other{Muling ilulunsad ang Chrome sa loob ng # na segundo}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">I-link ang iyong data sa Chrome sa account na ito</translation> <translation id="4251625577313994583">kunin ang Chrome sa iyong iPhone</translation> <translation id="4293420128516039005">Mag-sign in para i-sync at i-personalize ang Chrome sa lahat ng iyong device</translation> -<translation id="4309555186815777032">(kinakailangang <ph name="BEGIN_BUTTON" />i-restart<ph name="END_BUTTON" /> ang Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">Naidagdag na ang <ph name="EXTENSION_NAME" /> sa Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Mangyaring mag-sign out at mag-sign in muli upang magkabisa ang pagbabagong ito.</translation> <translation id="4458462641685292929">May kasalukuyang isinasagawang isa pang pagpapatakbo sa Google Chrome. Pakisubukang muli sa ibang pagkakataon.</translation> <translation id="4480040274068703980">Hindi ma-sync ng Chrome OS ang iyong data dahil sa isang error sa pagsa-sign in.</translation> <translation id="4561051373932531560">Pinapayagan ka ng Google Chrome na mag-click sa isang numero ng telepono sa web at tawagan ito gamit ang Skype!</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">Sa Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Hindi mai-sync ng Google Chrome ang iyong data. Paki-update ang iyong passphrase sa Pag-sync.</translation> -<translation id="5037239767309817516">Pakisara ang lahat ng mga window ng Google Chrome at ilunsad itong muli para magkaroon ng epekto ang pagbabagong ito.</translation> <translation id="5131923704757666404">{0,plural, =1{Malulunsad muli ang Chrome sa loob ng isang oras}one{Malulunsad muli ang Chrome sa loob ng # oras}other{Malulunsad muli ang Chrome sa loob ng # na oras}}</translation> <translation id="5132929315877954718">Tumuklas ng mahuhusay na app, laro, extension at tema para sa Google Chrome.</translation> <translation id="5166975452760862670">Ipinapakita ang Google Chrome sa wikang ito</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">Binago ang channel. I-restart ang iyong device upang ilapat ang mga pagbabago.</translation> <translation id="5895138241574237353">I-restart</translation> <translation id="5906655207909574370">Halos napapanahon na! I-restart ang iyong device upang tapusin ang pag-a-update.</translation> -<translation id="5931853610562009806">Sa Mac, maaaring ma-save ang mga password sa iyong Keychain at ma-access o ma-sync ng ibang mga user ng Chrome na nagbabahagi ng OS X account na ito.</translation> <translation id="5940385492829620908">Makikita dito ang iyong web, mga bookmark at iba pang mga bagay-bagay sa Chrome.</translation> <translation id="5941830788786076944">Gawin ang Google Chrome na default browser</translation> <translation id="6014844626092547096">Naka-sign in ka na ngayon sa Chrome! Na-disable ng iyong administrator ang pag-sync.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb index 03aa667..ea3cb23 100644 --- a/chrome/app/resources/google_chrome_strings_fr.xtb +++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -43,7 +43,6 @@ <translation id="1877026089748256423">Version de Chrome obsolète</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome va être relancé dans 1 minute}one{Chrome va être relancé dans # minute}other{Chrome va être relancé dans # minutes}}</translation> <translation id="2063848847527508675">Redémarrez Chrome OS pour appliquer la mise à jour.</translation> -<translation id="2077129598763517140">Utiliser l'accélération matérielle (le cas échéant)</translation> <translation id="2084710999043359739">Ajouter à Chrome</translation> <translation id="2094919256425865063">Quitter Chrome quand même ?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome va être relancé maintenant}=1{Chrome va être relancé dans 1 seconde}one{Chrome va être relancé dans # seconde}other{Chrome va être relancé dans # secondes}}</translation> @@ -128,13 +127,11 @@ <translation id="4251615635259297716">Associer vos données Chrome à ce compte ?</translation> <translation id="4251625577313994583">télécharger Chrome sur votre iPhone</translation> <translation id="4293420128516039005">Se connecter pour synchroniser et personnaliser Chrome sur vos appareils</translation> -<translation id="4309555186815777032">(nécessite le <ph name="BEGIN_BUTTON" />redémarrage<ph name="END_BUTTON" /> de Chrome)</translation> <translation id="4328355335528187361">Google Chrome pour les développeurs (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS </translation> <translation id="4343195214584226067">L'extension <ph name="EXTENSION_NAME" /> a été ajoutée à Chrome</translation> <translation id="4407807842708586359">Système d'exploitation Google Chrome</translation> -<translation id="4458285410772214805">Pour que cette modification soit prise en compte, veuillez vous déconnecter, puis vous reconnecter.</translation> <translation id="4458462641685292929">Une autre opération est en cours dans Google Chrome. Veuillez réessayer ultérieurement.</translation> <translation id="4480040274068703980">Impossible de synchroniser vos données dans Chrome OS, car une erreur s'est produite lors de la connexion.</translation> <translation id="4561051373932531560">Avec Google Chrome, cliquez sur un numéro de téléphone sur le Web et appelez-le dans Skype !</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">Dans Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Impossible de synchroniser vos données dans Google Chrome. Veuillez mettre à jour votre phrase secrète de synchronisation.</translation> -<translation id="5037239767309817516">Fermez toutes les fenêtres et relancez Google Chrome afin que cette modification soit prise en compte.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome va être relancé dans une heure}one{Chrome va être relancé dans # heure}other{Chrome va être relancé dans # heures}}</translation> <translation id="5132929315877954718">Découvrez des applications, des jeux, des extensions et des thèmes exceptionnels pour Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome est affiché dans cette langue</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">La version a été modifiée. Redémarrez votre appareil pour appliquer les modifications.</translation> <translation id="5895138241574237353">Redémarrer</translation> <translation id="5906655207909574370">Mise à jour presque terminée. Pour la finaliser, veuillez redémarrer votre appareil.</translation> -<translation id="5931853610562009806">Sur Mac, les mots de passe peuvent être enregistrés dans votre trousseau. D'autres utilisateurs de Chrome partageant ce compte OS X peuvent les consulter ou les synchroniser.</translation> <translation id="5940385492829620908">Votre contenu Web, vos favoris et toutes vos données Chrome sont conservés ici.</translation> <translation id="5941830788786076944">Définir Google Chrome comme navigateur par défaut</translation> <translation id="6014844626092547096">Vous êtes maintenant connecté à Chrome. La synchronisation a été désactivée par votre administrateur.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb index cfedca10..4bb7227f 100644 --- a/chrome/app/resources/google_chrome_strings_gu.xtb +++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Chrome જૂનું થઈ ગયું છે</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome એક મિનિટમાં ફરીથી લૉન્ચ થશે}one{Chrome # મિનિટમાં ફરીથી લૉન્ચ થશે}other{Chrome # મિનિટમાં ફરીથી લૉન્ચ થશે}}</translation> <translation id="2063848847527508675">અપડેટ લાગુ કરવા માટે Chrome OS ને પુનઃપ્રારંભ કરવાની જરૂર છે.</translation> -<translation id="2077129598763517140">હાર્ડવેર ઍક્સિલરેશન ઉપલબ્ધ હોવા પર ઉપયોગ કરો</translation> <translation id="2084710999043359739">Chrome માં ઉમેરો</translation> <translation id="2094919256425865063">છતાં પણ Chrome બંધ કરવું છે?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome હમણાં ફરીથી લૉન્ચ થશે}=1{Chrome 1 સેકન્ડમાં ફરીથી લૉન્ચ થશે}one{Chrome # સેકન્ડમાં ફરીથી લૉન્ચ થશે}other{Chrome # સેકન્ડમાં ફરીથી લૉન્ચ થશે}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">તમારા Chrome ડેટાને આ એકાઉન્ટ સાથે લિંક કરીએ?</translation> <translation id="4251625577313994583">તમારા iPhone પર Chrome મેળવો</translation> <translation id="4293420128516039005">તમારા બધા ઉપકરણો પર Chromeને સિંક અને વ્યક્તિગત કરવા માટે સાઇન ઇન કરો</translation> -<translation id="4309555186815777032">(Chrome ને <ph name="BEGIN_BUTTON" />પુનઃપ્રારંભ કરવુ<ph name="END_BUTTON" /> આવશ્યક છે)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" />ને Chromeમાં ઉમેરવામાં આવ્યું છે</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">કૃપા કરીને આ પરિવર્તનને પ્રભાવમાં લાવવા માટે સાઇન આઉટ કરો અને ફરીથી સાઇન ઇન કરો.</translation> <translation id="4458462641685292929">Google Chrome પર બીજી ક્રિયા ચાલુ છે. કૃપા કરીને પછીથી ફરી પ્રયાસ કરો.</translation> <translation id="4480040274068703980">સાઇન ઇનમાં ભૂલ આવવાને કારણે Chrome OS તમારા ડેટાને સમન્વયિત કરી શક્યું નથી.</translation> <translation id="4561051373932531560">Google Chrome થી તમે વેબ પર એક ફોન નંબર પર ક્લિક કરી શકો છો અને તેને Skype થી કૉલ કરી શકો છો!</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">Chrome માં</translation> <translation id="4990567037958725628">Google Chrome કૅનેરી</translation> <translation id="5028489144783860647">Google Chrome તમારા ડેટાને સમન્વયિત કરી શક્યું નથી. કૃપા કરીને તમારા સમન્વયન પાસફ્રેઝને અપડેટ કરો.</translation> -<translation id="5037239767309817516">આ ફેરફારને પ્રભાવમાં લાવવા માટે કૃપા કરીને બધી Google Chrome વિંડોને બંધ કરો અને તેને ફરીથી લોંચ કરો.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome એક કલાકમાં ફરીથી લૉન્ચ થશે}one{Chrome # કલાકમાં ફરીથી લૉન્ચ થશે}other{Chrome # કલાકમાં ફરીથી લૉન્ચ થશે}}</translation> <translation id="5132929315877954718">Google Chrome માટે શ્રેષ્ઠ ઍપ્લિકેશનો, રમતો, એક્સટેન્શન્સ અને થીમ્સ શોધો</translation> <translation id="5166975452760862670">આ ભાષામાં Google Chrome પ્રદર્શિત થાય છે</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">ચેનલ બદલી. ફેરફારો લાગુ કરવા માટે તમારા ઉપકરણને પુનઃપ્રારંભ કરો.</translation> <translation id="5895138241574237353">પુનઃપ્રારંભ કરો</translation> <translation id="5906655207909574370">અપ ટૂ ડેટ થવામાં છે! અપડેટ કરવાનું સમાપ્ત કરવા માટે તમારા ઉપકરણને પુનઃપ્રારંભ કરો.</translation> -<translation id="5931853610562009806">Mac પર, પાસવર્ડ્સ તમારા કીચેન પર સાચવી શકાય છે અને આ OS X એકાઉન્ટ શેર કરતાં અન્ય Chrome વપરાશકર્તાઓ દ્વારા ઍક્સેસ અથવા સમન્વયિત કરી શકાય છે.</translation> <translation id="5940385492829620908">તમારું વેબ, બુકમાર્ક્સ અને અન્ય Chrome સામગ્રી અહીં હોય છે.</translation> <translation id="5941830788786076944">Google Chrome ને ડિફૉલ્ટ બ્રાઉઝર બનાવો</translation> <translation id="6014844626092547096">તમે હવે Chrome માં સાઇન ઇન છો! સમન્વયન તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલું છે.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb index df44c23e..a9687be 100644 --- a/chrome/app/resources/google_chrome_strings_hi.xtb +++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome पुराना हो गया है</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome 1 मिनट में फिर से लॉन्च होगा}one{Chrome # मिनट में फिर से लॉन्च होगा}other{Chrome # मिनट में फिर से लॉन्च होगा}}</translation> <translation id="2063848847527508675">अपडेट लागू करने के लिए Chrome OS को फिर से चालू करने की आवश्यकता होती है.</translation> -<translation id="2077129598763517140">उपलब्ध होने पर हार्डवेयर त्वरण का उपयोग करें</translation> <translation id="2084710999043359739">Chrome में जोड़ें</translation> <translation id="2094919256425865063">फिर भी Chrome छोड़ें?</translation> <translation id="210890598424854131">{0,plural, =0{अब Chrome फिर से लॉन्च होगा}=1{Chrome 1 सेकंड में फिर से लॉन्च होगा}one{Chrome # सेकंड में फिर से लॉन्च होगा}other{Chrome # सेकंड में फिर से लॉन्च होगा}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">आपके Chrome डेटा को इस खाते से लिंक करें?</translation> <translation id="4251625577313994583">अपने iPhone पर Chrome पाएं</translation> <translation id="4293420128516039005">Chrome को अपने सभी डिवाइस पर सिंक करने और मनमुताबिक बनाने के लिए साइन इन करें</translation> -<translation id="4309555186815777032">(Chrome <ph name="BEGIN_BUTTON" />पुन: प्रारंभ<ph name="END_BUTTON" /> करना आवश्यक है)</translation> <translation id="4328355335528187361">Google Chrome डेवलपर (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> को Chrome में जोड़ दिया गया है</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">इस परिवर्तन के प्रभावी होने के लिए, कृपया प्रस्थान करें और पुन: प्रवेश करें.</translation> <translation id="4458462641685292929">Google Chrome पर कोई और क्रिया चल रही है. कृपया बाद में फिर से कोशिश करें.</translation> <translation id="4480040274068703980">प्रवेश करने संबंधी गड़बड़ी के कारण Chrome OS आपका डेटा सिंक नहीं कर सका.</translation> <translation id="4561051373932531560">Google Chrome आपको वेब पर फ़ोन नंबर क्लिक करने और उसे Skype से कॉल करने की सुविधा देता है!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">Chrome में</translation> <translation id="4990567037958725628">Google Chrome कैनरी</translation> <translation id="5028489144783860647">Google Chrome आपका डेटा समन्वयित नहीं कर सका. कृपया अपना समन्वयन पासफ़्रेज़ अपडेट करें.</translation> -<translation id="5037239767309817516">यह परिवर्तन लागू करने के लिए कृपया सभी Google Chrome विंडो बंद करें और इसे पुन: लॉन्च करें.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome एक घंटे के अंदर फिर से लॉन्च होगा}one{Chrome # घंटों के अंदर फिर से लॉन्च होगा}other{Chrome # घंटों के अंदर फिर से लॉन्च होगा}}</translation> <translation id="5132929315877954718">Google Chrome के लिए बेहतरीन ऐप्स ,गेम, एक्सटेंशन और थीम खोजें.</translation> <translation id="5166975452760862670">Google Chrome इस भाषा में प्रदर्शित किया जा रहा है</translation> @@ -181,7 +177,6 @@ <translation id="5877064549588274448">चैनल बदल दिया गया है. बदलावों का लागू करने के लिए अपने डिवाइस को फिर से प्रारंभ करें.</translation> <translation id="5895138241574237353">पुन: प्रारंभ करें</translation> <translation id="5906655207909574370">लगभग अप टू डेट हो गया है! अपडेट करना पूरा करने के लिए अपना डिवाइस पुन: प्रारंभ करें.</translation> -<translation id="5931853610562009806">Mac पर, पासवर्ड आपके कीचेन पर सहेजे जा सकते हैं और उन्हें इस OS X खाते को साझा करने वाले अन्य Chrome उपयोगकर्ताओं द्वारा ऐक्सेस या समन्वयित किया जा सकता है.</translation> <translation id="5940385492829620908">आपके वेब, बुकमार्क और अन्य Chrome सामग्री यहां मौजूद रहती है.</translation> <translation id="5941830788786076944">Google Chrome को सामान्य ब्राउज़र बनाएं</translation> <translation id="6014844626092547096">अब आपने Chrome में प्रवेश कर लिया हैं! सिंक को आपके व्यवस्थापक द्वारा अक्षम किया गया है.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb index d5e53166..329c0e4 100644 --- a/chrome/app/resources/google_chrome_strings_hr.xtb +++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome je zastario</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome će se ponovo pokrenuti za 1 minutu}one{Chrome će se ponovo pokrenuti za # minutu}few{Chrome će se ponovo pokrenuti za # minute}other{Chrome će se ponovo pokrenuti za # minuta}}</translation> <translation id="2063848847527508675">Potrebno je ponovo pokrenuti Chrome OS kako bi se ažuriranje primijenilo.</translation> -<translation id="2077129598763517140">Upotrijebi hardversko ubrzanje kada je dostupno</translation> <translation id="2084710999043359739">Dodajte u Chrome</translation> <translation id="2094919256425865063">Želite li ipak zatvoriti Chrome?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome će se sada ponovo pokrenuti}=1{Chrome će se ponovo pokrenuti za 1 sekundu}one{Chrome će se ponovo pokrenuti za # sekundu}few{Chrome će se ponovo pokrenuti za # sekunde}other{Chrome će se ponovo pokrenuti za # sekundi}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Želite li povezati svoje podatke sustava Chrome s tim računom?</translation> <translation id="4251625577313994583">preuzmite Chrome na iPhone</translation> <translation id="4293420128516039005">Prijavite se da biste sinkronizirali i prilagodili Chrome na svim svojim uređajima</translation> -<translation id="4309555186815777032">(potrebno je <ph name="BEGIN_BUTTON" />ponovo pokrenuti<ph name="END_BUTTON" /> Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">Proširenje <ph name="EXTENSION_NAME" /> dodano je u Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Odjavite se i prijavite se ponovo da bi ta promjena postala aktivna.</translation> <translation id="4458462641685292929">U tijeku je neka druga operacija na Google Chromeu. Pokušajte ponovo kasnije.</translation> <translation id="4480040274068703980">OS Chrome nije mogao sinkronizirati vaše podatke zbog pogreške prilikom prijave.</translation> <translation id="4561051373932531560">Google Chrome omogućuje da kliknete telefonski broj na webu i nazovete ga koristeći se Skypeom!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">U Chromeu</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome nije mogao sinkronizirati vaše podatke. Ažurirajte zaporku za sinkronizaciju.</translation> -<translation id="5037239767309817516">Zatvorite sve prozore preglednika Google Chrome i ponovo ga pokrenite kako bi ova promjena stupila na snagu.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome će se ponovo pokrenuti za sat vremena}one{Chrome će se ponovo pokrenuti za # sat}few{Chrome će se ponovo pokrenuti za # sata}other{Chrome će se ponovo pokrenuti za # sati}}</translation> <translation id="5132929315877954718">Otkrijte sjajne aplikacije, igre, proširenja i teme za Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome prikazuje se na tom jeziku</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">Kanal je promijenjen. Ponovo pokrenite uređaj za primjenu promjena.</translation> <translation id="5895138241574237353">Ponovno pokreni</translation> <translation id="5906655207909574370">Ažuriranje će uskoro biti gotovo. Za dovršetak ponovo pokrenite uređaj.</translation> -<translation id="5931853610562009806">Na Mac računalima zaporke se mogu spremati u vaš Keychain, a drugi korisnici Chromea koji dijele ovaj OS X račun mogu im pristupiti ili ih sinkronizirati.</translation> <translation id="5940385492829620908">Ovdje se nalaze vaš web, oznake i ostali sadržaji u Chromeu.</translation> <translation id="5941830788786076944">Neka Google Chrome bude zadani preglednik.</translation> <translation id="6014844626092547096">Sada ste prijavljeni na Chrome! Administrator je onemogućio sinkronizaciju.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb index 667a035..df9c851 100644 --- a/chrome/app/resources/google_chrome_strings_hu.xtb +++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">A Chrome elavult</translation> <translation id="2007150628464581396">{0,plural, =1{A Chrome 1 percen belül újraindul}other{A Chrome # percen belül újraindul}}</translation> <translation id="2063848847527508675">A frissítés alkalmazásához újra kell indítani a Chrome OS-t.</translation> -<translation id="2077129598763517140">Hardveres gyorsítás alkalmazása lehetőség szerint</translation> <translation id="2084710999043359739">Hozzáadás a Chrome-hoz</translation> <translation id="2094919256425865063">Biztosan kilép a Chrome-ból?</translation> <translation id="210890598424854131">{0,plural, =0{A Chrome most újraindul}=1{A Chrome 1 másodpercen belül újraindul}other{A Chrome # másodpercen belül újraindul}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Társítja Chrome-adatait ezzel a fiókkal?</translation> <translation id="4251625577313994583">Chrome beszerzése iPhone eszközre</translation> <translation id="4293420128516039005">Jelentkezzen be, hogy szinkronizálhassa és személyre szabhassa a Chrome-ot minden eszközén</translation> -<translation id="4309555186815777032">(a Chrome <ph name="BEGIN_BUTTON" />újraindítását<ph name="END_BUTTON" /> igényli)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">A(z) <ph name="EXTENSION_NAME" /> hozzá lett adva a Chrome-hoz</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Kérjük, jelentkezzen ki, majd jelentkezzen be újra a módosítás aktiválásához.</translation> <translation id="4458462641685292929">Egy másik Google Chrome-művelet is folyamatban van. Próbálkozzon újra később.</translation> <translation id="4480040274068703980">A Chrome OS egy bejelentkezési hiba miatt nem tudta szinkronizálni az adatokat.</translation> <translation id="4561051373932531560">A Google Chrome egyetlen kattintással lehetővé teszi a weboldalakon található telefonszámok felhívását Skype-pal!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">A Chrome-ban</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">A Google Chrome nem tudta szinkronizálni az adatokat. Kérjük, frissítse a szinkronizálás jelszavát.</translation> -<translation id="5037239767309817516">Ahhoz, hogy a módosítás hatályba lépjen, zárja be az összes Google Chrome ablakot, és indítsa újra az alkalmazást.</translation> <translation id="5131923704757666404">{0,plural, =1{A Chrome 1 órán belül újraindul}other{A Chrome # órán belül újraindul}}</translation> <translation id="5132929315877954718">Fedezzen fel nagyszerű alkalmazásokat, játékokat, bővítményeket és témákat a Google Chrome-hoz.</translation> <translation id="5166975452760862670">A Google Chrome ezen a nyelven jelenik meg</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">Módosult a csatorna. Indítsa újra az eszközt a módosítások alkalmazásához.</translation> <translation id="5895138241574237353">Újraindítás</translation> <translation id="5906655207909574370">Már majdnem naprakész! Indítsa újra az eszközt a frissítés befejezéséhez.</translation> -<translation id="5931853610562009806">Mac típusú számítógépen a rendszer a Keychain alkalmazásba mentheti a jelszavakat, amelyek hozzáférhetők vagy szinkronizálhatók lesznek azon Chrome-felhasználók számára, akik ugyanezzel az OS X-fiókkal rendelkeznek.</translation> <translation id="5940385492829620908">Az Ön könyvjelzői, valamint az internetezéssel és a Chrome-mal kapcsolatos egyéb dolgai vannak itt.</translation> <translation id="5941830788786076944">A Google Chrome beállítása alapértelmezett böngészőként</translation> <translation id="6014844626092547096">Bejelentkezett a Chrome-ba! A szinkronizálást a rendszergazdája letiltotta.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index 6333aba..bad4b3b 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome terlalu lawas</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome akan diluncurkan ulang dalam 1 menit}other{Chrome akan diluncurkan ulang dalam # menit}}</translation> <translation id="2063848847527508675">Chrome OS harus dimulai ulang untuk menerapkan pembaruan.</translation> -<translation id="2077129598763517140">Gunakan akselerasi hardware jika tersedia</translation> <translation id="2084710999043359739">Tambahkan ke Chrome</translation> <translation id="2094919256425865063">Tetap tutup Chrome?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome akan diluncurkan ulang sekarang}=1{Chrome akan diluncurkan ulang dalam 1 detik}other{Chrome akan diluncurkan ulang dalam # detik}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Tautkan data Chrome Anda ke akun ini?</translation> <translation id="4251625577313994583">dapatkan Chrome di iPhone</translation> <translation id="4293420128516039005">Login untuk menyinkronkan dan mempersonalisasi Chrome di perangkat Anda</translation> -<translation id="4309555186815777032">(Chrome perlu <ph name="BEGIN_BUTTON" />dimulai ulang<ph name="END_BUTTON" />)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> telah ditambahkan ke Chrome</translation> <translation id="4407807842708586359">OS Google Chrome</translation> -<translation id="4458285410772214805">Keluar dan masuk lagi agar perubahan ini diterapkan.</translation> <translation id="4458462641685292929">Operasi lain di Google Chrome sedang berlangsung. Coba lagi nanti.</translation> <translation id="4480040274068703980">Chrome OS tidak dapat menyinkronkan data Anda karena kesalahan saat masuk.</translation> <translation id="4561051373932531560">Google Chrome memungkinkan Anda mengeklik nomor telepon pada web dan menghubunginya melalui Skype!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">Di Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome tidak dapat menyinkronkan data Anda. Perbarui frasa sandi Sinkronisasi Anda.</translation> -<translation id="5037239767309817516">Harap tutup semua jendela Google Chrome dan luncurkan kembali agar perubahan ini berlaku.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome akan diluncurkan ulang dalam satu jam}other{Chrome akan diluncurkan ulang dalam # jam}}</translation> <translation id="5132929315877954718">Temukan aplikasi, game, ekstensi, dan tema yang hebat untuk Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome ditampilkan dalam bahasa ini</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">Saluran diubah. Mulai ulang perangkat Anda untuk menerapkan perubahan.</translation> <translation id="5895138241574237353">Mulai Ulang</translation> <translation id="5906655207909574370">Hampir selesai diperbarui! Mulai ulang perangkat untuk menyelesaikan pembaruan.</translation> -<translation id="5931853610562009806">Di Mac, sandi disimpan pada Keychain Anda dan diakses atau disinkronkan oleh pengguna Chrome lain yang membagikan akun OS X ini.</translation> <translation id="5940385492829620908">Web, bookmark, dan file Chrome Anda lainnya tersedia di sini.</translation> <translation id="5941830788786076944">Jadikan Google Chrome sebagai browser default</translation> <translation id="6014844626092547096">Sekarang Anda telah masuk ke Chrome! Sinkronisasi dinonaktifkan oleh administrator Anda.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb index b4e86892..44fe0cb 100644 --- a/chrome/app/resources/google_chrome_strings_it.xtb +++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome non è aggiornato</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome verrà riavviato tra un minuto}other{Chrome verrà riavviato tra # minuti}}</translation> <translation id="2063848847527508675">Per applicare l'aggiornamento è necessario riavviare Chrome OS.</translation> -<translation id="2077129598763517140">Usa accelerazione hardware quando disponibile</translation> <translation id="2084710999043359739">Aggiungi a Chrome</translation> <translation id="2094919256425865063">Vuoi chiudere comunque Chrome?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome verrà riavviato ora}=1{Chrome verrà riavviato tra un secondo}other{Chrome verrà riavviato tra # secondi}}</translation> @@ -126,12 +125,10 @@ <translation id="4251615635259297716">Collegare i tuoi dati Chrome a questo account?</translation> <translation id="4251625577313994583">Scarica Chrome sull'iPhone</translation> <translation id="4293420128516039005">Accedi per sincronizzare e personalizzare Chrome sui tuoi dispositivi</translation> -<translation id="4309555186815777032">(è necessario <ph name="BEGIN_BUTTON" />riavviare<ph name="END_BUTTON" /> Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">L'estensione <ph name="EXTENSION_NAME" /> è stata aggiunta a Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Esci ed esegui di nuovo l'accesso per applicare la modifica.</translation> <translation id="4458462641685292929">C'è un'altra operazione in corso su Google Chrome. Riprova più tardi.</translation> <translation id="4480040274068703980">Impossibile sincronizzare i dati in Chrome OS a causa di un errore durante l'accesso.</translation> <translation id="4561051373932531560">Google Chrome ti permette di scegliere un numero di telefono sul Web e di chiamarlo con Skype.</translation> @@ -156,7 +153,6 @@ <translation id="495931528404527476">In Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Impossibile sincronizzare i dati in Google Chrome. Aggiorna la passphrase di sincronizzazione.</translation> -<translation id="5037239767309817516">Chiudi tutte le finestre di Google Chrome e riavvialo per rendere effettiva la modifica.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome verrà riavviato tra un'ora}other{Chrome verrà riavviato tra # ore}}</translation> <translation id="5132929315877954718">Scopri applicazioni, giochi, estensioni e temi straordinari per Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome è visualizzato in questa lingua</translation> @@ -180,7 +176,6 @@ <translation id="5877064549588274448">Canale cambiato. Riavvia il dispositivo per applicare le modifiche.</translation> <translation id="5895138241574237353">Riavvia</translation> <translation id="5906655207909574370">Aggiornamento quasi completato. Riavvia il dispositivo per terminare l'aggiornamento.</translation> -<translation id="5931853610562009806">Su Mac, le password possono essere salvate in Accesso Portachiavi e sono accessibili o sincronizzate da parte di altri utenti Chrome che utilizzano lo stesso account OS X.</translation> <translation id="5940385492829620908">Il tuoi siti web, i tuoi segnalibri e gli altri contenuti Chrome sempre disponibili e aggiornati qui.</translation> <translation id="5941830788786076944">Imposta Google Chrome come browser predefinito</translation> <translation id="6014844626092547096">Hai eseguito l'accesso a Chrome. La sincronizzazione è stata disattivata dall'amministratore.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb index d1d4af7..5443911 100644 --- a/chrome/app/resources/google_chrome_strings_iw.xtb +++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome אינו מעודכן</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome יופעל מחדש בעוד דקה}two{Chrome יופעל מחדש בעוד # דקות}many{Chrome יופעל מחדש בעוד # דקות}other{Chrome יופעל מחדש בעוד # דקות}}</translation> <translation id="2063848847527508675">יש להפעיל מחדש את מערכת ההפעלה של Chrome כדי להחיל את העדכון.</translation> -<translation id="2077129598763517140">השתמש בהאצת חומרה כשניתן</translation> <translation id="2084710999043359739">הוסף ל-Chrome</translation> <translation id="2094919256425865063">לסגור את Chrome בכל זאת?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome יופעל מחדש עכשיו}=1{Chrome יופעל מחדש בעוד שנייה}two{Chrome יופעל מחדש בעוד # שניות}many{Chrome יופעל מחדש בעוד # שניות}other{Chrome יופעל מחדש בעוד # שניות}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">האם לקשר את הנתונים שלך ב-Chrome לחשבון זה?</translation> <translation id="4251625577313994583">להורדת Chrome ל-iPhone</translation> <translation id="4293420128516039005">כניסה לחשבון תסנכרן ותתאים אישית את Chrome בכל המכשירים שברשותך</translation> -<translation id="4309555186815777032">(נדרש <ph name="BEGIN_BUTTON" />אתחול<ph name="END_BUTTON" /> של Chrome)</translation> <translation id="4328355335528187361">גרסת הפיתוח של Google Chrome (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> נוסף ל-Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">צא מהמערכת והיכנס שוב כדי שהשינוי ייכנס לתוקף.</translation> <translation id="4458462641685292929">מתבצעת כרגע פעולה אחרת ב-Google Chrome. נסה שוב מאוחר יותר.</translation> <translation id="4480040274068703980">מערכת ההפעלה של Chrome לא הצליחה לסנכרן את הנתונים שלך עקב שגיאה בתהליך הכניסה.</translation> <translation id="4561051373932531560">Google Chrome מאפשר לך ללחוץ על מספר טלפון באינטרנט ולהתקשר אליו באמצעות Skype!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">ב-Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome לא הצליח לסנכרן את הנתונים שלך. עדכן את משפט הסיסמה שלך עבור סנכרון.</translation> -<translation id="5037239767309817516">כדי ששינוי זה ייכנס לתוקף, סגור את כל החלונות של Google Chrome והפעל אותו מחדש.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome יופעל מחדש בעוד שעה}two{Chrome יופעל מחדש בעוד # שעות}many{Chrome יופעל מחדש בעוד # שעות}other{Chrome יופעל מחדש בעוד # שעות}}</translation> <translation id="5132929315877954718">גלה יישומים, משחקים, תוספים ועיצובים מעולים עבור Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome מוצג בשפה זו</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">הערוץ שונה. הפעל מחדש את המכשיר להחלת השינויים.</translation> <translation id="5895138241574237353">הפעל מחדש</translation> <translation id="5906655207909574370">העדכון כמעט הושלם! הפעל מחדש את המכשיר כדי לסיים את העדכון.</translation> -<translation id="5931853610562009806">אם אתה משתמש ב-Mac, ייתכן שסיסמאות יישמרו ב-Keychain שלך, ומשתמשי Chrome אחרים החולקים את חשבון OS X הזה יוכלו לגשת אליהן או לסנכרן אותן.</translation> <translation id="5940385492829620908">היסטוריית האתרים, הסימניות ופריטים נוספים מ-Chrome נמצאים כאן.</translation> <translation id="5941830788786076944">הפוך את Google Chrome לדפדפן ברירת המחדל</translation> <translation id="6014844626092547096">אתה מחובר כעת ל-Chrome! הסנכרון הושבת על ידי מנהל המערכת שלך.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb index d36997b..3037716 100644 --- a/chrome/app/resources/google_chrome_strings_ja.xtb +++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome は古いバージョンです</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome は 1 分後に再起動されます}other{Chrome は # 分後に再起動されます}}</translation> <translation id="2063848847527508675">アップデートを適用するには、Chrome OS を再起動する必要があります。</translation> -<translation id="2077129598763517140">ハードウェア アクセラレーションが使用可能な場合は使用する</translation> <translation id="2084710999043359739">Chrome に追加</translation> <translation id="2094919256425865063">今すぐ Chrome を終了しますか?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome は今すぐ再起動されます}=1{Chrome は 1 秒後に再起動されます}other{Chrome は # 秒後に再起動されます}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Chrome データをこのアカウントにリンクしますか?</translation> <translation id="4251625577313994583">iPhone に Chrome をインストール</translation> <translation id="4293420128516039005">ログインすると、同期してカスタマイズした Chrome をどの端末でも使用できます</translation> -<translation id="4309555186815777032">(Chrome を<ph name="BEGIN_BUTTON" />再起動<ph name="END_BUTTON" />する必要があります)</translation> <translation id="4328355335528187361">Google Chrome Dev(mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">「<ph name="EXTENSION_NAME" />」が Chrome に追加されました</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">変更内容を反映するには、一度ログアウトして、もう一度ログインしてください。</translation> <translation id="4458462641685292929">Google Chrome で別の処理が行われています。しばらくしてからもう一度お試しください。</translation> <translation id="4480040274068703980">ログイン時にエラーが発生したため、Chrome OS はデータを同期できませんでした。</translation> <translation id="4561051373932531560">Google Chrome では、ウェブサイト上の電話番号をクリックするだけで Skype で通話を発信できます。</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">Chrome 専用</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome はデータを同期できませんでした。同期パスフレーズを更新してください。</translation> -<translation id="5037239767309817516">この変更を反映するには、すべての Google Chrome ウィンドウを閉じてからもう一度起動してください。</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome は 1 時間後に再起動されます}other{Chrome は # 時間後に再起動されます}}</translation> <translation id="5132929315877954718">Google Chrome のすばらしいアプリ、ゲーム、拡張機能、テーマをぜひご利用ください。</translation> <translation id="5166975452760862670">Google Chrome はこの言語で表示されています</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">チャンネルが変更されました。変更を適用するには、デバイスを再起動してください。</translation> <translation id="5895138241574237353">再起動</translation> <translation id="5906655207909574370">端末を再起動して更新を完了してください。</translation> -<translation id="5931853610562009806">Mac では、パスワードはキーチェーンに保存され、この Mac OS X アカウントを共有する別の Chrome ユーザーからアクセスされたり同期されたりする可能性があります。</translation> <translation id="5940385492829620908">ウェブ、ブックマーク、その他の Chrome データを好みに設定できます。</translation> <translation id="5941830788786076944">Google Chrome を既定のブラウザにする</translation> <translation id="6014844626092547096">Chrome にログインしています。同期は管理者によって無効にされています。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb index cd1e26f..1a4e869 100644 --- a/chrome/app/resources/google_chrome_strings_kn.xtb +++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -42,7 +42,6 @@ <translation id="1877026089748256423">Chrome ನ ಅವಧಿ ಮುಗಿದಿದೆ</translation> <translation id="2007150628464581396">{0,plural, =1{1 ನಿಮಿಷದಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{# ನಿಮಿಷಗಳಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{# ನಿಮಿಷಗಳಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation> <translation id="2063848847527508675">ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು Chrome OS ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕಾಗುತ್ತದೆ.</translation> -<translation id="2077129598763517140">ಲಭ್ಯವಿರುವಾಗ ಹಾರ್ಡ್ವೇರ್ ಆಕ್ಸಲರೇಶನ್ ಬಳಸು</translation> <translation id="2084710999043359739">Chrome ಗೆ ಸೇರಿಸಿ</translation> <translation id="2094919256425865063">ಹೇಗಿದ್ದರೂ Chrome ಅನ್ನು ಮುಚ್ಚುವುದೇ?</translation> <translation id="210890598424854131">{0,plural, =0{ಇದೀಗ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}=1{1 ಸೆಂಕೆಂಡಿನಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{# ಸೆಕೆಂಡುಗಳಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{# ಸೆಕೆಂಡುಗಳಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation> @@ -71,7 +70,7 @@ <translation id="2586406160782125153">ಈ ಸಾಧನದಿಂದ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ಇದು ಅಳಿಸುತ್ತದೆ. ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಮರುಪಡೆಯಲು, <ph name="USER_EMAIL" /> ನಂತೆ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation> <translation id="2588322182880276190">Chrome ಲೋಗೊ</translation> <translation id="2652691236519827073">ಹೊಸ Chrome &ಟ್ಯಾಬ್ನಲ್ಲಿ ಲಿಂಕ್ ಅನ್ನು ತೆರೆಯಿರಿ</translation> -<translation id="2664962310688259219">Chrome OS ಮುಕ್ತ ಮೂಲ ಪರವಾನಗಿಗಳು</translation> +<translation id="2664962310688259219">Chrome OS ಓಪನ್ ಸೋರ್ಸ್ ಪರವಾನಗಿಗಳು</translation> <translation id="2665296953892887393">Google ಗೆ ಕ್ರ್ಯಾಶ್ ವರದಿಗಳನ್ನು ಮತ್ತು <ph name="UMA_LINK" /> ಕಳುಹಿಸುವುದರಿಂದ Google Chrome ಅನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡಿ</translation> <translation id="2689103672227170538">ನೀವು Chrome ಪ್ರಾರಂಭಿಸಿದಾಗ ಯಾವ ಪುಟ ತೋರಿಸಬೇಕು ಎಂಬ ಪುಟವನ್ನು ಈ ವಿಸ್ತರಣೆಯು ಬದಲಾಯಿಸಿದೆ.</translation> <translation id="2705403826523567092">ಸಿಂಕ್ ಮಾಡಿದ ಸಾಧನಗಳಾದ್ಯಂತ ವೈಯಕ್ತೀಕರಿಸಿದ ಬ್ರೌಸಿಂಗ್ ಅನುಭವಕ್ಕಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> @@ -127,12 +126,10 @@ <translation id="4251615635259297716">ಈ ಖಾತೆಗೆ ನಿಮ್ಮ Chrome ಡೇಟಾವನ್ನು ಲಿಂಕ್ ಮಾಡುವುದೇ?</translation> <translation id="4251625577313994583">ನಿಮ್ಮ iPhone ನಲ್ಲಿ Chrome ಪಡೆದುಕೊಳ್ಳಿ</translation> <translation id="4293420128516039005">ನಿಮ್ಮ ಸಾಧನಗಳಲ್ಲಿ Chrome ಅನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಮತ್ತು ವೈಯಕ್ತೀಕರಿಸಲು ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> -<translation id="4309555186815777032">(Chrome <ph name="BEGIN_BUTTON" />ಮರುಪ್ರಾರಂಭ<ph name="END_BUTTON" /> ಅಗತ್ಯವಿದೆ)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">Chrome ಗೆ <ph name="EXTENSION_NAME" /> ಅನ್ನು ಸೇರಿಸಲಾಗಿದೆ</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">ದಯವಿಟ್ಟು ಈ ಬದಲಾವಣೆಯು ಕಾರ್ಯಗತವಾಗಲು ಸೈನ್ ಔಟ್ ಮಾಡಿ ಹಾಗೂ ಮತ್ತೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation> <translation id="4458462641685292929">Google Chrome ನಲ್ಲಿ ಮತ್ತೊಂದು ಕಾರ್ಯಾಚರಣೆಯು ಪ್ರಗತಿಯಲ್ಲಿದೆ. ದಯವಿಟ್ಟು ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="4480040274068703980">ಸೈನ್ ಇನ್ ಮಾಡುವಲ್ಲಿ ದೋಷವಿರುವ ಕಾರಣ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಲು Chrome OS ಗೆ ಸಾಧ್ಯವಿಲ್ಲ.</translation> <translation id="4561051373932531560">Google Chrome ನೀವು ವೆಬ್ನಲ್ಲಿ ಫೋನ್ ಸಂಖ್ಯೆಯನ್ನು ಕ್ಲಿಕ್ ಮಾಡಲು ಅವಕಾಶ ಮಾಡುತ್ತದೆ ಮತ್ತು Skype ನೊಂದಿಗೆ ಕರೆ ಮಾಡುತ್ತದೆ!</translation> @@ -157,7 +154,6 @@ <translation id="495931528404527476">Chrome ನಲ್ಲಿ</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome ನಲ್ಲಿ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಸಿಂಕ್ ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ನವೀಕರಿಸಿ.</translation> -<translation id="5037239767309817516">ಈ ಬದಲಾವಣೆಯು ಕಾರ್ಯಗತಗೊಳ್ಳಲು ದಯವಿಟ್ಟು ಎಲ್ಲ Google Chrome ವಿಂಡೊಗಳನ್ನು ಮುಚ್ಚಿ ಹಾಗೂ ಅದನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ.</translation> <translation id="5131923704757666404">{0,plural, =1{ಗಂಟೆಯಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{# ಗಂಟೆಯಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{# ಗಂಟೆಯಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation> <translation id="5132929315877954718">Google Chrome ಸಲುವಾಗಿ ಉತ್ಕೃಷ್ಟಮಟ್ಟದ ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಗೇಮ್ಗಳು, ವಿಸ್ತರಣೆಗಳು ಹಾಗೂ ಥೀಮ್ಗಳನ್ನು ಅನ್ವೇಷಿಸಿ</translation> <translation id="5166975452760862670">ಈ ಭಾಷೆಯಲ್ಲಿ Google Chrome ಪ್ರದರ್ಶನಗೊಂಡಿದೆ</translation> @@ -181,7 +177,6 @@ <translation id="5877064549588274448">ಚಾನಲ್ ಬದಲಾಗಿದೆ. ಬದಲಾವಣೆಗಳನ್ನು ಅನ್ವಯಿಸಲು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ.</translation> <translation id="5895138241574237353">ಮರುಪ್ರಾರಂಭಿಸಿ</translation> <translation id="5906655207909574370">ಬಹುಪಾಲು ನವೀಕೃತವಾಗಿದೆ! ಅಪ್ಡೇಟ್ ಮಾಡುವುದನ್ನು ಮುಗಿಸಲು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ.</translation> -<translation id="5931853610562009806">Mac ನಲ್ಲಿ, ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಿಮ್ಮ ಕೀಚೈನ್ನಲ್ಲಿ ಉಳಿಸಬಹುದು ಹಾಗೂ ಈ OS X ಖಾತೆಯನ್ನು ಹಂಚಿಕೊಂಡಿರುವ ಇತರ Chrome ಬಳಕೆದಾರರು ಇದನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಅಥವಾ ಸಿಂಕ್ ಮಾಡಬಹುದು.</translation> <translation id="5940385492829620908">ನಿಮ್ಮ ವೆಬ್, ಬುಕ್ಮಾರ್ಕ್ಗಳು ಮತ್ತು ಇತರ Chrome ವಿಷಯವು ಇಲ್ಲಿ ಲೈವ್ ಆಗುತ್ತವೆ.</translation> <translation id="5941830788786076944">Google Chrome ಅನ್ನು ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಆಗಿಸು</translation> <translation id="6014844626092547096">ಇದೀಗ ನೀವು Chrome ಗೆ ಸೈನ್ ಇನ್ ಆಗಿರುವಿರಿ! ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ಸಿಂಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation> @@ -226,7 +221,7 @@ <translation id="7437998757836447326">Chrome ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡಿ</translation> <translation id="7459554271817304652">ನಿಮ್ಮ ವೈಯಕ್ತಿಕಗೊಳಿಸಿದ ಬ್ರೌಸರ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ವೆಬ್ಗೆ ಉಳಿಸಲು ಮತ್ತು ಅವುಗಳನ್ನು Google Chrome ನಿಂದ ಯಾವುದೇ ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ಪ್ರವೇಶಿಸಲು ಸಿಂಕ್ ಅನ್ನು ಹೊಂದಿಸಿ.</translation> <translation id="7473136999113284234">Chrome ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನವೀಕರಣಗೊಳ್ಳುತ್ತದೆ ಈ ಮೂಲಕ ನೀವು ಯಾವಾಗಲೂ ತಾಜಾ ಆವೃತ್ತಿಯನ್ನು ಹೊಂದಿರುತ್ತೀರಿ.</translation> -<translation id="7494905215383356681">Chrome ಮುಕ್ತ ಮೂಲ ಪರವಾನಗಿಗಳು</translation> +<translation id="7494905215383356681">Chrome ಓಪನ್ ಸೋರ್ಸ್ ಪರವಾನಗಿಗಳು</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7552219221109926349">Chrome OS ಈ ಭಾಷೆಯಲ್ಲಿ ಪ್ರದರ್ಶಿಸಿ</translation> <translation id="7589360514048265910">ಈ ಕಂಪ್ಯೂಟರ್ ಇನ್ನು ಮುಂದೆ Google Chrome ಅಪ್ಡೇಟ್ಗಳನ್ನು ಸ್ವೀಕರಿಸುವುದಿಲ್ಲ. ಏಕೆಂದರೆ ಅದರ Mac OS X 10.9 ಇನ್ನು ಮುಂದೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb index 30eba7e..8bbc77fa 100644 --- a/chrome/app/resources/google_chrome_strings_ko.xtb +++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Chrome이 이전 버전임</translation> <translation id="2007150628464581396">{0,plural, =1{1분 후에 Chrome 다시 시작}other{#분 후에 Chrome 다시 시작}}</translation> <translation id="2063848847527508675">업데이트를 적용하려면 Chrome OS를 다시 시작해야 합니다.</translation> -<translation id="2077129598763517140">가능한 경우 하드웨어 가속 사용</translation> <translation id="2084710999043359739">Chrome에 추가</translation> <translation id="2094919256425865063">Chrome을 종료하시겠습니까?</translation> <translation id="210890598424854131">{0,plural, =0{곧 Chrome 다시 시작}=1{1초 후에 Chrome 다시 시작}other{#초 후에 Chrome 다시 시작}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">Chrome 데이터를 이 계정에 연결하시겠습니까?</translation> <translation id="4251625577313994583">iPhone에 Chrome 다운로드하기</translation> <translation id="4293420128516039005">로그인하여 모든 기기에서 Chrome을 동기화하고 맞춤설정하세요.</translation> -<translation id="4309555186815777032">(Chrome을 <ph name="BEGIN_BUTTON" />다시 시작<ph name="END_BUTTON" />해야 함)</translation> <translation id="4328355335528187361">Chrome 개발자(mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" />이(가) Chrome에 추가됨</translation> <translation id="4407807842708586359">Chrome OS</translation> -<translation id="4458285410772214805">변경사항을 적용하려면 로그아웃했다가 다시 로그인하세요.</translation> <translation id="4458462641685292929">Chrome에서 다른 작업이 진행 중입니다. 나중에 다시 시도해 주세요.</translation> <translation id="4480040274068703980">로그인 중 오류가 발생하여 Chrome OS에서 데이터를 동기화하지 못했습니다.</translation> <translation id="4561051373932531560">Chrome을 사용하면 웹에서 전화번호를 클릭하여 Skype로 통화할 수 있습니다.</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">Chrome</translation> <translation id="4990567037958725628">Chrome 카나리아</translation> <translation id="5028489144783860647">Chrome에서 데이터를 동기화하지 못했습니다. 동기화 암호를 업데이트하시기 바랍니다.</translation> -<translation id="5037239767309817516">변경사항을 적용하려면 모든 Chrome 창을 닫은 다음 다시 시작하시기 바랍니다.</translation> <translation id="5131923704757666404">{0,plural, =1{1시간 후에 Chrome 다시 시작}other{#시간 후에 Chrome 다시 시작}}</translation> <translation id="5132929315877954718">Chrome에 사용할 유용한 애플리케이션, 게임, 확장 프로그램 및 테마를 찾아보세요.</translation> <translation id="5166975452760862670">현재 Chrome에서 사용 중인 언어</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">채널이 변경되었습니다. 변경사항을 적용하려면 기기를 다시 시작하세요.</translation> <translation id="5895138241574237353">다시 시작</translation> <translation id="5906655207909574370">업데이트가 거의 완료되었습니다. 업데이트를 완료하려면 기기를 다시 시작하세요.</translation> -<translation id="5931853610562009806">Mac에서는 비밀번호가 키체인에 저장되어 이 OS X 계정을 공유하는 다른 Chrome 사용자가 액세스하거나 동기화할 수 있습니다.</translation> <translation id="5940385492829620908">웹, 북마크 및 기타 Chrome 콘텐츠가 여기에 저장됩니다.</translation> <translation id="5941830788786076944">Chrome을 기본 브라우저로</translation> <translation id="6014844626092547096">Chrome에 로그인했습니다. 관리자가 동기화를 사용 중지했습니다.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index 7d0cc78..c1cc4c20 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">„Chrome“ versija yra pasenusi</translation> <translation id="2007150628464581396">{0,plural, =1{„Chrome“ bus paleista iš naujo po 1 minutės}one{„Chrome“ bus paleista iš naujo po # minutės}few{„Chrome“ bus paleista iš naujo po # minučių}many{„Chrome“ bus paleista iš naujo po # minutės}other{„Chrome“ bus paleista iš naujo po # minučių}}</translation> <translation id="2063848847527508675">Kad būtų galima pritaikyti naujinį, „Chrome“ OS reikia paleisti iš naujo.</translation> -<translation id="2077129598763517140">Kai galima, naudoti aparatinės įrangos paspartinimą</translation> <translation id="2084710999043359739">Pridėti į „Chrome“</translation> <translation id="2094919256425865063">Vis tiek išeiti iš „Chrome“?</translation> <translation id="210890598424854131">{0,plural, =0{„Chrome“ bus paleista iš naujo dabar}=1{„Chrome“ bus paleista iš naujo po 1 sekundės}one{„Chrome“ bus paleista iš naujo po # sekundės}few{„Chrome“ bus paleista iš naujo po # sekundžių}many{„Chrome“ bus paleista iš naujo po # sekundės}other{„Chrome“ bus paleista iš naujo po # sekundžių}}</translation> @@ -129,13 +128,11 @@ <translation id="4251615635259297716">Susisieti „Chrome“ duomenis su šia paskyra?</translation> <translation id="4251625577313994583">gauti „Chrome“ „iPhone“ įrenginyje</translation> <translation id="4293420128516039005">Prisijunkite, kad galėtumėte sinchronizuoti ir suasmeninti „Chrome“ skirtinguose įrenginiuose</translation> -<translation id="4309555186815777032">(„Chrome“ būtina <ph name="BEGIN_BUTTON" />paleisti iš naujo<ph name="END_BUTTON" />)</translation> <translation id="4328355335528187361">„Google Chrome Dev“ („mDNS-In“)</translation> <translation id="4331809312908958774">Chrome OS </translation> <translation id="4343195214584226067">Plėtinys „<ph name="EXTENSION_NAME" />“ pridėtas prie „Chrome“</translation> <translation id="4407807842708586359">„Google Chrome OS“</translation> -<translation id="4458285410772214805">Atsijunkite ir prisijunkite iš naujo, kad šis pakeitimas būtų pritaikytas.</translation> <translation id="4458462641685292929">Vykdoma kita „Google Chrome“ operacija. Vėliau bandykite dar kartą.</translation> <translation id="4480040274068703980">„Chrome“ OS negali sinchronizuoti duomenų, nes prisijungiant įvyko klaida.</translation> <translation id="4561051373932531560">Naudodami „Google Chrome“ galite spustelėti telefono numerį žiniatinklyje ir skambinti juo naudodami „Skype“!</translation> @@ -160,7 +157,6 @@ <translation id="495931528404527476">Naudojant „Chrome“</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">„Google Chrome“ negali sinchronizuoti duomenų. Atnaujinkite sinchronizavimo slaptafrazę.</translation> -<translation id="5037239767309817516">Uždarykite visus „Google Chrome“ langus ir paleiskite iš naujo, kad įsigaliotų šis pakeitimas.</translation> <translation id="5131923704757666404">{0,plural, =1{„Chrome“ bus paleista iš naujo po valandos}one{„Chrome“ bus paleista iš naujo po # valandos}few{„Chrome“ bus paleista iš naujo po # valandų}many{„Chrome“ bus paleista iš naujo po # valandos}other{„Chrome“ bus paleista iš naujo po # valandų}}</translation> <translation id="5132929315877954718">Suraskite puikių „Google Chrome“ programų, žaidimų, plėtinių ir temų.</translation> <translation id="5166975452760862670">„Google Chrome“ pateikiama šia kalba</translation> @@ -188,7 +184,6 @@ <translation id="5877064549588274448">Kanalas pakeistas. Kad pritaikytumėte pakeitimus, iš naujo paleiskite įrenginį.</translation> <translation id="5895138241574237353">Paleisti iš naujo</translation> <translation id="5906655207909574370">Beveik įdiegta naujausia versija! Paleiskite įrenginį iš naujo, kad būtų užbaigtas naujinimas.</translation> -<translation id="5931853610562009806">„Mac“ kompiuteriuose slaptažodžiai gali būti išsaugoti naudojant „Keychain“, o juos gali pasiekti arba sinchronizuoti kiti „Chrome“ naudotojai, bendrai naudojantys šią „OS X“ paskyrą.</translation> <translation id="5940385492829620908">Čia saugoma žiniatinklio informacija, žymės ir kiti „Chrome“ duomenys.</translation> <translation id="5941830788786076944">Padarykite „Google Chrome“ numatytąja naršykle</translation> <translation id="6014844626092547096">Dabar esate prisijungę prie „Chrome“. Administratorius neleidžia sinchronizuoti.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb index 5ef6073..96aa4a3 100644 --- a/chrome/app/resources/google_chrome_strings_lv.xtb +++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -42,7 +42,6 @@ <translation id="1877026089748256423">Chrome versija ir novecojusi.</translation> <translation id="2007150628464581396">{0,plural, =1{Pārlūks Chrome tiks restartēts pēc 1 minūtes}zero{Pārlūks Chrome tiks restartēts pēc # minūtēm}one{Pārlūks Chrome tiks restartēts pēc # minūtes}other{Pārlūks Chrome tiks restartēts pēc # minūtēm}}</translation> <translation id="2063848847527508675">Lai lietotu atjauninājumu, Chrome OS ir jārestartē.</translation> -<translation id="2077129598763517140">Izmantot aparatūras paātrināšanas režīmu, kad tas ir pieejams</translation> <translation id="2084710999043359739">Pievienot pārlūkam Chrome</translation> <translation id="2094919256425865063">Vai tik un tā aizvērt pārlūku Chrome?</translation> <translation id="210890598424854131">{0,plural, =0{Pārlūks Chrome tiks restartēts tūlīt}=1{Pārlūks Chrome tiks restartēts pēc 1 sekundes}zero{Pārlūks Chrome tiks restartēts pēc # sekundēm}one{Pārlūks Chrome tiks restartēts pēc # sekundes}other{Pārlūks Chrome tiks restartēts pēc # sekundēm}}</translation> @@ -127,12 +126,10 @@ <translation id="4251615635259297716">Vai saistīt Chrome datus ar šo kontu?</translation> <translation id="4251625577313994583">Iegūt Chrome savā iPhone tālrunī</translation> <translation id="4293420128516039005">Pierakstieties, lai sinhronizētu un personalizētu Chrome visās savās ierīcēs.</translation> -<translation id="4309555186815777032">(ir <ph name="BEGIN_BUTTON" />jārestartē<ph name="END_BUTTON" /> pārlūks Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">Paplašinājums <ph name="EXTENSION_NAME" /> pievienots pārlūkam Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Lūdzu, izrakstieties un pierakstieties vēlreiz, lai šīs izmaiņas stātos spēkā.</translation> <translation id="4458462641685292929">Tiek veikta cita darbība pārlūkā Google Chrome. Lūdzu, vēlāk mēģiniet vēlreiz.</translation> <translation id="4480040274068703980">Chrome OS nevarēja sinhronizēt jūsu datus pierakstīšanās kļūdas dēļ.</translation> <translation id="4561051373932531560">Google Chrome ļauj jums noklikšķināt uz tālruņa numura un zvanīt ar to pakalpojumā Skype!</translation> @@ -157,7 +154,6 @@ <translation id="495931528404527476">Pārlūkprogrammā Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome nevarēja sinhronizēt jūsu datus. Lūdzu, atjauniniet savu sinhronizācijas ieejas frāzi.</translation> -<translation id="5037239767309817516">Lai izmaiņas stātos spēkā, aizveriet visus Google Chrome logus un restartējiet pārlūku.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome tiks palaists atkārtoti pēc stundas}zero{Chrome tiks palaists atkārtoti pēc # stundām}one{Chrome tiks palaists atkārtoti pēc # stundas}other{Chrome tiks palaists atkārtoti pēc # stundām}}</translation> <translation id="5132929315877954718">Atklājiet lieliskas lietotnes, spēles, paplašinājumus un motīvus, ko varat izmantot pārlūkā Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome tiek rādīts šajā valodā.</translation> @@ -183,7 +179,6 @@ <translation id="5877064549588274448">Kanāls tika mainīts. Lai lietotu izmaiņas, restartējiet ierīci.</translation> <translation id="5895138241574237353">Restartēt</translation> <translation id="5906655207909574370">Atjaunināšana ir gandrīz pabeigta. Restartējiet ierīci, lai pabeigtu atjaunināšanu.</translation> -<translation id="5931853610562009806">Operētājsistēmā Mac paroles var tikt saglabātas sistēmā Keychain, un citi Chrome lietotāji, kuri koplieto šo OS X kontu, var piekļūt tām un sinhronizēt tās.</translation> <translation id="5940385492829620908">Šeit atrodas jūsu tīmekļa saturs, grāmatzīmes un cits Chrome saturs.</translation> <translation id="5941830788786076944">Izveidot Google Chrome par noklusējuma pārlūku</translation> <translation id="6014844626092547096">Jūs esat pierakstījies pārlūkā Chrome. Jūsu administrators ir atspējojis sinhronizēšanu.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index bbbfd62..044e8a4 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Chrome കാലഹരണപ്പെട്ടതാണ്</translation> <translation id="2007150628464581396">{0,plural, =1{ഒരു മിനിറ്റിനുള്ളിൽ Chrome വീണ്ടും സമാരംഭിക്കും}other{# മിനിറ്റിനുള്ളിൽ Chrome വീണ്ടും സമാരംഭിക്കും}}</translation> <translation id="2063848847527508675">അപ്ഡേറ്റ് പ്രയോഗത്തിൽ വരുത്താൻ Chrome OS പുനഃരാരംഭിക്കേണ്ടതുണ്ട്.</translation> -<translation id="2077129598763517140">ലഭ്യമാകുമ്പോൾ ഹാർഡ്വെയർ ത്വരിതപ്പെടുത്തൽ ഉപയോഗിക്കുക</translation> <translation id="2084710999043359739">Chrome-ലേക്ക് ചേർക്കുക</translation> <translation id="2094919256425865063">എന്തായാലും Chrome-ൽ നിന്ന് പുറത്തുകടക്കണോ?</translation> <translation id="210890598424854131">{0,plural, =0{ഇപ്പോൾ Chrome വീണ്ടും സമാരംഭിക്കും}=1{ഒരു സെക്കൻഡിനുള്ളിൽ Chrome വീണ്ടും സമാരംഭിക്കും}other{# സെക്കൻഡിനുള്ളിൽ Chrome വീണ്ടും സമാരംഭിക്കും}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">നിങ്ങളുടെ Chrome ഡാറ്റ ഈ അക്കൗണ്ടുമായി ലിങ്കുചെയ്യണോ?</translation> <translation id="4251625577313994583">നിങ്ങളുടെ iPhone-ൽ Chrome സ്വന്തമാക്കൂ</translation> <translation id="4293420128516039005">നിങ്ങളുടെ ഉപകരണങ്ങളിലുടനീളം Chrome സമന്വയിപ്പിച്ച് വ്യക്തിഗതമാക്കാൻ സൈൻ ഇൻ ചെയ്യുക</translation> -<translation id="4309555186815777032">(Chrome <ph name="BEGIN_BUTTON" />പുനരാരംഭിക്കൽ<ph name="END_BUTTON" /> ആവശ്യമാണ്)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> Chrome-ലേക്ക് ചേർത്തു</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">ഈ മാറ്റം പ്രാബല്യത്തിൽ വരുന്നതിന് സൈൻ ഔട്ട് ചെയ്ത് വീണ്ടും സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="4458462641685292929">Google Chrome-ലെ മറ്റൊരു പ്രവർത്തനം പുരോഗതിയിലാണ്. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="4480040274068703980">സൈൻ ഇൻ ചെയ്യുന്നതിലെ പിശക് കാരണം Chrome OS-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation> <translation id="4561051373932531560">വെബ്ബിലുള്ള ഒരു ഫോണ് നമ്പരില് ക്ലിക്കുചെയ്യുവാനും Skype ഉപയോഗിച്ച് വിളിക്കുവാനും Google Chrome നിങ്ങളെ അനുവദിക്കുന്നു!</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">Chrome-ൽ</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല. നിങ്ങളുടെ സമന്വയ പാസ്ഫ്രെയ്സ് അപ്ഡേറ്റ് ചെയ്യുക.</translation> -<translation id="5037239767309817516">ഈ മാറ്റങ്ങള് നടപ്പിലാകുന്നതിനായി ദയവായി എല്ലാ Google Chrome വിന്ഡോകളും അടച്ച് ഇത് വീണ്ടും സമാരംഭിക്കുക.</translation> <translation id="5131923704757666404">{0,plural, =1{ഒരു മണിക്കൂറിനുള്ളിൽ Chrome വീണ്ടും സമാരംഭിക്കും}other{# മണിക്കൂറിനുള്ളിൽ Chrome വീണ്ടും സമാരംഭിക്കും}}</translation> <translation id="5132929315877954718">Google Chrome-നായി മികച്ച അപ്ലിക്കേഷനുകളും വിപുലീകരണങ്ങളും തീമുകളും കണ്ടെത്തുക.</translation> <translation id="5166975452760862670">Google Chrome ഈ ഭാഷയിൽ പ്രദർശിപ്പിച്ചിരിക്കുന്നു</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">ചാനൽ മാറ്റി. മാറ്റങ്ങൾ ബാധകമാകാൻ നിങ്ങളുടെ ഉപകരണം പുനരാരംഭിക്കുക.</translation> <translation id="5895138241574237353">പുനരാരംഭിക്കുക</translation> <translation id="5906655207909574370">എകദേശം അപ്ടുഡേറ്റാണ്! അപ്ഡേറ്റുചെയ്യൽ പൂർത്തിയാക്കാൻ ഉപകരണം പുനഃരാരംഭിക്കുക.</translation> -<translation id="5931853610562009806">Mac-ൽ പാസ്വേഡുകൾ നിങ്ങളുടെ കീചെയിനിൽ സംരക്ഷിക്കാം ഒപ്പം ഈ OS X അക്കൗണ്ട് പങ്കിടുന്ന മറ്റ് Chrome ഉപയോക്താക്കൾക്ക് ഇത് ആക്സസ്സ് ചെയ്യാനോ സമന്വയിപ്പിക്കാനോ കഴിഞ്ഞേക്കാം.</translation> <translation id="5940385492829620908">നിങ്ങളുടെ വെബും ബുക്ക്മാർക്കുകളും മറ്റ് Chrome ഫയലും ഇവിടെ തത്സമയമാണ്.</translation> <translation id="5941830788786076944">Google Chrome നെ സ്ഥിരസ്ഥിതി ബ്രൌസറായി മാറ്റുക</translation> <translation id="6014844626092547096">നിങ്ങൾ ഇപ്പോൾ Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്തു! നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ സമന്വയം പ്രവർത്തനരഹിതമാക്കി.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb index ee2f119..d814020a4 100644 --- a/chrome/app/resources/google_chrome_strings_mr.xtb +++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -43,7 +43,6 @@ <translation id="1877026089748256423">Chrome कालबाह्य आहे</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome एका मिनिटानंतर पुन्हा लाँँच होईल}one{Chrome # मिनिटानंतर पुन्हा लाँँच होईल}other{Chrome # मिनिटांनंतर पुन्हा लाँँच होईल}}</translation> <translation id="2063848847527508675">अपडेट लागू करण्यासाठी Chrome OS रीस्टार्ट करणे आवश्यक आहे.</translation> -<translation id="2077129598763517140">उपलब्ध असेल तेव्हा हार्डवेअर ऍक्सीलरेशन वापरा</translation> <translation id="2084710999043359739">Chrome मध्ये जोडा</translation> <translation id="2094919256425865063">तरीही Chrome बंद करायचे?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome आता पुन्हा लाँँच होईल}=1{Chrome एका सेकंदानंतर पुन्हा लाँँच होईल}one{Chrome # सेकंदानंतर पुन्हा लाँँच होईल}other{Chrome # सेकंदांनंतर पुन्हा लाँँच होईल}}</translation> @@ -127,12 +126,10 @@ <translation id="4251615635259297716">या खात्यावर आपल्या Chrome डेटा चा दुवा साधायचा?</translation> <translation id="4251625577313994583">Chrome तुमच्या iPhone वर मिळवा</translation> <translation id="4293420128516039005">तुमच्या डिव्हाइसवर Chrome सिंक आणि पर्सनलाइझ करण्यासाठी साइन इन करा</translation> -<translation id="4309555186815777032">(Chrome <ph name="BEGIN_BUTTON" />रीस्टार्ट<ph name="END_BUTTON" /> करणे आवश्यक)</translation> <translation id="4328355335528187361">Google Chrome विकासक (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> हे Chrome मध्ये जोडले गेले आहे</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">कृपया हा बदल प्रभावी होण्यासाठी साइन आउट करा आणि साइन इन करा.</translation> <translation id="4458462641685292929">Google Chrome वर दुसरे ऑपरेशन प्रगतीपथावर आहे. कृपया नंतर पुन्हा प्रयत्न करा.</translation> <translation id="4480040274068703980">साइन इन करण्यात त्रुटीमुळे Chrome OS आपला डेटा संकालित करू शकले नाही.</translation> <translation id="4561051373932531560">Google Chrome आपल्याला वेबवरील फोन नंबर क्लिक करू देते आणि त्या नंबरवर Skype द्वारा कॉल करू देते!</translation> @@ -157,7 +154,6 @@ <translation id="495931528404527476">Chrome मध्ये</translation> <translation id="4990567037958725628">Google Chrome कॅनरी</translation> <translation id="5028489144783860647">Google Chrome आपला डेटा संकालित करू शकले नाही. कृपया आपला संकालन वाक्यांश अपडेट करा.</translation> -<translation id="5037239767309817516">कृपया सर्व Google Chrome विंडो बंद करा आणि हा बदल प्रभावी करण्यासाठी त्या पुन्हा लाँच करा.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome एका तासामध्ये रीलाँच होईल}one{Chrome # तासामध्ये रीलाँच होईल}other{Chrome # तासांमध्ये रीलाँच होईल}}</translation> <translation id="5132929315877954718">Google Chrome साठी उत्कृष्ट अॅप, खेळ, विस्तार आणि थीम शोधा.</translation> <translation id="5166975452760862670">Google Chrome या भाषेत प्रदर्शित केले आहे</translation> @@ -184,7 +180,6 @@ <translation id="5877064549588274448">चॅनेल बदलले. बदल लागू करण्यासाठी आपले डिव्हाइस रीस्टार्ट करा.</translation> <translation id="5895138241574237353">रीस्टार्ट करा</translation> <translation id="5906655207909574370">अद्ययावत करणे जवळजवळ पूर्ण झाले! अपडेट करणे समाप्त करण्यासाठी आपले डिव्हाइस रीस्टार्ट करा.</translation> -<translation id="5931853610562009806">Mac वर, पासवर्ड हे आपल्या किचेनमध्ये सेव्ह केले जातात आणि हे OS X खाते सामायिक करून इतर Chrome वापरकर्त्यांकडून त्यामध्ये प्रवेश केला जाऊ शकतो किंवा संकालित केले जाऊ शकतात.</translation> <translation id="5940385492829620908">आपले वेब, बुकमार्क आणि अन्य Chrome सामग्री येथे थेट आहे.</translation> <translation id="5941830788786076944">Google Chromeला डीफॉल्ट ब्राउझर बनवा</translation> <translation id="6014844626092547096">आपण आता Chrome वर साइन इन आहात! आपल्या प्रशासकाद्वारे संकालन अक्षम केले गेले आहे.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb index 565e60d..8476b70 100644 --- a/chrome/app/resources/google_chrome_strings_ms.xtb +++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome sudah usang</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome akan dilancarkan semula dalam masa seminit}other{Chrome akan dilancarkan semula dalam masa # minit}}</translation> <translation id="2063848847527508675">OS Chrome perlu dimulakan semula untuk melaksanakan kemas kini.</translation> -<translation id="2077129598763517140">Gunakan pecutan perkakasan apabila tersedia</translation> <translation id="2084710999043359739">Tambahkan pada Chrome</translation> <translation id="2094919256425865063">Keluar daripada Chrome juga?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome akan dilancarkan semula sekarang}=1{Chrome akan dilancarkan semula dalam masa sesaat}other{Chrome akan dilancarkan semula dalam masa # saat}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Paut data Chrome anda ke akaun ini?</translation> <translation id="4251625577313994583">dapatkan Chrome pada iPhone anda</translation> <translation id="4293420128516039005">Log masuk untuk menyegerakkan dan memperibadikan Chrome pada semua peranti anda</translation> -<translation id="4309555186815777032">(memerlukan Chrome <ph name="BEGIN_BUTTON" />mula semula<ph name="END_BUTTON" />)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">OS Chrome</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> telah ditambahkan pada Chrome</translation> <translation id="4407807842708586359">OS Google Chrome</translation> -<translation id="4458285410772214805">Sila log keluar dan log masuk semula supaya perubahan ini boleh dilaksanakan.</translation> <translation id="4458462641685292929">Terdapat operasi lain sedang dijalankan pada Google Chrome. Sila cuba sebentar lagi.</translation> <translation id="4480040274068703980">OS Chrome tidak dapat menyegerakkan data anda disebabkan oleh ralat melog masuk.</translation> <translation id="4561051373932531560">Google Chrome membolehkan anda mengklik nombor telefon pada web dan menghubunginya dengan Skype!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">Dalam Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome tidak dapat menyegerakkan data anda. Sila kemas kini frasa laluan Segerak anda.</translation> -<translation id="5037239767309817516">Sila tutup semua tetingkap dan lancarkannya semula untuk perubahan ini berkesan.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome akan dilancarkan semula dalam masa sejam}other{Chrome akan dilancarkan semula dalam masa # jam}}</translation> <translation id="5132929315877954718">Temui apl, permainan, sambungan dan tema hebat untuk Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome dipaparkan dalam bahasa ini</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">Saluran berubah. Mulakan semula peranti anda untuk menggunakan perubahan.</translation> <translation id="5895138241574237353">Mulakan Semula</translation> <translation id="5906655207909574370">Hampir terkini! Mulakan semula peranti anda untuk menyelesaikan kemas kini.</translation> -<translation id="5931853610562009806">Pada Mac, kata laluan boleh disimpan pada Keychain anda dan boleh diakses atau disegerakkan oleh pengguna Chrome lain yang berkongsi akaun OS X ini.</translation> <translation id="5940385492829620908">Web, penanda halaman dan barangan Chrome anda yang lain tinggal di sini.</translation> <translation id="5941830788786076944">Jadikan Google Chrome penyemak imbas lalai</translation> <translation id="6014844626092547096">Anda sedang dilog masuk ke Chrome! Penyegerakan dilumpuhkan oleh pentadbir anda.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb index 29b32075..b2e91de2 100644 --- a/chrome/app/resources/google_chrome_strings_nl.xtb +++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Chrome is verouderd</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome wordt over één minuut opnieuw gestart}other{Chrome wordt over # minuten opnieuw gestart}}</translation> <translation id="2063848847527508675">Chrome OS moet opnieuw worden gestart om de update toe te passen.</translation> -<translation id="2077129598763517140">Hardwareversnelling gebruiken indien beschikbaar</translation> <translation id="2084710999043359739">Toevoegen aan Chrome</translation> <translation id="2094919256425865063">Chrome toch sluiten?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome wordt nu opnieuw gestart}=1{Chrome wordt over één seconde opnieuw gestart}other{Chrome wordt over # seconden opnieuw gestart}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">Wil je je Chrome-gegevens aan dit account koppelen?</translation> <translation id="4251625577313994583">Download Chrome naar je iPhone</translation> <translation id="4293420128516039005">Log in om Chrome op al je apparaten te synchroniseren en te personaliseren</translation> -<translation id="4309555186815777032">(je moet Chrome <ph name="BEGIN_BUTTON" />opnieuw starten<ph name="END_BUTTON" />)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> is toegevoegd aan Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Log uit en log weer in om deze wijziging door te voeren.</translation> <translation id="4458462641685292929">Er wordt een andere bewerking in Google Chrome uitgevoerd. Probeer het later opnieuw.</translation> <translation id="4480040274068703980">Chrome OS kan je gegevens niet synchroniseren door een fout tijdens het inloggen.</translation> <translation id="4561051373932531560">Met Google Chrome kun je klikken op een telefoonnummer op internet om dit via Skype te bellen!</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">In Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome kan je gegevens niet synchroniseren. Update je synchronisatiewachtwoord.</translation> -<translation id="5037239767309817516">Sluit alle Google Chrome-vensters en start Google Chrome opnieuw om deze wijziging door te voeren.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome wordt over een uur opnieuw gestart}other{Chrome wordt over # uur opnieuw gestart}}</translation> <translation id="5132929315877954718">Ontdek fantastische apps, games, extensies en thema's voor Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome wordt weergegeven in deze taal</translation> @@ -185,7 +181,6 @@ <translation id="5877064549588274448">Kanaal gewijzigd. Start het apparaat opnieuw op om de wijzigingen door te voeren.</translation> <translation id="5895138241574237353">Opnieuw starten</translation> <translation id="5906655207909574370">Updaten bijna voltooid. Start je apparaat opnieuw op om de update te voltooien.</translation> -<translation id="5931853610562009806">Wachtwoorden kunnen op de Mac worden opgeslagen in je sleutelhanger en worden geopend of gesynchroniseerd door andere Chrome-gebruikers die dit OS X-account delen.</translation> <translation id="5940385492829620908">Hier vind je internet, bladwijzers en andere Chrome-instellingen.</translation> <translation id="5941830788786076944">Google Chrome instellen als mijn standaardbrowser</translation> <translation id="6014844626092547096">Je bent nu ingelogd bij Chrome! Synchronisatie is uitgeschakeld door je beheerder.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb index 7ecf613..77499ba1 100644 --- a/chrome/app/resources/google_chrome_strings_no.xtb +++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome er utdatert</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome starter på nytt om 1 minutt}other{Chrome starter på nytt om # minutter}}</translation> <translation id="2063848847527508675">Chrome OS må startes på nytt for at oppdateringen skal tas i bruk.</translation> -<translation id="2077129598763517140">Bruk maskinvareakselerasjon når det er tilgjengelig</translation> <translation id="2084710999043359739">Legg til i Chrome</translation> <translation id="2094919256425865063">Vil du avslutte Chrome likevel?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome starter på nytt nå}=1{Chrome starter på nytt om 1 sekund}other{Chrome starter på nytt om # sekunder}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Vil du koble Chrome-dataene dine til denne kontoen?</translation> <translation id="4251625577313994583">få Chrome på iPhone</translation> <translation id="4293420128516039005">Logg på for å synkronisere og gi Chrome et personlig preg på alle enhetene dine</translation> -<translation id="4309555186815777032">(krever at Chrome <ph name="BEGIN_BUTTON" />startes på nytt<ph name="END_BUTTON" />)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS – inn)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> er lagt til i Chrome</translation> <translation id="4407807842708586359">Google Chromes operativsystem</translation> -<translation id="4458285410772214805">Logg deg av og så på igjen for at denne endringen skal tre i kraft.</translation> <translation id="4458462641685292929">En annen handling er i gang på Google Chrome. Prøv på nytt senere.</translation> <translation id="4480040274068703980">Chrome OS kunne ikke synkronisere dataene dine på grunn av en feil under pålogging.</translation> <translation id="4561051373932531560">Med Google Chrome kan du klikke på et telefonnummer på Internett og ringe ved bruk av Skype!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">I Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome kunne ikke synkronisere dataene dine. Oppdater passordfrasen for synkronisering.</translation> -<translation id="5037239767309817516">For at endringen skal tre i kraft, må du lukke alle vinduer og starte Google Chrome på nytt.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome startes på nytt om én time}other{Chrome startes på nytt om # timer}}</translation> <translation id="5132929315877954718">Oppdag flotte apper, spill, utvidelser og temaer for Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome vises på dette språket</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">Kanalen ble endret. Start enheten på nytt for å aktivere endringene.</translation> <translation id="5895138241574237353">Start på nytt</translation> <translation id="5906655207909574370">Nå er oppdateringen snart ferdig! Start enheten på nytt for å fullføre oppdateringen.</translation> -<translation id="5931853610562009806">På Mac kan det hende at passord blir lagret i nøkkelringen. Andre Chrome-brukere som deler denne OS X-kontoen, har i så fall adgang til og kan synkronisere med disse passordene.</translation> <translation id="5940385492829620908">Her finner du nettinnholdet, bokmerkene og de andre Chrome-tingene dine.</translation> <translation id="5941830788786076944">Gjør Google Chrome til standardleser</translation> <translation id="6014844626092547096">Du er nå logget på Chrome. Synkronisering er deaktivert av administratoren din.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb index 59ca3740..f380d71 100644 --- a/chrome/app/resources/google_chrome_strings_pl.xtb +++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome jest nieaktualny</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome uruchomi się ponownie za minutę}few{Chrome uruchomi się ponownie za # minuty}many{Chrome uruchomi się ponownie za # minut}other{Chrome uruchomi się ponownie za # minuty}}</translation> <translation id="2063848847527508675">Żeby system operacyjny Chrome mógł zastosować aktualizacje, musisz go ponownie uruchomić.</translation> -<translation id="2077129598763517140">Użyj akceleracji sprzętowej, gdy jest dostępna</translation> <translation id="2084710999043359739">Dodaj do Chrome</translation> <translation id="2094919256425865063">Zamknąć Chrome mimo to?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome uruchomi się ponownie teraz}=1{Chrome uruchomi się ponownie za sekundę}few{Chrome uruchomi się ponownie za # sekundy}many{Chrome uruchomi się ponownie za # sekund}other{Chrome uruchomi się ponownie za # sekundy}}</translation> @@ -125,13 +124,11 @@ <translation id="4251615635259297716">Połączyć Twoje dane Chrome z tym kontem?</translation> <translation id="4251625577313994583">pobierz Chrome na iPhone'a</translation> <translation id="4293420128516039005">Zaloguj się, by synchronizować dane Chrome i korzystać z własnych ustawień przeglądarki na wielu urządzeniach</translation> -<translation id="4309555186815777032">(wymaga <ph name="BEGIN_BUTTON" />ponownego uruchomienia<ph name="END_BUTTON" /> Chrome)</translation> <translation id="4328355335528187361">Wersja deweloperska Google Chrome (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS </translation> <translation id="4343195214584226067">Rozszerzenie <ph name="EXTENSION_NAME" /> zostało dodane do Chrome</translation> <translation id="4407807842708586359">System operacyjny Google Chrome</translation> -<translation id="4458285410772214805">Wyloguj się i zaloguj ponownie, by zmiana zaczęła obowiązywać.</translation> <translation id="4458462641685292929">Google Chrome wykonuje teraz inną operację. Spróbuj ponownie później.</translation> <translation id="4480040274068703980">System operacyjny Chrome nie może zsynchronizować danych z powodu błędu logowania.</translation> <translation id="4561051373932531560">W przeglądarce Google Chrome możesz kliknąć numer telefonu zamieszczony w sieci i zadzwonić na niego za pośrednictwem usługi Skype!</translation> @@ -156,7 +153,6 @@ <translation id="495931528404527476">W Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome nie może zsynchronizować danych. Zaktualizuj hasło synchronizacji.</translation> -<translation id="5037239767309817516">Zamknij wszystkie okna przeglądarki Google Chrome i uruchom ją ponownie, aby zastosować zmiany.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome uruchomi się ponownie za godzinę}few{Chrome uruchomi się ponownie za # godziny}many{Chrome uruchomi się ponownie za # godzin}other{Chrome uruchomi się ponownie za # godziny}}</translation> <translation id="5132929315877954718">Odkryj znakomite aplikacje, gry, rozszerzenia i motywy do przeglądarki Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome działa obecnie w tym języku</translation> @@ -180,7 +176,6 @@ <translation id="5877064549588274448">Kanał został zmieniony. Aby zastosować zmiany, uruchom ponownie urządzenie.</translation> <translation id="5895138241574237353">Uruchom ponownie</translation> <translation id="5906655207909574370">Już prawie gotowe. Uruchom ponownie urządzenie, by zakończyć aktualizację.</translation> -<translation id="5931853610562009806">Na Macach hasła można zapisywać w pęku kluczy. Inni użytkownicy Chrome dzielący to konto OS X mogą z nich korzystać i je synchronizować.</translation> <translation id="5940385492829620908">Tu są Twoje strony, zakładki i inne dane z Chrome.</translation> <translation id="5941830788786076944">Ustaw Google Chrome jako domyślną przeglądarkę</translation> <translation id="6014844626092547096">Jesteś zalogowany w Chrome. Administrator wyłączył synchronizację.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb index 31e955b..7900630 100644 --- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">O Google Chrome está desatualizado</translation> <translation id="2007150628464581396">{0,plural, =1{O Chrome será reiniciado em 1 minuto}one{O Chrome será reiniciado em # minuto}other{O Chrome será reiniciado em # minutos}}</translation> <translation id="2063848847527508675">É necessário reiniciar o Chrome OS para aplicar a atualização.</translation> -<translation id="2077129598763517140">Usar aceleração de hardware quando disponível</translation> <translation id="2084710999043359739">Adicionar ao Google Chrome</translation> <translation id="2094919256425865063">Sair do Chrome mesmo assim?</translation> <translation id="210890598424854131">{0,plural, =0{O Chrome será reiniciado agora}=1{O Chrome será reiniciado em 1 segundo}one{O Chrome será reiniciado em # segundo}other{O Chrome será reiniciado em # segundos}}</translation> @@ -125,13 +124,11 @@ <translation id="4251615635259297716">Vincular seus dados do Google Chrome a esta conta?</translation> <translation id="4251625577313994583">use o Chrome no seu iPhone</translation> <translation id="4293420128516039005">Faça login para sincronizar e personalizar o Chrome em todos os seus dispositivos</translation> -<translation id="4309555186815777032">(requer a <ph name="BEGIN_BUTTON" />reinicialização<ph name="END_BUTTON" /> do Google Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS </translation> <translation id="4343195214584226067">A extensão <ph name="EXTENSION_NAME" /> foi adicionada ao Chrome</translation> <translation id="4407807842708586359">Sistema operacional (OS) do Google Chrome</translation> -<translation id="4458285410772214805">Saia e faça login novamente para que esta alteração entre em vigor.</translation> <translation id="4458462641685292929">Outra operação está em andamento no Google Chrome. Tente novamente mais tarde.</translation> <translation id="4480040274068703980">O Chrome OS não pôde sincronizar seus dados devido a um erro durante o login.</translation> <translation id="4561051373932531560">O Google Chrome permite que você clique em um número de telefone na web e ligue para ele com o Skype!</translation> @@ -156,7 +153,6 @@ <translation id="495931528404527476">No Google Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">O Google Chrome não pôde sincronizar seus dados. Atualize sua senha de sincronização.</translation> -<translation id="5037239767309817516">Feche todas as janelas do Google Chrome e reinicie-o para que essa alteração entre em vigor.</translation> <translation id="5131923704757666404">{0,plural, =1{O Chrome será reiniciado em 1 hora}one{O Chrome será reiniciado em # hora}other{O Chrome será reiniciado em # horas}}</translation> <translation id="5132929315877954718">Descubra ótimos aplicativos, jogos, extensões e temas para o Google Chrome.</translation> <translation id="5166975452760862670">O Google Chrome é exibido neste idioma</translation> @@ -180,7 +176,6 @@ <translation id="5877064549588274448">Canal alterado. Reinicie o dispositivo para aplicar as alterações.</translation> <translation id="5895138241574237353">Reiniciar</translation> <translation id="5906655207909574370">Atualização quase concluída. Reinicie o dispositivo para concluí-la.</translation> -<translation id="5931853610562009806">No Mac, as senhas podem ser salvas no seu Keychain e acessadas ou sincronizadas por outros usuários do Google Chrome que compartilhem essa conta OS X.</translation> <translation id="5940385492829620908">Sua Web, seus favoritos e demais conteúdo do Chrome estão aqui.</translation> <translation id="5941830788786076944">Fazer do Google Chrome o navegador padrão</translation> <translation id="6014844626092547096">Agora, você está conectado ao Google Chrome. A sincronização está desativada por seu administrador.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb index c497acc..7ca8301 100644 --- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">O Chrome está desatualizado</translation> <translation id="2007150628464581396">{0,plural, =1{O Chrome será reiniciado dentro de 1 minuto}other{O Chrome será reiniciado dentro de # minutos}}</translation> <translation id="2063848847527508675">O Chrome OS tem de ser reiniciado para aplicar a atualização.</translation> -<translation id="2077129598763517140">Utilizar aceleração de hardware sempre que estiver disponível</translation> <translation id="2084710999043359739">Adicionar ao Chrome</translation> <translation id="2094919256425865063">Pretende fechar o Chrome mesmo assim?</translation> <translation id="210890598424854131">{0,plural, =0{O Chrome será reiniciado agora}=1{O Chrome será reiniciado dentro de 1 segundo}other{O Chrome será reiniciado dentro de # segundos}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Associar os seus dados do Chrome a esta conta?</translation> <translation id="4251625577313994583">obtenha o Chrome no seu iPhone</translation> <translation id="4293420128516039005">Inicie sessão para sincronizar e personalizar o Chrome em todos os dispositivos.</translation> -<translation id="4309555186815777032">(é necessário <ph name="BEGIN_BUTTON" />reiniciar<ph name="END_BUTTON" /> o Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">A extensão <ph name="EXTENSION_NAME" /> foi adicionada ao Chrome</translation> <translation id="4407807842708586359">SO do Google Chrome</translation> -<translation id="4458285410772214805">Termine sessão e volte a iniciar sessão para que esta alteração tenha efeito.</translation> <translation id="4458462641685292929">Está em curso outra operação no Google Chrome. Tente novamente mais tarde.</translation> <translation id="4480040274068703980">O Chrome OS não conseguiu sincronizar os dados devido a um erro no início de sessão.</translation> <translation id="4561051373932531560">O Google Chrome permite-lhe clicar num número de telefone na Web e fazer a chamada com o Skype!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">No Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">O Google Chrome não conseguiu sincronizar os dados. Atualize a frase de acesso da Sincronização.</translation> -<translation id="5037239767309817516">Feche todas as janelas do Google Chrome e reinicie-o para que esta alteração tenha efeito.</translation> <translation id="5131923704757666404">{0,plural, =1{O Chrome será reiniciado dentro de uma hora}other{O Chrome será reiniciado dentro de # horas}}</translation> <translation id="5132929315877954718">Descubra fantásticas aplicações, jogos, extensões e temas para o Google Chrome.</translation> <translation id="5166975452760862670">O Google Chrome é apresentado neste idioma</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">Canal alterado. Reinicie o dispositivo para aplicar as alterações.</translation> <translation id="5895138241574237353">Reiniciar</translation> <translation id="5906655207909574370">Quase atualizado! Reinicie o dispositivo para concluir a atualização.</translation> -<translation id="5931853610562009806">No Mac, as palavras-passe podem ser guardadas no Porta-chaves e podem ser sincronizadas ou acedidas por outros utilizadores do Chrome que partilhem esta conta do OS X.</translation> <translation id="5940385492829620908">A sua Web, os seus marcadores e os seus outros itens do Chrome estão aqui.</translation> <translation id="5941830788786076944">Tornar o Google Chrome no browser padrão.</translation> <translation id="6014844626092547096">Tem agora sessão iniciada no Chrome! A sincronização foi desativada pelo seu gestor.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb index 03d75c7..9ac54ef 100644 --- a/chrome/app/resources/google_chrome_strings_ro.xtb +++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome nu este actualizat</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome se va relansa într-un minut}few{Chrome se va relansa în # minute}other{Chrome se va relansa în # de minute}}</translation> <translation id="2063848847527508675">Pentru a se aplica actualizarea, sistemul de operare Chrome trebuie să fie repornit.</translation> -<translation id="2077129598763517140">Utilizează accelerarea hardware când este disponibilă</translation> <translation id="2084710999043359739">Adaugă în Chrome</translation> <translation id="2094919256425865063">Ieși din Chrome oricum?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome se va relansa acum}=1{Chrome se va relansa într-o secundă}few{Chrome se va relansa în # secunde}other{Chrome se va relansa în # de secunde}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Vă conectați datele Chrome cu acest cont?</translation> <translation id="4251625577313994583">descarcă Chrome pe iPhone</translation> <translation id="4293420128516039005">Conectează-te pentru a sincroniza și a personaliza Chrome pe toate dispozitivele</translation> -<translation id="4309555186815777032">(necesită <ph name="BEGIN_BUTTON" />repornirea<ph name="END_BUTTON" /> Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Sistemul de operare Chrome</translation> <translation id="4343195214584226067">Extensia <ph name="EXTENSION_NAME" /> a fost adăugată la Chrome</translation> <translation id="4407807842708586359">Sistemul de operare Google Chrome</translation> -<translation id="4458285410772214805">Pentru ca modificarea să fie aplicată, deconectați-vă și conectați-vă din nou.</translation> <translation id="4458462641685292929">O altă operație din Google Chrome este în curs de desfășurare. Încearcă din nou mai târziu.</translation> <translation id="4480040274068703980">Sistemul de operare Chrome nu a putut sincroniza datele din cauza unei erori la conectare.</translation> <translation id="4561051373932531560">Cu Google Chrome, poți să dai clic pe un număr de telefon de pe web pentru a-l apela cu Skype!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">În Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome nu a putut sincroniza datele. Actualizați expresia de acces pentru sincronizare.</translation> -<translation id="5037239767309817516">Pentru ca această modificare să aibă efect, închide toate ferestrele Google Chrome și repornește-l.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome se va relansa într-o oră}few{Chrome se va relansa în # ore}other{Chrome se va relansa în # de ore}}</translation> <translation id="5132929315877954718">Descoperă aplicații, jocuri, extensii și teme extraordinare pentru Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome este afișat în această limbă</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">Canalul a fost schimbat. Reporniți dispozitivul pentru a aplica modificările.</translation> <translation id="5895138241574237353">Reîncepe</translation> <translation id="5906655207909574370">Aproape actualizat! Repornește dispozitivul pentru a finaliza actualizarea.</translation> -<translation id="5931853610562009806">Pe Mac, parolele pot fi salvate în aplicația Keychain și pot fi accesate sau sincronizate de alți utilizatori Chrome care folosesc același cont de OS X.</translation> <translation id="5940385492829620908">Experiența web personalizată, marcajele și celelalte date Chrome chiar aici.</translation> <translation id="5941830788786076944">Setează Google Chrome ca browser prestabilit</translation> <translation id="6014844626092547096">Sunteți conectat(ă) la Chrome! Sincronizarea este dezactivată de administrator.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb index 3acd538e..003d01dd 100644 --- a/chrome/app/resources/google_chrome_strings_ru.xtb +++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Версия Chrome устарела</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome перезапустится через 1 минуту}one{Chrome перезапустится через # минуту}few{Chrome перезапустится через # минуты}many{Chrome перезапустится через # минут}other{Chrome перезапустится через # минуты}}</translation> <translation id="2063848847527508675">Перезагрузите Chrome OS, чтобы установить обновление.</translation> -<translation id="2077129598763517140">Использовать аппаратное ускорение (при наличии)</translation> <translation id="2084710999043359739">Установить</translation> <translation id="2094919256425865063">Завершить работу Chrome?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome перезапускается}=1{Chrome перезапустится через 1 секунду}one{Chrome перезапустится через # секунду}few{Chrome перезапустится через # секунды}many{Chrome перезапустится через # секунд}other{Chrome перезапустится через # секунды}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Связать данные Chrome с этим аккаунтом?</translation> <translation id="4251625577313994583">скачайте Chrome для iOS</translation> <translation id="4293420128516039005">Войдите, чтобы синхронизировать данные Chrome на всех устройствах</translation> -<translation id="4309555186815777032">(необходимо <ph name="BEGIN_BUTTON" />перезапустить<ph name="END_BUTTON" /> Chrome)</translation> <translation id="4328355335528187361">Google Chrome для разработчиков (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">Расширение "<ph name="EXTENSION_NAME" />" установлено</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Чтобы изменения вступили в силу, выполните вход еще раз.</translation> <translation id="4458462641685292929">Google Chrome выполняет другую операцию. Повторите попытку позже.</translation> <translation id="4480040274068703980">Не удалось синхронизировать данные из-за ошибки входа в аккаунт.</translation> <translation id="4561051373932531560">В Google Chrome вы можете нажать на любой номер телефона и позвонить на него через Skype!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">В Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome не удалось синхронизировать данные. Обновите кодовую фразу в Sync.</translation> -<translation id="5037239767309817516">Чтобы изменения вступили в силу, закройте все окна Google Chrome и перезапустите браузер.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome перезапустится через 1 час}one{Chrome перезапустится через # час}few{Chrome перезапустится через # часа}many{Chrome перезапустится через # часов}other{Chrome перезапустится через # часа}}</translation> <translation id="5132929315877954718">Широкий выбор приложений, игр, расширений и тем для Google Chrome.</translation> <translation id="5166975452760862670">Этот язык сейчас используется в Google Chrome</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">Канал изменен. Чтобы изменения вступили в силу, перезапустите устройство.</translation> <translation id="5895138241574237353">Перезапустить</translation> <translation id="5906655207909574370">Чтобы завершить обновление, перезапустите устройство.</translation> -<translation id="5931853610562009806">Если пароли на Mac сохраняются с помощью функции "Связка ключей", их могут просматривать и синхронизировать все пользователи Chrome, у которых есть доступ к этому аккаунту OS X.</translation> <translation id="5940385492829620908">Все веб-страницы, закладки и другие данные Chrome можно найти здесь.</translation> <translation id="5941830788786076944">Назначить Google Chrome браузером по умолчанию</translation> <translation id="6014844626092547096">Добро пожаловать в Chrome! Синхронизация отключена администратором.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index 7285dbf..bf06b302 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -42,7 +42,6 @@ <translation id="1877026089748256423">Prehliadač Chrome je zastaraný</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome sa reštartuje o 1 minútu}few{Chrome sa reštartuje o # minúty}many{Chrome sa reštartuje o # minúty}other{Chrome sa reštartuje o # minút}}</translation> <translation id="2063848847527508675">Ak chcete uplatniť aktualizáciu, musíte reštartovať systém Chrome OS.</translation> -<translation id="2077129598763517140">Používať hardvérovú akceleráciu (keď je dostupná)</translation> <translation id="2084710999043359739">Pridať do prehliadača Chrome</translation> <translation id="2094919256425865063">Chcete Chrome napriek tomu ukončiť?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome sa teraz reštartuje}=1{Chrome sa reštartuje o 1 sekundu}few{Chrome sa reštartuje o # sekundy}many{Chrome sa reštartuje o # sekundy}other{Chrome sa reštartuje o # sekúnd}}</translation> @@ -127,12 +126,10 @@ <translation id="4251615635259297716">Chcete prepojiť údaje prehliadača Chrome s týmto účtom?</translation> <translation id="4251625577313994583">získať Chrome na zariadení iPhone</translation> <translation id="4293420128516039005">Po prihlásení budete môcť Chrome synchronizovať a prispôsobiť v rôznych zariadeniach.</translation> -<translation id="4309555186815777032">(vyžaduje <ph name="BEGIN_BUTTON" />reštartovanie<ph name="END_BUTTON" /> prehliadača Chrome)</translation> <translation id="4328355335528187361">Google Chrome verzie pre vývojárov (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">Rozšírenie <ph name="EXTENSION_NAME" /> bolo pridané do Chromu</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Ak chcete, aby sa zmeny prejavili, odhláste sa a znova sa prihláste.</translation> <translation id="4458462641685292929">V prehliadači Google Chrome práve prebieha ďalšia operácia. Skúste to znova neskôr.</translation> <translation id="4480040274068703980">Systému OS Chrome sa nepodarilo synchronizovať vaše údaje, pretože sa pri prihlasovaní vyskytla chyba.</translation> <translation id="4561051373932531560">Prehliadač Google Chrome vám umožňuje vybrať telefónne číslo na webe a zavolať naň pomocou aplikácie Skype.</translation> @@ -157,7 +154,6 @@ <translation id="495931528404527476">V prehliadači Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Prehliadaču Google Chrome sa nepodarilo synchronizovať vaše údaje. Aktualizujte prístupovú frázu synchronizácie.</translation> -<translation id="5037239767309817516">Táto zmena sa prejaví po zavretí všetkých okien prehliadača Google Chrome a jeho opätovnom spustení.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome sa znova spustí o hodinu}few{Chrome sa znova spustí o # hodiny}many{Chrome sa znova spustí o # hodiny}other{Chrome sa znova spustí o # hodín}}</translation> <translation id="5132929315877954718">Objavte skvelé aplikácie, hry, rozšírenia a motívy pre prehliadač Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome sa zobrazuje v tomto jazyku</translation> @@ -185,7 +181,6 @@ <translation id="5877064549588274448">Kanál sa zmenil. Ak chcete zmeny použiť, reštartujte zariadenie.</translation> <translation id="5895138241574237353">Reštartovať</translation> <translation id="5906655207909574370">Aktualizácia je takmer hotová! Dokončite ju reštartovaním zariadenia.</translation> -<translation id="5931853610562009806">Na počítačoch Mac sa heslá môžu ukladať do aplikácie Keychain. Ostatní používatelia prehliadača Chrome, ktorí zdieľajú tento účet systému OS X, k nim môžu pristupovať a môžu ich synchronizovať.</translation> <translation id="5940385492829620908">Tu nájdete svoj obsah na webe, záložky a ďalšie položky prehliadača Chrome.</translation> <translation id="5941830788786076944">Nastaviť prehľadávač Google Chrome ako predvolený</translation> <translation id="6014844626092547096">Prihlásili ste sa do prehliadača Chrome. Synchronizácia je ale zakázaná administrátorom.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index a8027c0f..4d50368 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Chrome je zastarel</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome se bo znova zagnal čez 1 minuto}one{Chrome se bo znova zagnal čez # minuto}two{Chrome se bo znova zagnal čez # minuti}few{Chrome se bo znova zagnal čez # minute}other{Chrome se bo znova zagnal čez # minut}}</translation> <translation id="2063848847527508675">Če želite namestiti posodobitev, morate znova zagnati OS Chrome.</translation> -<translation id="2077129598763517140">Uporabi strojno pospeševanje, če je na voljo</translation> <translation id="2084710999043359739">Dodaj v Chrome</translation> <translation id="2094919256425865063">Želite vseeno zapreti Chrome?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome se bo zdaj znova zagnal}=1{Chrome se bo znova zagnal čez 1 sekundo}one{Chrome se bo znova zagnal čez # sekundo}two{Chrome se bo znova zagnal čez # sekundi}few{Chrome se bo znova zagnal čez # sekunde}other{Chrome se bo znova zagnal čez # sekund}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">Želite svoje podatke v Chromu povezati s tem računom?</translation> <translation id="4251625577313994583">prenesite Chrome v iPhone</translation> <translation id="4293420128516039005">Prijavite se, da boste lahko Chrome sinhronizirali in prilagodili v vseh svojih napravah</translation> -<translation id="4309555186815777032">(zahteva <ph name="BEGIN_BUTTON" />vnovični zagon<ph name="END_BUTTON" /> Chroma)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">Razširitev <ph name="EXTENSION_NAME" /> je dodana v Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Odjavite se in znova prijavite, da bodo te spremembe začele veljati.</translation> <translation id="4458462641685292929">Poteka druga operacija v Google Chromu. Poskusite znova pozneje.</translation> <translation id="4480040274068703980">Chrome OS ni mogel sinhronizirati podatkov zaradi napake pri prijavi.</translation> <translation id="4561051373932531560">Google Chrome vam omogoča, da na spletu kliknete telefonsko številko in jo pokličete prek Skypa.</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">V Chromu</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome ni mogel sinhronizirati podatkov. Posodobite geslo za sinhroniziranje.</translation> -<translation id="5037239767309817516">Zaprite vsa okna brskalnika Google Chrome in ga znova zaženite, da uveljavite spremembe.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome se bo znova zagnal čez eno uro}one{Chrome se bo znova zagnal čez # uro}two{Chrome se bo znova zagnal čez # uri}few{Chrome se bo znova zagnal čez # ure}other{Chrome se bo znova zagnal čez # ur}}</translation> <translation id="5132929315877954718">Odkrijte zanimive aplikacije, igre, razširitve in teme za Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome je v tem jeziku</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">Kanal spremenjen. Znova zaženite napravo, da uveljavite spremembe.</translation> <translation id="5895138241574237353">Znova zaženi</translation> <translation id="5906655207909574370">Samo še malo. Znova zaženite napravo, da dokončate posodobitev.</translation> -<translation id="5931853610562009806">V računalnikih Mac so gesla morda shranjena v orodju Keychain, pri čemer lahko do njih dostopajo ali jih sinhronizirajo drugi uporabniki Chroma, s katerimi si delite ta račun v sistemu OS X.</translation> <translation id="5940385492829620908">Tu so shranjeni vaš splet, zaznamki in druge stvari v Chromu.</translation> <translation id="5941830788786076944">Nastavi Google Chrome kot privzeti brskalnik</translation> <translation id="6014844626092547096">Zdaj ste prijavljeni v Chrome. Sinhronizacijo je onemogočil skrbnik.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb index f988d9e..dbb6fa3 100644 --- a/chrome/app/resources/google_chrome_strings_sr.xtb +++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Chrome је застарео</translation> <translation id="2007150628464581396">{0,plural, =1{Поново ћемо покренути Chrome за 1 минут}one{Поново ћемо покренути Chrome за # минут}few{Поново ћемо покренути Chrome за # минута}other{Поново ћемо покренути Chrome за # минута}}</translation> <translation id="2063848847527508675">Треба да рестартујете Chrome OS да бисте применили ажурирање.</translation> -<translation id="2077129598763517140">Користи хардверско убрзање када је доступно</translation> <translation id="2084710999043359739">Додавање у Chrome</translation> <translation id="2094919256425865063">Желите ли ипак да затворите Chrome?</translation> <translation id="210890598424854131">{0,plural, =0{Поново ћемо покренути Chrome}=1{Поново ћемо покренути Chrome за 1 секунду}one{Поново ћемо покренути Chrome за # секунду}few{Поново ћемо покренути Chrome за # секунде}other{Поново ћемо покренути Chrome за # секунди}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">Желите ли да повежете Chrome податке са овим налогом?</translation> <translation id="4251625577313994583">преузмите Chrome на iPhone</translation> <translation id="4293420128516039005">Пријавите се да бисте синхронизовали и персонализовали Chrome на свим уређајима</translation> -<translation id="4309555186815777032">(захтева <ph name="BEGIN_BUTTON" />поновно покретање<ph name="END_BUTTON" /> Chrome-а)</translation> <translation id="4328355335528187361">Програмерска верзија Google Chrome-а (mDNS-In)</translation> <translation id="4331809312908958774">Chrome ОС</translation> <translation id="4343195214584226067">Додатак <ph name="EXTENSION_NAME" /> је додат у Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Одјавите се и поново се пријавите да би ова промена ступила на снагу.</translation> <translation id="4458462641685292929">Друга радња у Google Chrome-у је у току. Пробајте поново касније.</translation> <translation id="4480040274068703980">Chrome ОС не може да синхронизује податке због грешке при пријављивању.</translation> <translation id="4561051373932531560">Google Chrome вам омогућава да кликнете на број телефона на вебу и да га позовете помоћу Skype-а!</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">У Chrome-у</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome не може да синхронизује податке. Ажурирајте приступну фразу за Синхронизацију.</translation> -<translation id="5037239767309817516">Затворите све прозоре Google Chrome прегледача и поново га покрените да би ова промена ступила на снагу.</translation> <translation id="5131923704757666404">{0,plural, =1{Поново ћемо покренути Chrome за један сат}one{Поново ћемо покренути Chrome за # сат}few{Поново ћемо покренути Chrome за # сата}other{Поново ћемо покренути Chrome за # сати}}</translation> <translation id="5132929315877954718">Откријте одличне апликације, игре, додатке и теме за Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome се приказује на овом језику</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">Канал је промењен. Покрените поново уређај да бисте применили промене.</translation> <translation id="5895138241574237353">Покрени поново</translation> <translation id="5906655207909574370">Ажурирање је скоро готово! Поново покрените уређај да бисте довршили ажурирање.</translation> -<translation id="5931853610562009806">На Mac-у лозинке могу да се чувају у Keychain и други корисници Chrome-а који деле овај ОС X налог могу да им приступају или да их синхронизују.</translation> <translation id="5940385492829620908">Веб, обележивачи и други Chrome садржај се овде уживо приказују.</translation> <translation id="5941830788786076944">Подесите Google Chrome као подразумевани прегледач</translation> <translation id="6014844626092547096">Сада сте пријављени у Chrome! Администратор је онемогућио синхронизацију.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb index 50310f8..a27a1edc 100644 --- a/chrome/app/resources/google_chrome_strings_sv.xtb +++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Den här versionen av Chrome är inaktuell</translation> <translation id="2007150628464581396">{0,plural, =1{Om en minut startas Chrome om}other{Om # minuter startas Chrome om}}</translation> <translation id="2063848847527508675">Chrome OS måste startas om för att uppdateringen ska börja gälla.</translation> -<translation id="2077129598763517140">Använd maskinvaruacceleration när det är tillgängligt</translation> <translation id="2084710999043359739">Lägg till i Chrome</translation> <translation id="2094919256425865063">Vill du avsluta Chrome ändå?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome startas om nu}=1{Om en sekund startas Chrome om}other{Om # sekunder startas Chrome om}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">Koppla dina uppgifter i Chrome till det här kontot</translation> <translation id="4251625577313994583">Ladda ned Chrome på iPhone</translation> <translation id="4293420128516039005">Genom att logga in kan du synkronisera och anpassa Chrome på alla enheter du använder</translation> -<translation id="4309555186815777032">(Chrome måste <ph name="BEGIN_BUTTON" />startas om<ph name="END_BUTTON" />)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-in)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> har lagts till i Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Den här ändringen träder inte i kraft förrän du loggat ut och sedan loggar in igen.</translation> <translation id="4458462641685292929">En annan process i Google Chrome pågår. Försök igen senare.</translation> <translation id="4480040274068703980">Det gick inte att synkronisera data med Chrome OS på grund av ett inloggningsfel.</translation> <translation id="4561051373932531560">I Google Chrome kan du klicka på ett telefonnummer på nätet och ringa det med Skype!</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">I Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome kunde inte synkronisera data. Uppdatera lösenfrasen för synkroniseringen.</translation> -<translation id="5037239767309817516">Stäng alla fönster i Google Chrome och starta om så att ändringen genomförs.</translation> <translation id="5131923704757666404">{0,plural, =1{Om en timme startas Chrome om}other{Om # timmar startas Chrome om}}</translation> <translation id="5132929315877954718">Upptäck fantastiska program, spel, tillägg och teman för Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome visas på det här språket</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">Kanalen har ändrats. Starta om enheten om du vill tillämpa ändringarna.</translation> <translation id="5895138241574237353">Starta om</translation> <translation id="5906655207909574370">Uppdateringen är nästan klar! Slutför den genom att starta om enheten.</translation> -<translation id="5931853610562009806">På Mac kan lösenord sparas i nyckelringen. Andra Chrome-användare som använder det här OS X-kontot kan komma åt lösenorden och synkronisera dem.</translation> <translation id="5940385492829620908">Här finns webben, bokmärken och allt annat du använder Chrome till.</translation> <translation id="5941830788786076944">Använd Google Chrome som standardwebbläsare</translation> <translation id="6014844626092547096">Nu är du inloggad på Chrome. Synkronisering har inaktiverats av administratören.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb index 4480024c..a65ac05 100644 --- a/chrome/app/resources/google_chrome_strings_sw.xtb +++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -44,7 +44,6 @@ <translation id="1877026089748256423">Toleo hili la Chrome limepitwa na wakati</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome itawaka upya baada ya dakika 1}other{Chrome itawaka upya baada ya dakika #}}</translation> <translation id="2063848847527508675">Mfumo wa Uendeshaji wa Chrome unahitaji kuzimwa na kuwashwa upya ili utumie sasisho.</translation> -<translation id="2077129598763517140">Tumia uongezaji kasi wa maunzi wakati unapatikana</translation> <translation id="2084710999043359739">Ongeza kwenye Chrome</translation> <translation id="2094919256425865063">Ungependa kufunga Chrome?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome itawaka upya sasa hivi}=1{Chrome itawaka upya baada ya sekunde 1}other{Chrome itawaka upya baada ya sekunde #}}</translation> @@ -129,12 +128,10 @@ <translation id="4251615635259297716">Ungependa kuunganisha data yako ya Chrome kwenye akaunti hii?</translation> <translation id="4251625577313994583">pata Chrome kwenye iPhone yako</translation> <translation id="4293420128516039005">Ingia katika akaunti ili usawazishe na uweke mapendeleo kwenye Chrome katika vifaa vyako vyote</translation> -<translation id="4309555186815777032">(inahitaji uanzishaji upya wa <ph name="BEGIN_BUTTON" />Chrome<ph name="END_BUTTON" />)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> imeongezwa kwenye Chrome</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Tafadhali toka na uingie tena ili mabadiliko haya yafanye kazi.</translation> <translation id="4458462641685292929">Kuna shughuli nyingine zinaendelea kwenye Google Chrome. Tafadhali jaribu tena baadaye.</translation> <translation id="4480040274068703980">Mfumo wa Uendeshaji wa Chrome haukuweza kusawazisha data yako kutokana na hitilafu wakati wa kuingia katika akaunti.</translation> <translation id="4561051373932531560">Google Chrome inakuwezesha kubofya nambari ya simu kwenye wavuti na kuipigia simu kwa Skype!</translation> @@ -159,7 +156,6 @@ <translation id="495931528404527476">Katika Chrome</translation> <translation id="4990567037958725628">Kanari ya Google Chrome</translation> <translation id="5028489144783860647">Google Chrome haikuweza kusawazisha data yako. Tafadhali sasisha kauli siri yako ya Usawazishaji.</translation> -<translation id="5037239767309817516">Tafadhali funga madirisha yote ya Google Chrome na uianzishe upya ili mabadiliko haya yatekelezwe.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome itaanza upya baada ya saa}other{Chrome itaanza upya baada ya saa #}}</translation> <translation id="5132929315877954718">Gundua programu, michezo, viendelezi na mandhari bora ya Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome inaonyeshwa katika lugha hii</translation> @@ -187,7 +183,6 @@ <translation id="5877064549588274448">Kituo kimebadilishwa. Zima na uwashe kifaa chako ili mabadiliko yaanze kutumika.</translation> <translation id="5895138241574237353">Zzima na uwashe</translation> <translation id="5906655207909574370">Inakaribia kukamilisha kusasishwa! Zima na uwashe kifaa chako ili ukamilishe kusasisha.</translation> -<translation id="5931853610562009806">Kwenye Mac, manenosiri yanaweza kuhifadhiwa kwenye Msururu wako wa kitufe na yanaweza kufikiwa au kusawazishwa na watumiaji wengine wa Chrome wanaoshiriki akaunti hii ya OS X.</translation> <translation id="5940385492829620908">Wavuti, alamisho, na vitu vyako vingine vya Chrome vinapatikana hapa.</translation> <translation id="5941830788786076944">Fanya Google Chrome iwe kivinjari chaguo-msingi</translation> <translation id="6014844626092547096">Sasa umeingia kwenye Chrome! Usawazishaji umezimwa na msimamizi wako.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb index 0a710bf7..64a0e67 100644 --- a/chrome/app/resources/google_chrome_strings_ta.xtb +++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome காலாவதியானது</translation> <translation id="2007150628464581396">{0,plural, =1{1 நிமிடத்தில் Chrome மீண்டும் தொடங்கும்}other{# நிமிடங்களில் Chrome மீண்டும் தொடங்கும்}}</translation> <translation id="2063848847527508675">புதுப்பிப்பைப் பயன்படுத்த, Chrome OSஐ மீண்டும் தொடங்க வேண்டும்.</translation> -<translation id="2077129598763517140">கிடைக்கும்போது வன்பொருளின் முடுக்கத்தைப் பயன்படுத்தவும்</translation> <translation id="2084710999043359739">Chrome இல் சேர்</translation> <translation id="2094919256425865063">Chrome இலிருந்து வெளியேறவா?</translation> <translation id="210890598424854131">{0,plural, =0{இப்போது Chrome மீண்டும் தொடங்கும்}=1{1 வினாடியில் Chrome மீண்டும் தொடங்கும்}other{# வினாடிகளில் Chrome மீண்டும் தொடங்கும்}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">உங்கள் Chrome தரவை இந்தக் கணக்குடன் இணைக்கவா?</translation> <translation id="4251625577313994583">iPhone இல் Chromeஐப் பெறுக</translation> <translation id="4293420128516039005">உங்கள் எல்லாச் சாதனங்களிலும் Chromeஐ ஒத்திசைக்க மற்றும் தனிப்பயனாக்க, உள்நுழையவும்</translation> -<translation id="4309555186815777032">(Chrome ஐ <ph name="BEGIN_BUTTON" />மறுதொடக்கம்<ph name="END_BUTTON" /> செய்வது அவசியம்)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> நீட்டிப்பு Chrome இல் சேர்க்கப்பட்டது</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">இந்த மாற்றம் செயல்பாட்டிற்கு வர, வெளியேறி, மீண்டும் உள்நுழைக.</translation> <translation id="4458462641685292929">Google Chrome இல் ஏற்கனவே ஒரு நிறுவி செயல்பாட்டில் உள்ளது. பிறகு முயலவும்.</translation> <translation id="4480040274068703980">உள்நுழைவதில் ஏற்பட்ட பிழைக் காரணமாக Chrome OS ஆல் உங்கள் தரவை ஒத்திசைக்க முடியவில்லை.</translation> <translation id="4561051373932531560">வலையில் ஒரு தொலைபேசி எண்ணைக் கிளிக் செய்து, அதனை Skype மூலமாக அழைப்பதற்கு உங்களை Google Chrome அனுமதிக்கிறது!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">Chrome இல்</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">உங்கள் தரவை Google Chrome ஆல் ஒத்திசைக்க முடியவில்லை. உங்கள் கடவுச்சொற்றொடரைப் புதுப்பிக்கவும்.</translation> -<translation id="5037239767309817516">இந்த மாற்றம் செயல்பட, எல்லா Google Chrome சாளரங்களையும் மூடி, அதை மீண்டும் தொடங்குக.</translation> <translation id="5131923704757666404">{0,plural, =1{ஒரு மணிநேரத்திற்குள் Chrome மீண்டும் தொடங்கும்}other{# மணிநேரத்திற்குள் Chrome மீண்டும் தொடங்கும்}}</translation> <translation id="5132929315877954718">Google Chrome க்கான சிறந்த பயன்பாடுகள், கேம்ஸ், நீட்டிப்புகள் மற்றும் தீம்களைக் கண்டறியவும்.</translation> <translation id="5166975452760862670">Google Chrome இந்த மொழியில் காட்டப்படுகிறது</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">சேனல் மாற்றப்பட்டது. மாற்றங்களைச் செயல்படுத்த உங்கள் சாதனத்தை மீண்டும் தொடங்கவும்.</translation> <translation id="5895138241574237353">மறுதொடக்கம்</translation> <translation id="5906655207909574370">கிட்டத்தட்ட புதுப்பிக்கப்பட்டது! புதுப்பிப்பதை முடிக்க, சாதனத்தை மறுதொடக்கம் செய்யவும்.</translation> -<translation id="5931853610562009806">Mac இல், கடவுச்சொற்கள் உங்கள் Keychain இல் சேமிக்கப்படலாம், இந்த OS X கணக்கைப் பகிரும் பிற Chrome பயனர்களால் அவற்றை அணுகவோ ஒத்திசைக்கவோ முடியும்.</translation> <translation id="5940385492829620908">உங்களின் இணையம், புத்தகக்குறிகள் மற்றும் பிற Chrome உருப்படிகள் இங்கே உள்ளன.</translation> <translation id="5941830788786076944">Google Chrome ஐ இயல்புநிலை உலாவியாக அமை</translation> <translation id="6014844626092547096">தற்போது Chrome இல் உள்நுழைந்துள்ளீர்கள்! உங்கள் நிர்வாகியால் ஒத்திசைவு முடக்கப்பட்டுள்ளது.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb index 68a2a6621..10d3ba8 100644 --- a/chrome/app/resources/google_chrome_strings_te.xtb +++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome కాలం చెల్లినది</translation> <translation id="2007150628464581396">{0,plural, =1{1 నిమిషంలో Chrome పునఃప్రారంభించబడుతుంది}other{# నిమిషాలలో Chrome పునఃప్రారంభించబడుతుంది}}</translation> <translation id="2063848847527508675">నవీకరణను వర్తింపజేయడానికి Chrome OSని పునఃప్రారంభించాలి.</translation> -<translation id="2077129598763517140">హార్డ్వేర్ త్వరితం అందుబాటులో ఉన్నప్పుడు ఉపయోగించు</translation> <translation id="2084710999043359739">Chromeకి జోడించు</translation> <translation id="2094919256425865063">ఏదేమైనా Chromeని మూసివేయాలా?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome ఇప్పుడు పునఃప్రారంభించబడుతుంది}=1{1 సెకనులో Chrome పునఃప్రారంభించబడుతుంది}other{# సెకన్లలో Chrome పునఃప్రారంభించబడుతుంది}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">మీ Chrome డేటాను ఈ ఖాతాకు జోడించాలా?</translation> <translation id="4251625577313994583">మీ iPhoneలో Chromeని పొందండి</translation> <translation id="4293420128516039005">మీ పరికరాల అంతటా Chromeని సమకాలీకరించడం మరియు వ్యక్తిగతీకరించడం కోసం సైన్ ఇన్ చేయండి</translation> -<translation id="4309555186815777032">(Chrome <ph name="BEGIN_BUTTON" />పునఃప్రారంభం<ph name="END_BUTTON" /> అవసరం)</translation> <translation id="4328355335528187361">Google Chrome డెవలపర్ (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">Chromeకు <ph name="EXTENSION_NAME" /> జోడించబడింది</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">దయచేసి ఈ మార్పు ప్రభావవంతం కావడానికి సైన్ అవుట్ చేసి, మళ్లీ సైన్ ఇన్ చేయండి.</translation> <translation id="4458462641685292929">Google Chromeలో మరొక వ్యవస్థాపన జరుగుతోంది. దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి.</translation> <translation id="4480040274068703980">సైన్ ఇన్ చేయడంలో లోపం సంభవించినందున Chrome OS మీ డేటాను సమకాలీకరించలేకపోయింది.</translation> <translation id="4561051373932531560">Google Chrome వెబ్లో మిమ్మళ్ని ఫోన్ నంబర్ క్లిక్ చెయ్యనిస్తుంది మరియు Skypeతో కాల్ చేస్తుంది!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">Chromeలో</translation> <translation id="4990567037958725628">Google Chrome కేనరీ</translation> <translation id="5028489144783860647">Google Chrome మీ డేటాను సమకాలీకరించలేకపోయింది. దయచేసి మీ సమకాలీకరణ రహస్య పదబంధాన్ని నవీకరించండి.</translation> -<translation id="5037239767309817516">దయచేసి ఈ మార్పు అమలులోకి రావడానికి అన్ని Google Chrome విండోలను మూసివేయండి మరియు దీన్ని మళ్ళీ ప్రారంభించండి.</translation> <translation id="5131923704757666404">{0,plural, =1{ఒక గంటలో Chrome తిరిగి ప్రారంభించబడుతుంది}other{# గంటల్లో Chrome తిరిగి ప్రారంభించబడుతుంది}}</translation> <translation id="5132929315877954718">Google Chrome కోసం గొప్ప అనువర్తనాలు, ఆటలు, పొడిగింపులు మరియు థీమ్లను కనుగొనండి.</translation> <translation id="5166975452760862670">Google Chrome ఈ భాషలో ప్రదర్శించబడుతోంది</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">ఛానెల్ మార్చబడింది. మార్పులను వర్తింపజేయడానికి మీ పరికరాన్ని పునఃప్రారంభించండి.</translation> <translation id="5895138241574237353">మళ్ళీ ప్రారంభించు</translation> <translation id="5906655207909574370">దాదాపు నవీకృతంగా ఉంది! నవీకరణను పూర్తి చేయడానికి మీ పరికరాన్ని పునఃప్రారంభించండి.</translation> -<translation id="5931853610562009806">Macలో, పాస్వర్డ్లు మీ కీచెయిన్కి సేవ్ చేయబడవచ్చు మరియు ఈ OS X ఖాతాను భాగస్వామ్యం చేసుకునే ఇతర Chrome వినియోగదారులు వాటిని ప్రాప్యత చేయవచ్చు లేదా సమకాలీకరించవచ్చు.</translation> <translation id="5940385492829620908">మీ వెబ్, బుక్మార్క్లు మరియు ఇతర Chrome అంశాలు ఇక్కడ చూపబడతాయి.</translation> <translation id="5941830788786076944">Google Chromeను డిఫాల్ట్ బ్రౌజర్గా చేసుకోండి</translation> <translation id="6014844626092547096">ఇప్పుడు మీరు Chromeకు సైన్ ఇన్ చేసారు! మీ నిర్వాహకులు సమకాలీకరణని నిలిపివేసారు.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb index f70da86..32e49a6 100644 --- a/chrome/app/resources/google_chrome_strings_th.xtb +++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome ล้าสมัย</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome จะเปิดขึ้นมาใหม่ใน 1 นาที}other{Chrome จะเปิดขึ้นมาใหม่ใน # นาที}}</translation> <translation id="2063848847527508675">ต้องรีสตาร์ท Chrome OS เพื่อใช้การอัปเดต</translation> -<translation id="2077129598763517140">ใช้การเร่งฮาร์ดแวร์เมื่อสามารถใช้ได้</translation> <translation id="2084710999043359739">เพิ่มลงใน Chrome</translation> <translation id="2094919256425865063">ปิด Chrome ใช่ไหม</translation> <translation id="210890598424854131">{0,plural, =0{Chrome จะเปิดขึ้นมาใหม่ตอนนี้}=1{Chrome จะเปิดขึ้นมาใหม่ใน 1 วินาที}other{Chrome จะเปิดขึ้นมาใหม่ใน # วินาที}}</translation> @@ -125,13 +124,11 @@ <translation id="4251615635259297716">เชื่อมโยงข้อมูล Chrome กับบัญชีนี้ไหม</translation> <translation id="4251625577313994583">รับ Chrome ใน iPhone ของคุณ</translation> <translation id="4293420128516039005">ลงชื่อเข้าใช้เพื่อซิงค์และปรับเปลี่ยน Chrome ในอุปกรณ์ต่างๆ</translation> -<translation id="4309555186815777032">(จำเป็นต้อง<ph name="BEGIN_BUTTON" />รีสตาร์ท<ph name="END_BUTTON" /> Chrome)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS </translation> <translation id="4343195214584226067">เพิ่ม <ph name="EXTENSION_NAME" /> ลงใน Chrome แล้ว</translation> <translation id="4407807842708586359">ระบบปฏิบัติการ Google Chrome</translation> -<translation id="4458285410772214805">โปรดออกจากระบบ และลงชื่อเข้าใช้อีกครั้งเพื่อให้การเปลี่ยนแปลงนี้มีผล</translation> <translation id="4458462641685292929">Google Chrome กำลังดำเนินการอย่างอื่นอยู่ โปรดลองอีกครั้งในภายหลัง</translation> <translation id="4480040274068703980">Chrome OS ไม่สามารถซิงค์ข้อมูลของคุณเนื่องจากเกิดข้อผิดพลาดในการลงชื่อเข้าใช้</translation> <translation id="4561051373932531560">Google Chrome ทำให้คุณสามารถคลิกที่หมายเลขโทรศัพท์บนเว็บแล้วโทรหาด้วย Skype!</translation> @@ -156,7 +153,6 @@ <translation id="495931528404527476">ใน Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome ไม่สามารถซิงค์ข้อมูลของคุณ โปรดอัปเดตข้อความรหัสผ่านการซิงค์</translation> -<translation id="5037239767309817516">โปรดปิดหน้าต่าง Google Chrome ทั้งหมด แล้วเปิดใหม่อีกครั้งเพื่อให้การเปลี่ยนแปลงนี้มีผล</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome จะเปิดขึ้นมาใหม่ภายใน 1 ชั่วโมง}other{Chrome จะเปิดขึ้นมาใหม่ภายใน # ชั่วโมง}}</translation> <translation id="5132929315877954718">พบกับแอป เกม ส่วนขยาย และธีมเด็ดๆ สำหรับ Google Chrome</translation> <translation id="5166975452760862670">Google Chrome แสดงในภาษานี้</translation> @@ -180,7 +176,6 @@ <translation id="5877064549588274448">เปลี่ยนช่องแล้ว รีสตาร์ทอุปกรณ์เพื่อใช้การเปลี่ยนแปลง</translation> <translation id="5895138241574237353">ปิดแล้วเปิดอีกครั้ง</translation> <translation id="5906655207909574370">การอัปเดตใกล้จะเสร็จเรียบร้อยแล้ว รีสตาร์ทอุปกรณ์เพื่อให้การอัปเดตเสร็จสิ้น</translation> -<translation id="5931853610562009806">สำหรับ Mac ระบบจะบันทึกรหัสผ่านไว้ใน Keychain และผู้ใช้ Chrome คนอื่นๆ ที่แชร์บัญชี OS X นี้อาจสามารถเข้าถึงหรือซิงค์รหัสผ่านนี้ได้</translation> <translation id="5940385492829620908">เว็บของคุณ บุ๊กมาร์ก และสิ่งอื่นๆ ใน Chrome พร้อมใช้แล้วที่นี่</translation> <translation id="5941830788786076944">ทำให้ Google Chrome เป็นเบราว์เซอร์เริ่มต้น</translation> <translation id="6014844626092547096">ขณะนี้คุณลงชื่อเข้าใช้ Chrome แล้ว! การซิงค์ถูกปิดใช้งานโดยผู้ดูแลระบบของคุณ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb index 36f017a0..fe31b521 100644 --- a/chrome/app/resources/google_chrome_strings_tr.xtb +++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome sürümü eski</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome 1 dakika içinde yeniden başlatılacak}other{Chrome # dakika içinde yeniden başlatılacak}}</translation> <translation id="2063848847527508675">Güncellemenin uygulanması için Chrome OS yeniden başlatılmalıdır.</translation> -<translation id="2077129598763517140">Kullanılabilir olduğunda donanım hızlandırmayı kullan</translation> <translation id="2084710999043359739">Chrome'a ekle</translation> <translation id="2094919256425865063">Yine de Chrome'dan çıkılsın mı?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome şimdi yeniden başlatılacak}=1{Chrome 1 saniye içinde yeniden başlatılacak}other{Chrome # saniye içinde yeniden başlatılacak}}</translation> @@ -126,12 +125,10 @@ <translation id="4251615635259297716">Chrome verileriniz bu hesaba bağlansın mı?</translation> <translation id="4251625577313994583">iPhone'unuzda Chrome'u edinin</translation> <translation id="4293420128516039005">Chrome'u cihazlarınız arasında senkronize etmek ve kişiselleştirmek için oturum açın</translation> -<translation id="4309555186815777032">(Chrome'un <ph name="BEGIN_BUTTON" />yeniden başlatılmasını<ph name="END_BUTTON" /> gerektirir)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> Chrome'a eklendi</translation> <translation id="4407807842708586359">Google Chrome OS</translation> -<translation id="4458285410772214805">Bu değişikliğin geçerli olabilmesi için lütfen çıkış yapıp tekrar oturum açın.</translation> <translation id="4458462641685292929">Google Chrome'da başka bir işlem devam ediyor. Lütfen daha sonra yeniden deneyin.</translation> <translation id="4480040274068703980">Oturum açmadaki bir hata nedeniyle Chrome OS, verilerinizi senkronize edemedi.</translation> <translation id="4561051373932531560">Google Chrome web'de bir telefon numarasını tıklayarak Skype ile aramanıza olanak sağlar!</translation> @@ -156,7 +153,6 @@ <translation id="495931528404527476">Chrome'da</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome, verilerinizi senkronize edemedi. Lütfen Senkronizasyon parolanızı güncelleyin.</translation> -<translation id="5037239767309817516">Bu değişikliğin geçerli olması için, lütfen tüm Google Chrome pencerelerini kapatın ve Google Chrome'u yeniden başlatın.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome bir saat içinde yeniden başlatılacak}other{Chrome # saat içinde yeniden başlatılacak}}</translation> <translation id="5132929315877954718">Google Chrome'a özgü harika uygulamaları, oyunları, uzantıları ve temaları keşfedin.</translation> <translation id="5166975452760862670">Google Chrome bu dilde görüntüleniyor</translation> @@ -182,7 +178,6 @@ <translation id="5877064549588274448">Kanal değişti. Değişikliklerin uygulanması için cihazınızı yeniden başlatın.</translation> <translation id="5895138241574237353">Yeniden başlat</translation> <translation id="5906655207909574370">Az kaldı! Güncellemeyi tamamlamak için cihazınızı yeniden başlatın.</translation> -<translation id="5931853610562009806">Mac bilgisayarlarda şifreler Keychain uygulamanızda saklanabilir ve bu OS X hesabını paylaşan diğer Chrome kullanıcıları bu şifrelere erişilebilir veya şifreleri senkronize edilebilir.</translation> <translation id="5940385492829620908">Web, yer işaretleri ve diğer Chrome öğeleriniz burada bulunur.</translation> <translation id="5941830788786076944">Google Chrome varsayılan tarayıcı olsun</translation> <translation id="6014844626092547096">Chrome'da oturum açtınız! Senkronizasyon, yöneticiniz tarafından devre dışı bırakıldı.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb index aa95cca..b431e37 100644 --- a/chrome/app/resources/google_chrome_strings_uk.xtb +++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Версія Chrome застаріла</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome перезапуститься через 1 хвилину}one{Chrome перезапуститься через # хвилину}few{Chrome перезапуститься через # хвилини}many{Chrome перезапуститься через # хвилин}other{Chrome перезапуститься через # хвилини}}</translation> <translation id="2063848847527508675">Щоб застосувати це оновлення, потрібно перезапустити ОС Chrome.</translation> -<translation id="2077129598763517140">Використовувати апаратне прискорення, якщо доступно</translation> <translation id="2084710999043359739">Додати в Chrome</translation> <translation id="2094919256425865063">Усе одно вийти з Chrome?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome перезапуститься зараз}=1{Chrome перезапуститься через 1 секунду}one{Chrome перезапуститься через # секунду}few{Chrome перезапуститься через # секунди}many{Chrome перезапуститься через # секунд}other{Chrome перезапуститься через # секунди}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">Пов’язати ваші дані Chrome із цим обліковим записом?</translation> <translation id="4251625577313994583">завантажити Chrome на iPhone</translation> <translation id="4293420128516039005">Увійдіть, щоб синхронізувати та персоналізувати роботу Chrome на всіх своїх пристроях</translation> -<translation id="4309555186815777032">(потрібно <ph name="BEGIN_BUTTON" />перезапустити<ph name="END_BUTTON" /> Chrome)</translation> <translation id="4328355335528187361">Версія Google Chrome для розробників (mDNS-In)</translation> <translation id="4331809312908958774">ОС Chrome</translation> <translation id="4343195214584226067">Розширення <ph name="EXTENSION_NAME" /> додано в Chrome</translation> <translation id="4407807842708586359">ОС Google Chrome</translation> -<translation id="4458285410772214805">Щоб зміна почала діяти, вийдіть і ввійдіть знову.</translation> <translation id="4458462641685292929">У Google Chrome виконується інша операція. Спробуйте пізніше.</translation> <translation id="4480040274068703980">ОС Chrome не вдалося синхронізувати ваші дані через помилку входу.</translation> <translation id="4561051373932531560">Google Chrome дозволяє натиснути номер телефону в Інтернеті та здійснити виклик через Skype.</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">У Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome не вдалося синхронізувати ваші дані. Оновіть свою парольну фразу для синхронізації.</translation> -<translation id="5037239767309817516">Щоб зміна почала діяти, закрийте всі вікна Google Chrome і перезапустіть веб-переглядач.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome перезапуститься через годину}one{Chrome перезапуститься через # годину}few{Chrome перезапуститься через # години}many{Chrome перезапуститься через # годин}other{Chrome перезапуститься через # години}}</translation> <translation id="5132929315877954718">Знаходьте чудові додатки, ігри, розширення й теми для Google Chrome.</translation> <translation id="5166975452760862670">Для Google Chrome вибрано цю мову</translation> @@ -179,7 +175,6 @@ <translation id="5877064549588274448">Канал змінено. Перезапустіть пристрій, щоб застосувати зміни.</translation> <translation id="5895138241574237353">Перезапустити</translation> <translation id="5906655207909574370">Майже оновлено. Перезапустіть пристрій, щоб завершити оновлення.</translation> -<translation id="5931853610562009806">В ОС Mac паролі можуть зберігатися в системі Keychain, де їх можуть застосовувати чи синхронізувати інші користувачі Chrome, які спільно користуються цим обліковим записом ОС X.</translation> <translation id="5940385492829620908">Тут містяться ваші веб-сторінки, закладки та інші дані Chrome.</translation> <translation id="5941830788786076944">Зробити Google Chrome переглядачем за промовчанням</translation> <translation id="6014844626092547096">Ви ввійшли в Chrome. Проте ваш адміністратор вимкнув синхронізацію.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb index accd7a6..fd543473 100644 --- a/chrome/app/resources/google_chrome_strings_vi.xtb +++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -42,7 +42,6 @@ <translation id="1877026089748256423">Chrome đã lỗi thời</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome sẽ chạy lại sau 1 phút}other{Chrome sẽ chạy lại sau # phút}}</translation> <translation id="2063848847527508675">Chrome OS cần được khởi động lại để áp dụng bản cập nhật.</translation> -<translation id="2077129598763517140">Sử dụng chế độ tăng tốc phần cứng khi khả dụng</translation> <translation id="2084710999043359739">Thêm vào Chrome</translation> <translation id="2094919256425865063">Bạn vẫn muốn thoát khỏi Chrome?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome sẽ chay lại ngay bây giờ}=1{Chrome sẽ chạy lại sau 1 giây}other{Chrome sẽ chạy lại sau # giây}}</translation> @@ -127,13 +126,11 @@ <translation id="4251615635259297716">Bạn muốn liên kết dữ liệu Chrome của bạn với tài khoản này?</translation> <translation id="4251625577313994583">tải Chrome trên iPhone của bạn</translation> <translation id="4293420128516039005">Đăng nhập để đồng bộ hóa và cá nhân hóa Chrome trên các thiết bị của bạn</translation> -<translation id="4309555186815777032">(yêu cầu Chrome <ph name="BEGIN_BUTTON" />khởi động lại<ph name="END_BUTTON" />)</translation> <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS </translation> <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> đã được thêm vào Chrome</translation> <translation id="4407807842708586359">Hệ điều hành Google Chrome</translation> -<translation id="4458285410772214805">Vui lòng đăng xuất và đăng nhập lại để thay đổi này có hiệu lực.</translation> <translation id="4458462641685292929">Một hoạt động khác trên Google Chrome đang diễn ra. Vui lòng thử lại sau.</translation> <translation id="4480040274068703980">Chrome OS không thể đồng bộ hóa dữ liệu của bạn do lỗi khi đăng nhập.</translation> <translation id="4561051373932531560">Google Chrome cho phép bạn nhấp vào số điện thoại trên web và gọi tới số đó bằng Skype!</translation> @@ -158,7 +155,6 @@ <translation id="495931528404527476">Trong Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome không thể đồng bộ hóa dữ liệu của bạn. Vui lòng cập nhật cụm mật khẩu Đồng bộ hóa của bạn.</translation> -<translation id="5037239767309817516">Hãy đóng tất cả các cửa sổ Google Chrome và chạy lại Google Chrome để thay đổi này có hiệu lực.</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome sẽ khởi động lại sau một giờ}other{Chrome sẽ khởi động lại sau # giờ}}</translation> <translation id="5132929315877954718">Khám phá các ứng dụng, trò chơi, tiện ích và chủ đề tuyệt vời cho Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome được hiển thị bằng ngôn ngữ này</translation> @@ -184,7 +180,6 @@ <translation id="5877064549588274448">Kênh đã thay đổi. Hãy khởi động lại thiết bị để áp dụng thay đổi.</translation> <translation id="5895138241574237353">Khởi động lại</translation> <translation id="5906655207909574370">Gần được cập nhật! Hãy khởi động lại thiết bị của bạn để hoàn tất cập nhật.</translation> -<translation id="5931853610562009806">Trên máy Mac, mật khẩu có thể được lưu vào Keychain và được truy cập hoặc đồng bộ hóa bởi những người dùng Chrome khác dùng chung tài khoản OS X này.</translation> <translation id="5940385492829620908">Web, dấu trang và các nội dung khác của bạn trên Chrome đều có ở đây.</translation> <translation id="5941830788786076944">Chọn Google Chrome làm trình duyệt mặc định</translation> <translation id="6014844626092547096">Bạn hiện đã đăng nhập vào Chrome! Quản trị viên của bạn đã tắt tính năng Đồng bộ hóa.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb index 174bd2dc..bec5412 100644 --- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome版本太旧</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome 将会在 1 分钟后重新启动}other{Chrome 将会在 # 分钟后重新启动}}</translation> <translation id="2063848847527508675">需要重新启动 Chrome 操作系统以应用更新。</translation> -<translation id="2077129598763517140">使用硬件加速模式(如果可用)</translation> <translation id="2084710999043359739">添加到 Chrome 浏览器</translation> <translation id="2094919256425865063">仍要退出 Chrome?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome 将会立即重新启动}=1{Chrome 将会在 1 秒后重新启动}other{Chrome 将会在 # 秒后重新启动}}</translation> @@ -125,13 +124,11 @@ <translation id="4251615635259297716">是否将您的 Chrome 数据与此帐号相关联?</translation> <translation id="4251625577313994583">在 iPhone 上下载 Chrome</translation> <translation id="4293420128516039005">登录即可在您的所有设备上同步并个性化设置 Chrome</translation> -<translation id="4309555186815777032">(需要<ph name="BEGIN_BUTTON" />重新启动<ph name="END_BUTTON" /> Chrome)</translation> <translation id="4328355335528187361">Google Chrome 开发者版 (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS </translation> <translation id="4343195214584226067">“<ph name="EXTENSION_NAME" />”已添加到 Chrome</translation> <translation id="4407807842708586359">Google Chrome 操作系统</translation> -<translation id="4458285410772214805">请先退出,然后重新登录,以便此更改生效。</translation> <translation id="4458462641685292929">Google Chrome 正在执行另一项操作,请稍后重试。</translation> <translation id="4480040274068703980">登录时出现错误,Chrome操作系统无法同步您的数据。</translation> <translation id="4561051373932531560">您可以在 Google Chrome 浏览器中点击网上的电话号码,然后通过 Skype 拨打!</translation> @@ -156,7 +153,6 @@ <translation id="495931528404527476">在 Chrome 中</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome无法同步您的数据。请更新您的同步密码。</translation> -<translation id="5037239767309817516">请关闭所有 Google Chrome 窗口,然后重新启动,以使此更改生效。</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome 将在 1 小时后重新启动}other{Chrome 将在 # 小时后重新启动}}</translation> <translation id="5132929315877954718">查找适用于Google Chrome的精彩应用、游戏、扩展程序和主题背景。</translation> <translation id="5166975452760862670">Google Chrome 界面目前使用的是这种语言</translation> @@ -180,7 +176,6 @@ <translation id="5877064549588274448">版本已更改。请重新启动设备来应用这些变更。</translation> <translation id="5895138241574237353">重新启动</translation> <translation id="5906655207909574370">即将更新到最新版本!重新启动您的设备即可完成更新。</translation> -<translation id="5931853610562009806">在 Mac 上,密码可能会保存到您的钥匙串 (Keychain) 中,这将导致共用此 OS X 帐号的其他 Chrome 用户都能够访问或同步处理这些密码。</translation> <translation id="5940385492829620908">您的上网记录、书签和其他Chrome资料和数据都保存在此处。</translation> <translation id="5941830788786076944">将 Google Chrome 浏览器设为默认浏览器</translation> <translation id="6014844626092547096">您现在已登录 Chrome!不过,管理员已停用同步功能。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb index ee3c2478..27984de 100644 --- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -40,7 +40,6 @@ <translation id="1877026089748256423">Chrome 版本過舊</translation> <translation id="2007150628464581396">{0,plural, =1{Chrome 將於 1 分鐘後重新啟動}other{Chrome 將於 # 分鐘後重新啟動}}</translation> <translation id="2063848847527508675">Chrome 作業系統必須重新啟動,才能套用更新。</translation> -<translation id="2077129598763517140">在可用時使用硬體加速</translation> <translation id="2084710999043359739">加到 Chrome</translation> <translation id="2094919256425865063">確定要關閉 Chrome 嗎?</translation> <translation id="210890598424854131">{0,plural, =0{Chrome 將立即重新啟動}=1{Chrome 將於 1 秒後重新啟動}other{Chrome 將於 # 秒後重新啟動}}</translation> @@ -125,12 +124,10 @@ <translation id="4251615635259297716">要將你的 Chrome 資料連結至這個帳戶嗎?</translation> <translation id="4251625577313994583">在 iPhone 上使用 Chrome</translation> <translation id="4293420128516039005">登入即可進行同步處理,讓你在所有裝置上享有個人化的 Chrome 體驗</translation> -<translation id="4309555186815777032">(必須<ph name="BEGIN_BUTTON" />重新啟動<ph name="END_BUTTON" /> Chrome)</translation> <translation id="4328355335528187361">Google Chrome 開發人員版 (mDNS-In)</translation> <translation id="4331809312908958774">Chrome OS</translation> <translation id="4343195214584226067">已將「<ph name="EXTENSION_NAME" />」加到 Chrome</translation> <translation id="4407807842708586359">Google Chrome 作業系統</translation> -<translation id="4458285410772214805">請先登出,然後重新登入,這項變更才會生效。</translation> <translation id="4458462641685292929">Google Chrome 正在執行另一項作業,請稍後再試。</translation> <translation id="4480040274068703980">登入時發生錯誤,因此 Chrome 作業系統無法同步處理你的資料。</translation> <translation id="4561051373932531560">Google Chrome 可讓你按一下網頁上的電話號碼,隨即透過 Skype 撥打電話!</translation> @@ -155,7 +152,6 @@ <translation id="495931528404527476">在 Chrome 中</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome 無法同步處理你的資料,請更新你的同步通關密語。</translation> -<translation id="5037239767309817516">為了讓這項變更生效,請關閉所有 Google Chrome 視窗,並重新啟動瀏覽器。</translation> <translation id="5131923704757666404">{0,plural, =1{Chrome 將於 1 小時後重新啟動}other{Chrome 將於 # 小時後重新啟動}}</translation> <translation id="5132929315877954718">幫你的 Google Chrome 物色各種實用有趣的應用程式、遊戲、擴充功能和主題。</translation> <translation id="5166975452760862670">Google Chrome 的介面文字已設為這種語言</translation> @@ -181,7 +177,6 @@ <translation id="5877064549588274448">版本已變更。請重新啟動裝置以套用變更。</translation> <translation id="5895138241574237353">重新啟動</translation> <translation id="5906655207909574370">即將更新為最新版本!重新啟動您的裝置即可完成更新程序。</translation> -<translation id="5931853610562009806">在 Mac 上,密碼會儲存在您的 Keychain 中,因此其他共用這個 OS X 帳戶的 Chrome 使用者都能存取或同步處理這些密碼。</translation> <translation id="5940385492829620908">你瀏覽的網頁、書籤和其他 Chrome 設定都在這裡。</translation> <translation id="5941830788786076944">使用 Google Chrome 做為我的預設瀏覽器</translation> <translation id="6014844626092547096">你現在已登入 Chrome!但管理員已關閉同步功能。</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 34b4f4e8..77544c8e 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -365,6 +365,18 @@ <message name="IDS_SETTINGS_TEXT_TO_SPEECH_PITCH" desc="The pitch of speech in text-to-speech settings."> Pitch </message> + <message name="IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_HEADING" desc="The heading for a section of the text-to-speech settings page where a user can preview text to speech"> + Preview + </message> + <message name="IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_INPUT_LABEL" desc="The label for sample input for a section of the text-to-speech settings page where a user can preview text to speech."> + Text to preview + </message> + <message name="IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_INPUT" desc="The sample input for a section of the text-to-speech settings page where a user can preview text to speech. Users will hear this read aloud."> + Hi there! I'm your text-to-speech voice. + </message> + <message name="IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_PLAY" desc="A button on the text-to-speech settings page to start playing a preview of text to speech"> + Play + </message> <message name="IDS_SETTINGS_TEXT_TO_SPEECH_ENGINES" desc="Heading for a section of text-to-speech settings to do per-engine settings"> Speech Engines </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 2801727..1310594 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1213,12 +1213,6 @@ "profiles/sql_init_error_message_ids.cc", "profiles/sql_init_error_message_ids.h", "profiles/storage_partition_descriptor.h", - "profiling_host/background_profiling_triggers.cc", - "profiling_host/background_profiling_triggers.h", - "profiling_host/chrome_browser_main_extra_parts_profiling.cc", - "profiling_host/chrome_browser_main_extra_parts_profiling.h", - "profiling_host/profiling_process_host.cc", - "profiling_host/profiling_process_host.h", "push_messaging/push_messaging_app_identifier.cc", "push_messaging/push_messaging_app_identifier.h", "push_messaging/push_messaging_constants.cc", @@ -1602,6 +1596,7 @@ "//chrome/browser/metrics:expired_histograms_array", "//chrome/browser/metrics/variations:chrome_ui_string_overrider_factory", "//chrome/browser/net:probe_message_proto", + "//chrome/browser/profiling_host", "//chrome/browser/safe_browsing", "//chrome/browser/ssl:proto", "//chrome/browser/ui",
diff --git a/chrome/browser/android/download/download_controller.cc b/chrome/browser/android/download/download_controller.cc index 2b5ccec..9f0e4c05 100644 --- a/chrome/browser/android/download/download_controller.cc +++ b/chrome/browser/android/download/download_controller.cc
@@ -262,34 +262,24 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); WebContents* web_contents = web_contents_getter.Run(); - if (vr::VrTabHelper::IsInVr(web_contents) && - !base::FeatureList::IsEnabled( - chrome::android::kVrBrowsingNativeAndroidUi)) { - vr::VrTabHelper::UISuppressed( - vr::UiSuppressedElement::kFileAccessPermission); + + if (HasFileAccessPermission()) { + RecordStoragePermission( + StoragePermissionType::STORAGE_PERMISSION_REQUESTED); + RecordStoragePermission( + StoragePermissionType::STORAGE_PERMISSION_NO_ACTION_NEEDED); + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, + base::BindOnce(cb, true)); + return; + } else if (vr::VrTabHelper::IsUiSuppressedInVr( + web_contents, + vr::UiSuppressedElement::kFileAccessPermission)) { BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::BindOnce(cb, false)); return; } RecordStoragePermission(StoragePermissionType::STORAGE_PERMISSION_REQUESTED); - - if (HasFileAccessPermission()) { - RecordStoragePermission( - StoragePermissionType::STORAGE_PERMISSION_NO_ACTION_NEEDED); - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, - base::BindOnce(cb, true)); - return; - } else if (vr::VrTabHelper::IsInVr(web_contents)) { - // Requests native permission is not supported yet in VR. - // See https://crbug.com/642934 - vr::VrTabHelper::UISuppressed( - vr::UiSuppressedElement::kFileAccessPermission); - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, - base::BindOnce(cb, false)); - return; - } - AcquirePermissionCallback callback( base::Bind(&OnRequestFileAccessResult, web_contents_getter, base::Bind(&OnStoragePermissionDecided, cb)));
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrome/browser/android/tab_web_contents_delegate_android.cc index a3b34ef..36da2d9 100644 --- a/chrome/browser/android/tab_web_contents_delegate_android.cc +++ b/chrome/browser/android/tab_web_contents_delegate_android.cc
@@ -125,9 +125,9 @@ void TabWebContentsDelegateAndroid::RunFileChooser( content::RenderFrameHost* render_frame_host, const FileChooserParams& params) { - if (vr::VrTabHelper::IsInVr( - WebContents::FromRenderFrameHost(render_frame_host))) { - vr::VrTabHelper::UISuppressed(vr::UiSuppressedElement::kFileChooser); + if (vr::VrTabHelper::IsUiSuppressedInVr( + WebContents::FromRenderFrameHost(render_frame_host), + vr::UiSuppressedElement::kFileChooser)) { return; } FileSelectHelper::RunFileChooser(render_frame_host, params); @@ -137,8 +137,9 @@ TabWebContentsDelegateAndroid::RunBluetoothChooser( content::RenderFrameHost* frame, const BluetoothChooser::EventHandler& event_handler) { - if (vr::VrTabHelper::IsInVr(WebContents::FromRenderFrameHost(frame))) { - vr::VrTabHelper::UISuppressed(vr::UiSuppressedElement::kBluetoothChooser); + if (vr::VrTabHelper::IsUiSuppressedInVr( + WebContents::FromRenderFrameHost(frame), + vr::UiSuppressedElement::kBluetoothChooser)) { return nullptr; } return std::make_unique<BluetoothChooserAndroid>(frame, event_handler); @@ -273,10 +274,8 @@ content::JavaScriptDialogManager* TabWebContentsDelegateAndroid::GetJavaScriptDialogManager( WebContents* source) { - if (vr::VrTabHelper::IsInVr(source) && - !base::FeatureList::IsEnabled( - chrome::android::kVrBrowsingNativeAndroidUi)) { - vr::VrTabHelper::UISuppressed(vr::UiSuppressedElement::kJavascriptDialog); + if (vr::VrTabHelper::IsUiSuppressedInVr( + source, vr::UiSuppressedElement::kJavascriptDialog)) { return nullptr; } if (base::FeatureList::IsEnabled(chrome::android::kTabModalJsDialog) || @@ -298,12 +297,10 @@ content::WebContents* web_contents, const content::MediaStreamRequest& request, const content::MediaResponseCallback& callback) { - if (vr::VrTabHelper::IsInVr(web_contents) && - !base::FeatureList::IsEnabled( - chrome::android::kVrBrowsingNativeAndroidUi)) { + if (vr::VrTabHelper::IsUiSuppressedInVr( + web_contents, vr::UiSuppressedElement::kMediaPermission)) { callback.Run(content::MediaStreamDevices(), content::MEDIA_DEVICE_NOT_SUPPORTED, nullptr); - vr::VrTabHelper::UISuppressed(vr::UiSuppressedElement::kMediaPermission); return; } MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest(
diff --git a/chrome/browser/android/vr/vr_shell_gl.cc b/chrome/browser/android/vr/vr_shell_gl.cc index b304ba6..096fcf20 100644 --- a/chrome/browser/android/vr/vr_shell_gl.cc +++ b/chrome/browser/android/vr/vr_shell_gl.cc
@@ -1500,6 +1500,8 @@ ui_controller_update_time_.AddSample(controller_time); } + ui_->scene()->CallPerFrameCallbacks(); + bool textures_changed = ui_->scene()->UpdateTextures(); // TODO(mthiesse): Determine if a visible controller is actually drawn in the
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc index 8f3fccbd..ea855348 100644 --- a/chrome/browser/autofill/autofill_interactive_uitest.cc +++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -549,8 +549,8 @@ ExpectFilledTestForm(); } - void TriggerFormFill() { - FocusFirstNameField(); + void TriggerFormFill(const std::string& field_name) { + FocusFieldByName(field_name); // Start filling the first name field with "M" and wait for the popup to be // shown. @@ -1829,7 +1829,7 @@ embedded_test_server()->GetURL("/autofill/dynamic_form_disabled.html"); ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url)); - TriggerFormFill(); + TriggerFormFill("firstname"); // Wait for the re-fill to happen. bool has_refilled = false; @@ -1838,13 +1838,13 @@ ASSERT_FALSE(has_refilled); // Make sure that the new form was not filled. - ExpectFieldValue("firstname", ""); - ExpectFieldValue("address1", ""); - ExpectFieldValue("state", "CA"); // Default value. - ExpectFieldValue("city", ""); - ExpectFieldValue("company", ""); - ExpectFieldValue("email", ""); - ExpectFieldValue("phone", ""); + ExpectFieldValue("firstname_form1", ""); + ExpectFieldValue("address_form1", ""); + ExpectFieldValue("state_form1", "CA"); // Default value. + ExpectFieldValue("city_form1", ""); + ExpectFieldValue("company_form1", ""); + ExpectFieldValue("email_form1", ""); + ExpectFieldValue("phone_form1", ""); } // An extension of the test fixture for tests with site isolation. @@ -2052,7 +2052,7 @@ embedded_test_server()->GetURL("a.com", "/autofill/dynamic_form.html"); ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url)); - TriggerFormFill(); + TriggerFormFill("firstname"); // Wait for the re-fill to happen. bool has_refilled = false; @@ -2061,13 +2061,59 @@ ASSERT_TRUE(has_refilled); // Make sure the new form was filled correctly. - ExpectFieldValue("firstname", "Milton"); - ExpectFieldValue("address1", "4120 Freidrich Lane"); - ExpectFieldValue("state", "TX"); - ExpectFieldValue("city", "Austin"); - ExpectFieldValue("company", "Initech"); - ExpectFieldValue("email", "red.swingline@initech.com"); - ExpectFieldValue("phone", "15125551234"); + ExpectFieldValue("firstname_form1", "Milton"); + ExpectFieldValue("address_form1", "4120 Freidrich Lane"); + ExpectFieldValue("state_form1", "TX"); + ExpectFieldValue("city_form1", "Austin"); + ExpectFieldValue("company_form1", "Initech"); + ExpectFieldValue("email_form1", "red.swingline@initech.com"); + ExpectFieldValue("phone_form1", "15125551234"); +} + +IN_PROC_BROWSER_TEST_F(DynamicFormInteractiveTest, + TwoDynamicChangingFormsFill) { + // Setup that the test expects a re-fill to happen. + test_delegate()->SetIsExpectingDynamicRefill(true); + + CreateTestProfile(); + + GURL url = embedded_test_server()->GetURL("a.com", + "/autofill/two_dynamic_forms.html"); + ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url)); + + TriggerFormFill("firstname_form1"); + + // Wait for the re-fill to happen. + bool has_refilled = false; + ASSERT_TRUE(content::ExecuteScriptAndExtractBool( + GetRenderViewHost(), "hasRefilled('firstname_form1')", &has_refilled)); + ASSERT_TRUE(has_refilled); + + // Make sure the new form was filled correctly. + ExpectFieldValue("firstname_form1", "Milton"); + ExpectFieldValue("address_form1", "4120 Freidrich Lane"); + ExpectFieldValue("state_form1", "TX"); + ExpectFieldValue("city_form1", "Austin"); + ExpectFieldValue("company_form1", "Initech"); + ExpectFieldValue("email_form1", "red.swingline@initech.com"); + ExpectFieldValue("phone_form1", "15125551234"); + + TriggerFormFill("firstname_form2"); + + // Wait for the re-fill to happen. + has_refilled = false; + ASSERT_TRUE(content::ExecuteScriptAndExtractBool( + GetRenderViewHost(), "hasRefilled('firstname_form2')", &has_refilled)); + ASSERT_TRUE(has_refilled); + + // Make sure the new form was filled correctly. + ExpectFieldValue("firstname_form2", "Milton"); + ExpectFieldValue("address_form2", "4120 Freidrich Lane"); + ExpectFieldValue("state_form2", "TX"); + ExpectFieldValue("city_form2", "Austin"); + ExpectFieldValue("company_form2", "Initech"); + ExpectFieldValue("email_form2", "red.swingline@initech.com"); + ExpectFieldValue("phone_form2", "15125551234"); } // Test that forms that dynamically change a second time do not get filled. @@ -2079,22 +2125,22 @@ "a.com", "/autofill/double_dynamic_form.html"); ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url)); - TriggerFormFill(); + TriggerFormFill("firstname"); // Wait for two dynamic changes to happen. bool has_refilled = false; ASSERT_TRUE(content::ExecuteScriptAndExtractBool( - GetRenderViewHost(), "hasFinished()", &has_refilled)); + GetRenderViewHost(), "hasRefilled()", &has_refilled)); ASSERT_FALSE(has_refilled); // Make sure the new form was not filled. - ExpectFieldValue("firstname", ""); - ExpectFieldValue("address1", ""); - ExpectFieldValue("state", "CA"); // Default value. - ExpectFieldValue("city", ""); - ExpectFieldValue("company", ""); - ExpectFieldValue("email", ""); - ExpectFieldValue("phone", ""); + ExpectFieldValue("firstname_form2", ""); + ExpectFieldValue("address_form2", ""); + ExpectFieldValue("state_form2", "CA"); // Default value. + ExpectFieldValue("city_form2", ""); + ExpectFieldValue("company_form2", ""); + ExpectFieldValue("email_form2", ""); + ExpectFieldValue("phone_form2", ""); } // Test that forms that dynamically change after a second do not get filled. @@ -2106,7 +2152,7 @@ "a.com", "/autofill/dynamic_form_after_delay.html"); ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url)); - TriggerFormFill(); + TriggerFormFill("firstname"); // Wait for the dynamic change to happen. bool has_refilled = false; @@ -2115,13 +2161,13 @@ ASSERT_FALSE(has_refilled); // Make sure that the new form was not filled. - ExpectFieldValue("firstname", ""); - ExpectFieldValue("address1", ""); - ExpectFieldValue("state", "CA"); // Default value. - ExpectFieldValue("city", ""); - ExpectFieldValue("company", ""); - ExpectFieldValue("email", ""); - ExpectFieldValue("phone", ""); + ExpectFieldValue("firstname_form1", ""); + ExpectFieldValue("address_form1", ""); + ExpectFieldValue("state_form1", "CA"); // Default value. + ExpectFieldValue("city_form1", ""); + ExpectFieldValue("company_form1", ""); + ExpectFieldValue("email_form1", ""); + ExpectFieldValue("phone_form1", ""); } // Test that only field of a type group that was filled initially get refilled. @@ -2133,7 +2179,7 @@ "a.com", "/autofill/dynamic_form_new_field_types.html"); ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url)); - TriggerFormFill(); + TriggerFormFill("firstname"); // Wait for the dynamic change to happen. bool has_refilled = false; @@ -2142,19 +2188,19 @@ ASSERT_TRUE(has_refilled); // The fields present in the initial fill should be filled. - ExpectFieldValue("firstname", "Milton"); - ExpectFieldValue("address1", "4120 Freidrich Lane"); - ExpectFieldValue("state", "TX"); - ExpectFieldValue("city", "Austin"); + ExpectFieldValue("firstname_form1", "Milton"); + ExpectFieldValue("address_form1", "4120 Freidrich Lane"); + ExpectFieldValue("state_form1", "TX"); + ExpectFieldValue("city_form1", "Austin"); // Fields from group that were not present in the initial fill should not be // filled - ExpectFieldValue("company", ""); + ExpectFieldValue("company_form1", ""); // Fields that were present but hidden in the initial fill should not be // filled. - ExpectFieldValue("email", ""); + ExpectFieldValue("email_form1", ""); // The phone should be filled even if it's a different format than the initial // fill. - ExpectFieldValue("phone", "5125551234"); + ExpectFieldValue("phone_form1", "5125551234"); } // Test that credit card fields are never re-filled. @@ -2202,7 +2248,7 @@ "a.com", "/autofill/dynamic_form_select_options_change.html"); ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url)); - TriggerFormFill(); + TriggerFormFill("firstname"); // Wait for the re-fill to happen. bool has_refilled = false; @@ -2230,17 +2276,17 @@ "a.com", "/autofill/dynamic_form_double_select_options_change.html"); ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url)); - TriggerFormFill(); + TriggerFormFill("firstname"); // Wait for the re-fill to happen. bool has_refilled = false; ASSERT_TRUE(content::ExecuteScriptAndExtractBool( GetRenderViewHost(), "hasRefilled()", &has_refilled)); - ASSERT_TRUE(has_refilled); + ASSERT_FALSE(has_refilled); // The fields that were initially filled and not reset should still be filled. - ExpectFieldValue("firstname", "Milton"); - ExpectFieldValue("address1", ""); // That field value was reset dynamically. + ExpectFieldValue("firstname", ""); // That field value was reset dynamically. + ExpectFieldValue("address1", "4120 Freidrich Lane"); ExpectFieldValue("state", "CA"); // Default value. ExpectFieldValue("city", "Austin"); ExpectFieldValue("company", "Initech");
diff --git a/chrome/browser/background/background_application_list_model_unittest.cc b/chrome/browser/background/background_application_list_model_unittest.cc index 8624f9f1..4b4ad7be 100644 --- a/chrome/browser/background/background_application_list_model_unittest.cc +++ b/chrome/browser/background/background_application_list_model_unittest.cc
@@ -88,6 +88,7 @@ bool background_permission) { base::DictionaryValue manifest; manifest.SetString(extensions::manifest_keys::kVersion, "1.0.0.0"); + manifest.SetInteger(extensions::manifest_keys::kManifestVersion, 2); manifest.SetString(extensions::manifest_keys::kName, name); auto permissions = std::make_unique<base::ListValue>(); if (background_permission) {
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 09c7dc9..829ee63d 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -27,6 +27,7 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "base/sys_info.h" #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" #include "chrome/browser/after_startup_task_utils.h" @@ -248,6 +249,7 @@ #include "services/preferences/public/cpp/in_process_service_factory.h" #include "services/preferences/public/mojom/preferences.mojom.h" #include "services/proxy_resolver/public/mojom/proxy_resolver.mojom.h" +#include "services/service_manager/public/cpp/connector.h" #include "services/service_manager/public/mojom/connector.mojom.h" #include "services/service_manager/sandbox/sandbox_type.h" #include "storage/browser/fileapi/external_mount_points.h" @@ -1645,6 +1647,17 @@ } bool ChromeContentBrowserClient::ShouldEnableStrictSiteIsolation() { + if (base::FeatureList::IsEnabled( + features::kSitePerProcessOnlyForHighMemoryClients)) { + constexpr int kDefaultMemoryThresholdMb = 1024; + int memory_threshold_mb = base::GetFieldTrialParamByFeatureAsInt( + features::kSitePerProcessOnlyForHighMemoryClients, + features::kSitePerProcessOnlyForHighMemoryClientsParamName, + kDefaultMemoryThresholdMb); + if (base::SysInfo::AmountOfPhysicalMemoryMB() <= memory_threshold_mb) + return false; + } + return base::FeatureList::IsEnabled(features::kSitePerProcess); } @@ -4249,6 +4262,10 @@ return IsWebauthnRPIDListedInEnterprisePolicy(browser_context, rp_id); } +bool ChromeContentBrowserClient::ShouldEnforceFocusChecksForWebauthn() { + return true; +} + void ChromeContentBrowserClient::ShouldReturnAttestationForWebauthnRPID( content::RenderFrameHost* rfh, const std::string& rp_id, @@ -4278,8 +4295,17 @@ } // The created AttestationPermissionRequest deletes itself once complete. - permission_request_manager->AddRequest( - NewAttestationPermissionRequest(origin, std::move(callback))); + // + // |callback| is called via the |MessageLoop| because otherwise the + // permissions bubble will have focus and |AuthenticatorImpl| checks that the + // frame still has focus before returning any results. + permission_request_manager->AddRequest(NewAttestationPermissionRequest( + origin, base::BindOnce( + [](base::OnceCallback<void(bool)> callback, bool result) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); + }, + std::move(callback)))); #endif }
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h index 66ad4c0..0ef2cfd8 100644 --- a/chrome/browser/chrome_content_browser_client.h +++ b/chrome/browser/chrome_content_browser_client.h
@@ -403,6 +403,7 @@ content::BrowserContext* browser_context, const GURL& url, base::OnceCallback<void(bool, int, int)> callback) override; + bool ShouldPermitIndividualAttestationForWebauthnRPID( content::BrowserContext* browser_context, const std::string& rp_id) override; @@ -411,6 +412,8 @@ const std::string& rp_id, const url::Origin& origin, base::OnceCallback<void(bool)> callback) override; + bool ShouldEnforceFocusChecksForWebauthn() override; + std::unique_ptr<net::ClientCertStore> CreateClientCertStore( content::ResourceContext* resource_context) override; scoped_refptr<content::LoginDelegate> CreateLoginDelegate(
diff --git a/chrome/browser/chrome_content_browser_client_browsertest.cc b/chrome/browser/chrome_content_browser_client_browsertest.cc index 0c6fe3b..6b35511 100644 --- a/chrome/browser/chrome_content_browser_client_browsertest.cc +++ b/chrome/browser/chrome_content_browser_client_browsertest.cc
@@ -4,9 +4,10 @@ #include "chrome/browser/chrome_content_browser_client.h" +#include "base/base_switches.h" #include "base/command_line.h" #include "base/macros.h" - +#include "base/sys_info.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search/instant_service.h" #include "chrome/browser/search/instant_service_factory.h" @@ -14,6 +15,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/search/instant_test_base.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" #include "chrome/test/base/in_process_browser_test.h" @@ -23,6 +25,7 @@ #include "content/public/browser/navigation_entry.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" +#include "content/public/browser/site_isolation_policy.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" #include "content/public/test/browser_test_utils.h" @@ -137,4 +140,145 @@ contents->GetMainFrame()->GetProcess()->GetID())); } +// Helper class to mark "https://ntp.com/" as an isolated origin. +class SitePerProcessMemoryThresholdBrowserTest : public InProcessBrowserTest { + public: + SitePerProcessMemoryThresholdBrowserTest() = default; + + void SetUpCommandLine(base::CommandLine* command_line) override { + InProcessBrowserTest::SetUpCommandLine(command_line); + + // This way the test always sees the same amount of physical memory + // (kLowMemoryDeviceThresholdMB = 512MB), regardless of how much memory is + // available in the testing environment. + command_line->AppendSwitch(switches::kEnableLowEndDeviceMode); + EXPECT_EQ(512, base::SysInfo::AmountOfPhysicalMemoryMB()); + } + + // Some command-line switches override field trials - the tests need to be + // skipped in this case. + bool ShouldSkipBecauseOfConflictingCommandLineSwitches() { + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kSitePerProcess)) + return true; + + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableSiteIsolationTrials)) + return true; + + return false; + } + + private: + DISALLOW_COPY_AND_ASSIGN(SitePerProcessMemoryThresholdBrowserTest); +}; + +IN_PROC_BROWSER_TEST_F(SitePerProcessMemoryThresholdBrowserTest, + SitePerProcessEnabled_HighThreshold) { + if (ShouldSkipBecauseOfConflictingCommandLineSwitches()) + return; + + // 512MB of physical memory that the test simulates is below the 768MB + // threshold. + base::test::ScopedFeatureList memory_feature; + memory_feature.InitAndEnableFeatureWithParameters( + features::kSitePerProcessOnlyForHighMemoryClients, + {{features::kSitePerProcessOnlyForHighMemoryClientsParamName, "768"}}); + + base::test::ScopedFeatureList site_per_process; + site_per_process.InitAndEnableFeature(features::kSitePerProcess); + + // Despite enabled site-per-process trial, there should be no isolation + // because the device has too little memory. + EXPECT_FALSE( + content::SiteIsolationPolicy::UseDedicatedProcessesForAllSites()); +} + +IN_PROC_BROWSER_TEST_F(SitePerProcessMemoryThresholdBrowserTest, + SitePerProcessEnabled_LowThreshold) { + if (ShouldSkipBecauseOfConflictingCommandLineSwitches()) + return; + + // 512MB of physical memory that the test simulates is above the 128MB + // threshold. + base::test::ScopedFeatureList memory_feature; + memory_feature.InitAndEnableFeatureWithParameters( + features::kSitePerProcessOnlyForHighMemoryClients, + {{features::kSitePerProcessOnlyForHighMemoryClientsParamName, "128"}}); + + base::test::ScopedFeatureList site_per_process; + site_per_process.InitAndEnableFeature(features::kSitePerProcess); + + // site-per-process trial is enabled, and the memory threshold is above the + // memory present on the device. + EXPECT_TRUE(content::SiteIsolationPolicy::UseDedicatedProcessesForAllSites()); +} + +IN_PROC_BROWSER_TEST_F(SitePerProcessMemoryThresholdBrowserTest, + SitePerProcessEnabled_NoThreshold) { + if (ShouldSkipBecauseOfConflictingCommandLineSwitches()) + return; + + base::test::ScopedFeatureList site_per_process; + site_per_process.InitAndEnableFeature(features::kSitePerProcess); + + EXPECT_TRUE(content::SiteIsolationPolicy::UseDedicatedProcessesForAllSites()); +} + +IN_PROC_BROWSER_TEST_F(SitePerProcessMemoryThresholdBrowserTest, + SitePerProcessDisabled_HighThreshold) { + if (ShouldSkipBecauseOfConflictingCommandLineSwitches()) + return; + + // 512MB of physical memory that the test simulates is below the 768MB + // threshold. + base::test::ScopedFeatureList memory_feature; + memory_feature.InitAndEnableFeatureWithParameters( + features::kSitePerProcessOnlyForHighMemoryClients, + {{features::kSitePerProcessOnlyForHighMemoryClientsParamName, "768"}}); + + base::test::ScopedFeatureList site_per_process; + site_per_process.InitAndDisableFeature(features::kSitePerProcess); + + // site-per-process trial is disabled, so isolation should be disabled + // (i.e. the memory threshold should be ignored). + EXPECT_FALSE( + content::SiteIsolationPolicy::UseDedicatedProcessesForAllSites()); +} + +IN_PROC_BROWSER_TEST_F(SitePerProcessMemoryThresholdBrowserTest, + SitePerProcessDisabled_LowThreshold) { + if (ShouldSkipBecauseOfConflictingCommandLineSwitches()) + return; + + // 512MB of physical memory that the test simulates is above the 128MB + // threshold. + base::test::ScopedFeatureList memory_feature; + memory_feature.InitAndEnableFeatureWithParameters( + features::kSitePerProcessOnlyForHighMemoryClients, + {{features::kSitePerProcessOnlyForHighMemoryClientsParamName, "128"}}); + + base::test::ScopedFeatureList site_per_process; + site_per_process.InitAndDisableFeature(features::kSitePerProcess); + + // site-per-process trial is disabled, so isolation should be disabled + // (i.e. the memory threshold should be ignored). + EXPECT_FALSE( + content::SiteIsolationPolicy::UseDedicatedProcessesForAllSites()); +} + +IN_PROC_BROWSER_TEST_F(SitePerProcessMemoryThresholdBrowserTest, + SitePerProcessDisabled_NoThreshold) { + if (ShouldSkipBecauseOfConflictingCommandLineSwitches()) + return; + + base::test::ScopedFeatureList site_per_process; + site_per_process.InitAndDisableFeature(features::kSitePerProcess); + + // site-per-process trial is disabled, so isolation should be disabled + // (i.e. the memory threshold should be ignored). + EXPECT_FALSE( + content::SiteIsolationPolicy::UseDedicatedProcessesForAllSites()); +} + } // namespace content
diff --git a/chrome/browser/chrome_quota_permission_context.cc b/chrome/browser/chrome_quota_permission_context.cc index 0d966b1..cbbba672 100644 --- a/chrome/browser/chrome_quota_permission_context.cc +++ b/chrome/browser/chrome_quota_permission_context.cc
@@ -183,9 +183,8 @@ return; } - if (vr::VrTabHelper::IsInVr(web_contents)) { - vr::VrTabHelper::UISuppressed(vr::UiSuppressedElement::kQuotaPermission); - + if (vr::VrTabHelper::IsUiSuppressedInVr( + web_contents, vr::UiSuppressedElement::kQuotaPermission)) { // Permission request UI cannot currently be rendered binocularly in VR // mode, so we suppress the UI and return cancelled to inform the caller // that the request will not progress. crbug.com/736568
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc index d4f4ed5..8663111 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -248,13 +248,9 @@ "rectory"))); // Fails on official build. http://crbug.com/429294 -#if defined(DISABLE_SLOW_FILESAPP_TESTS) || defined(OFFICIAL_BUILD) -#define MAYBE_DriveSpecific DISABLED_DriveSpecific -#else -#define MAYBE_DriveSpecific DriveSpecific -#endif +// Disabled: too often flakey on chromium trys. http://crbug.com/829310 WRAPPED_INSTANTIATE_TEST_CASE_P( - MAYBE_DriveSpecific, + DISABLED_DriveSpecific, FileManagerBrowserTest, ::testing::Values( TestParameter(NOT_IN_GUEST_MODE, "openSidebarOffline"),
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.cc b/chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.cc index 98251855..f8bbd6b 100644 --- a/chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.cc +++ b/chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.cc
@@ -114,10 +114,9 @@ std::unique_ptr<DeviceCloudPolicyValidator> DeviceCloudPolicyStoreChromeOS::CreateValidator( const em::PolicyFetchResponse& policy) { - std::unique_ptr<DeviceCloudPolicyValidator> validator( - DeviceCloudPolicyValidator::Create( - std::make_unique<em::PolicyFetchResponse>(policy), - background_task_runner_)); + auto validator = std::make_unique<DeviceCloudPolicyValidator>( + std::make_unique<em::PolicyFetchResponse>(policy), + background_task_runner_); validator->ValidateDomain(install_attributes_->GetDomain()); validator->ValidatePolicyType(dm_protocol::kChromeDevicePolicyType); validator->ValidatePayload();
diff --git a/chrome/browser/chromeos/policy/device_local_account_policy_store.cc b/chrome/browser/chromeos/policy/device_local_account_policy_store.cc index 3353ec4..ba4594d 100644 --- a/chrome/browser/chromeos/policy/device_local_account_policy_store.cc +++ b/chrome/browser/chromeos/policy/device_local_account_policy_store.cc
@@ -137,8 +137,7 @@ } session_manager_client_->StoreDeviceLocalAccountPolicy( - account_id_, - policy_blob, + account_id_, policy_blob, base::Bind(&DeviceLocalAccountPolicyStore::HandleStoreResult, weak_factory_.GetWeakPtr())); } @@ -191,9 +190,8 @@ return; } - std::unique_ptr<UserCloudPolicyValidator> validator( - UserCloudPolicyValidator::Create(std::move(policy_response), - background_task_runner())); + auto validator = std::make_unique<UserCloudPolicyValidator>( + std::move(policy_response), background_task_runner()); validator->ValidateUsername(account_id_, false); validator->ValidatePolicyType(dm_protocol::kChromePublicAccountPolicyType); // The timestamp is verified when storing a new policy downloaded from the
diff --git a/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc b/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc index 86c25a7..b15d7ab 100644 --- a/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc +++ b/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc
@@ -177,9 +177,9 @@ if (!success) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(&EnrollmentHandlerChromeOS::ReportResult, - weak_ptr_factory_.GetWeakPtr(), - EnrollmentStatus::ForStatus( - EnrollmentStatus::LICENSE_REQUEST_FAILED))); + weak_ptr_factory_.GetWeakPtr(), + EnrollmentStatus::ForStatus( + EnrollmentStatus::LICENSE_REQUEST_FAILED))); return; } if (available_licenses_callback_) @@ -242,15 +242,14 @@ const em::PolicyFetchResponse* policy = client_->GetPolicyFor( dm_protocol::kChromeDevicePolicyType, std::string()); if (!policy) { - ReportResult(EnrollmentStatus::ForFetchError( - DM_STATUS_RESPONSE_DECODING_ERROR)); + ReportResult( + EnrollmentStatus::ForFetchError(DM_STATUS_RESPONSE_DECODING_ERROR)); return; } - std::unique_ptr<DeviceCloudPolicyValidator> validator( - DeviceCloudPolicyValidator::Create( - std::make_unique<em::PolicyFetchResponse>(*policy), - background_task_runner_)); + auto validator = std::make_unique<DeviceCloudPolicyValidator>( + std::make_unique<em::PolicyFetchResponse>(*policy), + background_task_runner_); validator->ValidateTimestamp(base::Time(), CloudPolicyValidatorBase::TIMESTAMP_VALIDATED); @@ -312,8 +311,7 @@ DCHECK_EQ(client_.get(), client); if (enrollment_step_ == STEP_ROBOT_AUTH_FETCH) { - LOG(ERROR) << "API authentication code fetch failed: " - << client_->status(); + LOG(ERROR) << "API authentication code fetch failed: " << client_->status(); ReportResult(EnrollmentStatus::ForRobotAuthFetchError(client_->status())); } else if (enrollment_step_ < STEP_POLICY_FETCH) { ReportResult(EnrollmentStatus::ForRegistrationError(client_->status())); @@ -452,12 +450,10 @@ client_info.redirect_uri = "oob"; // Use the system request context to avoid sending user cookies. - gaia_oauth_client_.reset(new gaia::GaiaOAuthClient( - g_browser_process->system_request_context())); - gaia_oauth_client_->GetTokensFromAuthCode(client_info, - client->robot_api_auth_code(), - 0 /* max_retries */, - this); + gaia_oauth_client_.reset( + new gaia::GaiaOAuthClient(g_browser_process->system_request_context())); + gaia_oauth_client_->GetTokensFromAuthCode( + client_info, client->robot_api_auth_code(), 0 /* max_retries */, this); } // GaiaOAuthClient::Delegate callback for OAuth2 refresh token fetched. @@ -528,8 +524,7 @@ CHECK_EQ(STEP_ROBOT_AUTH_REFRESH, enrollment_step_); LOG(ERROR) << "Network error while fetching API refresh token: " << response_code; - ReportResult( - EnrollmentStatus::ForRobotRefreshFetchError(response_code)); + ReportResult(EnrollmentStatus::ForRobotRefreshFetchError(response_code)); } void EnrollmentHandlerChromeOS::StartJoinAdDomain() {
diff --git a/chrome/browser/chromeos/policy/pre_signin_policy_fetcher.cc b/chrome/browser/chromeos/policy/pre_signin_policy_fetcher.cc index 518a2e98..5fbc62bd 100644 --- a/chrome/browser/chromeos/policy/pre_signin_policy_fetcher.cc +++ b/chrome/browser/chromeos/policy/pre_signin_policy_fetcher.cc
@@ -295,8 +295,8 @@ std::unique_ptr<UserCloudPolicyValidator> PreSigninPolicyFetcher::CreateValidatorForCachedPolicy( std::unique_ptr<em::PolicyFetchResponse> policy) { - std::unique_ptr<UserCloudPolicyValidator> validator = - UserCloudPolicyValidator::Create(std::move(policy), task_runner_); + auto validator = std::make_unique<UserCloudPolicyValidator>(std::move(policy), + task_runner_); validator->ValidatePolicyType(dm_protocol::kChromeUserPolicyType); validator->ValidatePayload(); @@ -314,8 +314,8 @@ PreSigninPolicyFetcher::CreateValidatorForFetchedPolicy( std::unique_ptr<em::PolicyFetchResponse> policy) { // Configure the validator to validate based on cached policy. - std::unique_ptr<UserCloudPolicyValidator> validator = - UserCloudPolicyValidator::Create(std::move(policy), task_runner_); + auto validator = std::make_unique<UserCloudPolicyValidator>(std::move(policy), + task_runner_); validator->ValidatePolicyType(dm_protocol::kChromeUserPolicyType); validator->ValidateAgainstCurrentPolicy(
diff --git a/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc b/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc index 27ad44e8..66856069 100644 --- a/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc +++ b/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc
@@ -74,6 +74,12 @@ const char kUMAHasPolicyPrefNotMigrated[] = "Enterprise.UserPolicyChromeOS.HasPolicyPrefNotMigrated"; +void OnUserPolicyFatalError(const AccountId& account_id) { + // TODO(emaxx): Add a UMA metric. + user_manager::UserManager::Get()->SaveForceOnlineSignin(account_id, true); + chrome::AttemptUserExit(); +} + } // namespace // static @@ -358,7 +364,7 @@ if (is_active_directory) { auto manager = std::make_unique<UserActiveDirectoryPolicyManager>( account_id, policy_refresh_timeout, - base::BindOnce(&chrome::AttemptUserExit), std::move(store), + base::BindOnce(&OnUserPolicyFatalError, account_id), std::move(store), std::move(external_data_manager)); manager->Init( SchemaRegistryServiceFactory::GetForContext(profile)->registry()); @@ -371,8 +377,8 @@ std::move(store), std::move(external_data_manager), component_policy_cache_dir, enforcement_type, policy_refresh_timeout, - base::BindOnce(&chrome::AttemptUserExit) /* fatal_error_callback */, - account_id, base::ThreadTaskRunnerHandle::Get(), io_task_runner); + base::BindOnce(&OnUserPolicyFatalError, account_id), account_id, + base::ThreadTaskRunnerHandle::Get(), io_task_runner); bool wildcard_match = false; if (connector->IsEnterpriseManaged() &&
diff --git a/chrome/browser/chromeos/settings/session_manager_operation.cc b/chrome/browser/chromeos/settings/session_manager_operation.cc index 1a1d5f3..f040e0d 100644 --- a/chrome/browser/chromeos/settings/session_manager_operation.cc +++ b/chrome/browser/chromeos/settings/session_manager_operation.cc
@@ -167,8 +167,8 @@ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); std::unique_ptr<policy::DeviceCloudPolicyValidator> validator = - policy::DeviceCloudPolicyValidator::Create(std::move(policy), - background_task_runner); + std::make_unique<policy::DeviceCloudPolicyValidator>( + std::move(policy), background_task_runner); if (cloud_validations_) { // Policy auto-generated by session manager doesn't include a timestamp, so
diff --git a/chrome/browser/component_updater/cros_component_installer.cc b/chrome/browser/component_updater/cros_component_installer.cc index 3da68e16..0ec5dad 100644 --- a/chrome/browser/component_updater/cros_component_installer.cc +++ b/chrome/browser/component_updater/cros_component_installer.cc
@@ -34,7 +34,7 @@ "1913a5e0a6cad30b6f03e176177e0d7ed62c5d6700a9c66da556d7c3f5d6a47e"}, {"cros-termina", "1.1", "e9d960f84f628e1f42d05de4046bb5b3154b6f1f65c08412c6af57a29aecaffb"}, - {"rtanalytics-light", "2.0", + {"rtanalytics-light", "3.0", "69f09d33c439c2ab55bbbe24b47ab55cb3f6c0bd1f1ef46eefea3216ec925038"}, {"rtanalytics-full", "1.0", "c93c3e1013c52100a20038b405ac854d69fa889f6dc4fa6f188267051e05e444"},
diff --git a/chrome/browser/download/download_request_limiter.cc b/chrome/browser/download/download_request_limiter.cc index 6ceb75e8..7ce92f18 100644 --- a/chrome/browser/download/download_request_limiter.cc +++ b/chrome/browser/download/download_request_limiter.cc
@@ -28,11 +28,6 @@ #include "content/public/browser/web_contents_delegate.h" #include "url/gurl.h" -#if defined(OS_ANDROID) -#include "base/feature_list.h" -#include "chrome/browser/android/chrome_feature_list.h" -#endif - using content::BrowserThread; using content::NavigationController; using content::NavigationEntry; @@ -229,15 +224,8 @@ if (is_showing_prompt()) return; -#if defined(OS_ANDROID) - if (vr::VrTabHelper::IsInVr(web_contents_) && - !base::FeatureList::IsEnabled( - chrome::android::kVrBrowsingNativeAndroidUi)) { -#else - if (vr::VrTabHelper::IsInVr(web_contents_)) { -#endif - vr::VrTabHelper::UISuppressed(vr::UiSuppressedElement::kDownloadPermission); - + if (vr::VrTabHelper::IsUiSuppressedInVr( + web_contents_, vr::UiSuppressedElement::kDownloadPermission)) { // Permission request UI cannot currently be rendered binocularly in VR // mode, so we suppress the UI and return cancelled to inform the caller // that the request will not progress. crbug.com/736568
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index ce46b61..cff2e96 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn
@@ -513,12 +513,6 @@ "device_permissions_dialog_controller.h", "devtools_util.cc", "devtools_util.h", - "display_info_provider_chromeos.cc", - "display_info_provider_chromeos.h", - "display_info_provider_mac.cc", - "display_info_provider_mac.h", - "display_info_provider_win.cc", - "display_info_provider_win.h", "error_console/error_console.cc", "error_console/error_console.h", "error_console/error_console_factory.cc", @@ -711,6 +705,12 @@ "suspicious_extension_bubble_delegate.h", "sync_bundle.cc", "sync_bundle.h", + "system_display/display_info_provider_chromeos.cc", + "system_display/display_info_provider_chromeos.h", + "system_display/display_info_provider_mac.cc", + "system_display/display_info_provider_mac.h", + "system_display/display_info_provider_win.cc", + "system_display/display_info_provider_win.h", "tab_helper.cc", "tab_helper.h", "theme_installed_infobar_delegate.cc", @@ -1089,8 +1089,8 @@ ] } else if (use_aura && !is_chromeos) { sources += [ - "display_info_provider_aura.cc", - "display_info_provider_aura.h", + "system_display/display_info_provider_aura.cc", + "system_display/display_info_provider_aura.h", ] }
diff --git a/chrome/browser/extensions/OWNERS b/chrome/browser/extensions/OWNERS index a41ac27..1919d86 100644 --- a/chrome/browser/extensions/OWNERS +++ b/chrome/browser/extensions/OWNERS
@@ -7,6 +7,7 @@ per-file bookmark_app_*=ortuno@chromium.org # For adding/renaming files for Chrome OS apps APIs. +per-file BUILD.gn=stevenjb@chromium.org per-file BUILD.gn=tbarzic@chromium.org # COMPONENT: Platform>Extensions
diff --git a/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc b/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc index 1dd2081..5671c21c 100644 --- a/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc +++ b/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
@@ -55,6 +55,7 @@ #include "extensions/browser/extension_system.h" #include "extensions/browser/uninstall_reason.h" #include "extensions/common/extension.h" +#include "extensions/common/extension_builder.h" #include "extensions/common/manifest.h" #include "extensions/common/manifest_constants.h" #include "extensions/common/permissions/api_permission.h" @@ -281,18 +282,12 @@ // Returns a barebones test extension. scoped_refptr<Extension> CreateExtension() { - base::DictionaryValue manifest; - manifest.SetString(manifest_keys::kVersion, "1.0.0.0"); - manifest.SetString(manifest_keys::kName, kTestExtensionName); - auto permission_list = std::make_unique<base::ListValue>(); - permission_list->AppendString("gcm"); - manifest.Set(manifest_keys::kPermissions, std::move(permission_list)); - - std::string error; - scoped_refptr<Extension> extension = Extension::Create( - temp_dir_.GetPath(), Manifest::UNPACKED, manifest, Extension::NO_FLAGS, - "ldnnhddmnhbkjipkidpdiheffobcpfmf", &error); - EXPECT_TRUE(extension.get()) << error; + scoped_refptr<Extension> extension = + ExtensionBuilder(kTestExtensionName) + .AddPermission("gcm") + .SetPath(temp_dir_.GetPath()) + .SetID("ldnnhddmnhbkjipkidpdiheffobcpfmf") + .Build(); EXPECT_TRUE( extension->permissions_data()->HasAPIPermission(APIPermission::kGcm));
diff --git a/chrome/browser/extensions/extension_management_unittest.cc b/chrome/browser/extensions/extension_management_unittest.cc index dc6ad71c..d0bdc45 100644 --- a/chrome/browser/extensions/extension_management_unittest.cc +++ b/chrome/browser/extensions/extension_management_unittest.cc
@@ -237,6 +237,7 @@ base::DictionaryValue manifest_dict; manifest_dict.SetString(manifest_keys::kName, "test"); manifest_dict.SetString(manifest_keys::kVersion, version); + manifest_dict.SetInteger(manifest_keys::kManifestVersion, 2); manifest_dict.SetString(manifest_keys::kUpdateURL, update_url); std::string error; scoped_refptr<const Extension> extension = @@ -275,6 +276,7 @@ base::DictionaryValue* values) { values->SetString(extensions::manifest_keys::kName, "test"); values->SetString(extensions::manifest_keys::kVersion, "0.1"); + values->SetInteger(extensions::manifest_keys::kManifestVersion, 2); std::string error; extension_ = Extension::Create(base::FilePath(), location, *values, Extension::NO_FLAGS, &error);
diff --git a/chrome/browser/extensions/extension_prefs_unittest.cc b/chrome/browser/extensions/extension_prefs_unittest.cc index 217a7aa..ec75c33 100644 --- a/chrome/browser/extensions/extension_prefs_unittest.cc +++ b/chrome/browser/extensions/extension_prefs_unittest.cc
@@ -450,6 +450,7 @@ base::DictionaryValue manifest; manifest.SetString(manifest_keys::kName, "test"); manifest.SetString(manifest_keys::kVersion, "1." + base::IntToString(num)); + manifest.SetInteger(manifest_keys::kManifestVersion, 2); base::FilePath path = prefs_.extensions_dir().AppendASCII(base::IntToString(num)); std::string errors; @@ -562,6 +563,7 @@ base::DictionaryValue dictionary; dictionary.SetString(manifest_keys::kName, "test"); dictionary.SetString(manifest_keys::kVersion, "0.1"); + dictionary.SetInteger(manifest_keys::kManifestVersion, 2); dictionary.SetString(manifest_keys::kBackgroundPage, "background.html"); scoped_refptr<Extension> extension = prefs_.AddExtensionWithManifest(dictionary, Manifest::INTERNAL); @@ -572,6 +574,7 @@ base::DictionaryValue manifest; manifest.SetString(manifest_keys::kName, "test"); manifest.SetString(manifest_keys::kVersion, "0.2"); + manifest.SetInteger(manifest_keys::kManifestVersion, 2); std::unique_ptr<base::ListValue> scripts(new base::ListValue); scripts->AppendString("test.js"); manifest.Set(manifest_keys::kBackgroundScripts, std::move(scripts)); @@ -671,6 +674,7 @@ base::DictionaryValue dictionary; dictionary.SetString(manifest_keys::kName, "from_webstore"); dictionary.SetString(manifest_keys::kVersion, "0.1"); + dictionary.SetInteger(manifest_keys::kManifestVersion, 2); webstore_extension_ = prefs_.AddExtensionWithManifestAndFlags( dictionary, Manifest::INTERNAL, Extension::FROM_WEBSTORE); } @@ -679,6 +683,7 @@ base::DictionaryValue dictionary; dictionary.SetString(manifest_keys::kName, "from_bookmark"); dictionary.SetString(manifest_keys::kVersion, "0.1"); + dictionary.SetInteger(manifest_keys::kManifestVersion, 2); bookmark_extension_ = prefs_.AddExtensionWithManifestAndFlags( dictionary, Manifest::INTERNAL, Extension::FROM_BOOKMARK); } @@ -687,6 +692,7 @@ base::DictionaryValue dictionary; dictionary.SetString(manifest_keys::kName, "was_installed_by_default"); dictionary.SetString(manifest_keys::kVersion, "0.1"); + dictionary.SetInteger(manifest_keys::kManifestVersion, 2); default_extension_ = prefs_.AddExtensionWithManifestAndFlags( dictionary, Manifest::INTERNAL, @@ -697,6 +703,7 @@ base::DictionaryValue dictionary; dictionary.SetString(manifest_keys::kName, "was_installed_by_oem"); dictionary.SetString(manifest_keys::kVersion, "0.1"); + dictionary.SetInteger(manifest_keys::kManifestVersion, 2); oem_extension_ = prefs_.AddExtensionWithManifestAndFlags( dictionary, Manifest::INTERNAL, Extension::WAS_INSTALLED_BY_OEM); } @@ -727,6 +734,7 @@ std::string error; simple_dict.SetString(manifest_keys::kVersion, "1.0.0.0"); + simple_dict.SetInteger(manifest_keys::kManifestVersion, 2); simple_dict.SetString(manifest_keys::kName, "unused"); extension1_ = Extension::Create( @@ -925,11 +933,7 @@ void Initialize() override { // Adding a component extension. component_extension_ = - ExtensionBuilder() - .SetManifest(DictionaryBuilder() - .Set(manifest_keys::kName, "a") - .Set(manifest_keys::kVersion, "0.1") - .Build()) + ExtensionBuilder("a") .SetLocation(Manifest::COMPONENT) .SetPath(prefs_.extensions_dir().AppendASCII("a")) .Build(); @@ -937,11 +941,7 @@ // Adding a non component extension. no_component_extension_ = - ExtensionBuilder() - .SetManifest(DictionaryBuilder() - .Set(manifest_keys::kName, "b") - .Set(manifest_keys::kVersion, "0.1") - .Build()) + ExtensionBuilder("b") .SetLocation(Manifest::INTERNAL) .SetPath(prefs_.extensions_dir().AppendASCII("b")) .Build();
diff --git a/chrome/browser/extensions/extension_protocols_unittest.cc b/chrome/browser/extensions/extension_protocols_unittest.cc index d97cdbcd..dc4b273 100644 --- a/chrome/browser/extensions/extension_protocols_unittest.cc +++ b/chrome/browser/extensions/extension_protocols_unittest.cc
@@ -40,6 +40,7 @@ #include "extensions/common/extension_builder.h" #include "extensions/common/extension_paths.h" #include "extensions/common/file_util.h" +#include "extensions/common/value_builder.h" #include "extensions/test/test_extension_dir.h" #include "net/base/request_priority.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" @@ -120,22 +121,13 @@ } scoped_refptr<Extension> CreateTestResponseHeaderExtension() { - base::DictionaryValue manifest; - manifest.SetString("name", "An extension with web-accessible resources"); - manifest.SetString("version", "2"); - - auto web_accessible_list = std::make_unique<base::ListValue>(); - web_accessible_list->AppendString("test.dat"); - manifest.Set("web_accessible_resources", std::move(web_accessible_list)); - - base::FilePath path = GetTestPath("response_headers"); - - std::string error; - scoped_refptr<Extension> extension( - Extension::Create(path, Manifest::UNPACKED, manifest, - Extension::NO_FLAGS, &error)); - EXPECT_TRUE(extension.get()) << error; - return extension; + DictionaryBuilder web_accessible_resources; + web_accessible_resources.Set("web_accessible_resources", + ListBuilder().Append("test.dat").Build()); + return ExtensionBuilder("An extension with web-accessible resources") + .MergeManifest(web_accessible_resources.Build()) + .SetPath(GetTestPath("response_headers")) + .Build(); } // Helper function to create a |ResourceRequest| for testing purposes.
diff --git a/chrome/browser/extensions/extension_web_ui_unittest.cc b/chrome/browser/extensions/extension_web_ui_unittest.cc index 59b94835..51dfbcf7 100644 --- a/chrome/browser/extensions/extension_web_ui_unittest.cc +++ b/chrome/browser/extensions/extension_web_ui_unittest.cc
@@ -75,6 +75,7 @@ DictionaryBuilder manifest; manifest.Set(manifest_keys::kName, "ext1") .Set(manifest_keys::kVersion, "0.1") + .Set(manifest_keys::kManifestVersion, 2) .Set(std::string(manifest_keys::kChromeURLOverrides), DictionaryBuilder().Set("bookmarks", kOverrideResource).Build()); scoped_refptr<Extension> ext_unpacked( @@ -110,6 +111,7 @@ DictionaryBuilder manifest2; manifest2.Set(manifest_keys::kName, "ext2") .Set(manifest_keys::kVersion, "0.1") + .Set(manifest_keys::kManifestVersion, 2) .Set(std::string(manifest_keys::kChromeURLOverrides), DictionaryBuilder().Set("bookmarks", kOverrideResource2).Build()); scoped_refptr<Extension> ext_component(
diff --git a/chrome/browser/extensions/install_tracker_unittest.cc b/chrome/browser/extensions/install_tracker_unittest.cc index add6869..5c986921 100644 --- a/chrome/browser/extensions/install_tracker_unittest.cc +++ b/chrome/browser/extensions/install_tracker_unittest.cc
@@ -2,13 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/extensions/install_tracker.h" + #include "base/files/file_path.h" #include "chrome/browser/extensions/active_install_data.h" -#include "chrome/browser/extensions/install_tracker.h" #include "chrome/test/base/testing_profile.h" #include "content/public/test/test_browser_thread_bundle.h" #include "extensions/browser/extension_registry.h" #include "extensions/common/extension.h" +#include "extensions/common/extension_builder.h" #include "extensions/common/manifest_constants.h" #include "testing/gtest/include/gtest/gtest.h" @@ -27,20 +29,10 @@ const char kExtensionId3[] = "ladmcjmmmmgonboiadnaindoekpbljde"; scoped_refptr<Extension> CreateDummyExtension(const std::string& id) { - base::DictionaryValue manifest; - manifest.SetString(extensions::manifest_keys::kVersion, "1.0"); - manifest.SetString(extensions::manifest_keys::kName, "Dummy name"); - - std::string error; - scoped_refptr<Extension> extension; - extension = Extension::Create(base::FilePath(), - extensions::Manifest::INTERNAL, - manifest, - Extension::NO_FLAGS, - id, - &error); - EXPECT_TRUE(extension.get()) << "Error creating extension: " << error; - return extension; + return extensions::ExtensionBuilder("Dummy name") + .SetLocation(extensions::Manifest::INTERNAL) + .SetID(id) + .Build(); } } // namespace
diff --git a/chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc b/chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc index 7d179ba5..37e7d09b 100644 --- a/chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc +++ b/chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc
@@ -64,6 +64,7 @@ base::DictionaryValue manifest_dict; manifest_dict.SetString(manifest_keys::kName, "test"); manifest_dict.SetString(manifest_keys::kVersion, "0.1"); + manifest_dict.SetInteger(manifest_keys::kManifestVersion, 2); if (required_permissions) { manifest_dict.Set(manifest_keys::kPermissions, required_permissions->CreateDeepCopy());
diff --git a/chrome/browser/extensions/standard_management_policy_provider_unittest.cc b/chrome/browser/extensions/standard_management_policy_provider_unittest.cc index ed3a7ec..e9ccf2d7 100644 --- a/chrome/browser/extensions/standard_management_policy_provider_unittest.cc +++ b/chrome/browser/extensions/standard_management_policy_provider_unittest.cc
@@ -14,6 +14,7 @@ #include "chrome/browser/extensions/test_extension_prefs.h" #include "content/public/test/test_browser_thread_bundle.h" #include "extensions/browser/extension_prefs.h" +#include "extensions/common/extension_builder.h" #include "extensions/common/manifest_constants.h" #include "testing/gtest/include/gtest/gtest.h" @@ -31,16 +32,8 @@ return prefs_.prefs(); } - scoped_refptr<const Extension> CreateExtension(Manifest::Location location, - bool required) { - base::DictionaryValue values; - values.SetString(manifest_keys::kName, "test"); - values.SetString(manifest_keys::kVersion, "0.1"); - std::string error; - scoped_refptr<const Extension> extension = Extension::Create( - base::FilePath(), location, values, Extension::NO_FLAGS, &error); - CHECK(extension.get()) << error; - return extension; + scoped_refptr<const Extension> CreateExtension(Manifest::Location location) { + return ExtensionBuilder("test").SetLocation(location).Build(); } content::TestBrowserThreadBundle test_browser_thread_bundle_; @@ -55,7 +48,7 @@ // extension required by policy. TEST_F(StandardManagementPolicyProviderTest, RequiredExtension) { scoped_refptr<const Extension> extension = - CreateExtension(Manifest::EXTERNAL_POLICY_DOWNLOAD, true); + CreateExtension(Manifest::EXTERNAL_POLICY_DOWNLOAD); base::string16 error16; EXPECT_TRUE(provider_.UserMayLoad(extension.get(), &error16)); @@ -73,7 +66,7 @@ // extension required by policy. TEST_F(StandardManagementPolicyProviderTest, NotRequiredExtension) { scoped_refptr<const Extension> extension = - CreateExtension(Manifest::INTERNAL, false); + CreateExtension(Manifest::INTERNAL); base::string16 error16; EXPECT_TRUE(provider_.UserMayLoad(extension.get(), &error16));
diff --git a/chrome/browser/extensions/system_display/OWNERS b/chrome/browser/extensions/system_display/OWNERS new file mode 100644 index 0000000..aa215c7 --- /dev/null +++ b/chrome/browser/extensions/system_display/OWNERS
@@ -0,0 +1 @@ +stevenjb@chromium.org
diff --git a/chrome/browser/extensions/display_info_provider_aura.cc b/chrome/browser/extensions/system_display/display_info_provider_aura.cc similarity index 82% rename from chrome/browser/extensions/display_info_provider_aura.cc rename to chrome/browser/extensions/system_display/display_info_provider_aura.cc index e5f7299..e502558 100644 --- a/chrome/browser/extensions/display_info_provider_aura.cc +++ b/chrome/browser/extensions/system_display/display_info_provider_aura.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/display_info_provider_aura.h" +#include "chrome/browser/extensions/system_display/display_info_provider_aura.h" namespace extensions {
diff --git a/chrome/browser/extensions/display_info_provider_aura.h b/chrome/browser/extensions/system_display/display_info_provider_aura.h similarity index 66% rename from chrome/browser/extensions/display_info_provider_aura.h rename to chrome/browser/extensions/system_display/display_info_provider_aura.h index cab3e4f..f641bf4 100644 --- a/chrome/browser/extensions/display_info_provider_aura.h +++ b/chrome/browser/extensions/system_display/display_info_provider_aura.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTENSIONS_DISPLAY_INFO_PROVIDER_AURA_H_ -#define CHROME_BROWSER_EXTENSIONS_DISPLAY_INFO_PROVIDER_AURA_H_ +#ifndef CHROME_BROWSER_EXTENSIONS_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_AURA_H_ +#define CHROME_BROWSER_EXTENSIONS_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_AURA_H_ #include "base/macros.h" #include "extensions/browser/api/system_display/display_info_provider.h" @@ -20,4 +20,4 @@ } // namespace extensions -#endif // CHROME_BROWSER_EXTENSIONS_DISPLAY_INFO_PROVIDER_AURA_H_ +#endif // CHROME_BROWSER_EXTENSIONS_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_AURA_H_
diff --git a/chrome/browser/extensions/display_info_provider_chromeos.cc b/chrome/browser/extensions/system_display/display_info_provider_chromeos.cc similarity index 99% rename from chrome/browser/extensions/display_info_provider_chromeos.cc rename to chrome/browser/extensions/system_display/display_info_provider_chromeos.cc index 47065c1..1398581 100644 --- a/chrome/browser/extensions/display_info_provider_chromeos.cc +++ b/chrome/browser/extensions/system_display/display_info_provider_chromeos.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/display_info_provider_chromeos.h" +#include "chrome/browser/extensions/system_display/display_info_provider_chromeos.h" #include <stdint.h> #include <cmath>
diff --git a/chrome/browser/extensions/display_info_provider_chromeos.h b/chrome/browser/extensions/system_display/display_info_provider_chromeos.h similarity index 91% rename from chrome/browser/extensions/display_info_provider_chromeos.h rename to chrome/browser/extensions/system_display/display_info_provider_chromeos.h index d087546c..8baf7177 100644 --- a/chrome/browser/extensions/display_info_provider_chromeos.h +++ b/chrome/browser/extensions/system_display/display_info_provider_chromeos.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTENSIONS_DISPLAY_INFO_PROVIDER_CHROMEOS_H_ -#define CHROME_BROWSER_EXTENSIONS_DISPLAY_INFO_PROVIDER_CHROMEOS_H_ +#ifndef CHROME_BROWSER_EXTENSIONS_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_CHROMEOS_H_ +#define CHROME_BROWSER_EXTENSIONS_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_CHROMEOS_H_ #include <map> #include <memory> @@ -75,4 +75,4 @@ } // namespace extensions -#endif // CHROME_BROWSER_EXTENSIONS_DISPLAY_INFO_PROVIDER_CHROMEOS_H_ +#endif // CHROME_BROWSER_EXTENSIONS_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_CHROMEOS_H_
diff --git a/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc b/chrome/browser/extensions/system_display/display_info_provider_chromeos_unittest.cc similarity index 99% rename from chrome/browser/extensions/display_info_provider_chromeos_unittest.cc rename to chrome/browser/extensions/system_display/display_info_provider_chromeos_unittest.cc index ecf8149..fb6806ff 100644 --- a/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc +++ b/chrome/browser/extensions/system_display/display_info_provider_chromeos_unittest.cc
@@ -17,7 +17,7 @@ #include "base/macros.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" -#include "chrome/browser/extensions/display_info_provider_chromeos.h" +#include "chrome/browser/extensions/system_display/display_info_provider_chromeos.h" #include "chrome/browser/ui/ash/tablet_mode_client.h" #include "extensions/common/api/system_display.h" #include "services/ui/public/cpp/input_devices/input_device_client_test_api.h"
diff --git a/chrome/browser/extensions/display_info_provider_mac.cc b/chrome/browser/extensions/system_display/display_info_provider_mac.cc similarity index 88% rename from chrome/browser/extensions/display_info_provider_mac.cc rename to chrome/browser/extensions/system_display/display_info_provider_mac.cc index f3602fc6..ba19257f 100644 --- a/chrome/browser/extensions/display_info_provider_mac.cc +++ b/chrome/browser/extensions/system_display/display_info_provider_mac.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/display_info_provider_mac.h" +#include "chrome/browser/extensions/system_display/display_info_provider_mac.h" #include "base/logging.h"
diff --git a/chrome/browser/extensions/display_info_provider_mac.h b/chrome/browser/extensions/system_display/display_info_provider_mac.h similarity index 73% rename from chrome/browser/extensions/display_info_provider_mac.h rename to chrome/browser/extensions/system_display/display_info_provider_mac.h index f79942d..f020d3f 100644 --- a/chrome/browser/extensions/display_info_provider_mac.h +++ b/chrome/browser/extensions/system_display/display_info_provider_mac.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTENSIONS_DISPLAY_INFO_PROVIDER_MAC_H_ -#define CHROME_BROWSER_EXTENSIONS_DISPLAY_INFO_PROVIDER_MAC_H_ +#ifndef CHROME_BROWSER_EXTENSIONS_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_MAC_H_ +#define CHROME_BROWSER_EXTENSIONS_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_MAC_H_ #include "base/macros.h" #include "extensions/browser/api/system_display/display_info_provider.h" @@ -25,4 +25,4 @@ } // namespace extensions -#endif // CHROME_BROWSER_EXTENSIONS_DISPLAY_INFO_PROVIDER_MAC_H_ +#endif // CHROME_BROWSER_EXTENSIONS_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_MAC_H_
diff --git a/chrome/browser/extensions/display_info_provider_win.cc b/chrome/browser/extensions/system_display/display_info_provider_win.cc similarity index 83% rename from chrome/browser/extensions/display_info_provider_win.cc rename to chrome/browser/extensions/system_display/display_info_provider_win.cc index 365486d..9f195b91 100644 --- a/chrome/browser/extensions/display_info_provider_win.cc +++ b/chrome/browser/extensions/system_display/display_info_provider_win.cc
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/display_info_provider_win.h" +#include "chrome/browser/extensions/system_display/display_info_provider_win.h" -#include <windows.h> #include <stddef.h> +#include <windows.h> #include "base/hash.h" #include "base/strings/string_number_conversions.h" @@ -22,8 +22,10 @@ namespace { -BOOL CALLBACK -EnumMonitorCallback(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM data) { +BOOL CALLBACK EnumMonitorCallback(HMONITOR monitor, + HDC hdc, + LPRECT rect, + LPARAM data) { DisplayInfoProvider::DisplayUnitInfoList* all_displays = reinterpret_cast<DisplayInfoProvider::DisplayUnitInfoList*>(data); DCHECK(all_displays); @@ -56,8 +58,8 @@ const display::Display& display, extensions::api::system_display::DisplayUnitInfo* unit) { DisplayUnitInfoList all_displays; - EnumDisplayMonitors( - NULL, NULL, EnumMonitorCallback, reinterpret_cast<LPARAM>(&all_displays)); + EnumDisplayMonitors(NULL, NULL, EnumMonitorCallback, + reinterpret_cast<LPARAM>(&all_displays)); for (size_t i = 0; i < all_displays.size(); ++i) { if (unit->id == all_displays[i].id) { unit->name = all_displays[i].name;
diff --git a/chrome/browser/extensions/display_info_provider_win.h b/chrome/browser/extensions/system_display/display_info_provider_win.h similarity index 73% rename from chrome/browser/extensions/display_info_provider_win.h rename to chrome/browser/extensions/system_display/display_info_provider_win.h index 575ca4eb..26b8eaca 100644 --- a/chrome/browser/extensions/display_info_provider_win.h +++ b/chrome/browser/extensions/system_display/display_info_provider_win.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTENSIONS_DISPLAY_INFO_PROVIDER_WIN_H_ -#define CHROME_BROWSER_EXTENSIONS_DISPLAY_INFO_PROVIDER_WIN_H_ +#ifndef CHROME_BROWSER_EXTENSIONS_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_WIN_H_ +#define CHROME_BROWSER_EXTENSIONS_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_WIN_H_ #include "base/macros.h" #include "extensions/browser/api/system_display/display_info_provider.h" @@ -25,4 +25,4 @@ } // namespace extensions -#endif // CHROME_BROWSER_EXTENSIONS_DISPLAY_INFO_PROVIDER_WIN_H_ +#endif // CHROME_BROWSER_EXTENSIONS_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_WIN_H_
diff --git a/chrome/browser/extensions/test_extension_prefs.cc b/chrome/browser/extensions/test_extension_prefs.cc index 014c11d..004d3da 100644 --- a/chrome/browser/extensions/test_extension_prefs.cc +++ b/chrome/browser/extensions/test_extension_prefs.cc
@@ -142,6 +142,7 @@ base::DictionaryValue dictionary; dictionary.SetString(manifest_keys::kName, name); dictionary.SetString(manifest_keys::kVersion, "0.1"); + dictionary.SetInteger(manifest_keys::kManifestVersion, 2); return AddExtensionWithManifest(dictionary, Manifest::INTERNAL); }
diff --git a/chrome/browser/extensions/updater/extension_updater_unittest.cc b/chrome/browser/extensions/updater/extension_updater_unittest.cc index cd6828e..66020349 100644 --- a/chrome/browser/extensions/updater/extension_updater_unittest.cc +++ b/chrome/browser/extensions/updater/extension_updater_unittest.cc
@@ -342,6 +342,7 @@ base::StringPrintf("%d.0.0.0", i)); manifest.SetString(manifest_keys::kName, base::StringPrintf("Extension %d.%d", id, i)); + manifest.SetInteger(manifest_keys::kManifestVersion, 2); if (update_url) manifest.SetString(manifest_keys::kUpdateURL, *update_url); scoped_refptr<Extension> e =
diff --git a/chrome/browser/media/android/router/media_router_dialog_controller_android.cc b/chrome/browser/media/android/router/media_router_dialog_controller_android.cc index 845c648..0be513e 100644 --- a/chrome/browser/media/android/router/media_router_dialog_controller_android.cc +++ b/chrome/browser/media/android/router/media_router_dialog_controller_android.cc
@@ -141,7 +141,9 @@ void MediaRouterDialogControllerAndroid::CreateMediaRouterDialog() { // TODO(crbug.com/736568): Re-enable dialog in VR. - if (vr::VrTabHelper::IsInVr(initiator())) { + if (vr::VrTabHelper::IsUiSuppressedInVr( + initiator(), + vr::UiSuppressedElement::kMediaRouterPresentationRequest)) { CancelPresentationRequest(); return; }
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc index abb830ea..4a54362 100644 --- a/chrome/browser/password_manager/chrome_password_manager_client.cc +++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -234,9 +234,9 @@ // The password manager is disabled while VR (virtual reality) is being used, // as the use of conventional UI elements might harm the user experience in // VR. - if (vr::VrTabHelper::IsInVr(web_contents())) { + if (vr::VrTabHelper::IsUiSuppressedInVr( + web_contents(), vr::UiSuppressedElement::kPasswordManager)) { is_enabled = false; - vr::VrTabHelper::UISuppressed(vr::UiSuppressedElement::kPasswordManager); } if (log_manager_->IsLoggingActive()) {
diff --git a/chrome/browser/permissions/permission_manager.cc b/chrome/browser/permissions/permission_manager.cc index 9349cc3..af0c4c0e 100644 --- a/chrome/browser/permissions/permission_manager.cc +++ b/chrome/browser/permissions/permission_manager.cc
@@ -53,7 +53,6 @@ #endif #if defined(OS_ANDROID) -#include "chrome/browser/android/chrome_feature_list.h" #include "chrome/browser/geolocation/geolocation_permission_context_android.h" #else #include "chrome/browser/geolocation/geolocation_permission_context.h" @@ -374,16 +373,12 @@ content::WebContents* web_contents = content::WebContents::FromRenderFrameHost(render_frame_host); -#if defined(OS_ANDROID) - if (vr::VrTabHelper::IsInVr(web_contents) && - !base::FeatureList::IsEnabled( - chrome::android::kVrBrowsingNativeAndroidUi)) { - vr::VrTabHelper::UISuppressed(vr::UiSuppressedElement::kPermissionRequest); + if (vr::VrTabHelper::IsUiSuppressedInVr( + web_contents, vr::UiSuppressedElement::kPermissionRequest)) { callback.Run( std::vector<ContentSetting>(permissions.size(), CONTENT_SETTING_BLOCK)); return kNoPendingOperation; } -#endif GURL embedding_origin = web_contents->GetLastCommittedURL().GetOrigin(); GURL canonical_requesting_origin =
diff --git a/chrome/browser/profiling_host/BUILD.gn b/chrome/browser/profiling_host/BUILD.gn index b515201..aa354dc 100644 --- a/chrome/browser/profiling_host/BUILD.gn +++ b/chrome/browser/profiling_host/BUILD.gn
@@ -2,6 +2,27 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +static_library("profiling_host") { + sources = [ + "background_profiling_triggers.cc", + "background_profiling_triggers.h", + "chrome_browser_main_extra_parts_profiling.cc", + "chrome_browser_main_extra_parts_profiling.h", + "chrome_client_connection_manager.cc", + "chrome_client_connection_manager.h", + "profiling_process_host.cc", + "profiling_process_host.h", + ] + + deps = [ + "//base", + "//components/heap_profiling", + "//components/services/heap_profiling/public/cpp", + "//content/public/browser", + "//content/public/common", + ] +} + if (!is_android) { source_set("profiling_browsertests") { testonly = true
diff --git a/chrome/browser/profiling_host/chrome_browser_main_extra_parts_profiling.cc b/chrome/browser/profiling_host/chrome_browser_main_extra_parts_profiling.cc index 6e5b891..25101c27 100644 --- a/chrome/browser/profiling_host/chrome_browser_main_extra_parts_profiling.cc +++ b/chrome/browser/profiling_host/chrome_browser_main_extra_parts_profiling.cc
@@ -27,7 +27,7 @@ if (mode != heap_profiling::Mode::kNone) { heap_profiling::ProfilingProcessHost::Start( connection, mode, heap_profiling::GetStackModeForStartup(), - heap_profiling::GetSamplingRateForStartup()); + heap_profiling::GetSamplingRateForStartup(), base::OnceClosure()); } #endif }
diff --git a/chrome/browser/profiling_host/chrome_client_connection_manager.cc b/chrome/browser/profiling_host/chrome_client_connection_manager.cc new file mode 100644 index 0000000..645dec9 --- /dev/null +++ b/chrome/browser/profiling_host/chrome_client_connection_manager.cc
@@ -0,0 +1,23 @@ +// 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. + +#include "chrome/browser/profiling_host/chrome_client_connection_manager.h" + +#include "chrome/browser/profiles/profile.h" +#include "content/public/browser/render_process_host.h" + +namespace heap_profiling { + +ChromeClientConnectionManager::ChromeClientConnectionManager( + base::WeakPtr<Controller> controller, + Mode mode) + : ClientConnectionManager(controller, mode) {} + +bool ChromeClientConnectionManager::AllowedToProfileRenderer( + content::RenderProcessHost* host) { + return Profile::FromBrowserContext(host->GetBrowserContext()) + ->GetProfileType() != Profile::INCOGNITO_PROFILE; +} + +} // namespace heap_profiling
diff --git a/chrome/browser/profiling_host/chrome_client_connection_manager.h b/chrome/browser/profiling_host/chrome_client_connection_manager.h new file mode 100644 index 0000000..ba7e99db --- /dev/null +++ b/chrome/browser/profiling_host/chrome_client_connection_manager.h
@@ -0,0 +1,28 @@ +// 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 CHROME_BROWSER_PROFILING_HOST_CHROME_CLIENT_CONNECTION_MANAGER_H_ +#define CHROME_BROWSER_PROFILING_HOST_CHROME_CLIENT_CONNECTION_MANAGER_H_ + +#include "components/heap_profiling/client_connection_manager.h" + +namespace heap_profiling { + +// This class overrides ClientConnectionManager in order to prevent incognito +// renderers from being profiled. +// Like ClientConnectionManager, this class must only be constructed/accessed +// from the UI thread. +class ChromeClientConnectionManager : public ClientConnectionManager { + public: + ChromeClientConnectionManager(base::WeakPtr<Controller> controller, + Mode mode); + bool AllowedToProfileRenderer(content::RenderProcessHost* host) override; + + private: + DISALLOW_COPY_AND_ASSIGN(ChromeClientConnectionManager); +}; + +} // namespace heap_profiling + +#endif // CHROME_BROWSER_PROFILING_HOST_CHROME_CLIENT_CONNECTION_MANAGER_H_
diff --git a/chrome/browser/profiling_host/chrome_client_connection_manager_unittest.cc b/chrome/browser/profiling_host/chrome_client_connection_manager_unittest.cc new file mode 100644 index 0000000..357fd15 --- /dev/null +++ b/chrome/browser/profiling_host/chrome_client_connection_manager_unittest.cc
@@ -0,0 +1,34 @@ +// 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. + +#include "chrome/browser/profiling_host/chrome_client_connection_manager.h" + +#include "chrome/test/base/testing_profile.h" +#include "components/services/heap_profiling/public/cpp/settings.h" +#include "content/public/test/mock_render_process_host.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace heap_profiling { + +TEST(ChromeClientConnectionManager, ShouldProfileNewRenderer) { + content::TestBrowserThreadBundle thread_bundle; + + ChromeClientConnectionManager manager(nullptr, Mode::kNone); + + TestingProfile testing_profile; + content::MockRenderProcessHost rph(&testing_profile); + + manager.SetModeForTesting(Mode::kNone); + EXPECT_FALSE(manager.ShouldProfileNewRenderer(&rph)); + + manager.SetModeForTesting(Mode::kAll); + EXPECT_TRUE(manager.ShouldProfileNewRenderer(&rph)); + + Profile* incognito_profile = testing_profile.GetOffTheRecordProfile(); + content::MockRenderProcessHost incognito_rph(incognito_profile); + EXPECT_FALSE(manager.ShouldProfileNewRenderer(&incognito_rph)); +} + +} // namespace heap_profiling
diff --git a/chrome/browser/profiling_host/profiling_process_host.cc b/chrome/browser/profiling_host/profiling_process_host.cc index 83891c4..6555f04 100644 --- a/chrome/browser/profiling_host/profiling_process_host.cc +++ b/chrome/browser/profiling_host/profiling_process_host.cc
@@ -11,46 +11,23 @@ #include "base/callback_helpers.h" #include "base/files/file_util.h" +#include "base/memory/ref_counted_memory.h" #include "base/metrics/histogram_macros.h" -#include "base/numerics/safe_conversions.h" -#include "base/process/process_iterator.h" -#include "base/rand_util.h" -#include "base/strings/stringprintf.h" #include "base/sys_info.h" #include "base/task_scheduler/post_task.h" -#include "base/threading/thread_task_runner_handle.h" -#include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/trace_log.h" #include "base/values.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiling_host/chrome_client_connection_manager.h" #include "chrome/browser/tracing/crash_service_uploader.h" -#include "chrome/common/chrome_content_client.h" -#include "chrome/common/chrome_switches.h" #include "components/services/heap_profiling/public/cpp/controller.h" -#include "components/services/heap_profiling/public/cpp/sender_pipe.h" #include "components/services/heap_profiling/public/cpp/settings.h" -#include "components/services/heap_profiling/public/cpp/switches.h" -#include "components/services/heap_profiling/public/mojom/constants.mojom.h" #include "components/version_info/version_info.h" -#include "content/public/browser/browser_child_process_host.h" -#include "content/public/browser/browser_child_process_host_iterator.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/notification_service.h" -#include "content/public/browser/notification_types.h" -#include "content/public/browser/render_process_host.h" #include "content/public/browser/tracing_controller.h" -#include "content/public/common/bind_interface_helpers.h" -#include "content/public/common/child_process_host.h" -#include "content/public/common/content_switches.h" #include "content/public/common/service_manager_connection.h" -#include "content/public/common/service_names.mojom.h" -#include "mojo/edk/embedder/platform_channel_pair.h" -#include "mojo/edk/embedder/scoped_platform_handle.h" -#include "mojo/public/cpp/system/platform_handle.h" #include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h" -#include "services/resource_coordinator/public/mojom/service_constants.mojom.h" #include "third_party/zlib/zlib.h" #if defined(OS_WIN) @@ -80,41 +57,6 @@ namespace { -// This helper class cleans up initialization boilerplate for the callers who -// need to create ProfilingClients bound to various different things. -class ProfilingClientBinder { - public: - // Binds to a non-renderer-child-process' ProfilingClient. - explicit ProfilingClientBinder(content::BrowserChildProcessHost* host) - : ProfilingClientBinder() { - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); - content::BindInterface(host->GetHost(), std::move(request_)); - } - - // Binds to a renderer's ProfilingClient. - explicit ProfilingClientBinder(content::RenderProcessHost* host) - : ProfilingClientBinder() { - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - content::BindInterface(host, std::move(request_)); - } - - // Binds to the local connector to get the browser process' ProfilingClient. - explicit ProfilingClientBinder(service_manager::Connector* connector) - : ProfilingClientBinder() { - connector->BindInterface(content::mojom::kBrowserServiceName, - std::move(request_)); - } - - mojom::ProfilingClientPtr take() { return std::move(memlog_client_); } - - private: - ProfilingClientBinder() - : memlog_client_(), request_(mojo::MakeRequest(&memlog_client_)) {} - - mojom::ProfilingClientPtr memlog_client_; - mojom::ProfilingClientRequest request_; -}; - void OnTraceUploadComplete(TraceCrashServiceUploader* uploader, bool success, const std::string& feedback) { @@ -166,85 +108,22 @@ } // namespace -ProfilingProcessHost::ProfilingProcessHost() - : is_registered_(false), background_triggers_(this), mode_(Mode::kNone) {} +ProfilingProcessHost::ProfilingProcessHost() : background_triggers_(this) {} -ProfilingProcessHost::~ProfilingProcessHost() { - if (is_registered_) - Unregister(); -} +ProfilingProcessHost::~ProfilingProcessHost() = default; -void ProfilingProcessHost::Register() { - DCHECK(!is_registered_); - Add(this); - registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED, - content::NotificationService::AllBrowserContextsAndSources()); - registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, - content::NotificationService::AllBrowserContextsAndSources()); - registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, - content::NotificationService::AllBrowserContextsAndSources()); - is_registered_ = true; -} - -void ProfilingProcessHost::Unregister() { - DCHECK(is_registered_); - Remove(this); -} - -void ProfilingProcessHost::BrowserChildProcessLaunchedAndConnected( - const content::ChildProcessData& data) { - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - - // Ensure this is only called for all non-renderer browser child processes - // so as not to collide with logic in ProfilingProcessHost::Observe(). - DCHECK_NE(data.process_type, content::ProcessType::PROCESS_TYPE_RENDERER); - - if (!ShouldProfileNonRendererProcessType(data.process_type)) { - return; - } - - StartProfilingNonRendererChild(data); -} - -void ProfilingProcessHost::Observe( - int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) { - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - content::RenderProcessHost* host = - content::Source<content::RenderProcessHost>(source).ptr(); - - // NOTIFICATION_RENDERER_PROCESS_CLOSED corresponds to death of an underlying - // RenderProcess. NOTIFICATION_RENDERER_PROCESS_TERMINATED corresponds to when - // the RenderProcessHost's lifetime is ending. Ideally, we'd only listen to - // the former, but if the RenderProcessHost is destroyed before the - // RenderProcess, then the former is never sent. - if ((type == content::NOTIFICATION_RENDERER_PROCESS_TERMINATED || - type == content::NOTIFICATION_RENDERER_PROCESS_CLOSED)) { - profiled_renderers_.erase(host); - } - - if (type == content::NOTIFICATION_RENDERER_PROCESS_CREATED && - ShouldProfileNewRenderer(host)) { - StartProfilingRenderer(host); - } -} - -void ProfilingProcessHost::AddClientToProfilingService( - mojom::ProfilingClientPtr client, - base::ProcessId pid, - mojom::ProcessType process_type) { - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); - - controller_->StartProfilingClient(std::move(client), pid, process_type); +Mode ProfilingProcessHost::GetMode() { + if (!client_connection_manager_) + return Mode::kNone; + return client_connection_manager_->GetMode(); } // static -ProfilingProcessHost* ProfilingProcessHost::Start( - content::ServiceManagerConnection* connection, - Mode mode, - mojom::StackMode stack_mode, - uint32_t sampling_rate) { +void ProfilingProcessHost::Start(content::ServiceManagerConnection* connection, + Mode mode, + mojom::StackMode stack_mode, + uint32_t sampling_rate, + base::OnceClosure closure) { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); CHECK(!has_started_); has_started_ = true; @@ -256,27 +135,8 @@ FROM_HERE, base::BindOnce(&ProfilingProcessHost::StartServiceOnIOThread, base::Unretained(host), stack_mode, sampling_rate, - connection->GetConnector()->Clone())); - - host->SetMode(mode); - host->Register(); - host->ConfigureBackgroundProfilingTriggers(); - host->metrics_timer_.Start( - FROM_HERE, base::TimeDelta::FromHours(24), - base::Bind(&ProfilingProcessHost::ReportMetrics, base::Unretained(host))); - - // Start profiling the browser process if desired. - if (host->ShouldProfileNonRendererProcessType( - content::ProcessType::PROCESS_TYPE_BROWSER)) { - content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::IO) - ->PostTask( - FROM_HERE, - base::BindOnce( - &ProfilingProcessHost::StartProfilingBrowserProcessOnIOThread, - base::Unretained(host))); - } - - return host; + connection->GetConnector()->Clone(), mode, + std::move(closure))); } // static @@ -418,6 +278,44 @@ base::Unretained(this), std::move(callback))); } +void ProfilingProcessHost::StartManualProfiling(base::ProcessId pid) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + + if (has_started_) { + if (client_connection_manager_) { + client_connection_manager_->StartProfilingProcess(pid); + } else { + // Starting the ProfilingProcessHost requires hopping to the IO thread and + // back. That means that there's a very short period of time where + // has_started_ evaluates to true, but client_connection_manager_ has not + // yet been created. In this case, we hop to the IO thread and back. + base::OnceClosure callback = base::BindOnce( + [](ProfilingProcessHost* host, base::ProcessId pid) { + content::BrowserThread::GetTaskRunnerForThread( + content::BrowserThread::UI) + ->PostTask( + FROM_HERE, + base::BindOnce(&ProfilingProcessHost::StartManualProfiling, + base::Unretained(host), pid)); + }, + base::Unretained(this), pid); + content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::IO) + ->PostTask(FROM_HERE, std::move(callback)); + } + } else { + base::Closure callback = base::Bind( + [](base::ProcessId pid) { + ProfilingProcessHost::GetInstance() + ->client_connection_manager_->StartProfilingProcess(pid); + }, + pid); + ProfilingProcessHost::Start( + content::ServiceManagerConnection::GetForProcess(), Mode::kManual, + GetStackModeForStartup(), GetSamplingRateForStartup(), + std::move(callback)); + } +} + void ProfilingProcessHost::GetProfiledPidsOnIOThread( GetProfiledPidsCallback callback) { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); @@ -439,42 +337,6 @@ controller_->GetProfiledPids(std::move(post_result_to_ui_thread)); } -void ProfilingProcessHost::StartManualProfiling(base::ProcessId pid) { - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - - if (!has_started_) { - ProfilingProcessHost::Start( - content::ServiceManagerConnection::GetForProcess(), Mode::kManual, - GetStackModeForStartup(), GetSamplingRateForStartup()); - } else { - SetMode(Mode::kManual); - } - - // The RenderProcessHost iterator must be used on the UI thread. - // The BrowserChildProcessHostIterator iterator must be used on the IO thread. - for (auto iter = content::RenderProcessHost::AllHostsIterator(); - !iter.IsAtEnd(); iter.Advance()) { - if (pid == base::GetProcId(iter.GetCurrentValue()->GetHandle())) { - StartProfilingRenderer(iter.GetCurrentValue()); - return; - } - } - - content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::IO) - ->PostTask( - FROM_HERE, - base::BindOnce(&ProfilingProcessHost::StartProfilingPidOnIOThread, - base::Unretained(this), pid)); -} - -void ProfilingProcessHost::StartProfilingRenderersForTesting() { - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - for (auto iter = content::RenderProcessHost::AllHostsIterator(); - !iter.IsAtEnd(); iter.Advance()) { - StartProfilingRenderer(iter.GetCurrentValue()); - } -} - void ProfilingProcessHost::SetKeepSmallAllocations( bool keep_small_allocations) { // May get called on different threads, we need to be on the IO thread to @@ -491,51 +353,40 @@ controller_->SetKeepSmallAllocations(keep_small_allocations); } -void ProfilingProcessHost::StartProfilingPidOnIOThread(base::ProcessId pid) { - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); - - // Check if the request is for the current process. - if (pid == base::GetCurrentProcId()) { - ProfilingClientBinder client(connector_.get()); - AddClientToProfilingService(client.take(), base::Process::Current().Pid(), - mojom::ProcessType::BROWSER); - return; - } - - for (content::BrowserChildProcessHostIterator browser_child_iter; - !browser_child_iter.Done(); ++browser_child_iter) { - const content::ChildProcessData& data = browser_child_iter.GetData(); - if (base::GetProcId(data.handle) == pid) { - content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::UI) - ->PostTask(FROM_HERE, - base::BindOnce( - &ProfilingProcessHost::StartProfilingNonRendererChild, - base::Unretained(this), data)); - return; - } - } - - DLOG(WARNING) - << "Attempt to start profiling failed as no process was found with pid: " - << pid; -} - void ProfilingProcessHost::StartServiceOnIOThread( mojom::StackMode stack_mode, uint32_t sampling_rate, - std::unique_ptr<service_manager::Connector> connector) { + std::unique_ptr<service_manager::Connector> connector, + Mode mode, + base::OnceClosure closure) { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); controller_.reset( new Controller(std::move(connector), stack_mode, sampling_rate)); + base::WeakPtr<Controller> controller_weak_ptr = controller_->GetWeakPtr(); + + content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::UI) + ->PostTask(FROM_HERE, + base::BindOnce( + &ProfilingProcessHost::FinishPostServiceSetupOnUIThread, + base::Unretained(this), mode, std::move(closure), + controller_weak_ptr)); } -void ProfilingProcessHost::StartProfilingBrowserProcessOnIOThread() { - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); - ProfilingClientBinder client(connector_.get()); - controller_->StartProfilingClient(client.take(), - base::Process::Current().Pid(), - mojom::ProcessType::BROWSER); +void ProfilingProcessHost::FinishPostServiceSetupOnUIThread( + Mode mode, + base::OnceClosure closure, + base::WeakPtr<Controller> controller_weak_ptr) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + client_connection_manager_.reset( + new ChromeClientConnectionManager(controller_weak_ptr, mode)); + client_connection_manager_->Start(); + ConfigureBackgroundProfilingTriggers(); + metrics_timer_.Start( + FROM_HERE, base::TimeDelta::FromHours(24), + base::Bind(&ProfilingProcessHost::ReportMetrics, base::Unretained(this))); + if (closure) + std::move(closure).Run(); } void ProfilingProcessHost::SaveTraceToFileOnBlockingThread( @@ -569,123 +420,11 @@ written_bytes == trace.size())); } -void ProfilingProcessHost::SetMode(Mode mode) { - base::AutoLock l(mode_lock_); - mode_ = mode; -} - void ProfilingProcessHost::ReportMetrics() { UMA_HISTOGRAM_ENUMERATION("OutOfProcessHeapProfiling.ProfilingMode", GetMode(), Mode::kCount); } -bool ProfilingProcessHost::ShouldProfileNonRendererProcessType( - int process_type) { - switch (GetMode()) { - case Mode::kAll: - return true; - - case Mode::kAllRenderers: - // Renderer logic is handled in ProfilingProcessHost::Observe. - return false; - - case Mode::kManual: - return false; - - case Mode::kMinimal: - return (process_type == content::ProcessType::PROCESS_TYPE_GPU || - process_type == content::ProcessType::PROCESS_TYPE_BROWSER); - - case Mode::kGpu: - return process_type == content::ProcessType::PROCESS_TYPE_GPU; - - case Mode::kBrowser: - return process_type == content::ProcessType::PROCESS_TYPE_BROWSER; - - case Mode::kRendererSampling: - // Renderer logic is handled in ProfilingProcessHost::Observe. - return false; - - case Mode::kNone: - return false; - - case Mode::kCount: - // Fall through to hit NOTREACHED() below. - {} - } - - NOTREACHED(); - return false; -} - -bool ProfilingProcessHost::ShouldProfileNewRenderer( - content::RenderProcessHost* renderer) { - Mode mode = GetMode(); - // Never profile incognito processes. - if (Profile::FromBrowserContext(renderer->GetBrowserContext()) - ->GetProfileType() == Profile::INCOGNITO_PROFILE) { - return false; - } - - if (mode == Mode::kAll || mode == Mode::kAllRenderers) { - return true; - } else if (mode == Mode::kRendererSampling && profiled_renderers_.empty()) { - // Sample renderers with a 1/3 probability. - return (base::RandUint64() % 100000) < 33333; - } - - return false; -} - -void ProfilingProcessHost::StartProfilingNonRendererChild( - const content::ChildProcessData& data) { - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - mojom::ProcessType process_type = - (data.process_type == content::ProcessType::PROCESS_TYPE_GPU) - ? mojom::ProcessType::GPU - : mojom::ProcessType::OTHER; - - content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::IO) - ->PostTask( - FROM_HERE, - base::BindOnce( - &ProfilingProcessHost::StartProfilingNonRendererChildOnIOThread, - base::Unretained(this), data.id, base::GetProcId(data.handle), - process_type)); -} - -void ProfilingProcessHost::StartProfilingNonRendererChildOnIOThread( - int child_process_id, - base::ProcessId proc_id, - mojom::ProcessType process_type) { - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); - - content::BrowserChildProcessHost* host = - content::BrowserChildProcessHost::FromID(child_process_id); - if (!host) - return; - - // Tell the child process to start profiling. - ProfilingClientBinder client(host); - AddClientToProfilingService(client.take(), proc_id, process_type); -} - -void ProfilingProcessHost::StartProfilingRenderer( - content::RenderProcessHost* host) { - profiled_renderers_.insert(host); - - // Tell the child process to start profiling. - ProfilingClientBinder client(host); - - content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::IO) - ->PostTask( - FROM_HERE, - base::BindOnce(&ProfilingProcessHost::AddClientToProfilingService, - base::Unretained(this), client.take(), - base::GetProcId(host->GetHandle()), - mojom::ProcessType::RENDERER)); -} - bool ProfilingProcessHost::TakingTraceForUpload() { base::AutoLock lock(taking_trace_for_upload_lock_); return taking_trace_for_upload_;
diff --git a/chrome/browser/profiling_host/profiling_process_host.h b/chrome/browser/profiling_host/profiling_process_host.h index d655a59..0ef3ffa 100644 --- a/chrome/browser/profiling_host/profiling_process_host.h +++ b/chrome/browser/profiling_host/profiling_process_host.h
@@ -11,29 +11,26 @@ #include "base/macros.h" #include "base/memory/singleton.h" +#include "base/memory/weak_ptr.h" #include "base/process/process.h" -#include "build/build_config.h" #include "chrome/browser/profiling_host/background_profiling_triggers.h" -#include "components/services/heap_profiling/public/cpp/client.h" #include "components/services/heap_profiling/public/mojom/heap_profiling_client.mojom.h" -#include "components/services/heap_profiling/public/mojom/heap_profiling_service.mojom.h" -#include "content/public/browser/browser_child_process_observer.h" -#include "content/public/browser/child_process_data.h" -#include "content/public/browser/notification_observer.h" -#include "content/public/browser/notification_registrar.h" -#include "content/public/common/service_manager_connection.h" -#include "services/service_manager/public/cpp/connector.h" namespace base { class FilePath; } // namespace base namespace content { -class RenderProcessHost; +class ServiceManagerConnection; } // namespace content +namespace service_manager { +class Connector; +} // namespace service_manager + namespace heap_profiling { +class ChromeClientConnectionManager; class Controller; enum class Mode; @@ -51,28 +48,19 @@ // to support starting the profiling process very early in the startup // process (to get most memory events) before other infrastructure like the // I/O thread has been started. -// -// TODO(ajwong): This host class seems over kill at this point. Can this be -// fully subsumed by the ProfilingService class? -class ProfilingProcessHost : public content::BrowserChildProcessObserver, - content::NotificationObserver { +class ProfilingProcessHost { public: - // Returns the mode. - Mode GetMode() { - base::AutoLock l(mode_lock_); - return mode_; - } - // Returns the mode specified by the command line or via about://flags. + Mode GetMode(); - bool ShouldProfileNonRendererProcessType(int process_type); - - // Launches the profiling process and returns a pointer to it. - static ProfilingProcessHost* Start( - content::ServiceManagerConnection* connection, - Mode mode, - mojom::StackMode stack_mode, - uint32_t sampling_rate); + // Launches the heap profiling service and connects clients. Must be called + // from the UI thread. This requires hopping to the IO thread and back. + // |callback| will be called on the UI thread after this is finished. + static void Start(content::ServiceManagerConnection* connection, + Mode mode, + mojom::StackMode stack_mode, + uint32_t sampling_rate, + base::OnceClosure callback); // Returns true if Start() has been called. static bool has_started() { return has_started_; } @@ -122,11 +110,6 @@ // Starts profiling the process with the given id. void StartManualProfiling(base::ProcessId pid); - // This function starts profiling all renderers. Attempting to start profiling - // a renderer that is already being profiled is a no-op [the new request is - // dropped by the profiling service]. - void StartProfilingRenderersForTesting(); - // Public for testing. Controls whether the profiling service keeps small // allocations in heap dumps. void SetKeepSmallAllocations(bool keep_small_allocations); @@ -136,44 +119,26 @@ friend class BackgroundProfilingTriggersTest; friend class MemlogBrowserTest; friend class ProfilingTestDriver; - FRIEND_TEST_ALL_PREFIXES(ProfilingProcessHost, ShouldProfileNewRenderer); ProfilingProcessHost(); - ~ProfilingProcessHost() override; - - void Register(); - void Unregister(); - - // Set/Get the profiling mode. Exposed for unittests. - void SetMode(Mode mode); - - // BrowserChildProcessObserver - // Observe connection of non-renderer child processes. - void BrowserChildProcessLaunchedAndConnected( - const content::ChildProcessData& data) override; - - // NotificationObserver - // Observe connection of renderer child processes. - void Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) override; + ~ProfilingProcessHost(); // Starts the profiling process. void StartServiceOnIOThread( mojom::StackMode stack_mode, uint32_t sampling_rate, - std::unique_ptr<service_manager::Connector> connector); + std::unique_ptr<service_manager::Connector> connector, + Mode mode, + base::OnceClosure closure); - void StartProfilingBrowserProcessOnIOThread(); + void FinishPostServiceSetupOnUIThread( + Mode mode, + base::OnceClosure closure, + base::WeakPtr<Controller> controller_weak_ptr); // Called on the UI thread after the heap dump has been added to the trace. void DumpProcessFinishedUIThread(); - // Sends the end of the data pipe to the profiling service. - void AddClientToProfilingService(mojom::ProfilingClientPtr client, - base::ProcessId pid, - mojom::ProcessType process_type); - void SaveTraceToFileOnBlockingThread(base::FilePath dest, std::string trace, SaveTraceFinishedCallback done); @@ -181,34 +146,20 @@ // Reports the profiling mode. void ReportMetrics(); - // Helpers for controlling process selection for the sampling modes. - bool ShouldProfileNewRenderer(content::RenderProcessHost* renderer); - - // Sets up the profiling connection for the given child process. - void StartProfilingNonRendererChild(const content::ChildProcessData&); - void StartProfilingNonRendererChildOnIOThread( - int child_process_id, - base::ProcessId proc_id, - mojom::ProcessType process_type); - - void StartProfilingRenderer(content::RenderProcessHost* host); - void GetProfiledPidsOnIOThread(GetProfiledPidsCallback callback); void StartProfilingPidOnIOThread(base::ProcessId pid); bool TakingTraceForUpload(); bool SetTakingTraceForUpload(bool new_state); - content::NotificationRegistrar registrar_; - // Bound to the IO thread. std::unique_ptr<service_manager::Connector> connector_; // Bound to the IO thread. std::unique_ptr<Controller> controller_; - // Whether or not the host is registered to the |registrar_|. - bool is_registered_; + // Bound to the UI thread. + std::unique_ptr<ChromeClientConnectionManager> client_connection_manager_; // Handle background triggers on high memory pressure. A trigger will call // |RequestProcessReport| on this instance. @@ -217,36 +168,12 @@ // Every 24-hours, reports the profiling mode. base::RepeatingTimer metrics_timer_; - // The mode determines which processes should be profiled. - Mode mode_; - base::Lock mode_lock_; - - // The stack mode determines the type of information that is stored for each - // stack. - mojom::StackMode stack_mode_; - bool should_sample_ = false; uint32_t sampling_rate_ = 1; // Whether or not the profiling host is started. static bool has_started_; - // This is used to identify the currently profiled renderers. Elements should - // only be accessed on the UI thread and their values should be considered - // opaque. - // - // Semantically, the elements must be something that identifies which - // specific RenderProcess is being profiled. When the underlying RenderProcess - // goes away, the element must be removed. The RenderProcessHost - // pointer and the NOTIFICATION_RENDERER_PROCESS_CREATED notification can be - // used to provide these semantics. - // - // This variable represents renderers that have been instructed to start - // profiling - it does not reflect whether a renderer is currently still being - // profiled. That information is only known by the profiling service, and for - // simplicity, it's easier to just track this variable in this process. - std::unordered_set<void*> profiled_renderers_; - // True if the instance is attempting to take a trace to upload to the crash // servers. Pruning of small allocations is always enabled for these traces. bool taking_trace_for_upload_ = false;
diff --git a/chrome/browser/profiling_host/profiling_test_driver.cc b/chrome/browser/profiling_host/profiling_test_driver.cc index a0aa518a..f08e43c88 100644 --- a/chrome/browser/profiling_host/profiling_test_driver.cc +++ b/chrome/browser/profiling_host/profiling_test_driver.cc
@@ -565,15 +565,6 @@ if (!initialization_success_) return false; if (ShouldProfileRenderer()) { - // On Android, there is a warm-up renderer that is sometimes started - // before the ProfilingProcessHost can be started. This renderer will - // therefore not be profiled, even if Chrome is started with the - // --memlog=all-renderers switch. - content::BrowserThread::PostTask( - content::BrowserThread::UI, FROM_HERE, - base::Bind(&ProfilingProcessHost::StartProfilingRenderersForTesting, - base::Unretained(ProfilingProcessHost::GetInstance()))); - content::BrowserThread::PostTask( content::BrowserThread::UI, FROM_HERE, base::Bind( @@ -665,7 +656,7 @@ ? (options_.sample_everything ? 2 : kSampleRate) : 1; ProfilingProcessHost::Start(connection, options_.mode, options_.stack_mode, - sampling_rate); + sampling_rate, base::Closure()); ProfilingProcessHost::GetInstance()->SetKeepSmallAllocations(true); if (run_loop)
diff --git a/chrome/browser/resources/settings/a11y_page/compiled_resources2.gyp b/chrome/browser/resources/settings/a11y_page/compiled_resources2.gyp index 8a99d30d..6f21512 100644 --- a/chrome/browser/resources/settings/a11y_page/compiled_resources2.gyp +++ b/chrome/browser/resources/settings/a11y_page/compiled_resources2.gyp
@@ -24,11 +24,16 @@ { 'target_name': 'tts_subpage', 'dependencies': [ + 'externs', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data', '../settings_page/compiled_resources2.gyp:settings_animated_pages', '../compiled_resources2.gyp:route', ], 'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'], }, + { + 'target_name': 'externs', + 'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'], + }, ], }
diff --git a/chrome/browser/resources/settings/a11y_page/externs.js b/chrome/browser/resources/settings/a11y_page/externs.js new file mode 100644 index 0000000..5734b7a6 --- /dev/null +++ b/chrome/browser/resources/settings/a11y_page/externs.js
@@ -0,0 +1,24 @@ +// 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. + +/** + * @fileoverview Stub methods to allow the closure compiler to compile + * successfully for external dependencies which cannot be included in + * compiled_resources2.gyp. + */ + +/** + * @constructor + */ +Window.prototype.speechSynthesis = function() {}; + +/** + * @type {function(Object)} + */ +Window.prototype.speechSynthesis.speak = function(utterance) {}; + +/** + * @constructor + */ +Window.prototype.SpeechSynthesisUtterance = function() {};
diff --git a/chrome/browser/resources/settings/a11y_page/tts_subpage.html b/chrome/browser/resources/settings/a11y_page/tts_subpage.html index ca400a5e..b63753a 100644 --- a/chrome/browser/resources/settings/a11y_page/tts_subpage.html +++ b/chrome/browser/resources/settings/a11y_page/tts_subpage.html
@@ -5,6 +5,8 @@ <link rel="import" href="../i18n_setup.html"> <link rel="import" href="../settings_shared_css.html"> <link rel="import" href="../settings_vars_css.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-textarea.html"> <dom-module id="settings-tts-subpage"> <template> @@ -39,7 +41,18 @@ min="0.2" max="3.0"> </settings-slider> </div> - + <h2>$i18n{textToSpeechPreviewHeading}</h2> + <div class="settings-box first"> + <div class="start"> + <paper-textarea id="previewInput" type="text" + label="$i18n{textToSpeechPreviewInputLabel}" + always-float-label value="$i18n{textToSpeechPreviewInput}"> + </paper-textarea> + </div> + <paper-button on-click="onPreviewTtsClick_"> + $i18n{textToSpeechPreviewPlay} + </paper-button> + </div> <h2>$i18n{textToSpeechEngines}</h2> <div class="settings-box block first"> <a href="">$i18n{textToSpeechInstallEngines}</a>
diff --git a/chrome/browser/resources/settings/a11y_page/tts_subpage.js b/chrome/browser/resources/settings/a11y_page/tts_subpage.js index a4877274..41673f54 100644 --- a/chrome/browser/resources/settings/a11y_page/tts_subpage.js +++ b/chrome/browser/resources/settings/a11y_page/tts_subpage.js
@@ -25,4 +25,13 @@ settings.navigateTo(settings.routes.MANAGE_GOOGLE_TTS_ENGINE_SETTINGS); }, + /** @private */ + onPreviewTtsClick_: function() { + let utter = new window.SpeechSynthesisUtterance(); + if (!utter) + return; + utter.text = this.$.previewInput.value; + window.speechSynthesis.speak(utter); + }, + });
diff --git a/chrome/browser/resources/settings/bluetooth_page/bluetooth_subpage.js b/chrome/browser/resources/settings/bluetooth_page/bluetooth_subpage.js index d8d0ef3..6890575 100644 --- a/chrome/browser/resources/settings/bluetooth_page/bluetooth_subpage.js +++ b/chrome/browser/resources/settings/bluetooth_page/bluetooth_subpage.js
@@ -507,9 +507,7 @@ requestListUpdate_: function() { if (this.deviceList_.length == 0) { // Update immediately for the initial device list. - this.bluetooth.getDevices(devices => { - this.populateDeviceList_(devices); - }); + this.refreshBluetoothList_(); return; } @@ -524,9 +522,7 @@ return; } - this.bluetooth.getDevices(devices => { - this.populateDeviceList_(devices); - }); + this.refreshBluetoothList_(); this.updateTimerId_ = undefined; }, this.listUpdateFrequencyMs); }, @@ -543,33 +539,17 @@ }, /** - * Populate the device list from chrome.bluetooth.getDevices - * Limit the device number to MAX_NUMBER_DEVICE_SHOWN and - * prioritize paired/connecting devices over other devices. - * @param {!Array<!chrome.bluetooth.Device|undefined>} devices + * Requests bluetooth device list from Chrome. Update deviceList_ once the + * results are returned from chrome. * @private */ - populateDeviceList_: function(devices) { - const tempList = []; - let i; - for (i = 0; i < devices.length; i++) { - if (tempList.length == MAX_NUMBER_DEVICE_SHOWN) - break; - - if (!!devices[i].paired || !!devices[i].connecting) { - tempList.push(devices[i]); - devices[i] = undefined; - } - } - - for (i = 0; i < devices.length; i++) { - if (tempList.length == MAX_NUMBER_DEVICE_SHOWN) - break; - - if (devices[i] !== undefined) - tempList.push(devices[i]); - } - - this.deviceList_ = tempList; + refreshBluetoothList_: function() { + const filter = { + filterType: chrome.bluetooth.FilterType.KNOWN, + limit: MAX_NUMBER_DEVICE_SHOWN + }; + this.bluetooth.getDevices(filter, devices => { + this.deviceList_ = devices; + }); }, });
diff --git a/chrome/browser/safe_browsing/protocol_manager.cc b/chrome/browser/safe_browsing/protocol_manager.cc index feb02e1..37e449c 100644 --- a/chrome/browser/safe_browsing/protocol_manager.cc +++ b/chrome/browser/safe_browsing/protocol_manager.cc
@@ -29,9 +29,8 @@ #include "net/http/http_response_headers.h" #include "net/http/http_status_code.h" #include "net/traffic_annotation/network_traffic_annotation.h" -#include "net/url_request/url_fetcher.h" -#include "net/url_request/url_request_context_getter.h" -#include "net/url_request/url_request_status.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/public/cpp/simple_url_loader.h" using base::Time; using base::TimeDelta; @@ -136,10 +135,10 @@ std::unique_ptr<SafeBrowsingProtocolManager> CreateProtocolManager( SafeBrowsingProtocolManagerDelegate* delegate, - net::URLRequestContextGetter* request_context_getter, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, const SafeBrowsingProtocolConfig& config) override { - return base::WrapUnique(new SafeBrowsingProtocolManager( - delegate, request_context_getter, config)); + return base::WrapUnique( + new SafeBrowsingProtocolManager(delegate, url_loader_factory, config)); } private: @@ -155,17 +154,16 @@ std::unique_ptr<SafeBrowsingProtocolManager> SafeBrowsingProtocolManager::Create( SafeBrowsingProtocolManagerDelegate* delegate, - net::URLRequestContextGetter* request_context_getter, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, const SafeBrowsingProtocolConfig& config) { if (!factory_) factory_ = new SBProtocolManagerFactoryImpl(); - return factory_->CreateProtocolManager(delegate, request_context_getter, - config); + return factory_->CreateProtocolManager(delegate, url_loader_factory, config); } SafeBrowsingProtocolManager::SafeBrowsingProtocolManager( SafeBrowsingProtocolManagerDelegate* delegate, - net::URLRequestContextGetter* request_context_getter, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, const SafeBrowsingProtocolConfig& config) : delegate_(delegate), request_type_(NO_REQUEST), @@ -180,11 +178,10 @@ version_(config.version), update_size_(0), client_name_(config.client_name), - request_context_getter_(request_context_getter), + url_loader_factory_(url_loader_factory), url_prefix_(config.url_prefix), backup_update_reason_(BACKUP_UPDATE_REASON_MAX), - disable_auto_update_(config.disable_auto_update), - url_fetcher_id_(0) { + disable_auto_update_(config.disable_auto_update) { DCHECK(!url_prefix_.empty()); backup_url_prefixes_[BACKUP_UPDATE_REASON_CONNECT] = @@ -214,13 +211,6 @@ void SafeBrowsingProtocolManager::RecordHttpResponseOrErrorCode( const char* metric_name, - const net::URLRequestStatus& status, - int response_code) { - RecordHttpResponseOrErrorCode(metric_name, status.error(), response_code); -} - -void SafeBrowsingProtocolManager::RecordHttpResponseOrErrorCode( - const char* metric_name, int net_error, int response_code) { base::UmaHistogramSparse(metric_name, @@ -289,21 +279,21 @@ } } })"); - std::unique_ptr<net::URLFetcher> fetcher_ptr = - net::URLFetcher::Create(url_fetcher_id_++, gethash_url, - net::URLFetcher::POST, this, traffic_annotation); - net::URLFetcher* fetcher = fetcher_ptr.get(); - data_use_measurement::DataUseUserData::AttachToFetcher( - fetcher, data_use_measurement::DataUseUserData::SAFE_BROWSING); - hash_requests_[fetcher] = {std::move(fetcher_ptr), - FullHashDetails(callback, is_download)}; + auto resource_request = std::make_unique<network::ResourceRequest>(); + resource_request->url = gethash_url; + resource_request->method = "POST"; + resource_request->load_flags = net::LOAD_DISABLE_CACHE; + auto loader_ptr = network::SimpleURLLoader::Create( + std::move(resource_request), traffic_annotation); + loader_ptr->AttachStringForUpload(FormatGetHash(prefixes), "text/plain"); + auto* loader = loader_ptr.get(); + loader_ptr->DownloadToStringOfUnboundedSizeUntilCrashAndDie( + url_loader_factory_.get(), + base::BindOnce(&SafeBrowsingProtocolManager::OnURLLoaderComplete, + base::Unretained(this), loader)); - const std::string get_hash = FormatGetHash(prefixes); - - fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE); - fetcher->SetRequestContext(request_context_getter_.get()); - fetcher->SetUploadData("text/plain", get_hash); - fetcher->Start(); + hash_requests_[loader] = {std::move(loader_ptr), + FullHashDetails(callback, is_download)}; } void SafeBrowsingProtocolManager::GetNextUpdate() { @@ -314,8 +304,6 @@ IssueUpdateRequest(); } -// net::URLFetcherDelegate implementation ---------------------------------- - // All SafeBrowsing request responses are handled here. // TODO(paulg): Clarify with the SafeBrowsing team whether a failed parse of a // chunk should retry the download and parse of that chunk (and @@ -324,23 +312,38 @@ // drop it. This isn't so bad because the next UPDATE_REQUEST we // do will report all the chunks we have. If that chunk is still // required, the SafeBrowsing servers will tell us to get it again. -void SafeBrowsingProtocolManager::OnURLFetchComplete( - const net::URLFetcher* source) { +void SafeBrowsingProtocolManager::OnURLLoaderComplete( + network::SimpleURLLoader* url_loader, + std::unique_ptr<std::string> response_body) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - auto it = hash_requests_.find(source); - int response_code = source->GetResponseCode(); - net::URLRequestStatus status = source->GetStatus(); + int response_code = 0; + if (url_loader->ResponseInfo() && url_loader->ResponseInfo()->headers) + response_code = url_loader->ResponseInfo()->headers->response_code(); + std::string data; + if (response_body) + data = *response_body.get(); + + OnURLLoaderCompleteInternal(url_loader, url_loader->NetError(), response_code, + data); +} + +void SafeBrowsingProtocolManager::OnURLLoaderCompleteInternal( + network::SimpleURLLoader* url_loader, + int net_error, + int response_code, + const std::string& data) { + auto it = hash_requests_.find(url_loader); if (it != hash_requests_.end()) { // GetHash response. - RecordHttpResponseOrErrorCode(kGetHashUmaResponseMetricName, status, + RecordHttpResponseOrErrorCode(kGetHashUmaResponseMetricName, net_error, response_code); const FullHashDetails& details = it->second.second; std::vector<SBFullHashResult> full_hashes; base::TimeDelta cache_lifetime; - if (status.is_success() && (response_code == net::HTTP_OK || - response_code == net::HTTP_NO_CONTENT)) { + if (net_error == net::OK && (response_code == net::HTTP_OK || + response_code == net::HTTP_NO_CONTENT)) { // For tracking our GetHash false positive (net::HTTP_NO_CONTENT) rate, // compared to real (net::HTTP_OK) responses. if (response_code == net::HTTP_OK) @@ -350,8 +353,6 @@ gethash_error_count_ = 0; gethash_back_off_mult_ = 1; - std::string data; - source->GetResponseAsString(&data); if (!ParseGetHash(data.data(), data.length(), &cache_lifetime, &full_hashes)) { full_hashes.clear(); @@ -361,13 +362,15 @@ } } else { HandleGetHashError(Time::Now()); - if (status.status() == net::URLRequestStatus::FAILED) { + if (net_error != net::OK) { RecordGetHashResult(details.is_download, GET_HASH_NETWORK_ERROR); - DVLOG(1) << "SafeBrowsing GetHash request for: " << source->GetURL() - << " failed with error: " << status.error(); + DVLOG(1) << "SafeBrowsing GetHash request for: " + << url_loader->GetFinalURL() + << " failed with error: " << net_error; } else { RecordGetHashResult(details.is_download, GET_HASH_HTTP_ERROR); - DVLOG(1) << "SafeBrowsing GetHash request for: " << source->GetURL() + DVLOG(1) << "SafeBrowsing GetHash request for: " + << url_loader->GetFinalURL() << " failed with error: " << response_code; } } @@ -380,13 +383,13 @@ hash_requests_.erase(it); } else { // Update or chunk response. - RecordHttpResponseOrErrorCode(kGetChunkUmaResponseMetricName, status, + RecordHttpResponseOrErrorCode(kGetChunkUmaResponseMetricName, net_error, response_code); - std::unique_ptr<net::URLFetcher> fetcher = std::move(request_); + std::unique_ptr<network::SimpleURLLoader> loader = std::move(request_); if (request_type_ == UPDATE_REQUEST || request_type_ == BACKUP_UPDATE_REQUEST) { - if (!fetcher.get()) { + if (!loader.get()) { // We've timed out waiting for an update response, so we've cancelled // the update request and scheduled a new one. Ignore this response. return; @@ -396,17 +399,13 @@ timeout_timer_.Stop(); } - if (status.is_success() && response_code == net::HTTP_OK) { + if (net_error == net::OK && response_code == net::HTTP_OK) { // We have data from the SafeBrowsing service. - std::string data; - source->GetResponseAsString(&data); - // TODO(shess): Cleanup the flow of this code so that |parsed_ok| can be // removed or omitted. - const bool parsed_ok = - HandleServiceResponse(source->GetURL(), data.data(), data.length()); + const bool parsed_ok = HandleServiceResponse(data.data(), data.length()); if (!parsed_ok) { - DVLOG(1) << "SafeBrowsing request for: " << source->GetURL() + DVLOG(1) << "SafeBrowsing request for: " << loader->GetFinalURL() << " failed parse."; chunk_request_urls_.clear(); if (request_type_ == UPDATE_REQUEST && @@ -440,11 +439,11 @@ break; } } else { - if (status.status() == net::URLRequestStatus::FAILED) { - DVLOG(1) << "SafeBrowsing request for: " << source->GetURL() - << " failed with error: " << status.error(); + if (net_error != net::OK) { + DVLOG(1) << "SafeBrowsing request for: " << loader->GetFinalURL() + << " failed with error: " << net_error; } else { - DVLOG(1) << "SafeBrowsing request for: " << source->GetURL() + DVLOG(1) << "SafeBrowsing request for: " << loader->GetFinalURL() << " failed with error: " << response_code; } if (request_type_ == CHUNK_REQUEST) { @@ -452,10 +451,10 @@ chunk_request_urls_.clear(); } else if (request_type_ == UPDATE_REQUEST) { BackupUpdateReason backup_update_reason = BACKUP_UPDATE_REASON_MAX; - if (status.is_success()) { + if (net_error == net::OK) { backup_update_reason = BACKUP_UPDATE_REASON_HTTP; } else { - switch (status.error()) { + switch (net_error) { case net::ERR_INTERNET_DISCONNECTED: case net::ERR_NETWORK_CHANGED: backup_update_reason = BACKUP_UPDATE_REASON_NETWORK; @@ -478,8 +477,7 @@ } } -bool SafeBrowsingProtocolManager::HandleServiceResponse(const GURL& url, - const char* data, +bool SafeBrowsingProtocolManager::HandleServiceResponse(const char* data, size_t length) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); @@ -687,15 +685,17 @@ } } })"); - request_ = - net::URLFetcher::Create(url_fetcher_id_++, backup_update_url, - net::URLFetcher::POST, this, traffic_annotation); - data_use_measurement::DataUseUserData::AttachToFetcher( - request_.get(), data_use_measurement::DataUseUserData::SAFE_BROWSING); - request_->SetLoadFlags(net::LOAD_DISABLE_CACHE); - request_->SetRequestContext(request_context_getter_.get()); - request_->SetUploadData("text/plain", update_list_data_); - request_->Start(); + auto resource_request = std::make_unique<network::ResourceRequest>(); + resource_request->url = backup_update_url; + resource_request->method = "POST"; + resource_request->load_flags = net::LOAD_DISABLE_CACHE; + request_ = network::SimpleURLLoader::Create(std::move(resource_request), + traffic_annotation); + request_->AttachStringForUpload(update_list_data_, "text/plain"); + request_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( + url_loader_factory_.get(), + base::BindOnce(&SafeBrowsingProtocolManager::OnURLLoaderComplete, + base::Unretained(this), request_.get())); // Begin the update request timeout. timeout_timer_.Start(FROM_HERE, kSbMaxUpdateWait, this, @@ -716,15 +716,18 @@ DCHECK(!next_chunk.url.empty()); GURL chunk_url = NextChunkUrl(next_chunk.url); request_type_ = CHUNK_REQUEST; - request_ = net::URLFetcher::Create(url_fetcher_id_++, chunk_url, - net::URLFetcher::GET, this, - kChunkBackupRequestTrafficAnnotation); - data_use_measurement::DataUseUserData::AttachToFetcher( - request_.get(), data_use_measurement::DataUseUserData::SAFE_BROWSING); - request_->SetLoadFlags(net::LOAD_DISABLE_CACHE); - request_->SetRequestContext(request_context_getter_.get()); + + auto resource_request = std::make_unique<network::ResourceRequest>(); + resource_request->url = chunk_url; + resource_request->load_flags = net::LOAD_DISABLE_CACHE; + request_ = network::SimpleURLLoader::Create( + std::move(resource_request), kChunkBackupRequestTrafficAnnotation); + request_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( + url_loader_factory_.get(), + base::BindOnce(&SafeBrowsingProtocolManager::OnURLLoaderComplete, + base::Unretained(this), request_.get())); + chunk_request_start_ = base::Time::Now(); - request_->Start(); } void SafeBrowsingProtocolManager::OnGetChunksComplete( @@ -770,15 +773,18 @@ UMA_HISTOGRAM_COUNTS("SB2.UpdateRequestSize", update_list_data_.size()); GURL update_url = UpdateUrl(extended_reporting_level); - request_ = net::URLFetcher::Create(url_fetcher_id_++, update_url, - net::URLFetcher::POST, this, - kChunkBackupRequestTrafficAnnotation); - data_use_measurement::DataUseUserData::AttachToFetcher( - request_.get(), data_use_measurement::DataUseUserData::SAFE_BROWSING); - request_->SetLoadFlags(net::LOAD_DISABLE_CACHE); - request_->SetRequestContext(request_context_getter_.get()); - request_->SetUploadData("text/plain", update_list_data_); - request_->Start(); + + auto resource_request = std::make_unique<network::ResourceRequest>(); + resource_request->url = update_url; + resource_request->method = "POST"; + resource_request->load_flags = net::LOAD_DISABLE_CACHE; + request_ = network::SimpleURLLoader::Create( + std::move(resource_request), kChunkBackupRequestTrafficAnnotation); + request_->AttachStringForUpload(update_list_data_, "text/plain"); + request_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( + url_loader_factory_.get(), + base::BindOnce(&SafeBrowsingProtocolManager::OnURLLoaderComplete, + base::Unretained(this), request_.get())); // Begin the update request timeout. timeout_timer_.Start(FROM_HERE, kSbMaxUpdateWait, this,
diff --git a/chrome/browser/safe_browsing/protocol_manager.h b/chrome/browser/safe_browsing/protocol_manager.h index 9cd02506..f22cf41 100644 --- a/chrome/browser/safe_browsing/protocol_manager.h +++ b/chrome/browser/safe_browsing/protocol_manager.h
@@ -33,14 +33,12 @@ #include "components/safe_browsing/common/safe_browsing_prefs.h" #include "components/safe_browsing/db/safebrowsing.pb.h" #include "components/safe_browsing/db/util.h" -#include "net/url_request/url_fetcher_delegate.h" -#include "net/url_request/url_request_status.h" #include "url/gurl.h" -namespace net { -class URLFetcher; -class URLRequestContextGetter; -} // namespace net +namespace network { +class SimpleURLLoader; +class SharedURLLoaderFactory; +} // namespace network namespace safe_browsing { @@ -48,7 +46,7 @@ class SafeBrowsingProtocolManagerDelegate; // Lives on the IO thread. -class SafeBrowsingProtocolManager : public net::URLFetcherDelegate { +class SafeBrowsingProtocolManager { public: // FullHashCallback is invoked when GetFullHash completes. // Parameters: @@ -60,7 +58,7 @@ base::Callback<void(const std::vector<SBFullHashResult>&, const base::TimeDelta&)>; - ~SafeBrowsingProtocolManager() override; + virtual ~SafeBrowsingProtocolManager(); // Makes the passed |factory| the factory used to instantiate // a SafeBrowsingService. Useful for tests. @@ -71,15 +69,22 @@ // Create an instance of the safe browsing protocol manager. static std::unique_ptr<SafeBrowsingProtocolManager> Create( SafeBrowsingProtocolManagerDelegate* delegate, - net::URLRequestContextGetter* request_context_getter, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, const SafeBrowsingProtocolConfig& config); // Sets up the update schedule and internal state for making periodic requests // of the Safebrowsing servers. virtual void Initialize(); - // net::URLFetcherDelegate interface. - void OnURLFetchComplete(const net::URLFetcher* source) override; + // Callback when the request completes + void OnURLLoaderComplete(network::SimpleURLLoader* url_loader, + std::unique_ptr<std::string> response_body); + + // To ease testing. + void OnURLLoaderCompleteInternal(network::SimpleURLLoader* url_loader, + int net_error, + int response_code, + const std::string& data); // Retrieve the full hash for a set of prefixes, and invoke the callback // argument when the results are retrieved. The callback may be invoked @@ -164,11 +169,9 @@ // Record HTTP response code when there's no error in fetching an HTTP // request, and the error code, when there is. // |metric_name| is the name of the UMA metric to record the response code or - // error code against, |status| represents the status of the HTTP request, and - // |response code| represents the HTTP response code received from the server. - static void RecordHttpResponseOrErrorCode( - const char* metric_name, const net::URLRequestStatus& status, - int response_code); + // error code against, |net_error| represents the status of the HTTP request, + // and |response code| represents the HTTP response code received from the + // server. static void RecordHttpResponseOrErrorCode(const char* metric_name, int net_error, int response_code); @@ -180,10 +183,10 @@ protected: // Constructs a SafeBrowsingProtocolManager for |delegate| that issues - // network requests using |request_context_getter|. + // network requests using |url_loader_factory|. SafeBrowsingProtocolManager( SafeBrowsingProtocolManagerDelegate* delegate, - net::URLRequestContextGetter* request_context_getter, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, const SafeBrowsingProtocolConfig& config); private: @@ -267,7 +270,7 @@ // Runs the protocol parser on received data and update the // SafeBrowsingService with the new content. Returns 'true' on successful // parse, 'false' on error. - bool HandleServiceResponse(const GURL& url, const char* data, size_t length); + bool HandleServiceResponse(const char* data, size_t length); // Updates internal state for each GetHash response error, assuming that the // current time is |now|. @@ -305,7 +308,7 @@ // Current active request (in case we need to cancel) for updates or chunks // from the SafeBrowsing service. We can only have one of these outstanding // at any given time unlike GetHash requests, which are tracked separately. - std::unique_ptr<net::URLFetcher> request_; + std::unique_ptr<network::SimpleURLLoader> request_; // The kind of request that is currently in progress. SafeBrowsingRequestType request_type_; @@ -337,8 +340,9 @@ // All chunk requests that need to be made. base::circular_deque<ChunkUrl> chunk_request_urls_; - std::map<const net::URLFetcher*, - std::pair<std::unique_ptr<net::URLFetcher>, FullHashDetails>> + std::map< + const network::SimpleURLLoader*, + std::pair<std::unique_ptr<network::SimpleURLLoader>, FullHashDetails>> hash_requests_; // True if the service has been given an add/sub chunk but it hasn't been @@ -367,8 +371,8 @@ // safebrowsing hits and chunk update requests. std::string additional_query_; - // The context we use to issue network requests. - scoped_refptr<net::URLRequestContextGetter> request_context_getter_; + // The URLLoaderFactory we use to issue network requests. + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; // URL prefix where browser fetches safebrowsing chunk updates, and hashes. std::string url_prefix_; @@ -386,9 +390,6 @@ // ForceScheduleNextUpdate() is called. This is set for testing purpose. bool disable_auto_update_; - // ID for URLFetchers for testing. - int url_fetcher_id_; - DISALLOW_COPY_AND_ASSIGN(SafeBrowsingProtocolManager); }; @@ -400,7 +401,7 @@ virtual std::unique_ptr<SafeBrowsingProtocolManager> CreateProtocolManager( SafeBrowsingProtocolManagerDelegate* delegate, - net::URLRequestContextGetter* request_context_getter, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, const SafeBrowsingProtocolConfig& config) = 0; private:
diff --git a/chrome/browser/safe_browsing/protocol_manager_unittest.cc b/chrome/browser/safe_browsing/protocol_manager_unittest.cc index fca5a49..31bc288 100644 --- a/chrome/browser/safe_browsing/protocol_manager_unittest.cc +++ b/chrome/browser/safe_browsing/protocol_manager_unittest.cc
@@ -17,12 +17,13 @@ #include "components/safe_browsing/common/safe_browsing_prefs.h" #include "components/safe_browsing/db/safebrowsing.pb.h" #include "components/safe_browsing/db/util.h" +#include "content/public/common/weak_wrapper_shared_url_loader_factory.h" #include "content/public/test/test_browser_thread_bundle.h" #include "google_apis/google_api_keys.h" #include "net/base/escape.h" #include "net/base/load_flags.h" #include "net/base/net_errors.h" -#include "net/url_request/test_url_fetcher_factory.h" +#include "services/network/test/test_url_loader_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock_mutant.h" #include "testing/gtest/include/gtest/gtest.h" @@ -87,6 +88,12 @@ "&key=%s", net::EscapeQueryParamValue(key, true).c_str()); } + + test_shared_loader_factory_ = + base::MakeRefCounted<content::WeakWrapperSharedURLLoaderFactory>( + &test_url_loader_factory_); + test_url_loader_factory_.SetInterceptor(base::Bind( + &SafeBrowsingProtocolManagerTest::OnRequest, base::Unretained(this))); } std::unique_ptr<SafeBrowsingProtocolManager> CreateProtocolManager( @@ -99,40 +106,57 @@ config.backup_network_error_url_prefix = kBackupNetworkUrlPrefix; config.version = kAppVer; return std::unique_ptr<SafeBrowsingProtocolManager>( - SafeBrowsingProtocolManager::Create(delegate, nullptr, config)); + SafeBrowsingProtocolManager::Create( + delegate, test_shared_loader_factory_, config)); } - void ValidateUpdateFetcherRequest(const net::TestURLFetcher* url_fetcher, - const std::string& expected_prefix, + void OnRequest(const network::ResourceRequest& request) { + last_request_ = request; + } + + std::string GetBodyFromRequest(const network::ResourceRequest& request) { + auto body = request.request_body; + if (!body) + return std::string(); + + CHECK_EQ(1u, body->elements()->size()); + auto& element = body->elements()->at(0); + CHECK_EQ(network::DataElement::TYPE_BYTES, element.type()); + return std::string(element.bytes(), element.length()); + } + + void ValidateUpdateFetcherRequest(const std::string& expected_prefix, const std::string& expected_suffix) { - ASSERT_TRUE(url_fetcher); - EXPECT_EQ(net::LOAD_DISABLE_CACHE, url_fetcher->GetLoadFlags()); + EXPECT_EQ(net::LOAD_DISABLE_CACHE, last_request_.load_flags); std::string expected_lists(base::StringPrintf("%s;\n%s;\n", kDefaultPhishList, kDefaultMalwareList)); - EXPECT_EQ(expected_lists, url_fetcher->upload_data()); - EXPECT_EQ(GURL(expected_prefix + "/downloads?client=unittest&appver=1.0" - "&pver=3.0" + + EXPECT_EQ(expected_lists, GetBodyFromRequest(last_request_)); + EXPECT_EQ(GURL(expected_prefix + + "/downloads?client=unittest&appver=1.0" + "&pver=3.0" + key_param_ + expected_suffix), - url_fetcher->GetOriginalURL()); + last_request_.url); } - void ValidateUpdateFetcherRequest(const net::TestURLFetcher* url_fetcher) { - ValidateUpdateFetcherRequest(url_fetcher, kUrlPrefix, kUrlSuffix); + void ValidateUpdateFetcherRequest() { + ValidateUpdateFetcherRequest(kUrlPrefix, kUrlSuffix); } - void ValidateRedirectFetcherRequest(const net::TestURLFetcher* url_fetcher, - const std::string& expected_url) { - ASSERT_TRUE(url_fetcher); - EXPECT_EQ(net::LOAD_DISABLE_CACHE, url_fetcher->GetLoadFlags()); - EXPECT_EQ("", url_fetcher->upload_data()); - EXPECT_EQ(GURL(expected_url), url_fetcher->GetOriginalURL()); + void ValidateRedirectFetcherRequest(const std::string& expected_url) { + EXPECT_EQ(net::LOAD_DISABLE_CACHE, last_request_.load_flags); + EXPECT_EQ("", GetBodyFromRequest(last_request_)); + EXPECT_EQ(GURL(expected_url), last_request_.url); } // Fakes BrowserThreads and the main MessageLoop. content::TestBrowserThreadBundle thread_bundle_; + network::TestURLLoaderFactory test_url_loader_factory_; + scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_; + network::ResourceRequest last_request_; + // Replaces the main MessageLoop's TaskRunner with a TaskRunner on which time // is mocked to allow testing of things bound to timers below. base::ScopedMockTimeMessageLoopTaskRunner mock_time_task_runner_; @@ -437,8 +461,6 @@ // local database. This is not exhaustive, as the actual list formatting // is covered by SafeBrowsingProtocolManagerTest.TestChunkStrings. TEST_F(SafeBrowsingProtocolManagerTest, ExistingDatabase) { - net::TestURLFetcherFactory url_fetcher_factory; - std::vector<SBListChunkRanges> ranges; SBListChunkRanges range_phish(kPhishingList); range_phish.adds = "adds_phish"; @@ -465,31 +487,23 @@ pm->ForceScheduleNextUpdate(TimeDelta()); mock_time_task_runner_->RunUntilIdle(); - // We should have an URLFetcher at this point in time. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ASSERT_TRUE(url_fetcher); - EXPECT_EQ(net::LOAD_DISABLE_CACHE, url_fetcher->GetLoadFlags()); + EXPECT_EQ(net::LOAD_DISABLE_CACHE, last_request_.load_flags); EXPECT_EQ(base::StringPrintf("%s;a:adds_phish:s:subs_phish\n" "unknown_list;a:adds_unknown:s:subs_unknown\n" "%s;\n", kDefaultPhishList, kDefaultMalwareList), - url_fetcher->upload_data()); + GetBodyFromRequest(last_request_)); EXPECT_EQ(GURL("https://prefix.com/foo/downloads?client=unittest&appver=1.0" "&pver=3.0" + key_param_ + "&ext=0"), - url_fetcher->GetOriginalURL()); + last_request_.url); - url_fetcher->set_status(net::URLRequestStatus()); - url_fetcher->set_response_code(200); - url_fetcher->SetResponseString(std::string()); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, std::string()); EXPECT_TRUE(pm->IsUpdateScheduled()); } TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseBadBodyBackupSuccess) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -506,25 +520,17 @@ mock_time_task_runner_->RunUntilIdle(); // We should have an URLFetcher at this point in time. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); + ValidateUpdateFetcherRequest(); // The update response is successful, but an invalid body. - url_fetcher->set_status(net::URLRequestStatus()); - url_fetcher->set_response_code(200); - url_fetcher->SetResponseString("THIS_IS_A_BAD_RESPONSE"); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, + "THIS_IS_A_BAD_RESPONSE"); // There should now be a backup request. - net::TestURLFetcher* backup_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupHttpUrlPrefix, ""); + ValidateUpdateFetcherRequest(kBackupHttpUrlPrefix, ""); // Respond to the backup successfully. - backup_url_fetcher->set_status(net::URLRequestStatus()); - backup_url_fetcher->set_response_code(200); - backup_url_fetcher->SetResponseString(std::string()); - backup_url_fetcher->delegate()->OnURLFetchComplete(backup_url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, std::string()); EXPECT_TRUE(pm->IsUpdateScheduled()); } @@ -532,8 +538,6 @@ // Tests what happens when there is an HTTP error response to the update // request, as well as an error response to the backup update request. TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseHttpErrorBackupError) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -550,25 +554,16 @@ mock_time_task_runner_->RunUntilIdle(); // We should have an URLFetcher at this point in time. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); + ValidateUpdateFetcherRequest(); // Go ahead and respond to it. - url_fetcher->set_status(net::URLRequestStatus()); - url_fetcher->set_response_code(404); - url_fetcher->SetResponseString(std::string()); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 404, std::string()); // There should now be a backup request. - net::TestURLFetcher* backup_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupHttpUrlPrefix, ""); + ValidateUpdateFetcherRequest(kBackupHttpUrlPrefix, ""); // Respond to the backup unsuccessfully. - backup_url_fetcher->set_status(net::URLRequestStatus()); - backup_url_fetcher->set_response_code(404); - backup_url_fetcher->SetResponseString(std::string()); - backup_url_fetcher->delegate()->OnURLFetchComplete(backup_url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 404, std::string()); EXPECT_TRUE(pm->IsUpdateScheduled()); } @@ -576,8 +571,6 @@ // Tests what happens when there is an HTTP error response to the update // request, followed by a successful response to the backup update request. TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseHttpErrorBackupSuccess) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -594,25 +587,16 @@ mock_time_task_runner_->RunUntilIdle(); // We should have an URLFetcher at this point in time. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); + ValidateUpdateFetcherRequest(); // Go ahead and respond to it. - url_fetcher->set_status(net::URLRequestStatus()); - url_fetcher->set_response_code(404); - url_fetcher->SetResponseString(std::string()); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 404, std::string()); // There should now be a backup request. - net::TestURLFetcher* backup_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupHttpUrlPrefix, ""); + ValidateUpdateFetcherRequest(kBackupHttpUrlPrefix, ""); // Respond to the backup successfully. - backup_url_fetcher->set_status(net::URLRequestStatus()); - backup_url_fetcher->set_response_code(200); - backup_url_fetcher->SetResponseString(std::string()); - backup_url_fetcher->delegate()->OnURLFetchComplete(backup_url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, std::string()); EXPECT_TRUE(pm->IsUpdateScheduled()); } @@ -620,8 +604,6 @@ // Tests what happens when there is an HTTP error response to the update // request, and a timeout on the backup update request. TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseHttpErrorBackupTimeout) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -638,19 +620,13 @@ mock_time_task_runner_->RunUntilIdle(); // We should have an URLFetcher at this point in time. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); + ValidateUpdateFetcherRequest(); // Go ahead and respond to it. - url_fetcher->set_status(net::URLRequestStatus()); - url_fetcher->set_response_code(404); - url_fetcher->SetResponseString(std::string()); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 404, std::string()); // There should now be a backup request. - net::TestURLFetcher* backup_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupHttpUrlPrefix, ""); + ValidateUpdateFetcherRequest(kBackupHttpUrlPrefix, ""); // Confirm that no update is scheduled (still waiting on a response to the // backup request). @@ -674,8 +650,6 @@ // request, and an error with the backup update request. TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseConnectionErrorBackupError) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -692,24 +666,17 @@ mock_time_task_runner_->RunUntilIdle(); // We should have an URLFetcher at this point in time. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); + ValidateUpdateFetcherRequest(); // Go ahead and respond to it. - url_fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, - net::ERR_CONNECTION_RESET)); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::ERR_CONNECTION_RESET, 0, + std::string()); // There should be a backup URLFetcher now. - net::TestURLFetcher* backup_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupConnectUrlPrefix, ""); + ValidateUpdateFetcherRequest(kBackupConnectUrlPrefix, ""); // Respond to the backup unsuccessfully. - backup_url_fetcher->set_status(net::URLRequestStatus()); - backup_url_fetcher->set_response_code(404); - backup_url_fetcher->SetResponseString(std::string()); - backup_url_fetcher->delegate()->OnURLFetchComplete(backup_url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 404, std::string()); EXPECT_TRUE(pm->IsUpdateScheduled()); } @@ -718,8 +685,6 @@ // request, and a successful response to the backup update request. TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseConnectionErrorBackupSuccess) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -736,24 +701,17 @@ mock_time_task_runner_->RunUntilIdle(); // We should have an URLFetcher at this point in time. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); + ValidateUpdateFetcherRequest(); // Go ahead and respond to it. - url_fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, - net::ERR_CONNECTION_RESET)); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::ERR_CONNECTION_RESET, 0, + std::string()); // There should be a backup URLFetcher now. - net::TestURLFetcher* backup_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupConnectUrlPrefix, ""); + ValidateUpdateFetcherRequest(kBackupConnectUrlPrefix, ""); // Respond to the backup unsuccessfully. - backup_url_fetcher->set_status(net::URLRequestStatus()); - backup_url_fetcher->set_response_code(200); - backup_url_fetcher->SetResponseString(std::string()); - backup_url_fetcher->delegate()->OnURLFetchComplete(backup_url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, std::string()); EXPECT_TRUE(pm->IsUpdateScheduled()); } @@ -761,8 +719,6 @@ // update request, and an error with the backup update request. TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseNetworkErrorBackupError) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -779,25 +735,17 @@ mock_time_task_runner_->RunUntilIdle(); // We should have an URLFetcher at this point in time. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); + ValidateUpdateFetcherRequest(); // Go ahead and respond to it. - url_fetcher->set_status( - net::URLRequestStatus(net::URLRequestStatus::FAILED, - net::ERR_INTERNET_DISCONNECTED)); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::ERR_INTERNET_DISCONNECTED, 0, + std::string()); // There should be a backup URLFetcher now. - net::TestURLFetcher* backup_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupNetworkUrlPrefix, ""); + ValidateUpdateFetcherRequest(kBackupNetworkUrlPrefix, ""); // Respond to the backup unsuccessfully. - backup_url_fetcher->set_status(net::URLRequestStatus()); - backup_url_fetcher->set_response_code(404); - backup_url_fetcher->SetResponseString(std::string()); - backup_url_fetcher->delegate()->OnURLFetchComplete(backup_url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 404, std::string()); EXPECT_TRUE(pm->IsUpdateScheduled()); } @@ -806,8 +754,6 @@ // update request, and a successful response to the backup update request. TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseNetworkErrorBackupSuccess) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -824,33 +770,23 @@ mock_time_task_runner_->RunUntilIdle(); // We should have an URLFetcher at this point in time. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); + ValidateUpdateFetcherRequest(); // Go ahead and respond to it. - url_fetcher->set_status( - net::URLRequestStatus(net::URLRequestStatus::FAILED, - net::ERR_INTERNET_DISCONNECTED)); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::ERR_INTERNET_DISCONNECTED, 0, + std::string()); // There should be a backup URLFetcher now. - net::TestURLFetcher* backup_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupNetworkUrlPrefix, ""); + ValidateUpdateFetcherRequest(kBackupNetworkUrlPrefix, ""); // Respond to the backup unsuccessfully. - backup_url_fetcher->set_status(net::URLRequestStatus()); - backup_url_fetcher->set_response_code(200); - backup_url_fetcher->SetResponseString(std::string()); - backup_url_fetcher->delegate()->OnURLFetchComplete(backup_url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, std::string()); EXPECT_TRUE(pm->IsUpdateScheduled()); } // Tests what happens when there is a timeout before an update response. TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseTimeoutBackupSuccess) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -867,31 +803,23 @@ mock_time_task_runner_->RunUntilIdle(); // We should have an URLFetcher at this point in time. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); + ValidateUpdateFetcherRequest(); // Force the timeout to fire. mock_time_task_runner_->FastForwardBy( SafeBrowsingProtocolManager::GetUpdateTimeoutForTesting()); // There should be a backup URLFetcher now. - net::TestURLFetcher* backup_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateUpdateFetcherRequest(backup_url_fetcher, kBackupConnectUrlPrefix, ""); + ValidateUpdateFetcherRequest(kBackupConnectUrlPrefix, ""); // Respond to the backup unsuccessfully. - backup_url_fetcher->set_status(net::URLRequestStatus()); - backup_url_fetcher->set_response_code(200); - backup_url_fetcher->SetResponseString(std::string()); - backup_url_fetcher->delegate()->OnURLFetchComplete(backup_url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, std::string()); EXPECT_TRUE(pm->IsUpdateScheduled()); } // Tests what happens when there is a reset command in the response. TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseReset) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -908,14 +836,10 @@ pm->ForceScheduleNextUpdate(TimeDelta()); mock_time_task_runner_->RunUntilIdle(); - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); + ValidateUpdateFetcherRequest(); // The update response is successful, and has a reset command. - url_fetcher->set_status(net::URLRequestStatus()); - url_fetcher->set_response_code(200); - url_fetcher->SetResponseString("r:pleasereset\n"); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, "r:pleasereset\n"); EXPECT_TRUE(pm->IsUpdateScheduled()); } @@ -923,8 +847,6 @@ // Tests a single valid update response, followed by a single redirect response // that has an valid, but empty body. TEST_F(SafeBrowsingProtocolManagerTest, EmptyRedirectResponse) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -941,25 +863,16 @@ mock_time_task_runner_->RunUntilIdle(); // The update response contains a single redirect command. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); - url_fetcher->set_status(net::URLRequestStatus()); - url_fetcher->set_response_code(200); - url_fetcher->SetResponseString( + ValidateUpdateFetcherRequest(); + pm->OnURLLoaderCompleteInternal( + nullptr, net::OK, 200, base::StringPrintf("i:%s\n" "u:redirect-server.example.com/path\n", kDefaultPhishList)); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); // The redirect response contains an empty body. - net::TestURLFetcher* chunk_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateRedirectFetcherRequest( - chunk_url_fetcher, "https://redirect-server.example.com/path"); - chunk_url_fetcher->set_status(net::URLRequestStatus()); - chunk_url_fetcher->set_response_code(200); - chunk_url_fetcher->SetResponseString(std::string()); - chunk_url_fetcher->delegate()->OnURLFetchComplete(chunk_url_fetcher); + ValidateRedirectFetcherRequest("https://redirect-server.example.com/path"); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, std::string()); EXPECT_TRUE(pm->IsUpdateScheduled()); } @@ -967,8 +880,6 @@ // Tests a single valid update response, followed by a single redirect response // that has an invalid body. TEST_F(SafeBrowsingProtocolManagerTest, InvalidRedirectResponse) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -985,25 +896,17 @@ mock_time_task_runner_->RunUntilIdle(); // The update response contains a single redirect command. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); - url_fetcher->set_status(net::URLRequestStatus()); - url_fetcher->set_response_code(200); - url_fetcher->SetResponseString( + ValidateUpdateFetcherRequest(); + pm->OnURLLoaderCompleteInternal( + nullptr, net::OK, 200, base::StringPrintf("i:%s\n" "u:redirect-server.example.com/path\n", kDefaultPhishList)); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); // The redirect response contains an invalid body. - net::TestURLFetcher* chunk_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateRedirectFetcherRequest( - chunk_url_fetcher, "https://redirect-server.example.com/path"); - chunk_url_fetcher->set_status(net::URLRequestStatus()); - chunk_url_fetcher->set_response_code(200); - chunk_url_fetcher->SetResponseString("THIS IS AN INVALID RESPONSE"); - chunk_url_fetcher->delegate()->OnURLFetchComplete(chunk_url_fetcher); + ValidateRedirectFetcherRequest("https://redirect-server.example.com/path"); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, + "THIS IS AN INVALID RESPONSE"); EXPECT_TRUE(pm->IsUpdateScheduled()); } @@ -1011,8 +914,6 @@ // Tests a single valid update response, followed by a single redirect response // containing chunks. TEST_F(SafeBrowsingProtocolManagerTest, SingleRedirectResponseWithChunks) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -1031,25 +932,16 @@ mock_time_task_runner_->RunUntilIdle(); // The update response contains a single redirect command. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); - url_fetcher->set_status(net::URLRequestStatus()); - url_fetcher->set_response_code(200); - url_fetcher->SetResponseString( + ValidateUpdateFetcherRequest(); + pm->OnURLLoaderCompleteInternal( + nullptr, net::OK, 200, base::StringPrintf("i:%s\n" "u:redirect-server.example.com/path\n", kDefaultPhishList)); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); // The redirect response contains a single chunk. - net::TestURLFetcher* chunk_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateRedirectFetcherRequest( - chunk_url_fetcher, "https://redirect-server.example.com/path"); - chunk_url_fetcher->set_status(net::URLRequestStatus()); - chunk_url_fetcher->set_response_code(200); - chunk_url_fetcher->SetResponseString(kChunkPayload1); - chunk_url_fetcher->delegate()->OnURLFetchComplete(chunk_url_fetcher); + ValidateRedirectFetcherRequest("https://redirect-server.example.com/path"); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, kChunkPayload1); EXPECT_FALSE(pm->IsUpdateScheduled()); @@ -1062,8 +954,6 @@ // Tests a single valid update response, followed by multiple redirect responses // containing chunks. TEST_F(SafeBrowsingProtocolManagerTest, MultipleRedirectResponsesWithChunks) { - net::TestURLFetcherFactory url_fetcher_factory; - testing::StrictMock<MockProtocolDelegate> test_delegate; EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( @@ -1082,27 +972,17 @@ mock_time_task_runner_->RunUntilIdle(); // The update response contains multiple redirect commands. - net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); - ValidateUpdateFetcherRequest(url_fetcher); - url_fetcher->set_status(net::URLRequestStatus()); - url_fetcher->set_response_code(200); - url_fetcher->SetResponseString( + ValidateUpdateFetcherRequest(); + pm->OnURLLoaderCompleteInternal( + nullptr, net::OK, 200, base::StringPrintf("i:%s\n" "u:redirect-server.example.com/one\n" "u:redirect-server.example.com/two\n", kDefaultPhishList)); - url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); // The first redirect response contains a single chunk. - net::TestURLFetcher* first_chunk_url_fetcher = - url_fetcher_factory.GetFetcherByID(1); - ValidateRedirectFetcherRequest( - first_chunk_url_fetcher, "https://redirect-server.example.com/one"); - first_chunk_url_fetcher->set_status(net::URLRequestStatus()); - first_chunk_url_fetcher->set_response_code(200); - first_chunk_url_fetcher->SetResponseString(kChunkPayload1); - first_chunk_url_fetcher->delegate()->OnURLFetchComplete( - first_chunk_url_fetcher); + ValidateRedirectFetcherRequest("https://redirect-server.example.com/one"); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, kChunkPayload1); // Invoke the AddChunksCallback to trigger the second request. mock_time_task_runner_->RunUntilIdle(); @@ -1110,15 +990,8 @@ EXPECT_FALSE(pm->IsUpdateScheduled()); // The second redirect response contains a single chunk. - net::TestURLFetcher* second_chunk_url_fetcher = - url_fetcher_factory.GetFetcherByID(2); - ValidateRedirectFetcherRequest( - second_chunk_url_fetcher, "https://redirect-server.example.com/two"); - second_chunk_url_fetcher->set_status(net::URLRequestStatus()); - second_chunk_url_fetcher->set_response_code(200); - second_chunk_url_fetcher->SetResponseString(kChunkPayload2); - second_chunk_url_fetcher->delegate()->OnURLFetchComplete( - second_chunk_url_fetcher); + ValidateRedirectFetcherRequest("https://redirect-server.example.com/two"); + pm->OnURLLoaderCompleteInternal(nullptr, net::OK, 200, kChunkPayload2); EXPECT_FALSE(pm->IsUpdateScheduled());
diff --git a/chrome/browser/safe_browsing/safe_browsing_service.cc b/chrome/browser/safe_browsing/safe_browsing_service.cc index 80c8f38..dbe9f12 100644 --- a/chrome/browser/safe_browsing/safe_browsing_service.cc +++ b/chrome/browser/safe_browsing/safe_browsing_service.cc
@@ -446,7 +446,7 @@ GetProtocolManagerDelegate(); if (protocol_manager_delegate) { protocol_manager_ = SafeBrowsingProtocolManager::Create( - protocol_manager_delegate, url_request_context_getter, config); + protocol_manager_delegate, GetURLLoaderFactoryOnIOThread(), config); protocol_manager_->Initialize(); } }
diff --git a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc index 5e3ac312f..19bbfc7 100644 --- a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc +++ b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
@@ -576,10 +576,11 @@ // safebrowsing server for testing purpose. class TestProtocolManager : public SafeBrowsingProtocolManager { public: - TestProtocolManager(SafeBrowsingProtocolManagerDelegate* delegate, - net::URLRequestContextGetter* request_context_getter, - const SafeBrowsingProtocolConfig& config) - : SafeBrowsingProtocolManager(delegate, request_context_getter, config) { + TestProtocolManager( + SafeBrowsingProtocolManagerDelegate* delegate, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + const SafeBrowsingProtocolConfig& config) + : SafeBrowsingProtocolManager(delegate, url_loader_factory, config) { create_count_++; } @@ -635,11 +636,11 @@ std::unique_ptr<SafeBrowsingProtocolManager> CreateProtocolManager( SafeBrowsingProtocolManagerDelegate* delegate, - net::URLRequestContextGetter* request_context_getter, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, const SafeBrowsingProtocolConfig& config) override { base::AutoLock locker(lock_); - pm_ = new TestProtocolManager(delegate, request_context_getter, config); + pm_ = new TestProtocolManager(delegate, url_loader_factory, config); if (!quit_closure_.is_null()) { quit_closure_.Run();
diff --git a/chrome/browser/supervised_user/child_accounts/child_account_service.cc b/chrome/browser/supervised_user/child_accounts/child_account_service.cc index d08ae13..bfe688c 100644 --- a/chrome/browser/supervised_user/child_accounts/child_account_service.cc +++ b/chrome/browser/supervised_user/child_accounts/child_account_service.cc
@@ -37,10 +37,6 @@ #include "chrome/browser/chromeos/profiles/profile_helper.h" #endif -#if !defined(OS_ANDROID) -const char kChildAccountDetectionFieldTrialName[] = "ChildAccountDetection"; -#endif - const char kGaiaCookieManagerSource[] = "child_account_service"; // Normally, re-check the family info once per day. @@ -90,15 +86,13 @@ // static bool ChildAccountService::IsChildAccountDetectionEnabled() { - // Child account detection is always enabled on Android. -#if !defined(OS_ANDROID) - const std::string group_name = - base::FieldTrialList::FindFullName(kChildAccountDetectionFieldTrialName); - if (group_name == "Disabled") - return false; -#endif - +// Child account detection is always enabled on Android and ChromeOS, and +// disabled in other platforms. +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) return true; +#else + return false; +#endif } void ChildAccountService::RegisterProfilePrefs(
diff --git a/chrome/browser/sync/test/integration/sync_extension_helper.cc b/chrome/browser/sync/test/integration/sync_extension_helper.cc index 303359b..a1fe8df1 100644 --- a/chrome/browser/sync/test/integration/sync_extension_helper.cc +++ b/chrome/browser/sync/test/integration/sync_extension_helper.cc
@@ -338,6 +338,7 @@ const std::string& public_key = NameToPublicKey(name); source.SetString(extensions::manifest_keys::kPublicKey, public_key); source.SetString(extensions::manifest_keys::kVersion, "0.0.0.0"); + source.SetInteger(extensions::manifest_keys::kManifestVersion, 2); switch (type) { case Manifest::TYPE_EXTENSION: // Do nothing.
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 5a725f4..72dde06 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -935,6 +935,7 @@ "//chrome/browser/devtools", "//chrome/browser/engagement:mojo_bindings", "//chrome/browser/media:mojo_bindings", + "//chrome/browser/profiling_host", "//chrome/browser/safe_browsing", "//chrome/browser/ssl:proto", "//chrome/browser/ui/webui/bluetooth_internals",
diff --git a/chrome/browser/ui/android/login_handler_android.cc b/chrome/browser/ui/android/login_handler_android.cc index c5e17ad..484b99f 100644 --- a/chrome/browser/ui/android/login_handler_android.cc +++ b/chrome/browser/ui/android/login_handler_android.cc
@@ -54,8 +54,8 @@ ViewAndroidHelper* view_helper = ViewAndroidHelper::FromWebContents( web_contents); - if (vr::VrTabHelper::IsInVr(web_contents)) { - vr::VrTabHelper::UISuppressed(vr::UiSuppressedElement::kHttpAuth); + if (vr::VrTabHelper::IsUiSuppressedInVr( + web_contents, vr::UiSuppressedElement::kHttpAuth)) { CancelAuth(); return; }
diff --git a/chrome/browser/ui/android/ssl_client_certificate_request.cc b/chrome/browser/ui/android/ssl_client_certificate_request.cc index 5a0a5c6..ec5be1f 100644 --- a/chrome/browser/ui/android/ssl_client_certificate_request.cc +++ b/chrome/browser/ui/android/ssl_client_certificate_request.cc
@@ -186,10 +186,9 @@ std::unique_ptr<content::ClientCertificateDelegate> delegate) { // TODO(asimjour): This should be removed once we have proper // implementation of SSL client certificate selector in VR. - if (vr::VrTabHelper::IsInVr(contents)) { + if (vr::VrTabHelper::IsUiSuppressedInVr( + contents, vr::UiSuppressedElement::kSslClientCertificate)) { delegate->ContinueWithCertificate(nullptr, nullptr); - vr::VrTabHelper::UISuppressed( - vr::UiSuppressedElement::kSslClientCertificate); return; }
diff --git a/chrome/browser/ui/android/usb_chooser_dialog_android.cc b/chrome/browser/ui/android/usb_chooser_dialog_android.cc index 02becb02..646fe3f 100644 --- a/chrome/browser/ui/android/usb_chooser_dialog_android.cc +++ b/chrome/browser/ui/android/usb_chooser_dialog_android.cc
@@ -35,8 +35,8 @@ // TODO(asimjour): This should be removed once we have proper // implementation of USB chooser in VR. - if (vr::VrTabHelper::IsInVr(web_contents)) { - vr::VrTabHelper::UISuppressed(vr::UiSuppressedElement::kUsbChooser); + if (vr::VrTabHelper::IsUiSuppressedInVr( + web_contents, vr::UiSuppressedElement::kUsbChooser)) { return nullptr; }
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index b6ad0c0..6c5cb3ac 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -428,16 +428,12 @@ } bool ChromeAutofillClient::IsAutofillSupported() { -#if defined(OS_ANDROID) // VR browsing supports the autofill behind a flag. When the flag is removed // we can remove this condition. - if (vr::VrTabHelper::IsInVr(web_contents()) && - !base::FeatureList::IsEnabled( - chrome::android::kVrBrowsingNativeAndroidUi)) { - vr::VrTabHelper::UISuppressed(vr::UiSuppressedElement::kAutofill); + if (vr::VrTabHelper::IsUiSuppressedInVr(web_contents(), + vr::UiSuppressedElement::kAutofill)) { return false; } -#endif return true; }
diff --git a/chrome/browser/ui/cocoa/profiles/avatar_button_controller.mm b/chrome/browser/ui/cocoa/profiles/avatar_button_controller.mm index c7c12aa..687b9bc 100644 --- a/chrome/browser/ui/cocoa/profiles/avatar_button_controller.mm +++ b/chrome/browser/ui/cocoa/profiles/avatar_button_controller.mm
@@ -10,6 +10,9 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profiles_state.h" +#include "chrome/browser/signin/account_consistency_mode_manager.h" +#include "chrome/browser/signin/signin_manager_factory.h" +#include "chrome/browser/sync/sync_ui_util.h" #import "chrome/browser/themes/theme_properties.h" #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" @@ -252,8 +255,20 @@ [button setPressedImage:nil]; [button setImagePosition:NSImageOnly]; } else if (hasError_) { + // When DICE is enabled and the error is an auth error, the sync-paused icon + // is shown. + int dummy; + const bool should_show_sync_paused_ui = + AccountConsistencyModeManager::IsDiceEnabledForProfile( + browser_->profile()) && + sync_ui_util::GetMessagesForAvatarSyncError( + browser_->profile(), + *SigninManagerFactory::GetForProfile(browser_->profile()), &dummy, + &dummy) == sync_ui_util::AUTH_ERROR; NSImage* errorIcon = NSImageFromImageSkia( - gfx::CreateVectorIcon(kSyncProblemIcon, 16, gfx::kGoogleRed700)); + should_show_sync_paused_ui + ? gfx::CreateVectorIcon(kSyncPausedIcon, 16, gfx::kGoogleBlue500) + : gfx::CreateVectorIcon(kSyncProblemIcon, 16, gfx::kGoogleRed700)); [button setDefaultImage:errorIcon]; [button setHoverImage:nil]; [button setPressedImage:nil];
diff --git a/chrome/browser/ui/cocoa/renderer_context_menu/render_view_context_menu_mac.mm b/chrome/browser/ui/cocoa/renderer_context_menu/render_view_context_menu_mac.mm index fce159b2..0dc87bc 100644 --- a/chrome/browser/ui/cocoa/renderer_context_menu/render_view_context_menu_mac.mm +++ b/chrome/browser/ui/cocoa/renderer_context_menu/render_view_context_menu_mac.mm
@@ -22,7 +22,9 @@ #include "content/public/browser/render_widget_host_view.h" #import "ui/base/cocoa/menu_controller.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/base/resource/resource_bundle.h" #include "ui/base/ui_base_features.h" +#include "ui/resources/grit/ui_resources.h" #include "ui/strings/grit/ui_strings.h" using content::WebContents; @@ -352,8 +354,11 @@ base::FeatureList::IsEnabled(features::kEnableEmojiContextMenu)) { // The "Emoji" item is available near the top of the context menu, after // any "Look Up" of selected text. - menu_model_.InsertItemWithStringIdAt(index++, IDC_CONTENT_CONTEXT_EMOJI, + menu_model_.InsertItemWithStringIdAt(index, IDC_CONTENT_CONTEXT_EMOJI, IDS_CONTENT_CONTEXT_EMOJI); + menu_model_.SetIcon(index++, + ui::ResourceBundle::GetSharedInstance().GetImageNamed( + IDR_EMOJI_FAVICON)); menu_model_.InsertSeparatorAt(index++, ui::NORMAL_SEPARATOR); }
diff --git a/chrome/browser/ui/omnibox/omnibox_theme.cc b/chrome/browser/ui/omnibox/omnibox_theme.cc index 8ee9e73..d783aebf 100644 --- a/chrome/browser/ui/omnibox/omnibox_theme.cc +++ b/chrome/browser/ui/omnibox/omnibox_theme.cc
@@ -100,7 +100,6 @@ case OmniboxPart::LOCATION_BAR_TEXT_DIMMED: case OmniboxPart::RESULTS_ICON: case OmniboxPart::RESULTS_TEXT_INVISIBLE: - case OmniboxPart::RESULTS_SEPARATOR: NOTREACHED(); break; } @@ -237,10 +236,6 @@ return color_utils::BlendTowardOppositeLuma( dark ? gfx::kGoogleGrey800 : SK_ColorWHITE, NormalHoveredSelectedOrBoth<SkAlpha>(state, 0x00, 0x0F, 0x14, 0x24)); - case OmniboxPart::RESULTS_SEPARATOR: - // The dark base color doesn't appear in the Material spec, just Chrome's. - return dark ? SkColorSetARGB(0x6E, 0x16, 0x17, 0x1A) // 43% alpha. - : SkColorSetA(gfx::kGoogleGrey900, 0x24); // 14% alpha. case OmniboxPart::LOCATION_BAR_TEXT_DEFAULT: case OmniboxPart::RESULTS_TEXT_DEFAULT:
diff --git a/chrome/browser/ui/omnibox/omnibox_theme.h b/chrome/browser/ui/omnibox/omnibox_theme.h index 1c1682d9..6d464a1 100644 --- a/chrome/browser/ui/omnibox/omnibox_theme.h +++ b/chrome/browser/ui/omnibox/omnibox_theme.h
@@ -20,7 +20,6 @@ RESULTS_BACKGROUND, // Background of the results dropdown. RESULTS_ICON, - RESULTS_SEPARATOR, // Separator between the input row and the results rows. RESULTS_TEXT_DEFAULT, RESULTS_TEXT_DIMMED, RESULTS_TEXT_INVISIBLE,
diff --git a/chrome/browser/ui/sync/profile_signin_confirmation_helper_unittest.cc b/chrome/browser/ui/sync/profile_signin_confirmation_helper_unittest.cc index 294f8cc..8896f72 100644 --- a/chrome/browser/ui/sync/profile_signin_confirmation_helper_unittest.cc +++ b/chrome/browser/ui/sync/profile_signin_confirmation_helper_unittest.cc
@@ -107,6 +107,7 @@ extensions::Manifest::Location location) { base::DictionaryValue manifest; manifest.SetString(extensions::manifest_keys::kVersion, "1.0.0.0"); + manifest.SetInteger(extensions::manifest_keys::kManifestVersion, 2); manifest.SetString(extensions::manifest_keys::kName, name); std::string error; scoped_refptr<extensions::Extension> extension =
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc index 85b4813..1c3e122 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -342,15 +342,6 @@ return origin; } -int LocationBarView::GetTextInsetForNormalInputStart() const { - // Note that this does not need to account for the internal Textfield border, - // since that's subtracted during layout. - return GetHorizontalEdgeThickness() + - GetLayoutConstant(LOCATION_BAR_ICON_SIZE) + - 2 * GetLayoutConstant(LOCATION_BAR_ICON_INTERIOR_PADDING) + - GetLayoutConstant(LOCATION_BAR_ELEMENT_PADDING); -} - void LocationBarView::SetImeInlineAutocompletion(const base::string16& text) { ime_inline_autocomplete_view_->SetText(text); ime_inline_autocomplete_view_->SetVisible(!text.empty());
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.h b/chrome/browser/ui/views/location_bar/location_bar_view.h index 818e65f..2f220a7 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.h +++ b/chrome/browser/ui/views/location_bar/location_bar_view.h
@@ -166,10 +166,6 @@ // not where the icons are shown). gfx::Point GetOmniboxViewOrigin() const; - // Returns the inset from the edge of the location bar where text begins when - // only a location icon is showing (no security chip or keyword bubble). - int GetTextInsetForNormalInputStart() const; - // Shows |text| as an inline autocompletion. This is useful for IMEs, where // we can't show the autocompletion inside the actual OmniboxView. See // comments on |ime_inline_autocomplete_view_|.
diff --git a/chrome/browser/ui/views/menu_test_base.cc b/chrome/browser/ui/views/menu_test_base.cc index 64910fb..ed574339 100644 --- a/chrome/browser/ui/views/menu_test_base.cc +++ b/chrome/browser/ui/views/menu_test_base.cc
@@ -11,6 +11,7 @@ #include "ui/views/controls/button/menu_button.h" #include "ui/views/controls/menu/menu_item_view.h" #include "ui/views/controls/menu/menu_runner.h" +#include "ui/views/test/menu_test_utils.h" #include "ui/views/widget/widget.h" MenuTestBase::MenuTestBase() @@ -29,6 +30,7 @@ ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP, next); + views::test::WaitForMenuClosureAnimation(); } void MenuTestBase::KeyPress(ui::KeyboardCode keycode, base::OnceClosure next) { @@ -42,6 +44,8 @@ } void MenuTestBase::SetUp() { + views::test::DisableMenuClosureAnimations(); + button_ = new views::MenuButton(base::ASCIIToUTF16("Menu Test"), this, true); menu_ = new views::MenuItemView(this); BuildMenu(menu_);
diff --git a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc index 69862fb..19d563f 100644 --- a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc +++ b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc
@@ -7,7 +7,6 @@ #include "build/build_config.h" #include "chrome/browser/ui/layout_constants.h" #include "chrome/browser/ui/omnibox/omnibox_theme.h" -#include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/location_bar/background_with_1_px_border.h" #include "chrome/browser/ui/views/location_bar/location_bar_view.h" #include "ui/compositor/layer.h" @@ -23,10 +22,6 @@ // Value from the spec controlling appearance of the shadow. constexpr int kElevation = 16; -// The layout height (in DIPs) of the view drawing the separator above results. -// The top of this view aligns with the bottom edge of the location bar. -constexpr int kSeparatorViewHeightDIP = 1; - // View at the top of the frame which paints transparent pixels to make a hole // so that the location bar shows through. class TopBackgroundView : public views::View { @@ -39,25 +34,12 @@ } }; -class SeparatorView : public views::View { - public: - explicit SeparatorView(SkColor color) : color_(color) {} - - // Views:View: - void OnPaint(gfx::Canvas* canvas) override { - BrowserView::Paint1pxHorizontalLine(canvas, color_, GetLocalBounds(), true); - } - - private: - const SkColor color_; -}; - // Insets used to position |contents_| within |contents_host_|. gfx::Insets GetContentInsets(views::View* location_bar) { return gfx::Insets( RoundedOmniboxResultsFrame::kLocationBarAlignmentInsets.top(), 0, 0, 0) + - gfx::Insets(location_bar->height() + kSeparatorViewHeightDIP, 0, 0, 0); + gfx::Insets(location_bar->height(), 0, 0, 0); } } // namespace @@ -69,7 +51,6 @@ LocationBarView* location_bar) : content_insets_(GetContentInsets(location_bar)), location_bar_height_(location_bar->height()), - separator_inset_(location_bar->GetTextInsetForNormalInputStart()), contents_(contents) { // Host the contents in its own View to simplify layout and clipping. contents_host_ = new views::View(); @@ -93,10 +74,7 @@ contents_host_->layer()->SetMaskLayer(contents_mask_->layer()); top_background_ = new TopBackgroundView(background_color); - separator_ = new SeparatorView( - GetOmniboxColor(OmniboxPart::RESULTS_SEPARATOR, location_bar->tint())); contents_host_->AddChildView(top_background_); - contents_host_->AddChildView(separator_); contents_host_->AddChildView(contents_); AddChildView(contents_host_); @@ -141,11 +119,6 @@ top_bounds.set_height(location_bar_height_); top_background_->SetBoundsRect(top_bounds); - top_bounds.set_y(top_bounds.bottom()); // Shift down. - top_bounds.Inset(separator_inset_, 0); // Inset the width further. - top_bounds.set_height(kSeparatorViewHeightDIP); - separator_->SetBoundsRect(top_bounds); - gfx::Rect results_bounds = gfx::Rect(bounds.size()); results_bounds.Inset(content_insets_); contents_->SetBoundsRect(results_bounds);
diff --git a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h index fd3f5df..42b92fc 100644 --- a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h +++ b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h
@@ -40,12 +40,10 @@ // Fixed layout constants. const gfx::Insets content_insets_; const int location_bar_height_; - const int separator_inset_; std::unique_ptr<ui::LayerOwner> contents_mask_; views::View* top_background_ = nullptr; - views::View* separator_ = nullptr; views::View* contents_ = nullptr; views::View* contents_host_ = nullptr;
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc index 6d8a3b4..35869c803 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc
@@ -31,6 +31,7 @@ #include "ui/views/controls/menu/menu_controller.h" #include "ui/views/controls/menu/menu_item_view.h" #include "ui/views/controls/menu/submenu_view.h" +#include "ui/views/test/menu_test_utils.h" namespace { @@ -127,6 +128,7 @@ ui_controls::SendMouseMove(action_view_loc.x(), action_view_loc.y()); EXPECT_TRUE(ui_test_utils::SendMouseEventsSync( ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP)); + views::test::WaitForMenuClosureAnimation(); // Test resumes in the main test body. } @@ -216,6 +218,7 @@ IN_PROC_BROWSER_TEST_F(ToolbarActionViewInteractiveUITest, MAYBE_TestContextMenuOnOverflowedAction) { views::MenuController::TurnOffMenuSelectionHoldForTest(); + views::test::DisableMenuClosureAnimations(); // Load an extension that has a home page (important for the context menu's // first item being enabled).
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc index 5775be8..395ee71 100644 --- a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc +++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
@@ -373,7 +373,7 @@ device->product_string(), base::string16(), false)) .Set("extensionId", extension->id()) .Set("extensionName", extension->name()) - .Set("provisional", true) + .SetBoolean("provisional", true) .Build()); } }
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc index 9e380aa..0ef9c33 100644 --- a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc +++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
@@ -595,7 +595,7 @@ .Set("name", "USB Printer") .Set("extensionName", "Provider 1") .Set("extensionId", extension_1->id()) - .Set("provisional", true) + .SetBoolean("provisional", true) .Build()); std::unique_ptr<base::DictionaryValue> extension_2_entry( DictionaryBuilder() @@ -605,7 +605,7 @@ .Set("name", "USB Printer") .Set("extensionName", "Provider 2") .Set("extensionId", extension_2->id()) - .Set("provisional", true) + .SetBoolean("provisional", true) .Build()); EXPECT_TRUE(printers->Find(*extension_1_entry) != printers->end()); EXPECT_TRUE(printers->Find(*extension_2_entry) != printers->end());
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc index c549792..b7abce24 100644 --- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -241,6 +241,11 @@ {"textToSpeechProperties", IDS_SETTINGS_TEXT_TO_SPEECH_PROPERTIES}, {"textToSpeechRate", IDS_SETTINGS_TEXT_TO_SPEECH_RATE}, {"textToSpeechPitch", IDS_SETTINGS_TEXT_TO_SPEECH_PITCH}, + {"textToSpeechPreviewHeading", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_HEADING}, + {"textToSpeechPreviewInputLabel", + IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_INPUT_LABEL}, + {"textToSpeechPreviewInput", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_INPUT}, + {"textToSpeechPreviewPlay", IDS_SETTINGS_TEXT_TO_SPEECH_PREVIEW_PLAY}, {"textToSpeechEngines", IDS_SETTINGS_TEXT_TO_SPEECH_ENGINES}, {"textToSpeechInstallEngines", IDS_SETTINGS_TEXT_TO_SPEECH_INSTALL_ENGINES}, {"manageGoogleTtsEngineSettings",
diff --git a/chrome/browser/vr/PRESUBMIT.py b/chrome/browser/vr/PRESUBMIT.py index 16887ec..62e08aa 100644 --- a/chrome/browser/vr/PRESUBMIT.py +++ b/chrome/browser/vr/PRESUBMIT.py
@@ -59,7 +59,7 @@ [ 'luci.chromium.try:linux_optional_gpu_tests_rel', 'luci.chromium.try:mac_optional_gpu_tests_rel', - 'master.tryserver.chromium.win:win_optional_gpu_tests_rel', + 'luci.chromium.try:win_optional_gpu_tests_rel', 'luci.chromium.try:android_optional_gpu_tests_rel', 'master.tryserver.chromium.linux:linux_vr', ],
diff --git a/chrome/browser/vr/elements/content_element_unittest.cc b/chrome/browser/vr/elements/content_element_unittest.cc index be2a49e8..a3bbddf 100644 --- a/chrome/browser/vr/elements/content_element_unittest.cc +++ b/chrome/browser/vr/elements/content_element_unittest.cc
@@ -164,6 +164,10 @@ content->OnFocusChanged(false); EXPECT_TRUE(input_forwarder_->clear_focus_called()); EXPECT_TRUE(OnBeginFrame()); + // OnBeginFrame on the keyboard delegate should be called despite of + // visibility. + EXPECT_CALL(*kb_delegate, OnBeginFrame()).InSequence(in_sequence_); + scene_->CallPerFrameCallbacks(); } class ContentElementInputEditingTest : public UiTest {
diff --git a/chrome/browser/vr/elements/keyboard.cc b/chrome/browser/vr/elements/keyboard.cc index b96573b..b96938c6 100644 --- a/chrome/browser/vr/elements/keyboard.cc +++ b/chrome/browser/vr/elements/keyboard.cc
@@ -97,6 +97,16 @@ delegate_->OnButtonUp(position); } +void Keyboard::AdvanceKeyboardFrameIfNeeded() { + // If the update phase is not dirty, the frame will be advanced in + // OnBeginFrame. That is, we only call OnBeginFrame below when the element is + // not visible (i.e UiElement::kDirty is true). + if (!delegate_ || update_phase() != UiElement::kDirty) + return; + + delegate_->OnBeginFrame(); +} + bool Keyboard::OnBeginFrame(const gfx::Transform& head_pose) { if (!delegate_) return false;
diff --git a/chrome/browser/vr/elements/keyboard.h b/chrome/browser/vr/elements/keyboard.h index 02c2745..4627798 100644 --- a/chrome/browser/vr/elements/keyboard.h +++ b/chrome/browser/vr/elements/keyboard.h
@@ -19,6 +19,9 @@ Keyboard(); ~Keyboard() override; + // The gvr keyboard requires that we advance its frame after initilization, + // for example, regardless of visibility. + void AdvanceKeyboardFrameIfNeeded(); void SetKeyboardDelegate(KeyboardDelegate* keyboard_delegate); void OnTouchStateUpdated(bool is_touching, const gfx::PointF& touch_position); void HitTest(const HitTestRequest& request,
diff --git a/chrome/browser/vr/elements/rect.cc b/chrome/browser/vr/elements/rect.cc index bbd209c0..b15afe6 100644 --- a/chrome/browser/vr/elements/rect.cc +++ b/chrome/browser/vr/elements/rect.cc
@@ -41,9 +41,11 @@ } void Rect::Render(UiElementRenderer* renderer, const CameraModel& model) const { + float opacity = computed_opacity() * local_opacity_; + if (opacity <= 0.f) + return; renderer->DrawGradientQuad(model.view_proj_matrix * world_space_transform(), - edge_color_, center_color_, - computed_opacity() * local_opacity_, size(), + edge_color_, center_color_, opacity, size(), corner_radii()); }
diff --git a/chrome/browser/vr/elements/ui_element.cc b/chrome/browser/vr/elements/ui_element.cc index a59fa7c..5499805c 100644 --- a/chrome/browser/vr/elements/ui_element.cc +++ b/chrome/browser/vr/elements/ui_element.cc
@@ -308,7 +308,7 @@ } gfx::SizeF UiElement::size() const { - DCHECK_LE(kUpdatedSize, phase_); + DCHECK_LE(kUpdatedSize, update_phase_); return size_; } @@ -431,7 +431,7 @@ } float UiElement::computed_opacity() const { - DCHECK_LE(kUpdatedComputedOpacity, phase_) << DebugName(); + DCHECK_LE(kUpdatedComputedOpacity, update_phase_) << DebugName(); return computed_opacity_; } @@ -495,7 +495,7 @@ } const gfx::Transform& UiElement::world_space_transform() const { - DCHECK_LE(kUpdatedWorldSpaceTransform, phase_); + DCHECK_LE(kUpdatedWorldSpaceTransform, update_phase_); return world_space_transform_; } @@ -554,21 +554,21 @@ } *os << kReset; - if (phase_ < kUpdatedComputedOpacity || !IsVisible()) { + if (update_phase_ < kUpdatedComputedOpacity || !IsVisible()) { *os << kBlue; } *os << DebugName() << kReset << " " << kCyan << DrawPhaseToString(draw_phase_) << " " << kReset; - if (phase_ >= kUpdatedSize) { + if (update_phase_ >= kUpdatedSize) { if (size().width() != 0.0f || size().height() != 0.0f) { *os << kRed << "[" << size().width() << ", " << size().height() << "] " << kReset; } } - if (phase_ >= kUpdatedWorldSpaceTransform) { + if (update_phase_ >= kUpdatedWorldSpaceTransform) { *os << kGreen; DumpGeometry(os); } @@ -844,7 +844,7 @@ } void UiElement::LayOutChildren() { - DCHECK_LE(kUpdatedSize, phase_); + DCHECK_LE(kUpdatedSize, update_phase_); for (auto& child : children_) { if (!child->IsVisible()) continue;
diff --git a/chrome/browser/vr/elements/ui_element.h b/chrome/browser/vr/elements/ui_element.h index a00864e9..450b970 100644 --- a/chrome/browser/vr/elements/ui_element.h +++ b/chrome/browser/vr/elements/ui_element.h
@@ -430,7 +430,7 @@ return children_; } - void set_update_phase(UpdatePhase phase) { phase_ = phase; } + void set_update_phase(UpdatePhase phase) { update_phase_ = phase; } // This is true for all elements that respect the given view model matrix. If // this is ignored (say for head-locked elements that draw in screen space), @@ -494,6 +494,8 @@ world_space_transform_dirty_ = true; } + UpdatePhase update_phase() const { return update_phase_; } + EventHandlers event_handlers_; private: @@ -634,7 +636,7 @@ // TODO(crbug.com/829880): remove this once we've simplified our bindings. bool visibility_bindings_depend_on_child_visibility_ = false; - UpdatePhase phase_ = kClean; + UpdatePhase update_phase_ = kClean; AudioDelegate* audio_delegate_ = nullptr; Sounds sounds_;
diff --git a/chrome/browser/vr/renderers/gradient_quad_renderer.cc b/chrome/browser/vr/renderers/gradient_quad_renderer.cc index 9f25480..10de3e5 100644 --- a/chrome/browser/vr/renderers/gradient_quad_renderer.cc +++ b/chrome/browser/vr/renderers/gradient_quad_renderer.cc
@@ -127,6 +127,12 @@ float opacity, const gfx::SizeF& element_size, const CornerRadii& radii) { + DCHECK(opacity > 0.f); + if (SkColorGetA(edge_color) == SK_AlphaTRANSPARENT && + SkColorGetA(center_color) == SK_AlphaTRANSPARENT) { + return; + } + glUseProgram(program_handle_); glBindBuffer(GL_ARRAY_BUFFER, TexturedQuadRenderer::VertexBuffer());
diff --git a/chrome/browser/vr/test/ui_test.h b/chrome/browser/vr/test/ui_test.h index cd8cdd95..2d488e291 100644 --- a/chrome/browser/vr/test/ui_test.h +++ b/chrome/browser/vr/test/ui_test.h
@@ -93,7 +93,6 @@ // then jumping time ahead to the final time. Generally, the UI should not // require all intermediate frames to be called. Tests that require this // should simulate the required intermediate frames. - bool RunFor(base::TimeDelta delta); bool RunForMs(float milliseconds); bool RunForSeconds(float seconds); @@ -114,6 +113,8 @@ UiScene* scene_ = nullptr; private: + bool RunFor(base::TimeDelta delta); + base::TimeTicks current_time_; };
diff --git a/chrome/browser/vr/ui_input_manager_unittest.cc b/chrome/browser/vr/ui_input_manager_unittest.cc index 6ed425b..cd7a9740 100644 --- a/chrome/browser/vr/ui_input_manager_unittest.cc +++ b/chrome/browser/vr/ui_input_manager_unittest.cc
@@ -398,7 +398,7 @@ } TEST_F(UiInputManagerContentTest, NoMouseMovesDuringClick) { - EXPECT_TRUE(RunFor(MsToDelta(500))); + EXPECT_TRUE(RunForMs(500)); // It would be nice if the controller weren't platform specific and we could // mock out the underlying sensor data. For now, we will hallucinate // parameters to HandleInput. @@ -432,7 +432,7 @@ TEST_F(UiInputManagerContentTest, AudioPermissionPromptHitTesting) { model_->active_modal_prompt_type = kModalPromptTypeExitVRForVoiceSearchRecordAudioOsPermission; - EXPECT_TRUE(RunFor(MsToDelta(500))); + EXPECT_TRUE(RunForMs(500)); UiElement* url_bar = scene_->GetUiElementByName(UiElementName::kUrlBar); gfx::Point3F url_bar_center = url_bar->GetCenter();
diff --git a/chrome/browser/vr/ui_scene.cc b/chrome/browser/vr/ui_scene.cc index f319183..dd1d9ca 100644 --- a/chrome/browser/vr/ui_scene.cc +++ b/chrome/browser/vr/ui_scene.cc
@@ -159,6 +159,12 @@ return scene_dirty; } +void UiScene::CallPerFrameCallbacks() { + for (auto callback : per_frame_callback_) { + callback.Run(); + } +} + bool UiScene::UpdateTextures() { bool needs_redraw = false; std::vector<UiElement*> elements = GetVisibleElementsMutable(); @@ -235,6 +241,10 @@ InitializeElementRecursive(root_element_.get(), provider_); } +void UiScene::AddPerFrameCallback(PerFrameCallback callback) { + per_frame_callback_.push_back(callback); +} + void UiScene::InitializeElement(UiElement* element) { CHECK_GE(element->id(), 0); CHECK_EQ(GetUiElementById(element->id()), nullptr);
diff --git a/chrome/browser/vr/ui_scene.h b/chrome/browser/vr/ui_scene.h index 2cc87d2..062a95a 100644 --- a/chrome/browser/vr/ui_scene.h +++ b/chrome/browser/vr/ui_scene.h
@@ -29,6 +29,8 @@ class UiScene { public: + typedef base::RepeatingCallback<void()> PerFrameCallback; + UiScene(); ~UiScene(); @@ -45,6 +47,8 @@ bool OnBeginFrame(const base::TimeTicks& current_time, const gfx::Transform& head_pose); + void CallPerFrameCallbacks(); + // Returns true if any textures were redrawn. bool UpdateTextures(); @@ -68,6 +72,9 @@ void set_dirty() { is_dirty_ = true; } void OnGlInitialized(SkiaSurfaceProvider* provider); + // The callback to call on every new frame. This is used for things we want to + // do every frame regardless of element or subtree visibility. + void AddPerFrameCallback(PerFrameCallback callback); SkiaSurfaceProvider* SurfaceProviderForTesting() { return provider_; } @@ -88,6 +95,8 @@ std::vector<UiElement*> all_elements_; + std::vector<PerFrameCallback> per_frame_callback_; + SkiaSurfaceProvider* provider_ = nullptr; DISALLOW_COPY_AND_ASSIGN(UiScene);
diff --git a/chrome/browser/vr/ui_scene_creator.cc b/chrome/browser/vr/ui_scene_creator.cc index 4624c55..d037397 100644 --- a/chrome/browser/vr/ui_scene_creator.cc +++ b/chrome/browser/vr/ui_scene_creator.cc
@@ -1943,6 +1943,9 @@ base::Unretained(keyboard.get())))); VR_BIND_VISIBILITY(keyboard, model->editing_input || model->editing_web_input); + scene_->AddPerFrameCallback(base::BindRepeating( + [](Keyboard* keyboard) { keyboard->AdvanceKeyboardFrameIfNeeded(); }, + base::Unretained(keyboard.get()))); scaler->AddChild(std::move(keyboard)); visibility_control_root->AddChild(std::move(scaler)); scene_->AddUiElement(k2dBrowsingRepositioner,
diff --git a/chrome/browser/vr/ui_suppressed_element.h b/chrome/browser/vr/ui_suppressed_element.h index b9c4189..359096c 100644 --- a/chrome/browser/vr/ui_suppressed_element.h +++ b/chrome/browser/vr/ui_suppressed_element.h
@@ -24,6 +24,7 @@ kAutofill, kUsbChooser, kSslClientCertificate, + kMediaRouterPresentationRequest, // This must be last. kCount,
diff --git a/chrome/browser/vr/ui_unittest.cc b/chrome/browser/vr/ui_unittest.cc index fd35c80..a40f394 100644 --- a/chrome/browser/vr/ui_unittest.cc +++ b/chrome/browser/vr/ui_unittest.cc
@@ -153,8 +153,7 @@ ui_->OnWebVrFrameAvailable(); ui_->SetCapturingState(CapturingStateModel()); EXPECT_TRUE(IsVisible(kWebVrExclusiveScreenToast)); - EXPECT_TRUE(RunFor(base::TimeDelta::FromSecondsD(kToastTimeoutSeconds + - kSmallDelaySeconds))); + EXPECT_TRUE(RunForSeconds(kToastTimeoutSeconds + kSmallDelaySeconds)); EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast)); ui_->SetWebVrMode(false); @@ -168,8 +167,7 @@ // show and hide toast after a timeout. ui_->ShowPlatformToast(base::UTF8ToUTF16("Downloading")); EXPECT_TRUE(IsVisible(kPlatformToast)); - EXPECT_TRUE(RunFor(base::TimeDelta::FromSecondsD(kToastTimeoutSeconds + - kSmallDelaySeconds))); + EXPECT_TRUE(RunForSeconds(kToastTimeoutSeconds + kSmallDelaySeconds)); EXPECT_FALSE(IsVisible(kPlatformToast)); // toast can be cancelled. @@ -180,13 +178,11 @@ // toast can refresh visible timeout. ui_->ShowPlatformToast(base::UTF8ToUTF16("Downloading")); - EXPECT_TRUE(RunFor(base::TimeDelta::FromSecondsD(kSmallDelaySeconds))); + EXPECT_TRUE(RunForSeconds(kSmallDelaySeconds)); ui_->ShowPlatformToast(base::UTF8ToUTF16("Downloading")); - EXPECT_TRUE(RunFor(base::TimeDelta::FromSecondsD(kToastTimeoutSeconds - - kSmallDelaySeconds))); + EXPECT_TRUE(RunForSeconds(kToastTimeoutSeconds - kSmallDelaySeconds)); EXPECT_TRUE(IsVisible(kPlatformToast)); - EXPECT_TRUE(RunFor(base::TimeDelta::FromSecondsD(kToastTimeoutSeconds + - kSmallDelaySeconds))); + EXPECT_TRUE(RunForSeconds(kToastTimeoutSeconds + kSmallDelaySeconds)); EXPECT_FALSE(IsVisible(kPlatformToast)); } @@ -208,8 +204,7 @@ ui_->SetCapturingState(state); EXPECT_TRUE(IsVisible(kWebVrExclusiveScreenToast)); EXPECT_TRUE(IsVisible(spec.webvr_name)); - EXPECT_TRUE(RunFor(base::TimeDelta::FromSecondsD(kToastTimeoutSeconds + - kSmallDelaySeconds))); + EXPECT_TRUE(RunForSeconds(kToastTimeoutSeconds + kSmallDelaySeconds)); EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast)); ui_->SetWebVrMode(false); @@ -448,15 +443,13 @@ ui_->SetCapturingState(CapturingStateModel()); // The splash screen should go away. - RunFor( - MsToDelta(1000 * (kSplashScreenMinDurationSeconds + kSmallDelaySeconds))); + RunForSeconds(kSplashScreenMinDurationSeconds + kSmallDelaySeconds); ui_->OnWebVrFrameAvailable(); - RunFor(MsToDelta(200)); + RunForMs(200); EXPECT_TRUE(IsVisible(kWebVrUrlToast)); // Make sure the transient URL bar times out. - RunFor(MsToDelta(1000 * (kToastTimeoutSeconds + kSmallDelaySeconds))); - RunFor(MsToDelta(1000)); + RunForSeconds(kToastTimeoutSeconds + kSmallDelaySeconds + 1); EXPECT_FALSE(IsVisible(kWebVrUrlToast)); } @@ -467,11 +460,11 @@ VerifyOnlyElementsVisible("Initial", {kSplashScreenText, kWebVrBackground}); ui_->SetWebVrMode(true); - EXPECT_TRUE(RunFor(MsToDelta( - 1000 * (kSplashScreenMinDurationSeconds + kSmallDelaySeconds * 2)))); + EXPECT_TRUE( + RunForSeconds(kSplashScreenMinDurationSeconds + kSmallDelaySeconds * 2)); ui_->OnWebVrTimeoutImminent(); - EXPECT_TRUE(RunFor(MsToDelta(10))); + EXPECT_TRUE(RunForMs(10)); VerifyOnlyElementsVisible( "Timeout imminent", @@ -543,7 +536,7 @@ EXPECT_TRUE(IsAnimating(content_quad, {BOUNDS})); EXPECT_TRUE(IsAnimating(content_group, {TRANSFORM})); // Finish the transition. - EXPECT_TRUE(RunFor(MsToDelta(1000))); + EXPECT_TRUE(RunForMs(1000)); EXPECT_FALSE(IsAnimating(content_quad, {BOUNDS})); EXPECT_FALSE(IsAnimating(content_group, {TRANSFORM})); EXPECT_NE(initial_content_size, content_quad->size()); @@ -561,7 +554,7 @@ EXPECT_TRUE(IsAnimating(content_quad, {BOUNDS})); EXPECT_TRUE(IsAnimating(content_group, {TRANSFORM})); // Finish the transition. - EXPECT_TRUE(RunFor(MsToDelta(1000))); + EXPECT_TRUE(RunForMs(1000)); EXPECT_FALSE(IsAnimating(content_quad, {BOUNDS})); EXPECT_FALSE(IsAnimating(content_group, {TRANSFORM})); EXPECT_EQ(initial_content_size, content_quad->size()); @@ -651,7 +644,7 @@ // Hiding exit VR prompt should make prompt invisible. model_->active_modal_prompt_type = kModalPromptTypeNone; - EXPECT_TRUE(RunFor(MsToDelta(1000))); + EXPECT_TRUE(RunForMs(1000)); VerifyOnlyElementsVisible("Prompt invisible", kElementsVisibleInBrowsing); } @@ -806,7 +799,7 @@ TEST_F(UiTest, DontPropagateContentBoundsOnNegligibleChange) { CreateScene(kNotInCct, kNotInWebVr); - EXPECT_TRUE(RunFor(MsToDelta(0))); + EXPECT_TRUE(RunForMs(0)); ui_->OnProjMatrixChanged(kPixelDaydreamProjMatrix); UiElement* content_quad = scene_->GetUiElementByName(kContentQuad); @@ -846,7 +839,7 @@ ui_->SetWebVrMode(true); model_->web_vr.state = kWebVrAwaitingFirstFrame; - RunFor(MsToDelta(500)); + RunForMs(500); VerifyVisibility( { kWebVrTimeoutSpinner, kWebVrTimeoutMessage, @@ -862,7 +855,7 @@ true); model_->web_vr.state = kWebVrTimeoutImminent; - RunFor(MsToDelta(500)); + RunForMs(500); VerifyVisibility( { kWebVrTimeoutMessage, kWebVrTimeoutMessageLayout, @@ -877,7 +870,7 @@ true); model_->web_vr.state = kWebVrTimedOut; - RunFor(MsToDelta(500)); + RunForMs(500); VerifyVisibility( { kWebVrTimeoutSpinner, @@ -899,16 +892,16 @@ // Start hiding browsing foreground and showing speech recognition listening // UI. - EXPECT_TRUE(RunFor(MsToDelta(10))); + EXPECT_TRUE(RunForMs(10)); VerifyIsAnimating({k2dBrowsingForeground}, {OPACITY}, true); VerifyIsAnimating({kSpeechRecognitionListening, kSpeechRecognitionResult}, {OPACITY}, false); ui_->SetSpeechRecognitionEnabled(true); - EXPECT_TRUE(RunFor(MsToDelta(10))); + EXPECT_TRUE(RunForMs(10)); VerifyIsAnimating({k2dBrowsingForeground, kSpeechRecognitionListening}, {OPACITY}, true); - EXPECT_TRUE(RunFor(MsToDelta(kSpeechRecognitionOpacityAnimationDurationMs))); + EXPECT_TRUE(RunForMs(kSpeechRecognitionOpacityAnimationDurationMs)); // All opacity animations should be finished at this point. VerifyIsAnimating({k2dBrowsingForeground, kSpeechRecognitionListening, kSpeechRecognitionResult}, @@ -919,7 +912,7 @@ VerifyVisibility({k2dBrowsingForeground, kSpeechRecognitionResult}, false); model_->speech.speech_recognition_state = SPEECH_RECOGNITION_READY; - EXPECT_TRUE(RunFor(MsToDelta(10))); + EXPECT_TRUE(RunForMs(10)); VerifyIsAnimating({kSpeechRecognitionListeningGrowingCircle}, {CIRCLE_GROW}, true); @@ -928,7 +921,7 @@ model_->speech.speech_recognition_state = SPEECH_RECOGNITION_END; ui_->SetSpeechRecognitionEnabled(false); - EXPECT_TRUE(RunFor(MsToDelta(10))); + EXPECT_TRUE(RunForMs(10)); VerifyVisibility(kElementsVisibleWithVoiceSearchResult, true); // Speech result UI should show instantly while listening UI hide immediately. VerifyIsAnimating({k2dBrowsingForeground, kSpeechRecognitionListening, @@ -939,15 +932,15 @@ VerifyVisibility({k2dBrowsingForeground, kSpeechRecognitionListening}, false); // The visibility of Speech Recognition UI should not change at this point. - EXPECT_FALSE(RunFor(MsToDelta(10))); + EXPECT_FALSE(RunForMs(10)); - EXPECT_TRUE(RunFor(MsToDelta(kSpeechRecognitionResultTimeoutSeconds * 1000))); + EXPECT_TRUE(RunForSeconds(kSpeechRecognitionResultTimeoutSeconds)); // Start hide speech recognition result and show browsing foreground. VerifyIsAnimating({k2dBrowsingForeground, kSpeechRecognitionResult}, {OPACITY}, true); VerifyIsAnimating({kSpeechRecognitionListening}, {OPACITY}, false); - EXPECT_TRUE(RunFor(MsToDelta(kSpeechRecognitionOpacityAnimationDurationMs))); + EXPECT_TRUE(RunForMs(kSpeechRecognitionOpacityAnimationDurationMs)); VerifyIsAnimating({k2dBrowsingForeground, kSpeechRecognitionListening, kSpeechRecognitionResult}, {OPACITY}, false); @@ -963,7 +956,7 @@ CreateScene(kNotInCct, kNotInWebVr); ui_->SetSpeechRecognitionEnabled(true); - EXPECT_TRUE(RunFor(MsToDelta(kSpeechRecognitionOpacityAnimationDurationMs))); + EXPECT_TRUE(RunForMs(kSpeechRecognitionOpacityAnimationDurationMs)); VerifyIsAnimating({k2dBrowsingForeground, kSpeechRecognitionListening}, {OPACITY}, false); @@ -972,12 +965,12 @@ model_->speech.recognition_result.clear(); model_->speech.speech_recognition_state = SPEECH_RECOGNITION_END; - EXPECT_TRUE(RunFor(MsToDelta(10))); + EXPECT_TRUE(RunForMs(10)); VerifyIsAnimating({k2dBrowsingForeground, kSpeechRecognitionListening}, {OPACITY}, true); VerifyIsAnimating({kSpeechRecognitionResult}, {OPACITY}, false); - EXPECT_TRUE(RunFor(MsToDelta(kSpeechRecognitionOpacityAnimationDurationMs))); + EXPECT_TRUE(RunForMs(kSpeechRecognitionOpacityAnimationDurationMs)); VerifyIsAnimating({k2dBrowsingForeground, kSpeechRecognitionListening, kSpeechRecognitionResult}, {OPACITY}, false); @@ -1045,20 +1038,20 @@ model_->controller.quiescent = true; UiElement* controller_group = scene_->GetUiElementByName(kControllerGroup); - EXPECT_TRUE(RunFor(MsToDelta(100))); + EXPECT_TRUE(RunForMs(100)); EXPECT_LT(0.0f, controller_group->computed_opacity()); - EXPECT_TRUE(RunFor(MsToDelta(500))); + EXPECT_TRUE(RunForMs(500)); EXPECT_EQ(0.0f, controller_group->computed_opacity()); model_->controller.quiescent = false; - EXPECT_TRUE(RunFor(MsToDelta(100))); + EXPECT_TRUE(RunForMs(100)); EXPECT_GT(1.0f, controller_group->computed_opacity()); - EXPECT_TRUE(RunFor(MsToDelta(150))); + EXPECT_TRUE(RunForMs(150)); EXPECT_EQ(1.0f, controller_group->computed_opacity()); model_->skips_redraw_when_not_dirty = false; model_->controller.quiescent = true; - EXPECT_FALSE(RunFor(MsToDelta(1000))); + EXPECT_FALSE(RunForMs(1000)); EXPECT_TRUE(IsVisible(kControllerGroup)); } @@ -1077,23 +1070,23 @@ ui_->SetFullscreen(true); } ColorScheme scheme = ColorScheme::GetColorScheme(mode); - RunFor(MsToDelta(kAnimationTimeMs)); + RunForMs(kAnimationTimeMs); VerifyButtonColor(button, scheme.disc_button_colors.foreground, scheme.disc_button_colors.background, "normal"); button->hit_plane()->OnHoverEnter(gfx::PointF(0.5f, 0.5f)); - RunFor(MsToDelta(kAnimationTimeMs)); + RunForMs(kAnimationTimeMs); VerifyButtonColor(button, scheme.disc_button_colors.foreground, scheme.disc_button_colors.background_hover, "hover"); button->hit_plane()->OnButtonDown(gfx::PointF(0.5f, 0.5f)); - RunFor(MsToDelta(kAnimationTimeMs)); + RunForMs(kAnimationTimeMs); VerifyButtonColor(button, scheme.disc_button_colors.foreground, scheme.disc_button_colors.background_down, "down"); button->hit_plane()->OnMove(gfx::PointF()); - RunFor(MsToDelta(kAnimationTimeMs)); + RunForMs(kAnimationTimeMs); VerifyButtonColor(button, scheme.disc_button_colors.foreground, scheme.disc_button_colors.background, "move"); button->hit_plane()->OnButtonUp(gfx::PointF()); - RunFor(MsToDelta(kAnimationTimeMs)); + RunForMs(kAnimationTimeMs); VerifyButtonColor(button, scheme.disc_button_colors.foreground, scheme.disc_button_colors.background, "up"); } @@ -1358,7 +1351,7 @@ ui_->SetCapturingState(CapturingStateModel()); OnBeginFrame(); EXPECT_TRUE(IsVisible(kWebVrExclusiveScreenToast)); - RunFor(MsToDelta(8000)); + RunForSeconds(8); EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast)); model_->web_vr.showing_hosted_ui = true; OnBeginFrame(); @@ -1378,14 +1371,14 @@ ui_->SetCapturingState(CapturingStateModel()); OnBeginFrame(); EXPECT_TRUE(IsVisible(kWebVrExclusiveScreenToast)); - RunFor(MsToDelta(8000)); + RunForSeconds(8); EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast)); model_->capturing_state.audio_capture_enabled = true; model_->controller.app_button_long_pressed = true; OnBeginFrame(); EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast)); EXPECT_TRUE(IsVisible(kWebVrAudioCaptureIndicator)); - RunFor(MsToDelta(8000)); + RunForSeconds(8); EXPECT_FALSE(IsVisible(kWebVrAudioCaptureIndicator)); model_->controller.app_button_long_pressed = true; OnBeginFrame();
diff --git a/chrome/browser/vr/vr_tab_helper.cc b/chrome/browser/vr/vr_tab_helper.cc index 9c447dae..89f0fd3 100644 --- a/chrome/browser/vr/vr_tab_helper.cc +++ b/chrome/browser/vr/vr_tab_helper.cc
@@ -5,10 +5,16 @@ #include "chrome/browser/vr/vr_tab_helper.h" #include "base/metrics/histogram_macros.h" +#include "build/build_config.h" #include "content/public/browser/render_view_host.h" #include "content/public/common/web_preferences.h" #include "device/vr/buildflags/buildflags.h" +#if defined(OS_ANDROID) +#include "base/feature_list.h" +#include "chrome/browser/android/chrome_feature_list.h" +#endif + using content::WebContents; using content::WebPreferences; @@ -47,10 +53,55 @@ return vr_tab_helper->is_in_vr(); } -/* static */ -void VrTabHelper::UISuppressed(vr::UiSuppressedElement element) { - UMA_HISTOGRAM_ENUMERATION("VR.Shell.EncounteredSuppressedUI", element, - vr::UiSuppressedElement::kCount); +bool VrTabHelper::IsUiSuppressedInVr(content::WebContents* contents, + UiSuppressedElement element) { + if (!IsInVr(contents)) + return false; + + bool suppress = false; + switch (element) { + // The following are suppressed if in VR. + case UiSuppressedElement::kHttpAuth: + case UiSuppressedElement::kSslClientCertificate: + case UiSuppressedElement::kUsbChooser: + case UiSuppressedElement::kFileChooser: + case UiSuppressedElement::kBluetoothChooser: + case UiSuppressedElement::kPasswordManager: + case UiSuppressedElement::kMediaRouterPresentationRequest: + // Note that this enum suppresses two type of UIs. One is Chrome's missing + // storage permission Dialog which is an Android AlertDialog. And if user + // clicked positive button on the AlertDialog, Chrome will request storage + // permission from Android which triggers standard permission request + // dialog. Permission request dialog is not supported in VR either (see + // https://crbug.com/642934). So we need to make sure that both AlertDialog + // and permission request dialog are supported in VR before we disable this + // suppression. + case UiSuppressedElement::kFileAccessPermission: + suppress = true; + break; + // The following are not suppressed if kVrBrowsingNativeAndroidUi is + // enabled. + case UiSuppressedElement::kPermissionRequest: + case UiSuppressedElement::kDownloadPermission: + case UiSuppressedElement::kAutofill: + case UiSuppressedElement::kJavascriptDialog: + case UiSuppressedElement::kMediaPermission: + case UiSuppressedElement::kQuotaPermission: +#if defined(OS_ANDROID) + suppress = !base::FeatureList::IsEnabled( + chrome::android::kVrBrowsingNativeAndroidUi); +#endif + break; + case UiSuppressedElement::kCount: + suppress = false; + NOTREACHED(); + break; + } + if (suppress) { + UMA_HISTOGRAM_ENUMERATION("VR.Shell.EncounteredSuppressedUI", element, + UiSuppressedElement::kCount); + } + return suppress; } } // namespace vr
diff --git a/chrome/browser/vr/vr_tab_helper.h b/chrome/browser/vr/vr_tab_helper.h index edfd65f3..a3d4e2726 100644 --- a/chrome/browser/vr/vr_tab_helper.h +++ b/chrome/browser/vr/vr_tab_helper.h
@@ -23,8 +23,9 @@ static bool IsInVr(content::WebContents* contents); - // Used for logging. - static void UISuppressed(vr::UiSuppressedElement element); + // If suppressed, this function will log a UMA stat. + static bool IsUiSuppressedInVr(content::WebContents* contents, + UiSuppressedElement element); private: explicit VrTabHelper(content::WebContents* contents);
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 1b37fcd..c4b3efb 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -331,7 +331,7 @@ #if !defined(OS_ANDROID) // Enables Casting a Presentation API-enabled website to a secondary display. const base::Feature kLocalScreenCasting{"LocalScreenCasting", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; #endif // Enables or disables the Location Settings Dialog (LSD). The LSD is an Android @@ -541,6 +541,20 @@ const base::Feature kSitePerProcess{"site-per-process", base::FEATURE_DISABLED_BY_DEFAULT}; +// kSitePerProcessOnlyForHighMemoryClients is checked before kSitePerProcess, +// and (if enabled) can restrict if kSitePerProcess feature is checked at all - +// no check will be made on devices with low memory (these devices will have no +// Site Isolation via kSitePerProcess trials and won't activate either the +// control or the experiment group). The threshold for what is considered a +// "low memory" device is set (in MB) via a field trial param with the name +// defined below ("site-per-process-low-memory-cutoff-mb") and compared against +// base::SysInfo::AmountOfPhysicalMemoryMB(). +const base::Feature kSitePerProcessOnlyForHighMemoryClients{ + "site-per-process-only-for-high-memory-clients", + base::FEATURE_DISABLED_BY_DEFAULT}; +const char kSitePerProcessOnlyForHighMemoryClientsParamName[] = + "site-per-process-low-memory-cutoff-mb"; + // A new user experience for transitioning into fullscreen and mouse pointer // lock states. const base::Feature kSimplifiedFullscreenUI{"ViewsSimplifiedFullscreenUI",
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index ecd439c..a75a875 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -300,6 +300,9 @@ extern const base::Feature kSitePerProcess; +extern const base::Feature kSitePerProcessOnlyForHighMemoryClients; +extern const char kSitePerProcessOnlyForHighMemoryClientsParamName[]; + #if defined(OS_CHROMEOS) extern const base::Feature kNativeSmb; #endif
diff --git a/chrome/common/extensions/manifest_handlers/settings_overrides_handler_unittest.cc b/chrome/common/extensions/manifest_handlers/settings_overrides_handler_unittest.cc index 4b85792..15757680 100644 --- a/chrome/common/extensions/manifest_handlers/settings_overrides_handler_unittest.cc +++ b/chrome/common/extensions/manifest_handlers/settings_overrides_handler_unittest.cc
@@ -19,8 +19,10 @@ namespace { -const char kManifest[] = "{" +const char kManifest[] = + "{" " \"version\" : \"1.0.0.0\"," + " \"manifest_version\" : 2," " \"name\" : \"Test\"," " \"chrome_settings_overrides\" : {" " \"homepage\" : \"http://www.homepage.com\"," @@ -40,6 +42,7 @@ const char kPrepopulatedManifest[] = "{" " \"version\" : \"1.0.0.0\"," + " \"manifest_version\" : 2," " \"name\" : \"Test\"," " \"chrome_settings_overrides\" : {" " \"search_provider\" : {" @@ -50,8 +53,10 @@ " }" "}"; -const char kBrokenManifest[] = "{" +const char kBrokenManifest[] = + "{" " \"version\" : \"1.0.0.0\"," + " \"manifest_version\" : 2," " \"name\" : \"Test\"," " \"chrome_settings_overrides\" : {" " \"homepage\" : \"{invalid}\","
diff --git a/chrome/common/extensions/manifest_handlers/ui_overrides_handler_unittest.cc b/chrome/common/extensions/manifest_handlers/ui_overrides_handler_unittest.cc index 180748d..4ed61a42 100644 --- a/chrome/common/extensions/manifest_handlers/ui_overrides_handler_unittest.cc +++ b/chrome/common/extensions/manifest_handlers/ui_overrides_handler_unittest.cc
@@ -19,8 +19,10 @@ namespace { -const char kManifest[] = "{" +const char kManifest[] = + "{" " \"version\" : \"1.0.0.0\"," + " \"manifest_version\" : 2," " \"name\" : \"Test\"," " \"chrome_ui_overrides\" : {" " \"bookmarks_ui\" : {" @@ -30,8 +32,10 @@ " }" "}"; -const char kBrokenManifest[] = "{" +const char kBrokenManifest[] = + "{" " \"version\" : \"1.0.0.0\"," + " \"manifest_version\" : 2," " \"name\" : \"Test\"," " \"chrome_ui_overrides\" : {" " }"
diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc index 410a845..effdceda 100644 --- a/chrome/common/extensions/permissions/permission_set_unittest.cc +++ b/chrome/common/extensions/permissions/permission_set_unittest.cc
@@ -1284,14 +1284,7 @@ testing::AssertionResult ShowsAllHostsWarning(const std::string& pattern) { scoped_refptr<Extension> extension = - ExtensionBuilder() - .SetManifest( - DictionaryBuilder() - .Set("name", "TLDWildCardTest") - .Set("version", "0.1.0") - .Set("permissions", ListBuilder().Append(pattern).Build()) - .Build()) - .Build(); + ExtensionBuilder("TLDWildCardTest").AddPermission(pattern).Build(); return VerifyHasPermissionMessage( extension->permissions_data(),
diff --git a/chrome/common/extensions/sync_type_unittest.cc b/chrome/common/extensions/sync_type_unittest.cc index dd7ac1c..921c8c3 100644 --- a/chrome/common/extensions/sync_type_unittest.cc +++ b/chrome/common/extensions/sync_type_unittest.cc
@@ -38,6 +38,7 @@ base::DictionaryValue source; source.SetString(keys::kName, "PossiblySyncableExtension"); source.SetString(keys::kVersion, "0.0.0.0"); + source.SetInteger(keys::kManifestVersion, 2); if (type == APP) source.SetString(keys::kApp, "true"); if (type == THEME)
diff --git a/chrome/renderer/autofill/password_generation_agent_browsertest.cc b/chrome/renderer/autofill/password_generation_agent_browsertest.cc index 1e4002b9..c153488 100644 --- a/chrome/renderer/autofill/password_generation_agent_browsertest.cc +++ b/chrome/renderer/autofill/password_generation_agent_browsertest.cc
@@ -947,4 +947,26 @@ EXPECT_EQ("1", generation_mark.Utf8()); } +TEST_F(PasswordGenerationAgentTestForHtmlAnnotation, AnnotateUnownedFields) { + LoadHTMLWithUserGesture(kAccountCreationNoForm); + WebDocument document = GetMainFrame()->GetDocument(); + + // Check field signatures are set. + blink::WebElement username_element = + document.GetElementById(blink::WebString::FromUTF8("username")); + ASSERT_FALSE(username_element.IsNull()); + blink::WebString username_signature = username_element.GetAttribute( + blink::WebString::FromUTF8("field_signature")); + ASSERT_FALSE(username_signature.IsNull()); + EXPECT_EQ("239111655", username_signature.Ascii()); + + blink::WebElement password_element = + document.GetElementById(blink::WebString::FromUTF8("first_password")); + ASSERT_FALSE(password_element.IsNull()); + blink::WebString password_signature = password_element.GetAttribute( + blink::WebString::FromUTF8("field_signature")); + ASSERT_FALSE(password_signature.IsNull()); + EXPECT_EQ("3933215845", password_signature.Ascii()); +} + } // namespace autofill
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 3c978c40..3c4aa29 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2514,7 +2514,7 @@ "../browser/profiles/profile_manager_unittest.cc", "../browser/profiles/profile_shortcut_manager_unittest_win.cc", "../browser/profiling_host/background_profiling_triggers_unittest.cc", - "../browser/profiling_host/profiling_process_host_unittest.cc", + "../browser/profiling_host/chrome_client_connection_manager_unittest.cc", "../browser/push_messaging/push_messaging_app_identifier_unittest.cc", "../browser/push_messaging/push_messaging_notification_manager_unittest.cc", "../browser/push_messaging/push_messaging_service_unittest.cc", @@ -3365,7 +3365,6 @@ "../browser/extensions/convert_user_script_unittest.cc", "../browser/extensions/convert_web_app_unittest.cc", "../browser/extensions/default_apps_unittest.cc", - "../browser/extensions/display_info_provider_chromeos_unittest.cc", "../browser/extensions/error_console/error_console_unittest.cc", "../browser/extensions/event_router_forwarder_unittest.cc", "../browser/extensions/extension_action_icon_factory_unittest.cc", @@ -3424,6 +3423,7 @@ "../browser/extensions/scripting_permissions_modifier_unittest.cc", "../browser/extensions/shared_module_service_unittest.cc", "../browser/extensions/standard_management_policy_provider_unittest.cc", + "../browser/extensions/system_display/display_info_provider_chromeos_unittest.cc", "../browser/extensions/tab_helper_unittest.cc", "../browser/extensions/update_install_gate_unittest.cc", "../browser/extensions/updater/extension_cache_fake.cc", @@ -5006,8 +5006,6 @@ "../app/chrome_watcher_command_line_win.cc", "../app/chrome_watcher_command_line_win_unittest.cc", "../app/resources/resources_unittest.cc", - "../common/crash_keys.cc", - "../common/crash_keys.h", ] deps = [ ":test_support",
diff --git a/chrome/test/data/autofill/double_dynamic_form.html b/chrome/test/data/autofill/double_dynamic_form.html index 376f8f9a..c82e928 100644 --- a/chrome/test/data/autofill/double_dynamic_form.html +++ b/chrome/test/data/autofill/double_dynamic_form.html
@@ -30,34 +30,38 @@ <script src="dynamic_form_utils.js"></script> <script> -var refilled = false; -var callback_c = false; +var notify_on_first_name_input_appear = false; function CountryChanged() { - DynamicallyChangeForm(); + RemoveForm('form1'); + var new_form = AddNewFormAndFields('form1', 'addr1.1'); - // Prepare the function to trigger a second dynamic form change. - document.getElementById("email").addEventListener('change', function(){ - + // Trigger a second form change on refill. + new_form.elements[0].addEventListener('change', function(){ RemoveForm("form1") - - var new_form2 = AddNewFormAndFields(); - new_form2.setAttribute('id', "form2"); - + var new_form2 = AddNewFormAndFields("form2", "addr1.2"); document.getElementsByTagName('body')[0].appendChild(new_form2); - if (callback_c) - window.domAutomationController.send(document.getElementById("firstname").value != ''); - + if (notify_on_first_name_input_appear) { + // Give time to see if it fills. + setTimeout(function() { + window.domAutomationController.send(document.getElementById("firstname_form2").value != ''); + }, 1000); + } }); + + document.getElementsByTagName('body')[0].appendChild(new_form); } -function hasFinished() { - var first_name_input = document.getElementById("firstname"); - if (refilled) { - window.domAutomationController.send(document.getElementById("firstname").value != ''); +function hasRefilled() { + var first_name_input = document.getElementById('firstname_form2'); + if (first_name_input) { + // Give time to see if it fills. + setTimeout(function() { + window.domAutomationController.send(first_name_input.value != ''); + }, 1000); } else { - callback_c = true; + notify_on_first_name_input_appear = true; } }
diff --git a/chrome/test/data/autofill/dynamic_form.html b/chrome/test/data/autofill/dynamic_form.html index 8e05a655..99f45a7 100644 --- a/chrome/test/data/autofill/dynamic_form.html +++ b/chrome/test/data/autofill/dynamic_form.html
@@ -29,21 +29,31 @@ <script src="dynamic_form_utils.js"></script> <script> -var filled = false; + +var notify_on_first_name_input_change = false; +var first_name_input_changed = false; function CountryChanged() { - DynamicallyChangeForm(); - filled = true; + RemoveForm('form1'); + var new_form = AddNewFormAndFields('form1', 'addr1.1'); + + var first_name_input = new_form.elements[0]; + first_name_input.onchange = function() { + if (notify_on_first_name_input_change) + window.domAutomationController.send(first_name_input.value != ''); + else + first_name_input_changed = true; + } + + document.getElementsByTagName('body')[0].appendChild(new_form); } function hasRefilled() { - var first_name_input = document.getElementById("firstname"); - if (!filled || first_name_input.value == '') { - first_name_input.onchange = function() { - window.domAutomationController.send(document.getElementById("firstname").value != ''); - } + var first_name_input = document.getElementById('firstname_form1'); + if (first_name_input && first_name_input_changed) { + window.domAutomationController.send(first_name_input.value != ''); } else { - window.domAutomationController.send(document.getElementById("firstname").value != ''); + notify_on_first_name_input_change = true; } }
diff --git a/chrome/test/data/autofill/dynamic_form_after_delay.html b/chrome/test/data/autofill/dynamic_form_after_delay.html index b2b34fe..5f6e63c70 100644 --- a/chrome/test/data/autofill/dynamic_form_after_delay.html +++ b/chrome/test/data/autofill/dynamic_form_after_delay.html
@@ -29,7 +29,7 @@ <script src="dynamic_form_utils.js"></script> <script> -var filled = false; +var notify_on_first_name_input_appear = false; function sleep (time) { return new Promise((resolve) => setTimeout(resolve, time)); @@ -37,16 +37,29 @@ function CountryChanged() { sleep(2000).then(() => { - DynamicallyChangeForm(); - filled = true; + RemoveForm('form1'); + var new_form = AddNewFormAndFields('form1', 'addr1.1'); + document.getElementsByTagName('body')[0].appendChild(new_form); - // Give time to see if it fills. - setTimeout(function() { - window.domAutomationController.send(document.getElementById("firstname").value != ''); - }, 1000);}); + if (notify_on_first_name_input_appear) { + // Give time to see if it fills. + setTimeout(function() { + window.domAutomationController.send(document.getElementById("firstname_form1").value != ''); + }, 1000); + } + }); } -// The callback will happen after the dynamic change. -function hasFinished() {} +function hasRefilled() { + var first_name_input = document.getElementById('firstname_form1'); + if (first_name_input && first_name_input_changed) { + // Give time to see if it fills. + setTimeout(function() { + window.domAutomationController.send(first_name_input.value != ''); + }, 1000); + } else { + notify_on_first_name_input_appear = true; + } +} </script>
diff --git a/chrome/test/data/autofill/dynamic_form_credit_card.html b/chrome/test/data/autofill/dynamic_form_credit_card.html index 0ad00d7..34043a7 100644 --- a/chrome/test/data/autofill/dynamic_form_credit_card.html +++ b/chrome/test/data/autofill/dynamic_form_credit_card.html
@@ -38,7 +38,8 @@ <script src="dynamic_form_utils.js"></script> <script> -var filled = false; + +var notify_on_credit_card_name_input_appear = false; function ExpChanged() { RemoveForm("cc1"); @@ -99,14 +100,23 @@ document.getElementsByTagName('body')[0].appendChild(new_form); - filled = true; - - // Give time to see if it fills. - setTimeout(function() { - window.domAutomationController.send(document.getElementById("cc-name").value != ''); - }, 1000); + if (notify_on_credit_card_name_input_appear) { + // Give time to see if it fills. + setTimeout(function() { + window.domAutomationController.send(document.getElementById("cc-name").value != ''); + }, 1000); + } } -// The callback will happen after the dynamic change -function hasRefilled() {} +function hasRefilled() { + var credit_card_name_input = document.getElementById('cc-name'); + if (credit_card_name_input) { + setTimeout(function() { + window.domAutomationController.send(credit_card_name_input.value != ''); + }, 1000); + } else { + notify_on_credit_card_name_input_appear = true; + } +} + </script> \ No newline at end of file
diff --git a/chrome/test/data/autofill/dynamic_form_disabled.html b/chrome/test/data/autofill/dynamic_form_disabled.html index a1cf652f..c5d2f2ec 100644 --- a/chrome/test/data/autofill/dynamic_form_disabled.html +++ b/chrome/test/data/autofill/dynamic_form_disabled.html
@@ -29,21 +29,31 @@ <script src="dynamic_form_utils.js"></script> <script> -var filled = false; -var callback_c = false; + +var notify_on_first_name_input_appear = false; function CountryChanged() { - DynamicallyChangeForm(); - filled = true; - if (callback_c) - window.domAutomationController.send(document.getElementById("firstname").value != ''); + RemoveForm('form1'); + var new_form = AddNewFormAndFields('form1', 'addr1.1'); + document.getElementsByTagName('body')[0].appendChild(new_form); + + if (notify_on_first_name_input_appear) { + // Give time to see if it fills. + setTimeout(function() { + window.domAutomationController.send(document.getElementById("firstname_form1").value != ''); + }, 1000); + } } function hasRefilled() { - if (filled) { - window.domAutomationController.send(document.getElementById("firstname").value != ''); + var first_name_input = document.getElementById('firstname_form1'); + if (first_name_input) { + // Give time to see if it fills. + setTimeout(function() { + window.domAutomationController.send(first_name_input.value != ''); + }, 1000); } else { - callback_c = true; + notify_on_first_name_input_appear = true; } }
diff --git a/chrome/test/data/autofill/dynamic_form_double_select_options_change.html b/chrome/test/data/autofill/dynamic_form_double_select_options_change.html index b1e5d0a1..ce77dee6 100644 --- a/chrome/test/data/autofill/dynamic_form_double_select_options_change.html +++ b/chrome/test/data/autofill/dynamic_form_double_select_options_change.html
@@ -24,7 +24,38 @@ <script> +var notify_on_first_name_input_change = false; +var first_name_input_changed = false; + function CountryChanged() { + var first_name_input = document.getElementById("firstname"); + // Reset the value of the first name field. + first_name_input.value = ''; + first_name_input.addEventListener('change', function() { + first_name_input.value = ''; + first_name_input_changed = true; + + setTimeout(function() { + // Re-change the select options. + for (var i=0; i<state_select.length; i++) { + state_select.remove(i); + } + state_select.options[0] = new Option('CA', 'CA'); + state_select.options[1] = new Option('MA', 'MA'); + state_select.options[2] = new Option('TX', 'TX'); + }); + + if (notify_on_first_name_input_change) { + // Give time to see if it fills. + setTimeout(function() { + window.domAutomationController.send(first_name_input.value != ''); + }, 1000); + } + }); + + // Reset the value of the address field. + document.getElementById("address1").value = ''; + // Get the select object. var state_select = document.getElementById("state"); @@ -37,26 +68,18 @@ state_select.options[0] = new Option('WA', 'WA'); state_select.options[1] = new Option('MA', 'MA'); state_select.options[2] = new Option('TX', 'TX'); - - // Reset the value of a field. - document.getElementById("address1").value = ''; - - // Add event lister for state change. - state_select.addEventListener('change', function(){ - // Re-change the select options. - for (var i=0; i<state_select.length; i++) { - state_select.remove(i); - } - state_select.options[0] = new Option('CA', 'CA'); - state_select.options[1] = new Option('MA', 'MA'); - state_select.options[2] = new Option('TX', 'TX'); - document.getElementById("address1").value = ''; - - window.domAutomationController.send(document.getElementById("firstname").value != ''); - }); } -// The callback will happen after the dynamic change. -function hasRefilled() {} +function hasRefilled() { + var first_name_input = document.getElementById('firstname'); + if (first_name_input && first_name_input_changed) { + // Give time to see if it fills. + setTimeout(function() { + window.domAutomationController.send(document.getElementById("firstname").value != ''); + }, 1000); + } else { + notify_on_first_name_input_change = true; + } +} </script>
diff --git a/chrome/test/data/autofill/dynamic_form_new_field_types.html b/chrome/test/data/autofill/dynamic_form_new_field_types.html index 9adb6c08..568cb0e 100644 --- a/chrome/test/data/autofill/dynamic_form_new_field_types.html +++ b/chrome/test/data/autofill/dynamic_form_new_field_types.html
@@ -31,27 +31,34 @@ <script src="dynamic_form_utils.js"></script> <script> -var filled = false; + +var notify_on_first_name_input_change = false; +var first_name_input_changed = false; function CountryChanged() { - RemoveForm("form1"); - var new_form = AddNewFormAndFields(); + RemoveForm('form1'); + var new_form = AddNewFormAndFields('form1', 'addr1.1'); // Set a different type of phone field. new_form.elements[6].setAttribute('autocomplete', 'tel-national'); + var first_name_input = new_form.elements[0]; + first_name_input.onchange = function() { + if (notify_on_first_name_input_change) + window.domAutomationController.send(first_name_input.value != ''); + else + first_name_input_changed = true; + } + document.getElementsByTagName('body')[0].appendChild(new_form); - filled = true; } function hasRefilled() { - var first_name_input = document.getElementById("firstname"); - if (!filled || first_name_input.value == '') { - first_name_input.onchange = function() { - window.domAutomationController.send(document.getElementById("firstname").value != ''); - } + var first_name_input = document.getElementById('firstname_form1'); + if (first_name_input && first_name_input_changed) { + window.domAutomationController.send(first_name_input.value != ''); } else { - window.domAutomationController.send(document.getElementById("firstname").value != ''); + notify_on_first_name_input_change = true; } }
diff --git a/chrome/test/data/autofill/dynamic_form_select_options_change.html b/chrome/test/data/autofill/dynamic_form_select_options_change.html index b0759b2..d95abebb 100644 --- a/chrome/test/data/autofill/dynamic_form_select_options_change.html +++ b/chrome/test/data/autofill/dynamic_form_select_options_change.html
@@ -24,7 +24,23 @@ <script> +var notify_on_first_name_input_change = false; +var first_name_input_changed = false; + function CountryChanged() { + var first_name_input = document.getElementById("firstname"); + // Reset the value of the first name field. + first_name_input.value = ''; + first_name_input.onchange = function() { + if (notify_on_first_name_input_change) + window.domAutomationController.send(first_name_input.value != ''); + else + first_name_input_changed = true; + } + + // Reset the value of the address field. + document.getElementById("address1").value = ''; + // Get the select object. var state_select = document.getElementById("state"); @@ -37,17 +53,15 @@ state_select.options[0] = new Option('WA', 'WA'); state_select.options[1] = new Option('MA', 'MA'); state_select.options[2] = new Option('TX', 'TX'); - - // Reset the value of a field. - document.getElementById("address1").value = ''; - - // Add event lister for state change. - state_select.addEventListener('change', function(){ - window.domAutomationController.send(document.getElementById("firstname").value != ''); - }); } -// The callback will happen after the dynamic change. -function hasRefilled() {} +function hasRefilled() { + var first_name_input = document.getElementById('firstname'); + if (first_name_input && first_name_input_changed) { + window.domAutomationController.send(first_name_input.value != ''); + } else { + notify_on_first_name_input_change = true; + } +} </script>
diff --git a/chrome/test/data/autofill/dynamic_form_utils.js b/chrome/test/data/autofill/dynamic_form_utils.js index 4e378b3..394841b 100644 --- a/chrome/test/data/autofill/dynamic_form_utils.js +++ b/chrome/test/data/autofill/dynamic_form_utils.js
@@ -4,13 +4,7 @@ * found in the LICENSE file. */ -function DynamicallyChangeForm() { - RemoveForm('form1'); - var new_form = AddNewFormAndFields(); - document.getElementsByTagName('body')[0].appendChild(new_form); -} - -//* Removes the initial form. */ +/** Removes the initial form. */ function RemoveForm(form_id) { var initial_form = document.getElementById(form_id); initial_form.parentNode.removeChild(initial_form); @@ -19,30 +13,30 @@ } /** Adds a new form and fields for the dynamic form. */ -function AddNewFormAndFields() { +function AddNewFormAndFields(form_id, form_name) { var new_form = document.createElement('form'); new_form.setAttribute('method', 'post'); new_form.setAttribute('action', 'https://example.com/') - new_form.setAttribute('name', 'addr1.1'); - new_form.setAttribute('id', 'form1'); + new_form.setAttribute('name', form_name); + new_form.setAttribute('id', form_id); var i = document.createElement('input'); i.setAttribute('type', 'text'); i.setAttribute('name', 'firstname'); - i.setAttribute('id', 'firstname'); + i.setAttribute('id', 'firstname_' + form_id); i.setAttribute('autocomplete', 'given-name'); new_form.appendChild(i); i = document.createElement('input'); i.setAttribute('type', 'text'); i.setAttribute('name', 'address1'); - i.setAttribute('id', 'address1'); + i.setAttribute('id', 'address_' + form_id); i.setAttribute('autocomplete', 'address-line1'); new_form.appendChild(i); i = document.createElement('select'); i.setAttribute('name', 'state'); - i.setAttribute('id', 'state'); + i.setAttribute('id', 'state_' + form_id); i.setAttribute('autocomplete', 'region'); i.options[0] = new Option('CA', 'CA'); i.options[1] = new Option('MA', 'MA'); @@ -52,28 +46,28 @@ i = document.createElement('input'); i.setAttribute('type', 'text'); i.setAttribute('name', 'city'); - i.setAttribute('id', 'city'); + i.setAttribute('id', 'city_' + form_id); i.setAttribute('autocomplete', 'locality'); new_form.appendChild(i); i = document.createElement('input'); i.setAttribute('type', 'text'); i.setAttribute('name', 'company'); - i.setAttribute('id', 'company'); + i.setAttribute('id', 'company_' + form_id); i.setAttribute('autocomplete', 'organization'); new_form.appendChild(i); i = document.createElement('input'); i.setAttribute('type', 'text'); i.setAttribute('name', 'email'); - i.setAttribute('id', 'email'); + i.setAttribute('id', 'email_' + form_id); i.setAttribute('autocomplete', 'email'); new_form.appendChild(i); i = document.createElement('input'); i.setAttribute('type', 'text'); i.setAttribute('name', 'phone'); - i.setAttribute('id', 'phone'); + i.setAttribute('id', 'phone_' + form_id); i.setAttribute('autocomplete', 'tel'); new_form.appendChild(i);
diff --git a/chrome/test/data/autofill/two_dynamic_forms.html b/chrome/test/data/autofill/two_dynamic_forms.html new file mode 100644 index 0000000..76bfcf0 --- /dev/null +++ b/chrome/test/data/autofill/two_dynamic_forms.html
@@ -0,0 +1,89 @@ +<!-- A page that is used to test that a dynamic form fill feature works properly. --> +<body> + <form name="addr1.1" id="form1" action="https://example.com/" method="post"> + Name: <input type="text" name="firstname" id="firstname_form1"><br> + Address: <input type="text" name="address1" id="address_form1"><br> + City: <input type="text" name="city" id="city_form1"><br> + State: <select name="state" id="state1_form1"> + <option value="CA">CA</option> + <option value="MA">MA</option> + <option value="NY">NY</option> + <option value="MD">MD</option> + <option value="OR">OR</option> + <option value="OH">OH</option> + <option value="IL">IL</option> + <option value="DC">DC</option> + </select> <br> + Zip: <input name="zip" id="zip_form1"> <br> + Country: <select name="country" id="country_form1" onchange="CountryChanged(this)"> + <option value="CA">Canada</option> + <option value="US">United States</option> + </select> <br> + Company: <input name="company" id="company_form1"> <br> + Email: <input name="email" id="email_form1"> <br> + Phone: <input name="phone" id="phone_form1"> <br> + <input type="reset" value="Reset"> + <input type="submit" value="Submit" id="profile_submit_form1"> + </form> + + <form name="addr1.2" id="form2" action="https://example.com/" method="post"> + Name: <input type="text" name="firstname" id="firstname_form2"><br> + Address: <input type="text" name="address1" id="address_form2"><br> + City: <input type="text" name="city" id="city_form2"><br> + State: <select name="state" id="state_form2"> + <option value="CA">CA</option> + <option value="MA">MA</option> + <option value="NY">NY</option> + <option value="MD">MD</option> + <option value="OR">OR</option> + <option value="OH">OH</option> + <option value="IL">IL</option> + <option value="DC">DC</option> + </select> <br> + Zip: <input name="zip" id="zip_form2"> <br> + Country: <select name="country" id="country_form2" onchange="CountryChanged(this)"> + <option value="CA">Canada</option> + <option value="US">United States</option> + </select> <br> + Company: <input name="company" id="company_form2"> <br> + Email: <input name="email" id="email_form2"> <br> + Phone: <input name="phone" id="phone_form2"> <br> + <input type="reset" value="Reset"> + <input type="submit" value="Submit" id="profile_submit_form2"> + </form> +</body> + +<script src="dynamic_form_utils.js"></script> +<script> + +var notify_on_first_name_input_change = {}; +var first_name_input_changed = {}; + +function CountryChanged(select_element) { + var form_id = select_element.form.id; + var form_name = select_element.form.name; + + RemoveForm(form_id); + var new_form = AddNewFormAndFields(form_id, form_name); + + var first_name_input_id = 'firstname_' + form_id; + var first_name_input = new_form.elements[0]; + first_name_input.onchange = function() { + if (notify_on_first_name_input_change[first_name_input_id]) + window.domAutomationController.send(first_name_input.value != ''); + else + first_name_input_changed[first_name_input_id] = true; + } + + document.getElementsByTagName('body')[0].appendChild(new_form); +} + +function hasRefilled(first_name_input_id) { + var first_name_input = document.getElementById(first_name_input_id); + if (first_name_input && first_name_input_changed[first_name_input_id]) { + window.domAutomationController.send(first_name_input.value != ''); + } else { + notify_on_first_name_input_change[first_name_input_id] = true; + } +} +</script>
diff --git a/chrome/test/data/extensions/manifest_tests/background_scripts.json b/chrome/test/data/extensions/manifest_tests/background_scripts.json index 18d8d6f8..d5fbc51 100644 --- a/chrome/test/data/extensions/manifest_tests/background_scripts.json +++ b/chrome/test/data/extensions/manifest_tests/background_scripts.json
@@ -1,6 +1,7 @@ { "name": "test", "version": "1", + "manifest_version": 2, "background": { "scripts": [ "foo.js",
diff --git a/chrome/test/data/extensions/page_action/page_action.json b/chrome/test/data/extensions/page_action/page_action.json index 5e5611f..50c7a7d 100644 --- a/chrome/test/data/extensions/page_action/page_action.json +++ b/chrome/test/data/extensions/page_action/page_action.json
@@ -1,6 +1,7 @@ { "name": "PageAction Test", "version": "1.0", + "manifest_version": 2, "page_action": { "default_icon": "image1.png", "default_title": "MyExtensionActionTitle"
diff --git a/chrome/test/data/extensions/page_action/page_action_invalid_title.json b/chrome/test/data/extensions/page_action/page_action_invalid_title.json index b68093b..894ebc0 100644 --- a/chrome/test/data/extensions/page_action/page_action_invalid_title.json +++ b/chrome/test/data/extensions/page_action/page_action_invalid_title.json
@@ -1,6 +1,7 @@ { "name": "PageAction Test", "version": "1.0", + "manifest_version": 2, "page_action": { "default_title": 42 }
diff --git a/chrome/test/data/webui/settings/fake_bluetooth.js b/chrome/test/data/webui/settings/fake_bluetooth.js index 9558523d..d65b09d 100644 --- a/chrome/test/data/webui/settings/fake_bluetooth.js +++ b/chrome/test/data/webui/settings/fake_bluetooth.js
@@ -85,8 +85,9 @@ getDevice: assertNotReached, /** @override */ - getDevices: function(callback) { - callback(this.devices.slice()); + getDevices: function(opt_filter, opt_callback) { + if (opt_callback) + opt_callback(this.devices.slice()); }, /** @override */
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc index c2c6992..9a990ff 100644 --- a/components/autofill/content/renderer/password_autofill_agent.cc +++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -468,10 +468,25 @@ gurl1.port() == gurl2.port(); } -// Annotate |forms| with form and field signatures as HTML attributes. -void AnnotateFormsWithSignatures( - blink::WebVector<blink::WebFormElement> forms) { - for (blink::WebFormElement form : forms) { +// Annotate |fields| with field signatures as HTML attributes. +void AnnotateFieldsWithSignatures( + std::vector<blink::WebFormControlElement>* fields) { + for (blink::WebFormControlElement& control_element : *fields) { + FieldSignature field_signature = CalculateFieldSignatureByNameAndType( + control_element.NameForAutofill().Utf16(), + control_element.FormControlTypeForAutofill().Utf8()); + control_element.SetAttribute( + blink::WebString::FromASCII(kDebugAttributeForFieldSignature), + blink::WebString::FromUTF8(base::NumberToString(field_signature))); + } +} + +// Annotate |forms| and all fields in the |frame| with form and field signatures +// as HTML attributes. +void AnnotateFormsAndFieldsWithSignatures( + blink::WebLocalFrame* frame, + blink::WebVector<blink::WebFormElement>* forms) { + for (blink::WebFormElement& form : *forms) { std::unique_ptr<PasswordForm> password_form( CreatePasswordFormFromWebForm(form, nullptr, nullptr, nullptr)); if (password_form) { @@ -479,26 +494,16 @@ blink::WebString::FromASCII(kDebugAttributeForFormSignature), blink::WebString::FromUTF8(base::NumberToString( CalculateFormSignature(password_form->form_data)))); - - std::vector<blink::WebFormControlElement> control_elements = - form_util::ExtractAutofillableElementsInForm(form); - - if (control_elements.size() != password_form->form_data.fields.size()) - return; - - for (size_t i = 0; i < control_elements.size(); ++i) { - blink::WebFormControlElement control_element = control_elements[i]; - - const FormFieldData& field = password_form->form_data.fields[i]; - if (field.name != control_element.NameForAutofill().Utf16()) - continue; - control_element.SetAttribute( - blink::WebString::FromASCII(kDebugAttributeForFieldSignature), - blink::WebString::FromUTF8( - base::NumberToString(CalculateFieldSignatureForField(field)))); - } } + std::vector<blink::WebFormControlElement> form_fields = + form_util::ExtractAutofillableElementsInForm(form); + AnnotateFieldsWithSignatures(&form_fields); } + + std::vector<blink::WebFormControlElement> unowned_elements = + form_util::GetUnownedAutofillableFormFieldElements( + frame->GetDocument().All(), nullptr); + AnnotateFieldsWithSignatures(&unowned_elements); } // Returns true iff there is a password field in |frame|. @@ -1090,7 +1095,7 @@ frame->GetDocument().Forms(forms); if (IsShowAutofillSignaturesEnabled()) - AnnotateFormsWithSignatures(forms); + AnnotateFormsAndFieldsWithSignatures(frame, &forms); if (logger) logger->LogNumber(Logger::STRING_NUMBER_OF_ALL_FORMS, forms.size());
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc index 910250e..8e84e33 100644 --- a/components/autofill/core/browser/autofill_manager.cc +++ b/components/autofill/core/browser/autofill_manager.cc
@@ -203,13 +203,6 @@ AutofillManager::FillingContext::~FillingContext() = default; -void AutofillManager::FillingContext::Reset() { - attempted_refill = false; - filled_form_name.clear(); - filled_field_name.clear(); - type_groups_to_refill.clear(); -} - AutofillManager::AutofillManager( AutofillDriver* driver, AutofillClient* client, @@ -774,12 +767,15 @@ address_form_event_logger_->OnDidFillSuggestion( profile, form_structure->form_parsed_timestamp()); - // Set up the information needed for an eventual refill. - if (base::FeatureList::IsEnabled(features::kAutofillDynamicForms)) { - filling_context_.temp_data_model = profile; - filling_context_.filled_form_name = form_structure->form_name(); - filling_context_.filled_field_name = autofill_field->unique_name(); - filling_context_.original_fill_time = base::TimeTicks::Now(); + // Set up the information needed for an eventual refill of this form. + if (base::FeatureList::IsEnabled(features::kAutofillDynamicForms) && + !form_structure->form_name().empty()) { + auto& entry = filling_contexts_map_[form_structure->form_name()]; + auto filling_context = std::make_unique<FillingContext>(); + filling_context->temp_data_model = profile; + filling_context->filled_field_name = autofill_field->unique_name(); + filling_context->original_fill_time = base::TimeTicks::Now(); + entry = std::move(filling_context); } } @@ -1213,7 +1209,7 @@ forms_loaded_timestamps_.clear(); initial_interaction_timestamp_ = TimeTicks(); external_delegate_->Reset(); - filling_context_.Reset(); + filling_contexts_map_.clear(); } AutofillManager::AutofillManager( @@ -1363,12 +1359,18 @@ // Only record the types that are filled for an eventual refill if all the // following are satisfied: // The refilling feature is enabled. - // A refill has not been attempted yet. + // A form with the given name is already filled. + // A refill has not been attempted for that form yet. // This fill is not a refill attempt. // This is not a credit card fill. + FillingContext* filling_context = nullptr; + auto itr = filling_contexts_map_.find(form_structure->form_name()); + if (itr != filling_contexts_map_.end()) + filling_context = itr->second.get(); bool could_attempt_refill = base::FeatureList::IsEnabled(features::kAutofillDynamicForms) && - !filling_context_.attempted_refill && !is_refill && !is_credit_card; + filling_context != nullptr && !filling_context->attempted_refill && + !is_refill && !is_credit_card; for (size_t i = 0; i < form_structure->field_count(); ++i) { if (form_structure->field(i)->section() != autofill_field->section()) @@ -1394,17 +1396,21 @@ if (cached_field->role == FormFieldData::ROLE_ATTRIBUTE_PRESENTATION) continue; - // Don't fill previously autofilled fields except the initiating field. - if (result.fields[i].is_autofilled && !cached_field->SameFieldAs(field)) + // Don't fill previously autofilled fields except the initiating field or + // when it's a refill. + if (result.fields[i].is_autofilled && !cached_field->SameFieldAs(field) && + !is_refill) { continue; + } if (field_group_type == NO_GROUP) continue; // On a refill, only fill fields from type groups that were present during // the initial fill. - if (is_refill && !base::ContainsKey(filling_context_.type_groups_to_refill, - field_group_type)) { + if (is_refill && + !base::ContainsKey(filling_context->type_groups_originally_filled, + field_group_type)) { continue; } @@ -1416,7 +1422,7 @@ } if (could_attempt_refill) - filling_context_.type_groups_to_refill.insert(field_group_type); + filling_context->type_groups_originally_filled.insert(field_group_type); // Must match ForEachMatchingFormField() in form_autofill_util.cc. // Only notify autofilling of empty fields and the field that initiated @@ -1670,14 +1676,19 @@ parse_form_start_time); // If a form with the same name was previously filled, and there has not - // been a refill attempt yet, start the process of triggering a refill. + // been a refill attempt on that form yet, start the process of triggering a + // refill. if (ShouldTriggerRefill(*form_structure)) { + auto itr = filling_contexts_map_.find(form_structure->form_name()); + DCHECK(itr != filling_contexts_map_.end()); + FillingContext* filling_context = itr->second.get(); + // If a timer for the refill was already running, it means the form // changed again. Stop the timer and start it again. - if (filling_context_.on_refill_timer.IsRunning()) - filling_context_.on_refill_timer.AbandonAndStop(); + if (filling_context->on_refill_timer.IsRunning()) + filling_context->on_refill_timer.AbandonAndStop(); - filling_context_.on_refill_timer.Start( + filling_context->on_refill_timer.Start( FROM_HERE, base::TimeDelta::FromMilliseconds(kWaitTimeForDynamicFormsMs), base::BindRepeating(&AutofillManager::TriggerRefill, @@ -2013,22 +2024,32 @@ if (!base::FeatureList::IsEnabled(features::kAutofillDynamicForms)) return false; + // Should not refill if a form with the same name has not been filled before. + auto itr = filling_contexts_map_.find(form_structure.form_name()); + if (itr == filling_contexts_map_.end()) + return false; + + FillingContext* filling_context = itr->second.get(); + base::TimeTicks now = base::TimeTicks::Now(); - base::TimeDelta delta = now - filling_context_.original_fill_time; - return !filling_context_.attempted_refill && - !filling_context_.filled_form_name.empty() && - filling_context_.filled_form_name == form_structure.form_name() && + base::TimeDelta delta = now - filling_context->original_fill_time; + return !filling_context->attempted_refill && delta.InMilliseconds() < kLimitBeforeRefillMs; } void AutofillManager::TriggerRefill(const FormData& form, FormStructure* form_structure) { - filling_context_.attempted_refill = true; + auto itr = filling_contexts_map_.find(form_structure->form_name()); + DCHECK(itr != filling_contexts_map_.end()); + FillingContext* filling_context = itr->second.get(); + + DCHECK(!filling_context->attempted_refill); + filling_context->attempted_refill = true; // Try to find the field from which the original field originated. AutofillField* autofill_field = nullptr; for (const std::unique_ptr<AutofillField>& field : *form_structure) { - if (field->unique_name() == filling_context_.filled_field_name) { + if (field->unique_name() == filling_context->filled_field_name) { autofill_field = field.get(); break; } @@ -2042,7 +2063,7 @@ base::string16 cvc; FillOrPreviewDataModelForm( AutofillDriver::RendererFormDataAction::FORM_DATA_ACTION_FILL, - /*query_id=*/-1, form, field, filling_context_.temp_data_model, + /*query_id=*/-1, form, field, filling_context->temp_data_model, /*is_credit_card=*/false, cvc, form_structure, autofill_field, /*is_refill=*/true); }
diff --git a/components/autofill/core/browser/autofill_manager.h b/components/autofill/core/browser/autofill_manager.h index e9f4b82..2b3d077 100644 --- a/components/autofill/core/browser/autofill_manager.h +++ b/components/autofill/core/browser/autofill_manager.h
@@ -289,18 +289,15 @@ } private: + // Keeps track of the filling context for a form, used to make refill attemps. struct FillingContext { FillingContext(); ~FillingContext(); - void Reset(); - - // Whether a refill attempts was made on that page. + // Whether a refill attempt was made. bool attempted_refill = false; // The profile that was used for the initial fill. AutofillProfile temp_data_model; - // The name of the form that was initially filled. - base::string16 filled_form_name; // The name of the field that was initially filled. base::string16 filled_field_name; // The time at which the initial fill occured. @@ -308,7 +305,7 @@ // The timer used to trigger a refill. base::OneShotTimer on_refill_timer; // The field type groups that were initially filled. - std::set<FieldTypeGroup> type_groups_to_refill; + std::set<FieldTypeGroup> type_groups_originally_filled; }; // AutofillDownloadManager::Observer: @@ -592,8 +589,10 @@ AutofillAssistant autofill_assistant_; #endif - // Filling context used for dynamic fills. - FillingContext filling_context_; + // A map of form names to FillingContext instances used to make refill + // attempts for dynamic forms. + std::map<base::string16, std::unique_ptr<FillingContext>> + filling_contexts_map_; base::WeakPtrFactory<AutofillManager> weak_ptr_factory_;
diff --git a/components/autofill/ios/browser/autofill_agent.mm b/components/autofill/ios/browser/autofill_agent.mm index 78fc7efa..2ecb512 100644 --- a/components/autofill/ios/browser/autofill_agent.mm +++ b/components/autofill/ios/browser/autofill_agent.mm
@@ -39,6 +39,7 @@ #include "ios/web/public/url_scheme_util.h" #include "ios/web/public/web_state/form_activity_params.h" #import "ios/web/public/web_state/js/crw_js_injection_receiver.h" +#import "ios/web/public/web_state/navigation_context.h" #include "ios/web/public/web_state/url_verification_constants.h" #import "ios/web/public/web_state/web_state.h" #include "ui/gfx/geometry/rect.h" @@ -253,7 +254,6 @@ ofFormsSeen:(const FormDataVector&)forms { DCHECK(autofillManager); DCHECK(!forms.empty()); - autofillManager->Reset(); autofillManager->OnFormsSeen(forms, base::TimeTicks::Now()); } @@ -542,11 +542,26 @@ completionHandler:completionHandler]; } +- (void)webState:(web::WebState*)webState + didStartNavigation:(web::NavigationContext*)navigation { + // Ignore navigations within the same document, e.g., history.pushState(). + if (navigation->IsSameDocument()) + return; + + // Reset AutofillManager before processing the new page. + autofill::AutofillManager* autofillManager = + [self autofillManagerFromWebState:webState]; + DCHECK(autofillManager); + autofillManager->Reset(); + + // Mark the page as not processed. + pageProcessed_ = NO; +} + - (void)webState:(web::WebState*)webState didLoadPageWithSuccess:(BOOL)success { if (![self isAutofillEnabled]) return; - pageProcessed_ = NO; [self processPage:webState]; } @@ -565,7 +580,7 @@ web::URLVerificationTrustLevel trustLevel; const GURL pageURL(webState->GetCurrentURL(&trustLevel)); - [jsAutofillManager_ trackFormUpdates]; + [jsAutofillManager_ toggleTrackingFormMutations:YES]; [self scanFormsInPage:webState pageURL:pageURL]; }
diff --git a/components/autofill/ios/browser/js_autofill_manager.h b/components/autofill/ios/browser/js_autofill_manager.h index 72c957f66..898a289 100644 --- a/components/autofill/ios/browser/js_autofill_manager.h +++ b/components/autofill/ios/browser/js_autofill_manager.h
@@ -52,8 +52,8 @@ // Adds a delay between filling the form fields. - (void)addJSDelay; -// Installs a tracker to check the form updates in the page every 500ms. -- (void)trackFormUpdates; +// Toggles tracking form related changes in the page. +- (void)toggleTrackingFormMutations:(BOOL)state; // Designated initializer. |receiver| should not be nil. - (instancetype)initWithReceiver:(CRWJSInjectionReceiver*)receiver
diff --git a/components/autofill/ios/browser/js_autofill_manager.mm b/components/autofill/ios/browser/js_autofill_manager.mm index 140be39..d31cab1 100644 --- a/components/autofill/ios/browser/js_autofill_manager.mm +++ b/components/autofill/ios/browser/js_autofill_manager.mm
@@ -75,9 +75,11 @@ }]; } -- (void)trackFormUpdates { - [_receiver executeJavaScript:@"__gCrWeb.form.trackFormUpdates(500)" - completionHandler:nil]; +- (void)toggleTrackingFormMutations:(BOOL)state { + NSString* script = + [NSString stringWithFormat:@"__gCrWeb.form.trackFormMutations(%d);", + state ? 200 : 0]; + [_receiver executeJavaScript:script completionHandler:nil]; } - (void)fillForm:(NSString*)dataString
diff --git a/components/autofill/ios/fill/form_unittest.mm b/components/autofill/ios/fill/form_unittest.mm index e8067d04..a072e31 100644 --- a/components/autofill/ios/fill/form_unittest.mm +++ b/components/autofill/ios/fill/form_unittest.mm
@@ -113,13 +113,13 @@ EXPECT_EQ("form1", info->form_name); } -// Tests that new form triggers form changed event. -TEST_F(FormJsTest, FocusAddForm) { +// Tests that a new form triggers form_changed event. +TEST_F(FormJsTest, AddForm) { web::TestWebStateObserver observer(web_state()); - LoadHtml(@"<form/>"); + LoadHtml(@"<body></body>"); ExecuteJavaScript( - @"__gCrWeb.form.trackFormUpdates(10);" + @"__gCrWeb.form.trackFormMutations(10);" @"var form = document.createElement('form');" @"document.body.appendChild(form);"); web::TestWebStateObserver* block_observer = &observer; @@ -132,13 +132,13 @@ EXPECT_FALSE(info->form_activity.input_missing); } -// Tests that new input triggers form changed event. -TEST_F(FormJsTest, FocusAddInput) { +// Tests that a new input element triggers form_changed event. +TEST_F(FormJsTest, AddInput) { web::TestWebStateObserver observer(web_state()); LoadHtml(@"<form id='formId'/>"); ExecuteJavaScript( - @"__gCrWeb.form.trackFormUpdates(10);" + @"__gCrWeb.form.trackFormMutations(10);" @"var input = document.createElement('input');" @"document.getElementById('formId').appendChild(input);"); web::TestWebStateObserver* block_observer = &observer; @@ -150,3 +150,44 @@ EXPECT_EQ("form_changed", info->form_activity.type); EXPECT_FALSE(info->form_activity.input_missing); } + +// Tests that a new select element triggers form_changed event. +TEST_F(FormJsTest, AddSelect) { + web::TestWebStateObserver observer(web_state()); + LoadHtml(@"<form id='formId'/>"); + + ExecuteJavaScript( + @"__gCrWeb.form.trackFormMutations(10);" + @"var select = document.createElement('select');" + @"document.getElementById('formId').appendChild(select);"); + web::TestWebStateObserver* block_observer = &observer; + __block web::TestFormActivityInfo* info = nil; + WaitForCondition(^{ + info = block_observer->form_activity_info(); + return info != nil; + }); + EXPECT_EQ("form_changed", info->form_activity.type); + EXPECT_FALSE(info->form_activity.input_missing); +} + +// Tests that a new option element triggers form_changed event. +TEST_F(FormJsTest, AddOption) { + web::TestWebStateObserver observer(web_state()); + LoadHtml( + @"<form>" + "<select id='select1'><option value='CA'>CA</option></select>" + "</form>"); + + ExecuteJavaScript( + @"__gCrWeb.form.trackFormMutations(10);" + @"var option = document.createElement('option');" + @"document.getElementById('select1').appendChild(option);"); + web::TestWebStateObserver* block_observer = &observer; + __block web::TestFormActivityInfo* info = nil; + WaitForCondition(^{ + info = block_observer->form_activity_info(); + return info != nil; + }); + EXPECT_EQ("form_changed", info->form_activity.type); + EXPECT_FALSE(info->form_activity.input_missing); +}
diff --git a/components/autofill/ios/fill/resources/form.js b/components/autofill/ios/fill/resources/form.js index 8dfa613..cb41ac7d 100644 --- a/components/autofill/ios/fill/resources/form.js +++ b/components/autofill/ios/fill/resources/form.js
@@ -49,15 +49,14 @@ __gCrWeb.form.kNamelessFieldIDPrefix = 'gChrome~field~'; /** - * The interval watching for form changes. + * The MutationObserver tracking form related changes. */ -__gCrWeb.form.formWatcherInterval = null; +__gCrWeb.form.formMutationObserver = null; /** - * The value of the form signature last time formWatcherInterval was - * triggerred. + * The form mutation message scheduled to be sent to browser. */ -__gCrWeb.form.lastFormSignature = {}; +__gCrWeb.form.formMutationMessageToSend = null; /** * Based on Element::isFormControlElement() (WebKit) @@ -361,46 +360,72 @@ }; /** - * Returns a simple signature of the form content of the page. Must be fast - * as it is called regularly. + * Schedules |msg| to be sent after |delay|. Until |msg| is sent, further calls + * to this function are ignored. */ -var getFormSignature_ = function() { - return { - forms: document.forms.length, - input: document.getElementsByTagName('input').length - }; +var sendFormMutationMessageAfterDelay_ = function(msg, delay) { + if (__gCrWeb.form.formMutationMessageToSend) + return; + + __gCrWeb.form.formMutationMessageToSend = msg; + setTimeout(function() { + __gCrWeb.message.invokeOnHost(__gCrWeb.form.formMutationMessageToSend); + __gCrWeb.form.formMutationMessageToSend = null; + }, delay); }; /** - * Install a watcher to check the form changes. Delay is the interval between - * checks in milliseconds. + * Installs a MutationObserver to track form related changes. Waits |delay| + * milliseconds before sending a message to browser. A delay is used because + * form mutations are likely to come in batches. An undefined or zero value for + * |delay| would stop the MutationObserver, if any. + * @suppress {checkTypes} Required for for...of loop on mutations. */ -__gCrWeb.form['trackFormUpdates'] = function(delay) { - if (__gCrWeb.form.formWatcherInterval) { - clearInterval(__gCrWeb.form.formWatcherInterval); - __gCrWeb.form.formWatcherInterval = null; +__gCrWeb.form['trackFormMutations'] = function(delay) { + if (__gCrWeb.form.formMutationObserver) { + __gCrWeb.form.formMutationObserver.disconnect(); + __gCrWeb.form.formMutationObserver = null; } - if (delay) { - __gCrWeb.form.lastFormSignature = getFormSignature_(); - __gCrWeb.form.formWatcherInterval = setInterval(function() { - var signature = getFormSignature_(); - var old_signature = __gCrWeb.form.lastFormSignature; - if (signature.forms != old_signature.forms || - signature.input != old_signature.input) { - var msg = { - 'command': 'form.activity', - 'formName': '', - 'fieldName': '', - 'fieldIdentifier': '', - 'fieldType': '', - 'type': 'form_changed', - 'value': '' - }; - __gCrWeb.form.lastFormSignature = signature; - __gCrWeb.message.invokeOnHost(msg); - } - }, delay); - } + + if (!delay) + return; + + __gCrWeb.form.formMutationObserver = + new MutationObserver(function(mutations) { + for (var i = 0; i < mutations.length; i++) { + var mutation = mutations[i]; + // Only process mutations to the tree of nodes. + if (mutation.type != 'childList') + continue; + var addedElements = []; + for (var j = 0; j < mutation.addedNodes.length; j++) { + var node = mutation.addedNodes[j]; + // Ignore non-element nodes. + if (node.nodeType != Node.ELEMENT_NODE) + continue; + addedElements.push(node); + [].push.apply( + addedElements, [].slice.call(node.getElementsByTagName('*'))); + } + var form_changed = addedElements.find(function(element) { + return element.tagName.match(/(FORM|INPUT|SELECT|OPTION)/); + }); + if (form_changed) { + var msg = { + 'command': 'form.activity', + 'formName': '', + 'fieldName': '', + 'fieldIdentifier': '', + 'fieldType': '', + 'type': 'form_changed', + 'value': '' + }; + return sendFormMutationMessageAfterDelay_(msg, delay); + } + } + }); + __gCrWeb.form.formMutationObserver.observe( + document, {childList: true, subtree: true}); }; /** Flush the message queue. */
diff --git a/components/cast_channel/cast_socket.cc b/components/cast_channel/cast_socket.cc index ccfc004..01ff7ed4a1 100644 --- a/components/cast_channel/cast_socket.cc +++ b/components/cast_channel/cast_socket.cc
@@ -46,6 +46,7 @@ #include "net/socket/ssl_client_socket.h" #include "net/socket/stream_socket.h" #include "net/socket/tcp_client_socket.h" +#include "net/socket/transport_client_socket.h" #include "net/ssl/ssl_config_service.h" #include "net/ssl/ssl_info.h" #include "net/traffic_annotation/network_traffic_annotation.h" @@ -152,7 +153,7 @@ return audio_only_; } -std::unique_ptr<net::TCPClientSocket> CastSocketImpl::CreateTcpSocket() { +std::unique_ptr<net::TransportClientSocket> CastSocketImpl::CreateTcpSocket() { net::AddressList addresses(open_params_.ip_endpoint); return std::unique_ptr<net::TCPClientSocket>(new net::TCPClientSocket( addresses, nullptr, open_params_.net_log, net_log_source_));
diff --git a/components/cast_channel/cast_socket.h b/components/cast_channel/cast_socket.h index cfc66be..aad67ad 100644 --- a/components/cast_channel/cast_socket.h +++ b/components/cast_channel/cast_socket.h
@@ -33,7 +33,7 @@ class NetLog; class SSLClientSocket; class StreamSocket; -class TCPClientSocket; +class TransportClientSocket; class TransportSecurityState; class X509Certificate; } @@ -272,8 +272,8 @@ // READY_STATE_CLOSED. void CloseInternal(); - // Creates an instance of TCPClientSocket. - virtual std::unique_ptr<net::TCPClientSocket> CreateTcpSocket(); + // Creates an instance of TransportClientSocket. + virtual std::unique_ptr<net::TransportClientSocket> CreateTcpSocket(); // Creates an instance of SSLClientSocket with the given underlying |socket|. virtual std::unique_ptr<net::SSLClientSocket> CreateSslSocket( std::unique_ptr<net::StreamSocket> socket); @@ -356,7 +356,7 @@ std::unique_ptr<net::CTPolicyEnforcer> ct_policy_enforcer_; // Owned ptr to the underlying TCP socket. - std::unique_ptr<net::TCPClientSocket> tcp_socket_; + std::unique_ptr<net::TransportClientSocket> tcp_socket_; // Owned ptr to the underlying SSL socket. std::unique_ptr<net::SSLClientSocket> socket_;
diff --git a/components/cast_channel/cast_socket_unittest.cc b/components/cast_channel/cast_socket_unittest.cc index 9951586d..e6ac4f7d 100644 --- a/components/cast_channel/cast_socket_unittest.cc +++ b/components/cast_channel/cast_socket_unittest.cc
@@ -36,6 +36,7 @@ #include "net/cert/pem_tokenizer.h" #include "net/log/net_log_source.h" #include "net/log/test_net_log.h" +#include "net/socket/client_socket_handle.h" #include "net/socket/socket_test_util.h" #include "net/socket/ssl_client_socket.h" #include "net/socket/ssl_server_socket.h" @@ -104,64 +105,23 @@ return path; } -class MockTCPSocket : public net::TCPClientSocket { +class MockTCPSocket : public net::MockTCPClientSocket { public: - explicit MockTCPSocket(const net::MockConnect& connect_data) - : TCPClientSocket(net::AddressList(), - nullptr, - nullptr, - net::NetLogSource()), - connect_data_(connect_data), - do_nothing_(false) {} - - explicit MockTCPSocket(bool do_nothing) - : TCPClientSocket(net::AddressList(), - nullptr, - nullptr, - net::NetLogSource()) { - CHECK(do_nothing); + MockTCPSocket(bool do_nothing, net::SocketDataProvider* socket_provider) + : net::MockTCPClientSocket(net::AddressList(), nullptr, socket_provider) { do_nothing_ = do_nothing; } - virtual int Connect(const net::CompletionCallback& callback) { + int Connect(const net::CompletionCallback& callback) override { if (do_nothing_) { // Stall the I/O event loop. return net::ERR_IO_PENDING; } - if (connect_data_.mode == net::ASYNC) { - CHECK_NE(connect_data_.result, net::ERR_IO_PENDING); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(callback, connect_data_.result)); - return net::ERR_IO_PENDING; - } else { - return connect_data_.result; - } - } - - virtual bool SetKeepAlive(bool enable, int delay) { - // Always return true in tests - return true; - } - - virtual bool SetNoDelay(bool no_delay) { - // Always return true in tests - return true; - } - - MOCK_METHOD3(Read, int(net::IOBuffer*, int, const net::CompletionCallback&)); - MOCK_METHOD4(Write, - int(net::IOBuffer*, - int, - const net::CompletionCallback&, - const net::NetworkTrafficAnnotationTag&)); - - virtual void Disconnect() { - // Do nothing in tests + return net::MockTCPClientSocket::Connect(callback); } private: - net::MockConnect connect_data_; bool do_nothing_; DISALLOW_COPY_AND_ASSIGN(MockTCPSocket); @@ -245,8 +205,7 @@ using TestCastSocketBase::TestCastSocketBase; MockTestCastSocket(const CastSocketOpenParams& open_params, Logger* logger) - : TestCastSocketBase(open_params, logger), - mock_net_log_(open_params.net_log) {} + : TestCastSocketBase(open_params, logger) {} ~MockTestCastSocket() override {} @@ -294,24 +253,34 @@ } private: - std::unique_ptr<net::TCPClientSocket> CreateTcpSocket() override { + // Creates a TCP socket. Note that at most one socket created with this method + // may be live at a time. + std::unique_ptr<net::TransportClientSocket> CreateTcpSocket() override { if (tcp_unresponsive_) { - return std::unique_ptr<net::TCPClientSocket>(new MockTCPSocket(true)); + socket_data_provider_ = std::make_unique<net::StaticSocketDataProvider>( + nullptr, 0, nullptr, 0); + return std::unique_ptr<net::TransportClientSocket>( + new MockTCPSocket(true, socket_data_provider_.get())); } else { - return std::unique_ptr<net::TCPClientSocket>( - new MockTCPSocket(*tcp_connect_data_)); + socket_data_provider_ = std::make_unique<net::StaticSocketDataProvider>( + reads_.data(), reads_.size(), writes_.data(), writes_.size()); + socket_data_provider_->set_connect_data(*tcp_connect_data_); + return std::unique_ptr<net::TransportClientSocket>( + new MockTCPSocket(false, socket_data_provider_.get())); } } + // Creates an SSL socket. Note that at most one socket created with this + // method may be live at a time. std::unique_ptr<net::SSLClientSocket> CreateSslSocket( - std::unique_ptr<net::StreamSocket>) override { - ssl_data_.reset(new net::StaticSocketDataProvider( - reads_.data(), reads_.size(), writes_.data(), writes_.size())); - ssl_data_->set_connect_data(*ssl_connect_data_); - - // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !! - return std::unique_ptr<net::SSLClientSocket>(new net::MockTCPClientSocket( - net::AddressList(), mock_net_log_, ssl_data_.get())); + std::unique_ptr<net::StreamSocket> tcp_socket) override { + ssl_socket_data_provider_ = std::make_unique<net::SSLSocketDataProvider>( + ssl_connect_data_->mode, ssl_connect_data_->result); + auto client_handle = std::make_unique<net::ClientSocketHandle>(); + client_handle->SetSocket(std::move(tcp_socket)); + return std::make_unique<net::MockSSLClientSocket>( + std::move(client_handle), net::HostPortPair(), net::SSLConfig(), + ssl_socket_data_provider_.get()); } // Simulated connect data @@ -320,11 +289,11 @@ // Simulated read / write data std::vector<net::MockWrite> writes_; std::vector<net::MockRead> reads_; - std::unique_ptr<net::SocketDataProvider> ssl_data_; + std::unique_ptr<net::SocketDataProvider> socket_data_provider_; + std::unique_ptr<net::SSLSocketDataProvider> ssl_socket_data_provider_; // If true, makes TCP connection process stall. For timeout testing. bool tcp_unresponsive_ = false; MockCastTransport* mock_transport_ = nullptr; - net::NetLog* mock_net_log_ = nullptr; DISALLOW_COPY_AND_ASSIGN(MockTestCastSocket); }; @@ -340,16 +309,17 @@ using TestCastSocketBase::TestCastSocketBase; - void SetTcpSocket(std::unique_ptr<net::TCPClientSocket> tcp_client_socket) { + void SetTcpSocket( + std::unique_ptr<net::TransportClientSocket> tcp_client_socket) { tcp_client_socket_ = std::move(tcp_client_socket); } private: - std::unique_ptr<net::TCPClientSocket> CreateTcpSocket() override { + std::unique_ptr<net::TransportClientSocket> CreateTcpSocket() override { return std::move(tcp_client_socket_); } - std::unique_ptr<net::TCPClientSocket> tcp_client_socket_; + std::unique_ptr<net::TransportClientSocket> tcp_client_socket_; }; class CastSocketTestBase : public testing::Test { @@ -552,7 +522,7 @@ // Underlying TCP sockets for |socket_| to communicate with |server_socket_| // when testing with the real SSL implementation. - std::unique_ptr<net::TCPClientSocket> tcp_client_socket_; + std::unique_ptr<net::TransportClientSocket> tcp_client_socket_; std::unique_ptr<net::TCPServerSocket> tcp_server_socket_; std::unique_ptr<SslTestCastSocket> socket_;
diff --git a/components/download/internal/common/BUILD.gn b/components/download/internal/common/BUILD.gn index 26e8622..bb3a929 100644 --- a/components/download/internal/common/BUILD.gn +++ b/components/download/internal/common/BUILD.gn
@@ -31,6 +31,7 @@ "download_stats.cc", "download_task_runner.cc", "download_ukm_helper.cc", + "download_url_loader_factory_getter.cc", "download_utils.cc", "download_worker.cc", "download_worker.h",
diff --git a/components/download/internal/common/download_task_runner.cc b/components/download/internal/common/download_task_runner.cc index d8b2547..0cc99355e 100644 --- a/components/download/internal/common/download_task_runner.cc +++ b/components/download/internal/common/download_task_runner.cc
@@ -5,6 +5,8 @@ #include "components/download/public/common/download_task_runner.h" #include "base/lazy_instance.h" +#include "base/no_destructor.h" +#include "base/synchronization/lock.h" #include "base/task_scheduler/lazy_task_runner.h" #include "build/build_config.h" @@ -28,6 +30,12 @@ base::LazyInstance<scoped_refptr<base::SingleThreadTaskRunner>>:: DestructorAtExit g_io_task_runner = LAZY_INSTANCE_INITIALIZER; +// Lock to protect |g_io_task_runner| +base::Lock& GetIOTaskRunnerLock() { + static base::NoDestructor<base::Lock> instance; + return *instance; +} + } // namespace scoped_refptr<base::SequencedTaskRunner> GetDownloadTaskRunner() { @@ -36,6 +44,7 @@ void SetIOTaskRunner( const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) { + base::AutoLock auto_lock(GetIOTaskRunnerLock()); static int count = 0; if (task_runner) { DCHECK(!g_io_task_runner.Get() || @@ -51,7 +60,8 @@ g_io_task_runner.Get() = nullptr; } -scoped_refptr<base::SequencedTaskRunner> GetIOTaskRunner() { +scoped_refptr<base::SingleThreadTaskRunner> GetIOTaskRunner() { + base::AutoLock auto_lock(GetIOTaskRunnerLock()); return g_io_task_runner.Get(); }
diff --git a/components/download/internal/common/download_url_loader_factory_getter.cc b/components/download/internal/common/download_url_loader_factory_getter.cc new file mode 100644 index 0000000..4f3b282 --- /dev/null +++ b/components/download/internal/common/download_url_loader_factory_getter.cc
@@ -0,0 +1,23 @@ +// 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. + +#include "components/download/public/common/download_url_loader_factory_getter.h" + +#include "components/download/public/common/download_task_runner.h" + +namespace download { + +DownloadURLLoaderFactoryGetter::DownloadURLLoaderFactoryGetter() = default; + +DownloadURLLoaderFactoryGetter::~DownloadURLLoaderFactoryGetter() = default; + +void DownloadURLLoaderFactoryGetter::DeleteOnCorrectThread() const { + if (GetIOTaskRunner() && !GetIOTaskRunner()->BelongsToCurrentThread()) { + GetIOTaskRunner()->DeleteSoon(FROM_HERE, this); + return; + } + delete this; +} + +} // namespace download
diff --git a/components/download/public/common/BUILD.gn b/components/download/public/common/BUILD.gn index 046a9d0..f11815d 100644 --- a/components/download/public/common/BUILD.gn +++ b/components/download/public/common/BUILD.gn
@@ -44,6 +44,7 @@ "download_stats.h", "download_task_runner.h", "download_ukm_helper.h", + "download_url_loader_factory_getter.h", "download_url_parameters.cc", "download_url_parameters.h", "download_utils.h",
diff --git a/components/download/public/common/download_task_runner.h b/components/download/public/common/download_task_runner.h index b5f75e1..5f58790 100644 --- a/components/download/public/common/download_task_runner.h +++ b/components/download/public/common/download_task_runner.h
@@ -20,7 +20,7 @@ const scoped_refptr<base::SingleThreadTaskRunner>& task_runner); // Returns the task runner used to save files and do other blocking operations. -COMPONENTS_DOWNLOAD_EXPORT scoped_refptr<base::SequencedTaskRunner> +COMPONENTS_DOWNLOAD_EXPORT scoped_refptr<base::SingleThreadTaskRunner> GetIOTaskRunner(); } // namespace download
diff --git a/components/download/public/common/download_url_loader_factory_getter.h b/components/download/public/common/download_url_loader_factory_getter.h new file mode 100644 index 0000000..c9aef99 --- /dev/null +++ b/components/download/public/common/download_url_loader_factory_getter.h
@@ -0,0 +1,57 @@ +// 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_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_URL_LOADER_FACTORY_GETTER_H_ +#define COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_URL_LOADER_FACTORY_GETTER_H_ + +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/sequenced_task_runner_helpers.h" +#include "components/download/public/common/download_export.h" + +namespace network { +class SharedURLLoaderFactory; +} // namespace network + +namespace download { + +struct DownloadURLLoaderFactoryGetterDeleter; + +// Class for retrieving a URLLoaderFactory on IO thread. This class can be +// created on any thread and will be destroyed on the IO thread. +// GetURLLoaderFactory() has to be called on the IO thread. +class COMPONENTS_DOWNLOAD_EXPORT DownloadURLLoaderFactoryGetter + : public base::RefCountedThreadSafe<DownloadURLLoaderFactoryGetter, + DownloadURLLoaderFactoryGetterDeleter> { + public: + DownloadURLLoaderFactoryGetter(); + + // Called on the IO thread to get a URLLoaderFactory. + virtual scoped_refptr<network::SharedURLLoaderFactory> + GetURLLoaderFactory() = 0; + + protected: + virtual ~DownloadURLLoaderFactoryGetter(); + + private: + friend class base::DeleteHelper<DownloadURLLoaderFactoryGetter>; + friend class base::RefCountedThreadSafe< + DownloadURLLoaderFactoryGetter, + DownloadURLLoaderFactoryGetterDeleter>; + friend struct DownloadURLLoaderFactoryGetterDeleter; + + void DeleteOnCorrectThread() const; + + DISALLOW_COPY_AND_ASSIGN(DownloadURLLoaderFactoryGetter); +}; + +struct DownloadURLLoaderFactoryGetterDeleter { + static void Destruct(const DownloadURLLoaderFactoryGetter* factory_getter) { + factory_getter->DeleteOnCorrectThread(); + } +}; + +} // namespace download + +#endif // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_URL_LOADER_FACTORY_GETTER_H_
diff --git a/components/heap_profiling/BUILD.gn b/components/heap_profiling/BUILD.gn new file mode 100644 index 0000000..b6b0f78 --- /dev/null +++ b/components/heap_profiling/BUILD.gn
@@ -0,0 +1,17 @@ +# 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. + +static_library("heap_profiling") { + sources = [ + "client_connection_manager.cc", + "client_connection_manager.h", + ] + + deps = [ + "//base", + "//components/services/heap_profiling/public/cpp", + "//content/public/browser", + "//content/public/common", + ] +}
diff --git a/components/heap_profiling/DEPS b/components/heap_profiling/DEPS new file mode 100644 index 0000000..5a890ff --- /dev/null +++ b/components/heap_profiling/DEPS
@@ -0,0 +1,5 @@ +include_rules = [ + "+components/services/heap_profiling/public", + "+content/public", + "+services/service_manager/public/cpp", +]
diff --git a/components/heap_profiling/client_connection_manager.cc b/components/heap_profiling/client_connection_manager.cc new file mode 100644 index 0000000..75404095 --- /dev/null +++ b/components/heap_profiling/client_connection_manager.cc
@@ -0,0 +1,368 @@ +// 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. + +#include "components/heap_profiling/client_connection_manager.h" + +#include "base/rand_util.h" +#include "components/services/heap_profiling/public/cpp/controller.h" +#include "components/services/heap_profiling/public/cpp/settings.h" +#include "components/services/heap_profiling/public/mojom/heap_profiling_client.mojom.h" +#include "components/services/heap_profiling/public/mojom/heap_profiling_service.mojom.h" +#include "content/public/browser/browser_child_process_host.h" +#include "content/public/browser/browser_child_process_host_iterator.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/notification_service.h" +#include "content/public/browser/notification_types.h" +#include "content/public/browser/render_process_host.h" +#include "content/public/common/bind_interface_helpers.h" +#include "content/public/common/child_process_host.h" +#include "content/public/common/process_type.h" +#include "content/public/common/service_names.mojom.h" +#include "services/service_manager/public/cpp/connector.h" + +namespace heap_profiling { + +namespace { + +// This helper class cleans up initialization boilerplate for the callers who +// need to create ProfilingClients bound to various different things. +class ProfilingClientBinder { + public: + // Binds to a non-renderer-child-process' ProfilingClient. + explicit ProfilingClientBinder(content::BrowserChildProcessHost* host) + : ProfilingClientBinder() { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); + content::BindInterface(host->GetHost(), std::move(request_)); + } + + // Binds to a renderer's ProfilingClient. + explicit ProfilingClientBinder(content::RenderProcessHost* host) + : ProfilingClientBinder() { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + content::BindInterface(host, std::move(request_)); + } + + // Binds to the local connector to get the browser process' ProfilingClient. + explicit ProfilingClientBinder(service_manager::Connector* connector) + : ProfilingClientBinder() { + connector->BindInterface(content::mojom::kBrowserServiceName, + std::move(request_)); + } + + mojom::ProfilingClientPtr take() { return std::move(memlog_client_); } + + private: + ProfilingClientBinder() + : memlog_client_(), request_(mojo::MakeRequest(&memlog_client_)) {} + + mojom::ProfilingClientPtr memlog_client_; + mojom::ProfilingClientRequest request_; +}; + +bool ShouldProfileNonRendererProcessType(Mode mode, int process_type) { + switch (mode) { + case Mode::kAll: + return true; + + case Mode::kAllRenderers: + // Renderer logic is handled in ClientConnectionManager::Observe. + return false; + + case Mode::kManual: + return false; + + case Mode::kMinimal: + return (process_type == content::ProcessType::PROCESS_TYPE_GPU || + process_type == content::ProcessType::PROCESS_TYPE_BROWSER); + + case Mode::kGpu: + return process_type == content::ProcessType::PROCESS_TYPE_GPU; + + case Mode::kBrowser: + return process_type == content::ProcessType::PROCESS_TYPE_BROWSER; + + case Mode::kRendererSampling: + // Renderer logic is handled in ClientConnectionManager::Observe. + return false; + + case Mode::kNone: + return false; + + case Mode::kCount: + // Fall through to hit NOTREACHED() below. + {} + } + + NOTREACHED(); + return false; +} + +void StartProfilingNonRendererChildOnIOThread( + base::WeakPtr<Controller> controller, + const content::ChildProcessData& data, + base::ProcessId pid) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); + + if (!controller) + return; + + content::BrowserChildProcessHost* host = + content::BrowserChildProcessHost::FromID(data.id); + if (!host) + return; + + mojom::ProcessType process_type = + (data.process_type == content::ProcessType::PROCESS_TYPE_GPU) + ? mojom::ProcessType::GPU + : mojom::ProcessType::OTHER; + + // Tell the child process to start profiling. + ProfilingClientBinder client(host); + controller->StartProfilingClient(client.take(), pid, process_type); +} + +void StartProfilingClientOnIOThread(base::WeakPtr<Controller> controller, + ProfilingClientBinder client, + base::ProcessId pid, + mojom::ProcessType process_type) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); + + if (!controller) + return; + + controller->StartProfilingClient(client.take(), pid, process_type); +} + +void StartProfilingBrowserProcessOnIOThread( + base::WeakPtr<Controller> controller) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); + + if (!controller) + return; + + ProfilingClientBinder client(controller->GetConnector()); + StartProfilingClientOnIOThread(controller, std::move(client), + base::GetCurrentProcId(), + mojom::ProcessType::BROWSER); +} + +void StartProfilingPidOnIOThread(base::WeakPtr<Controller> controller, + base::ProcessId pid) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); + + if (!controller) + return; + + // Check if the request is for the current process. + if (pid == base::GetCurrentProcId()) { + ProfilingClientBinder client(controller->GetConnector()); + StartProfilingClientOnIOThread(controller, std::move(client), pid, + mojom::ProcessType::BROWSER); + return; + } + + // Check if the request is for a non-renderer child process. + for (content::BrowserChildProcessHostIterator browser_child_iter; + !browser_child_iter.Done(); ++browser_child_iter) { + const content::ChildProcessData& data = browser_child_iter.GetData(); + if (base::GetProcId(data.handle) == pid) { + StartProfilingNonRendererChildOnIOThread(controller, data, pid); + return; + } + } + + DLOG(WARNING) + << "Attempt to start profiling failed as no process was found with pid: " + << pid; +} + +void StartProfilingNonRenderersIfNecessaryOnIOThread( + Mode mode, + base::WeakPtr<Controller> controller) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); + + if (!controller) + return; + + for (content::BrowserChildProcessHostIterator browser_child_iter; + !browser_child_iter.Done(); ++browser_child_iter) { + const content::ChildProcessData& data = browser_child_iter.GetData(); + if (ShouldProfileNonRendererProcessType(mode, data.process_type) && + data.handle != base::kNullProcessHandle) { + StartProfilingNonRendererChildOnIOThread(controller, data, + base::GetProcId(data.handle)); + } + } +} + +} // namespace + +ClientConnectionManager::ClientConnectionManager( + base::WeakPtr<Controller> controller, + Mode mode) + : controller_(controller), mode_(mode) {} + +ClientConnectionManager::~ClientConnectionManager() { + Remove(this); +} + +void ClientConnectionManager::Start() { + Add(this); + registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED, + content::NotificationService::AllBrowserContextsAndSources()); + registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, + content::NotificationService::AllBrowserContextsAndSources()); + registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, + content::NotificationService::AllBrowserContextsAndSources()); + + StartProfilingExistingProcessesIfNecessary(); +} + +Mode ClientConnectionManager::GetMode() { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + return mode_; +} + +void ClientConnectionManager::StartProfilingProcess(base::ProcessId pid) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + + mode_ = Mode::kManual; + + // The RenderProcessHost iterator must be used on the UI thread. + for (auto iter = content::RenderProcessHost::AllHostsIterator(); + !iter.IsAtEnd(); iter.Advance()) { + if (pid == base::GetProcId(iter.GetCurrentValue()->GetHandle())) { + StartProfilingRenderer(iter.GetCurrentValue()); + return; + } + } + + // The BrowserChildProcessHostIterator iterator must be used on the IO thread. + content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::IO) + ->PostTask(FROM_HERE, base::BindOnce(&StartProfilingPidOnIOThread, + controller_, pid)); +} + +bool ClientConnectionManager::AllowedToProfileRenderer( + content::RenderProcessHost* host) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + return true; +} + +void ClientConnectionManager::SetModeForTesting(Mode mode) { + mode_ = mode; +} + +void ClientConnectionManager::StartProfilingExistingProcessesIfNecessary() { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + + // Start profiling the current process. + if (ShouldProfileNonRendererProcessType( + mode_, content::ProcessType::PROCESS_TYPE_BROWSER)) { + content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::IO) + ->PostTask(FROM_HERE, + base::BindOnce(&StartProfilingBrowserProcessOnIOThread, + controller_)); + } + + // Start profiling connected renderers. + for (auto iter = content::RenderProcessHost::AllHostsIterator(); + !iter.IsAtEnd(); iter.Advance()) { + if (ShouldProfileNewRenderer(iter.GetCurrentValue()) && + iter.GetCurrentValue()->GetHandle() != base::kNullProcessHandle) { + StartProfilingRenderer(iter.GetCurrentValue()); + } + } + + content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::IO) + ->PostTask( + FROM_HERE, + base::BindOnce(&StartProfilingNonRenderersIfNecessaryOnIOThread, + GetMode(), controller_)); +} + +void ClientConnectionManager::BrowserChildProcessLaunchedAndConnected( + const content::ChildProcessData& data) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + + // Ensure this is only called for all non-renderer browser child processes + // so as not to collide with logic in ClientConnectionManager::Observe(). + DCHECK_NE(data.process_type, content::ProcessType::PROCESS_TYPE_RENDERER); + + if (!ShouldProfileNonRendererProcessType(mode_, data.process_type)) + return; + + StartProfilingNonRendererChild(data); +} + +void ClientConnectionManager::StartProfilingNonRendererChild( + const content::ChildProcessData& data) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::IO) + ->PostTask( + FROM_HERE, + base::BindOnce(&StartProfilingNonRendererChildOnIOThread, controller_, + data, base::GetProcId(data.handle))); +} + +void ClientConnectionManager::Observe( + int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + content::RenderProcessHost* host = + content::Source<content::RenderProcessHost>(source).ptr(); + + // NOTIFICATION_RENDERER_PROCESS_CLOSED corresponds to death of an underlying + // RenderProcess. NOTIFICATION_RENDERER_PROCESS_TERMINATED corresponds to when + // the RenderProcessHost's lifetime is ending. Ideally, we'd only listen to + // the former, but if the RenderProcessHost is destroyed before the + // RenderProcess, then the former is never sent. + if ((type == content::NOTIFICATION_RENDERER_PROCESS_TERMINATED || + type == content::NOTIFICATION_RENDERER_PROCESS_CLOSED)) { + profiled_renderers_.erase(host); + } + + if (type == content::NOTIFICATION_RENDERER_PROCESS_CREATED && + ShouldProfileNewRenderer(host)) { + StartProfilingRenderer(host); + } +} + +bool ClientConnectionManager::ShouldProfileNewRenderer( + content::RenderProcessHost* renderer) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + + // Allow subclasses to not profile renderers. + if (!AllowedToProfileRenderer(renderer)) + return false; + + Mode mode = GetMode(); + if (mode == Mode::kAll || mode == Mode::kAllRenderers) { + return true; + } else if (mode == Mode::kRendererSampling && profiled_renderers_.empty()) { + // Sample renderers with a 1/3 probability. + return (base::RandUint64() % 100000) < 33333; + } + + return false; +} + +void ClientConnectionManager::StartProfilingRenderer( + content::RenderProcessHost* host) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + + profiled_renderers_.insert(host); + + // Tell the child process to start profiling. + ProfilingClientBinder client(host); + + content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::IO) + ->PostTask(FROM_HERE, base::BindOnce(&StartProfilingClientOnIOThread, + controller_, std::move(client), + base::GetProcId(host->GetHandle()), + mojom::ProcessType::RENDERER)); +} + +} // namespace heap_profiling
diff --git a/components/heap_profiling/client_connection_manager.h b/components/heap_profiling/client_connection_manager.h new file mode 100644 index 0000000..b7af2c9a --- /dev/null +++ b/components/heap_profiling/client_connection_manager.h
@@ -0,0 +1,125 @@ +// 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_HEAP_PROFILING_CLIENT_CONNECTION_MANAGER_H_ +#define COMPONENTS_HEAP_PROFILING_CLIENT_CONNECTION_MANAGER_H_ + +#include <unordered_set> + +#include "base/gtest_prod_util.h" +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "content/public/browser/browser_child_process_observer.h" +#include "content/public/browser/child_process_data.h" +#include "content/public/browser/notification_observer.h" +#include "content/public/browser/notification_registrar.h" + +namespace content { +class RenderProcessHost; +} // namespace content + +namespace heap_profiling { + +class Controller; +enum class Mode; + +// This class is responsible for connecting HeapProfilingClients to the +// HeapProfilingService. +// * It registers itself as a content::NotificationObserver to listen for the +// creation of the renderer processes. +// * It registers itself as a content::BrowserChildProcessObserver to listen +// for the creation of non-renderer processes. +// When a new process is created, it checks the current |Mode| to see whether +// the process should be profiled. If so, it grabs the HeapProfilingClient from +// the newly created process and connects it to the HeapProfilingService. +// +// This class is intended to be used from the browser/privileged process of the +// embedder. +// +// This class must be constructed/accessed/destroyed from the UI thread. +// +// This class can be subclassed for exactly one reason: to allow embedders to +// override AllowedToProfileRenderer in order to prevent incognito renderers +// from being profiled. +class ClientConnectionManager : public content::BrowserChildProcessObserver, + content::NotificationObserver { + public: + // The owner of this instance must guarantee that |controller_| outlives this + // class. + // |controller| must be bound to the IO thread. + ClientConnectionManager(base::WeakPtr<Controller> controller, Mode mode); + ~ClientConnectionManager() override; + + // Start must be called immediately after the constructor. The only reason + // that this is not a part of the constructor is to allow tests to skip this + // step. + void Start(); + + Mode GetMode(); + + // In additional to profiling |pid|, this will change the Mode to kManual. + // From here on out, the caller must manually specify processes to be + // profiled. + void StartProfilingProcess(base::ProcessId pid); + + virtual bool AllowedToProfileRenderer(content::RenderProcessHost* host); + + private: + FRIEND_TEST_ALL_PREFIXES(ChromeClientConnectionManager, + ShouldProfileNewRenderer); + + // Exists for testing only. + void SetModeForTesting(Mode mode); + + // New processes will be profiled as they are created. Existing processes msut + // be manually checked upon creation. + void StartProfilingExistingProcessesIfNecessary(); + + // BrowserChildProcessObserver + // Observe connection of non-renderer child processes. + void BrowserChildProcessLaunchedAndConnected( + const content::ChildProcessData& data) override; + + void StartProfilingNonRendererChild(const content::ChildProcessData& data); + + // NotificationObserver + // Observe connection of renderer child processes. + void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) override; + + bool ShouldProfileNewRenderer(content::RenderProcessHost* renderer); + + void StartProfilingRenderer(content::RenderProcessHost* renderer); + + // The owner of this instance must guarantee that |controller_| outlives this + // class. + // |controller_| must be bound to the IO thread. + base::WeakPtr<Controller> controller_; + + Mode mode_; + content::NotificationRegistrar registrar_; + + // This is used to identify the currently profiled renderers. Elements should + // only be accessed on the UI thread and their values should be considered + // opaque. + // + // Semantically, the elements must be something that identifies which + // specific RenderProcess is being profiled. When the underlying RenderProcess + // goes away, the element must be removed. The RenderProcessHost + // pointer and the NOTIFICATION_RENDERER_PROCESS_CREATED notification can be + // used to provide these semantics. + // + // This variable represents renderers that have been instructed to start + // profiling - it does not reflect whether a renderer is currently still being + // profiled. That information is only known by the profiling service, and for + // simplicity, it's easier to just track this variable in this process. + std::unordered_set<void*> profiled_renderers_; + + DISALLOW_COPY_AND_ASSIGN(ClientConnectionManager); +}; + +} // namespace heap_profiling + +#endif // COMPONENTS_HEAP_PROFILING_CLIENT_CONNECTION_MANAGER_H_
diff --git a/components/password_manager/content/common/credential_manager_mojom_traits.cc b/components/password_manager/content/common/credential_manager_mojom_traits.cc index 85db1cc..4d073b7 100644 --- a/components/password_manager/content/common/credential_manager_mojom_traits.cc +++ b/components/password_manager/content/common/credential_manager_mojom_traits.cc
@@ -92,6 +92,7 @@ case password_manager::mojom::CredentialManagerError::INVALID_DOMAIN: case password_manager::mojom::CredentialManagerError::INVALID_STATE: case password_manager::mojom::CredentialManagerError::NOT_IMPLEMENTED: + case password_manager::mojom::CredentialManagerError::NOT_FOCUSED: case password_manager::mojom::CredentialManagerError::UNKNOWN: *output = password_manager::CredentialManagerError::UNKNOWN; return true;
diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc index f4c693d2..8a8e1df 100644 --- a/components/password_manager/core/browser/login_database.cc +++ b/components/password_manager/core/browser/login_database.cc
@@ -788,22 +788,31 @@ LogNumberOfAccountsForScheme("Https", https_logins); LogNumberOfAccountsForScheme("Other", other_logins); - sql::Statement form_based_passwords_statement( - db_.GetUniqueStatement("SELECT signon_realm, password_value FROM logins " - "WHERE blacklisted_by_user = 0 AND scheme = 0")); + sql::Statement saved_passwords_statement( + db_.GetUniqueStatement("SELECT signon_realm, password_value, scheme " + "FROM logins WHERE blacklisted_by_user = 0")); std::map<base::string16, std::vector<std::string>> passwords_to_realms; - while (form_based_passwords_statement.Step()) { - std::string signon_realm = form_based_passwords_statement.ColumnString(0); + size_t failed_encryption = 0; + while (saved_passwords_statement.Step()) { base::string16 decrypted_password; // Note that CryptProtectData() is non-deterministic, so passwords must be // decrypted before checking equality. - if (!IsValidAndroidFacetURI(signon_realm) && - DecryptedString(form_based_passwords_statement.ColumnString(1), + if (DecryptedString(saved_passwords_statement.ColumnString(1), &decrypted_password) == ENCRYPTION_RESULT_SUCCESS) { - passwords_to_realms[decrypted_password].push_back(signon_realm); + std::string signon_realm = saved_passwords_statement.ColumnString(0); + if (saved_passwords_statement.ColumnInt(2) == 0 && + !decrypted_password.empty() && + !IsValidAndroidFacetURI(signon_realm)) { + passwords_to_realms[decrypted_password].push_back( + std::move(signon_realm)); + } + } else { + ++failed_encryption; } } + UMA_HISTOGRAM_COUNTS_100("PasswordManager.InaccessiblePasswords", + failed_encryption); for (const auto& password_to_realms : passwords_to_realms) LogPasswordReuseMetrics(password_to_realms.second);
diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc index e1c4d5b..a35f786d 100644 --- a/components/password_manager/core/browser/login_database_unittest.cc +++ b/components/password_manager/core/browser/login_database_unittest.cc
@@ -1517,6 +1517,8 @@ "PasswordManager.EmptyUsernames.WithoutCorrespondingNonempty", 1, 1); + histogram_tester.ExpectUniqueSample("PasswordManager.InaccessiblePasswords", + 0, 1); } TEST_F(LoginDatabaseTest, PasswordReuseMetrics) {
diff --git a/components/policy/core/common/cloud/cloud_policy_validator.cc b/components/policy/core/common/cloud/cloud_policy_validator.cc index e7adbb3..23b2226 100644 --- a/components/policy/core/common/cloud/cloud_policy_validator.cc +++ b/components/policy/core/common/cloud/cloud_policy_validator.cc
@@ -128,7 +128,6 @@ validation_flags_ |= VALIDATE_PAYLOAD; } - void CloudPolicyValidatorBase::ValidateCachedKey( const std::string& cached_key, const std::string& cached_key_signature, @@ -181,11 +180,9 @@ CloudPolicyValidatorBase::CloudPolicyValidatorBase( std::unique_ptr<em::PolicyFetchResponse> policy_response, - google::protobuf::MessageLite* payload, scoped_refptr<base::SequencedTaskRunner> background_task_runner) : status_(VALIDATION_OK), policy_(std::move(policy_response)), - payload_(payload), validation_flags_(0), timestamp_not_before_(0), timestamp_option_(TIMESTAMP_VALIDATED), @@ -236,6 +233,18 @@ RunChecks(); } +CloudPolicyValidatorBase::Status CloudPolicyValidatorBase::CheckProtoPayload( + google::protobuf::MessageLite* payload) { + DCHECK(payload); + if (!policy_data_ || !policy_data_->has_policy_value() || + !payload->ParseFromString(policy_data_->policy_value()) || + !payload->IsInitialized()) { + LOG(ERROR) << "Failed to decode policy payload protobuf"; + return VALIDATION_POLICY_PARSE_ERROR; + } + return VALIDATION_OK; +} + void CloudPolicyValidatorBase::RunChecks() { status_ = VALIDATION_OK; if ((policy_->has_error_code() && policy_->error_code() != 200) || @@ -259,19 +268,19 @@ // error, s.t. the most severe check will determine the validation status. static const struct { int flag; - Status (CloudPolicyValidatorBase::* checkFunction)(); + Status (CloudPolicyValidatorBase::*checkFunction)(); } kCheckFunctions[] = { - { VALIDATE_SIGNATURE, &CloudPolicyValidatorBase::CheckSignature }, - { VALIDATE_INITIAL_KEY, &CloudPolicyValidatorBase::CheckInitialKey }, - { VALIDATE_CACHED_KEY, &CloudPolicyValidatorBase::CheckCachedKey }, - { VALIDATE_POLICY_TYPE, &CloudPolicyValidatorBase::CheckPolicyType }, - { VALIDATE_ENTITY_ID, &CloudPolicyValidatorBase::CheckEntityId }, - { VALIDATE_DM_TOKEN, &CloudPolicyValidatorBase::CheckDMToken }, - { VALIDATE_DEVICE_ID, &CloudPolicyValidatorBase::CheckDeviceId }, - { VALIDATE_USER, &CloudPolicyValidatorBase::CheckUser }, - { VALIDATE_DOMAIN, &CloudPolicyValidatorBase::CheckDomain }, - { VALIDATE_TIMESTAMP, &CloudPolicyValidatorBase::CheckTimestamp }, - { VALIDATE_PAYLOAD, &CloudPolicyValidatorBase::CheckPayload }, + {VALIDATE_SIGNATURE, &CloudPolicyValidatorBase::CheckSignature}, + {VALIDATE_INITIAL_KEY, &CloudPolicyValidatorBase::CheckInitialKey}, + {VALIDATE_CACHED_KEY, &CloudPolicyValidatorBase::CheckCachedKey}, + {VALIDATE_POLICY_TYPE, &CloudPolicyValidatorBase::CheckPolicyType}, + {VALIDATE_ENTITY_ID, &CloudPolicyValidatorBase::CheckEntityId}, + {VALIDATE_DM_TOKEN, &CloudPolicyValidatorBase::CheckDMToken}, + {VALIDATE_DEVICE_ID, &CloudPolicyValidatorBase::CheckDeviceId}, + {VALIDATE_USER, &CloudPolicyValidatorBase::CheckUser}, + {VALIDATE_DOMAIN, &CloudPolicyValidatorBase::CheckDomain}, + {VALIDATE_TIMESTAMP, &CloudPolicyValidatorBase::CheckTimestamp}, + {VALIDATE_PAYLOAD, &CloudPolicyValidatorBase::CheckPayload}, }; for (size_t i = 0; i < arraysize(kCheckFunctions); ++i) { @@ -296,8 +305,7 @@ } if (!CheckVerificationKeySignature( - policy_->new_public_key(), - verification_key_, + policy_->new_public_key(), verification_key_, policy_->new_public_key_verification_signature_deprecated())) { LOG(ERROR) << "Signature verification failed"; UMA_HISTOGRAM_ENUMERATION(kMetricPolicyKeyVerification, @@ -324,8 +332,8 @@ // If no owning_domain_ supplied, try extracting the domain from the policy // itself (this happens on certain platforms during startup, when we validate // cached policy before prefs are loaded). - std::string domain = owning_domain_.empty() ? - ExtractDomainFromPolicy() : owning_domain_; + std::string domain = + owning_domain_.empty() ? ExtractDomainFromPolicy() : owning_domain_; if (domain.empty()) { LOG(ERROR) << "Policy does not contain a domain"; return false; @@ -344,8 +352,7 @@ std::string domain; if (policy_data_->has_username()) { domain = gaia::ExtractDomainName( - gaia::CanonicalizeEmail( - gaia::SanitizeEmail(policy_data_->username()))); + gaia::CanonicalizeEmail(gaia::SanitizeEmail(policy_data_->username()))); } return domain; } @@ -385,8 +392,7 @@ } CloudPolicyValidatorBase::Status CloudPolicyValidatorBase::CheckInitialKey() { - if (!policy_->has_new_public_key() || - !policy_->has_policy_data_signature() || + if (!policy_->has_new_public_key() || !policy_->has_policy_data_signature() || !VerifySignature(policy_->policy_data(), policy_->new_public_key(), policy_->policy_data_signature(), SHA1)) { LOG(ERROR) << "Initial policy signature validation failed"; @@ -413,7 +419,7 @@ CloudPolicyValidatorBase::Status CloudPolicyValidatorBase::CheckPolicyType() { if (!policy_data_->has_policy_type() || - policy_data_->policy_type() != policy_type_) { + policy_data_->policy_type() != policy_type_) { LOG(ERROR) << "Wrong policy type " << policy_data_->policy_type(); return VALIDATION_WRONG_POLICY_TYPE; } @@ -468,8 +474,7 @@ CloudPolicyValidatorBase::Status CloudPolicyValidatorBase::CheckDeviceId() { if (device_id_option_ == DEVICE_ID_REQUIRED && - (!policy_data_->has_device_id() || - policy_data_->device_id().empty())) { + (!policy_data_->has_device_id() || policy_data_->device_id().empty())) { LOG(ERROR) << "Empty device id encountered - expected: " << device_id_; return VALIDATION_BAD_DEVICE_ID; } @@ -545,17 +550,6 @@ return VALIDATION_OK; } -CloudPolicyValidatorBase::Status CloudPolicyValidatorBase::CheckPayload() { - if (!policy_data_->has_policy_value() || - !payload_->ParseFromString(policy_data_->policy_value()) || - !payload_->IsInitialized()) { - LOG(ERROR) << "Failed to decode policy payload protobuf"; - return VALIDATION_POLICY_PARSE_ERROR; - } - - return VALIDATION_OK; -} - // static bool CloudPolicyValidatorBase::VerifySignature(const std::string& data, const std::string& key,
diff --git a/components/policy/core/common/cloud/cloud_policy_validator.h b/components/policy/core/common/cloud/cloud_policy_validator.h index 09e28dd6..ff141c78 100644 --- a/components/policy/core/common/cloud/cloud_policy_validator.h +++ b/components/policy/core/common/cloud/cloud_policy_validator.h
@@ -36,12 +36,12 @@ namespace protobuf { class MessageLite; } -} +} // namespace google namespace enterprise_management { class PolicyData; class PolicyFetchResponse; -} +} // namespace enterprise_management namespace policy { @@ -225,13 +225,10 @@ void RunValidation(); protected: - // Create a new validator that checks |policy_response|. |payload| is the - // message that the policy payload will be parsed to, and it needs to stay - // valid for the lifetime of the validator. + // Create a new validator that checks |policy_response|. CloudPolicyValidatorBase( std::unique_ptr<enterprise_management::PolicyFetchResponse> policy_response, - google::protobuf::MessageLite* payload, scoped_refptr<base::SequencedTaskRunner> background_task_runner); // Posts an asynchronous call to PerformValidation of the passed |validator|, @@ -240,26 +237,28 @@ std::unique_ptr<CloudPolicyValidatorBase> validator, const base::Closure& completion_callback); + // Helper to check MessageLite-type payloads. It exists so the implementation + // can be moved to the .cc (PolicyValidators with protobuf payloads are + // templated). + Status CheckProtoPayload(google::protobuf::MessageLite* payload); + private: // Internal flags indicating what to check. enum ValidationFlags { - VALIDATE_TIMESTAMP = 1 << 0, - VALIDATE_USER = 1 << 1, - VALIDATE_DOMAIN = 1 << 2, - VALIDATE_DM_TOKEN = 1 << 3, + VALIDATE_TIMESTAMP = 1 << 0, + VALIDATE_USER = 1 << 1, + VALIDATE_DOMAIN = 1 << 2, + VALIDATE_DM_TOKEN = 1 << 3, VALIDATE_POLICY_TYPE = 1 << 4, - VALIDATE_ENTITY_ID = 1 << 5, - VALIDATE_PAYLOAD = 1 << 6, - VALIDATE_SIGNATURE = 1 << 7, + VALIDATE_ENTITY_ID = 1 << 5, + VALIDATE_PAYLOAD = 1 << 6, + VALIDATE_SIGNATURE = 1 << 7, VALIDATE_INITIAL_KEY = 1 << 8, - VALIDATE_CACHED_KEY = 1 << 9, - VALIDATE_DEVICE_ID = 1 << 10, + VALIDATE_CACHED_KEY = 1 << 9, + VALIDATE_DEVICE_ID = 1 << 10, }; - enum SignatureType { - SHA1, - SHA256 - }; + enum SignatureType { SHA1, SHA256 }; // Performs validation, called on a background thread. static void PerformValidation( @@ -301,11 +300,13 @@ Status CheckDeviceId(); Status CheckPolicyType(); Status CheckEntityId(); - Status CheckPayload(); Status CheckSignature(); Status CheckInitialKey(); Status CheckCachedKey(); + // Payload type depends on the validator, checking is part of derived classes. + virtual Status CheckPayload() = 0; + // Verifies the SHA1/ or SHA256/RSA |signature| on |data| against |key|. // |signature_type| specifies the type of signature (SHA1 or SHA256). static bool VerifySignature(const std::string& data, @@ -316,7 +317,6 @@ Status status_; std::unique_ptr<enterprise_management::PolicyFetchResponse> policy_; std::unique_ptr<enterprise_management::PolicyData> policy_data_; - google::protobuf::MessageLite* payload_; int validation_flags_; int64_t timestamp_not_before_; @@ -343,24 +343,21 @@ // A simple type-parameterized extension of CloudPolicyValidator that // facilitates working with the actual protobuf payload type. -template<typename PayloadProto> -class POLICY_EXPORT CloudPolicyValidator : public CloudPolicyValidatorBase { +template <typename PayloadProto> +class POLICY_EXPORT CloudPolicyValidator final + : public CloudPolicyValidatorBase { public: using CompletionCallback = base::Callback<void(CloudPolicyValidator*)>; - virtual ~CloudPolicyValidator() {} - // Creates a new validator. // |background_task_runner| is optional; if RunValidation() is used directly // and StartValidation() is not used then it can be nullptr. - static std::unique_ptr<CloudPolicyValidator> Create( + CloudPolicyValidator( std::unique_ptr<enterprise_management::PolicyFetchResponse> policy_response, - scoped_refptr<base::SequencedTaskRunner> background_task_runner) { - return base::WrapUnique<CloudPolicyValidator>(new CloudPolicyValidator( - std::move(policy_response), std::make_unique<PayloadProto>(), - background_task_runner)); - } + scoped_refptr<base::SequencedTaskRunner> background_task_runner) + : CloudPolicyValidatorBase(std::move(policy_response), + background_task_runner) {} std::unique_ptr<PayloadProto>& payload() { return payload_; } @@ -375,17 +372,10 @@ } private: - CloudPolicyValidator( - std::unique_ptr<enterprise_management::PolicyFetchResponse> - policy_response, - std::unique_ptr<PayloadProto> payload, - scoped_refptr<base::SequencedTaskRunner> background_task_runner) - : CloudPolicyValidatorBase(std::move(policy_response), - payload.get(), - background_task_runner), - payload_(std::move(payload)) {} + // CloudPolicyValidatorBase: + Status CheckPayload() override { return CheckProtoPayload(payload_.get()); } - std::unique_ptr<PayloadProto> payload_; + std::unique_ptr<PayloadProto> payload_ = std::make_unique<PayloadProto>(); DISALLOW_COPY_AND_ASSIGN(CloudPolicyValidator); };
diff --git a/components/policy/core/common/cloud/cloud_policy_validator_unittest.cc b/components/policy/core/common/cloud/cloud_policy_validator_unittest.cc index 32b430f..bbfe04e 100644 --- a/components/policy/core/common/cloud/cloud_policy_validator_unittest.cc +++ b/components/policy/core/common/cloud/cloud_policy_validator_unittest.cc
@@ -70,8 +70,8 @@ CreateValidator(std::move(policy_response)); // Run validation and check the result. - EXPECT_CALL(*this, ValidationCompletion(validator.get())).WillOnce( - check_action); + EXPECT_CALL(*this, ValidationCompletion(validator.get())) + .WillOnce(check_action); UserCloudPolicyValidator::StartValidation( std::move(validator), base::Bind(&CloudPolicyValidatorTest::ValidationCompletion, @@ -85,9 +85,8 @@ std::string public_key = PolicyBuilder::GetPublicTestKeyAsString(); EXPECT_FALSE(public_key.empty()); - std::unique_ptr<UserCloudPolicyValidator> validator = - UserCloudPolicyValidator::Create(std::move(policy_response), - base::ThreadTaskRunnerHandle::Get()); + auto validator = std::make_unique<UserCloudPolicyValidator>( + std::move(policy_response), base::ThreadTaskRunnerHandle::Get()); validator->ValidateTimestamp(timestamp_, timestamp_option_); if (validate_by_gaia_id_) { validator->ValidateUser( @@ -101,8 +100,7 @@ validator->ValidateDeviceId(existing_device_id_, device_id_option_); validator->ValidatePolicyType(dm_protocol::kChromeUserPolicyType); validator->ValidatePayload(); - validator->ValidateCachedKey(public_key, - cached_key_signature_, + validator->ValidateCachedKey(public_key, cached_key_signature_, owning_domain_); if (allow_key_rotation_) { validator->ValidateSignatureAllowingRotation(public_key, owning_domain_); @@ -113,7 +111,6 @@ return validator; } - void CheckSuccessfulValidation(UserCloudPolicyValidator* validator) { EXPECT_TRUE(validator->success()); EXPECT_EQ(policy_.policy().SerializeAsString(), @@ -378,9 +375,10 @@ policy_.Build(); policy_.policy().set_new_public_key_verification_signature_deprecated( "invalid"); - ValidatePolicy(CheckStatus( - CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE), - policy_.GetCopy()); + ValidatePolicy( + CheckStatus( + CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE), + policy_.GetCopy()); } TEST_F(CloudPolicyValidatorTest, ErrorDomainMismatchForKeyVerification) { @@ -388,9 +386,10 @@ // Generate a non-matching owning_domain, which should cause a validation // failure. owning_domain_ = "invalid.com"; - ValidatePolicy(CheckStatus( - CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE), - policy_.GetCopy()); + ValidatePolicy( + CheckStatus( + CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE), + policy_.GetCopy()); } TEST_F(CloudPolicyValidatorTest, ErrorDomainExtractedFromUsernameMismatch) { @@ -401,9 +400,10 @@ // Pass an empty domain to tell validator to extract the domain from the // policy's |username| field. owning_domain_ = ""; - ValidatePolicy(CheckStatus( - CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE), - policy_.GetCopy()); + ValidatePolicy( + CheckStatus( + CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE), + policy_.GetCopy()); } TEST_F(CloudPolicyValidatorTest, ErrorNoCachedKeySignature) {
diff --git a/components/policy/core/common/cloud/component_cloud_policy_store.cc b/components/policy/core/common/cloud/component_cloud_policy_store.cc index 4375e6f..3c0e818 100644 --- a/components/policy/core/common/cloud/component_cloud_policy_store.cc +++ b/components/policy/core/common/cloud/component_cloud_policy_store.cc
@@ -261,8 +261,7 @@ bool purged_current_policies = false; for (PolicyBundle::const_iterator it = policy_bundle_.begin(); it != policy_bundle_.end(); ++it) { - if (it->first.domain == domain && - filter.Run(it->first.component_id) && + if (it->first.domain == domain && filter.Run(it->first.component_id) && !policy_bundle_.Get(it->first).empty()) { policy_bundle_.Get(it->first).Clear(); purged_current_policies = true; @@ -334,9 +333,8 @@ if (stored_policy_times_iter != stored_policy_times_.end()) time_not_before = stored_policy_times_iter->second; - std::unique_ptr<ComponentCloudPolicyValidator> validator( - ComponentCloudPolicyValidator::Create( - std::move(proto), scoped_refptr<base::SequencedTaskRunner>())); + auto validator = std::make_unique<ComponentCloudPolicyValidator>( + std::move(proto), scoped_refptr<base::SequencedTaskRunner>()); validator->ValidateTimestamp(time_not_before, CloudPolicyValidatorBase::TIMESTAMP_VALIDATED); validator->ValidateUser(account_id_); @@ -388,10 +386,9 @@ return true; } -bool ComponentCloudPolicyStore::ValidateData( - const std::string& data, - const std::string& secure_hash, - PolicyMap* policy) { +bool ComponentCloudPolicyStore::ValidateData(const std::string& data, + const std::string& secure_hash, + PolicyMap* policy) { if (crypto::SHA256HashString(data) != secure_hash) { LOG(ERROR) << "The received data doesn't match the expected hash."; return false;
diff --git a/components/policy/core/common/cloud/machine_level_user_cloud_policy_store.cc b/components/policy/core/common/cloud/machine_level_user_cloud_policy_store.cc index 211bef2..f4a4e71 100644 --- a/components/policy/core/common/cloud/machine_level_user_cloud_policy_store.cc +++ b/components/policy/core/common/cloud/machine_level_user_cloud_policy_store.cc
@@ -71,9 +71,8 @@ MachineLevelUserCloudPolicyStore::CreateValidator( std::unique_ptr<enterprise_management::PolicyFetchResponse> policy, CloudPolicyValidatorBase::ValidateTimestampOption option) { - std::unique_ptr<UserCloudPolicyValidator> validator = - UserCloudPolicyValidator::Create(std::move(policy), - background_task_runner()); + auto validator = std::make_unique<UserCloudPolicyValidator>( + std::move(policy), background_task_runner()); validator->ValidatePolicyType( dm_protocol::kChromeMachineLevelUserCloudPolicyType); validator->ValidateDMToken(machine_dm_token_,
diff --git a/components/policy/core/common/cloud/user_cloud_policy_store_base.cc b/components/policy/core/common/cloud/user_cloud_policy_store_base.cc index ae8d338..b3dc838 100644 --- a/components/policy/core/common/cloud/user_cloud_policy_store_base.cc +++ b/components/policy/core/common/cloud/user_cloud_policy_store_base.cc
@@ -27,21 +27,18 @@ : background_task_runner_(background_task_runner), policy_scope_(policy_scope) {} -UserCloudPolicyStoreBase::~UserCloudPolicyStoreBase() { -} +UserCloudPolicyStoreBase::~UserCloudPolicyStoreBase() {} std::unique_ptr<UserCloudPolicyValidator> UserCloudPolicyStoreBase::CreateValidator( std::unique_ptr<enterprise_management::PolicyFetchResponse> policy, CloudPolicyValidatorBase::ValidateTimestampOption timestamp_option) { // Configure the validator. - std::unique_ptr<UserCloudPolicyValidator> validator = - UserCloudPolicyValidator::Create(std::move(policy), - background_task_runner_); + auto validator = std::make_unique<UserCloudPolicyValidator>( + std::move(policy), background_task_runner_); validator->ValidatePolicyType(dm_protocol::kChromeUserPolicyType); validator->ValidateAgainstCurrentPolicy( - policy_.get(), - timestamp_option, + policy_.get(), timestamp_option, CloudPolicyValidatorBase::DM_TOKEN_REQUIRED, CloudPolicyValidatorBase::DEVICE_ID_REQUIRED); validator->ValidatePayload();
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb index e1b2b1e..0605e51 100644 --- a/components/policy/resources/policy_templates_am.xtb +++ b/components/policy/resources/policy_templates_am.xtb
@@ -58,13 +58,6 @@ ይህ መመሪያ ስራ ላይ ከዋለ በዚህ መመሪያ ውስጥ ከተጠቀሱት መታወቂያዎች በስተቀር ሁሉም አታሚዎች ለተጠቃሚው ይቀርባሉ። </translation> -<translation id="1181881366217399113"> - ማስታወሻ፦ ይህ መመሪያ የሙከራ ሲሆን ተግባራትን ሊያበላሽ ይችላል! - መመሪያው ከነቃ በኮማ በተለየ ዝርዝር ውስጥ ያለው እያንዳንዱ የተሰየመ ምንጭ የራሱን ሂደት ያሂዳል። ይህ እንዲሁም በንዑስ ጎራዎች የተሰየሙ ምንጮችንም ያገልላል፤ ለምሳሌ፣ https://example.com/ ን መግለጽ እንዲሁም https://foo.example.com/ እንደ የ https://example.com/ ጣቢያው አካል እንዲገለል ያደርገዋል። - መመሪያው ከተሰናከለ የየጣቢያው ማግለል ሂደት አስተዳደር ምክንያት ተፈጻሚ ይሆናል። - መመሪያው ካልተዋቀረ ተጠቃሚው ይህን ቅንብር መቀየር ይችላል። - <ph name="PRODUCT_OS_NAME" /> ላይ እንዲሁም የ<ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> መሣሪያ መመሪያው ወደ ተመሳሳዩ እሴት እንዲቀናበር ይመከራል። በሁለቱ መመሪያዎች የተገለጹ እሴቶች የማይዛመዱ ከሆኑ በተጠቃሚ መመሪያ የተገለጸው እሴት እየተተገበረ ሳለ ወደ የተጠቃሚ ክፍለ-ጊዜ መግባት ላይ መዘግየት ሊኖር ይችላል። - </translation> <translation id="1198465924256827162">የመሣሪያ ሁኔታ ሰቀላዎች የሚላኩት በምን ያህል ድግግሞሽ እንደሆነ፣ በሚሊሰከንዶች። ይህ መመሪያ እንዳልተዋቀረ ከተተወ ነባሪ ድግግሞሹ በ3 ሰዓቶች ነው። ዝቅተኛው @@ -685,13 +678,6 @@ የመመሪያ ዋጋው በሚሊሰከንዶች ነው መገለጽ ያለበት። ዋጋዎች ከማያ ገጽ መጥፋት መዘግየት (ከተዋቀረ) እና ስራ ፈትቶ መዘግየት ያነሱ ወይም እኩል ነው የሚሆኑት።</translation> <translation id="2987155890997901449">ARCን ያንቁ</translation> <translation id="2987227569419001736">የድር ብሉቱዝ ኤፒአይን አጠቃቀም ይቆጣጠሩ</translation> -<translation id="2998886474614739865"> - ማስታወሻ፦ ይህ መመሪያ የሙከራ ሲሆን ተግባራትን ሊሰብር ይችላል! - ይህ መመሪያ በመግቢያ ገጹ ላይ ይተገበራል። እንዲሁም እባክዎ በተጠቃሚው ክፍለ-ጊዜው ላይ የሚተገበረውን የ<ph name="ISOLATE_ORIGINS_POLICY_NAME" /> መመሪያውን ይመልከቱ። ሁለቱንም መመሪያዎች ወደ ተመሳሳይ እሴት እንዲቀናበሩ ይመከራል። እሴቶቹ የማይዛመዱ ከሆኑ በተጠቃሚ መመሪያ የተጠቀሰው እሴት ተፈጻሚ በሚሆንበት ጊዜ ሲገባ መዘግየት ሊያጋጥም ይችላል። - መመሪያው ከነቃ በኮማ በተለየ ዝርዝር ውስጥ ያለው እያንዳንዱ የተሰየመ ምንጭ የራሱን ሂደት ያሂዳል። ይህ እንዲሁም በንዑስ ጎራዎች የተሰየሙ ምንጮችን ያገላል፤ ለምሳሌ፦ https://example.com/ ን መግለጽ እንዲሁም https://foo.example.com/ እንደ https://example.com/ ጣቢያ አንድ አካል እንዲገለል ያደርገዋል። - ይህ መመሪያ ከተሰናከለ የየጣቢያው ማግለያ ሂደት አስተዳደር ሥነ አመክንዮ ተፈጻሚ ይሆናል። - መመሪያው ካልተዋቀረ የመሣሪያው ስርዓት ነባሪ የጣቢያ ማግለያ ቅንብሮች በመለያ ለሚገባበት ማያ ገጽ ስራ ላይ ይውላል። - </translation> <translation id="3016255526521614822">በ<ph name="PRODUCT_OS_NAME" /> ማያ ገጽ ቁልፍ ላይ የተፈቀዱ ማስታወሻ የሚወስዱ መተግበሪያዎች በተፈቀደላቸው ዝርዝር ውስጥ ያስገቡ</translation> <translation id="3021562480854470924">የሚፈቀድ የወሳኝ ሁነቶች ቅልበሳ ብዛት</translation> <translation id="3030000825273123558">ሜትሪክስ ሪፖርት ማድረግን ያንቁ</translation> @@ -798,14 +784,6 @@ ይህ መመሪያ ባዶ ወዳልሆነ ሕብረቁምፊ ከተዋቀረ ይህ ሕብረቁምፊ እንደ የ<ph name="PRODUCT_NAME" /> መድረሻ ስም ሆኖ ጥቅም ላይ ይውላል። አለበለዚያ የመድረሻ ስሙ የመሣሪያው ስም ይሆናል። ይህ መመሪያ ካልተዋቀረ የመድረሻ ስሙ የመሣሪያው ስም ይሆንና የመሣሪያው ባለቤት (ወይም መሣሪያውን ከሚያስተዳድር ጎራ የመጣ ተጠቃሚ) እንዲቀይረው ይፈቀድለታል። ስሙ በ24 ቁምፊዎች የተገደበ ነው።</translation> <translation id="3381968327636295719">አስተናጋጅ አሳሹን በነበሪነት ይጠቀሙ</translation> -<translation id="3386001018488754001"> - ማስታወሻ፦ ይህ መመሪያ የሙከራ ሲሆን ተግባራትን ሊሰብር ይችላል! - ይህ መመሪያ በመግቢያ ገጹ ላይ ይተገበራል። እንዲሁም እባክዎ በተጠቃሚው ክፍለ-ጊዜው ላይ የሚተገበረውን የ<ph name="SITE_PER_PROCESS_POLICY_NAME" /> መመሪያውን ይመልከቱ። ሁለቱንም መመሪያዎች ወደ ተመሳሳይ እሴት እንዲቀናበሩ ይመከራል። እሴቶቹ የማይዛመዱ ከሆኑ በተጠቃሚ መመሪያ የተጠቀሰው እሴት ተፈጻሚ በሚሆንበት ጊዜ ሲገባ መዘግየት ሊያጋጥም ይችላል። - ከሁለቱም ዓለም፣ ማግለል እና ለተጠቃሚዎች የተገደበ ተጽዕኖ፣ ምርጡን ለማግኘት IsolateOriginsን ለማግለል ከሚፈልጓቸው የጣቢያዎች ዝርዝር ጋር በመጠቀም የIsolateOrigins መመሪያ ቅንብሩን ማየቱ ሳይሻልዎ አይቀርም። ይህ ቅንብር SitePerProcess ሁሉንም ጣቢያዎች ያገልላል። - መመሪያው ከነቃ እያንዳንዱ ጣቢያ የራሱን ሂደት ያሂዳል። - ይህ መመሪያ ከተሰናከለ የየጣቢያው ማግለያ ሂደት አስተዳደር ሥነ አመክንዮ ተፈጻሚ ይሆናል። - መመሪያው ካልተዋቀረ ተጠቃሚው ይህን ቅንብር መቀየር ይችላል። - </translation> <translation id="3395348522300156660">ተጠቃሚው ሊጠቀምባቸው የሚችላቸው አታሚዎችን ይገልጻል። ይህ መመሪያ ስራ ላይ የሚውለው <ph name="PRINTERS_WHITELIST" /> ለ<ph name="DEVICE_PRINTERS_ACCESS_MODE" /> ከተመረጠ ብቻ ነው @@ -1429,14 +1407,6 @@ መመሪያው ካልተዋቀረ ወይም ወደ ባዶ ሕብረቁምፊ ወይም ልክ ያልሆነ የወደብ ክልል ከተዋቀረ WebRTC ማንኛውም የሚገኝ የዩዲፒ ወደብ እንዲጠቀም ይፈቀድለታል።</translation> <translation id="5290940294294002042">ተጠቃሚው ሊያነቃ ወይም ሊያሰናክል የሚችላቸውን የተሰኪዎች ዝርዝር ይግለጹ</translation> -<translation id="5301787427319106606"> - ማስታወሻ፦ ይህ መመሪያ የሙከራ ሲሆን ተግባራትን ሊሰብር ይችላል! - ከሁለቱም ዓለም፣ ማግለል እና ለተጠቃሚዎች የተገደበ ተጽዕኖ፣ ምርጡን ለማግኘት IsolateOriginsን ለማግለል ከሚፈልጓቸው የጣቢያዎች ዝርዝር ጋር በመጠቀም የIsolateOrigins መመሪያ ቅንብሩን ማየቱ ሳይሻልዎ አይቀርም። ይህ ቅንብር SitePerProcess ሁሉንም ጣቢያዎች ያገልላል። - መመሪያው ከነቃ እያንዳንዱ ጣቢያ የራሱን ሂደት ያሂዳል። - ይህ መመሪያ ከተሰናከለ የየጣቢያው ማግለያ ሂደት አስተዳደር ሥነ አመክንዮ ተፈጻሚ ይሆናል። - መመሪያው ካልተዋቀረ ተጠቃሚው ይህን ቅንብር መቀየር ይችላል። - በ<ph name="PRODUCT_OS_NAME" /> ላይ እንዲሁም የ<ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> መሣሪያን መመሪያ ወደ ተመሳሳይ እሴት እንዲቀናበር ይመከራል። እሴቶቹ የማይዛመዱ ከሆኑ በተጠቃሚ መመሪያ የተጠቀሰው እሴት ተፈጻሚ በሚሆንበት ጊዜ ሲገባ መዘግየት ሊያጋጥም ይችላል። - </translation> <translation id="5302612588919538756">ይህ መመሪያ ተቋርጧል፣ በምትኩ SyncDisabled መጠቀሙን ያስቡበት። ተጠቃሚው ወደ <ph name="PRODUCT_NAME" /> እንዲገባ ያስችለዋል።
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb index 22fd496..0f01f0d 100644 --- a/components/policy/resources/policy_templates_ar.xtb +++ b/components/policy/resources/policy_templates_ar.xtb
@@ -56,17 +56,6 @@ في حال استخدام هذه السياسة، يتم تقديم جميع الطابعات للمستخدم باستثناء أرقام التعريف المُدرجة في هذه السياسة. </translation> -<translation id="1181881366217399113"> - ملاحظة: هذه السياسة تجريبية وقد تؤدي إلى تعطيل الوظائف. - في حال تفعيلها، سيتم تشغيل كل من الأصول المسماة في - القائمة المفصولة بفاصلة على حدة. وسيعزل ذلك أيضًا - الأصول المسماة بحسب النطاقات الفرعية، على سبيل المثال: يؤدي تحديد الموقع https://example.com/ - إلى عزل الموقع https://foo.example.com/ باعتباره جزءاً من موقع - https://example.com/. - وفي حال إيقاف السياسة، سيسري مفعول نظام إدارة عملية العزل لكل موقع. - وفي حال عدم إعداد هذه السياسة، سيتمكن المستخدم من تغيير هذا الإعداد. - ويُنصح أيضًا بتعيين سياسة الجهاز <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> إلى القيمة نفسها في منتج <ph name="PRODUCT_OS_NAME" />، وقد يؤدي عدم تطابق القيم المُحدَّدة للسياستين إلى تأخير عند الدخول إلى جلسة مستخدم أثناء تطبيق القيمة المُحدَّدة في سياسة المستخدم. - </translation> <translation id="1198465924256827162">معدل تكرار إرسال تحميلات حالة الجهاز بالمللي ثانية. إذا لم يتم تعيين هذه السياسة، فستستغرق فترة التكرار الافتراضي 3 ساعات. وسيصبح الحد الأدنى @@ -660,17 +649,6 @@ يجب تحديد قيمة السياسة بالمللي ثانية. يجب أن تكون القيم أقل من أو مساوية لمهلة إيقاف تشغيل الشاشة (في حالة تعيينها) ومهلة وضع الخمول.</translation> <translation id="2987155890997901449">تمكين ARC</translation> <translation id="2987227569419001736">التحكم في استخدام واجهة برمجة تطبيقات بلوتوث الويب</translation> -<translation id="2998886474614739865"> - ملاحظة: هذه السياسة تجريبية وقد تؤدي إلى تعطيل الوظائف، - وهي تنطبق على شاشة تسجيل الدخول. يُرجى الاطّلاع أيضًا على سياسة <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> التي تنطبق على جلسة المستخدم. ويُوصى بتعيين كلتا السياستين على القيمة نفسها، إذ يمكن أن يؤدّي عدم تطابق القيم إلى تأخير عند الدخول إلى جلسة مستخدم أثناء تطبيق القيمة المُحدّدة في سياسة المستخدم. - وفي حال تفعيل هذه السياسة، سيتم تشغيل كل من الأصول المسماة الواردة في - قائمة مفصولة بفاصلة على حدة. وسيعزل ذلك أيضًا - الأصول المسماة بحسب النطاقات الفرعية؛ على سبيل المثال: سيؤدي تحديد موقع https://example.com/ - إلى عزل الموقع https://foo.example.com/ باعتباره جزءاً من موقع - https://example.com/. - وفي حال إيقاف السياسة، سيسري نظام إدارة عملية العزل لكل موقع على حدة. - وفي حال عدم ضبط السياسة، سيتم استخدام إعدادات عزل الموقع التلقائية لشاشة تسجيل الدخول. - </translation> <translation id="3016255526521614822">تطبيقات تدوين الملاحظات المضافة إلى القائمة البيضاء والمسموح بها في شاشة تأمين <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">يتم السماح بعدد مرات العودة إلى النقاط الهامة</translation> <translation id="3030000825273123558">تمكين إعداد تقرير للمقاييس</translation> @@ -773,17 +751,6 @@ إذا تم تعيين هذه السياسة على سلسلة غير فارغة، سيتم استخدام تلك السلسلة كاسم وجهة <ph name="PRODUCT_NAME" /> وإلا سيكون اسم الوجهة هو اسم الجهاز. وإذا لم يتم تعيين هذه السياسة، سيكون اسم الوجهة هو اسم الجهاز وسيُسمَح لمالك الجهاز (أو مستخدم من النطاق الذي يدير الجهاز) بتغييره. ويكون الحد الأقصى لعدد حروف الاسم 24 حرفًا.</translation> <translation id="3381968327636295719">استخدام المتصفح المضيف افتراضيًا</translation> -<translation id="3386001018488754001"> - ملاحظة: هذه السياسة تجريبية وقد تؤدي إلى تعطيل الوظائف، - وهي تنطبق على شاشة تسجيل الدخول. يُرجى الاطّلاع أيضًا على سياسة <ph name="SITE_PER_PROCESS_POLICY_NAME" /> التي تنطبق على جلسة المستخدم. ويُوصى بتعيين كلتا السياستين على القيمة نفسها، إذ يمكن أن يؤدّي عدم تطابق القيم إلى تأخير عند الدخول إلى جلسة مستخدم أثناء تطبيق القيمة المُحدّدة في سياسة المستخدم. - ويمكنك الاطّلاع على إعدادات سياسة IsolateOrigins لضمان الحصول على - أفضل النتائج من هاتين السياستين، أي العزل والتأثير المحدود على المستخدمين باعتماد سياسة - IsolateOrigins مع قائمة بالمواقع التي ترغب في عزلها. ويعمل إعداد - SitePerProcess هذا على عزل جميع المواقع. - ففي حال تفعيل هذه السياسة، سيتم تشغيل كل موقع على حدة. - وفي حال إيقاف السياسة، سيسري نظام إدارة عملية العزل لكل موقع على حدة. - وفي حال عدم ضبط السياسة، سيتمكّن المستخدم من تغيير هذا الإعداد متى شاء. - </translation> <translation id="3395348522300156660">تُحدد الطابعات التي يمكن للمستخدم استعمالها. لا يتم استخدام هذه السياسة إلا إذا تم اختيار <ph name="PRINTERS_WHITELIST" /> لـ <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1367,17 +1334,6 @@ في حالة عدم تعيين السياسة، أو في حالة تعيينها على سلسلة فارغة أو نطاق منفذ غير صالح، يتم السماح لـ WebRTC باستخدام أي منفذ UDP محلي متاح.</translation> <translation id="5290940294294002042">تحديد قائمة من المكونات الإضافية التي يمكن للمستخدم تمكينها أو تعطيلها</translation> -<translation id="5301787427319106606"> - ملاحظة: هذه السياسة تجريبية وقد تؤدي إلى تعطيل الوظائف، - ويمكن الاطّلاع على إعدادات سياسة IsolateOrigins لضمان الحصول على - أفضل النتائج من هاتين السياستين، أي العزل والتأثير المحدود على المستخدمين باعتماد سياسة - IsolateOrigins مع قائمة بالمواقع التي ترغب في عزلها. ويعمل إعداد - SitePerProcess هذا على عزل جميع المواقع. - ففي حال تفعيل السياسة، سيتم تشغيل كل موقع على حدة. - وفي حال إيقاف السياسة، سيسري نظام إدارة عملية العزل لكل موقع على حدة. - وفي حال عدم ضبط السياسة، سيتمكّن المستخدم من تغيير هذا الإعداد متى شاء. - ويُوصى أيضًا بتعيين سياسة الجهاز <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> إلى القيمة نفسها في منتج <ph name="PRODUCT_OS_NAME" />، إذ يمكن أن يؤدّي عدم تطابق القيم إلى تأخير عند الدخول إلى جلسة مستخدم أثناء تطبيق القيمة المُحدّدة في سياسة المستخدم. - </translation> <translation id="5302612588919538756">عند إيقاف هذه السياسة، يُنصح باستخدام SyncDisabled بدلاً منها. تسمح للمستخدم بتسجيل الدخول إلى <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb index 53f148e..b33a426 100644 --- a/components/policy/resources/policy_templates_bg.xtb +++ b/components/policy/resources/policy_templates_bg.xtb
@@ -54,17 +54,6 @@ Когато то се използва, потребителят има достъп до всички принтери освен тези, чиито идентификатори са посочени в правилото. </translation> -<translation id="1181881366217399113"> - ЗАБЕЛЕЖКА: Това правило е експериментално и може да причини проблеми във функционалността! -Ако правилото е активирано, всеки сайт от наименованите източници в -списък, разделен със запетаи, ще се изпълнява в собствен процес. Това също така ще изолира -източниците по поддомейни, напр. посочването на https://example.com/ -ще доведе до изолирането и на https://foo.example.com/, тъй като е част от -сайта https://example.com/. -Ако правилото е деактивирано, ще действа логиката за управление на процеси за изолирането на отделни сайтове. -В случай че правилото не е конфигурирано, потребителят ще може да променя тази настройка. -Под <ph name="PRODUCT_OS_NAME" /> е препоръчително да се зададе същата стойност и за правилото за устройства <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />. Ако стойностите на двете правила не са идентични, прилагането на тази от правилото за потребители може да доведе до забавяне при влизане в потребителска сесия. - </translation> <translation id="1198465924256827162">Честота на качване на данни за състоянието на устройството (в милисекунди). Ако това правило не е зададено, стандартната честота е 3 часа. Минималната @@ -661,17 +650,6 @@ Съответната стойност трябва да се посочи в милисекунди. Тя се променя така, че да е по-малка или равна на забавянето преди изключване на екрана (ако е зададено) и на това при неактивност.</translation> <translation id="2987155890997901449">Активиране на ARC</translation> <translation id="2987227569419001736">Контролиране на използването на приложния програмен интерфейс (API) Web Bluetooth</translation> -<translation id="2998886474614739865"> - ЗАБЕЛЕЖКА: Това правило е експериментално и може да причини проблеми във функционалността! -Това правило се отнася за екрана за вход. Моля, вижте и правилото <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, което се прилага на ниво потребителска сесия. Препоръчително е да зададете една и съща стойност и за двете правила. В противен случай прилагането на стойността от правилото за потребители може да доведе до забавяне при влизане в потребителска сесия. -Ако правилото е активирано, всеки сайт от наименованите източници в -списък, разделен със запетаи, ще се изпълнява в собствен процес. Това също така ще изолира -източниците по поддомейни, напр. посочването на https://example.com/ -ще доведе до изолирането и на https://foo.example.com/, тъй като е част от -сайта https://example.com/. -Ако правилото е деактивирано, ще действа логиката за управление на процеси за изолирането на отделни сайтове. -В случай че правилото не е конфигурирано, за екрана за вход ще се използват стандартните за платформата настройки за изолиране на сайтовете. - </translation> <translation id="3016255526521614822">Бял списък с приложения, които да могат да се използват за водене на бележки на заключения екран на <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Брой следващи версии, за които да е разрешено възстановяването</translation> <translation id="3030000825273123558">Активиране на съобщаването на показателите</translation> @@ -772,17 +750,6 @@ При задаване на непразен низ за правилото той ще служи като име на местоназначението за <ph name="PRODUCT_NAME" />. В противен случай ще се използва името на устройството. То ще се ползва и когато правилото не е зададено, но тогава собственикът на устройството (или потребител от домейна, управляващ устройството) ще може да го променя. Името е ограничено до 24 знака.</translation> <translation id="3381968327636295719">Използване по подразбиране на браузъра хост</translation> -<translation id="3386001018488754001"> - ЗАБЕЛЕЖКА: Това правило е експериментално и може да причини проблеми във функционалността! -Това правило се отнася за екрана за вход. Моля, вижте и правилото <ph name="SITE_PER_PROCESS_POLICY_NAME" />, което се прилага на ниво потребителска сесия. Препоръчително е да зададете една и съща стойност и за двете правила. В противен случай прилагането на стойността от правилото за потребители може да доведе до забавяне при влизане в потребителска сесия. -Бихте могли да разгледате настройката IsolateOrigins, за да получите -най-доброто съчетание между изолиране и ограничено въздействие върху потребителите. За целта -трябва да използвате IsolateOrigins със списък със сайтове, които искате да изолирате. Настоящата настройка -SitePerProcess изолира всички сайтове. -Ако правилото е активирано, всеки сайт ще се изпълнява в собствен процес. -В случай че правилото е деактивирано, ще действа логиката за управление на процеси за изолирането на отделни сайтове. -Ако правилото не е конфигурирано, потребителят ще може да променя тази настройка. - </translation> <translation id="3395348522300156660">Посочва кои принтери могат да се използват от потребителя. Това правило е в сила само ако сте избрали <ph name="PRINTERS_WHITELIST" /> за <ph name="DEVICE_PRINTERS_ACCESS_MODE" />. @@ -1373,17 +1340,6 @@ Ако правилото не е зададено или е зададено като празен низ или невалиден диапазон от портове, на WebRTC е разрешено да използва всеки наличен локален UDP порт.</translation> <translation id="5290940294294002042">Посочване на списък с приставки, които потребителят може да активира или деактивира</translation> -<translation id="5301787427319106606"> - ЗАБЕЛЕЖКА: Това правило е експериментално и може да причини проблеми във функционалността! -Бихте могли да разгледате настройката IsolateOrigins, за да получите -най-доброто съчетание между изолиране и ограничено въздействие върху потребителите. За целта -трябва да използвате IsolateOrigins със списък със сайтове, които искате да изолирате. Настоящата настройка -SitePerProcess изолира всички сайтове. -Ако правилото е активирано, всеки сайт ще се изпълнява в собствен процес. -В случай че правилото е деактивирано, ще действа логиката за управление на процеси за изолирането на отделни сайтове. -Ако правилото не е конфигурирано, потребителят ще може да променя тази настройка. -Под <ph name="PRODUCT_OS_NAME" /> е препоръчително да се зададе същата стойност и за правилото за устройства <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Ако стойностите на двете правила не са идентични, прилагането на тази от правилото за потребители може да доведе до забавяне при влизане в потребителска сесия. - </translation> <translation id="5302612588919538756">Това правило е оттеглено. Обмислете възможността да използвате SyncDisabled вместо него. Разрешава на потребителите да влизат в <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb index 00ab19d..a98abe4d 100644 --- a/components/policy/resources/policy_templates_bn.xtb +++ b/components/policy/resources/policy_templates_bn.xtb
@@ -58,18 +58,6 @@ যদি এই নীতিটি ব্যবহার করা হয় তাহলে ব্যবহারকারী এতে তালিকাভুক্ত আইডির প্রিন্টার ছাড়া অন্য সমস্ত প্রিন্টার ব্যবহার করতে পারবেন। </translation> -<translation id="1181881366217399113"> - দ্রষ্টব্য: এই নীতিটি পরীক্ষামূলক এবং এটির কারণে স্বাভাবিক ক্রিয়াকলাপ ব্যাহত হতে পারে! - নীতিটি চালু করা হলে কমা দিয়ে বিভক্ত তালিকার প্রতিটি উল্লিখিত উৎস নিজস্ব - প্রসেসের মধ্যে কাজ করবে। এর ফলে সাবডোমেন দিয়ে উল্লেখ করা উৎসগুলিও - আইসোলেট করা হবে; উদাহরণ, https://example.com/ উল্লেখ করা হলে - https://example.com/ সাইটের অংশ হিসেবে https://foo.example.com/ - ও আইসোলেট করা হবে। - নীতিটি বন্ধ করা হলে সাইট আইসোলেশন ব্যবহার করার আগে যে লজিকে প্রসেস পরিচালনা - করা হত সেটিই চালু থাকবে। - এই নীতিটি কনফিগার করা না হলে ব্যবহারকারী পরে এটির সেটিং পরিবর্তন করতে পারবেন। -<ph name="PRODUCT_OS_NAME" />-এ, <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> ডিভাইস নীতিকেও একই মানে সেট করার পরামর্শ দেওয়া হয়। দুটি নীতি দ্বারা নির্দিষ্ট মান যদি মেলে না, ব্যবহারকারীর সেশনে প্রবেশ করার সময় ব্যবহারকারী পলিসি দ্বারা নির্দিষ্ট মানটি প্রয়োগ করার কারণে একটু বিলম্ব হতে পারে। - </translation> <translation id="1194005076170619046">যদি সক্ষম করা থাকে, তাহলে যখন একটি সেশন সক্রিয় থাকে এবং স্ক্রিন লক করা নেই তখন সিস্টেম ট্রেতে একটি বড় লাল লগ-আউট বোতাম দেখানো হয়। যদি অক্ষম করা থাকে অথবা নির্দিষ্ট করা না থাকে, তাহলে সিস্টেম ট্রেতে কোন বড় লাল লগ-আউট বোতাম দেখানো হয় না।</translation> @@ -756,16 +744,6 @@ যখন নীতি সেট না করা থাকে, আরও-নির্দিষ্ট নীতিগুলির কার্যকলাপ অপ্রভাবিত থাকে।</translation> <translation id="2987155890997901449">ARC সক্ষম করে</translation> <translation id="2987227569419001736">ওয়েব ব্লুটুথ API এর ব্যবহার নিয়ন্ত্রণ করে</translation> -<translation id="2998886474614739865"> - দ্রষ্টব্য: এই নীতিটি পরীক্ষামূলক এবং এটির কারণে স্বাভাবিক ক্রিয়াকলাপ ব্যাহত হতে পারে! - সাইন-ইন স্ক্রিনেও এই নীতিটি প্রযোজ্য হয়। অনুগ্রহ করে <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> নীতিও দেখুন, যেটি ব্যবহারকারীর সেশনের উপর প্রযোজ্য হয়। উভয় নীতির মান সমানভাবে সেট করার পরামর্শ দেওয়া হয়। যদি মানগুলি না মেলে তাহলে ব্যবহারকারীর সেশনে প্রবেশ করার সময় ব্যবহারকারী পলিসি দ্বারা নির্দিষ্ট মানটি প্রয়োগ করার কারণে একটু বিলম্ব হতে পারে। - নীতিটি চালু করা হলে কমা দিয়ে বিভক্ত তালিকার - প্রতিটি উল্লিখিত উৎস নিজস্ব প্রসেসের মধ্যে কাজ করবে। এর ফলে সাবডোমেন দিয়ে - উল্লেখ করা উৎসগুলিও আইসোলেট করা হবে; উদাহরণ, https://example.com/ উল্লেখ করা হলে - https://example.com/ সাইটের অংশ হিসেবে https://foo.example.com/ ও আইসোলেট করা হবে। - নীতিটি বন্ধ করা হলে সাইট আইসোলেশন ব্যবহার করার আগে যে লজিকে প্রসেস পরিচালনা করা হত সেটিই চালু থাকবে। - নীতিটি কনফিগার না করা হলে, সাইন-ইন স্ক্রিনের জন্য প্ল্যাটফর্মের ডিফল্ট সাইট আইসোলেশন সেটিংস ব্যবহার করা হবে। - </translation> <translation id="3016255526521614822"><ph name="PRODUCT_OS_NAME" /> এর লক স্ক্রিনে নোট লেখার যে অ্যাপগুলি ব্যবহার করা যায়, সেগুলিকে পরিচ্ছন্ন তালিকাতে রাখুন</translation> <translation id="3021562480854470924">মাইলস্টোনে কতবার ফিরে যাওয়া যাবে তার সংখ্যা</translation> <translation id="3030000825273123558">ছন্দোবিজ্ঞান প্রতিবেদন সক্ষম করুন</translation> @@ -879,16 +857,6 @@ যদি নীতিটি খালি নয় এমন স্ট্রিং এ সেট করা থাকে, তবে সেই স্ট্রিং <ph name="PRODUCT_NAME" /> এর গন্তব্য হিসেবে ব্যবহার করা হবে। অন্যথায়, ডিভাইসের নামটিই গন্তব্যের নাম হবে। যদি এই নীতিটি সেট করা না থাকে তাহলে ডিভাইসের নামটিই গন্তব্যের নাম হবে, এবং ডিভাইসের মালিক (অথবা ডিভাইসটি যে ডোমেন থেকে পরিচালনা করা হয় তার কোনও ব্যবহারকারী) এটি পরিবর্তন করতে পারবেন। নামটি ২৪ অক্ষরের মধ্যে হতে হবে।</translation> <translation id="3381968327636295719">ডিফল্ট অনুসারে হোস্ট ব্রাউজারটি ব্যবহার করুন</translation> -<translation id="3386001018488754001"> - দ্রষ্টব্য: এই নীতিটি পরীক্ষামূলক এবং এটির কারণে স্বাভাবিক ক্রিয়াকলাপ ব্যাহত হতে পারে! - সাইন-ইন স্ক্রিনেও এই নীতিটি প্রযোজ্য হয়। অনুগ্রহ করে <ph name="SITE_PER_PROCESS_POLICY_NAME" /> নীতিও দেখুন, যেটি ব্যবহারকারীর সেশনের উপর প্রযোজ্য হয়। উভয় নীতির মান সমানভাবে সেট করার পরামর্শ দেওয়া হয়। যদি মানগুলি না মেলে তাহলে ব্যবহারকারীর সেশনে প্রবেশ করার সময় ব্যবহারকারী পলিসি দ্বারা নির্দিষ্ট মানটি প্রয়োগ করার কারণে একটু বিলম্ব হতে পারে। - আইসোলেশন চালু রাখা এবং ব্যবহারকারীদের উপরে সম্ভাব্য নেতিবাচক প্রভাব সীমিত রাখা, - দুধরনেরই সুবিধা পাওয়ার জন্য আপনি IsolateOrigins নীতির সেটিংসটি দেখে নিন যাতে IsolateOrigins ব্যবহার করে আপনার বেছে নেওয়া - সাইটগুলি অন্যান্য সাইটের থেকে বিচ্ছিন্ন করতে পারেন। SitePerProcess সেটিংসের মাধ্যমে সমস্ত সাইট আইসোলেট করা যায়। - নীতিটি চালু করা হলে প্রতিটি সাইট তার নিজস্ব প্রসেসের মধ্যে কাজ করবে। - এটি বন্ধ করা হলে সাইট আইসোলেশন ব্যবহার করার আগে যে লজিকে প্রসেস পরিচালনা করা হত, সেটিই চালু থাকবে। - নীতিটি কনফিগার করা না হলে ব্যবহারকারী পরে এই সেটিংসটি পরিবর্তন করতে পারবেন। - </translation> <translation id="3395348522300156660">এমন প্রিন্টারের বিষয়ে উল্লেখ করে যেটি ব্যবহারকারী ব্যবহার করতে পারবেন। এই নীতিটি শুধুমাত্র তবেই ব্যবহার করা হয় যদি <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> এর জন্য <ph name="PRINTERS_WHITELIST" /> বেছে নেওয়া থাকে @@ -1632,16 +1600,6 @@ নীতিটি সেট করা না থাকলে, বা এটি খালি স্ট্রিং বা কোনো অবৈধ পোর্ট ব্যাপ্তিতে সেট করা হলে, WebRTC কে যেকোনো উপলব্ধ স্থানীয় UDP পোর্ট ব্যবহার করার অনুমতি দেওয়া হয়।</translation> <translation id="5290940294294002042">ব্যবহারকারী সক্ষম বা অক্ষম করতে পারে এমন প্লাগইনগুলির একটি তালিকা নির্দিষ্ট করে</translation> -<translation id="5301787427319106606"> - দ্রষ্টব্য: এই নীতিটি পরীক্ষামূলক এবং এটির কারণে স্বাভাবিক ক্রিয়াকলাপ ব্যাহত হতে পারে! - আইসোলেশন চালু রাখা এবং ব্যবহারকারীদের উপরে সম্ভাব্য নেতিবাচক প্রভাব সীমিত রাখা, - দুধরনেরই সুবিধা পাওয়ার জন্য আপনি IsolateOrigins নীতির সেটিংসটি দেখে নিন যাতে IsolateOrigins ব্যবহার করে আপনার বেছে নেওয়া সাইটগুলি - অন্যান্য সাইটের থেকে বিচ্ছিন্ন করতে পারেন। SitePerProcess সেটিংসের মাধ্যমে সমস্ত সাইট আইসোলেট করা যায়। - নীতিটি চালু করা হলে প্রতিটি সাইট তার নিজস্ব প্রসেসের মধ্যে কাজ করবে। - এটি বন্ধ করা হলে সাইট আইসোলেশন ব্যবহার করার আগে যে লজিকে প্রসেস পরিচালনা করা হত, সেটিই চালু থাকবে - নীতিটি কনফিগার করা না হলে ব্যবহারকারী পরে এই সেটিংসটি পরিবর্তন করতে পারবেন। - <ph name="PRODUCT_OS_NAME" /> এ, <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> ডিভাইস নীতির মান সমানভাবে সেট করার পরামর্শ দেওয়া হয়। দুটি নীতি দ্বারা নির্দিষ্ট মান যদি মেলে না, ব্যবহারকারীর সেশনে প্রবেশ করার সময় ব্যবহারকারী পলিসি দ্বারা নির্দিষ্ট মানটি প্রয়োগ করার কারণে একটু বিলম্ব হতে পারে। - </translation> <translation id="5302612588919538756">এই নীতিটি থামিয়ে দেওয়া হয়েছে, এর পরিবর্তে ‘সিঙ্ক অক্ষম হয়েছে’ ব্যবহারের কথা ভাবুন। ব্যবহারকারীকে <ph name="PRODUCT_NAME" /> এ প্রবেশ করতে দেয়।
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb index 735b66f..4131db1d 100644 --- a/components/policy/resources/policy_templates_ca.xtb +++ b/components/policy/resources/policy_templates_ca.xtb
@@ -58,13 +58,6 @@ Si s'utilitza, l'usuari té accés a totes les impressores tret de les identificades en aquesta política. </translation> -<translation id="1181881366217399113"> - NOTA: aquesta política és experimental i pot tenir problemes de funcionalitat. - Si la política s'activa, cadascun dels orígens indicats en una llista separada per comes s'executarà amb el seu propi procés. Així mateix, també s'aïllaran els orígens indicats per subdominis (per exemple, en especificar https://example.com/, l'adreça https://foo.example.com/ també s'aïllarà com a part del lloc web https://example.com/). - Si la política es desactiva, s'aplicarà la lògica de gestió de processos prèvia a la política d'aïllament de llocs web. - Si la política no es configura, l'usuari podrà canviar aquesta opció de configuració. - A <ph name="PRODUCT_OS_NAME" />, es recomana establir també el mateix valor a la política de dispositius <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />. En cas contrari, pot haver-hi un retard en iniciar una sessió d'usuari, mentre s'aplica el valor especificat per la política d'usuari. - </translation> <translation id="1198465924256827162">La freqüència, en mil·lisegons, amb què s'envien càrregues per informar sobre l'estat del dispositiu. Si aquesta política no s'estableix, s'envien cada 3 hores de manera @@ -656,13 +649,6 @@ El valor de la política s'ha d'indicar en mil·lisegons i es limita perquè sigui inferior o igual al retard de desactivació (si s'ha definit) i al retard d'inactivitat.</translation> <translation id="2987155890997901449">Activa ARC</translation> <translation id="2987227569419001736">Controla l'ús de l'API Web Bluetooth</translation> -<translation id="2998886474614739865"> - NOTA: aquesta política és experimental i pot tenir problemes de funcionalitat. - Aquesta política s'aplica a la pantalla d'inici de sessió. Consulta també la política <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> que s'aplica a la sessió d'usuari. Es recomana definir el mateix valor en totes dues polítiques. En cas contrari, pot haver-hi un retard en iniciar una sessió d'usuari, mentre s'aplica el valor especificat per la política d'usuari. - Si la política s'activa, cadascun dels orígens indicats en una llista separada per comes s'executarà amb el seu propi procés. Així mateix, també s'aïllaran els orígens indicats per subdominis (per exemple, en especificar https://example.com/, l'adreça https://foo.example.com/ també s'aïllarà com a part del lloc web https://example.com/. - Si la política es desactiva, s'aplicarà la lògica de gestió de processos prèvia a la política d'aïllament de llocs web. - Si la política no es configura, a la pantalla d'inici de sessió s'utilitzarà la configuració d'aïllament del lloc web predeterminat a la plataforma. - </translation> <translation id="3016255526521614822">Afegeix a la llista blanca les aplicacions per prendre notes que es permeten a la pantalla de bloqueig de <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Nombre de fites que es permeten a la reversió</translation> <translation id="3030000825273123558">Activa la creació d'informes de mètriques</translation> @@ -767,14 +753,6 @@ Si aquesta política es defineix en una cadena que no sigui buida, aquesta cadena s'utilitzarà com a nom de la destinació de <ph name="PRODUCT_NAME" />. En cas contrari, el nom de la destinació serà el nom del dispositiu. Si aquesta política no es defineix, el nom de la destinació serà el nom del dispositiu i el propietari del dispositiu (o un usuari del domini que gestioni el dispositiu) podrà canviar-lo. El nom pot tenir 24 caràcters com a màxim.</translation> <translation id="3381968327636295719">Fes servir el navegador amfitrió de manera predeterminada</translation> -<translation id="3386001018488754001"> - NOTA: aquesta política és experimental i pot tenir problemes de funcionalitat. - Aquesta política s'aplica a la pantalla d'inici de sessió. Consulta també la política <ph name="SITE_PER_PROCESS_POLICY_NAME" /> que s'aplica a la sessió d'usuari. Es recomana definir el mateix valor en totes dues polítiques. En cas contrari, pot haver-hi un retard en iniciar una sessió d'usuari, mentre s'aplica el valor especificat per la política d'usuari. - Pots utilitzar la política IsolateOrigins amb una llista dels llocs web que vols aïllar per treure el màxim partit de les dues opcions: aïllar llocs web i fer-ho amb el mínim impacte possible per als usuaris. L'opció SitePerProcess aïlla tots els llocs web. - Si la política s'activa, cada lloc web s'executarà amb el seu propi procés. - Si la política es desactiva, s'aplicarà la lògica de gestió de processos prèvia a la política d'aïllament de llocs web. - Si la política no es configura, l'usuari podrà canviar aquesta opció de configuració. - </translation> <translation id="3395348522300156660">Especifica les impressores que un usuari pot fer servir. Aquesta política només s'utilitza si se selecciona <ph name="PRINTERS_WHITELIST" /> per a <ph name="DEVICE_PRINTERS_ACCESS_MODE" />. @@ -1354,14 +1332,6 @@ Si la política no es defineix o es defineix a la cadena buida o en un interval de ports no vàlid, WebRTC pot fer servir qualsevol port UDP local disponible.</translation> <translation id="5290940294294002042">Especifica una llista dels connectors que l'usuari pot activar o desactivar</translation> -<translation id="5301787427319106606"> - NOTA: aquesta política és experimental i pot tenir problemes de funcionalitat. - Pots utilitzar la política IsolateOrigins amb una llista dels llocs web que vols aïllar per treure el màxim partit de les dues opcions: aïllar llocs web i fer-ho amb el mínim impacte possible per als usuaris. L'opció SitePerProcess aïlla tots els llocs web. - Si la política s'activa, cada lloc web s'executarà amb el seu propi procés. - Si la política es desactiva, s'aplicarà la lògica de gestió de processos prèvia a la política d'aïllament de llocs web. - Si la política no es configura, l'usuari podrà canviar aquesta opció de configuració. - A <ph name="PRODUCT_OS_NAME" />, es recomana establir també el mateix valor a la política de dispositius <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. En cas contrari, pot haver-hi un retard en iniciar una sessió d'usuari, mentre s'aplica el valor especificat per la política d'usuari. - </translation> <translation id="5302612588919538756">Aquesta política està obsoleta; substituïu-la per SyncDisabled. Permet a l'usuari iniciar la sessió a <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb index fc20fbfac..7906582 100644 --- a/components/policy/resources/policy_templates_cs.xtb +++ b/components/policy/resources/policy_templates_cs.xtb
@@ -58,13 +58,6 @@ Je-li tato zásada použita, bude mít uživatel k dispozici všechny tiskárny kromě těch, jejichž ID jsou v ní uvedena. </translation> -<translation id="1181881366217399113"> - POZNÁMKA: Tato zásada je experimentální a může narušit některé funkce! - Pokud tuto zásadu povolíte, každý z uvedených zdrojů v seznamu odděleném čárkami bude spouštěn ve vlastním procesu. Budou izolovány i zdroje uvedené v subdoménách – např. pokud zadáte web https://example.com/, bude izolována také subdoména https://foo.example.com/, která je jeho součástí. - Pokud tuto zásadu zakážete, použije se logika správy procesů založená na izolaci jednotlivých webů. - Pokud tuto zásadu nenakonfigurujete, uživatel toto nastavení bude moci změnit. - V systému <ph name="PRODUCT_OS_NAME" /> doporučujeme nastavit na stejnou hodnotu také zásadu zařízení <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />. Pokud se hodnoty nastavené v těchto dvou zásadách neshodují, může při zahajování uživatelské relace dojít ke zpoždění způsobenému používáním hodnoty zadané v zásadě pro uživatele. - </translation> <translation id="1198465924256827162">Frekvence odesílání informací o stavu zařízení (v milisekundách). Není-li tato zásada nastavena, výchozí frekvence je 3 hodiny. Minimální povolená frekvence je 60 sekund.</translation> @@ -665,13 +658,6 @@ Hodnotu zásady zadávejte v milisekundách. Maximální hodnota je stejná jako prodleva vypnutí obrazovky (pokud je nastavena) a prodleva režimu spánku.</translation> <translation id="2987155890997901449">Povolit rozšíření ARC</translation> <translation id="2987227569419001736">Ovládat používání rozhraní Web Bluetooth API</translation> -<translation id="2998886474614739865"> - POZNÁMKA: Tato zásada je experimentální a může narušit některé funkce! - Tato zásada platí pro přihlašovací obrazovku. Prostudujte si také zásadu <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, která platí pro uživatelskou relaci. Obě zásady doporučujeme nastavit na stejnou hodnotu. Pokud se hodnoty neshodují, může při zahajování uživatelské relace dojít ke zpoždění způsobenému používáním hodnoty zadané v zásadě pro uživatele. - Pokud tuto zásadu povolíte, každý z uvedených zdrojů v seznamu odděleném čárkami bude spouštěn ve vlastním procesu. Budou izolovány i zdroje uvedené v subdoménách – např. pokud zadáte web https://example.com/, bude izolována také subdoména https://foo.example.com/, která je jeho součástí. - Pokud tuto zásadu zakážete, použije se logika správy procesů založená na izolaci jednotlivých webů. - Pokud tuto zásadu ponecháte nenakonfigurovanou, použije se pro přihlašovací obrazovku výchozí nastavení platformy týkající se izolace webů. - </translation> <translation id="3016255526521614822">Seznam povolených aplikací k přidávání poznámek na obrazovku uzamčení v systému <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Počet povolených milníků pro vrácení zpět (rollback)</translation> <translation id="3030000825273123558">Povolit hlášení o metrikách</translation> @@ -778,14 +764,6 @@ Je-li tato zásada nastavena na neprázdný řetězec, bude jako název cíle služby <ph name="PRODUCT_NAME" /> použit příslušný řetězec. V opačném případě bude jako název cíle použit název zařízení. Pokud tato zásada není nastavena, bude jako název cíle použit název zařízení a vlastník zařízení (nebo uživatel z domény, která zařízení spravuje) jej bude moci změnit. Název smí mít maximálně 24 znaků.</translation> <translation id="3381968327636295719">Používat ve výchozím nastavení hostitelský prohlížeč</translation> -<translation id="3386001018488754001"> - POZNÁMKA: Tato zásada je experimentální a může narušit některé funkce! - Tato zásada platí pro přihlašovací obrazovku. Prostudujte si také zásadu <ph name="SITE_PER_PROCESS_POLICY_NAME" />, která platí pro uživatelskou relaci. Obě zásady doporučujeme nastavit na stejnou hodnotu. Pokud se hodnoty neshodují, může při zahajování uživatelské relace dojít ke zpoždění způsobenému používáním hodnoty zadané v zásadě pro uživatele. - Chcete-li využívat izolaci, ale omezit její dopad na uživatele, použijte zásadu IsolateOrigins se seznamem webů, které chcete izolovat. Toto nastavení SitePerProcess izoluje všechny weby. - Pokud tuto zásadu povolíte, bude se každý web spouštět ve vlastním procesu. - Pokud tuto zásadu zakážete, použije se logika správy procesů založená na izolaci jednotlivých webů. - Pokud tuto zásadu nenakonfigurujete, uživatel toto nastavení bude moci změnit. - </translation> <translation id="3395348522300156660">Určuje, které tiskárny uživatel může používat. Tato zásada se použije, jen pokud je v zásadě <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> vybrána možnost <ph name="PRINTERS_WHITELIST" />. @@ -1399,14 +1377,6 @@ Pokud tato zásada není nastavena nebo je nastavena na prázdný řetězec nebo neplatný rozsah portů, má rozhraní WebRTC povoleno používat libovolný dostupný místní port UDP.</translation> <translation id="5290940294294002042">Určete seznam pluginů, které uživatel může povolit nebo zakázat</translation> -<translation id="5301787427319106606"> - POZNÁMKA: Tato zásada je experimentální a může narušit některé funkce! - Chcete-li využívat izolaci, ale omezit její dopad na uživatele, použijte zásadu IsolateOrigins se seznamem webů, které chcete izolovat. Toto nastavení SitePerProcess izoluje všechny weby. - Pokud tuto zásadu povolíte, bude se každý web spouštět ve vlastním procesu. - Pokud tuto zásadu zakážete, použije se logika správy procesů založená na izolaci jednotlivých webů. - Pokud tuto zásadu nenakonfigurujete, uživatel toto nastavení bude moci změnit. - V systému <ph name="PRODUCT_OS_NAME" /> doporučujeme nastavit na stejnou hodnotu také zásadu zařízení <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Pokud se hodnoty nastavené v těchto dvou zásadách neshodují, může při zahajování uživatelské relace dojít ke zpoždění způsobenému používáním hodnoty zadané v zásadě pro uživatele. - </translation> <translation id="5302612588919538756">Podpora této zásady byla ukončena, použijte prosím namísto ní zásadu SyncDisabled. Umožňuje přihlášení uživatele do prohlížeče <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb index 1100e905..2d30863 100644 --- a/components/policy/resources/policy_templates_da.xtb +++ b/components/policy/resources/policy_templates_da.xtb
@@ -58,15 +58,6 @@ Hvis denne politik anvendes, kan alle printere anvendes af brugeren, medmindre deres id er angivet i denne politik. </translation> -<translation id="1181881366217399113">BEMÆRK! Denne politik er eksperimentel og kan ødelægge funktionaliteten. - Hvis politikken er aktiveret, kører hvert af de angivne websites - på en kommasepareret liste i sin egen proces. Dette isolerer også - websites, der er angivet af underdomæner. Hvis f.eks. https://eksempel.dk/ angives, - isoleres https://foo.eksempel.dk/ også som en del af websitet - https://eksempel.dk/. - Hvis politikken er deaktiveret, anvendes processtyringslogikken til isolering af hvert website. - Hvis politikken ikke konfigureres, kan brugerne ændre denne indstilling. - I <ph name="PRODUCT_OS_NAME" /> anbefales det, at der også angives den samme værdi for enhedspolitikken <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />. Hvis politikkerne har forskellige værdier, kan der ske forsinkelser ved opstart af en brugersession, mens den værdi, der er angivet af brugerpolitikken, anvendes.</translation> <translation id="1198465924256827162">Hvor ofte der sendes enhedsstatusuploads (i millisekunder). Hvis denne politik ikke angives, er standardfrekvensen tre timer. Den laveste @@ -662,17 +653,6 @@ Politikkens værdi skal angives i millisekunder. Værdierne reduceres, så de er mindre end eller lig med skærmslukforsinkelsen (hvis angivet) og inaktivitetsforsinkelsen.</translation> <translation id="2987155890997901449">Aktivér ARC</translation> <translation id="2987227569419001736">Kontrollér brugen af Web Bluetooth API</translation> -<translation id="2998886474614739865"> - BEMÆRK! Denne politik er eksperimentel og kan ødelægge funktionaliteten. - Politikken gælder for loginskærmen. Se også politikken <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, som gælder for brugersessionen. Det anbefales, at der angives den samme værdi for begge politikker. Hvis politikkerne har forskellige værdier, kan der ske forsinkelser ved opstart af en brugersession, mens den værdi, der er angivet af brugerpolitikken, anvendes. - Hvis politikken er aktiveret, kører hvert af de angivne websites - på en kommasepareret liste i sin egen proces. Dette isolerer også - websites, der er angivet af underdomæner. Hvis f.eks. https://eksempel.dk/ angives, - isoleres https://foo.eksempel.dk/ også som en del af websitet - https://eksempel.dk/. - Hvis politikken er deaktiveret, anvendes processtyringslogikken til isolering af hvert website. - Hvis politikken ikke konfigureres, anvendes platformens standardindstillinger for isolering af website på loginskærmen. - </translation> <translation id="3016255526521614822">Hvidlistedeapps til notatskrivning er tilladt på <ph name="PRODUCT_OS_NAME" />-låseskærmen</translation> <translation id="3021562480854470924">Hvor mange gange tidligere versioner kan gendannes</translation> <translation id="3030000825273123558">Aktivér metrics-rapportering</translation> @@ -776,17 +756,6 @@ Hvis denne politik er angivet som en udfyldt streng, anvendes strengen som navnet på destinationen for <ph name="PRODUCT_NAME" />. Hvis ikke, er navnet på destinationen det samme som navnet på enheden. Hvis denne politik ikke er angivet, er navnet på destinationen det samme som navnet på enheden, og enhedsejeren (eller en bruger fra domænet, som administrerer enheden) kan ændre det. Navnet må højst indeholde 24 tegn.</translation> <translation id="3381968327636295719">Brug værtsbrowseren som standard</translation> -<translation id="3386001018488754001"> - BEMÆRK! Denne politik er eksperimentel og kan ødelægge funktionaliteten. - Politikken gælder for loginskærmen. Se også politikken <ph name="SITE_PER_PROCESS_POLICY_NAME" />, som gælder for brugersessionen. Det anbefales, at der angives den samme værdi for begge politikker. Hvis politikkerne har forskellige værdier, kan der ske forsinkelser ved opstart af en brugersession, mens den værdi, der er angivet af brugerpolitikken, anvendes. - Det er en god idé at kigge på politikindstillingen IsolateOrigins for at få det bedste - fra begge verdener (isolering og begrænset indvirkning på brugerne). Det opnår du ved at bruge - IsolateOrigins sammen med en liste over de websites, du vil isolere. Denne indstilling, - SitePerProcess, isolerer alle websites. - Hvis politikken er aktiveret, kører hvert website i sin egen proces. - Hvis politikken er deaktiveret, anvendes processtyringslogikken til isolering af hvert website. - Hvis politikken ikke konfigureres, kan brugerne ændre denne indstilling. - </translation> <translation id="3395348522300156660">Angiver, hvilke printere en bruger kan anvende.. Denne politik anvendes kun, hvis <ph name="PRINTERS_WHITELIST" /> er valgt for <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1385,17 +1354,6 @@ Hvis politikken ikke er angivet, eller hvis den ikke er angivet til en tom streng eller et ugyldigt portinterval, har WebRTC tilladelse til at anvende enhver tilgængelig lokal UDP-port.</translation> <translation id="5290940294294002042">Angiv en liste over plugins, som brugeren kan aktivere eller deaktivere</translation> -<translation id="5301787427319106606"> - BEMÆRK! Denne politik er eksperimentel og kan ødelægge funktionaliteten. - Det er en god idé at kigge på politikindstillingen IsolateOrigins for at få det bedste - fra begge verdener (isolering og begrænset indvirkning på brugerne). Det opnår du ved at bruge - IsolateOrigins sammen med en liste over de websites, du vil isolere. Denne indstilling, - SitePerProcess, isolerer alle websites. - Hvis politikken er aktiveret, kører hvert website i sin egen proces. - Hvis politikken er deaktiveret, anvendes processtyringslogikken til isolering af hvert website. - Hvis politikken ikke konfigureres, kan brugerne ændre denne indstilling. - I <ph name="PRODUCT_OS_NAME" /> anbefales det, at der også angives den samme værdi for enhedspolitikken <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Hvis politikkerne har forskellige værdier, kan der ske forsinkelser ved opstart af en brugersession, mens den værdi, der er angivet af brugerpolitikken, anvendes. - </translation> <translation id="5302612588919538756">Denne politik er udfaset. Du kan eventuelt bruge SyncDisabled i stedet. Giver brugeren mulighed for at logge ind på <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 1a41c30..069abed 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -58,13 +58,6 @@ Wenn diese Richtlinie verwendet wird, stehen dem Nutzer alle Drucker mit Ausnahme der Geräte zur Verfügung, deren IDs in dieser Richtlinie angegeben sind. </translation> -<translation id="1181881366217399113"> - HINWEIS: Diese Richtlinie ist experimentell und kann die Funktionalität beeinträchtigen. - Wenn die Richtlinie aktiviert ist, wird für jeden der benannten Ursprünge in einer durch Kommas getrennten Liste ein eigener Prozess ausgeführt. Dadurch werden auch durch Subdomains benannte Ursprünge isoliert, z. B. wenn Sie https://example.com/ angeben, wird auch https://foo.example.com/ als Teil der Website https://example.com/ isoliert. - Wenn die Richtlinie deaktiviert ist, wird die Verwaltungslogik des Prozesses zur Isolierung einzelner Websites wirksam. - Wenn die Richtlinie nicht konfiguriert ist, kann der Nutzer diese Einstellung ändern. - Es wird empfohlen, unter <ph name="PRODUCT_OS_NAME" /> auch die Geräterichtlinie "<ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />" auf denselben Wert festzulegen. Wenn die von den beiden Richtlinien angegebenen Werte nicht übereinstimmen, kann es beim Beginn einer Nutzersitzung zu einer Verzögerung kommen, während der von der Nutzerrichtlinie angegebene Wert angewendet wird. - </translation> <translation id="1198465924256827162">Mithilfe dieser Richtlinie wird in Millisekunden angegeben, wie oft Uploads mit dem Gerätestatus vorgenommen werden. Wenn die Richtlinie nicht konfiguriert ist, beträgt der Standardwert 3 Stunden. @@ -655,13 +648,6 @@ Der Wert für die Richtlinie muss in Millisekunden angegeben werden. Werte müssen kleiner oder gleich dem Wert der Verzögerung für die Bildschirmabschaltung (falls angegeben) und der Inaktivitätsverzögerung sein.</translation> <translation id="2987155890997901449">ARC aktivieren</translation> <translation id="2987227569419001736">Verwendung der Web Bluetooth API steuern</translation> -<translation id="2998886474614739865"> - HINWEIS: Diese Richtlinie ist experimentell und kann die Funktionalität beeinträchtigen. - Diese Richtlinie gilt für die Anmeldeseite. Sehen Sie sich auch die Richtlinie "<ph name="ISOLATE_ORIGINS_POLICY_NAME" />" an, die auf die Nutzersitzung angewendet wird. Es wird empfohlen, beide Richtlinien auf denselben Wert festzulegen. Wenn die Werte nicht übereinstimmen, kann es beim Beginn einer Nutzersitzung zu einer Verzögerung kommen, während der von der Nutzerrichtlinie angegebene Wert angewendet wird. - Wenn die Richtlinie aktiviert ist, wird für jeden der benannten Ursprünge in einer durch Kommas getrennten Liste ein eigener Prozess ausgeführt. Dadurch werden auch durch Subdomains benannte Ursprünge isoliert, z. B. wenn Sie https://example.com/ angeben, wird auch https://foo.example.com/ als Teil der Website https://example.com/ isoliert. - Wenn die Richtlinie deaktiviert ist, wird die Verwaltungslogik des Prozesses zur Isolierung einzelner Websites wirksam. - Wenn die Richtlinie nicht konfiguriert ist, werden die standardmäßigen Website-Isolierungseinstellungen der Plattform für die Anmeldeseite verwendet. - </translation> <translation id="3016255526521614822">Auf dem <ph name="PRODUCT_OS_NAME" />-Sperrbildschirm zulässige Notizen-Apps auf die weiße Liste setzen</translation> <translation id="3021562480854470924">Rollback bei erreichter Anzahl von Meilensteinen ist erlaubt</translation> <translation id="3030000825273123558">Messdatenberichte aktivieren</translation> @@ -763,14 +749,6 @@ Wird für diese Richtlinie ein nicht-leerer String definiert, dann wird dieser als Name für das <ph name="PRODUCT_NAME" />-Ziel verwendet. Andernfalls wird der Gerätename als Zielname verwendet. Ist diese Richtlinie nicht definiert, wird der Gerätename als Zielname verwendet und der Geräteeigentümer oder ein Nutzer der Domain, von der das Gerät verwaltet wird, hat die Möglichkeit, den Namen zu ändern. Der Name darf maximal 24 Zeichen enthalten.</translation> <translation id="3381968327636295719">Standardmäßig Host-Browser verwenden</translation> -<translation id="3386001018488754001"> - HINWEIS: Diese Richtlinie ist experimentell und kann die Funktionalität beeinträchtigen. - Diese Richtlinie gilt für die Anmeldeseite. Sehen Sie sich auch die Richtlinie "<ph name="SITE_PER_PROCESS_POLICY_NAME" />" an, die auf die Nutzersitzung angewendet wird. Es wird empfohlen, beide Richtlinien auf denselben Wert festzulegen. Wenn die Werte nicht übereinstimmen, kann es beim Beginn einer Nutzersitzung zu einer Verzögerung kommen, während der von der Nutzerrichtlinie angegebene Wert angewendet wird. - Es ist sinnvoll, sich die Einstellung der Richtlinie "IsolateOrigins" anzusehen, um die Auswirkungen auf die Nutzer bei der Isolierung von Websites gering zu halten. Verwenden Sie dazu "IsolateOrigins" mit einer Liste von Websites, die Sie isolieren möchten. Mit der Einstellung "SitePerProcess" werden alle Websites isoliert. - Wenn die Richtlinie aktiviert ist, wird für jede Website ein eigener Prozess ausgeführt. - Wenn die Richtlinie deaktiviert ist, wird die Verwaltungslogik des Prozesses zur Isolierung einzelner Websites wirksam. - Wenn die Richtlinie nicht konfiguriert ist, kann der Nutzer diese Einstellung ändern. - </translation> <translation id="3395348522300156660">Gibt die Drucker an, die ein Nutzer verwenden kann. Diese Richtlinie wird nur verwendet, wenn <ph name="PRINTERS_WHITELIST" /> für <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> ausgewählt wurde. @@ -1362,14 +1340,6 @@ Wenn die Richtlinie nicht konfiguriert ist oder sie auf den leeren String oder einen ungültigen Portbereich eingestellt ist, kann von WebRTC jeder beliebige verfügbare lokale UDP-Port verwendet werden.</translation> <translation id="5290940294294002042">Liste von Plug-ins angeben, die der Nutzer aktivieren oder deaktivieren kann</translation> -<translation id="5301787427319106606"> - HINWEIS: Diese Richtlinie ist experimentell und kann die Funktionalität beeinträchtigen. - Es ist sinnvoll, sich die Einstellung der Richtlinie "IsolateOrigins" anzusehen, um die Auswirkungen auf die Nutzer bei der Isolierung von Websites gering zu halten. Verwenden Sie dazu "IsolateOrigins" mit einer Liste von Websites, die Sie isolieren möchten. Mit der Einstellung "SitePerProcess" werden alle Websites isoliert. - Wenn die Richtlinie aktiviert ist, wird für jede Website ein eigener Prozess ausgeführt. - Wenn die Richtlinie deaktiviert ist, wird die Verwaltungslogik des Prozesses zur Isolierung einzelner Websites wirksam. - Wenn die Richtlinie nicht konfiguriert ist, kann der Nutzer diese Einstellung ändern. - Es wird empfohlen, unter <ph name="PRODUCT_OS_NAME" /> auch die Geräterichtlinie "<ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />" auf denselben Wert festzulegen. Wenn die von den beiden Richtlinien angegebenen Werte nicht übereinstimmen, kann es beim Beginn einer Nutzersitzung zu einer Verzögerung kommen, während der von der Nutzerrichtlinie angegebene Wert angewendet wird. - </translation> <translation id="5302612588919538756">Diese Richtlinie wird nicht mehr angeboten. Sie können stattdessen "SyncDisabled" verwenden. Die Richtlinie erlaubt dem Nutzer die Anmeldung in <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb index 8f70265..0d256fe5 100644 --- a/components/policy/resources/policy_templates_el.xtb +++ b/components/policy/resources/policy_templates_el.xtb
@@ -58,9 +58,6 @@ Εάν χρησιμοποιείται αυτή η πολιτική, όλοι οι εκτυπωτές είναι διαθέσιμοι στον χρήστη, εκτός από τα αναγνωριστικά που αναφέρονται σε αυτήν την πολιτική. </translation> -<translation id="1181881366217399113"> - ΣΗΜΕΙΩΣΗ: Αυτή η πολιτική είναι πειραματική και μπορεί να προκαλέσει διακοπές στη λειτουργία! Εάν η πολιτική είναι ενεργοποιημένη, καθεμιά από τις καθορισμένες προελεύσεις σε μια λίστα διαχωρισμένη με κόμματα θα εκτελεί τη δική της διαδικασία. Με αυτόν τον τρόπο, θα απομονωθούν επίσης οι προελεύσεις που καθορίζονται από υποτομείς. Π.χ. ο καθορισμός του https://example.com/ θα προκαλέσει επίσης την απομόνωση του https://foo.example.com/ ως μέρους του ιστοτόπου https://example.com/. Εάν η πολιτική είναι απενεργοποιημένη, θα εφαρμόζεται η λογική διαχείρισης της διαδικασίας απομόνωσης ανά ιστότοπο. Εάν η πολιτική δεν έχει διαμορφωθεί, ο χρήστης θα μπορεί να αλλάξει αυτήν τη ρύθμιση. Για το <ph name="PRODUCT_OS_NAME" />, συνιστάται επίσης η ρύθμιση της πολιτικής χρήσης συσκευής <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> στην ίδια τιμή. Εάν οι τιμές που καθορίζονται από τις δύο πολιτικές δεν είναι ίδιες, μπορεί να υπάρξει καθυστέρηση στην καταχώριση μιας περιόδου λειτουργίας χρήστη κατά την εφαρμογή της τιμής που προσδιορίζεται από την πολιτική χρήστη. - </translation> <translation id="1198465924256827162">Πόσο συχνά αποστέλλονται μεταφορτώσεις κατάστασης συσκευής, σε χιλιοστά δευτερολέπτου. Αν αυτή η πολιτική δεν έχει οριστεί, η προεπιλεγμένη συχνότητα είναι 3 ώρες. Η @@ -665,17 +662,6 @@ Η τιμή πολιτικής πρέπει να προσδιορίζεται σε χιλιοστά δευτερολέπτου. Οι τιμές καθορίζονται έτσι ώστε να είναι μικρότερες από ή ίσες με την καθυστέρηση απενεργοποίησης οθόνης (αν έχει οριστεί) και την καθυστέρηση αδράνειας.</translation> <translation id="2987155890997901449">Ενεργοποίηση ARC</translation> <translation id="2987227569419001736">Έλεγχος της χρήσης του API Bluetooth ιστού</translation> -<translation id="2998886474614739865"> - ΣΗΜΕΙΩΣΗ: Αυτή η πολιτική είναι πειραματική και μπορεί να προκαλέσει προβλήματα στη λειτουργία! - Αυτή η πολιτική ισχύει για την οθόνη σύνδεσης. Ανατρέξτε, επίσης, στην πολιτική <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> η οποία ισχύει για την περίοδο σύνδεσης χρήστη. Συνιστάται να ορίσετε την ίδια τιμή και για τις δύο πολιτικές. Αν οι τιμές δεν είναι ίδιες, μπορεί να υπάρξει καθυστέρηση στην καταχώριση μιας περιόδου σύνδεσης χρήστη κατά την εφαρμογή της τιμής που προσδιορίζεται από την πολιτική χρήστη. - Αν η πολιτική είναι ενεργοποιημένη, καθεμία από τις καθορισμένες προελεύσεις σε μια - λίστα διαχωρισμένη με κόμματα θα εκτελεί τη δική της διαδικασία. Με αυτόν τον τρόπο, θα απομονωθούν επίσης - οι προελεύσεις που καθορίζονται από δευτερεύοντες τομείς. Για παράδειγμα, ο καθορισμός του https://example.com/ θα - προκαλέσει επίσης την απομόνωση του https://foo.example.com/ ως μέρους του ιστοτόπου - https://example.com/ site. - Εάν η πολιτική είναι απενεργοποιημένη, θα εφαρμόζεται η λογική διαχείρισης της διαδικασίας απομόνωσης ανά ιστότοπο. - Εάν η πολιτική δεν έχει διαμορφωθεί, θα χρησιμοποιηθούν οι προεπιλεγμένες ρυθμίσεις απομόνωσης ιστοτόπου για την οθόνη σύνδεσης. - </translation> <translation id="3016255526521614822">Εφαρμογές σημειώσεων στη λίστα επιτρεπόμενων που επιτρέπονται στο κλείδωμα οθόνης του <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Επιτρεπόμενος αριθμός ορόσημων για τα οποία επιτρέπεται επαναφορά</translation> <translation id="3030000825273123558">Ενεργοποίηση αναφοράς μετρήσεων</translation> @@ -785,17 +771,6 @@ Εάν αυτή η πολιτική οριστεί σε μια συμβολοσειρά που δεν είναι κενή, αυτή η συμβολοσειρά θα χρησιμοποιηθεί ως το όνομα του προορισμού του <ph name="PRODUCT_NAME" />. Διαφορετικά, το όνομα του προορισμού θα είναι το όνομα της συσκευής. Εάν αυτή η πολιτική δεν οριστεί, το όνομα του προορισμού θα είναι το όνομα της συσκευής και ο κάτοχος της συσκευής (ή ένας χρήστης από τον τομέα που διαχειρίζεται τη συσκευή) θα μπορεί να το αλλάξει. Το όνομα θα πρέπει να αποτελείται από έως 24 χαρακτήρες.</translation> <translation id="3381968327636295719">Χρήση του προγράμματος περιήγησης του κεντρικού υπολογιστή από προεπιλογή</translation> -<translation id="3386001018488754001"> - ΣΗΜΕΙΩΣΗ: Αυτή η πολιτική είναι πειραματική και μπορεί να προκαλέσει προβλήματα στη λειτουργία! - Αυτή η πολιτική ισχύει για την οθόνη σύνδεσης. Ανατρέξτε, επίσης, στην πολιτική <ph name="SITE_PER_PROCESS_POLICY_NAME" /> η οποία ισχύει για την περίοδο σύνδεσης χρήστη. Συνιστάται να ορίσετε την ίδια τιμή και για τις δύο πολιτικές. Αν οι τιμές δεν είναι ίδιες, μπορεί να υπάρξει καθυστέρηση στην καταχώριση μιας περιόδου σύνδεσης χρήστη κατά την εφαρμογή της τιμής που προσδιορίζεται από την πολιτική χρήστη. - Μπορείτε εάν θέλετε να ανατρέξετε στη ρύθμιση της πολιτικής IsolateOrigins, - για να απολαύσετε τις καλύτερες δυνατότητες και από τις δύο επιλογές, την απομόνωση και την περιορισμένη επίδραση για τους χρήστες, χρησιμοποιώντας τη ρύθμιση - IsolateOrigins με μια λίστα ιστοτόπων που θέλετε να απομονώσετε. Η ρύθμιση - SitePerProcess, απομονώνει όλους τους ιστοτόπους. - Εάν η πολιτική είναι ενεργοποιημένη, κάθε ιστότοπος θα εκτελεί τη δική του διαδικασία. - Εάν η πολιτική είναι απενεργοποιημένη, θα εφαρμόζεται η λογική διαχείρισης της διαδικασίας απομόνωσης ανά ιστότοπο. - Εάν η πολιτική δεν έχει διαμορφωθεί, θα χρησιμοποιηθούν οι προεπιλεγμένες ρυθμίσεις απομόνωσης ιστοτόπου για την οθόνη σύνδεσης. - </translation> <translation id="3395348522300156660">Καθορίζει τους εκτυπωτές που μπορεί να χρησιμοποιήσει ένας χρήστης. Αυτή η πολιτική χρησιμοποιείται μόνο εάν επιλεγεί η ρύθμιση <ph name="PRINTERS_WHITELIST" /> για τη λειτουργία <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1417,17 +1392,6 @@ Εάν δεν οριστεί αυτή η πολιτική ή εάν οριστεί σε κενή συμβολοσειρά ή μη έγκυρο εύρος θυρών, το WebRTC επιτρέπεται να χρησιμοποιήσει οποιαδήποτε διαθέσιμη τοπική θύρα UDP.</translation> <translation id="5290940294294002042">Καθορίστε μια λίστα προσθηκών τις οποίες θα μπορεί να ενεργοποιεί ή να απενεργοποιεί ο χρήστης</translation> -<translation id="5301787427319106606"> - ΣΗΜΕΙΩΣΗ: Αυτή η πολιτική είναι πειραματική και μπορεί να προκαλέσει προβλήματα στη λειτουργία! - Μπορείτε εάν θέλετε να ανατρέξετε στη ρύθμιση της πολιτικής IsolateOrigins, - για να απολαύσετε τις καλύτερες δυνατότητες και από τις δύο επιλογές, την απομόνωση και την περιορισμένη επίδραση για τους χρήστες, χρησιμοποιώντας τη ρύθμιση - IsolateOrigins με μια λίστα ιστοτόπων που θέλετε να απομονώσετε. Η ρύθμιση, - SitePerProcess, απομονώνει όλους τους ιστοτόπους. - Εάν η πολιτική είναι ενεργοποιημένη, κάθε ιστότοπος θα εκτελεί τη δική του διαδικασία. - Εάν η πολιτική είναι απενεργοποιημένη, θα εφαρμόζεται η λογική διαχείρισης της διαδικασίας απομόνωσης ανά ιστότοπο. - Εάν η πολιτική δεν έχει διαμορφωθεί, θα χρησιμοποιηθούν οι προεπιλεγμένες ρυθμίσεις απομόνωσης ιστοτόπου για την οθόνη σύνδεσης. - Για το <ph name="PRODUCT_OS_NAME" />, συνιστάται επίσης η ρύθμιση της πολιτικής συσκευής <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> στην ίδια τιμή. Αν οι τιμές που ορίζονται από τις δύο πολιτικές δεν είναι ίδιες, μπορεί να υπάρξει καθυστέρηση στην καταχώριση μιας περιόδου σύνδεσης χρήστη κατά την εφαρμογή της τιμής που προσδιορίζεται από την πολιτική χρήστη. - </translation> <translation id="5302612588919538756">Αυτή η πολιτική έχει καταργηθεί. Μπορείτε να χρησιμοποιήσετε την πολιτική SyncDisabled. Δίνει στο χρήστη τη δυνατότητα να συνδεθεί στο <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb index 49db864..23c4603 100644 --- a/components/policy/resources/policy_templates_en-GB.xtb +++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -58,17 +58,6 @@ If this policy is used, all printers are provided to the user except for the IDs listed in this policy. </translation> -<translation id="1181881366217399113"> - NOTE: This policy is experimental and may break functionality! - If the policy is enabled, each of the named origins in a - comma-separated list will run in its own process. This will also isolate - origins named by subdomains; e.g. specifying https://example.com/ will - also cause https://foo.example.com/ to be isolated as part of the - https://example.com/ site. - If the policy is disabled, the per-Site Isolation process management logic will take effect. - If the policy is not configured, the user will be able to change this setting. - On <ph name="PRODUCT_OS_NAME" />, it is recommended to also set the <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> device policy to the same value. If the values specified by the two policies don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied. - </translation> <translation id="1198465924256827162">How frequently device status uploads are sent, in milliseconds. If this policy is unset, the default frequency is 3 hours. The minimum @@ -690,17 +679,6 @@ The policy value should be specified in milliseconds. Values are clamped to be less than or equal the screen off delay (if set) and the idle delay.</translation> <translation id="2987155890997901449">Enable ARC</translation> <translation id="2987227569419001736">Control use of the Web Bluetooth API</translation> -<translation id="2998886474614739865"> - NOTE: This policy is experimental and may break functionality! - This policy applies to the sign-in screen. Please see also the <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> policy which applies to the user session. It is recommended to set both policies to the same value. If the values don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied. - If the policy is enabled, each of the named origins in a - comma-separated list will run in its own process. This will also isolate - origins named by subdomains; e.g. specifying https://example.com/ will - also cause https://foo.example.com/ to be isolated as part of the - https://example.com/ site. - If the policy is disabled, the per-Site Isolation process management logic will take effect. - If the policy is not configured, the platform default site isolation settings will be used for the sign-in screen. - </translation> <translation id="3016255526521614822">Whitelist note-taking apps allowed on the <ph name="PRODUCT_OS_NAME" /> lock screen</translation> <translation id="3021562480854470924">Number of milestones roll-back is allowed</translation> <translation id="3030000825273123558">Enable metrics reporting</translation> @@ -810,17 +788,6 @@ If this policy is set to a non-empty string, that string will be used as the name of the <ph name="PRODUCT_NAME" /> destination. Otherwise, the destination name will be the device name. If this policy is not set, the destination name will be the device name, and the owner of the device (or a user from the domain managing the device) will be allowed to change it. The name is limited to 24 characters.</translation> <translation id="3381968327636295719">Use the host browser by default</translation> -<translation id="3386001018488754001"> - NOTE: This policy is experimental and may break functionality! - This policy applies to the sign-in screen. Please see also the <ph name="SITE_PER_PROCESS_POLICY_NAME" /> policy which applies to the user session. It is recommended to set both policies to the same value. If the values don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied. - You might want to look at the IsolateOrigins policy setting to get the - best of both worlds, isolation and limited impact for users, by using - IsolateOrigins with a list of the sites that you want to isolate. This setting, - SitePerProcess, isolates all sites. - If the policy is enabled, each site will run in its own process. - If the policy is disabled, the per-Site Isolation process management logic will take effect. - If the policy is not configured, the user will be able to change this setting. - </translation> <translation id="3395348522300156660">Specifies the printers which a user can use. This policy is only used if <ph name="PRINTERS_WHITELIST" /> is chosen for <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1452,17 +1419,6 @@ If the policy is not set, or if it is set to the empty string or an invalid port range, WebRTC is allowed to use any available local UDP port.</translation> <translation id="5290940294294002042">Specify a list of plug-ins that the user can enable or disable</translation> -<translation id="5301787427319106606"> - NOTE: This policy is experimental and may break functionality! - You might want to look at the IsolateOrigins policy setting to get the - best of both worlds, isolation and limited impact for users, by using - IsolateOrigins with a list of the sites that you want to isolate. This setting, - SitePerProcess, isolates all sites. - If the policy is enabled, each site will run in its own process. - If the policy is disabled, the per-Site Isolation process management logic will take effect. - If the policy is not configured, the user will be able to change this setting. - On <ph name="PRODUCT_OS_NAME" />, it is recommended to also set the <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> device policy to the same value. If the values specified by the two policies don't match, a delay may be incurred when entering a user session while the value specified by user policy is being applied. - </translation> <translation id="5302612588919538756">This policy is deprecated, consider using SyncDisabled instead. Allows the user to sign in to <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 2d92a6f..c72c516 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -58,17 +58,6 @@ Si se usa esta política, se proporcionan todas las impresoras al usuario, excepto para los ID que se enumeran en esta política. </translation> -<translation id="1181881366217399113"> - NOTA: Esta política es experimental y puede provocar fallos. - Si se habilita la política, cada origen designado en una lista separada por - comas se ejecutará en su propio proceso. Esta acción también aislará los - sitios designados a partir de subdominios; p. ej., si se especifica - https://ejemplo.com/, también se aislará https://foo.ejemplo.com/ como parte - del sitio https://ejemplo.com/. - Si se inhabilita la política, se aplicará la lógica de administración de procesos de aislamiento por sitio. - Si no se configura esta política, el usuario podrá cambiar esta configuración. - En <ph name="PRODUCT_OS_NAME" />, se recomienda también configurar la política de dispositivo <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> con el mismo valor. Si los valores de ambas políticas no coinciden, es posible que se produzca un retraso al ingresar una sesión de usuario mientras se aplica el valor especificado por la política del usuario. - </translation> <translation id="1198465924256827162">Frecuencia de envío de cargas de estado del dispositivo, en milisegundos. Si esta política no se establece, la frecuencia predeterminada es de 3 horas. La frecuencia mínima permitida es de 60 segundos.</translation> @@ -657,17 +646,6 @@ El valor de la política debe especificarse en milisegundos. Los valores se establecerán para que sean inferiores o equivalentes a la demora de pantalla apagada (si está configurada) y la demora de inactividad.</translation> <translation id="2987155890997901449">Habilitar ARC</translation> <translation id="2987227569419001736">Controlar el uso de la API de Bluetooth web</translation> -<translation id="2998886474614739865"> - NOTA: Esta política es experimental y puede provocar fallos. - Esta política se aplica a la pantalla de acceso. Consulta también la política <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, que se aplica a la sesión de usuario. Se recomienda establecer ambas políticas en el mismo valor. Si los valores no coinciden, es posible que se produzca un retraso al ingresar una sesión de usuario mientras se aplica el valor especificado por la política del usuario. - Si se habilita la política, cada origen designado en una lista de elementos separados por - comas se ejecutará en su propio proceso. Esta acción también aislará - los orígenes designados a partir de subdominios; p. ej., al especificar - https://ejemplo.com/, también se aislará https://foo.ejemplo.com/ como parte - del sitio https://ejemplo.com/. - Si se inhabilita la política, se aplicará la lógica de administración del proceso de aislamiento por sitio. - Si no se configura, se usará la configuración predeterminada de aislamiento de sitios de la plataforma para la pantalla de acceso. - </translation> <translation id="3016255526521614822">Incluir en la lista blanca las apps para tomar notas que se permiten en la pantalla bloqueada de <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Cantidad de hitos que se permiten en la reversión</translation> <translation id="3030000825273123558">Activar los informes estadísticos</translation> @@ -769,17 +747,6 @@ Si esta política se establece con una string no vacía, esa string se usará como el nombre del destino de <ph name="PRODUCT_NAME" />. De lo contrario, el nombre del destino será el nombre del dispositivo. Si esta política no se establece, el nombre del destino será el nombre del dispositivo, y el propietario del dispositivo (o un usuario del dominio que administre el dispositivo) podrá cambiarlo. El nombre tiene un límite máximo de 24 caracteres.</translation> <translation id="3381968327636295719">Utilizar el navegador del host de manera predeterminada</translation> -<translation id="3386001018488754001"> - NOTA: Esta política es experimiental y puede provocar fallos. - Esta política se aplica a la pantalla de acceso. Consulta también la política <ph name="SITE_PER_PROCESS_POLICY_NAME" />, que se aplica a la sesión de usuario. Se recomienda establecer ambas políticas en el mismo valor. Si los valores no coinciden, es posible que se produzca un retraso al ingresar una sesión de usuario mientras se aplica el valor especificado por la política del usuario. - Para revisar la configuración de la política IsolateOrigins a fin de aprovechar - el aislamiento y reducir el impacto que puedan sufrir los usuarios, utiliza - IsolateOrigins con una lista de los sitios que quieras aislar. Esta - configuración, SitePerProcess, aísla todos los sitios. - Si se habilita la política, cada sitio se ejecutará en su propio proceso. - Si se inhabilita, se aplicará la lógica de administración del proceso de aislamiento por sitio. - Si no se configura, el usuario podrá cambiar esta configuración. - </translation> <translation id="3395348522300156660">Especifica las impresoras que puede utilizar un usuario. Esta política solo se usa si se elige <ph name="PRINTERS_WHITELIST" /> para <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1375,17 +1342,6 @@ Si la política no se establece, se establece con un intervalo de puertos no válido o se deja como una cadena vacía, WebRTC puede usar cualquier puerto UDP local disponible.</translation> <translation id="5290940294294002042">Especificar una lista de complementos que el usuario puede habilitar o inhabilitar.</translation> -<translation id="5301787427319106606"> - NOTA: Esta política es experimental y puede provocar fallos. - Revisa la configuración de la política IsolateOrigins y utiliza esta política - con una lista de los sitios que quieras aislar para aprovechar el aislamiento - y reducir el impacto que puedan sufrir los usuarios. Esta configuración, - SitePerProcess, aísla todos los sitios. - Si se habilita la política, cada sitio se ejecutará en su propio proceso. - Si se inhabilita, se aplicará la lógica de administración del proceso de aislamiento por sitio. - Si no se configura, el usuario podrá cambiar esta configuración. - En <ph name="PRODUCT_OS_NAME" />, se recomienda también configurar la política de dispositivo <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> con el mismo valor. Si los valores de ambas políticas no coinciden, es posible que se produzca un retraso al ingresar una sesión de usuario mientras se aplica el valor especificado por la política del usuario. - </translation> <translation id="5302612588919538756">Esta política dejó de estar disponible; se debe considerar el uso de SyncDisabled en su lugar. Permite que el usuario acceda a <ph name="PRODUCT_NAME" />. @@ -2538,6 +2494,15 @@ <translation id="9112897538922695510">Te permite registrar una lista de controladores de protocolo. Esto solo puede ser una política recomendada. La propiedad |protocol| se debe establecer para el esquema (por ejemplo, "mailto") de la URL, y la propiedad |url| se debe establecer para el patrón de la URL de la aplicación que controla el esquema. El patrón puede incluir una especificación "%s" que, si está presente, se reemplazará por la URL controlada. Los controladores de protocolo registrados por la política se fusionan con los registrados por el usuario, y todos están disponibles para utilizarse. El usuario puede anular los controladores de protocolos instalados por la política si instala un nuevo controlador predeterminado, pero no puede eliminar un controlador de protocolo registrado por la política.</translation> +<translation id="9123211093995421438">Especifica la cantidad mínima de hitos de reversión de <ph name="PRODUCT_OS_NAME" /> que se permiten a partir de la versión estable en cualquier momento. + + El valor predeterminado es 0 para dispositivos de usuarios particulares y 4 (aprox., medio año) para dispositivos de empresas. + + Esta política previene la protección de reversión para aplicar al menos esta cantidad de hitos. + + Si configuras esta política con un valor más bajo, el efecto será permanente: ES POSIBLE que el dispositivo no pueda implementar la reversión a versiones anteriores incluso después de que se restablezca la política con un valor más alto. + + Las posibilidades reales de reversión también dependen de los parches de vulnerabilidad críticos y de la placa.</translation> <translation id="913195841488580904">Bloquear el acceso a una lista de las URL</translation> <translation id="9135033364005346124">Habilitar el proxy de <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9136253551939494882">Una lista blanca que controla los métodos de desbloqueo rápido que el usuario puede configurar y usar para desbloquear la pantalla bloqueada.
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 51493d7..74a1598 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -58,17 +58,6 @@ Si se usa esta política, el usuario tendrá acceso a todas las impresoras, excepto a los ID indicados en ella. </translation> -<translation id="1181881366217399113"> - NOTA: Esta política es experimental y puede hacer que el funcionamiento no sea correcto. - Si se habilita la política, cada uno de los orígenes especificados en una - lista de elementos separados por comas se ejecutará en un proceso propio. También se aislarán - los orígenes de los subdominios correspondientes (p. ej., si especificas https://example.com/ también - se aislará https://foo.example.com/ como parte - del sitio web https://example.com/). - Si se inhabilita, se aplicará la lógica de administración de procesos de aislamiento del sitio web. - Si no se configura la política, el usuario podrá cambiar esta opción. - En <ph name="PRODUCT_OS_NAME" />, también se recomienda asignar el mismo valor a la política de dispositivos <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />. Si los valores especificados por las dos políticas no coinciden, es posible que se produzca un retraso al introducir una sesión de usuario mientras se aplica el valor de especificado por la política del usuario. - </translation> <translation id="1198465924256827162">Frecuencia con la que se envían los informes del estado del dispositivo, expresada en milisegundos. Si no se establece ningún valor para esta política, la frecuencia predeterminada serán 3 horas. La frecuencia mínima permitida son 60 segundos.</translation> @@ -320,7 +309,7 @@ <translation id="2113068765175018713">Limitar tiempo de actividad de dispositivo mediante reinicio automático</translation> <translation id="2127599828444728326">Permitir notificaciones en estos sitios</translation> <translation id="2131902621292742709">Retraso de atenuado de pantalla cuando el dispositivo funciona con la batería</translation> -<translation id="2132732175597591362">Controla la lista blanca de patrones de URL en los que la reproducción automática siempre estará habilitada. +<translation id="2132732175597591362">Controla la lista blanca de patrones de URL con los que la reproducción automática siempre estará habilitada. Si la reproducción automática está habilitada, los vídeos se reproducirán automáticamente con audio en <ph name="PRODUCT_NAME" /> (sin el consentimiento del usuario). @@ -330,7 +319,7 @@ Si se le asigna el valor "False" a la política AutoplayAllowed, los patrones de URL establecidos en esta política seguirán teniendo permiso para reproducirse. - Ten en cuenta que si <ph name="PRODUCT_NAME" /> se está ejecutando y esta política cambia, dichos cambios se aplicarán a las pestañas que se abran a partir de ese momento Por tanto, es posible que algunas pestañas aún conserven el comportamiento anterior.</translation> + Ten en cuenta que si <ph name="PRODUCT_NAME" /> se está ejecutando y esta política cambia, dichos cambios se aplicarán a las pestañas que se abran a partir de ese momento. Por tanto, es posible que algunas pestañas aún conserven el comportamiento anterior.</translation> <translation id="2134437727173969994">Permitir que se bloquee la pantalla</translation> <translation id="2137064848866899664">Si se establece esta política, se girará cada pantalla a la orientación especificada cada vez que se reinicie el dispositivo y la primera vez que se conecte @@ -685,17 +674,6 @@ El valor de la política se debe especificar en milisegundos. Los valores están establecidos para ser inferiores o iguales al retraso de desconexión de pantalla (si está establecido) y al retraso de inactividad.</translation> <translation id="2987155890997901449">Habilitar ARC</translation> <translation id="2987227569419001736">Controlar el uso de la API Bluetooth web</translation> -<translation id="2998886474614739865"> - NOTA: Esta política es experimental y puede hacer que el funcionamiento no sea correcto. - Esta política se aplica a la pantalla de inicio de sesión. También puedes consultar la política <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> que se aplica a la sesión del usuario. Te recomendamos que asignes el mismo valor a ambas políticas. Si los valores no coinciden, es posible que se produzca un retraso al acceder a una sesión de usuario mientras se aplica el valor especificado por la política del usuario. - Si se habilita la política, cada uno de los orígenes especificados en una - lista de elementos separados por comas se ejecutará en un proceso propio. También se aislarán - los orígenes de los subdominios correspondientes (p. ej., si especificas https://example.com/ también - se aislará https://foo.example.com/ como parte - del sitio web https://example.com/). - Si se inhabilita, se aplicará la lógica de administración de procesos de aislamiento del sitio web. - Si no se configura, se utilizarán los ajustes predeterminados de aislamiento de sitios web de la plataforma para la pantalla de inicio de sesión. - </translation> <translation id="3016255526521614822">Aplicaciones para tomar notas incluidas en la lista blanca que están permitidas en la pantalla de bloqueo de <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Se permite restaurar el número de eventos clave</translation> <translation id="3030000825273123558">Habilitar los informes estadísticos</translation> @@ -802,17 +780,6 @@ Si se asigna una cadena que no esté vacía a esta política, esa cadena se utilizará como nombre del destino de <ph name="PRODUCT_NAME" />. De lo contrario, el nombre del destino será el nombre del dispositivo. Si esta política no se establece, el nombre del destino será el nombre del dispositivo y su propietario (o un usuario del dominio que gestiona el dispositivo) podrá cambiarlo. El nombre tiene un límite de 24 caracteres.</translation> <translation id="3381968327636295719">Utilizar el navegador del host de forma predeterminada</translation> -<translation id="3386001018488754001"> - NOTA: Esta política es experimental y puede hacer que el funcionamiento no sea correcto. - Esta política se aplica a la pantalla de inicio de sesión. También puedes consultar la política <ph name="SITE_PER_PROCESS_POLICY_NAME" /> que se aplica a la sesión del usuario. Te recomendamos que asignes el mismo valor a ambas políticas. Si los valores no coinciden, es posible que se produzca un retraso al acceder a una sesión de usuario mientras se aplica el valor especificado por la política del usuario. - Para conseguir tanto aislamiento - como un impacto limitado para los usuarios, utiliza la política - IsolateOrigins con una lista de los sitios web que quieras aislar. La opción - SitePerProcess aísla todos los sitios web. - Si se habilita la política, cada sitio web se ejecuta en un proceso propio. - Si se inhabilita, se aplicará la lógica de administración de procesos de aislamiento del sitio web. - Si no se configura la política, el usuario podrá cambiar esta opción. - </translation> <translation id="3395348522300156660">Especifica las impresoras que puede utilizar un usuario. Esta política solo se usará si se asigna <ph name="PRINTERS_WHITELIST" /> a <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -977,7 +944,7 @@ Cada entrada de la lista contiene un diccionario, que debe incluir el ID de la extensión en el campo "extension-id" y una URL de actualización en el campo "update-url".</translation> <translation id="3873159954366380945">Permite definir cada cuánto tiempo muestra <ph name="PRODUCT_NAME" /> las notificaciones de reinicio para aplicar una actualización pendiente. - Puedes utilizar esta opción de la política para controlar el periodo (en milisegundos) en el que se informa al usuario de forma progresiva de que debe reiniciar <ph name="PRODUCT_NAME" /> (o de que debe reiniciar <ph name="PRODUCT_OS_NAME" />) para aplicar una actualización. En este periodo, el usuario recibe una notificación de forma periódica indicando que es necesario aplicar una actualización de acuerdo con el ajuste de la política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Si no se le asigna ningún valor, se utiliza el periodo predeterminado, que es de 345.600.000 milisegundos (cuatro días) para <ph name="PRODUCT_OS_NAME" /> y 604.800.000 milisegundos (una semana) para el resto de plataformas.</translation> + Puedes utilizar esta opción de la política para controlar el periodo (en milisegundos) en el que se informa al usuario de forma progresiva de que debe reiniciar <ph name="PRODUCT_NAME" /> (o de que debe reiniciar <ph name="PRODUCT_OS_NAME" />) para aplicar una actualización. En este periodo, el usuario recibe una notificación de forma repetida que indica que es necesario aplicar una actualización de acuerdo con el ajuste de la política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Si no se le asigna ningún valor, se utiliza el periodo predeterminado, que es de 345.600.000 milisegundos (cuatro días) para <ph name="PRODUCT_OS_NAME" /> y 604.800.000 milisegundos (una semana) para el resto de plataformas.</translation> <translation id="3877517141460819966">Modo de autenticación de dos factores integrado</translation> <translation id="388237772682176890">Esta política está obsoleta en M53 y se ha quitado de M54, ya que se ha retirado la compatibilidad con SPDY/3.1. @@ -1443,17 +1410,6 @@ Si esta política no se configura o si se le asigna una cadena vacía o un intervalo de puertos no válido, WebRTC podrá utilizar cualquier puerto UDP local disponible.</translation> <translation id="5290940294294002042">Especificar una lista de complementos que los usuarios puedan habilitar o inhabilitar</translation> -<translation id="5301787427319106606"> - NOTA: Esta política es experimental y puede hacer que el funcionamiento no sea correcto. - Para conseguir tanto aislamiento - como un impacto limitado para los usuarios, utiliza la política - IsolateOrigins con una lista de los sitios web que quieras aislar. La opción - SitePerProcess aísla todos los sitios web. - Si se habilita la política, cada sitio web se ejecuta en un proceso propio. - Si se inhabilita, se aplicará la lógica de administración de procesos de aislamiento del sitio web. - Si no se configura la política, el usuario podrá cambiar esta opción. - En <ph name="PRODUCT_OS_NAME" /> también se recomienda asignar el mismo valor a la política de dispositivos <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Si los valores especificados por las dos políticas no coinciden, es posible que se produzca un retraso al acceder a una sesión de usuario mientras se aplica el valor especificado por la política del usuario. - </translation> <translation id="5302612588919538756">Esta política está obsoleta, pero puedes utilizar SyncDisabled en su lugar. Permite que el usuario inicie sesión en <ph name="PRODUCT_NAME" />. @@ -2657,11 +2613,11 @@ <translation id="9112897538922695510">Te permite registrar una lista de controladores de protocolos. Solo puede tratarse de una política recomendada. La propiedad |protocol| se debe establecer según el esquema (por ejemplo, mailto), y la propiedad |url| se debe establecer según el patrón de URL de la aplicación que procesa el esquema. El patrón puede incluir un %s, que si está presente se sustituirá por la URL procesada. Los controladores de protocolos registrados por la política se combinan con los registrados por el usuario, y ambos pueden utilizarse. El usuario puede anular los controladores de protocolos instalados por la política. Para ello, debe instalar un nuevo controlador predeterminado, pero no puede eliminar un controlador de protocolo registrado por la política.</translation> -<translation id="9123211093995421438">Especifica el número mínimo de restauraciones de eventos clave de <ph name="PRODUCT_OS_NAME" /> que se deberían permitir desde la versión estable en cualquier momento. +<translation id="9123211093995421438">Especifica el número mínimo de reversiones a versiones principales de <ph name="PRODUCT_OS_NAME" /> que se deberían permitir desde la versión estable en cualquier momento. El valor predeterminado es 0 para dispositivos de consumo y 4 (aproximadamente medio año) para los dispositivos registrados por empresas. - Si se configura esta política, la protección de reversión no se aplicará al menos a ese número de eventos clave. + Si se configura esta política, la protección de reversión no se aplicará al menos a ese número de versiones principales. Si se asigna un valor inferior a esta política, el efecto será permanente: el dispositivo no podrá volver a instalar versiones anteriores aunque se le vuelva a asignar un valor superior a la política.
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb index 72cbf22..2838ec1 100644 --- a/components/policy/resources/policy_templates_et.xtb +++ b/components/policy/resources/policy_templates_et.xtb
@@ -58,17 +58,6 @@ Selle reegli kasutamisel on kasutajale saadaval kõik printerid, v.a need, mille ID-d on selles reeglis loetletud. </translation> -<translation id="1181881366217399113"> - MÄRKUS. See reegel on katseline ja funktsioonid ei pruugi töötada. - Kui reegel on lubatud, käitab iga komadega eraldatud loendis - nimetatud lähtekoht oma protsesse. See isoleerib ka alamdomeenide - nimetatud lähtekohad; nt aadressi https://example.com/ määramisel - isoleeritakse saidi https://example.com/ osana ka aadress - https://foo.example.com/. - Kui reegel on keelatud, jõustub saidi isoleerimise põhise protsessihalduse loogika. - Kui reegel on seadistamata, saab kasutaja seda seadet muuta. - Operatsioonisüsteemis <ph name="PRODUCT_OS_NAME" /> on soovitatav seadistada ka seadmereegel <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> samale väärtusele. Kui kahes reeglis määratud väärtused ei ühti, võib kasutajareegliga määratud väärtuse rakendamisel esineda kasutajaseanssi sisenemisel viivitusi. - </translation> <translation id="1198465924256827162">Seadme oleku üleslaadimiste saatmise sagedus millisekundites. Kui see reegel on määramata, on vaikesagedus 3 tundi. Minimaalne @@ -689,17 +678,6 @@ Reegli väärtus tuleb määrata millisekundites. Väärtused tuleb kinnitada väiksematena kui ekraani väljalülitamise viiteaeg (kui see on määratud) ja jõudeoleku viiteaeg või nendega võrdsetena.</translation> <translation id="2987155890997901449">ARC lubamine</translation> <translation id="2987227569419001736">Web Bluetooth API kasutuse kontrollimine</translation> -<translation id="2998886474614739865"> - MÄRKUS. See reegel on katseline ja funktsioonid ei pruugi töötada. - See reegel kehtib sisselogimisekraanil. Vaadake ka reeglit <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, mis kehtib kasutajaseansi puhul. Soovitatav on mõlemale reeglile määrata sama väärtus. Kui väärtused ei ühti, võib kasutajareegliga määratud väärtuse rakendamisel esineda kasutajaseanssi sisenemisel viivitusi. - Kui reegel on lubatud, käitab iga komadega eraldatud loendis - nimetatud lähtekoht oma protsesse. See isoleerib ka - alamdomeenide nimetatud lähtekohad; nt aadressi https://example.com/ - määramisel isoleeritakse saidi https://example.com/ osana ka aadress - https://foo.example.com/. - Kui reegel on keelatud, jõustub saidi isoleerimise põhise protsessihalduse loogika. - Kui reegel on seadistamata, kasutatakse sisselogimisekraanil platvormi saitide isoleerimise vaikeseadeid. - </translation> <translation id="3016255526521614822">Lisage lubatud rakenduste loendisse märkmete tegemise rakendused, mida <ph name="PRODUCT_OS_NAME" /> võib lukustuskuval näidata</translation> <translation id="3021562480854470924">Tagasiminekuks lubatud eelmiste versioonide arv</translation> <translation id="3030000825273123558">Luba mõõdikute aruandlus</translation> @@ -805,17 +783,6 @@ Kui selle reegli väärtuseks määratakse mõni täidetud string, kasutatakse seda stringi teenuse <ph name="PRODUCT_NAME" /> sihtkohana. Muul juhul on sihtkoha nimeks seadme nimi. Kui see reegel jäetakse määramata, on sihtkoha nimeks seadme nimi ja seadme omanik (või seadet haldava domeeni kasutaja) saab seda muuta. Nimi tohib olla maksimaalselt 24 tähemärki.</translation> <translation id="3381968327636295719">Kasuta vaikimisi hostbrauserit</translation> -<translation id="3386001018488754001"> - MÄRKUS. See reegel on katseline ja funktsioonid ei pruugi töötada. - See reegel kehtib sisselogimisekraanil. Vaadake ka reeglit <ph name="SITE_PER_PROCESS_POLICY_NAME" />, mis kehtib kasutajaseansi puhul. Soovitatav on mõlemale reeglile määrata sama väärtus. Kui väärtused ei ühti, võib kasutajareegliga määratud väärtuse rakendamisel esineda kasutajaseanssi sisenemisel viivitusi. - Soovitame teil vaadata reegli IsolateOrigins seadet, et kasutada nii - isoleerimist kui ka piirata mõju kasutajate jaoks, kasutades reeglit - IsolateOrigins saitide puhul, mille soovite isoleerida. Seade - SitePerProcess isoleerib kõik saidid. - Kui reegel on lubatud, käitab iga sait oma protsesse. - Kui reegel on keelatud, jõustub saidi isoleerimise põhise protsessihalduse loogika. - Kui reegel on seadistamata, saab kasutaja seda seadet muuta. - </translation> <translation id="3395348522300156660">Määrab printerid, mida kasutaja saab kasutada. Seda reeglit kasutatakse ainult siis, kui režiimis <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> on valitud väärtus <ph name="PRINTERS_WHITELIST" /> @@ -1437,17 +1404,6 @@ Kui reeglit ei ole määratud või kui see on määratud tühjale stringile või kehtetule pordivahemikule, on WebRTC-l lubatud kasutada mis tahes saadaolevat kohalikku UDP-porti.</translation> <translation id="5290940294294002042">Määrake pistikprogrammide loend, mida kasutaja saab lubada või keelata</translation> -<translation id="5301787427319106606"> - MÄRKUS. See reegel on katseline ja funktsioonid ei pruugi töötada. - Soovitame teil vaadata reegli IsolateOrigins seadet, et kasutada nii - isoleerimist kui ka piirata mõju kasutajate jaoks, kasutades reeglit - IsolateOrigins saitide puhul, mille soovite isoleerida. Seade - SitePerProcess isoleerib kõik saidid. - Kui reegel on lubatud, käitab iga sait oma protsesse. - Kui reegel on keelatud, jõustub saidi isoleerimise põhise protsessihalduse loogika. - Kui reegel on seadistamata, saab kasutaja seda seadet muuta. - Operatsioonisüsteemis <ph name="PRODUCT_OS_NAME" /> on soovitatav seadistada ka seadmereegel <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> samale väärtusele. Kui kahes reeglis määratud väärtused ei ühti, võib kasutajareegliga määratud väärtuse rakendamisel esineda kasutajaseanssi sisenemisel viivitusi. - </translation> <translation id="5302612588919538756">Selle reegli tugi on katkestatud, kaaluge selle asemel reegli SyncDisabled kasutamist. Lubab kasutajal teenusesse <ph name="PRODUCT_NAME" /> sisse logida.
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb index abb8175..66595b2b 100644 --- a/components/policy/resources/policy_templates_fa.xtb +++ b/components/policy/resources/policy_templates_fa.xtb
@@ -54,18 +54,6 @@ اگر این خطمشی استفاده شود، همه چاپگرها بهجز شناسههای فهرستشده در این خطمشی، در اختیار کاربر قرار میگیرند. </translation> -<translation id="1181881366217399113"> - توجه: این خطمشی آزمایشی است و ممکن است تأثیر منفی بر عملکرد داشته باشد! - اگر این خطمشی فعال شود، هر یک از مبدأهای نامگذاریشده در فهرست - جداشده با ویرگول در پردازش مربوط به خود اجرا خواهد شد. این خطمشی - همچنین مبدأهای نامگذاریشده براساس زیردامنهها را جدا میکند؛ برای - مثال مشخص کردن https://example.com/ باعث میشود - https://foo.example.com/ هم بهعنوان بخشی از سایت - https://example.com/ جدا شود. - اگر این خطمشی غیرفعال شود، منطق مدیریت پردازش جداشدگی سایت اجرا خوهد شد. - اگر این خطمشی پیکربندی نشود، کاربر میتواند این تنظیم را تغییر دهد. - توصیه میشود در <ph name="PRODUCT_OS_NAME" />، خطمشی دستگاه <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> هم روی مقدار یکسانی تنظیم شود. اگر مقادیر مشخصشده توسط این دو خطمشی با هم مطابقت نداشته باشد، ممکن است هنگام ورود به جلسه کاربری تأخیری به وجود آید چون در این صورت مقدار مشخصشده توسط خطمشی کاربر اعمال میشود. - </translation> <translation id="1198465924256827162">دوره زمانی ارسال آپلودهای وضعیت دستگاه به میلیثانیه. اگر این خطمشی تنظیم نشود، دوره پیشفرض ۳ ساعت خواهد بود. حداقل @@ -656,13 +644,6 @@ مقدار خطمشی باید بر حسب میلی ثانیه باشد. مقادیر باید کمتر یا برابر با تأخیر خاموشی صفحه (در صورت تنظیم) و تأخیر بیحرکتی باشد.</translation> <translation id="2987155890997901449">فعال کردن ARC</translation> <translation id="2987227569419001736">کنترل استفاده از Web Bluetooth API</translation> -<translation id="2998886474614739865"> - نکته: این خطمشی آزمایشی است و ممکن است در عملکرد اختلال ایجاد کند! - این خطمشی برای صفحه ورود به سیستم به کار میرود. لطفاً خطمشی <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> را که برای جلسه کاربر به کار میرود نیز ببینید. توصیه میشود هردو خطمشی را روی مقدار یکسانی تنظیم کنید. اگر مقادیر مشخصشده توسط این دو خطمشی با هم مطابقت نداشته باشد، ممکن است هنگام وارد کردن جلسه کاربری، تأخیری به وجود آید و درعینحال مقدار مشخصشده توسط خطمشی کاربر اعمال میشود. - اگر این خطمشی فعال شده باشد، هریک از مبدأهای نامگذاریشده در فهرستی جداشده با ویرگول، با پردازش مخصوص به خود اجرا خواهند شد. این خطمشی مبدأهای نامگذاریشده با زیردامنهها را نیز جدا خواهد کرد؛ برای مثال مشخص کردن https://example.com/ باعث میشود https://foo.example.com/ نیز بهعنوان بخشی از سایت https://example.com/ جدا شود. - اگر خطمشی غیرفعال شده باشد، منطق مدیریت پردازش جداشدگی سایت اجرا خواهد شد. - اگر خطمشی پیکربندی نشده باشد، از تنظیمات جداشدگی سایت پیشفرض پلتفورم برای صفحه ورود به سیستم استفاده میشود. - </translation> <translation id="3016255526521614822">برنامههای یادداشتبرداری موجود در فهرست مجاز، برای استفاده در صفحه درحالت قفل <ph name="PRODUCT_OS_NAME" /> مجاز شدند</translation> <translation id="3021562480854470924">تعداد عقبگردهای نقاط عطف مجاز هستند</translation> <translation id="3030000825273123558">گزارش معیارها فعال شود</translation> @@ -763,14 +744,6 @@ اگر این خطمشی روی یک رشته غیرخالی تنظیم شود، آن رشته بهعنوان نام مقصد <ph name="PRODUCT_NAME" /> استفاده خواهد شد. درغیراینصورت، نام مقصد نام دستگاه خواهد بود. اگر این خطمشی تنظیم نشود، نام مقصد نام دستگاه خواهد بود و مالک دستگاه (یا کاربری از دامنهای که دستگاه را مدیریت میکند) اجازه دارد آن را تغییر دهد. نام باید حداکثر ۲۴ نویسه داشته باشد.</translation> <translation id="3381968327636295719">استفاده از مرورگر میزبان بهطور پیشفرض</translation> -<translation id="3386001018488754001"> - نکته: این خطمشی آزمایشی است و ممکن است در عملکرد اختلال ایجاد کند! - این خطمشی برای صفحه ورود به سیستم به کار میرود. لطفاً خطمشی <ph name="SITE_PER_PROCESS_POLICY_NAME" /> را که برای جلسه کاربر به کار میرود نیز ببینید. توصیه میشود هردو خطمشی را روی مقدار یکسانی تنظیم کنید. اگر مقادیر مشخصشده توسط این دو خطمشی با هم مطابقت نداشته باشد، ممکن است هنگام وارد کردن جلسه کاربری، تأخیری به وجود آید و درعینحال مقدار مشخصشده توسط خطمشی کاربر اعمال میشود. - شاید بخواهید به تنظیم خطمشی «IsolateOrigins» نگاهی کنید تا با استفاده از «IsolateOrigins» با فهرستی از سایتهایی که میخواهید جدا کنید، بهترین نتیجه را برای هردو جنبه (جداشدگی و تأثیر محدود بر کاربران) دریافت کنید. این تنظیم «SitePerProcess»، همه سایتها را جدا میکند. - اگر خطمشی فعال شده باشد، همه سایتها با پردازش مخصوص به خود اجرا خواهند شد. - اگر خطمشی غیرفعال شده باشد، منطق مدیریت پردازش جداشدگی سایت اجرا خوهد شد. - اگر خطمشی پیکربندی نشده باشد، کاربر میتواند این تنظیم را تغییر دهد. - </translation> <translation id="3395348522300156660">چاپگرهایی را که کاربر میتواند استفاده کند مشخص میکند. این خطمشی فقط درصورت انتخاب <ph name="PRINTERS_WHITELIST" /> برای <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> استفاده میشود @@ -1362,14 +1335,6 @@ اگر خطمشی تنظیم نشود یا رشتهای خالی یا دامنه درگاه نامعتبری برای آن تنظیم شود، WebRTC مجاز است از هر درگاه UDP محلی دردسترسی استفاده کند.</translation> <translation id="5290940294294002042">تعیین فهرست افزایههایی که کاربر میتواند فعال یا غیرفعال کند</translation> -<translation id="5301787427319106606"> - نکته: این خطمشی آزمایشی است و ممکن است در عملکرد اختلال ایجاد کند! - شاید بخواهید به تنظیم خطمشی «IsolateOrigins» نگاهی کنید تا با استفاده از «IsolateOrigins» با فهرستی از سایتهایی که میخواهید جدا کنید، بهترین نتیجه را برای هردو جنبه (جداشدگی و تأثیر محدود بر کاربران) دریافت کنید. این تنظیم «SitePerProcess»، همه سایتها را جدا میکند. - اگر خطمشی فعال شده باشد، همه سایتها با پردازش مخصوص به خود اجرا خواهند شد. - اگر خطمشی غیرفعال شده باشد، منطق مدیریت پردازش جداشدگی سایت اجرا خوهد شد. - اگر خطمشی پیکربندی نشده باشد، کاربر میتواند این تنظیم را تغییر دهد. - در <ph name="PRODUCT_OS_NAME" />، توصیه میشود خطمشی دستگاه <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> هم روی مقدار یکسانی تنظیم شود. اگر مقادیر مشخصشده توسط این دو خطمشی با هم مطابقت نداشته باشد، ممکن است هنگام ورود به جلسه کاربری تأخیری به وجود آید چون در این صورت مقدار مشخصشده توسط خطمشی کاربر اعمال میشود. - </translation> <translation id="5302612588919538756">این خطمشی منسوخ شده است. بهجای آن از SyncDisabled استفاده کنید. به کاربر امکان میدهد به سیستم <ph name="PRODUCT_NAME" /> وارد شود.
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb index c78b9222..3924bc7 100644 --- a/components/policy/resources/policy_templates_fi.xtb +++ b/components/policy/resources/policy_templates_fi.xtb
@@ -58,17 +58,6 @@ Jos tämä käytäntö on käytössä, käyttäjä voi käyttää kaikkia tulostimia, paitsi niitä, joiden tunnukset on lueteltu tässä. </translation> -<translation id="1181881366217399113"> - HUOM. Tämä käytäntö on kokeellinen ja saattaa rikkoa toimintoja! - Jos käytäntö on otettu käyttöön, kaikki pilkuilla erotetun luettelon - nimetyistä alkuperistä suorittavat oman prosessinsa. Tämä eristää myös - aliverkkotunnusten mukaan nimetyt alkuperät, esim. jos https://example.com/ - määritetään, https://foo.example.com/ eristetään myös osana - https://example.com/-sivustoa. - Jos käytäntöä ei ole otettu käyttöön, sivuston eristämistä edeltävän prosessin hallintalogiikka tulee voimaan. - Jos käytäntöä ei ole määritetty, käyttäjä voi muuttaa tämän asetuksen. - Tuotteen <ph name="PRODUCT_OS_NAME" /> kohdalla myös laitekäytännölle <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> kannattaa määrittää sama arvo. Jos käytännöissä määritetyt arvot eivät täsmää, käyttökerran aloittamisen yhteydessä saattaa esiintyä viive, kun käyttäjäkäytännössä määritetty arvo otetaan käyttöön. - </translation> <translation id="1198465924256827162">Laitteen tilatietojen lähetystiheys millisekunteina. Jos tätä käytäntöä ei aseteta, käytetään oletustiheyttä 3 tuntia. @@ -663,17 +652,6 @@ Tämän käytännön arvo täytyy määrittää millisekunteina. Arvo rajoitetaan korkeintaan mahdollisen ruudun sammutuksen viiveen ja käyttämättömyysajan suuruiseksi.</translation> <translation id="2987155890997901449">Ota ARC käyttöön.</translation> <translation id="2987227569419001736">Hallinnoi Web Bluetooth ‑sovellusliittymän käyttöä</translation> -<translation id="2998886474614739865"> - HUOM. Tämä käytäntö on kokeellinen ja saattaa häiritä toimintoja. - Tämä käytäntö koskee kirjautumisnäyttöjä. Tutustu myös <ph name="ISOLATE_ORIGINS_POLICY_NAME" />-käytäntöön, joka koskee käyttökertaa. Suosittelemme määrittämään molemmille käytännöille saman arvon. Jos käytännöissä määritetyt arvot eivät täsmää, käyttökerran aloittamisen yhteydessä saattaa esiintyä viive, kun käyttäjäkäytännössä määritetty arvo otetaan käyttöön. - Jos käytäntö on otettu käyttöön, jokainen pilkuilla erotetun luettelon nimetyistä - alkuperistä suorittaa oman prosessinsa. Tämä eristää myös aliverkkotunnusten - mukaan nimetyt alkuperät. Jos esim. https://example.com/ määritetään, - https://foo.example.com/ eristetään myös osana - https://example.com/-sivustoa. - Jos käytäntö on poissa käytöstä, sivustokohtaisen erilläänpidon hallintalogiikka tulee voimaan. - Jos käytäntöä ei ole määritetty, alustan sivun erilläänpidon oletusasetusta käytetään kirjautumisnäytöllä. - </translation> <translation id="3016255526521614822">Luo luettelo sallituista muistiinpanosovelluksista, jotka <ph name="PRODUCT_OS_NAME" /> voi näyttää lukitusnäytöllä.</translation> <translation id="3021562480854470924">Palautukselle sallittujen virstanpylväiden määrä</translation> <translation id="3030000825273123558">Ota tilastoraportit käyttöön</translation> @@ -777,17 +755,6 @@ Jos tämän käytännön arvo on ei-tyhjä merkkijono, <ph name="PRODUCT_NAME" /> näyttää kyseisen merkkijonon kohdenimenä. Muussa tapauksessa kohdenimenä käytetään laitteen nimeä. Jos tätä käytäntöä ei ole määritetty, kohdenimenä käytetään laitteen nimeä ja laitteen omistaja (tai laitetta hallinnoivan verkkotunnuksen käyttäjä) voi vaihtaa nimen. Nimen enimmäispituus on 24 merkkiä.</translation> <translation id="3381968327636295719">Käytä oletuksena isäntäselainta</translation> -<translation id="3386001018488754001"> - HUOM. Tämä käytäntö on kokeellinen ja saattaa häiritä toimintoja. - Tämä käytäntö koskee kirjautumisnäyttöjä. Tutustu myös <ph name="SITE_PER_PROCESS_POLICY_NAME" />-käytäntöön, joka koskee käyttökertaa. Suosittelemme määrittämään molemmille käytännöille saman arvon. Jos käytännöissä määritetyt arvot eivät täsmää, käyttökerran aloittamisen yhteydessä saattaa esiintyä viive, kun käyttäjäkäytännössä määritetty arvo otetaan käyttöön. - Suosittelemme tutustumaan IsolateOrigins-käytännön asetukseen, sillä käyttämällä sitä yhdessä - erillään pidettävien sivustojen luettelon kanssa voit saada molempien parhaat puolet – - erilläänpidon ja rajallisen vaikutuksen käyttäjille. Tämä asetus, - SitePerProcess, eristää kaikki sivustot. Jos käytäntö on otettu käyttöön, - jokainen sivusto suorittaa oman prosessinsa. Jos käytäntö on poissa käytöstä, - sivustokohtaisen erilläänpidon hallintalogiikka tulee voimaan. - Jos käytäntöä ei ole määritetty, käyttäjä voi muuttaa tämän asetuksen. - </translation> <translation id="3395348522300156660">Määrittää tulostimet, joita käyttäjä voi käyttää. Tätä käytäntöä käytetään vain, jos <ph name="PRINTERS_WHITELIST" />-tilaksi on valittu <ph name="DEVICE_PRINTERS_ACCESS_MODE" />. @@ -1382,16 +1349,6 @@ Jos käytäntöä ei määritetä tai sen arvo on tyhjä merkkijono tai virheellinen porttiväli, WebRTC voi käyttää kaikkia käytettävissä olevia paikallisia UDP-portteja.</translation> <translation id="5290940294294002042">Määritä laajennukset, jotka käyttäjä voi ottaa käyttöön tai poistaa käytöstä</translation> -<translation id="5301787427319106606"> - HUOM. Tämä käytäntö on kokeellinen ja saattaa häiritä toimintoja. - Suosittelemme tutustumaan IsolateOrigins-käytännön asetukseen, sillä käyttämällä sitä yhdessä - erillään pidettävien sivustojen luettelon kanssa voit saada molempien parhaat puolet – - erilläänpidon ja rajallisen vaikutuksen käyttäjille. Tämä asetus, SitePerProcess, eristää kaikki sivustot. - Jos käytäntö on otettu käyttöön, jokainen sivusto suorittaa oman prosessinsa. - Jos käytäntö on poissa käytöstä, sivustokohtaisen erilläänpidon hallintalogiikka tulee voimaan. - Jos käytäntöä ei ole määritetty, käyttäjä voi muuttaa tämän asetuksen. - Tuotteen <ph name="PRODUCT_OS_NAME" /> kohdalla myös laitekäytännölle <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> kannattaa määrittää sama arvo. Jos käytäntöjen arvot eivät täsmää, käyttökerran aloittamisen yhteydessä saattaa esiintyä viive, kun käyttäjäkäytännössä määritetty arvo otetaan käyttöön. - </translation> <translation id="5302612588919538756">Tämä käytäntö on vanhentunut, ja sen sijaan tulee harkita käytäntöä SyncDisabled. Määrittää, salliiko <ph name="PRODUCT_NAME" /> käyttäjän kirjautumisen.
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb index 26fa729..190be36 100644 --- a/components/policy/resources/policy_templates_fil.xtb +++ b/components/policy/resources/policy_templates_fil.xtb
@@ -58,17 +58,6 @@ Kung ginagamit ang patakarang ito, ibibigay ang lahat ng printer sa user maliban sa mga id na nakalista sa patakarang ito. </translation> -<translation id="1181881366217399113"> - TANDAAN: Pang-eksperimento ang patakarang ito at maaari itong makasira sa functionality! - Kung ie-enable ang patakaran, ang bawat isa sa mga tinukoy na pinagmulan sa isang - comma-separated list ay magpapatakbo ng sarili nitong proseso. Ihihiwalay rin nito - ang mga pinagmulang tinukoy ng mga subdomain; hal., kapag tinukoy ang https://example.com/, - mahihiwalay rin ang https://foo.example.com/ bilang bahagi ng - site na https://example.com/. - Kung idi-disable ang patakaran, magkakaroon ng bisa ang logic ng pamamahala sa proseso ng Pag-isolate ayon sa Site. - Kung hindi iko-configure ang patakaran, mababago ng user ang setting na ito. - Sa <ph name="PRODUCT_OS_NAME" />, inirerekomendang itakda rin ang patakaran sa device na <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> sa parehong value. Kung hindi magtutugma ang mga value na tinukoy ng dalawang patakaran, maaaring magkaroon ng pagkaantala sa pagpasok sa isang session ng user habang inilalapat ang value na tinukoy ng patakaran ng user. - </translation> <translation id="1198465924256827162">Kung gaano kadalas ipinapadala ang mga pag-upload ng status ng device, sa mga millisecond. Kung hindi itatakda ang patakarang ito, ang default na dalas ay 3 oras. Ang minimum @@ -686,17 +675,6 @@ Dapat tukuyin ang halaga ng patakaran ayon sa millisecond. Kinakailangang mas mababa kaysa sa o katumbas ng delay ng pag-off ng screen (kung nakatakda) at idle delay ang mga halaga.</translation> <translation id="2987155890997901449">I-enable ang ARC</translation> <translation id="2987227569419001736">Kontrolin ang paggamit ng Web Bluetooth API</translation> -<translation id="2998886474614739865"> - TANDAAN: Pang-eksperimento ang patakarang ito at maaari itong makasira sa functionality! - Nalalapat ang patakarang ito sa screen ng pag-sign in. Pakitingnan din ang patakarang <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> na nalalapat sa session ng user. Inirerekomendang itakda ang dalawang patakaran sa iisang value. Kung hindi magtutugma ang mga value, maaaring magkaroon ng pagkaantala sa pagpasok sa isang session ng user habang inilalapat ang value na tinukoy ng patakaran ng user. - Kung ie-enable ang patakaran, ang bawat isa sa mga tinukoy na pinagmulan sa isang - comma-separated list ay magpapatakbo ng sarili nitong proseso. Ia-isolate din nito ang - mga pinagmulang tinukoy ng mga subdomain; hal., kapag tinukoy ang https://example.com/, - maa-isolate din ang https://foo.example.com/ bilang bahagi ng - site na https://example.com/. - Kung idi-disable ang patakaran, magkakaroon ng bisa ang logic ng pamamahala sa proseso ng Pag-isolate ayon sa Site. - Kung hindi iko-configure ang patakaran, gagamitin ang mga default na setting sa pag-isolate ng site ng platform para sa screen ng pag-sign in. - </translation> <translation id="3016255526521614822">Pinapayagan ang mga app sa paggawa ng tala ng Whitelist sa lock screen ng <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Pinapayagan ang bilang ng pag-rollback ng mga milestone</translation> <translation id="3030000825273123558">Paganahin ang pag-uulat ng mga sukatan</translation> @@ -805,17 +783,6 @@ Kung nakatakda ang patakarang ito sa isang may lamang string, gagamitin ang string na iyon bilang pangalan ng destinasyon ng <ph name="PRODUCT_NAME" />. Kung hindi, ang pangalan ng device ang magiging pangalan ng destinasyon. Kung hindi nakatakda ang patakarang ito, ang pangalan ng device ang magiging pangalan ng destinasyon, at papayagan ang may-ari ng device (o isang user mula sa domain na namamahala sa device) na palitan ito. Nalilimitahan ang pangalan sa 24 na character.</translation> <translation id="3381968327636295719">Gamitin ang host browser bilang default</translation> -<translation id="3386001018488754001"> - TANDAAN: Pang-eksperimento ang patakarang ito at maaari itong makasira sa functionality! - Nalalapat ang patakarang ito sa screen ng pag-sign in. Pakitingnan din ang patakarang <ph name="SITE_PER_PROCESS_POLICY_NAME" /> na nalalapat sa session ng user. Inirerekomendang itakda ang dalawang patakaran sa iisang value. Kung hindi magtutugma ang mga value, maaaring magkaroon ng pagkaantala sa pagpasok sa isang session ng user habang inilalapat ang value na tinukoy ng patakaran ng user. - Mainam na suriin ang setting ng patakarang IsolateOrigins para - masulit ang pag-isolate at pagkakaroon ng limitadong epekto sa mga user, sa pamamagitan ng paggamit sa - IsolateOrigins nang may listahan ng mga site na gusto mong i-isolate. Ina-isolate - ng setting na SitePerProcess ang lahat ng site. - Kung ie-enable ang patakaran, magpapatakbo ang bawat site ng sarili nitong proseso. - Kung idi-disable ang patakaran, magkakaroon ng bisa ang logic ng pamamahala sa proseso ng Pag-isolate ayon sa Site. - Kung hindi iko-configure ang patakaran, mababago ng user ang setting na ito. - </translation> <translation id="3395348522300156660">Tumutukoy sa mga printer na magagamit ng user. Ginagamit lang ang patakarang ito kung pipiliin ang <ph name="PRINTERS_WHITELIST" /> para sa <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1437,17 +1404,6 @@ Kung hindi nakatakda ang patakaran, o kung nakatakda ito sa walang lamang string o di-wastong hanay ng port, pinapayagan ang WebRTC na gamitin ang anumang available na lokal na UDP port.</translation> <translation id="5290940294294002042">Tumukoy ng listahan ng mga plugin na maaaring paganahin o hindi paganahin ng user</translation> -<translation id="5301787427319106606"> - TANDAAN: Pang-eksperimento ang patakarang ito at maaari itong makasira sa functionality! - Mainam na suriin ang setting ng patakarang IsolateOrigins para - masulit ang pag-isolate at pagkakaroon ng limitadong epekto sa mga user, sa pamamagitan ng paggamit sa - IsolateOrigins nang may listahan ng mga site na gusto mong i-isolate. Ina-isolate ng - setting na ito na SitePerProcess ang lahat ng site. - Kung ie-enable ang patakaran, magpapatakbo ang bawat site ng sarili nitong proseso. - Kung idi-disable ang patakaran, magkakaroon ng bisa ang logic ng pamamahala sa proseso ng Pag-isolate ayon sa Site. - Kung hindi iko-configure ang patakaran, mababago ng user ang setting na ito. - Sa <ph name="PRODUCT_OS_NAME" />, inirerekomendang itakda rin ang patakaran ng device na <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> sa parehong value. Kung hindi magtutugma ang mga value na tinukoy ng dalawang patakaran, maaaring magkaroon ng pagkaantala sa pagpasok sa isang session ng user habang inilalapat ang value na tinukoy ng patakaran ng user. - </translation> <translation id="5302612588919538756">Hindi na ginagamit ang patakarang ito, pag-isipang gamitin na lang ang SyncDisabled. Pinapayagan ang user na mag-sign in sa <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 2a1219de..4fef08b 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -58,15 +58,6 @@ Lorsqu'elle est appliquée, toutes les imprimantes sont mises à la disposition de l'utilisateur excepté pour les ID répertoriés dans cette règle. </translation> -<translation id="1181881366217399113"> - REMARQUE : Il s'agit d'une règle expérimentale qui peut bloquer certaines fonctionnalités. - Si cette règle est activée, chacune des origines définies et répertoriées dans une liste d'éléments séparés par des virgules - exécute son propre processus. Elle isole également les origines par sous-domaines. Par exemple, si vous indiquez - "https://example.com/", https://foo.example.com/ est également isolé en tant que partie du site https://example.com/. - Si cette règle est désactivée, la logique de gestion du processus d'isolation par site prend effet. - Si cette règle n'est pas configurée, l'utilisateur peut modifier ce paramètre. - Pour <ph name="PRODUCT_OS_NAME" />, il est recommandé de définir également la règle relative aux appareils <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> sur la même valeur. Si les valeurs spécifiées par les deux règles sont différentes, un retard peut se produire lors de l'accès à une session utilisateur pendant que la valeur spécifiée par la règle relative aux utilisateurs est appliquée. - </translation> <translation id="1198465924256827162">Fréquence d'envoi des informations sur l'état de l'appareil, en millisecondes. Si cette règle n'est pas définie, le délai par défaut entre deux transmissions @@ -696,17 +687,6 @@ La valeur de cette règle doit être indiquée en millisecondes. Les valeurs doivent être inférieures ou égales au délai d'arrêt de l'écran (le cas échéant) et au délai d'inactivité.</translation> <translation id="2987155890997901449">Activer ARC</translation> <translation id="2987227569419001736">Contrôler l'utilisation de l'API Web Bluetooth</translation> -<translation id="2998886474614739865"> - REMARQUE : Il s'agit d'une règle expérimentale qui peut bloquer certaines fonctionnalités. - Cette règle s'applique à l'écran de connexion. Veuillez également consulter la règle <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> qui s'applique à la session utilisateur. Nous vous recommandons de définir les deux règles sur les mêmes valeurs. Si les valeurs sont différentes, un retard peut être constaté lors de l'accès à une session utilisateur du fait de l'application de la valeur spécifiée par la règle relative aux utilisateurs. - Si cette règle est activée, chacune des origines définies et répertoriées - dans une liste d'éléments séparés par des virgules exécute son propre - processus. Elle isole également les origines par sous-domaines. Par - exemple, si vous indiquez "https://example.com/", "https://foo.example.com/" - est également isolé en tant que partie du site "https://example.com/". - Si cette règle est désactivée, la logique préliminaire de gestion du processus d'isolation de site prend effet. - Si cette règle n'est pas configurée, les paramètres d'isolation de site par défaut de la plate-forme sont utilisés pour l'écran de connexion. - </translation> <translation id="3016255526521614822">Les applications de prise de note ajoutées à la liste blanche sont autorisées sur l'écran de verrouillage de <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Nombre de versions intermédiaires autorisées pour le rollback</translation> <translation id="3030000825273123558">Activer la génération de rapports sur les statistiques</translation> @@ -816,17 +796,6 @@ Si cette règle est définie sur une chaîne non vide, cette chaîne devient le nom de la destination <ph name="PRODUCT_NAME" />. Sinon, le nom de la destination est le nom de l'appareil. Si cette règle n'est pas définie, le nom de la destination est celui de l'appareil, et le propriétaire de l'appareil (ou un utilisateur du domaine gérant l'appareil) peut le modifier. Le nom est limité à 24 caractères.</translation> <translation id="3381968327636295719">Utiliser le navigateur hôte par défaut</translation> -<translation id="3386001018488754001"> - REMARQUE : Il s'agit d'une règle expérimentale qui peut bloquer certaines fonctionnalités. - Cette règle s'applique à l'écran de connexion. Veuillez également consulter la règle <ph name="SITE_PER_PROCESS_POLICY_NAME" /> qui s'applique à la session utilisateur. Nous vous recommandons de définir les deux règles sur les mêmes valeurs. Si les valeurs sont différentes, un retard peut être constaté lors de l'accès à une session utilisateur du fait de l'application de la valeur spécifiée par la règle relative aux utilisateurs. - Nous vous conseillons d'examiner le paramètre de la règle IsolateOrigins - pour obtenir le meilleur résultat, c'est-à-dire l'isolation avec un impact limité - sur les utilisateurs, et d'utiliser IsolateOrigins avec une liste des sites que - vous souhaitez isoler. Le paramètre SitePerProcess isole tous les sites. - Si cette règle est activée, chaque site exécute son propre processus. - Si elle est désactivée, la logique de gestion du processus d'isolation par site prend effet. - Si elle n'est pas configurée, l'utilisateur peut modifier ce paramètre. - </translation> <translation id="3395348522300156660">Indique les imprimantes qu'un utilisateur peut employer. Cette règle est utilisée uniquement si <ph name="PRINTERS_WHITELIST" /> est sélectionné pour <ph name="DEVICE_PRINTERS_ACCESS_MODE" />. @@ -1459,17 +1428,6 @@ Si cette règle n'est pas définie, ou si elle est définie sur la chaîne vide ou sur une portée de port non valide, WebRTC peut utiliser n'importe quel port UDP local disponible.</translation> <translation id="5290940294294002042">Répertorier les plug-ins pouvant être activés ou désactivés par l'utilisateur</translation> -<translation id="5301787427319106606"> - REMARQUE : Il s'agit d'une règle expérimentale qui peut bloquer certaines fonctionnalités. - Nous vous conseillons d'examiner le paramètre de la règle IsolateOrigins - pour obtenir le meilleur résultat, c'est-à-dire l'isolation avec un impact limité - sur les utilisateurs, et d'utiliser IsolateOrigins avec une liste des sites que - vous souhaitez isoler. Le paramètre SitePerProcess isole tous les sites. - Si cette règle est activée, chaque site exécute son propre processus. - Si elle est désactivée, la logique de gestion du processus d'isolation par site prend effet. - Si elle n'est pas configurée, l'utilisateur peut modifier ce paramètre. - Pour <ph name="PRODUCT_OS_NAME" />, il est recommandé de définir également la règle relative aux appareils <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> sur la même valeur. Si les valeurs spécifiées par les deux règles sont différentes, un retard peut être constaté lors de l'accès à une session utilisateur du fait de l'application de la valeur spécifiée par la règle relative aux utilisateurs. - </translation> <translation id="5302612588919538756">Cette règle est abandonnée. Veuillez utiliser SyncDisabled à la place. Permet à l'utilisateur de se connecter à <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb index 919c7e57..4e70d47a 100644 --- a/components/policy/resources/policy_templates_gu.xtb +++ b/components/policy/resources/policy_templates_gu.xtb
@@ -59,18 +59,6 @@ જો આ નીતિનો ઉપયોગ કરવામાં આવ્યો હોય, તો આ નીતિમાં સૂચિબદ્ધ કરવામાં આવેલ ID સિવાયના બધા પ્રિન્ટર વપરાશકર્તાને પૂરા પાડવામાં આવે છે. </translation> -<translation id="1181881366217399113"> - નોંધ: આ નીતિ પ્રયોગાત્મક છે અને તે કદાચ કાર્યપ્રણાલીને વેરવિખેર કરી શકે છે! - જો આ નીતિ ચાલુ કરવામાં આવશે, તો અલ્પવિરામથી છૂટી પાડેલી - સૂચિમાંની જણાવેલ ઑરિજિનની દરેક તેની પોતાની પ્રક્રિયામાં ચાલશે. આનાથી સબડોમેન - અનુસાર જણાવાયેલ ઑરિજિન પણ આઇસોલેટ થશે; દા.ત. ઉલ્લેખિત https://example.com\ - ના કારણે https://foo.example.com/ પણ https://example.com/ સાઇટના એક ભાગ તરીકે - આઇસોલેટ થશે. - જો આ નીતિ બંધ કરવામાં આવશે, તો સાઇટ દીઠ આઇસોલેશન પ્રક્રિયા મેનેજમેન્ટ તર્કનો અમલ - થશે. - જો આ નીતિ ગોઠવવામાં આવી ન હોય, તો વપરાશકર્તા આ સેટિંગ બદલી શકશે. - <ph name="PRODUCT_OS_NAME" /> પર, ભલામણ કરવામાં આવી છે કે <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> ઉપકરણ નીતિને પણ સમાન મૂલ્ય પર સેટ કરો. જો બન્ને નીતિઓ દ્વારા નિર્દિષ્ટ મૂલ્યો મેળ નહીં ખાય, તો વપરાશકર્તા સત્રમાં દાખલ થતા દરમ્યાન વપરાશકર્તા નીતિ દ્વારા નિર્દિષ્ટ મૂલ્ય લાગુ કરવામાં આવે ત્યારે વિલંબ થઈ શકે છે. - </translation> <translation id="1194005076170619046">જો સક્ષમ કરેલ હોય, તો એક મોટું, લાલ લૉગઆઉટ બટન સિસ્ટમ ટ્રેમાં દેખાય છે જ્યારે સત્ર સક્રિય હોય અને સ્ક્રીન લૉક કરેલી ન હોય. જો અક્ષમ કરેલ હોય અથવા ઉલ્લેખિત ન હોય, તો મોટું, લાલ લૉગઆઉટ બટન સિસ્ટમ ટ્રેમાં દેખાતું નથી.</translation> @@ -760,18 +748,6 @@ જ્યારે આ નીતિ સેટ કરેલ ન હોય, ત્યારે વધુ-ચોક્કસ નીતિઓના વર્તન પર પ્રભાવ પડતો નથી.</translation> <translation id="2987155890997901449">ARC સક્ષમ કરે છે</translation> <translation id="2987227569419001736">વેબ Bluetooth API નો ઉપયોગ નિયંત્રિત કરો</translation> -<translation id="2998886474614739865"> - નોંધ: આ નીતિ પ્રયોગાત્મક છે અને તે કદાચ કાર્યપ્રણાલીને વેરવિખેર કરી શકે છે! - આ નીતિ સાઇન-ઇન સ્ક્રીન પર લાગુ થાય છે. કૃપા કરીને <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> નીતિ પણ જુઓ, જે વપરાશકર્તા સત્ર પર લાગુ થાય છે. બન્ને નીતિઓને સમાન મૂલ્ય પર સેટ કરવાની ભલામણ કરવામાં આવે છે. જો મૂલ્યો મેળ નહીં ખાય, તો વપરાશકર્તા સત્રમાં દાખલ થતા દરમ્યાન વપરાશકર્તા નીતિ દ્વારા નિર્દિષ્ટ મૂલ્ય લાગુ કરવામાં આવે ત્યારે વિલંબ થઈ શકે છે. - જો આ નીતિ ચાલુ કરવામાં આવશે, તો અલ્પવિરામથી છૂટી પાડેલી - સૂચિમાંની જણાવેલ ઑરિજિનની દરેક તેની પોતાની પ્રક્રિયામાં ચાલશે. આનાથી સબડોમેન - અનુસાર જણાવાયેલ ઑરિજિન પણ આઇસોલેટ થશે; દા.ત. ઉલ્લેખિત https://example.com\ - ના કારણે https://foo.example.com/ પણ https://example.com/ સાઇટના એક ભાગ તરીકે - આઇસોલેટ થશે. - જો આ નીતિ બંધ કરવામાં આવશે, તો સાઇટ દીઠ આઇસોલેશન પ્રક્રિયા મેનેજમેન્ટ તર્કનો અમલ - થશે. - જો આ નીતિ ગોઠવવામાં ન આવી હોય, તો સાઇન-ઇન સ્ક્રીન માટે પ્લૅટફૉર્મ ડિફૉલ્ટ સાઇટ આઇસોલેશન સેટિંગનો ઉપયોગ કરવામાં આવશે. - </translation> <translation id="3016255526521614822">વ્હાઇટલિસ્ટ નોંધ લેતી ઍપની <ph name="PRODUCT_OS_NAME" />ના લૉક સ્ક્રીન પર મંજૂરી છે</translation> <translation id="3021562480854470924">રોલબૅક માટે મંજૂરી આપવામાં આવેલ માઇલસ્ટોનની સંખ્યા</translation> <translation id="3030000825273123558">મેટ્રિક્સ રિપોર્ટિંગને સક્ષમ કરે છે</translation> @@ -888,18 +864,6 @@ જો આ નીતિ ખાલી ન હોય તેવી સ્ટ્રિંગ પર સેટ કરેલી હશે, તો તે સ્ટ્રિંગનો ઉપયોગ <ph name="PRODUCT_NAME" /> ગંતવ્યના નામ તરીકે થશે. અન્યથા, ગંતવ્યનું નામ ઉપકરણનું નામ હશે. જો આ નીતિ સેટ કરેલી નહીં હોય, તો ગંતવ્યનું નામ ઉપકરણનું નામ હશે અને તે ઉપકરણના માલિકને (અથવા ઉપકરણ મેનેજ કરતા ડોમેનના વપરાશકર્તાને) તેને બદલવાની મંજૂરી હશે. નામ 24 અક્ષરો સુધી મર્યાદિત હોય છે.</translation> <translation id="3381968327636295719">ડિફૉલ્ટ રૂપે હોસ્ટ બ્રાઉઝરનો ઉપયોગ કરો</translation> -<translation id="3386001018488754001"> - નોંધ: આ નીતિ પ્રયોગાત્મક છે અને તે કદાચ કાર્યપ્રણાલીને વેરવિખેર કરી શકે છે! - આ નીતિ સાઇન-ઇન સ્ક્રીન પર લાગુ થાય છે. કૃપા કરીને <ph name="SITE_PER_PROCESS_POLICY_NAME" /> નીતિ પણ જુઓ, જે વપરાશકર્તા સત્ર પર લાગુ થાય છે. બન્ને નીતિને સમાન મૂલ્ય પર સેટ કરવા માટેની ભલામણ કરવામાં આવે છે. જો મૂલ્યો મેળ નહીં ખાય, તો વપરાશકર્તા સત્રમાં દાખલ થતા દરમ્યાન વપરાશકર્તા નીતિ દ્વારા નિર્દિષ્ટ મૂલ્ય લાગુ કરવામાં આવે ત્યારે વિલંબ થઈ શકે છે. - તમે જેને આઇસોલેટ કરવા ઈચ્છો છો તે સાઇટોની સૂચિ વડે IsolateOriginsનો ઉપયોગ કરીને - વપરાશકર્તા માટે આઇસોલેશન અને મર્યાદિત અસર એમ બન્નેમાં સર્વોત્તમ મેળવવા માટે - IsolateOriginsની નીતિ સેટિંગ જોઈ શકો છો. આ SitePerProcess સેટિંગ બધી સાઇટને - આઇસોલેટ કરે છે. - જો આ નીતિ ચાલુ કરવામાં આવશે, તો દરેક સાઇટ તેની પોતાની પ્રક્રિયામાં ચાલશે. - જો આ નીતિ બંધ કરવામાં આવશે, તો સાઇટ દીઠ આઇસોલેશન પ્રક્રિયા મેનેજમેન્ટ તર્કનો અમલ - થશે. - જો આ નીતિ ગોઠવવામાં ન આવી હોય, તો વપરાશકર્તા આ સેટિંગ બદલી શકશે. - </translation> <translation id="3395348522300156660">વપરાશકર્તા ઉપયોગમાં લઈ શકે તે પ્રિન્ટરને ઉલ્લેખિત કરે છે. જો <ph name="PRINTERS_WHITELIST" />ને <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> માટે પસંદ કરી હોય, તો જ આ નીતિનો ઉપયોગ કરવામાં આવે છે @@ -1641,18 +1605,6 @@ જો નીતિ સેટ કરેલ નથી અથવા જો તે ખાલી સ્ટ્રિંગ અથવા અમાન્ય પોર્ટ શ્રેણી પર સેટ કરેલ હોય, તો WebRTC ને કોઈપણ ઉપલબ્ધ સ્થાનિક UDP પોર્ટને ઉપયોગમાં લેવાની મંજૂરી આપવામાં આવે છે.</translation> <translation id="5290940294294002042">પ્લગિંસની તે સૂચિનો ઉલ્લેખ કરો કે વપરાશાકર્તા જેને સક્ષમ અથવા અક્ષમ કરી શકે</translation> -<translation id="5301787427319106606"> - નોંધ: આ નીતિ પ્રયોગાત્મક છે અને તે કદાચ કાર્યપ્રણાલીને વેરવિખેર કરી શકે છે! - તમે જેને આઇસોલેટ કરવા ઈચ્છો છો તે સાઇટોની સૂચિ વડે IsolateOriginsનો ઉપયોગ કરીને - વપરાશકર્તા માટે આઇસોલેશન અને મર્યાદિત અસર એમ બન્નેમાં સર્વોત્તમ મેળવવા માટે - IsolateOriginsની નીતિ સેટિંગ જોઈ શકો છો. આ SitePerProcess સેટિંગ બધી સાઇટને - આઇસોલેટ કરે છે. - જો આ નીતિ ચાલુ કરવામાં આવશે, તો દરેક સાઇટ તેની પોતાની પ્રક્રિયામાં ચાલશે. - જો આ નીતિ બંધ કરવામાં આવશે, તો સાઇટ દીઠ આઇસોલેશન પ્રક્રિયા મેનેજમેન્ટ તર્કનો અમલ - થશે. - જો આ નીતિ ગોઠવવામાં આવી ન હોય, તો વપરાશકર્તા આ સેટિંગ બદલી શકશે. - <ph name="PRODUCT_OS_NAME" /> પર, ભલામણ કરવામાં આવી છે કે <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> ઉપકરણ નીતિને પણ સમાન મૂલ્ય પર સેટ કરો. જો બન્ને નીતિઓ દ્વારા નિર્દિષ્ટ મૂલ્યો મેળ નહીં ખાય, તો વપરાશકર્તા સત્રમાં દાખલ થતા દરમ્યાન વપરાશકર્તા નીતિ દ્વારા નિર્દિષ્ટ મૂલ્ય લાગુ કરવામાં આવે ત્યારે વિલંબ થઈ શકે છે. - </translation> <translation id="5302612588919538756">આ નીતિ ટાળવામાં આવી છે, તેને બદલે SyncDisabled નો ઉપયોગ કરવાનું ધ્યાનમાં લો. વપરાશકર્તાને <ph name="PRODUCT_NAME" /> પર સાઇન ઇન કરવાની મંજૂરી આપે છે.
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index b177db98..3351b61 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -58,17 +58,6 @@ अगर इस नीति का इस्तेमाल किया जाता है, तो उपयोगकर्ता को इस नीति की सूची में शामिल आईडी को छोड़कर सभी प्रिंटर उपलब्ध कराए जाते हैं. </translation> -<translation id="1181881366217399113"> - नोट: यह नीति प्रयोग के लिए है और कार्यक्षमता में रुकावट पैदा कर सकती है! - अगर नीति चालू होती है, तो कॉमा-सेपरेटेड लिस्ट में बताया गया हर - मूल उसकी अपनी प्रक्रिया में चलेगा. इससे उप डोमेन के अनुसार बताए गए - मूल भी आइसोलेट होंगे; उदाहरण: बताए गए https://example.com/ की - वजह से https://foo.example.com/ भी https://example.com/ - साइट के भाग के रूप में आइसोलेट हो जाएगा. - अगर नीति बंद होती है, तो प्रति-साइट आइसोलेशन प्रक्रिया प्रबंधन का तर्क प्रभावी होगा. - अगर नीति कॉन्फ़िगर नहीं की जाती है, तो उपयोगकर्ता इस सेटिंग को बदल सकेगा. - <ph name="PRODUCT_OS_NAME" /> पर, <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> डिवाइस नीति को भी उसी मान पर सेट करने का सुझाव दिया जाता है. अगर दोनों नीतियों में बताए गए मानों का मिलान नहीं होता है, तो उपयोगकर्ता नीति में बताया गया मान लागू किए जाने के दौरान उपयोगकर्ता सत्र शुरू करते समय देरी हो सकती है. - </translation> <translation id="1198465924256827162">डिवाइस स्थिति अपलोड भेजना कितने मिलीसेकंड में दोहराया जाता है. यदि पॉलिसी सेट नहीं की गई हो, तो डिफ़ॉल्ट आवृत्ति 3 घंटे की होती है. न्यूनतम @@ -684,17 +673,6 @@ नीति का मान मिलीसेकंड में निर्दिष्ट किया जाना चाहिए. मानों को स्क्रीन बंद विलंब (यदि सेट हो) और प्रयोग में नहीं विलंब से कम या उसके बराबर होने के लिए क्लैम्प किया जाता है.</translation> <translation id="2987155890997901449">ARC सक्षम करें</translation> <translation id="2987227569419001736">वेब ब्लूटूथ API के उपयोग को नियंत्रित करें</translation> -<translation id="2998886474614739865"> - नोट: यह नीति प्रयोग के लिए है और कार्यक्षमता में रुकावट पैदा कर सकती है! - यह नीति साइन-इन स्क्रीन पर लागू होती है. कृपया <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> नीति भी देखें जो उपयोगकर्ता सत्र पर लागू होती है. दोनों नीतियों को समान मान पर सेट करने का सुझाव दिया जाता है. अगर मान का मिलान नहीं होता है, तो उपयोगकर्ता नीति में बताया गया मान लागू किए जाने के दौरान उपयोगकर्ता सत्र शुरू करते समय देरी हो सकती है. - अगर नीति चालू होती है, तो कॉमा के ज़रिए अलग की गई सूची - में बताया गया हर मूल उसकी अपनी प्रक्रिया में चलेगा. यह उप डोमेन के अनुसार - बताए गए मूल को भी आइसोलेट करेगी; उदाहरण: बताए गए https://example.com/ - की वजह से https://foo.example.com/ भी https://example.com/ साइट - के भाग के रूप में आइसोलेट हो जाएगा. - अगर नीति बंद होती है, तो प्रति-साइट आइसोलेशन प्रक्रिया प्रबंधन का तर्क प्रभावी होगा. - अगर नीति कॉन्फ़िगर नहीं की जाती है, तो साइन-इन स्क्रीन के लिए प्लैटफ़ॉर्म की डिफ़ॉल्ट साइट आइसोलेशन सेटिंग का इस्तेमाल किया जाएगा. - </translation> <translation id="3016255526521614822">श्वेतसूची में शामिल नोट लेने वाले ऐप्लिकेशन की <ph name="PRODUCT_OS_NAME" /> लॉक स्क्रीन पर अनुमति है</translation> <translation id="3021562480854470924">उपलब्धियों के रोलबैक की मंज़ूर की गई संख्या</translation> <translation id="3030000825273123558">मेट्रिक रिपोर्ट करना सक्षम करें</translation> @@ -802,17 +780,6 @@ अगर इस नीति को खाली नहीं रहने वाली स्ट्रिंग पर सेट किया जाता है, तो उस स्ट्रिंग का उपयोग <ph name="PRODUCT_NAME" /> गंतव्य के नाम के रूप में किया जाएगा. ऐसा नहीं होने पर, डिवाइस का नाम ही गंतव्य नाम होगा. अगर यह नीति सेट नहीं की जाती है, तो डिवाइस का नाम ही गंतव्य नाम होगा और डिवाइस का मालिक (या डिवाइस का प्रबंधन करने वाले डोमेन का उपयोगकर्ता) उसे बदल सकेगा. नाम में 24 वर्ण ही हो सकते हैं.</translation> <translation id="3381968327636295719">डिफ़ॉल्ट रूप से होस्ट ब्राउज़र का उपयोग करें</translation> -<translation id="3386001018488754001"> - नोट: यह नीति प्रयोग के लिए है और कार्यक्षमता में रुकावट पैदा कर सकती है! - यह नीति साइन-इन स्क्रीन पर लागू होती है. कृपया <ph name="SITE_PER_PROCESS_POLICY_NAME" /> नीति भी देखें जो उपयोगकर्ता सत्र पर लागू होती है. दोनों नीतियों को समान मान पर सेट करने का सुझाव दिया जाता है. अगर मान का मिलान नहीं होता है, तो उपयोगकर्ता नीति में बताया गया मान लागू किए जाने के दौरान उपयोगकर्ता सत्र शुरू करते समय देरी हो सकती है. - हो सकता है कि आप IsolateOrigins नीति की सेटिंग पर नज़र डालना चाहें, ताकि जिन साइटों को - आप आइसोलेट करना चाहते हैं, उनकी सूची वाली IsolateOrigins का इस्तेमाल करके आइसोलेशन - और उपयोगकर्ताओं के लिए सीमित प्रभाव, इन दोनों उपायों का सबसे अच्छा इस्तेमाल कर सकें. - यह SitePerProcess सेटिंग सभी साइटों को आइसोलेट कर देती है. - अगर नीति चालू होती है, तो हर साइट उसकी अपनी प्रक्रिया में चलेगी. - अगर नीति बंद होती है, तो प्रति-साइट आइसोलेशन प्रक्रिया प्रबंधन का तर्क प्रभावी होगा. - अगर नीति कॉन्फ़िगर नहीं की जाती है, तो उपयोगकर्ता इस सेटिंग को बदल सकेगा. - </translation> <translation id="3395348522300156660">उन प्रिंटर के बारे में बताती है जिनका इस्तेमाल कोई उपयोगकर्ता कर सकता है. इस नीति का इस्तेमाल तभी किया जाता है अगर <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> के लिए <ph name="PRINTERS_WHITELIST" /> को चुना गया हो @@ -1439,17 +1406,6 @@ यदि नीति सेट नहीं की हुई है या यदि वह खाली स्ट्रिंग पर या किसी अमान्य पोर्ट श्रेणी पर सेट है, तो WebRTC को किसी भी उपलब्ध स्थानीय UDP पोर्ट का उपयोग करने की अनुमति होती है.</translation> <translation id="5290940294294002042">प्लग इन की सूची निर्दिष्ट करें जिन्हें उपयोगकर्ता सक्षम या अक्षम कर सकते हैं</translation> -<translation id="5301787427319106606"> - नोट: यह नीति प्रयोग के लिए है और कार्यक्षमता में रुकावट पैदा कर सकती है! - हो सकता है कि आप IsolateOrigins नीति की सेटिंग पर नज़र डालना चाहें, ताकि जिन साइटों को - आप आइसोलेट करना चाहते हैं, उनकी सूची वाली IsolateOrigins का इस्तेमाल करके आइसोलेशन - और उपयोगकर्ताओं के लिए सीमित प्रभाव, इन दोनों उपायों का सबसे अच्छा इस्तेमाल कर सकें. - यह SitePerProcess सेटिंग सभी साइटों को आइसोलेट कर देती है. - अगर नीति चालू होती है, तो हर साइट उसकी अपनी प्रक्रिया में चलेगी. - अगर नीति बंद होती है, तो प्रति-साइट आइसोलेशन प्रक्रिया प्रबंधन का तर्क प्रभावी होगा. - अगर नीति कॉन्फ़िगर नहीं की जाती है, तो उपयोगकर्ता इस सेटिंग को बदल सकेगा. - <ph name="PRODUCT_OS_NAME" /> पर, <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> डिवाइस नीति को भी उसी मान पर सेट करने का सुझाव दिया जाता है. अगर दोनों नीतियों में बताए गए मानों का मिलान नहीं होता है, तो उपयोगकर्ता नीति में बताया गया मान लागू किए जाने के दौरान उपयोगकर्ता सत्र शुरू करते समय देरी हो सकती है. - </translation> <translation id="5302612588919538756">इस पॉलिसी को बहिष्कृत किया गया है, इसके स्थान पर SyncDisabled का उपयोग करने पर विचार करें. उपयोगकर्ता को <ph name="PRODUCT_NAME" /> में प्रवेश करने की अनुमति देती है.
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb index 32025fc..bad5eb5 100644 --- a/components/policy/resources/policy_templates_hr.xtb +++ b/components/policy/resources/policy_templates_hr.xtb
@@ -58,17 +58,6 @@ Ako se to pravilo upotrebljava, korisniku se pružaju svi pisači osim pisača s ID-ovima navedenima u pravilu. </translation> -<translation id="1181881366217399113"> - NAPOMENA: pravilo je eksperimentalno i može poremetiti funkciju! - Ako se to pravilo omogući, svaki od navedenih izvora na popisu - odijeljenom zarezima izvodit će se u svojem procesu. Time će se također - izolirati izvori navedeni prema poddomenama, npr. ako se navede - https://example.com/, izolirat će se i https://foo.example.com/ kao dio - web-lokacije https://example.com/. - Ako se to pravilo onemogući, djelovat će logika upravljanja procesom izolacije po web-lokaciji. - Ako se pravilo ne konfigurira, korisnik će moći promijeniti tu postavku. - Preporučujemo da u sustavu <ph name="PRODUCT_OS_NAME" /> i pravilo za uređaje <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> postavite na istu vrijednost. Ako se vrijednosti navedene u ta dva pravila ne podudaraju, može doći do čekanja prilikom otvaranja korisničke sesije dok se ne primijeni vrijednost koja je određena korisničkim pravilom. - </translation> <translation id="1198465924256827162">Učestalost slanja prijenosa statusa uređaja u milisekundama. Ako se to pravilo ne postavi, zadana učestalost iznosi 3 sata. Minimalna @@ -664,17 +653,6 @@ Vrijednost pravila treba navesti u milisekundama. Vrijednosti su ograničene na vrijeme kraće od odgode isključivanja zaslona i odgode neaktivnosti ili jednako tom vremenu (ako je postavljeno).</translation> <translation id="2987155890997901449">Omogući ARC</translation> <translation id="2987227569419001736">Upravljanje upotrebom API-ja Web Bluetooth</translation> -<translation id="2998886474614739865"> - NAPOMENA: pravilo je eksperimentalno i može poremetiti funkciju! - To se pravilo primjenjuje na zaslon za prijavu. Pogledajte i pravilo <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> koje se primjenjuje na korisničku sesiju. Preporučujemo da oba pravila postavite na istu vrijednost. Ako se vrijednosti ne podudaraju, može doći do čekanja prilikom otvaranja korisničke sesije dok se ne primijeni vrijednost koja je određena korisničkim pravilom. - Ako se to pravilo omogući, svaki od navedenih izvora na - popisu odijeljenom zarezima izvodit će se u svojem procesu. Time će se - također izolirati izvori navedeni prema poddomenama, npr. ako se navede - https://example.com/, izolirat će se i https://foo.example.com/ kao dio - web-lokacije https://example.com/. - Ako se to pravilo onemogući, djelovat će logika upravljanja procesom izolacije po web-lokaciji. - Ako se to pravilo ne konfigurira, za zaslon za prijavu upotrebljavat će se zadane postavke platforme za izolaciju web-lokacija. - </translation> <translation id="3016255526521614822">Aplikacije za izradu bilježaka dopuštene na zaključanom zaslonu uređaja sa sustavom <ph name="PRODUCT_OS_NAME" /> stavi na popis dopuštenih</translation> <translation id="3021562480854470924">Broj dopuštenih prijelaznih točaka za vraćanje sustava</translation> <translation id="3030000825273123558">Omogući izvješće o metrici</translation> @@ -774,17 +752,6 @@ Ako se to pravilo postavi na niz koji nije prazan, taj će se niz upotrebljavati kao naziv odredišta za <ph name="PRODUCT_NAME" />. U suprotnom će naziv odredišta biti naziv uređaja. Ako se to pravilo ne postavi, naziv odredišta bit će naziv uređaja i vlasnik uređaja (ili korisnik s domene koja upravlja uređajem) moći će ga promijeniti. Duljina naziva ograničena je na 24 znaka.</translation> <translation id="3381968327636295719">Upotrijebi preglednik hosta prema zadanim postavkama</translation> -<translation id="3386001018488754001"> - NAPOMENA: pravilo je eksperimentalno i može poremetiti funkciju! - To se pravilo primjenjuje na zaslon za prijavu. Pogledajte i pravilo <ph name="SITE_PER_PROCESS_POLICY_NAME" /> koje se primjenjuje na korisničku sesiju. Preporučuje se postaviti oba pravila na istu vrijednost. Ako se vrijednosti ne podudaraju, može doći do čekanja prilikom otvaranja korisničke sesije dok se ne primijeni vrijednost koja je određena korisničkim pravilom. - Možda biste trebali razmisliti o postavci pravila IsolateOrigins da biste - iskoristili prednosti obje značajke, izolacije i ograničenog utjecaja za - korisnike, koristeći IsolateOrigins s popisom web-lokacija koje želite izolirati. - Ova postavka, SitePerProcess, izolira sve web-lokacije. - Ako se to pravilo omogući, svaka će se web-lokacija izvoditi u svojem procesu. - Ako se to pravilo onemogući, djelovat će logika upravljanja procesom izolacije po web-lokaciji. - Ako se pravilo ne konfigurira, korisnik će moći promijeniti tu postavku. - </translation> <translation id="3395348522300156660">Određuje pisače koje korisnik može upotrebljavati. To se pravilo upotrebljava samo ako je pravilo <ph name="PRINTERS_WHITELIST" /> odabrano za <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1385,17 +1352,6 @@ Ako se pravilo ne postavi ili se postavi na prazni niz ili nevažeći raspon priključaka, WebRTC može upotrebljavati bilo koji dostupni lokalni UDP priključak.</translation> <translation id="5290940294294002042">Odredite popis dodataka koje korisnik može omogućiti ili onemogućiti</translation> -<translation id="5301787427319106606"> - NAPOMENA: pravilo je eksperimentalno i može poremetiti funkciju! - Možda biste trebali razmisliti o postavci pravila IsolateOrigins da biste - iskoristili prednosti obje značajke, izolacije i ograničenog utjecaja za - korisnike, koristeći IsolateOrigins s popisom web-lokacija koje želite izolirati. - Ova postavka, SitePerProcess, izolira sve web-lokacije. - Ako se to pravilo omogući, svaka će se web-lokacija izvoditi u svojem procesu. - Ako se to pravilo onemogući, djelovat će logika upravljanja procesom izolacije po web-lokaciji. - Ako se to pravilo ne konfigurira, korisnik će moći promijeniti tu postavku. - Preporučujemo da na sustavu <ph name="PRODUCT_OS_NAME" /> postavite i pravilo za uređaje <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> na istu vrijednost. Ako se vrijednosti navedene u ta dva pravila ne podudaraju, može doći do čekanja prilikom otvaranja korisničke sesije dok se ne primijeni vrijednost koja je određena korisničkim pravilom. - </translation> <translation id="5302612588919538756">To je pravilo obustavljeno i umjesto njega možete upotrijebiti "SyncDisabled". Korisniku omogućuje prijavu u <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb index 81903a6..74a0b0b 100644 --- a/components/policy/resources/policy_templates_hu.xtb +++ b/components/policy/resources/policy_templates_hu.xtb
@@ -58,17 +58,6 @@ Ha használatban van a házirend, akkor a felhasználó minden nyomtatót használhat, kivéve azokat, amelyek azonosítója szerepel a házirend felsorolásában. </translation> -<translation id="1181881366217399113"> - MEGJEGYZÉS: Ez a házirend kísérleti állapotban van, és a funkciók helytelen működését okozhatja! - Ha a házirend engedélyezve van, a vesszővel tagolt listán lévő összes - megnevezett eredet a saját folyamatát futtatja. A megnevezett eredetek el is - különülnek aldomainek szerint; pl. a https://example.com/ megadásával a - https://foo.example.com/ webhely is el lesz szigetelve a - https://example.com/ webhely részeként. - Ha a házirend le van tiltva, akkor a webhelyenkénti elszigetelés folyamatkezelési logikája lép életbe. - Ha a házirend nincs konfigurálva, a felhasználó módosíthatja ezt a beállítást. - <ph name="PRODUCT_OS_NAME" /> rendszer alatt ajánlott ugyanerre az értékre beállítani a(z) <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> eszközházirendet. Ha a két házirend által meghatározott értékek nem egyeznek, az késést okozhat a felhasználói munkamenetbe való belépés során, miközben a böngésző éppen alkalmazni próbálja a felhasználói házirend által meghatározott értéket. - </translation> <translation id="1198465924256827162">Milyen gyakran küld állapotfrissítéseket az eszköz (ezredmásodpercben). Ha nem állítja be a házirendet, az alapértelmezett gyakoriság három óra. @@ -663,17 +652,6 @@ A házirend értékét ezredmásodpercben kell megadni. Az értéknek kisebbnek kell lennie a képernyő kikapcsolásának késleltetésénél (ha be van állítva) és a tétlenségi késleltetésnél.</translation> <translation id="2987155890997901449">ARC engedélyezése</translation> <translation id="2987227569419001736">A Web Bluetooth API használatának irányítása</translation> -<translation id="2998886474614739865"> - MEGJEGYZÉS: Ez a házirend kísérleti állapotban van, és a funkciók helytelen működését okozhatja! - Ez a házirend a bejelentkezési képernyőre vonatkozik. Ehhez hasonló a következő házirend, amely a felhasználói munkamenetre vonatkozik: <ph name="ISOLATE_ORIGINS_POLICY_NAME" />. Azt javasoljuk, hogy mindkét házirendet ugyanarra az értékre állítsa be. Ha az értékek nem egyeznek, az késést okozhat a felhasználói munkamenetbe való belépés során, miközben a böngésző éppen alkalmazni igyekszik a felhasználói házirend által meghatározott értéket. - Ha a házirend engedélyezve van, a vesszővel tagolt listán lévő összes - megnevezett eredet a saját folyamatát futtatja. A megnevezett eredetek el is - különülnek aldomainek szerint; pl. a https://example.com/ megadásával a - https://foo.example.com/ webhely is el lesz szigetelve a - https://example.com/ webhely részeként. - Ha a házirend le van tiltva, akkor a webhelyenkénti elszigetelés folyamatkezelési logikája lép életbe. - Ha a házirend nincs beállítva, akkor a rendszer az operációs rendszer alapértelmezett webhely-elszigetelési beállításait fogja használni a bejelentkezési képernyőn. - </translation> <translation id="3016255526521614822">A(z) <ph name="PRODUCT_OS_NAME" /> lezárási képernyőjén engedélyezett jegyzetkészítő alkalmazások engedélyezőlistára tétele</translation> <translation id="3021562480854470924">A visszaállításnál engedélyezett mérföldkövek száma</translation> <translation id="3030000825273123558">Mutatók jelentéseinek engedélyezése</translation> @@ -777,17 +755,6 @@ Ha a házirend egy nem üres karakterláncként van meghatározva, akkor a rendszer azt a karakterláncot használja a(z) <ph name="PRODUCT_NAME" /> céljának neveként. Egyébként az eszköz neve lesz a cél neve. Ha a házirend nincs beállítva, a cél neve az eszköz neve lesz, az eszköz tulajdonosának (vagy az eszközt kezelő domain felhasználójának) pedig lehetősége lesz módosítani. A név hossza legfeljebb 24 karakter lehet.</translation> <translation id="3381968327636295719">Alapértelmezés szerint használja a gazdagép böngészőjét</translation> -<translation id="3386001018488754001"> - MEGJEGYZÉS: Ez a házirend kísérleti állapotban van, és a funkciók helytelen működését okozhatja! - Ez a házirend a bejelentkezési képernyőre vonatkozik. Ehhez hasonló a következő házirend, amely a felhasználói munkamenetre vonatkozik: <ph name="SITE_PER_PROCESS_POLICY_NAME" />. Azt javasoljuk, hogy mindkét házirendet ugyanarra az értékre állítsa be. Ha az értékek nem egyeznek, az késést okozhat a felhasználói munkamenetbe való belépés során, miközben a böngésző éppen alkalmazni igyekszik a felhasználói házirend által meghatározott értéket. - Ha szeretné használni az elszigetelést, mégis kisebb hatást gyakorolna a - felhasználókra, tekintse meg az IsolateOrigins házirend beállításait, melynek - listáján az elszigetelni kívánt webhelyek vannak. Ez a beállítás, - a SitePerProcess, az összes webhelyet elszigeteli. - Ha a házirend engedélyezve van, minden webhely a saját folyamatát futtatja. - Ha a házirend le van tiltva, akkor a webhelyenkénti elszigetelés folyamatkezelési logikája lép életbe. - Ha a házirend nincs konfigurálva, a felhasználó módosíthatja ezt a beállítást. - </translation> <translation id="3395348522300156660">Meghatározza, hogy mely nyomtatókat használhatja a felhasználó. A házirend csak akkor van használatban, ha a(z) <ph name="PRINTERS_WHITELIST" /> lehetőség van kiválasztva a(z) <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> házirendnél. @@ -1376,17 +1343,6 @@ Ha az irányelvet nem állítja be, vagy üres karakterláncot, illetve érvénytelen porttartományt ad meg, akkor a WebRTC bármelyik rendelkezésre álló helyi UDP-portot használhatja.</translation> <translation id="5290940294294002042">Adja meg a felhasználó által be- vagy kikapcsolható bővítmények listáját</translation> -<translation id="5301787427319106606"> - MEGJEGYZÉS: Ez a házirend kísérleti állapotban van, és a funkciók helytelen működését okozhatja! - Ha szeretné használni az elszigetelést, mégis kisebb hatást gyakorolna a - felhasználókra, tekintse meg az IsolateOrigins házirend beállításait, melynek - listáján az elszigetelni kívánt webhelyek vannak. Ez a beállítás, - a SitePerProcess, az összes webhelyet elszigeteli. - Ha a házirend engedélyezve van, minden webhely a saját folyamatát futtatja. - Ha a házirend le van tiltva, akkor a webhelyenkénti elszigetelés folyamatkezelési logikája lép életbe. - Ha a házirend nincs konfigurálva, a felhasználó módosíthatja ezt a beállítást. - <ph name="PRODUCT_OS_NAME" /> rendszer alatt ajánlott ugyanerre az értékre beállítani a(z) <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> eszközházirendet. Ha a két házirend által meghatározott értékek nem egyeznek, az késést okozhat a felhasználói munkamenetbe való belépés során, miközben a böngésző éppen alkalmazni igyekszik a felhasználói házirend által meghatározott értéket. - </translation> <translation id="5302612588919538756">Ez a házirend elavult, használja helyette a SyncDisabled házirendet. Lehetővé teszi, hogy a felhasználó bejelentkezzen a <ph name="PRODUCT_NAME" /> termékbe.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 0169f74f..ae2abbb 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -58,17 +58,6 @@ Jika kebijakan ini digunakan, semua printer akan tersedia bagi pengguna, kecuali ID yang dicantumkan di kebijakan ini. </translation> -<translation id="1181881366217399113"> - CATATAN: Kebijakan ini bersifat eksperimental dan dapat mengganggu fungsi! - Jika kebijakan ini diaktifkan, tiap asal yang diberi nama dalam daftar yang dipisahkan - koma akan menjalankan prosesnya sendiri. Tindakan ini juga akan mengisolasi - asal yang diberi nama subdomain; mis. menentukan https://example.com/ - juga akan menyebabkan https://foo.example.com/ diisolasi sebagai bagian dari - situs https://example.com/. - Jika kebijakan ini dinonaktifkan, logika pengelolaan proses Isolasi per-Situs akan diterapkan. - Jika kebijakan ini tidak dikonfigurasi, pengguna dapat mengubah setelan ini. - Di <ph name="PRODUCT_OS_NAME" />, sebaiknya juga setel kebijakan perangkat <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> ke nilai yang sama. Jika nilai yang ditentukan oleh kedua kebijakan tersebut tidak cocok, dapat menimbulkan penundaan saat memasukkan sesi pengguna ketika nilai yang ditentukan oleh kebijakan pengguna sedang diterapkan. - </translation> <translation id="1198465924256827162">Frekuensi upload status perangkat dikirimkan, dalam milidetik. Jika kebijakan ini tidak disetel, frekuensi defaultnya adalah 3 jam. Frekuensi minimum @@ -666,17 +655,6 @@ Nilai kebijakan harus ditentukan dalam milidetik. Nilai dijepit hingga kurang dari atau setara dengan penundaan mematikan layar (jika disetel) dan penundaan waktu menganggur.</translation> <translation id="2987155890997901449">Aktifkan ARC</translation> <translation id="2987227569419001736">Mengontrol penggunaan API Bluetooth Web</translation> -<translation id="2998886474614739865"> - CATATAN: Kebijakan ini bersifat eksperimental dan mungkin mengganggu fungsi! - Kebijakan ini berlaku untuk layar login. Harap lihat juga kebijakan <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> yang berlaku untuk sesi pengguna. Sebaiknya setel kedua kebijakan ini dengan nilai yang sama. Jika nilainya tidak sama, dapat menimbulkan penundaan saat memasukkan sesi pengguna ketika nilai yang ditentukan oleh kebijakan pengguna sedang diterapkan. - Jika kebijakan ini diaktifkan, setiap asal yang diberi nama di daftar - yang dipisahkan koma akan dijalankan dalam prosesnya masing-masing. Tindakan ini juga akan mengisolasi - asal yang diberi nama oleh subdomain; misalnya, menentukan https://example.com/ juga akan - menyebabkan https://foo.example.com/ diisolasi sebagai bagian dari - situs https://example.com/. - Jika kebijakan ini dinonaktifkan, logika manajemen sebelum proses Isolasi Situs akan berlaku. - Jika kebijakan ini tidak dikonfigurasi, setelan isolasi situs default platform akan digunakan untuk layar login. - </translation> <translation id="3016255526521614822">Beri akses aplikasi pencatat yang diizinkan di layar kunci <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Jumlah rollback milestone diizinkan</translation> <translation id="3030000825273123558">Aktifkan pelaporan metrik</translation> @@ -780,17 +758,6 @@ Jika kebijakan ini disetel ke string yang tidak kosong, string tersebut akan digunakan sebagai nama tujuan <ph name="PRODUCT_NAME" />. Jika tidak, nama tujuan akan menjadi nama perangkat. Jika kebijakan ini tidak disetel, nama tujuan akan menjadi nama perangkat, dan pemilik perangkat (atau pengguna dari domain yang mengelola perangkat) akan diizinkan untuk mengubahnya. Karakter nama dibatasi hingga 24 karakter.</translation> <translation id="3381968327636295719">Gunakan browser host jika tidak diubah</translation> -<translation id="3386001018488754001"> - Catatan: Kebijakan ini bersifat eksperimental dan mungkin mengganggu fungsi! - Kebijakan ini berlaku untuk layar login. Harap lihat juga kebijakan <ph name="SITE_PER_PROCESS_POLICY_NAME" /> yang berlaku untuk sesi pengguna. Sebaiknya setel kedua kebijakan ini dengan nilai yang sama. Jika nilainya tidak sama, dapat menimbulkan penundaan saat memasukkan sesi pengguna ketika nilai yang ditentukan oleh kebijakan pengguna sedang diterapkan. - Sebaiknya lihat setelan kebijakan IsolateOrigins untuk mendapatkan yang terbaik - dari keduanya, isolasi dan dampak terbatas bagi pengguna, dengan menggunakan - IsolateOrigins yang berisi daftar situs yang ingin diisolasi. Setelan ini, - SitePerProcess, mengisolasi semua situs. - Jika kebijakan ini diaktifkan, setiap situs akan dijalankan dalam prosesnya masing-masing. - Jika ini kebijakan dinonaktifkan, logika manajemen sebelum proses Isolasi Situs akan berlaku. - Jika ini kebijakan tidak dikonfigurasi, pengguna akan dapat mengubah setelan ini. - </translation> <translation id="3395348522300156660">Menentukan printer yang dapat digunakan pengguna. Kebijakan ini hanya digunakan jika <ph name="PRINTERS_WHITELIST" /> dipilih untuk <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1385,17 +1352,6 @@ Jika kebijakan tidak disetel, atau jika disetel menjadi string kosong maupun rentang port yang tidak valid, WebRTC diizinkan untuk menggunakan port UDP lokal mana pun yang tersedia.</translation> <translation id="5290940294294002042">Tentukan daftar plugin yang dapat diaktifkan atau dinonaktifkan pengguna</translation> -<translation id="5301787427319106606"> - CATATAN: Kebijakan ini bersifat eksperimental dan mungkin mengganggu fungsi! - Sebaiknya lihat setelan kebijakan IsolateOrigins untuk mendapatkan - yang terbaik dari keduanya, isolasi dan dampak terbatas bagi pengguna, dengan menggunakan - IsolateOrigins yang berisi daftar situs yang ingin diisolasi. Setelan ini, - SitePerProcess, mengisolasi semua situs. - Jika kebijakan diaktifkan, setiap situs akan dijalankan dalam prosesnya masing-masing. - Jika kebijakan dinonaktifkan, logika manajemen sebelum proses Isolasi Situs akan berlaku. - Jika kebijakan ini tidak dikonfigurasi, pengguna dapat mengubah setelan ini. - Di <ph name="PRODUCT_OS_NAME" />, sebaiknya juga setel kebijakan perangkat <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> dengan nilai yang sama. Jika nilai yang ditentukan oleh 2 kebijakan tersebut tidak cocok, mungkin menimbulkan penundaan saat memasukkan sesi pengguna ketika nilai yang ditentukan oleh kebijakan pengguna sedang diterapkan. - </translation> <translation id="5302612588919538756">Kebijakan ini tidak digunakan lagi, pertimbangkan untuk menggunakan SyncDisabled sebagai gantinya. Mengizinkan pengguna untuk masuk ke <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 1b60a832..f811aca 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -56,16 +56,6 @@ Se viene usata questa norma, gli utenti avranno a disposizione tutte le stampanti tranne quelle i cui ID sono elencati in questa norma. </translation> -<translation id="1181881366217399113"> - NOTA: questa norma è sperimentale ed è possibile che interrompa la funzionalità. - Se la norma è attivata, ciascuna delle origini denominate all'interno di un elenco separato da virgole verrà eseguita nel proprio processo. Ciò isolerà anche - le origini dei sottodomini corrispondenti, ad es. specificando https://example.com/ si isolerà anche - https://foo.example.com/, perché fa parte del sito - https://example.com/. - Se la norma non è attivata, si attiverà la logica di gestione del processo di isolamento in base al sito. - Se la norma non è configurata, l'utente sarà in grado di modificare questa impostazione. - In <ph name="PRODUCT_OS_NAME" />, si consiglia di impostare sullo stesso valore anche la norma relativa ai dispositivi <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />. Se i valori specificati dalle due norme non corrispondono, può verificarsi un ritardo quando si accede a una sessione utente mentre viene applicato il valore specificato dalla norma relativa agli utenti. - </translation> <translation id="1198465924256827162">Consente di stabilire la frequenza di invio, in millisecondi, dei caricamenti dello stato del dispositivo. Se questa norma non viene impostata, la frequenza predefinita è pari a tre ore. La frequenza minima consentita è pari a 60 secondi.</translation> @@ -646,14 +636,6 @@ Il valore della norma deve essere specificato in millisecondi. I valori devono essere inferiori o uguali al ritardo di disattivazione dello schermo (se impostato) e al ritardo di inattività.</translation> <translation id="2987155890997901449">Attiva ARC</translation> <translation id="2987227569419001736">Controlla l'utilizzo dell'API Web Bluetooth</translation> -<translation id="2998886474614739865"> - NOTA: questa norma è sperimentale ed è possibile che interrompa la funzionalità. - Questa norma si applica alla schermata di accesso. Vedi anche la norma <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, che viene applicata alla sessione utente. È consigliabile impostare lo stesso valore per entrambe le norme. Se i valori non corrispondono, può verificarsi un ritardo quando si accede a una sessione utente mentre viene applicato il valore specificato dalla norma relativa agli utenti. - Se la norma è attivata, ciascuna delle origini denominate in un elenco separato da virgole verrà eseguita nel proprio processo. Ciò isolerà anche le origini dei sottodomini corrispondenti, ad es. specificando https://example.com/ si isolerà anche https://foo.example.com/, perché fa parte del sito - https://example.com/ site. - Se la norma non è attivata, si attiverà la logica di gestione del processo di isolamento in base al sito. - Se la norma non è configurata, si utilizzeranno le impostazioni predefinite di isolamento del sito della piattaforma per la schermata di accesso. - </translation> <translation id="3016255526521614822">Autorizza l'uso di app per scrivere note nella schermata di blocco di <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Numero di obiettivi consentiti per il rollback</translation> <translation id="3030000825273123558">Attiva rapporti sulle metriche</translation> @@ -754,14 +736,6 @@ Se questa norma viene impostata su una stringa non vuota, tale stringa verrà usata come nome della destinazione di <ph name="PRODUCT_NAME" />. In caso contrario, il nome della destinazione sarà quello del dispositivo. Se questa norma non viene impostata, il nome della destinazione sarà il nome del dispositivo, che il proprietario (o un utente del dominio che gestisce il dispositivo) potrà cambiare. Il nome può essere formato da massimo 24 caratteri.</translation> <translation id="3381968327636295719">Utilizza il browser host per impostazione predefinita</translation> -<translation id="3386001018488754001"> - NOTA: questa norma è sperimentale ed è possibile che interrompa la funzionalità. - Questa norma si applica alla schermata di accesso. Vedi anche la norma <ph name="SITE_PER_PROCESS_POLICY_NAME" />, che viene applicata alla sessione utente. È consigliabile impostare lo stesso valore per entrambe le norme. Se i valori non corrispondono, può verificarsi un ritardo quando si accede a una sessione utente mentre viene applicato il valore specificato dalla norma relativa agli utenti. - Potresti considerare l'impostazione della norma IsolateOrigins per ottenere sia l'isolamento sia un impatto limitato per gli utenti. Usa IsolateOrigins con un elenco dei siti che vuoi isolare. Questa impostazione, SitePerProcess, isola tutti i siti. - Se la norma è attivata, ciascun sito verrà eseguito nel proprio processo. - Se la norma è disattivata, verrà applicata la logica di gestione del processo di isolamento in base al sito. - Se la norma non è configurata, l'utente potrà modificare questa impostazione. - </translation> <translation id="3395348522300156660">Consente di specificare le stampanti utilizzabili dagli utenti. Questa norma viene usata soltanto se viene selezionata l'opzione <ph name="PRINTERS_WHITELIST" /> per la norma <ph name="DEVICE_PRINTERS_ACCESS_MODE" />. @@ -1342,14 +1316,6 @@ Se la norma non viene impostata oppure è impostata sulla stringa vuota o su un intervallo di porte non valido, WebRTC è autorizzato a utilizzare qualsiasi porta UDP locale disponibile.</translation> <translation id="5290940294294002042">Specifica un elenco di plug-in che l'utente può attivare o disattivare</translation> -<translation id="5301787427319106606"> - NOTA: questa norma è sperimentale ed è possibile che interrompa la funzionalità. - Potresti considerare l'impostazione della norma IsolateOrigins per ottenere sia l'isolamento sia un impatto limitato per gli utenti. Usa IsolateOrigins con un elenco dei siti che vuoi isolare. Questa impostazione, SitePerProcess, isola tutti i siti. - Se la norma è attivata, ciascun sito verrà eseguito nel proprio processo. - Se la norma non è attivata, verrà applicata la logica di gestione del processo di isolamento in base al sito. - Se la norma non è configurata, l'utente potrà modificare questa impostazione. - In <ph name="PRODUCT_OS_NAME" /> si consiglia di impostare anche la norma relativa ai dispositivi <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> sullo stesso valore. Se i valori specificati dalle due norme non corrispondono, può verificarsi un ritardo durante l'accesso a una sessione utente mentre viene applicato il valore specificato dalla norma relativa agli utenti. - </translation> <translation id="5302612588919538756">Questa norma è stata ritirata; utilizzare la norma SyncDisabled. Consente all'utente di accedere a <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb index 60a9a9d73..a2fa459 100644 --- a/components/policy/resources/policy_templates_iw.xtb +++ b/components/policy/resources/policy_templates_iw.xtb
@@ -57,15 +57,6 @@ אם המדיניות הזו בשימוש, כל המדפסות זמינות למשתמש, מלבד אלה עם המזהים שרשומים במדיניות. </translation> -<translation id="1181881366217399113"> - הערה: המדיניות הזו ניסיונית ועשויות לחול בה תקלות! - אם המדיניות מופעלת, כל אחד מהמקורות שצוינו ברשימה המופרדת באמצעות פסיקים יפעל - בתהליך משלו. ההגדרה הזו תבודד גם מקורות שהשם שלהם הוא תת-דומיין. לדוגמה: ציון - הכתובת https://example.com/ יגרום גם לבידוד של https://foo.example.com/ כחלק - מהאתר https://example.com/. - אם המדיניות מושבתת, תחול הלוגיקה של ניהול תהליך בידוד לכל אתר בנפרד. - אם המדיניות לא מוגדרת, המשתמש יוכל לשנות את ההגדרה הזו ב-<ph name="PRODUCT_OS_NAME" />. מומלץ להגדיר גם במדיניות המכשיר <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> את אותו ערך. אם בשתי הגדרות המדיניות יצוין ערך שונה, ייתכן עיכוב בכניסה לסשן של משתמש בזמן החלת הערך שצוין במדיניות המשתמש. - </translation> <translation id="1198465924256827162">תדירות השליחה של העלאות סטטוס מכשיר, באלפיות השנייה. אם מדיניות זו אינה מוגדרת, תדירות ברירת המחדל היא 3 שעות. התדירות המותרת @@ -659,16 +650,6 @@ ערך המדיניות צריך להיות באלפיות שנייה. הערכים מצומצמים כך שיהיו קטנים ממשך ההשהיה לפני מצב לא פעיל.</translation> <translation id="2987155890997901449">הפעל את ARC</translation> <translation id="2987227569419001736">שליטה על השימוש ב-Web Bluetooth API</translation> -<translation id="2998886474614739865"> - הערה: המדיניות הזו ניסיונית ועלולות להתרחש בה תקלות! - המדיניות הזו חלה על מסך הכניסה. יש לעיין גם במדיניות <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> שחלה על הסשן של המשתמש. מומלץ לקבוע את אותו ערך בשתי הגדרות המדיניות. אם הערכים יהיו שונים, ייתכן עיכוב בכניסה לסשן של משתמש כשהמערכת מחילה את הערך שצוין על-ידי מדיניות המשתמש. - אם המדיניות מופעלת, כל אחד מהמקורות שצוינו ברשימה המופרדת באמצעות פסיקים יפעל - בתהליך משלו. ההגדרה הזו תבודד גם מקורות שהשם שלהם הוא תת-דומיין. לדוגמה: ציון - הכתובת https://example.com/ יגרום גם לבידוד של https://foo.example.com/ כחלק - מהאתר https://example.com/. - אם המדיניות מושבתת, תחול הלוגיקה של ניהול תהליך בידוד לכל אתר בנפרד. - אם המדיניות לא מוגדרת, על מסך הכניסה יחולו הגדרות בידוד האתרים שנקבעו כברירת מחדל בפלטפורמה. - </translation> <translation id="3016255526521614822">הוסף לרשימת ההיתרים אפליקציות לרישום הערות שמותרות במסך הנעילה של <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">מספר הגירסאות הקודמות שאפשר לחזור אליהן</translation> <translation id="3030000825273123558">הפעל דיווח על מדדים</translation> @@ -771,16 +752,6 @@ אם במדיניות הזו הוגדרה מחרוזת שאינה ריקה, אותה מחרוזת תשמש כשם היעד של <ph name="PRODUCT_NAME" />. אחרת, שם היעד יהיה שם המכשיר. אם המדיניות הזו לא מוגדרת, שם היעד יהיה שם המכשיר, ובעל המכשיר (או משתמש מהדומיין שמנהל את המכשיר) יוכל לשנות אותו. השם מוגבל ל-24 תווים.</translation> <translation id="3381968327636295719">השתמש בדפדפן המארח כברירת מחדל</translation> -<translation id="3386001018488754001"> - הערה: המדיניות הזו ניסיונית ועלולות להתרחש בה תקלות! - המדיניות הזו חלה על מסך הכניסה. יש לעיין גם במדיניות <ph name="SITE_PER_PROCESS_POLICY_NAME" /> שחלה על הסשן של המשתמש. מומלץ לקבוע את אותו ערך בשתי הגדרות המדיניות. אם הערכים יהיו שונים, ייתכן עיכוב בכניסה לסשן של משתמש כשהמערכת מחילה את הערך שצוין על-ידי מדיניות המשתמש. - מומלץ לעיין בהגדרת המדיניות IsolateOrigins כדי ליהנות מהיתרונות של שתי האפשרויות - - בידוד והשפעה מוגבלת על משתמשים - על-ידי שימוש ב-IsolateOrigins עם רשימה של - האתרים שברצונך לבודד. ההגדרה הזו, SitePerProcess, מבודדת את כל האתרים. - אם המדיניות מופעלת, כל אתר יפעל בתהליך משלו. - אם המדיניות מושבתת, תחול הלוגיקה של ניהול תהליך בידוד לכל אתר בנפרד. - אם המדיניות לא מוגדרת, המשתמש יוכל לשנות את ההגדרה הזו. - </translation> <translation id="3395348522300156660">מציינת את המדפסות הזמינות למשתמש. המדיניות הזו מופעלת רק אם האפשרות <ph name="PRINTERS_WHITELIST" /> נבחרה בשביל <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1383,16 +1354,6 @@ אם המדיניות לא מוגדרת, או אם היא מוגדרת למחרוזת ריקה או לטווח יציאות לא חוקי, כל יציאות UDP המקומיות שזמינות מותרות לשימוש ב-WebRTC.</translation> <translation id="5290940294294002042">ציין רשימה של יישומי פלאגין שהמשתמש יכול להפעיל או להשבית</translation> -<translation id="5301787427319106606"> - הערה: המדיניות הזו ניסיונית ועלולות להתרחש בה תקלות! - מומלץ לעיין בהגדרת המדיניות IsolateOrigins כדי ליהנות מהיתרונות של שתי האפשרויות - - בידוד והשפעה מוגבלת על משתמשים - על-ידי שימוש ב-IsolateOrigins עם רשימה של - האתרים שברצונך לבודד. ההגדרה הזו, SitePerProcess, מבודדת את כל האתרים. - אם המדיניות מופעלת, כל אתר יפעל בתהליך משלו. - אם המדיניות מושבתת, תחול הלוגיקה של ניהול תהליך בידוד לכל אתר בנפרד. - אם המדיניות לא מוגדרת, המשתמש יוכל לשנות את ההגדרה הזו. - ב-<ph name="PRODUCT_OS_NAME" />, מומלץ גם לקבוע את אותו ערך במדיניות המכשיר <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. אם הערכים יהיו שונים, ייתכן עיכוב בכניסה לסשן של משתמש כשהמערכת מחילה את הערך שצוין על-ידי מדיניות המשתמש. - </translation> <translation id="5302612588919538756">מדיניות זו הוצאה משימוש, שקול להשתמש במדיניות SyncDisabled במקומה. המדיניות מאפשרת למשתמש להיכנס אל <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 1466fbd..faaa52c4 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -58,17 +58,6 @@ このポリシーが使用される場合、ユーザーはこのポリシーに指定されている ID 以外のすべてのプリンタを使用できます。 </translation> -<translation id="1181881366217399113"> - 注: このポリシーは試験運用版であり、動作に影響を及ぼす可能性があります。 - このポリシーが有効に設定されている場合は、カンマ区切りのリストで - 指定された発行元がそれぞれ独自のプロセスで実行されます。また、 - サブドメインによって指定された発行元も分離されます。たとえば、 - https://example.com/ と指定すると、https://foo.example.com/ も - https://example.com/ サイトの一部として分離されます。 - このポリシーが無効に設定されている場合は、サイトごとの分離プロセス管理のロジックが適用されます。 - このポリシーが未設定の場合、ユーザーはこの設定を変更できます。 - <ph name="PRODUCT_OS_NAME" />では、<ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> デバイス ポリシーも同じ値に設定することをおすすめします。2 つのポリシーで指定されている値が一致しない場合、ユーザー セッションの開始時にはユーザー ポリシーで指定された値が適用されますが、その際に遅延が生じる可能性があります。 - </translation> <translation id="1198465924256827162">デバイス ステータスのアップロードを送信する頻度をミリ秒単位で指定します。 このポリシーが未設定の場合は、3 時間に 1 回の頻度となります。最短で 60 秒に 1 回の頻度を指定できます。</translation> @@ -659,17 +648,6 @@ ポリシーの値はミリ秒単位で指定してください。画面がオフになるまでの時間(設定している場合)やアイドル時間より長い値は指定できません。</translation> <translation id="2987155890997901449">ARC を有効にする</translation> <translation id="2987227569419001736">Web Bluetooth API の使用を管理する</translation> -<translation id="2998886474614739865"> - 注: このポリシーは試験運用版であり、動作に影響を及ぼす可能性があります。 - このポリシーはログイン画面に適用されます。ユーザー セッションに適用される <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> ポリシーもご覧ください。両方のポリシーを同じ値に設定することをおすすめします。値が一致しない場合、ユーザー セッションの開始時にはユーザー ポリシーで指定された値が適用されますが、その際に遅延が生じる可能性があります。 - このポリシーが有効に設定されている場合は、カンマ区切りのリストで - 指定された発行元がそれぞれ独自のプロセスで実行されます。また、 - サブドメインによって指定された発行元も分離されます。たとえば、 - https://example.com/ と指定すると、https://foo.example.com/ も - https://example.com/ サイトの一部として分離されます。 - このポリシーが無効に設定されている場合は、サイトごとの分離プロセス管理のロジックが適用されます。 - このポリシーが未設定の場合、ログイン画面ではプラットフォームのデフォルトのサイト分離設定が使用されます。 - </translation> <translation id="3016255526521614822"><ph name="PRODUCT_OS_NAME" /> のロック画面で使用できるメモ作成アプリをホワイトリスト登録する</translation> <translation id="3021562480854470924">ロールバックできるマイルストーンの数</translation> <translation id="3030000825273123558">統計情報のレポート送信を有効にする</translation> @@ -773,17 +751,6 @@ このポリシーが空でない文字列に設定されている場合は、その文字列が <ph name="PRODUCT_NAME" /> のレシーバー名として使用されます。それ以外の場合、レシーバー名にはデバイス名が設定されます。このポリシーが未設定の場合、レシーバー名にはデバイス名が設定され、デバイスの所有者(またはデバイスを管理するドメインのユーザー)はその名前を変更できます。なお、名前は 24 文字以内で指定する必要があります。</translation> <translation id="3381968327636295719">ホスト ブラウザをデフォルトで使用する</translation> -<translation id="3386001018488754001"> - 注: このポリシーは試験運用版であり、動作に影響を及ぼす可能性があります。 - このポリシーはログイン画面に適用されます。ユーザー セッションに適用される <ph name="SITE_PER_PROCESS_POLICY_NAME" /> ポリシーもご覧ください。両方のポリシーを同じ値に設定することをおすすめします。値が一致しない場合、ユーザー セッションの開始時にはユーザー ポリシーで指定された値が適用されますが、その際に遅延が生じる可能性があります。 - IsolateOrigins ポリシーの設定も参照し、状況に応じて使い分けてください。 - IsolateOrigins ポリシーでは、分離するサイトのリストを指定して、 - ユーザーへの影響を限定します。この設定(SitePerProcess)では、 - すべてのサイトが分離されます。 - このポリシーが有効に設定されている場合、サイトはそれぞれ独自のプロセスで実行されます。 - このポリシーが無効に設定されている場合は、サイトごとの分離プロセス管理のロジックが適用されます。 - このポリシーが未設定の場合、ユーザーはこの設定を変更できます。 - </translation> <translation id="3395348522300156660">ユーザーに使用を許可するプリンタを指定します。 このポリシーは、<ph name="DEVICE_PRINTERS_ACCESS_MODE" /> の値に <ph name="PRINTERS_WHITELIST" /> が選択されている場合にのみ使用されます。 @@ -1377,17 +1344,6 @@ ポリシーが未設定の場合、または空の文字列や無効なポートの範囲が設定されている場合は、WebRTC は使用可能なローカルの UDP ポートを使用することができます。</translation> <translation id="5290940294294002042">ユーザーが有効または無効にできるプラグインのリストを指定する</translation> -<translation id="5301787427319106606"> - 注: このポリシーは試験運用版であり、動作に影響を及ぼす可能性があります。 - IsolateOrigins ポリシーの設定も参照し、状況に応じて使い分けてください。 - IsolateOrigins ポリシーでは、分離するサイトのリストを指定して、 - ユーザーへの影響を限定します。この設定(SitePerProcess)では、 - すべてのサイトが分離されます。 - このポリシーが有効に設定されている場合、サイトはそれぞれ独自のプロセスで実行されます。 - このポリシーが無効に設定されている場合は、サイトごとの分離プロセス管理のロジックが適用されます。 - このポリシーが未設定の場合、ユーザーはこの設定を変更できます。 - <ph name="PRODUCT_OS_NAME" /> では、<ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> デバイス ポリシーも同じ値に設定することをおすすめします。2 つのポリシーで指定されている値が一致しない場合、ユーザー セッションの開始時にはユーザー ポリシーで指定された値が適用されますが、その際に遅延が生じる可能性があります。 - </translation> <translation id="5302612588919538756">このポリシーはサポート終了となりました。代わりに SyncDisabled の使用を検討してください。 ユーザーによる <ph name="PRODUCT_NAME" /> へのログインが可能かどうかを制御します。
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb index 27aa8eb..73bdfa5 100644 --- a/components/policy/resources/policy_templates_kn.xtb +++ b/components/policy/resources/policy_templates_kn.xtb
@@ -50,14 +50,6 @@ <translation id="1160939557934457296">ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಎಚ್ಚರಿಕೆಯ ಪುಟದಿಂದ ಮುಂದುವರಿಸುವುದನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="1166377463685560145">ಬಳಕೆದಾರರು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲದ ಪ್ರಿಂಟರ್ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. <ph name="PRINTERS_BLACKLIST" /> ಅನ್ನು <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> ಗಾಗಿ ಆಯ್ಕೆ ಮಾಡಿದ್ದರೆ ಮಾತ್ರ ಈ ನೀತಿಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ಈ ನೀತಿಯನ್ನು ಬಳಸಿದರೆ, ಈ ನೀತಿಯಲ್ಲಿ ಪಟ್ಟಿಮಾಡಲಾದ ಐಡಿಗಳನ್ನು ಹೊರತುಪಡಿಸಿ ಎಲ್ಲಾ ಪ್ರಿಂಟರ್ಗಳನ್ನು ಬಳಕೆದಾರರಿಗೆ ಒದಗಿಸಲಾಗುತ್ತದೆ. </translation> -<translation id="1181881366217399113"> - ಸೂಚನೆ: ಇದು ಪ್ರಾಯೋಗಿಕ ಕಾರ್ಯನೀತಿಯಾಗಿದೆ ಮತ್ತು ಇದು ಕಾರ್ಯಾಚರಣೆಗೆ ಅಡ್ಡಿಯುಂಟುಮಾಡಬಹುದು! - -ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಅಲ್ಪವಿರಾಮಗಳಿಂದ ಬೇರ್ಪಡಿಸಿರುವ ಮತ್ತು ಪಟ್ಟಿಯಲ್ಲಿ ಹೆಸರಿಸಿರುವ ಪ್ರತಿಯೊಂದು ಮೂಲವೂ ಸಹ ತನ್ನದೇ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತದೆ. ಉಪ-ಡೊಮೇನ್ಗಳ ಮೂಲಕ ಹೆಸರಿಸಿರುವ ಮೂಲಗಳನ್ನು ಸಹ ಇದು ಪ್ರತ್ಯೇಕಿಸುತ್ತದೆ; ಉದಾ., https://example.com/ ಎಂದು ನಮೂದಿಸಿದರೆ, https://example.com/ ಸೈಟ್ನ ಭಾಗವಾಗಿ, https://foo.example.com/ ಅನ್ನು ಕೂಡಾ ಪ್ರತ್ಯೇಕಿಸಲಾಗುತ್ತದೆ. -ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಸೈಟ್ ಪ್ರಕಾರ ಪ್ರತ್ಯೇಕಿಸುವಿಕೆ ಪ್ರಕ್ರಿಯೆ ನಿರ್ವಹಣೆಯ ತರ್ಕವು ಜಾರಿಗೆ ಬರುತ್ತದೆ. -ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ, ಬಳಕೆದಾರರು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಬಹುದು. -<ph name="PRODUCT_OS_NAME" /> ನಲ್ಲಿ, ಒಂದೇ ರೀತಿಯ ಮೌಲ್ಯಕ್ಕೆ <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> ಸಾಧನದ ನೀತಿಯನ್ನು ಹೊಂದಿಸಲು ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ. ಎರಡೂ ನೀತಿಗಳಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾದ ಮೌಲ್ಯಗಳು ಹೊಂದಾಣಿಕೆಯಾಗದೇ ಇದ್ದರೆ, ನೀತಿಯಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾದ ಮೌಲ್ಯವನ್ನು ಅನ್ವಯಿಸಿದಾಗ ಬಳಕೆದಾರರ ಸೆಶನ್ ವಿಳಂಬವಾಗಬಹುದು. - </translation> <translation id="1194005076170619046">ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ, ಸೆಷನ್ ಸಕ್ರಿಯವಾಗಿರುವಾಗ ಮತ್ತು ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಆಗಿಲ್ಲದಿರುವಾಗ, ಸಿಸ್ಟಂ ಟ್ರೇನಲ್ಲಿ ಒಂದು ದೊಡ್ಡದಾದ, ಕೆಂಪು ಲಾಗ್ಔಟ್ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗುತ್ತದೆ. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದ್ದರೆ ಅಥವಾ ನಿರ್ದಿಷ್ಟಪಡಿಸಿಲ್ಲದಿದ್ದರೆ, ಸಿಸ್ಟಂ ಟ್ರೇನಲ್ಲಿ ಯಾವುದೇ ದೊಡ್ಡದಾದ, ಕೆಂಪು ಲಾಗ್ಔಟ್ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="1197437816436565375">ಪ್ರಾಕ್ಸಿ ಬಳಸುವಂತೆ ನೀವು Android ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಒತ್ತಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್ಗಳ ಉಪವರ್ಗವನ್ನು Android ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಲಭ್ಯವಾಗಿಸಲಾಗುತ್ತದೆ, ಅದನ್ನು ಅವುಗಳು ಅಂಗೀಕರಿಸಲು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆಯ್ಕೆಮಾಡಬಹುದು. ಹೆಚ್ಚಿನ ವಿವರಗಳಿಗೆ <ph name="PROXY_MODE_POLICY_NAME" /> ನೀತಿಯನ್ನು ನೋಡಿ.</translation> <translation id="1198465924256827162">ಮಿಲಿಸೆಕೆಂಡುಗಳಲ್ಲಿ, ಎಷ್ಟು ಬಾರಿ ಸಾಧನ ಸ್ಥಿತಿಯ ಅಪ್ಲೋಡ್ಗಳನ್ನು ಕಳುಹಿಸಲಾಗುತ್ತದೆ. @@ -687,13 +679,6 @@ ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದಿರುವಾಗ ಹೆಚ್ಚು-ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ನೀತಿಗಳ ವರ್ತನೆಯು ಬಾಧಿತವಾಗದೇ ಉಳಿಯುತ್ತದೆ.</translation> <translation id="2987155890997901449">ARC ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="2987227569419001736">Web ಬ್ಲೂಟೂತ್ API ನ ನಿಯಂತ್ರಣ ಬಳಕೆ</translation> -<translation id="2998886474614739865"> - ಸೂಚನೆ: ಈ ಕಾರ್ಯನೀತಿಯು ಪ್ರಾಯೋಗಿಕವಾಗಿದೆ ಮತ್ತು ಇದು ಕಾರ್ಯಾಚರಣೆಗೆ ಅಡ್ಡಿ ಉಂಟುಮಾಡಬಹುದು! - ಈ ಕಾರ್ಯನೀತಿಯು ಸೈನ್-ಇನ್ ಪರದೆಗೆ ಅನ್ವಯಿಸುತ್ತದೆ. ಬಳಕೆದಾರರ ಸೆಶನ್ಗೆ ಅನ್ವಯಿಸುವ <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> ಕಾರ್ಯನೀತಿಯನ್ನು ಸಹ ನೋಡಿ. ಎರಡೂ ಕಾರ್ಯನೀತಿಗಳನ್ನು ಒಂದೇ ಮೌಲ್ಯಕ್ಕೆ ಹೊಂದಿಸಬೇಕೆಂದು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಮೌಲ್ಯಗಳು ಹೊಂದಾಣಿಕೆಯಾಗದಿದ್ದರೆ, ಬಳಕೆದಾರ-ಸೆಶನ್ಗೆ ಪ್ರವೇಶಿಸುವಾಗ, ಬಳಕೆದಾರ ಕಾರ್ಯನೀತಿಯು ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಮೌಲ್ಯವನ್ನು ಅನ್ವಯಿಸುತ್ತಿರುವಾಗ ವಿಳಂಬ ಉಂಟಾಗಬಹುದು. - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಅಲ್ಪವಿರಾಮದಿಂದ ಪ್ರತ್ಯೇಕಿಸಿರುವ ಪಟ್ಟಿಯಲ್ಲಿನ ಹೆಸರಿಸಿರುವ ಪ್ರತಿಯೊಂದು ಮೂಲವೂ ಸಹ ತನ್ನದೇ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತದೆ. ಉಪ-ಡೊಮೇನ್ಗಳ ಮೂಲಕ ಹೆಸರಿಸಿರುವ ಮೂಲಗಳನ್ನು ಸಹ ಇದು ಪ್ರತ್ಯೇಕಿಸುತ್ತದೆ; ಉದಾ. https://example.com/ ಎಂದು ನಿರ್ದಿಷ್ಟಪಡಿಸಿದರೆ, https://example.com/ ಸೈಟ್ನ ಭಾಗವಾಗಿ https://foo.example.com/ ಅನ್ನು ಸಹ ಪ್ರತ್ಯೇಕಿಸಲಾಗುತ್ತದೆ. - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರತಿ-ಸೈಟ್ ಪ್ರತ್ಯೇಕಿಸುವ ಪ್ರಕ್ರಿಯೆಯ ನಿರ್ವಹಣಾ ತರ್ಕವು ಜಾರಿಗೆ ಬರುತ್ತದೆ. - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ, ಸೈನ್-ಇನ್ ಪರದೆಗಾಗಿ ಪ್ಲಾಟ್ಫಾರ್ಮ್ ಡಿಫಾಲ್ಟ್ ಸೈಟ್ ಪ್ರತ್ಯೇಕಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. - </translation> <translation id="3016255526521614822"><ph name="PRODUCT_OS_NAME" /> ಪರದೆ ಲಾಕ್ನಲ್ಲಿ ಶ್ವೇತಪಟ್ಟಿ ಟಿಪ್ಪಣಿ-ತೆಗೆದುಕೊಳ್ಳುವ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="3021562480854470924">ಇಷ್ಟು ಸಂಖ್ಯೆಯಷ್ಟು ಮೈಲಿಗಲ್ಲುಗಳ ಹಿಂತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="3030000825273123558">ಮಾಪನಗಳ ವರದಿಗಾರಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> @@ -800,15 +785,6 @@ <translation id="332771718998993005"><ph name="PRODUCT_NAME" /> ಗಮ್ಯಸ್ಥಾನವಾಗಿ ಜಾಹೀರಾತು ಮಾಡಿದ ಹೆಸರನ್ನು ನಿರ್ಧರಿಸುವುದು. ಈ ನೀತಿಯನ್ನು ಖಾಲಿ ಇರುವ ವಾಕ್ಯಕ್ಕೆ ಹೊಂದಿಸಿದರೆ, ಆ ವಾಕ್ಯವನ್ನು <ph name="PRODUCT_NAME" /> ಗಮ್ಯಸ್ಥಾನದ ಹೆಸರಾಗಿ ಬಳಸಲಾಗುವುದು. ಇಲ್ಲವಾದರೆ, ಗಮ್ಯಸ್ಥಾನದ ಹೆಸರು ಸಾಧನದ ಹೆಸರಾಗಿರುತ್ತದೆ. ಇಲ್ಲವಾದರೆ, ಗಮ್ಯಸ್ಥಾನದ ಹೆಸರು ಸಾಧನದ ಹೆಸರಾಗಿರುತ್ತದೆ. ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, ಗಮ್ಯಸ್ಥಾನದ ಸಾಧನದ ಹೆಸರಾಗಿರುತ್ತದೆ ಮತ್ತು ಅದನ್ನು ಸಾಧನ ಮಾಲೀಕರಿಗೆ (ಅಥವಾ ಸಾಧನವನ್ನು ನಿರ್ವಹಿಸುವ ಡೊಮೇನ್ನಿಂದ ಬಳಕೆದಾರರು) ಬದಲಾಯಿಸಲು ಅನುಮತಿಸಲಾಗುತ್ತದೆ. ಈ ಹೆಸರು 24 ಅಕ್ಷರಗಳಿಗೆ ಸೀಮಿತವಾಗಿರುತ್ತದೆ.</translation> <translation id="3381968327636295719">ಹೋಸ್ಟ್ ಬ್ರೌಸರ್ ಅನ್ನು ಡಿಫಾಲ್ಟ್ ಆಗಿ ಬಳಸಿ</translation> -<translation id="3386001018488754001"> - ಸೂಚನೆ: ಇದು ಪ್ರಾಯೋಗಿಕ ಕಾರ್ಯನೀತಿಯಾಗಿದೆ ಮತ್ತು ಇದು ಕಾರ್ಯಾಚರಣೆಗೆ ಅಡ್ಡಿ ಉಂಟುಮಾಡಬಹುದು! - ಈ ಕಾರ್ಯನೀತಿಯು ಸೈನ್-ಇನ್ ಪರದೆಗೆ ಅನ್ವಯಿಸುತ್ತದೆ. ಬಳಕೆದಾರ ಸೆಶನ್ಗೆ ಅನ್ವಯಿಸುವ <ph name="SITE_PER_PROCESS_POLICY_NAME" /> ಕಾರ್ಯನೀತಿಯನ್ನು ಸಹ ನೋಡಿ. ಎರಡೂ ಕಾರ್ಯನೀತಿಗಳನ್ನು ಒಂದೇ ಮೌಲ್ಯಕ್ಕೆ ಹೊಂದಿಸಬೇಕೆಂದು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಮೌಲ್ಯಗಳು ಹೊಂದಾಣಿಕೆಯಾಗದಿದ್ದರೆ, ಬಳಕೆದಾರ-ಸೆಶನ್ಗೆ ಪ್ರವೇಶಿಸುವಾಗ, ಬಳಕೆದಾರ ಕಾರ್ಯನೀತಿಯು ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಮೌಲ್ಯವನ್ನು ಅನ್ವಯಿಸುತ್ತಿರುವಾಗ ವಿಳಂಬ ಉಂಟಾಗಬಹುದು. - -ಪ್ರತ್ಯೇಕಿಸುವಿಕೆ ಮತ್ತು ಬಳಕೆದಾರರ ಮೇಲೆ ಸೀಮಿತ ಪರಿಣಾಮ - ಇವೆರಡರ ಲಾಭವನ್ನು ಪಡೆಯಲು, ನೀವು ಪ್ರತ್ಯೇಕಿಸಲು ಬಯಸುವ ಸೈಟ್ಗಳ ಪಟ್ಟಿಯೊಂದಿಗೆ IsolateOrigins ಅನ್ನು ಬಳಸಬಹುದು. ಇದಕ್ಕಾಗಿ ನೀವು IsolateOrigins ಕಾರ್ಯನೀತಿ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನೋಡಬಹುದು. SitePerProcess ಎಂಬ ಈ ಸೆಟ್ಟಿಂಗ್, ಎಲ್ಲಾ ಸೈಟ್ಗಳನ್ನು ಪ್ರತ್ಯೇಕಿಸುತ್ತದೆ. - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರತಿ ಸೈಟ್ ತನ್ನದೇ ಆದ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತದೆ. - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರತಿ-ಸೈಟ್ ಪ್ರತ್ಯೇಕಿಸುವಿಕೆ ಪ್ರಕ್ರಿಯೆ ನಿರ್ವಹಣೆಯ ತರ್ಕವು ಜಾರಿಗೆ ಬರುತ್ತದೆ. - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ, ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಲು ಬಳಕೆದಾರರಿಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ. - </translation> <translation id="3395348522300156660">ಬಳಕೆದಾರರು ಬಳಸಬಹುದಾದ ಪ್ರಿಂಟರ್ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. <ph name="PRINTERS_WHITELIST" /> ಅನ್ನು <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> ಗಾಗಿ ಆರಿಸಿದಾಗ ಮಾತ್ರ ಈ ನೀತಿಯು ಬಳಕೆಯಾಗುತ್ತದೆ ಈ ನೀತಿಯನ್ನು ಬಳಸಿದ್ದರೆ, ಈ ನೀತಿಯಲ್ಲಿರುವ ಮೌಲ್ಯಗಳಿಗೆ ಹೊಂದಿಕೆಯಾಗುವ ಐಡಿಗಳನ್ನು ಹೊಂದಿರುವ ಪ್ರಿಂಟರ್ಗಳು ಮಾತ್ರ ಬಳಕೆದಾರರಿಗೆ ಲಭ್ಯವಿರುತ್ತವೆ. ಐಡಿಗಳು <ph name="DEVICE_PRINTERS_POLICY" /> ನಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾದ ಫೈಲ್ನಲ್ಲಿನ ನಮೂದುಗಳಿಗೆ ಹೊಂದಿಕೆಯಾಗಬೇಕು. </translation> <translation id="3414260318408232239">ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ, ಡಿಫಾಲ್ಟ್ ಕನಿಷ್ಠ ಆವೃತ್ತಿಯಾದ TLS 1.0 ಅನ್ನು <ph name="PRODUCT_NAME" /> ಬಳಸುತ್ತದೆ. ಇಲ್ಲದಿದ್ದರೆ, ಅದನ್ನು ಈ ಕೆಳಗಿನ ಮೌಲ್ಯಗಳಲ್ಲಿ ಯಾವುದಾದರೂ ಒಂದು ಮೌಲ್ಯಕ್ಕೆ ಹೊಂದಿಸಬಹುದು: "tls1", "tls1.1" ಅಥವಾ "tls1.2". ಇದನ್ನು ಹೊಂದಿಸಿದಾಗ, ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಆವೃತ್ತಿಗಿಂತ ಹಳೆಯದಾಗಿರುವ SSL/TLS ಆವೃತ್ತಿಗಳನ್ನು <ph name="PRODUCT_NAME" /> ಬಳಸುವುದಿಲ್ಲ. ಗುರುತಿಸಲಾಗದ ಮೌಲ್ಯವನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುವುದು.</translation> @@ -1464,15 +1440,6 @@ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದರೆ ಅಥವಾ ಅದನ್ನು ಖಾಲಿ ಸ್ಟ್ರಿಂಗ್ ಅಥವಾ ಅಮಾನ್ಯ ಪೋರ್ಟ್ ಶ್ರೇಣಿಗೆ ಹೊಂದಿಸಲಾಗಿದ್ದರೆ, WebRTC ಗೆ ಯಾವುದೇ ಲಭ್ಯವಿರುವ ಸ್ಥಳೀಯ UDP ಪೋರ್ಟ್ ಬಳಸಲು ಅನುಮತಿಸಲಾಗಿರುತ್ತದೆ.</translation> <translation id="5290940294294002042">ಬಳಕೆದಾರರು ಸಕ್ರಿಯಗೊಳಿಸಬಹುದಾದ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದಾದ ಪ್ಲಗಿನ್ಗಳ ಪಟ್ಟಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ</translation> -<translation id="5301787427319106606"> - ಸೂಚನೆ: ಈ ಕಾರ್ಯನೀತಿಯು ಪ್ರಾಯೋಗಿಕವಾಗಿದೆ ಮತ್ತು ಇದು ಕಾರ್ಯಾಚರಣೆಗೆ ಅಡ್ದಿ ಉಂಟುಮಾಡಬಹುದು! - -ಪ್ರತ್ಯೇಕಿಸುವಿಕೆ ಮತ್ತು ಬಳಕೆದಾರರ ಮೇಲೆ ಸೀಮಿತ ಪರಿಣಾಮ - ಇವೆರಡರ ಲಾಭವನ್ನು ಪಡೆಯಲು, ನೀವು ಪ್ರತ್ಯೇಕಿಸಲು ಬಯಸುವ ಸೈಟ್ಗಳ ಪಟ್ಟಿಯೊಂದಿಗೆ IsolateOrigins ಅನ್ನು ಬಳಸಬಹುದು. ಇದಕ್ಕಾಗಿ ನೀವು IsolateOrigins ಕಾರ್ಯನೀತಿ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನೋಡಬಹುದು. SitePerProcess ಎಂಬ ಈ ಸೆಟ್ಟಿಂಗ್, ಎಲ್ಲಾ ಸೈಟ್ಗಳನ್ನು ಪ್ರತ್ಯೇಕಿಸುತ್ತದೆ. - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರತಿ ಸೈಟ್ ತನ್ನದೇ ಆದ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತದೆ. - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರತಿ-ಸೈಟ್ ಪ್ರತ್ಯೇಕಿಸುವಿಕೆ ಪ್ರಕ್ರಿಯೆ ನಿರ್ವಹಣೆಯ ತರ್ಕವು ಜಾರಿಗೆ ಬರುತ್ತದೆ. - ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ, ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಲು ಬಳಕೆದಾರರಿಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ. - <ph name="PRODUCT_OS_NAME" /> ನಲ್ಲಿ, <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> ಸಾಧನ ಕಾರ್ಯನೀತಿಯನ್ನು ಸಹ ಅದೇ ಮೌಲ್ಯಕ್ಕೆ ಹೊಂದಿಸಬೇಕೆಂದು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಎರಡು ಕಾರ್ಯನೀತಿಗಳು ನಿರ್ದಿಷ್ಟಪಡಿಸಿರುವ ಮೌಲ್ಯಗಳು ಹೊಂದಾಣಿಕೆಯಾಗದಿದ್ದರೆ, ಬಳಕೆದಾರ-ಸೆಶನ್ಗೆ ಪ್ರವೇಶಿಸುವಾಗ, ಬಳಕೆದಾರ ಕಾರ್ಯನೀತಿಯು ನಿರ್ದಿಷ್ಟಪಡಿಸಿರುವ ಮೌಲ್ಯವನ್ನು ಅನ್ವಯಿಸುತ್ತಿರುವಾಗ ವಿಳಂಬ ಉಂಟಾಗಬಹುದು. - </translation> <translation id="5302612588919538756">ಈ ನೀತಿಯನ್ನು ತಡೆಹಿಡಿಯಲಾಗಿದೆ, ಬದಲಿಗೆ SyncDisabled ಬಳಸಲು ಪರಿಗಣಿಸಿ. <ph name="PRODUCT_NAME" /> ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಬಳಕೆದಾರರಿಗೆ ಅನುಮತಿಸುತ್ತದೆ.
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 3dcc8296..1b01b06 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -58,17 +58,6 @@ 이 정책을 사용하면 ID가 이 정책에 명시된 프린터를 제외한 모든 프린터가 사용자에게 제공됩니다. </translation> -<translation id="1181881366217399113"> - 참고: 이 정책은 시험용으로 제공되며 기능이 손상될 수 있습니다. - 이 정책이 사용 설정되어 있으면 쉼표로 구분된 목록에서 이름이 - 지정된 각 출처는 자체 프로세스로 작동합니다. 또한 하위 도메인에 - 이름이 지정된 출처도 격리됩니다. 예를 들어 https://example.com/을 - 지정하면 https://foo.example.com/도 https://example.com/ 사이트의 - 일부로 격리됩니다. - 이 정책이 사용 중지되어 있으면 사이트별 격리 프로세스 관리 로직이 적용됩니다. - 이 정책을 설정하지 않으면 사용자가 이 설정을 변경할 수 있습니다. - <ph name="PRODUCT_OS_NAME" />에서 <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> 기기 정책을 같은 값으로 설정하는 것이 좋습니다. 두 정책을 다른 값으로 설정하면 사용자 세션을 시작할 때 지연이 발생할 수 있으며 사용자 정책으로 지정된 값이 적용됩니다. - </translation> <translation id="1198465924256827162">기기 상태 업로드가 전송되는 빈도를 밀리초로 나타냅니다. 이 정책이 설정되지 않은 경우 기본 빈도는 3시간입니다. 허용되는 @@ -688,17 +677,6 @@ 정책 값은 밀리초 단위로 지정해야 하며, 화면 꺼짐 지연 시간(설정된 경우) 및 유휴 지연 시간보다 작거나 같도록 값이 잘립니다.</translation> <translation id="2987155890997901449">ARC 사용</translation> <translation id="2987227569419001736">Web Bluetooth API 사용 조정</translation> -<translation id="2998886474614739865"> - 참고: 이 정책은 시험용으로 제공되며 기능이 손상될 수 있습니다. - 이 정책은 로그인 화면에 적용됩니다. 사용자 세션에 적용되는 <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> 정책도 확인하세요. 두 정책을 모두 같은 값으로 설정하는 것이 좋습니다. 설정한 값이 다르면 사용자 세션을 시작할 때 지연이 발생할 수 있으며 사용자 정책으로 지정된 값이 적용됩니다. - 이 정책이 사용 설정되어 있으면 쉼표로 구분된 목록에서 이름이 - 지정된 각 출처는 자체 프로세스로 작동하며 하위 도메인으로 - 이름이 지정된 출처도 격리됩니다. 예를 들어 https://example.com/을 - 지정하면 https://foo.example.com/ 또한 https://example.com/ 사이트의 - 일부로 격리됩니다. - 이 정책이 사용 중지되어 있으면 사이트별 격리 프로세스 관리 로직이 적용됩니다. - 이 정책을 설정하지 않으면 로그인 화면에 플랫폼의 기본 사이트 격리 설정이 사용됩니다. - </translation> <translation id="3016255526521614822"><ph name="PRODUCT_OS_NAME" /> 잠금 화면에서 사용 설정된 메모 앱을 허용 목록에 추가</translation> <translation id="3021562480854470924">허용된 주요 롤백의 수</translation> <translation id="3030000825273123558">통계 보고 사용</translation> @@ -808,17 +786,6 @@ 이 정책을 비어 있지 않은 문자열로 설정하면 해당 문자열이 <ph name="PRODUCT_NAME" /> 전송 대상의 이름으로 사용됩니다. 반면에 비어 있는 문자열로 설정하면 기기 이름이 전송 대상의 이름으로 사용됩니다. 이 정책을 설정하지 않으면 기기 이름이 전송 대상의 이름으로 사용되며, 기기 소유자(또는 기기를 관리하는 도메인의 사용자)가 이 이름을 변경할 수 있습니다. 이름의 길이는 영문 24자로 제한됩니다.</translation> <translation id="3381968327636295719">호스트 브라우저를 기본으로 사용</translation> -<translation id="3386001018488754001"> - 참고: 이 정책은 시험용으로 제공되며 기능이 손상될 수 있습니다. - 이 정책은 로그인 화면에 적용됩니다. 사용자 세션에 적용되는 <ph name="SITE_PER_PROCESS_POLICY_NAME" /> 정책도 확인하세요. 두 정책을 모두 같은 값으로 설정하는 것이 좋습니다. 설정한 값이 다르면 사용자 세션을 시작할 때 지연이 발생할 수 있으며 사용자 정책으로 지정된 값이 적용됩니다. - 격리 정책을 활용하면서 사용자에게 미치는 영향을 최대한 제한하려면 - IsolateOrigins 및 격리하려는 사이트 목록을 이용하여 정책 설정을 - 검토하는 것이 좋습니다. SitePerProcess 설정을 사용하면 모든 - 사이트가 격리됩니다. - 이 정책이 사용 설정되어 있으면 각 사이트는 자체 프로세스로 작동합니다. - 이 정책이 사용 중지되어 있으면 사이트별 격리 프로세스 관리 로직이 적용됩니다. - 이 정책을 설정하지 않으면 사용자가 이 설정을 변경할 수 있습니다. - </translation> <translation id="3395348522300156660">사용자가 사용할 수 있는 프린터를 지정합니다. 이 정책은 <ph name="DEVICE_PRINTERS_ACCESS_MODE" />으(로) <ph name="PRINTERS_WHITELIST" />이(가) 선택된 경우에만 사용됩니다. @@ -1440,17 +1407,6 @@ 정책이 설정되지 않았거나 빈 문자열 또는 유효하지 않은 포트 범위로 설정된 경우 WebRTC는 사용 가능한 로컬 UDP 포트를 사용하도록 허용됩니다.</translation> <translation id="5290940294294002042">사용자가 사용할 수 있거나 사용할 수 없는 플러그인 목록 지정</translation> -<translation id="5301787427319106606"> - 참고: 이 정책은 시험용으로 제공되며 기능이 손상될 수 있습니다. - 격리 정책을 활용하면서 사용자에게 미치는 영향을 최대한 제한하려면 - IsolateOrigins 및 격리하려는 사이트 목록을 이용하여 정책 설정을 - 검토하는 것이 좋습니다. SitePerProcess 설정을 사용하면 모든 - 사이트가 격리됩니다. - 이 정책이 사용 설정되어 있으면 각 사이트는 자체 프로세스로 작동합니다. - 이 정책이 사용 중지되어 있으면 사이트별 격리 프로세스 관리 로직이 적용됩니다. - 이 정책을 설정하지 않으면 사용자가 이 설정을 변경할 수 있습니다. - <ph name="PRODUCT_OS_NAME" />에서 <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> 기기 정책을 같은 값으로 설정하는 것이 좋습니다. 두 정책을 다른 값으로 설정하면 사용자 세션을 시작할 때 지연이 발생할 수 있으며 사용자 정책으로 지정된 값이 적용됩니다. - </translation> <translation id="5302612588919538756">이 정책은 지원이 중단되었으므로 대신 SyncDisabled를 사용해보시기 바랍니다. 사용자가 <ph name="PRODUCT_NAME" />에 로그인하도록 허용합니다. @@ -2656,6 +2612,15 @@ <translation id="9112897538922695510">프로토콜 핸들러 목록을 등록할 수 있도록 허용합니다. 추천 정책만 될 수 있습니다. |protocol| 속성은 'mailto'와 같은 스키마로 설정해야 하며 |url| 속성은 스키마를 처리하는 애플리케이션의 URL 패턴으로 설정해야 합니다. 패턴에 '%s'를 포함할 수 있으며, 포함할 경우 이 기호는 처리된 URL로 교체됩니다. 정책에 의해 등록된 프로토콜 핸들러는 사용자가 등록한 핸들러와 통합되며 두 가지 모두 사용 가능합니다. 사용자는 새로운 기본 핸들러를 설치함으로써 정책에 의해 설치된 프로토콜 핸들러를 덮어쓸 수 있지만 정책에 의해 등록된 프로토콜 핸들러를 삭제할 수는 없습니다.</translation> +<translation id="9123211093995421438">정식 버전부터 항상 허용되어야 하는 <ph name="PRODUCT_OS_NAME" />의 최소 주요 롤백 수를 지정합니다. + + 기본값은 소비자의 경우 0이며, 엔터프라이즈 등록 기기의 경우 4(약 반년)입니다. + + 이 정책을 설정하면 최소 이 숫자만큼의 주요 롤백이 진행되는 동안에는 롤백 보호가 적용되지 않습니다. + + 이 정책을 더 낮은 값으로 설정하면 영구적으로 적용됩니다. 정책을 더 높은 값으로 재설정해도 기기를 이전 버전으로 롤백하지 못할 수도 있습니다. + + 실제 롤백 가능성 역시 보드와 주요 취약성 패치에 따라 달라질 수 있습니다.</translation> <translation id="913195841488580904">URL 목록에 대한 액세스 차단</translation> <translation id="9135033364005346124"><ph name="CLOUD_PRINT_NAME" /> 프록시 사용</translation> <translation id="9136253551939494882">사용자가 잠금 화면을 해제하는 데 구성 및 사용할 수 있는 빠른 잠금 해제 모드를 제어하는 허용 목록입니다.
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb index 1be8d02..4aba4c1c 100644 --- a/components/policy/resources/policy_templates_lt.xtb +++ b/components/policy/resources/policy_templates_lt.xtb
@@ -58,17 +58,6 @@ Jei ši politika naudojama, naudotojui teikiami visi spausdintuvai, išskyrus šioje politikoje nurodytus ID. </translation> -<translation id="1181881366217399113"> - PASTABA. Ši politika yra eksperimentinė ir gali sugadinti sistemos funkcijas! - Įgalinus politiką kiekvienas pavadinimą turintis šaltinis, įtrauktas į - kableliais atskirtų verčių sąrašą, vykdys atskirą procesą. Taip pat bus atskiriami - šaltiniai, pavadinti pagal padomenius, pvz., nurodžius https://example.com/ - taip pat bus atskiriamas ir padomenis https://foo.example.com/ kaip svetainės - https://example.com/ dalis. - Išjungus politiką įsigalios kiekvienos svetainės atskyrimo proceso tvarkymo logika. - Nesukonfigūravus politikos naudotojas galės pakeisti šį nustatymą. - Naudojant „<ph name="PRODUCT_OS_NAME" />“ taip pat rekomenduojama nustatyti tą pačią įrenginio politikos „<ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />“ vertę. Jei abiejų tipų politikos vertės neatitinka, pradedant naudotojo sesiją gali būti uždelsta, kol taikoma naudotojo politikos nurodyta vertė. - </translation> <translation id="1198465924256827162">Įrenginio būsenos įkėlimo nustatymo dažnis milisekundėmis. Jei ši politika nenustatyta, numatytasis dažnis yra 3 val. Minimalus @@ -690,17 +679,6 @@ Politikos vertė turėtų būti nurodyta milisekundėmis. Vertės sumažinamos, kad neviršytų ekrano išjungimo delsos laiko (jei jis nustatytas) ar neveikos delsos laiko arba būtų jam lygios.</translation> <translation id="2987155890997901449">ARC įgalinimas</translation> <translation id="2987227569419001736">Valdyti „Web Bluetooth“ API naudojimą</translation> -<translation id="2998886474614739865"> - PASTABA. Ši politika yra eksperimentinė ir gali sugadinti sistemos funkcijas! - Ši politika taikoma prisijungimo ekranui. Taip pat žr. politiką „<ph name="ISOLATE_ORIGINS_POLICY_NAME" />“, kuri taikoma naudotojo sesijai. Rekomenduojama nustatyti tas pačias abiejų tipų politikos vertes. Jei vertės neatitinka, pradedant naudotojo sesiją gali būti uždelsta, kol taikoma naudotojo politikos nurodyta vertė. - Įgalinus politiką kiekvienas pavadinimą turintis šaltinis, įtrauktas į - kableliais atskirtų verčių sąrašą, vykdys atskirą procesą. Taip pat bus atskiriami - šaltiniai, pavadinti pagal padomenius, pvz., nurodžius https://example.com/ taip pat - bus atskiriamas ir padomenis https://foo.example.com/ kaip svetainės - https://example.com/ dalis. - Išjungus politiką įsigalios kiekvienos svetainės atskyrimo proceso tvarkymo logika. - Jei politika nesukonfigūruota, prisijungimo ekranui bus naudojami platformos numatytieji svetainės atskyrimo nustatymai. - </translation> <translation id="3016255526521614822">Įtraukti į baltąjį sąrašą užrašų programas, kurios leidžiamos „<ph name="PRODUCT_OS_NAME" />“ užrakinimo ekrane</translation> <translation id="3021562480854470924">Ankstesnių versijų, kurias leidžiama grąžinti, skaičius</translation> <translation id="3030000825273123558">Įgalinti metrikos ataskaitų teikimą</translation> @@ -810,17 +788,6 @@ Jei ši politika nustatyta kaip ne tuščia eilutė, ta eilutė bus naudojama kaip „<ph name="PRODUCT_NAME" />“ paskirties vietos pavadinimas. Kitu atveju paskirties vietos pavadinimas bus įrenginio pavadinimas. Jei ši politika nenustatyta, paskirties vietos pavadinimas bus įrenginio pavadinimas, o įrenginio savininkas (arba naudotojas iš domeno, kuriame tvarkomas įrenginys) galės jį pakeisti. Pavadinimas ribojamas iki 24 simbolių.</translation> <translation id="3381968327636295719">Pagal numatytuosius nustatymus naudoti prieglobos naršyklę</translation> -<translation id="3386001018488754001"> - PASTABA. Ši politika yra eksperimentinė ir gali sugadinti sistemos funkcijas! - Ši politika taikoma prisijungimo ekranui. Taip pat žr. politiką „<ph name="SITE_PER_PROCESS_POLICY_NAME" />“, kuri taikoma naudotojo sesijai. Rekomenduojama nustatyti tas pačias abiejų tipų politikos vertes. Jei vertės neatitinka, pradedant naudotojo sesiją gali būti uždelsta, kol taikoma naudotojo politikos nurodyta vertė. - Gali būti naudinga peržiūrėti politikos nustatymą „IsolateOrigins“, kad - efektyviai naudotumėte atskyrimą darydami ribotą įtaką naudotojams, pasitelkdami - „IsolateOrigins“ su svetainių, kurias norite atskirti, sąrašu. Nustatymu - „SitePerProcess“ atskiriamos visos svetainės. - Įgalinus politiką kiekviena svetainė vykdys atskirą procesą. - Išjungus politiką įsigalios kiekvienos svetainės atskyrimo proceso tvarkymo logika. - Nesukonfigūravus politikos naudotojas galės pakeisti šį nustatymą. - </translation> <translation id="3395348522300156660">Nurodomi spausdintuvai, kuriuos gali naudoti naudotojas. Ši politika naudojama, tik jei pasirinktas politikos „<ph name="DEVICE_PRINTERS_ACCESS_MODE" />“ nustatymas „<ph name="PRINTERS_WHITELIST" />“. @@ -1451,17 +1418,6 @@ 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="5301787427319106606"> - PASTABA. Ši politika yra eksperimentinė ir gali sugadinti sistemos funkcijas! - Gali būti naudinga peržiūrėti politikos nustatymą „IsolateOrigins“, kad - efektyviai naudotumėte atskyrimą darydami ribotą įtaką naudotojams, pasitelkdami - „IsolateOrigins“ su svetainių, kurias norite atskirti, sąrašu. Nustatymu - „SitePerProcess“ atskiriamos visos svetainės. - Įgalinus politiką kiekviena svetainė vykdys atskirą procesą. - Išjungus politiką įsigalios kiekvienos svetainės atskyrimo proceso tvarkymo logika. - Nesukonfigūravus politikos naudotojas galės pakeisti šį nustatymą. - Naudojant „<ph name="PRODUCT_OS_NAME" />“ taip pat rekomenduojama nustatyti tą pačią įrenginio politikos „<ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />“ vertę. Jei abiejų tipų politikos vertės neatitinka, pradedant naudotojo sesiją gali būti uždelsta, kol taikoma naudotojo politikos nurodyta vertė. - </translation> <translation id="5302612588919538756">Ši politika nebenaudojama. Vietoje jos turėtumėte naudoti „SyncDisabled“. Naudotojui leidžiama prisijungti prie „<ph name="PRODUCT_NAME" />“.
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb index 376673b..ed8033c 100644 --- a/components/policy/resources/policy_templates_lv.xtb +++ b/components/policy/resources/policy_templates_lv.xtb
@@ -58,17 +58,6 @@ Ja šī politika tiek izmantota, lietotājam ir pieejami visi printeri, izņemot tos, kuru identifikatori atbilst šajā politikā norādītajām vērtībām. </translation> -<translation id="1181881366217399113"> - PIEZĪME. Šī politika ir eksperimentāla, un tās izmantošana var traucēt funkcionalitāti. - Ja politika ir iespējota, katrai komatatdalītā sarakstā norādītajai vietnei - tiks izpildīts atsevišķs process. Vietnes tiks arī izolētas pēc apakšdomēniem, - piemēram, norādot https://example.com/, tiks - izolēta arī vietne https://foo.example.com/ kā daļa no vietnes - https://example.com/. - Ja politika ir atspējota, tiks ievērota katras vietnes izolācijas procesa pārvaldības loģika. - Ja politika nav konfigurēta, lietotājs varēs mainīt šo iestatījumu. - Operētājsistēmā <ph name="PRODUCT_OS_NAME" /> ieteicams iestatīt to pašu vērtību arī ierīces politikai <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />. Ja abās politikās norādītās vērtības neatbilst, atverot lietotāja sesiju, var rasties aizkave, kamēr tiek piemērota lietotāja politikā norādītā vērtība. - </translation> <translation id="1198465924256827162">Ierīces statusa augšupielāžu sūtīšanas biežums milisekundēs. Ja šai politikai nav iestatīta vērtība, tiek lietots noklusējuma biežums: @@ -691,17 +680,6 @@ Politikas vērtību nedrīkst norādīt milisekundēs. Ir jānorāda vērtības, kas ir mazākas par aizkavi līdz ekrāna izslēgšanai (ja tāda ir iestatīta) un dīkstāvei vai kas ir vienādas ar to.</translation> <translation id="2987155890997901449">ARC iespējošana</translation> <translation id="2987227569419001736">Web Bluetooth API lietošanas pārvaldība</translation> -<translation id="2998886474614739865"> - PIEZĪME. Šī politika ir eksperimentāla, un tās izmantošana var traucēt funkcionalitāti. - Šī politika attiecas uz pierakstīšanās ekrānu. Lūdzu, skatiet arī politiku <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, kas attiecas uz lietotāja sesiju. Ieteicams abām politikām iestatīt vienādu vērtību. Ja vērtības neatbilst, atverot lietotāja sesiju, var rasties aizkave, kamēr tiek piemērota lietotāja politikas vērtība. - Ja politika ir iespējota, katrai komatatdalītā sarakstā norādītajai vietnei tiks - izpildīts atsevišķs process. Vietnes tiks arī izolētas pēc apakšdomēniem, - piemēram, norādot https://example.com/, tiks izolēta arī vietne - https://foo.example.com/ kā daļa no vietnes - https://example.com/. - Ja politika ir atspējota, tiks ievērota katras vietnes izolācijas procesa pārvaldības loģika. - Ja politika nav konfigurēta, pierakstīšanās ekrānam tiks izmantoti platformas noklusējuma vietnes izolācijas iestatījumi. - </translation> <translation id="3016255526521614822">Baltajā sarakstā iekļautas piezīmju lietotnes, kas ir atļautas <ph name="PRODUCT_OS_NAME" /> bloķēšanas ekrānā</translation> <translation id="3021562480854470924">Atritei atļauto atskaites punktu skaits</translation> <translation id="3030000825273123558">Iespējot metrikas ziņošanu</translation> @@ -811,17 +789,6 @@ Ja šai politikai tiks iestatīta virkne, kas nav tukša, šī virkne tiks izmantota kā <ph name="PRODUCT_NAME" /> galamērķa nosaukums. Pretējā gadījumā kā galamērķa nosaukums tiks izmantots ierīces nosaukums. Ja šī politika netiks iestatīta, kā galamērķa nosaukums tiks izmantots ierīces nosaukums un to varēs mainīt ierīces īpašnieks vai lietotājs no domēna, kurā ierīce tiek pārvaldīta. Nosaukuma garums nedrīkst pārsniegt 24 rakstzīmes.</translation> <translation id="3381968327636295719">Pēc noklusējuma lieto saimniekdatora pārlūku</translation> -<translation id="3386001018488754001"> - PIEZĪME. Šī politika ir eksperimentāla, un tās izmantošana var traucēt funkcionalitāti. - Šī politika attiecas uz pierakstīšanās ekrānu. Lūdzu, skatiet arī politiku <ph name="SITE_PER_PROCESS_POLICY_NAME" />, kas attiecas uz lietotāja sesiju. Ieteicams abām politikām iestatīt vienādu vērtību. Ja vērtības neatbilst, atverot lietotāja sesiju, var rasties aizkave, kamēr tiek piemērota lietotāja politikas vērtība. - Ieteicams izmantot politikas IsolateOrigins iestatījumu ar izolējamo vietņu - sarakstu, lai gūtu vislabākos rezultātus, izolētu tikai vietnes, kuras vēlaties - izolēt, un ierobežotu ietekmi lietotājiem. Izmantojot iestatījumu - SitePerProcess, tiek izolētas visas vietnes. - Ja politika ir iespējota, katrai vietnei tiks izpildīts atsevišķs process. - Ja politika ir atspējota, tiks ievērota katras vietnes izolācijas procesa pārvaldības loģika. - Ja politika nav konfigurēta, lietotājs varēs mainīt šo iestatījumu. - </translation> <translation id="3395348522300156660">Norāda printerus, ko lietotājs var izmantot. Šī politika tiek izmantota tikai tad, ja parametram <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> ir izvēlēta vērtība <ph name="PRINTERS_WHITELIST" />. @@ -1447,17 +1414,6 @@ Ja politika nav iestatīta vai tā ir iestatīta uz tukšu virkni vai nederīgu portu diapazonu, saskarnei WebRTC ir atļauts izmantot jebkuru pieejamu lokālo UDP portu.</translation> <translation id="5290940294294002042">Norāda spraudņu sarakstu, kurus lietotājs var iespējot vai atspējot</translation> -<translation id="5301787427319106606"> - PIEZĪME. Šī politika ir eksperimentāla, un tās izmantošana var traucēt funkcionalitāti. - Ieteicams izmantot politikas IsolateOrigins iestatījumu ar izolējamo vietņu - sarakstu, lai gūtu vislabākos rezultātus, izolētu tikai vietnes, kuras vēlaties - izolēt, un ierobežotu ietekmi lietotājiem. Izmantojot iestatījumu - SitePerProcess, tiek izolētas visas vietnes. - Ja politika ir iespējota, katrai vietnei tiks izpildīts atsevišķs process. - Ja politika ir atspējota, tiks ievērota katras vietnes izolācijas procesa pārvaldības loģika. - Ja politika nav konfigurēta, lietotājs varēs mainīt šo iestatījumu. - Operētājsistēmā <ph name="PRODUCT_OS_NAME" /> ieteicams iestatīt to pašu vērtību arī ierīces politikai <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Ja abās politikās norādītās vērtības neatbilst, atverot lietotāja sesiju, var rasties aizkave, kamēr tiek piemērota lietotāja politikā norādītā vērtība. - </translation> <translation id="5302612588919538756">Šī politika ir novecojusi. Tās vietā varat lietot politiku SyncDisabled. Ļauj lietotājam pierakstīties pārlūkā <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb index 216a7dce..c4cf431 100644 --- a/components/policy/resources/policy_templates_ml.xtb +++ b/components/policy/resources/policy_templates_ml.xtb
@@ -59,14 +59,6 @@ ഈ നയം ഉപയോഗിച്ചിട്ടുണ്ടെങ്കിൽ, ഈ നയത്തിൽ ലിസ്റ്റ് ചെയ്തിരിക്കുന്ന ഐഡികൾക്കായുള്ള പ്രിന്ററുകൾ ഒഴികെയുള്ള എല്ലാ പ്രിന്ററുകളും ഉപയോക്താവിന് ലഭിക്കുന്നു. </translation> -<translation id="1181881366217399113"> - ശ്രദ്ധിക്കുക: ഈ നയം പരീക്ഷണാത്മകമായതിനാൽ പ്രവർത്തനത്തെ ബാധിച്ചേക്കാം!! - നയം പ്രവർത്തനക്ഷമമാക്കുകയാണെങ്കിൽ, കോമ കൊണ്ട് വേർതിരിച്ച ലിസ്റ്റിലെ പേരുള്ള ഓരോ ഉറവിടങ്ങളും അവയുടെ സ്വന്തം പ്രോസസ് റൺ ചെയ്യും. ഇത് ഉപഡൊമെയ്ൻ പേര് നൽകിയ ഉറവിടങ്ങളെയും മാറ്റി നിർത്തും; ഉദാഹരണത്തിന്, https://example.com/ എന്ന് നൽകുകയാണെങ്കിൽ, https://example.com/ സൈറ്റിന്റെ ഭാഗമായി https://foo.example.com/ എന്നതിനെയും മാറ്റി നിർത്തും. - നയം പ്രവർത്തനരഹിതമാക്കുകയാണെങ്കിൽ, ഓരോ സൈറ്റിനുമുള്ള മാറ്റിനിർത്തൽ പ്രോസസ് മാനേജ്മെന്റ് ലോജിക് നടപ്പിൽ വരും. - - നയം കോൺഫിഗർ ചെയ്തിട്ടില്ലെങ്കിൽ, ഈ ക്രമീകരണം മാറ്റാൻ ഉപയോക്താവിന് കഴിയും. - <ph name="PRODUCT_OS_NAME" />-ൽ, ഒരേ മൂല്യത്തിലേക്ക് <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> ഉപകരണ നയം സജ്ജീകരിക്കാനും ശുപാർശ ചെയ്യുന്നു. രണ്ട് നയങ്ങൾ മുഖേന വ്യക്തമാക്കപ്പെടുന്ന മൂല്യങ്ങൾ പൊരുത്തപ്പെടുന്നില്ലെങ്കിൽ, ബാധകമാക്കപ്പെടുന്ന ഉപയോക്തൃ നയം മുഖേന മൂല്യം വ്യക്തമാക്കിയിരിക്കുമ്പോൾ, ഉപയോക്തൃ സെഷനിലേക്ക് പ്രവേശിക്കുന്ന സമയത്ത് ഒരു കാലതാമസം സംഭവിക്കാം. - </translation> <translation id="1194005076170619046">പ്രവർത്തനരഹിതമാക്കുകയാണെങ്കിൽ, സെഷൻ സജീവമായിരിക്കുന്ന സമയത്ത് വലിയ ചുവപ്പ് വർണ്ണത്തിലുള്ള ഒരു ലോഗ്ഔട്ട് ബട്ടൺ കാണിക്കുകയും സ്ക്രീൻ ലോക്ക് ആകാതെ നിലനിൽക്കുകയും ചെയ്യും. പ്രവർത്തനരഹിതമാക്കുകയാണെങ്കിലോ നിർദ്ദേശിച്ചിട്ടില്ലെങ്കിലോ സിസ്റ്റം ട്രേയിൽ വലിയ ചുവപ്പ് വർണ്ണത്തിലുള്ള ലോഗ്ഔട്ട് ബട്ടൺ കാണിക്കില്ല.</translation> @@ -772,17 +764,6 @@ ഈ നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിൽ കൂടുതൽ വ്യക്തമാക്കിയ നയങ്ങളുടെ പ്രവർത്തനരീതി ബാധിക്കപ്പെടാതെ തുടരുന്നു.</translation> <translation id="2987155890997901449">ARC പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="2987227569419001736">വെബ് Bluetooth API ഉപയോഗം നിയന്ത്രിക്കുക</translation> -<translation id="2998886474614739865"> - ശ്രദ്ധിക്കുക: ഈ നയം പരീക്ഷണാത്മകമായതിനാൽ പ്രവർത്തനത്തെ ബാധിച്ചേക്കാം! - ഈ നയം, സൈൻ ഇൻ സ്ക്രീനിലേക്ക് ബാധകമാക്കപ്പെടുന്നു. ഉപയോക്തൃ സെഷനിലേക്ക് ബാധകമാക്കപ്പെടുന്ന <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> നയവും കാണുക. ഇരു നയങ്ങളും സമാന മൂല്യത്തിൽ സജ്ജീകരിക്കാൻ ശുപാർശ ചെയ്യുന്നു. മൂല്യങ്ങൾ പൊരുത്തപ്പെടുന്നില്ലെങ്കിൽ, ബാധകമാക്കപ്പെടുന്ന ഉപയോക്തൃ നയം മുഖേന മൂല്യം വ്യക്തമാക്കിയിരിക്കുമ്പോൾ, ഉപയോക്തൃ സെഷനിലേക്ക് പ്രവേശിക്കുന്ന സമയത്ത് ഒരു കാലതാമസം സംഭവിക്കാം. - നയം പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, കോമ കൊണ്ട് വേർതിരിച്ച ലിസ്റ്റിലെ പേരുള്ള - ഓരോ ഉറവിടങ്ങളും അവയുടെ സ്വന്തം പ്രോസസ് റൺ ചെയ്യും. ഇത് ഉപഡൊമെയ്ൻ മുഖേന - പേരിടപ്പെട്ട ഉറവിടങ്ങളെയും മാറ്റി നിർത്തും; ഉദാഹരണത്തിന്, https://example.com/ എന്ന് - നൽകുകയാണെങ്കിൽ, https://example.com/ സൈറ്റിന്റെ ഭാഗമായി https://foo.example.com/ മാറ്റി - നിർത്തപ്പെടുന്നതിന് കാരണമാകും. നയം പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഒരോ സൈറ്റിനുമുള്ള - ഐസൊലേഷൻ പ്രോസസ് മാനേജ്മെന്റ് ലോജിക് നടപ്പിൽ വരും. നയം കോൺഫിഗർ ചെയ്തിട്ടില്ലെങ്കിൽ, - സൈൻ-ഇൻ സ്ക്രീനിന് പ്ലാറ്റ്ഫോം ഡിഫോൾട്ട് സൈറ്റ് ഐസോലേഷൻ ക്രമീകരണം ഉപയോഗിക്കപ്പെടും. - </translation> <translation id="3016255526521614822">വൈറ്റ്ലിസ്റ്റ് ചെയ്ത 'കുറിപ്പ്-എടുക്കൽ' ആപ്പുകൾക്ക് <ph name="PRODUCT_OS_NAME" /> ലോക്ക് സ്ക്രീനിൽ അനുവാദമുണ്ട്</translation> <translation id="3021562480854470924">തിരികെ പോകേണ്ട നാഴികക്കല്ലുകളുടെ അനുവദനീയ എണ്ണം</translation> <translation id="3030000825273123558">അളവുകൾ റിപ്പോർട്ടുചെയ്യൽ പ്രാപ്തമാക്കുക</translation> @@ -898,17 +879,6 @@ ശൂന്യമല്ലാത്ത സ്ട്രിംഗിലേക്ക് ഈ നയം സജ്ജീകരിച്ചാൽ, ആ സ്ട്രിംഗ് <ph name="PRODUCT_NAME" /> ലക്ഷ്യസ്ഥാനത്തിന്റെ പേരായി ഉപയോഗിക്കപ്പെടും. അല്ലെങ്കിൽ, ഉപകരണത്തിന്റെ പേരായിരിക്കും ലക്ഷ്യസ്ഥാനത്തിന്റെ പേര്. ഈ നയം സജ്ജീകരിച്ചില്ലെങ്കിൽ ഉപകരണത്തിന്റെ പേരായിരിക്കും ലക്ഷ്യസ്ഥാനത്തിന്റെ പേര്, എന്നാൽ ഉപകരണത്തിന്റെ ഉടമയ്ക്ക് (അല്ലെങ്കിൽ ഉപകരണത്തെ നിയന്ത്രിക്കുന്ന ഡൊമെയ്നിൽ നിന്നുള്ള ഒരു ഉപയോക്താവിന്) അത് മാറ്റാൻ അനുവാദമുണ്ടാകും. പേരിന് 24 അക്ഷരങ്ങളിൽ കൂടുതൽ ദൈർഘ്യമുണ്ടാകരുത്.</translation> <translation id="3381968327636295719">സ്ഥിരസ്ഥിതിയായി ഹോസ്റ്റ് ബ്രൌസര് ഉപയോഗിക്കുക</translation> -<translation id="3386001018488754001"> - ശ്രദ്ധിക്കുക: ഈ നയം പരീക്ഷണാത്മകമായതിനാൽ പ്രവർത്തനത്തെ ബാധിച്ചേക്കാം! - ഈ നയം, സൈൻ ഇൻ സ്ക്രീനിലേക്ക് ബാധകമാക്കപ്പെടുന്നു. ഉപയോക്തൃ സെഷനിലേക്ക് ബാധകമാക്കപ്പെടുന്നു <ph name="SITE_PER_PROCESS_POLICY_NAME" /> നയവും കാണുക. ഇരു നയങ്ങളും സമാന മൂല്യത്തിൽ സജ്ജീകരിക്കാൻ ശുപാർശ ചെയ്യുന്നു. മൂല്യങ്ങൾ പൊരുത്തപ്പെടുന്നില്ലെങ്കിൽ, ബാധകമാക്കപ്പെടുന്ന ഉപയോക്തൃ നയം മുഖേന മൂല്യം വ്യക്തമാക്കിയിരിക്കുമ്പോൾ, ഉപയോക്തൃ സെഷനിലേക്ക് പ്രവേശിക്കുന്ന സമയത്ത് ഒരു കാലതാമസം സംഭവിക്കാം. - മാറ്റി നിർത്തേണ്ട സൈറ്റുകളുടെ ലിസ്റ്റിനൊപ്പം IsolateOrigins ഉപയോഗിക്കുന്നതിലൂടെ, ഐസോലേഷൻ, - ഉപയോക്താക്കൾക്ക് ഉണ്ടാകുന്ന പരിണിതഫലങ്ങൾ പരിമിതപ്പെടുത്തൽ എന്നിവയുടെ പ്രയോജനം പരമാവധി - ഉപയോഗപ്പെടുത്താനായി, നിങ്ങൾ IsolateOrigins നയ ക്രമീകരണം പരിശോധിക്കേണ്ടതുണ്ട്. - SitePerProcess എന്ന ഈ ക്രമീകരണം എല്ലാ സൈറ്റുകളെയും മാറ്റിനിർത്തുന്നു. നയം - പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഓരോ സൈറ്റും അവയുടെ സ്വന്തം പ്രോസസ് റൺ ചെയ്യും. - നയം പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഒരോ സൈറ്റിനുമുള്ള ഐസൊലേഷൻ പ്രോസസ് മാനേജ്മെന്റ് - ലോജിക് നടപ്പിൽ വരും. നയം കോൺഫിഗർ ചെയ്തിട്ടില്ലെങ്കിൽ, ഉപയോക്താവിന് ഈ ക്രമീകരണം മാറ്റാനാകും. - </translation> <translation id="3395348522300156660">ഒരു ഉപയോക്താവിന് ഉപയോഗിക്കാൻ കഴിയുന്ന പ്രിന്ററിനെ ഇത് വ്യക്തമാക്കുന്നു. <ph name="DEVICE_PRINTERS_ACCESS_MODE" />-നായി <ph name="PRINTERS_WHITELIST" /> തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ മാത്രമേ ഈ നയം ഉപയോഗിക്കപ്പെടുകയുള്ളൂ @@ -1630,17 +1600,6 @@ ഈ നയം സജ്ജമാക്കാതിരിക്കുകയോ അല്ലെങ്കിൽ ശൂന്യമായ സ്ട്രിംഗിലേക്കോ അസാധുവായ പോർട്ട് ശ്രേണിയിലേക്കോ സജ്ജമാക്കുകയോ ആണെങ്കിൽ, ലഭ്യമായ ഏതൊരു ലോക്കൽ UDP പോർട്ടും ഉപയോഗിക്കാൻ WebRTC-നെ അനുവദിക്കും.</translation> <translation id="5290940294294002042">ഉപയോക്താവിന് പ്രാപ്തമാക്കാനോ അപ്രാപ്തമാക്കാനോ കഴിയുന്ന പ്ലഗിനുകളുടെ ഒരു ലിസ്റ്റ് നിര്ദേശിക്കുക</translation> -<translation id="5301787427319106606"> - ശ്രദ്ധിക്കുക: ഈ നയം പരീക്ഷണാത്മകമായതിനാൽ പ്രവർത്തനത്തെ ബാധിച്ചേക്കാം! - മാറ്റി നിർത്തേണ്ട സൈറ്റുകളുടെ ലിസ്റ്റിനൊപ്പം IsolateOrigins ഉപയോഗിക്കുന്നതിലൂടെ, ഐസോലേഷൻ, - ഉപയോക്താക്കൾക്ക് ഉണ്ടാകുന്ന പരിണിതഫലങ്ങൾ പരിമിതപ്പെടുത്തൽ എന്നിവയുടെ പ്രയോജനം - പരമാവധി ഉപയോഗപ്പെടുത്താനായി, നിങ്ങൾ IsolateOrigins നയ ക്രമീകരണം പരിശോധിക്കേണ്ടതുണ്ട്. - SitePerProcess എന്ന ഈ ക്രമീകരണം എല്ലാ സൈറ്റുകളെയും മാറ്റിനിർത്തുന്നു. നയം - പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഓരോ സൈറ്റും അവയുടെ സ്വന്തം പ്രോസസ് റൺ ചെയ്യും. - നയം പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഒരോ സൈറ്റിനുമുള്ള ഐസൊലേഷൻ പ്രോസസ് - മാനേജ്മെന്റ് ലോജിക് നടപ്പിൽ വരും. നയം കോൺഫിഗർ ചെയ്തിട്ടില്ലെങ്കിൽ, ഉപയോക്താവിന് ഈ ക്രമീകരണം മാറ്റാനാകും. - <ph name="PRODUCT_OS_NAME" />-ൽ, ഒരേ മൂല്യത്തിലേക്ക് <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> ഉപകരണ നയം സജ്ജീകരിക്കാനും ശുപാർശ ചെയ്യപ്പെടുന്നു. രണ്ട് നയങ്ങൾ മുഖേന വ്യക്തമാക്കപ്പെടുന്ന മൂല്യങ്ങൾ പൊരുത്തപ്പെടുന്നില്ലെങ്കിൽ, ബാധകമാക്കപ്പെടുന്ന ഉപയോക്തൃ നയം മുഖേന മൂല്യം വ്യക്തമാക്കിയിരിക്കുമ്പോൾ, ഉപയോക്തൃ സെഷനിലേക്ക് പ്രവേശിക്കുന്ന സമയത്ത് ഒരു കാലതാമസം സംഭവിക്കാം. - </translation> <translation id="5302612588919538756">ഈ നയം ഒഴിവാക്കിയെങ്കിൽ, പകരം SyncDisabled ഉപയോഗിക്കുന്ന കാര്യം പരിഗണിക്കുക. <ph name="PRODUCT_NAME" /> എന്നതിൽ സൈൻ ഇൻ ചെയ്യാൻ ഉപയോക്താവിനെ അനുവദിക്കുന്നു.
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb index a24c942..48833b4 100644 --- a/components/policy/resources/policy_templates_mr.xtb +++ b/components/policy/resources/policy_templates_mr.xtb
@@ -59,13 +59,6 @@ हे धोरण वापरले असल्यास, धोरणामध्ये सूचीबद्ध आयडी वगळता सर्व प्रिंटर वापरकर्त्यांना दिले गेले आहेत. </translation> -<translation id="1181881366217399113"> - सूचना: हे एक प्रायोगिक धोरण आहे आणि यामुळे कार्यक्षमतेत खंड पडू शकतो! -जर धोरण सुरू केलेले असेल तर स्वल्पविराम देऊन क्रमवार लावलेल्या सूचीमध्ये नाव देण्यात आलेली मूळ नावे स्वतःच्या प्रक्रियेमध्ये रन होतील. ज्यांना सबडोमेननी नावे दिली आहेत अशी मूळ नावे वेगळी होतील; उदा. https://example.com/ नमूद केली तर https://foo.example.com/ ला देखील https://example.com/ साइटचा एक भाग म्हणून वेगळे केले जाईल. -जर हे धोरण बंद केलेले असेल, तर साइटप्रमाणे वेगळे करण्याच्या प्रक्रिया व्यवस्थापनाचे लॉजिक वापरले जाईल. -जर हे धोरण कॉन्फिगर केलेले नसेल, तर साइन इन स्क्रीनसाठी प्लॅटफॉर्मवरील डीफॉल्ट साइट आयसोलेशन सेटिंग्ज वापरली जातील. -<ph name="PRODUCT_OS_NAME" /> वर, <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> चे डिव्हाइस धोरणही समान मूल्याला सेट करण्याची शिफारस करण्यात आलेली आहे. जर दोन धोरणांद्वारे दर्शविण्यात आलेली मूल्ये जुळली नाहीत, तर वापरकर्ता धोरणाद्वारे देण्यात आलेले मूल्य लागू केले जाईल आणि हे करताना वापरकर्ता सेशनमध्ये प्रवेश करतेवेळी थोडा विलंब होऊ शकतो. - </translation> <translation id="1194005076170619046">चालू केल्यास, सत्र सक्रिय असताना आणि स्क्रीन लॉक केली नसताना सिस्टम ट्रेवर एक मोठे, लाल लॉगआउट बटण दाखवले जाते. बंद केले असल्यास किंवा निर्दिष्ट केले नसल्यास सिस्टम ट्रेवर कोणतेही मोठे, लाल लॉगआउट बटण दाखवले जात नाही.</translation> @@ -746,14 +739,6 @@ हे धोरण सेट केले नसताना, अधिक विशिष्ट धोरणांच्या वर्तनावर कोणताही प्रभाव पडत नाही.</translation> <translation id="2987155890997901449">ARC सक्षम करा</translation> <translation id="2987227569419001736">Web Bluetooth API चा वापर नियंत्रित करा</translation> -<translation id="2998886474614739865"> - सूचना: हे एक प्रायोगिक धोरण आहे आणि यामुळे कार्यक्षमतेत खंड पडू शकतो! - हे धोरण साइन इन स्क्रीनला लागू होते. कृपया वापरकर्ता सेशनला लागू होणारे <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> धोरणसुद्धा पहा. दोन्ही धोरणे समान मूल्याला सेट करण्याची शिफारस करण्यात आलेली आहे. जर मूल्ये जुळली नाहीत, तर वापरकर्ता धोरणाद्वारे देण्यात आलेले मूल्य लागू केले जाईल आणि हे करताना वापरकर्ता सेशनमध्ये प्रवेश करतेवेळी थोडा विलंब होऊ शकतो. - जर धोरण सुरू केलेले असेल तर स्वल्पविराम देऊन क्रमवार लावलेल्या सूचीमध्ये नाव देण्यात आलेली मूळ नावे स्वतःच्या प्रक्रियेमध्ये रन होतील. - ज्यांना सबडोमेननी नावे दिली आहेत अशी मूळ नावे वेगळी होतील; उदा. https://example.com/ नमूद केली तर https://foo.example.com/ ला देखील https://example.com/ साइटचा एक भाग म्हणून वेगळे केले जाईल. - जर हे धोरण बंद केलेले असेल, तर साइटप्रमाणे वेगळे करण्याच्या प्रक्रिया व्यवस्थापनाचे लॉजिक वापरले जाईल. - जर हे धोरण कॉन्फिगर केलेले नसेल, तर साइन इन स्क्रीनसाठी प्लॅटफॉर्मवरील डीफॉल्ट साइट आयसोलेशन सेटिंग्ज वापरली जातील. - </translation> <translation id="3016255526521614822">Whitelist हे टिपा लिहिण्याचे अॅप्स <ph name="PRODUCT_OS_NAME" /> च्या लॉक स्क्रीनवर चालते</translation> <translation id="3021562480854470924">अनुमत असलेल्या माइलस्टोन रोलबॅकची संख्या</translation> <translation id="3030000825273123558">मेट्रिक्स अहवाल सक्षम करा</translation> @@ -875,14 +860,6 @@ हे धोरण रिक्त नसलेल्या स्ट्रिंगवर सेट केले असल्यास, ती स्ट्रिंग <ph name="PRODUCT_NAME" /> डेस्टिनेशनचे नाव म्हणून वापरली जाईल. अन्यथा, डेस्टिनेशनचे नाव हे डिव्हाइसचे नाव असेल. हे धोरण सेट केलेले नसल्यास, डेस्टिनेशनचे नाव हे डिव्हाइसचे नाव असेल आणि डिव्हाइसच्या मालकाला (किंवा डिव्हाइस व्यवस्थापित करणाऱ्या डोमेनवरील वापरकर्त्याला) ते बदलण्याची अनुमती असेल. नाव 24 वर्णांपर्यंत मर्यादित आहे.</translation> <translation id="3381968327636295719">डीफॉल्टनुसार होस्ट ब्राउझर वापरा</translation> -<translation id="3386001018488754001"> - सूचना: हे एक प्रायोगिक धोरण आहे आणि यामुळे कार्यक्षमतेत खंड पडू शकतो! - हे धोरण साइन इन स्क्रीनला लागू होते. कृपया वापरकर्ता सेशनला लागू होणारे <ph name="SITE_PER_PROCESS_POLICY_NAME" /> धोरणसुद्धा पहा. दोन्ही धोरणे समान मूल्याला सेट करण्याची शिफारस करण्यात आलेली आहे. जर मूल्ये जुळली नाहीत, तर वापरकर्ता धोरणाद्वारे देण्यात आलेले मूल्य लागू केले जाईल आणि हे करताना वापरकर्ता सेशनमध्ये प्रवेश करतेवेळी थोडा विलंब होऊ शकतो. - तुम्हाला वेगळ्या करायच्या साइट्सच्या यादीसह IsolateOrigins वापरून आयसोलेशन आणि वापरकर्त्यांवर मर्यादित प्रभाव या दोन्हींचा समन्वय साधण्यासाठी तुम्ही IsolateOrigins धोरण सेटिंग पाहावे. SitePerProcess हे सेटिंग सर्व साइट्सना वेगळे करते. - जर धोरण सुरू केलेले असेल तर प्रत्येक साइट स्वतःच्या प्रक्रियेमध्ये रन होईल. - जर हे धोरण बंद केलेले असेल, तर साइटप्रमाणे वेगळे करण्याच्या प्रक्रिया व्यवस्थापनाचे लॉजिक वापरले जाईल. - जर हे धोरण कॉन्फिगर केलेले नसेल, तर वापरकर्ता ही सेटिंग बदलू शकतो. - </translation> <translation id="3395348522300156660">वापरकर्ता वापरू शकत असलेले प्रिंटर निर्दिष्ट करते. हे धोरण केवळ <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> साठी <ph name="PRINTERS_WHITELIST" /> निवडले असता वापरले जाते @@ -1612,16 +1589,6 @@ धोरण सेट केले नसल्यास किंवा ते रिक्त स्ट्रिंगवर किंवा अवैध पोर्ट श्रेणीवर सेट केले असल्यास, WebRTC ला कोणतेही उपलब्ध असलेले स्थानिक UDP पोर्ट वापरण्याची अनुमती दिली जाते.</translation> <translation id="5290940294294002042">वापरकर्ता सक्षम किंवा अक्षम करू शकतो अशा प्लगइनची सूची निर्दिष्ट करा</translation> -<translation id="5301787427319106606"> - सूचना: हे एक प्रायोगिक धोरण आहे आणि यामुळे कार्यक्षमतेत खंड पडू शकतो! - तुम्हाला वेगळ्या करायच्या साइटच्या सूचीसह IsolateOrigins वापरून आयसोलेशन आणि वापरकर्त्यांवर मर्यादित प्रभाव या दोन्हींचा समन्वय साधण्यासाठी तुम्ही IsolateOrigins धोरण सेटिंग पाहावे. - SitePerProcess हे सेटिंग सर्व साइटना वेगळे करते. - जर धोरण सुरू केलेले असेल तर प्रत्येक साइट स्वतःच्या प्रक्रियेमध्ये रन होईल. - जर हे धोरण बंद केलेले असेल, तर साइटप्रमाणे वेगळे करण्याच्या प्रक्रिया व्यवस्थापनाचे लॉजिक वापरले जाईल. - जर हे धोरण कॉन्फिगर केलेले नसेल, तर वापरकर्ता हे सेटिंग बदलू शकतो. - <ph name="PRODUCT_OS_NAME" /> वर, <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> चे डिव्हाइस धोरणही समान मूल्याला सेट करण्याची शिफारस करण्यात आलेली आहे. - जर दोन धोरणांद्वारे दर्शविण्यात आलेली मूल्ये जुळली नाहीत, तर वापरकर्ता धोरणाद्वारे देण्यात आलेले मूल्य लागू केले जाईल आणि हे करताना वापरकर्ता सेशनमध्ये प्रवेश करतेवेळी थोडा विलंब होऊ शकतो. - </translation> <translation id="5302612588919538756">हे धोरण बहिष्कृत केले आहे, त्याऐवजी SyncDisabled वापरण्याचा विचार करा. वापरकर्त्याला <ph name="PRODUCT_NAME" /> मध्ये साइन इन करण्याची अनुमती देते.
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb index b276df09..ffda4e3a 100644 --- a/components/policy/resources/policy_templates_ms.xtb +++ b/components/policy/resources/policy_templates_ms.xtb
@@ -58,17 +58,6 @@ Jika dasar ini digunakan, semua pencetak akan disediakan kepada pengguna kecuali ID yang disenaraikan dalam dasar ini. </translation> -<translation id="1181881366217399113"> - NOTA: Dasar ini ialah percubaan dan mungkin keluar daripada fungsi! - Jika dasar ini didayakan, setiap asalan yang dinamakan dalam - senarai yang dipisahkan oleh koma akan dijalankan dalam prosesnya sendiri. Ini juga akan mengasingkan - asalan yang dinamakan oleh subdomain; cth. menyatakan https://example.com/ akan - turut menyebabkan https://foo.example.com/ diasingkan sebagai sebahagian daripada - tapak https://example.com/. - Jika dasar ini dilumpuhkan, logik pengurusan proses Pengasingan mengikut Tapak akan berkuat kuasa. - Jika dasar tidak dikonfiguraskan, pengguna akan dapat menukar tetapan ini. - Pada <ph name="PRODUCT_OS_NAME" />, anda disyorkan supaya turut menetapkan dasar peranti <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> kepada nilai yang sama. Jika nilai yang ditetapkan oleh dua dasar ini tidak sepadan, kelengahan akan berlaku apabila memasuki sesi pengguna semasa nilai yang ditentukan oleh dasar pengguna sedang digunakan. - </translation> <translation id="1198465924256827162">Kekerapan muat naik status peranti dihantar, dalam milisaat. Jika dasar ini tidak ditetapkan, kekerapan lalai ialah 3 jam. Kekerapan @@ -688,18 +677,6 @@ Nilai dasar ini harus ditetapkan dalam milisaat. Nilai diapit supaya kurang daripada atau sama dengan kelewatan pemadaman skrin (jika ditetapkan) dan kelewatan melahu.</translation> <translation id="2987155890997901449">Dayakan ARC</translation> <translation id="2987227569419001736">Kawal penggunaan API Bluetooth Web</translation> -<translation id="2998886474614739865"> - NOTA: Dasar ini masih dalam percubaan dan mungkin menjejaskan fungsian! - Dasar ini digunakan pada skrin log masuk. Sila lihat dasar <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> juga yang digunakan pada sesi pengguna. Anda disyorkan untuk menetapkan kedua-dua dasar pada nilai yang sama. Jika nilai tidak sepadan, kelewatan mungkin berlaku apabila memasuki sesi pengguna semasa nilai yang dinyatakan oleh dasar pengguna sedang digunakan. - Jika dasar didayakan, setiap tempat asal yang dinamakan dalam - senarai yang dipisahkan koma akan dijalankan dalam prosesnya sendiri. - Tindakan ini turut mengasingkan tempat asal yang dinamakan mengikut - subdomain, mis. menyatakan https://example.com/ turut menyebabkan - https://foo.example.com/ diasingkan sebagai sebahagian daripada tapak - https://example.com/. - Jika dasar ini dilumpuhkan, logik pengurusan proses Pengasingan setiap Tapak akan dikuatkuasakan. - Jika dasar ini tidak dikonfigurasi, tetapan pengasingan tapak lalai platform akan digunakan untuk skrin log masuk. - </translation> <translation id="3016255526521614822">Apl pencatatan nota senarai putih dibenarkan pada skrin kunci <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Bilangan pengunduran pencapaian yang dibenarkan</translation> <translation id="3030000825273123558">Dayakan laporan metrik</translation> @@ -809,18 +786,6 @@ Jika dasar ini ditetapkan kepada rentetan tidak kosong, rentetan itu akan digunakan sebagai nama bagi destinasi <ph name="PRODUCT_NAME" />. Jika tidak, nama peranti akan dijadikan nama destinasi. Jika dasar ini tidak ditetapkan, nama peranti akan dijadikan nama destinasi dan pemilik peranti (atau pengguna daripada domain yang mengurus peranti tersebut) akan dibenarkan untuk menukar nama itu. Nama dihadkan kepada 24 aksara.</translation> <translation id="3381968327636295719">Gunakan penyemak imbas hos secara lalai</translation> -<translation id="3386001018488754001"> - NOTA: Dasar ini masih dalam percubaan dan mungkin menjejaskan fungsian! - Dasar ini digunakan pada skrin log masuk. Sila lihat dasar <ph name="SITE_PER_PROCESS_POLICY_NAME" /> juga yang digunakan pada sesi pengguna. Anda disyorkan untuk menetapkan kedua-dua dasar pada nilai yang sama. Jika nilai tidak sepadan, kelewatan mungkin berlaku apabila memasuki sesi pengguna semasa nilai yang dinyatakan oleh dasar pengguna sedang digunakan. - Anda mungkin mahu meneliti tetapan dasar IsolateOrigins untuk - memanfaatkan kedua-dua keadaan, pengasingan dan kesan yang - terhad untuk pengguna, dengan menggunakan IsolateOrigins dengan - senarai tapak yang hendak diasingkan. Tetapan ini, SitePerProcess, - mengasingkan semua tapak. - Jika dasar ini didayakan, setiap tapak akan menjalankan proses masing-masing. - Jika dasar ini dilumpuhkan, logik pengurusan proses Pengasingan setiap Tapak akan dikuatkuasakan. - Jika dasar ini tidak dikonfigurasi, pengguna boleh mengubah tetapan ini. - </translation> <translation id="3395348522300156660">Menentukan pencetak yang boleh digunakan oleh pengguna. Dasar ini hanya digunakan jika <ph name="PRINTERS_WHITELIST" /> dipilih untuk <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1446,18 +1411,6 @@ Jika dasar ini tidak ditetapkan, atau ditetapkan pada rentetan kosong atau julat port yang tidak sah, WebRTC dibenarkan untuk menggunakan mana-mana port UDP setempat yang tersedia.</translation> <translation id="5290940294294002042">Tentukan senarai pemalam yang boleh didayakan atau dilumpuhkan pengguna</translation> -<translation id="5301787427319106606"> - NOTA: Dasar ini masih dalam percubaan dan mungkin menjejaskan fungsian! - Anda mungkin mahu meneliti tetapan dasar IsolateOrigins untuk - memanfaatkan kedua-dua keadaan, pengasingan dan kesan yang - terhad untuk pengguna, dengan menggunakan IsolateOrigins dengan - senarai tapak yang hendak diasingkan. Tetapan ini, SitePerProcess, - mengasingkan semua tapak. - Jika dasar ini didayakan, setiap tapak akan menjalankan proses masing-masing. - Jika dasar ini dilumpuhkan, logik pengurusan proses Pengasingan setiap Tapak akan dikuatkuasakan. - Jika dasar ini tidak dikonfigurasi, pengguna boleh mengubah tetapan ini. - Pada <ph name="PRODUCT_OS_NAME" />, anda disyorkan untuk turut menetapkan dasar peranti <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> pada nilai yang sama. Jika nilai yang dinyatakan oleh kedua-dua dasar tidak sepadan, kelewatan mungkin berlaku apabila memasuki sesi pengguna semasa nilai yang dinyatakan oleh dasar pengguna sedang digunakan. - </translation> <translation id="5302612588919538756">Dasar ini ditamatkan, sebaliknya pertimbangkan untuk menggunakan SyncDisabled. Membenarkan pengguna log masuk ke <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index c823b95..e6a2513 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -58,18 +58,6 @@ Als dit beleid wordt gebruikt, zijn alle printers beschikbaar voor de gebruiker, met uitzondering van de ID's die in dit beleid worden vermeld. </translation> -<translation id="1181881366217399113"> - OPMERKING: Dit beleid is experimenteel en kan de functionaliteit verstoren. - Als het beleid is ingeschakeld, wordt elk van de benoemde herkomsten in - een door komma's gescheiden lijst uitgevoerd in een eigen proces. - Hiermee worden ook herkomsten geïsoleerd die worden benoemd door - subdomeinen. Als je bijvoorbeeld https://example.com/ opgeeft, wordt ook - https://foo.example.com/ geïsoleerd als onderdeel van de site - https://example.com/. - Als het beleid is uitgeschakeld, wordt de procesbeheerlogica voor isolatie per site van kracht. - Als het beleid niet is ingesteld, kan de gebruiker deze instelling wijzigen. - Voor <ph name="PRODUCT_OS_NAME" /> is het raadzaam ook het apparaatbeleid <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> in te stellen op dezelfde waarde. Als de waarden van twee beleidsregels niet overeenkomen, treedt er mogelijk een vertraging op wanneer een gebruikerssessie wordt gestart terwijl de waarde van het gebruikersbeleid wordt toegepast. - </translation> <translation id="1198465924256827162">De frequentie, in milliseconden, waarmee uploads van de apparaatstatus worden verzonden. Als dit beleid niet is ingesteld, is de standaardfrequentie 3 uur. De minimaal toegestane frequentie is 60 seconden.</translation> @@ -687,18 +675,6 @@ De beleidswaarde moet worden opgegeven in milliseconden. Waarden moeten lager zijn dan of gelijk zijn aan de vertraging van scherm uitschakelen (indien ingesteld) en de inactieve vertraging.</translation> <translation id="2987155890997901449">ARC inschakelen</translation> <translation id="2987227569419001736">Gebruik van de Web Bluetooth API beheren</translation> -<translation id="2998886474614739865"> - OPMERKING: Dit beleid is experimenteel en kan de functionaliteit verstoren. - 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 in te stellen op dezelfde waarde. Als de waarden niet overeenkomen, treedt er mogelijk een vertraging op wanneer een gebruikerssessie wordt opgegeven terwijl de waarde van het gebruikersbeleid wordt toegepast. - Als het beleid is ingeschakeld, wordt elk van de benoemde herkomsten - in een door komma's gescheiden lijst uitgevoerd in een eigen proces. - Hiermee worden ook herkomsten geïsoleerd die worden benoemd door - subdomeinen. Als je bijvoorbeeld https://example.com/ opgeeft, wordt ook - https://foo.example.com/ geïsoleerd als onderdeel van de site - https://example.com/. - Als het beleid is uitgeschakeld, wordt de procesbeheerlogica voor isolatie per site van kracht. - Als het beleid niet is ingesteld, worden de standaardinstellingen van het platform voor site-isolatie gebruikt voor het inlogscherm. - </translation> <translation id="3016255526521614822">Notitie-apps die zijn toegestaan op het <ph name="PRODUCT_OS_NAME" />-vergrendelingsscherm toevoegen aan de witte lijst</translation> <translation id="3021562480854470924">Aantal mijlpalen dat rollback kan terugzetten</translation> <translation id="3030000825273123558">Rapportage van statistieken inschakelen</translation> @@ -808,17 +784,6 @@ Als dit beleid is ingesteld op een niet-lege tekenreeks, wordt die tekenreeks gebruikt als de naam van de <ph name="PRODUCT_NAME" />-bestemming. Anders wordt de apparaatnaam gebruikt voor de bestemmingsnaam. Als dit beleid niet is ingesteld, is de naam van de bestemming de apparaatnaam en kan de eigenaar van het apparaat (of een gebruiker in het domein dat het apparaat beheert) deze naam wijzigen. De naam mag maximaal 24 tekens lang zijn.</translation> <translation id="3381968327636295719"> gebruiken</translation> -<translation id="3386001018488754001"> - OPMERKING: Dit beleid is experimenteel en kan de functionaliteit verstoren. - Dit beleid is van toepassing op het inlogscherm. Zie ook het beleid <ph name="SITE_PER_PROCESS_POLICY_NAME" /> dat van toepassing is op de gebruikerssessie. Het is raadzaam beide beleidsregels in te stellen op dezelfde waarde. Als de waarden niet overeenkomen, treedt er mogelijk een vertraging op wanneer een gebruikerssessie wordt opgegeven terwijl de waarde van het gebruikersbeleid wordt toegepast. - Je kunt de beleidsinstelling IsolateOrigins bekijken om optimaal gebruik - te maken van beide functies (isolatie en beperkte impact voor gebruikers) - door IsolateOrigins te gebruiken met een lijst van de sites die je wilt isoleren. - Met deze instelling (SitePerProcess) worden alle sites geïsoleerd. - Als het beleid is ingeschakeld, wordt elke site uitgevoerd in een eigen proces. - Als het beleid is uitgeschakeld, wordt de procesbeheerlogica voor isolatie per site van kracht. - Als het beleid niet is ingesteld, kan de gebruiker deze instelling wijzigen. - </translation> <translation id="3395348522300156660">Hiermee worden de printers gespecificeerd die een gebruiker kan gebruiken. Dit beleid wordt alleen gebruikt als <ph name="PRINTERS_WHITELIST" /> is gekozen voor <ph name="DEVICE_PRINTERS_ACCESS_MODE" />. @@ -1435,17 +1400,6 @@ 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="5301787427319106606"> - OPMERKING: Dit beleid is experimenteel en kan de functionaliteit verstoren. - Je kunt de beleidsinstelling IsolateOrigins bekijken om optimaal gebruik - te maken van beide functies (isolatie en beperkte impact voor gebruikers) - door IsolateOrigins te gebruiken met een lijst van de sites die je wilt isoleren. - Met deze instelling (SitePerProcess) worden alle sites geïsoleerd. - Als het beleid is ingeschakeld, wordt elke site uitgevoerd in een eigen proces. - Als het beleid is uitgeschakeld, wordt de procesbeheerlogica voor isolatie per site van kracht. - Als het beleid niet is ingesteld, kan de gebruiker deze instelling wijzigen. - Voor <ph name="PRODUCT_OS_NAME" /> is het raadzaam ook het apparaatbeleid <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> in te stellen op dezelfde waarde. Als de waarden van twee beleidsregels niet overeenkomen, treedt er mogelijk een vertraging op wanneer een gebruikerssessie wordt opgegeven terwijl de waarde van het gebruikersbeleid wordt toegepast. - </translation> <translation id="5302612588919538756">Dit beleid is verouderd. Je kunt in plaats hiervan SyncDisabled gebruiken. Hiermee wordt toegestaan dat de gebruiker inlogt bij <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb index 2a3b10d..76ffc681 100644 --- a/components/policy/resources/policy_templates_no.xtb +++ b/components/policy/resources/policy_templates_no.xtb
@@ -58,17 +58,6 @@ Hvis denne regelen brukes, får brukeren tilgang til alle skrivere – unntatt eventuelle ID-er som er oppført i denne regelen. </translation> -<translation id="1181881366217399113"> - MERK: Denne regelen er på forsøksstadiet, noe som kan føre til at funksjonaliteten ikke fungerer som den skal. - Hvis regelen er aktivert, kjøres alle navngitte opprinnelser i - kommadelte lister i sine egne prosesser. Da isoleres også - opprinnelser som har navn basert på underdomener. Hvis for eksempel - https://example.com/ angis, isoleres også https://foo.example.com/ som - en del av nettstedet https://example.com/. - Hvis regelen er deaktivert, gjelder logikken for administrering av nettstedsisolering på prosessbasis. - Hvis regelen ikke er konfigurert, kan brukeren endre denne innstillingen. - I <ph name="PRODUCT_OS_NAME" /> bør du også angi samme verdi for enhetsinnstillingene <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />. Hvis verdiene som er angitt av de to reglene, ikke samsvarer, kan det oppstå en forsinkelse ved start av en brukerøkt mens verdien som er angitt av brukerinnstillingene, blir brukt. - </translation> <translation id="1198465924256827162">Hvor ofte opplastinger av enhetsstatusen sendes, i millisekunder. Hvis denne regelen ikke spesifiseres, er standardfrekvensen 3 timer. @@ -678,17 +667,6 @@ Innstillingsverdien må spesifiseres i millisekunder. Verdien er låst til å være lavere enn eller samsvarende med forsinkelsen for å slå av skjermen (hvis den er konfigurert) og inaktivitetsforsinkelsen.</translation> <translation id="2987155890997901449">Slå på ARC</translation> <translation id="2987227569419001736">Kontrollér bruken av Web Bluetooth API</translation> -<translation id="2998886474614739865"> - MERK: Denne regelen er på forsøksstadiet, noe som kan føre til at funksjonaliteten ikke fungerer som den skal. - Denne regelen gjelder for påloggingsskjermen. Se også regelen <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, som gjelder for brukerøkten. Vi anbefaler å bruke den samme verdien for begge reglene. Hvis verdiene ikke samsvarer, kan det oppstå en forsinkelse ved start av en brukerøkt mens verdien som er angitt av brukerinnstillingene, blir brukt. - Hvis regelen er aktivert, kjøres alle navngitte opprinnelser i kommadelte - lister i sine egne prosesser. Da isoleres også opprinnelser som har navn som er - basert på underdomener. Hvis for eksempel https://example.com/ angis, - isoleres også https://foo.example.com/ som en del av nettstedet - https://example.com/. - Hvis regelen er deaktivert, gjelder logikken for administrering av nettstedsisolering på prosessbasis. - Hvis regelen ikke er konfigurert, brukes plattformens standardinnstillinger for nettstedsisolering for påloggingsskjermen. - </translation> <translation id="3016255526521614822">Godkjenn notatapper for å tillate dem på låseskjermen for <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Antall milepæler rollback er tillatt for</translation> <translation id="3030000825273123558">Aktiver rapportering av beregninger</translation> @@ -787,18 +765,6 @@ Hvis denne innstillingen er satt til en streng som ikke er tom, brukes denne strengen som navnet på destinasjonen for <ph name="PRODUCT_NAME" />. Ellers blir enhetsnavnet angitt som destinasjonsnavnet. Hvis denne innstillingen ikke er satt til noen verdi, blir enhetsnavnet angitt som destinasjonsnavnet, og eieren av enheten (eller en bruker fra domenet som administrerer enheten) kan endre det. Navnet er begrenset til 24 tegn.</translation> <translation id="3381968327636295719">Bruk vertsnettleser som standard</translation> -<translation id="3386001018488754001"> - MERK: Denne regelen er på forsøksstadiet, noe som kan føre til at funksjonaliteten ikke fungerer som den skal. - Denne regelen gjelder for påloggingsskjermen. Se også regelen <ph name="SITE_PER_PROCESS_POLICY_NAME" />, som gjelder for brukerøkten. Vi anbefaler å bruke den samme verdien for begge reglene. Hvis verdiene ikke samsvarer, kan det oppstå en forsinkelse ved start av en brukerøkt mens verdien som er angitt av brukerinnstillingene, blir brukt. - Det kan være lurt å endre innstillingen for IsolateOrigins-regelen - for å få det beste fra begge verdener – isolering og begrenset - innvirkning for brukere – ved å bruke IsolateOrigins sammen med - en liste over nettstedene du vil isolere. Denne innstillingen - (SitePerProcess) isolerer alle nettsteder. - Hvis regelen er aktivert, kjøres alle nettsteder i sine egne prosesser. - Hvis regelen er deaktivert, gjelder logikken for administrering av nettstedsisolering på prosessbasis. - Hvis regelen ikke er konfigurert, kan brukeren endre denne innstillingen. - </translation> <translation id="3395348522300156660">Angir skriverne som en bruker kan bruke. Denne regelen brukes bare hvis <ph name="PRINTERS_WHITELIST" /> er valgt for <ph name="DEVICE_PRINTERS_ACCESS_MODE" />. @@ -1406,17 +1372,6 @@ Hvis regelen ikke er konfigurert, eller hvis den er angitt som en tom streng eller et ugyldig portområde, kan WebRTC bruke alle tilgjengelige lokale UDP-porter.</translation> <translation id="5290940294294002042">Angi en liste over programtillegg som brukeren kan aktivere eller deaktivere</translation> -<translation id="5301787427319106606"> - MERK: Denne regelen er på forsøksstadiet, noe som kan føre til at funksjonaliteten ikke fungerer som den skal! - Det kan være lurt å endre innstillingen for IsolateOrigins-regelen for å få - det beste fra begge verdener – isolering og begrenset innvirkning for brukere – - ved å bruke IsolateOrigins sammen med en liste over nettstedene du vil isolere. - Denne innstillingen (SitePerProcess) isolerer alle nettsteder. - Hvis regelen er aktivert, kjøres alle nettsteder i sine egne prosesser. - Hvis regelen er deaktivert, gjelder logikken for administrering av nettstedsisolering på prosessbasis. - Hvis regelen ikke er konfigurert, kan brukeren endre denne innstillingen. - I <ph name="PRODUCT_OS_NAME" /> bør du også angi enhetsinnstillingene for <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> til samme verdi. Hvis verdiene som er angitt av de to reglene, ikke samsvarer, kan det oppstå en forsinkelse ved start av en brukerøkt mens verdien som er angitt av brukerinnstillingene, blir brukt. - </translation> <translation id="5302612588919538756">Denne regelen er avviklet. Vurder å bruke SyncDisabled i stedet. Tillater at brukeren logger på <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb index 5ee21c1..87d5bd5b 100644 --- a/components/policy/resources/policy_templates_pl.xtb +++ b/components/policy/resources/policy_templates_pl.xtb
@@ -56,19 +56,6 @@ Jeśli ta zasada jest używana, użytkownik ma dostęp do wszystkich drukarek z wyjątkiem tych, których identyfikatory zostały w niej określone. </translation> -<translation id="1181881366217399113"> - UWAGA: ta zasada jest eksperymentalna i może zakłócać poprawne działanie innych funkcji. - Jeśli ta zasada jest włączona, każde nazwane źródło na liście oddzielonej - przecinkami będzie działać w obrębie własnego procesu. Powoduje to też - izolację źródeł z nazwami subdomen, np. określenie https://example.com/ - spowoduje, że także adres https://foo.example.com/ będzie izolowany jako - część witryny https://example.com/. - Jeśli ta zasada jest wyłączona, działa logika zarządzania procesem - sprzed izolacji witryny. - Jeśli ta zasada nie jest skonfigurowana, użytkownik może zmienić - to ustawienie. - W systemie <ph name="PRODUCT_OS_NAME" /> zaleca się również ustawienie tej samej wartości zasady <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> dotyczącej urządzeń. Jeśli wartości tych zasad są różne, przy uruchamianiu sesji użytkownika może nastąpić opóźnienie, gdy stosowana jest wartość określona przez zasady dotyczące użytkowników. - </translation> <translation id="1198465924256827162">Częstotliwość wysyłania raportów o stanie urządzenia (w milisekundach). Jeśli ta zasada nie jest skonfigurowana, domyślna częstotliwość wynosi trzy @@ -666,17 +653,6 @@ Wartość tej zasady powinna być określona w milisekundach. Wartości nie mogą być większe niż opóźnienie wyłączenia ekranu (jeśli jest ustawione) i opóźnienie bezczynności.</translation> <translation id="2987155890997901449">Włączenie ARC</translation> <translation id="2987227569419001736">Kontrolowanie użycia interfejsu API Web Bluetooth</translation> -<translation id="2998886474614739865"> - UWAGA: ta zasada jest eksperymentalna i może zakłócać poprawne działanie innych funkcji. - Ta zasada ma wpływ na ekran logowania. Zapoznaj się też z informacjami o zasadzie <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, która ma wpływ na sesję użytkownika. Zaleca się skonfigurowanie obu tych zasad w jednakowy sposób. Jeśli wartości tych zasad są różne, przy uruchamianiu sesji użytkownika może nastąpić opóźnienie, gdy stosowana jest wartość określona przez zasady dotyczące użytkowników. - Jeśli ta zasada jest włączona, każde nazwane źródło na liście oddzielonej - przecinkami będzie działać w obrębie własnego procesu. Powoduje to też - izolację źródeł z nazwami subdomen, np. określenie https://example.com/ - spowoduje, że także adres https://foo.example.com/ będzie izolowany jako - część witryny https://example.com/. - Jeśli ta zasada jest wyłączona, działa logika zarządzania procesem sprzed izolacji witryny. - Jeśli zasada nie jest skonfigurowana, do ekranu logowania będą stosowane domyślne ustawienia platformy dotyczące izolacji witryn. - </translation> <translation id="3016255526521614822">Aplikacje do robienia notatek dodane do białej listy, które są dozwolone na ekranie blokady w: <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Liczba kamieni milowych, dla której dozwolone jest cofnięcie wersji oprogramowania</translation> <translation id="3030000825273123558">Włącz raportowanie danych</translation> @@ -777,19 +753,6 @@ Jeśli ta zasada jest ustawiona na niepusty ciąg znaków, to jest on nazwą miejsca docelowego <ph name="PRODUCT_NAME" />. W przeciwnym razie nazwą miejsca docelowego jest nazwa urządzenia. Jeśli ta zasada nie jest ustawiona, nazwą miejsca docelowego jest nazwa urządzenia, a właściciel urządzenia (lub użytkownik z domeny zarządzającej urządzeniem) może ją zmienić. Nazwa może mieć maksymalnie 24 znaki.</translation> <translation id="3381968327636295719">Używaj domyślnie przeglądarki hosta</translation> -<translation id="3386001018488754001"> - UWAGA: ta zasada jest eksperymentalna i może zakłócać poprawne działanie innych funkcji. - Ta zasada ma wpływ na ekran logowania. Zapoznaj się też z informacjami o zasadzie <ph name="SITE_PER_PROCESS_POLICY_NAME" />, która ma wpływ na sesję użytkownika. Zaleca się skonfigurowanie obu tych zasad w jednakowy sposób. Jeśli wartości tych zasad są różne, przy uruchamianiu sesji użytkownika może nastąpić opóźnienie, gdy stosowana jest wartość określona przez zasady dotyczące użytkowników. - Możesz dostosować ustawienie zasady IsolateOrigins, by uzyskać najlepsze - rezultaty z użycia obu opcji – izolacji i ograniczonego wpływu na - użytkowników. W tym celu dodaj do zasady IsolateOrigins listę witryn, - które chcesz izolować. - Ustawienie SitePerProcess - izoluje wszystkie witryny. - Jeśli ta zasada jest włączona, każda witryna będzie działać w obrębie własnego procesu. - Jeśli ta zasada jest wyłączona, działa logika zarządzania procesem sprzed izolacji witryny. - Jeśli ta zasada nie jest skonfigurowana, użytkownik może zmienić to ustawienie. - </translation> <translation id="3395348522300156660">Określa drukarki, z których może korzystać użytkownik. Ta zasada jest używana tylko wtedy, gdy dla zasady <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> wybrano ustawienie <ph name="PRINTERS_WHITELIST" /> @@ -1376,18 +1339,6 @@ Jeśli zasada nie jest ustawiona lub jest ustawiona na pusty ciąg lub nieprawidłowy zakres portów, WebRTC może skorzystać z dowolnego lokalnego portu UDP, jaki jest dostępny.</translation> <translation id="5290940294294002042">Określ listę wtyczek, które użytkownik może włączyć lub wyłączyć</translation> -<translation id="5301787427319106606"> - UWAGA: ta zasada jest eksperymentalna i może zakłócać poprawne działanie innych funkcji. - Możesz dostosować ustawienie zasady IsolateOrigins, by uzyskać najlepsze - rezultaty z użycia obu opcji – izolacji i ograniczonego wpływu na - użytkowników. W tym celu dodaj do zasady IsolateOrigins listę witryn, - które chcesz izolować. - Ustawienie SitePerProcess izoluje wszystkie witryny. - Jeśli ta zasada jest włączona, każda witryna będzie działać w obrębie własnego procesu. - Jeśli ta zasada jest wyłączona, działa logika zarządzania procesem sprzed izolacji witryny. - Jeśli ta zasada nie jest skonfigurowana, użytkownik może zmienić to ustawienie. - W systemie <ph name="PRODUCT_OS_NAME" /> zaleca się również ustawienie tej samej wartości zasady dotyczącej urządzeń <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Jeśli wartości tych zasad są różne, przy uruchamianiu sesji użytkownika może nastąpić opóźnienie, gdy stosowana jest wartość określona przez zasady dotyczące użytkowników. - </translation> <translation id="5302612588919538756">Ta zasada została wycofana. Zamiast niej możesz użyć SyncDisabled. Pozwala użytkownikowi na zalogowanie się w <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 5be92381..ab5dbff2db 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -54,17 +54,6 @@ Se esta política for usada, todas as impressoras serão fornecidas ao usuário, com exceção dos códigos listados. </translation> -<translation id="1181881366217399113"> - OBSERVAÇÃO: esta política é experimental e pode comprometer a funcionalidade. - Se a política for ativada, cada origem indicada em uma - lista separada por vírgulas será executada no próprio processo. Isso também isolará - as origens indicadas por subdomínios. Por exemplo, especificar https://example.com/ - também isolará https://foo.example.com/ como parte do - site https://example.com/. - Se a política for desativada, a lógica de gerenciamento de processos por isolamento de sites entrará em vigor. - Se a política não for configurada, o usuário poderá alterar essa configuração. - No <ph name="PRODUCT_OS_NAME" />, também é recomendado configurar a política do dispositivo <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> com o mesmo valor. Se os valores especificados pelas duas políticas não forem iguais, poderá haver um atraso ao entrar em uma sessão do usuário enquanto o valor especificado pela política do usuário estiver sendo aplicado. - </translation> <translation id="1198465924256827162">Frequência com que as atualizações de status do dispositivo são enviadas, em milissegundos. Se esta política não é configurada, a frequência padrão é de três horas. A frequência @@ -659,17 +648,6 @@ O valor da política deve ser especificado em milissegundos. Os valores são fixos de modo a serem inferiores ou iguais ao intervalo de desligamento da tela (se definido) e ao intervalo de inatividade.</translation> <translation id="2987155890997901449">Ativar ARC</translation> <translation id="2987227569419001736">Controla o uso da API Web Bluetooth</translation> -<translation id="2998886474614739865"> - OBSERVAÇÃO: esta política é experimental e pode comprometer a funcionalidade. - Esta política se aplica à tela de login. Veja também a política <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, que se aplica à sessão do usuário. É recomendável configurar as duas políticas com o mesmo valor. Se os valores não forem iguais, poderá haver um atraso ao entrar em uma sessão do usuário enquanto o valor especificado pela política do usuário estiver sendo aplicado. - Se a política for ativada, cada origem indicada em uma - lista separada por vírgulas será executada no próprio processo. Isso também isolará - as origens indicadas por subdomínios. Por exemplo, especificar https://example.com/ - também isolará https://foo.example.com/ como parte do - site https://example.com/. - Se a política for desativada, a lógica de gerenciamento de processos por isolamento de sites entrará em vigor. - Se a política não for configurada, as configurações de isolamento de sites padrão da plataforma serão usadas para a tela de login. - </translation> <translation id="3016255526521614822">Colocar na lista de permissões os apps de anotação permitidos na tela de bloqueio do <ph name="PRODUCT_OS_NAME" />.</translation> <translation id="3021562480854470924">Número de marcos em que a reversão é permitida</translation> <translation id="3030000825273123558">Ativa relatórios de métricas</translation> @@ -773,17 +751,6 @@ Se essa política for definida como uma string não vazia, essa string será usada como o nome do destino do <ph name="PRODUCT_NAME" />. Caso contrário, o nome do destino será o nome do dispositivo. Se essa política não for definida, o nome do destino será o nome do dispositivo, e o proprietário do dispositivo (ou um usuário do domínio que está gerenciando o dispositivo) poderá alterá-lo. O nome é limitado a 24 caracteres.</translation> <translation id="3381968327636295719">Usar o navegador de host por padrão</translation> -<translation id="3386001018488754001"> - OBSERVAÇÃO: esta política é experimental e pode comprometer a funcionalidade. - Esta política se aplica à tela de login. Veja também a política <ph name="SITE_PER_PROCESS_POLICY_NAME" />, que se aplica à sessão do usuário. É recomendável configurar as duas políticas com o mesmo valor. Se os valores não forem iguais, poderá haver um atraso ao entrar em uma sessão do usuário enquanto o valor especificado pela política do usuário estiver sendo aplicado. - Veja a configuração da política IsolateOrigins para ter os - melhores resultados, com isolamento e impacto limitado para os usuários, utilizando - IsolateOrigins com uma lista dos sites que você quer isolar. Esta configuração, - SitePerProcess, isola todos os sites. - Se a política for ativada, cada site será executado no próprio processo. - Se a política for desativada, a lógica de gerenciamento de processos por isolamento de sites entrará em vigor. - Se a política não for configurada, o usuário poderá alterar essa configuração. - </translation> <translation id="3395348522300156660">Especifica as impressoras que um usuário pode usar. Esta política será usada apenas se <ph name="PRINTERS_WHITELIST" /> for escolhida para <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1373,17 +1340,6 @@ Se a política não for configurada ou for definida para a string em branco ou um alcance de porta inválido, o WebRTC terá permissão para usar qualquer porta UDP local disponível.</translation> <translation id="5290940294294002042">Especificar uma lista de plug-ins que podem ser ativados ou desativados pelo usuário</translation> -<translation id="5301787427319106606"> - OBSERVAÇÃO: esta política é experimental e pode comprometer a funcionalidade. - Veja a configuração da política IsolateOrigins para ter os - melhores resultados, com isolamento e impacto limitado para os usuários, utilizando - IsolateOrigins com uma lista dos sites que você quer isolar. Esta configuração, - SitePerProcess, isola todos os sites. - Se a política for ativada, cada site será executado no próprio processo. - Se a política for desativada, a lógica de gerenciamento de processos por isolamento de sites entrará em vigor. - Se a política não for configurada, o usuário poderá alterar essa configuração. - No <ph name="PRODUCT_OS_NAME" />, também é recomendado configurar a política do dispositivo <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> com o mesmo valor. Se os valores especificados pelas duas políticas não forem iguais, poderá haver um atraso ao entrar em uma sessão do usuário enquanto o valor especificado pela política do usuário estiver sendo aplicado. - </translation> <translation id="5302612588919538756">O uso desta política está suspenso. Use SyncDisabled em vez dela. Permite que o usuário faça login no <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb index 0f9d130..de66752 100644 --- a/components/policy/resources/policy_templates_pt-PT.xtb +++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -58,18 +58,6 @@ Se esta política for utilizada, todas as impressoras são disponibilizadas ao utilizador, exceto aquelas cujos IDs forem indicados nesta política. </translation> -<translation id="1181881366217399113"> - NOTA: esta política é experimental e pode interferir no funcionamento! - Se a política estiver ativada, cada uma das origens nomeadas numa - lista separada por vírgulas é executada no seu próprio processo. Deste modo, são - também isoladas as origens nomeadas por subdomínios. Por exemplo, ao - especificar https://example.com/, https://foo.example.com/ também é isolado - como parte do site https://example.com/. - Se a política estiver desativada, aplica-se a lógica de gestão de processos de - isolamento por site. - Se a política não estiver configurada, o utilizador pode alterar esta definição. - No <ph name="PRODUCT_OS_NAME" />, recomenda-se que defina também a política do dispositivo <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> para o mesmo valor. Se os valores especificados pelas duas políticas forem diferentes, pode ocorrer um atraso ao entrar numa sessão de utilizador enquanto o valor especificado pela Política do Utilizador for aplicado. - </translation> <translation id="1198465924256827162">Com que frequência os carregamentos do estado do dispositivo são enviados, em milissegundos. Se esta política não for definida, a frequência predefinida é de 3 horas. A frequência mínima @@ -672,18 +660,6 @@ O valor da política deve ser especificado em milissegundos. Os valores devem ser inferiores ou iguais ao atraso para desligar o ecrã (se estiver definido) e ao atraso de inatividade.</translation> <translation id="2987155890997901449">Ativar ARC</translation> <translation id="2987227569419001736">Controlar a utilização da API Web Bluetooth</translation> -<translation id="2998886474614739865"> - NOTA: esta política é experimental e pode interferir no funcionamento! - Esta política aplica-se ao ecrã de início de sessão. Consulte também a política <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> que se aplica à sessão do utilizador. É recomendável definir ambas as políticas com o mesmo valor. Se os valores forem diferentes, pode ocorrer um atraso ao entrar numa sessão de utilizador enquanto o valor especificado pela Política do Utilizador é aplicado. - Se a política estiver ativada, cada uma das origens nomeadas numa - lista separada por vírgulas é executada no seu próprio processo. Deste modo, são também isoladas - as origens nomeadas por subdomínios. Por exemplo, ao especificar https://example.com/, - https://foo.example.com/ também é isolado como parte do site - https://example.com/. - Se a política estiver desativada, aplica-se a lógica de gestão de processos de - isolamento por site. - Se a política não estiver configurada, são utilizadas as predefinições de isolamento de site da plataforma para o ecrã de início de sessão. - </translation> <translation id="3016255526521614822">Adicionar à lista de autorizações as aplicações para tirar notas permitidas no ecrã de bloqueio do <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Número de marcos para os quais é autorizada a reversão.</translation> <translation id="3030000825273123558">Ativar relatório de métricas</translation> @@ -787,18 +763,6 @@ Se esta política estiver definida como uma string não vazia, essa string é utilizada como o nome do destino do <ph name="PRODUCT_NAME" />. Caso contrário, o nome do destino é o nome do dispositivo. Se esta política não estiver definida, o nome do destino é o nome do dispositivo e o proprietário do dispositivo (ou um utilizador do domínio que gere o dispositivo) pode alterá-lo. O nome tem um limite de 24 carateres.</translation> <translation id="3381968327636295719">Utilizar o navegador anfitrião por predefinição</translation> -<translation id="3386001018488754001"> - NOTA: esta política é experimental e pode interferir no funcionamento! - Esta política aplica-se ao ecrã de início de sessão. Consulte também a política <ph name="SITE_PER_PROCESS_POLICY_NAME" /> que se aplica à sessão do utilizador. É recomendável definir ambas as políticas com o mesmo valor. Se os valores forem diferentes, pode ocorrer um atraso ao entrar numa sessão de utilizador enquanto o valor especificado pela Política do Utilizador é aplicado. - Recomendamos que consulte a definição da política IsolateOrigins para obter o - melhor de dois mundos: isolamento e impacto limitado para os utilizadores, ao utilizar a - IsolateOrigins com uma lista dos sites que pretende isolar. Esta definição, - SitePerProcess, isola todos os sites. - Se a política estiver ativada, cada site é executado no seu próprio processo. - Se a política estiver desativada, aplica-se a lógica de gestão de processos de - isolamento por site. - Se a política não estiver configurada, o utilizador pode alterar esta definição. - </translation> <translation id="3395348522300156660">Especifica as impressoras disponíveis para um utilizador. Esta política é apenas utilizada se <ph name="PRINTERS_WHITELIST" /> for selecionado para <ph name="DEVICE_PRINTERS_ACCESS_MODE" />. @@ -1394,18 +1358,6 @@ Se a política não for definida ou se for definida para a string vazia ou um intervalo de portas inválido, o WebRTC está autorizado a utilizar qualquer porta UDP local disponível.</translation> <translation id="5290940294294002042">Indique uma lista de plug-ins que o utilizador pode ativar ou desativar</translation> -<translation id="5301787427319106606"> - NOTA: esta política é experimental e pode interferir no funcionamento! - Recomendamos que consulte a definição da política IsolateOrigins para obter o - melhor de dois mundos: isolamento e impacto limitado para os utilizadores, ao utilizar a - IsolateOrigins com uma lista dos sites que pretende isolar. Esta definição, - SitePerProcess, isola todos os sites. - Se a política estiver ativada, cada site é executado no seu próprio processo. - Se a política estiver desativada, aplica-se a lógica de gestão de processos de - isolamento por site. - Se a política não estiver configurada, o utilizador pode alterar esta definição. - No <ph name="PRODUCT_OS_NAME" />, recomenda-se que defina também a política do dispositivo <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> com o mesmo valor. Se os valores especificados pelas duas políticas forem diferentes, pode ocorrer um atraso ao entrar numa sessão de utilizador enquanto o valor especificado pela Política do Utilizador é aplicado. - </translation> <translation id="5302612588919538756">Esta política foi descontinuada. Considere a utilização de SyncDisabled em alternativa. Permite que o utilizador inicie sessão no <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb index 612159b..61e2781 100644 --- a/components/policy/resources/policy_templates_ro.xtb +++ b/components/policy/resources/policy_templates_ro.xtb
@@ -58,17 +58,6 @@ Dacă această politică este folosită, utilizatorii vor putea folosi toate imprimantele, cu excepția celor ale căror ID-uri sunt specificate în politică. </translation> -<translation id="1181881366217399113"> - NOTĂ: această politică este experimentală și poate întrerupe funcționarea! - Dacă politica este activată, fiecare dintre originile indicate într-o listă - de valori separate prin virgulă va rula propriul proces. Astfel, originile indicate - vor fi izolate după subdomenii; de exemplu, specificarea https://example.com/ - va cauza și izolarea https://foo.example.com/ ca parte a site-ului - https://example.com/. - Dacă politica este dezactivată, va fi aplicată logica de gestionare a proceselor prealabilă izolării site-ului. - Dacă politica nu este configurată, utilizatorul va putea modifica această setare. - În <ph name="PRODUCT_OS_NAME" />, se recomandă setarea politicii privind dispozitivele <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> la aceeași valoare. Dacă valorile specificate în cele două politici nu corespund, poate apărea o întârziere la intrarea în sesiunea utilizatorului până ce se aplică valoarea specificată în politica privind utilizatorii. - </translation> <translation id="1198465924256827162">Frecvența de trimitere a informațiilor privind starea dispozitivului, în milisecunde. Dacă această politică nu este configurată, frecvența prestabilită este de 3 @@ -667,13 +656,6 @@ Valoarea politicii trebuie specificată în milisecunde. Valorile trebuie să fie mai mici sau egale cu intervalul pentru oprirea ecranului (dacă este setat) și cu intervalul de inactivitate.</translation> <translation id="2987155890997901449">Activează ARC</translation> <translation id="2987227569419001736">Controlează folosirea API-ului Web Bluetooth</translation> -<translation id="2998886474614739865"> - NOTĂ: această politică este experimentală și poate întrerupe funcționarea! - Această politică se aplică pentru ecranul de conectare. Consultă și politica <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, care se aplică pentru sesiunea utilizatorului. Se recomandă setarea ambelor politici la aceeași valoare. Dacă valorile nu corespund, poate apărea o întârziere la intrarea în sesiunea utilizatorului până ce se aplică valoarea specificată în politica privind utilizatorii. - Dacă politica este activată, fiecare dintre originile indicate într-o listă de valori separate prin virgulă va rula propriul proces. Astfel, originile indicate vor fi izolate după subdomenii; de exemplu, specificarea https://example.com/ va cauza și izolarea https://foo.example.com/ ca parte a site-ului https://example.com/. - Dacă politica este dezactivată, va fi aplicată logica de gestionare a proceselor prealabilă izolării site-ului. - Dacă politica nu este configurată, pentru ecranul de conectare vor fi folosite setările de izolare a site-ului prestabilite pentru platforma respectivă. - </translation> <translation id="3016255526521614822">Trece în lista albă aplicațiile pentru creat note permise pe ecranul de blocare din <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Numărul de repere pentru care este permisă revenirea la versiunea anterioară</translation> <translation id="3030000825273123558">Activați raportarea statisticilor</translation> @@ -777,17 +759,6 @@ Dacă această politică este setată la un șir completat, acel șir va fi folosit ca nume al destinației pentru <ph name="PRODUCT_NAME" />. În caz contrar, numele destinației va fi numele dispozitivului. Dacă această politică nu este setată, numele destinației va fi numele dispozitivului, iar proprietarului dispozitivului (sau unui utilizator de pe domeniul care gestionează dispozitivul) i se va permite să îl modifice. Numele este limitat la 24 de caractere.</translation> <translation id="3381968327636295719">Utilizează în mod prestabilit browserul gazdă</translation> -<translation id="3386001018488754001"> - NOTĂ: această politică este experimentală și poate întrerupe funcționarea! - Această politică se aplică pentru ecranul de conectare. Consultă și politica <ph name="SITE_PER_PROCESS_POLICY_NAME" />, care se aplică pentru sesiunea utilizatorului. Se recomandă setarea ambelor politici la aceeași valoare. Dacă valorile nu corespund, poate apărea o întârziere la intrarea în sesiunea utilizatorului până ce se aplică valoarea specificată în politica privind utilizatorii. - Îți recomandăm să verifici setarea pentru politica IsolateOrigins pentru a - beneficia la maximum de fiecare, de izolare și de impact limitat asupra utilizatorilor, folosind - IsolateOrigins cu o listă a site-urilor pe care vrei să le izolezi. Această setare, - SitePerProcess, izolează toate site-urile. - Dacă politica este activată, fiecare site va rula propriul proces. - Dacă politica este dezactivată, va fi aplicată logica de gestionare a proceselor prealabilă izolării site-ului. - Dacă politica nu este configurată, utilizatorul va putea modifica această setare. - </translation> <translation id="3395348522300156660">Specifică imprimantele pe care le poate folosi un utilizator. Această politică este folosită numai dacă opțiunea <ph name="PRINTERS_WHITELIST" /> este aleasă pentru <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1391,17 +1362,6 @@ Dacă politica nu este configurată sau dacă este setată la un șir gol ori la un interval de porturi nevalid, WebRTC poate să folosească orice port UDP local disponibil.</translation> <translation id="5290940294294002042">Specifică o listă de pluginuri pe care utilizatorul le poate activa sau dezactiva</translation> -<translation id="5301787427319106606"> - NOTĂ: această politică este experimentală și poate întrerupe funcționarea! - Îți recomandăm să verifici setarea pentru politica IsolateOrigins pentru a - beneficia la maximum de fiecare, de izolare și de impact limitat asupra utilizatorilor, folosind - IsolateOrigins cu o listă a site-urilor pe care vrei să le izolezi. Această setare, - SitePerProcess, izolează toate site-urile. - Dacă politica este activată, fiecare site va rula propriul proces. - Dacă politica este dezactivată, va fi aplicată logica de gestionare a proceselor prealabilă izolării site-ului. - Dacă politica nu este configurată, utilizatorul va putea modifica această setare. - În <ph name="PRODUCT_OS_NAME" />, se recomandă setarea politicii pentru dispozitive <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> la aceeași valoare. Dacă valorile specificate în cele două politici nu corespund, poate apărea o întârziere la intrarea în sesiunea utilizatorului până ce se aplică valoarea specificată în politica privind utilizatorii. - </translation> <translation id="5302612588919538756">Această politică este învechită. Îți recomandăm să folosești SyncDisabled. Permite utilizatorului să se conecteze la <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index be4c2693..d772834 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -57,13 +57,6 @@ При этом пользователю доступны все принтеры, идентификаторы которых не указаны в правиле. </translation> -<translation id="1181881366217399113"> - ПРИМЕЧАНИЕ. Это экспериментальная функция, ее использование может привести к сбоям в работе. -Когда правило включено, для каждого сайта из списка, разделенного запятыми, запускается отдельный процесс. При этом сайты будут изолированы по субдоменам. Например, если указать https://example.com/, будет также изолирован его субдомен https://foo.example.com/. -Когда правило отключено, используется логика управления процессами изоляции сайтов. -Когда правило не настроено, пользователи могут самостоятельно менять эту настройку. -Желательно, чтобы значение правила <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> совпадало со значением, установленным в <ph name="PRODUCT_OS_NAME" />. В случае противоречия перед началом сеанса может произойти задержка, так как первым применяется правило, установленное пользователем операционной системы. - </translation> <translation id="1198465924256827162">Позволяет указать, с какой частотой нужно отправлять данные об устройстве (в миллисекундах). Если это правило не настроено, значение по умолчанию составляет 3 часа. Минимальное значение – 60 секунд.</translation> @@ -643,17 +636,6 @@ Значение правила следует указывать в миллисекундах. Оно не должно быть больше времени задержки отключения экрана (если оно задано) и перехода в спящий режим.</translation> <translation id="2987155890997901449">Включить ARC</translation> <translation id="2987227569419001736">Контроль использования Web Bluetooth API</translation> -<translation id="2998886474614739865"> - ПРИМЕЧАНИЕ. Это экспериментальное правило, использование которого может привести к сбоям! - Правило регулирует настройки экрана входа. Ознакомьтесь также с правилом "<ph name="ISOLATE_ORIGINS_POLICY_NAME" />", которое задает настройки для сеанса пользователя. Для этих правил рекомендуется выбрать одинаковые значения. Если значения не совпадают, при начале сеанса могут возникать задержки, вызванные применением заданного значения. - Если правило включено, то для каждого отделенного запятой сайта - из списка запускается отдельный процесс. При этом сайты изолируются - по субдоменам. Например, если указать домен https://example.com/, - будет также изолирован субдомен https://foo.example.com/, являющийся частью - сайта https://example.com/. - Если правило отключено, используется логика управления процессами изоляции сайтов. - Если правило не настроено, то на экране входа будут применяться настройки изоляции сайтов, установленные по умолчанию. - </translation> <translation id="3016255526521614822">Приложения для заметок, которые могут работать на заблокированном экране <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Число контрольных точек, до которых разрешен возврат</translation> <translation id="3030000825273123558">Включить передачу статистической информации</translation> @@ -753,17 +735,6 @@ Значение, указанное в правиле, служит названием ресивера <ph name="PRODUCT_NAME" />. Если оно не задано или правило не настроено, название ресивера соответствует названию устройства. Менять его может владелец (или пользователь домена, в котором управляют устройством). Максимальная длина названия – 24 символа.</translation> <translation id="3381968327636295719">Использовать по умолчанию основной браузер</translation> -<translation id="3386001018488754001"> - ПРИМЕЧАНИЕ. Это экспериментальное правило, использование которого может привести к сбоям! - Правило регулирует настройки экрана входа. Ознакомьтесь также с правилом "<ph name="SITE_PER_PROCESS_POLICY_NAME" />", которое задает настройки для сеанса пользователя. Для этих правил рекомендуется выбрать одинаковые значения. Если значения не совпадают, при начале сеанса могут возникать задержки, вызванные применением заданного значения. - Попробуйте также использовать правило IsolateOrigins, - которое позволяет изолировать только определенные сайты. - Укажите список сайтов, которые необходимо изолировать. Правило - SitePerProcess изолирует все сайты. - Если правило включено, для каждого сайта запускается отдельный процесс. - Если правило отключено, используется логика управления процессами изоляции сайтов. - Если правило не настроено, пользователь может самостоятельно менять эту настройку. - </translation> <translation id="3395348522300156660">Разрешает пользователю работать с определенными принтерами. Используется только в том случае, если в правиле <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> задан параметр <ph name="PRINTERS_WHITELIST" />. @@ -1357,17 +1328,6 @@ Если правило не задано либо значением является пустая строка или недействительный диапазон портов, WebRTC будет разрешено использование любого доступного порта UDP.</translation> <translation id="5290940294294002042">Указать список плагинов, доступных пользователю</translation> -<translation id="5301787427319106606"> - ПРИМЕЧАНИЕ. Это экспериментальное правило, использование которого может привести к сбоям! - Попробуйте также использовать правило IsolateOrigins, - которое позволяет изолировать только определенные сайты. - Укажите список сайтов, которые необходимо изолировать. Правило - SitePerProcess изолирует все сайты. - Если правило включено, для каждого сайта запускается отдельный процесс. - Если правило отключено, используется логика управления процессами изоляции сайтов. - Если правило не настроено, пользователь может самостоятельно менять эту настройку. - Рекомендуется задать для правила <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> в <ph name="PRODUCT_OS_NAME" /> то же значение. Если значения двух правил не совпадают, возможны задержки при начале сеанса. - </translation> <translation id="5302612588919538756">Это правило устарело. Вместо него рекомендуется SyncDisabled. С помощью правила SigninAllowed можно запретить или разрешить пользователям входить в <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb index 58040ca..d15095b 100644 --- a/components/policy/resources/policy_templates_sk.xtb +++ b/components/policy/resources/policy_templates_sk.xtb
@@ -57,13 +57,6 @@ Ak toto pravidlo použijete, používateľ má k dispozícii všetky tlačiarne okrem tých, ktorých identifikátory sú uvedené v tomto pravidle. </translation> -<translation id="1181881366217399113"> - POZNÁMKA: Toto pravidlo je experimentálne a môže poškodiť funkčnosť. - Ak toto pravidlo povolíte, jednotlivé uvedené zdroje v zozname oddelené čiarkami sa spustia vo vlastných procesoch. Zároveň sa tým izolujú zdroje označené subdoménami, napr. ak uvediete adresu https://example.com/, izolovaná bude aj adresa https://foo.example.com/ ako súčasť webu https://example.com/. - Ak toto pravidlo zakážete, uplatní sa logika správy procesov izolácie webov. - Ak toto pravidlo nenakonfigurujete, používateľ bude môcť toto nastavenie zmeniť. - V systéme <ph name="PRODUCT_OS_NAME" /> odporúčame nastaviť na rovnakú hodnotu tiež pravidlo zariadenia <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />. Ak sa hodnoty nastavené v týchto dvoch pravidlách nezhodujú, môže pri začatí relácie používateľa nastať oneskorenie spôsobené použitím hodnoty zadanej v pravidle pre používateľa. - </translation> <translation id="1198465924256827162">Ako často sa odosielajú informácie o stave zaradenia (v milisekundách). Ak toto pravidlo nie je nastavené, použije sa predvolená frekvencia 3 hodiny. Minimálna @@ -678,13 +671,6 @@ Hodnota pravidla by mala byť uvedená v milisekundách. Hodnoty musia byť nižšie alebo rovnaké ako oneskorenie vypnutia obrazovky (pokiaľ je nastavené) a oneskorenie režimu nečinnosti.</translation> <translation id="2987155890997901449">Povoliť funkciu ARC</translation> <translation id="2987227569419001736">Ovládať používanie rozhrania Web Bluetooth API</translation> -<translation id="2998886474614739865"> - POZNÁMKA: Toto pravidlo je experimentálne a môže poškodiť funkčnosť. - Platí pre prihlasovaciu obrazovku. Pozrite si tiež pravidlo <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, ktoré platí pre reláciu používateľa. Obe pravidlá odporúčame nastaviť na rovnakú hodnotu. V prípade nezhody týchto hodnôt môže pri spúšťaní relácie používateľa nastať oneskorenie spôsobené používaním hodnoty zadanej v pravidle pre používateľa. - Ak toto pravidlo povolíte, jednotlivé uvedené zdroje v zozname oddelené čiarkami sa spustia vo vlastných procesoch. Zároveň sa tým izolujú zdroje označené subdoménami, napr. ak uvediete adresu https://example.com/, izolovaná bude aj adresa https://foo.example.com/ ako súčasť webu https://example.com/. - Ak toto pravidlo zakážete, bude platiť logika správy procesov izolácie webov. - Ak ho nenakonfigurujete, použijú sa pre prihlasovaciu obrazovku nastavenia izolácie webov predvolené v rámci platformy. - </translation> <translation id="3016255526521614822">Pridať na bielu listinu aplikácie na písanie poznámok, ktoré sú povolené na uzamknutej obrazovke systému <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Počet míľnikov pre vrátenie systému</translation> <translation id="3030000825273123558">Povoliť hlásenia o metrikách</translation> @@ -793,14 +779,6 @@ Ak v tomto pravidle nastavíte reťazec, ktorý nie je prázdny, daný reťazec sa použije ako názov cieľového priečinka funkcie <ph name="PRODUCT_NAME" />. Inak sa ako názov cieľového priečinka použije názov zariadenia. Ak toto pravidlo nenastavíte, názov cieľového priečinka bude názov zariadenia, ktorý bude môcť zmeniť jeho vlastník (alebo používateľ z domény, ktorá ho spravuje). Názov môže mať maximálne 24 znakov.</translation> <translation id="3381968327636295719">V predvolenom nastavení použiť hosťovský prehliadač</translation> -<translation id="3386001018488754001"> - POZNÁMKA: Toto pravidlo je experimentálne a môže poškodiť funkčnosť. - Platí pre prihlasovaciu obrazovku. Pozrite si tiež pravidlo <ph name="SITE_PER_PROCESS_POLICY_NAME" />, ktoré platí pre reláciu používateľa. Obe pravidlá odporúčame nastaviť na rovnakú hodnotu. V prípade nezhody týchto hodnôt môže pri spúšťaní relácie používateľa nastať oneskorenie spôsobené používaním hodnoty zadanej v pravidle pre používateľa. - Ak chcete vyťažiť z oboch možností to najlepšie, t. j. izolovať s obmedzeným vplyvom na používateľov, pozrite si nastavenie pravidla IsolateOrigins. Pravidlo IsolateOrigins použite so zoznamom webov, ktoré chcete izolovať. Nastavenie SitePerProcess izoluje všetky weby. - Ak toto pravidlo povolíte, všetky weby sa budú spúšťať vo vlastných procesoch. - Ak toto pravidlo zakážete, uplatní sa logika správy procesov izolácie webov. - Ak toto pravidlo nenakonfigurujete, používateľ bude môcť toto nastavenie zmeniť. - </translation> <translation id="3395348522300156660">Umožňuje určiť tlačiarne, ktoré má používateľ k dispozícii. Toto pravidlo sa používa iba vtedy, keď je pre <ph name="PRINTERS_WHITELIST" /> vybraná možnosť <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1422,14 +1400,6 @@ Ak toto pravidlo nenastavíte, použijete prázdny reťazec alebo neplatný rozsah portov, rozhranie WebRTC bude môcť použiť ľubovoľný dostupný miestny port UDP.</translation> <translation id="5290940294294002042">Určiť zoznam doplnkov, ktoré môže používateľ povoliť alebo zakázať</translation> -<translation id="5301787427319106606"> - POZNÁMKA: Toto pravidlo je experimentálne a môže poškodiť funkčnosť. - Ak chcete vyťažiť z oboch možností to najlepšie, t. j. izolovať s obmedzeným vplyvom na používateľov, pozrite si nastavenie pravidla IsolateOrigins. Pravidlo IsolateOrigins použite so zoznamom webov, ktoré chcete izolovať. Nastavenie SitePerProcess izoluje všetky weby. - Ak toto pravidlo povolíte, všetky weby sa budú spúšťať vo vlastných procesoch. - Ak toto pravidlo zakážete, uplatní sa logika správy procesov izolácie webov. - Ak toto pravidlo nenakonfigurujete, používateľ bude môcť toto nastavenie zmeniť. - V systéme <ph name="PRODUCT_OS_NAME" /> odporúčame nastaviť aj pravidlo zariadenia <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> na rovnakú hodnotu. V prípade nezhody týchto hodnôt môže pri spúšťaní relácie používateľa nastať oneskorenie spôsobené používaním hodnoty zadanej v pravidle pre používateľa. - </translation> <translation id="5302612588919538756">Podpora tohto pravidla je ukončená. Skúste namiesto toho použiť pravidlo SyncDisabled. Umožňuje prihlásenie používateľa do prehliadača <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb index 6b9b2d66..72545b26 100644 --- a/components/policy/resources/policy_templates_sl.xtb +++ b/components/policy/resources/policy_templates_sl.xtb
@@ -58,18 +58,6 @@ Če se uporablja ta pravilnik, so uporabniku na voljo vsi tiskalniki z izjemo ID-jev, navedenih v tem pravilniku. </translation> -<translation id="1181881366217399113"> - OPOMBA: Ta pravilnik je poskusen in lahko povzroči nedelovanje funkcije. - Če je pravilnik omogočen, se bo vsak naveden izvor s seznama, ločenega - z vejicami, izvajal v svojem procesu. S tem bodo osamljeni tudi izvori, ki jih - navedejo poddomene; če na primer navedete https://example.com/, bo kot - del spletnega mesta https://example.com/ osamljeno tudi spletno mesto - https://foo.example.com/. - Če je pravilnik onemogočen, se uveljavi logika - upravljanja procesov osamitve posameznih spletnih mest. - Če pravilnik ni konfiguriran, bo uporabnik lahko spremenil to nastavitev. - Priporočamo, da v sistemu <ph name="PRODUCT_OS_NAME" /> na isto vrednost nastavite tudi pravilnik o napravah <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />. Če se vrednosti, navedene v teh dveh pravilnikih, ne ujemajo, lahko pri vstopu v uporabniško sejo pride do zakasnitve, medtem ko se uveljavlja vrednost, ki jo določa uporabniški pravilnik. - </translation> <translation id="1198465924256827162">Kako pogosto se pošljejo nalaganja stanja naprave (v milisekundah). Če ta pravilnik ni nastavljen, je vrednost privzete pogostosti 3 ure. Najmanjša @@ -691,17 +679,6 @@ Vrednost pravilnika naj bo navedena v milisekundah. Vrednosti morajo biti manjše ali enake kot časovni zamik izklopa zaslona (če je nastavljen) in časovnik zamik nedejavnosti.</translation> <translation id="2987155890997901449">Omogočanje ARC-ja</translation> <translation id="2987227569419001736">Nadzor uporabe API-ja za Web Bluetooth</translation> -<translation id="2998886474614739865"> - OPOMBA: Ta pravilnik je poskusen in lahko povzroči nedelovanje funkcije. - Ta pravilnik se nanaša na zaslon za prijavo. Oglejte si tudi pravilnik <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, ki se nanaša na uporabniško sejo. Priporočljivo je, da za oba pravilnika nastavite enako vrednost. Če se vrednosti ne ujemata, lahko pride do zakasnitve pri odpiranju uporabniške seje, medtem ko se uporablja vrednost, ki jo določa uporabniški pravilnik. - Če je pravilnik omogočen, se bo vsak naveden izvor - s seznama, ločenega z vejicami, izvajal v svojem procesu. S tem bodo osamljeni - tudi izvori, ki jih navedejo poddomene; če na primer navedete https://example.com/, - bo kot del spletnega mesta https://example.com/ osamljeno tudi spletno mesto - https://foo.example.com/. - Če je pravilnik onemogočen, se uveljavi logika upravljanja procesov osamitve posameznih spletnih mest. - Če pravilnik ni konfiguriran, bodo za zaslon za prijavo uporabljene privzete nastavitve osamitve spletnih mest za okolje. - </translation> <translation id="3016255526521614822">Uvrščanje aplikacij za zapiske, ki so omogočene na zaklenjenem zaslonu sistema <ph name="PRODUCT_OS_NAME" />, na seznam dovoljenih</translation> <translation id="3021562480854470924">Število mejnikov, za katere je dovoljena povrnitev</translation> <translation id="3030000825273123558">Omogoči pošiljanje podatkov</translation> @@ -811,17 +788,6 @@ Če je pravilnik nastavljen na niz, ki ni prazen, je ta niz uporabljen kot ime cilja za napravo <ph name="PRODUCT_NAME" />, sicer pa je ime cilja ime naprave. Če ta pravilnik ni nastavljen, je ime cilja ime naprave in lastnik naprave (ali uporabnik v domeni, ki upravlja napravo) ga sme spremeniti. Ime je omejeno na 24 znakov dolžine.</translation> <translation id="3381968327636295719">Privzeto uporabi brskalnik gostitelja</translation> -<translation id="3386001018488754001"> - OPOMBA: Ta pravilnik je poskusen in lahko povzroči nedelovanje funkcije. - Ta pravilnik se nanaša na zaslon za prijavo. Oglejte si tudi pravilnik <ph name="SITE_PER_PROCESS_POLICY_NAME" />, ki se nanaša na uporabniško sejo. Priporočljivo je, da za oba pravilnika nastavite enako vrednost. Če se vrednosti ne ujemata, lahko pride do zakasnitve pri odpiranju uporabniške seje, medtem ko se uporablja vrednost, ki jo določa uporabniški pravilnik. - Oglejte si nastavitev pravilnika IsolateOrigins, če želite izkoristiti - prednosti obeh nastavitev, osamitve in omejenega vpliva za uporabnike, - tako da uporabite pravilnik IsolateOrigins s seznamom spletnih mest, ki jih želite osamiti. Ta nastavitev, - SitePerProcess, osami vsa spletna mesta. - Če je pravilnik omogočen, se vsako spletno mesto izvaja v svojem procesu. - Če je pravilnik onemogočen, se uveljavi logika upravljanja procesov osamitve posameznih spletnih mest. - Če pravilnik ni konfiguriran, bo uporabnik lahko spremenil to nastavitev. - </translation> <translation id="3395348522300156660">Določa tiskalnike, ki jih uporabnik lahko uporablja. Ta pravilnik se uporablja samo, če je za pravilnik <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> izbrana možnost <ph name="PRINTERS_WHITELIST" />. @@ -1450,17 +1416,6 @@ Če pravilnik ni nastavljen ali je nastavljen na prazen niz oziroma neveljaven obseg vrat, je tehnologiji WebRTC dovoljeno uporabljati katera koli lokalna vrata UDP, ki so na voljo.</translation> <translation id="5290940294294002042">Določite seznam vtičnikov, ki jih lahko uporabnik omogoči ali onemogoči</translation> -<translation id="5301787427319106606"> - OPOMBA: Ta pravilnik je poskusen in lahko povzroči nedelovanje funkcije. - Oglejte si nastavitev pravilnika IsolateOrigins, če želite izkoristiti - prednosti obeh nastavitev, osamitve in omejenega vpliva za uporabnike, tako da uporabite pravilnik - IsolateOrigins s seznamom spletnih mest, ki jih želite osamiti. Ta nastavitev, - SitePerProcess, osami vsa spletna mesta. - Če je pravilnik omogočen, se vsako spletno mesto izvaja v svojem procesu. - Če je pravilnik onemogočen, se uveljavi logika upravljanja procesov osamitve posameznih spletnih mest. - Če pravilnik ni konfiguriran, bo uporabnik lahko spremenil to nastavitev. - V brskalniku <ph name="PRODUCT_OS_NAME" /> je prav tako priporočljivo nastaviti pravilnik za naprave <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> na enako vrednost. Če se vrednosti, nastavljeni z obema pravilnikoma, ne ujemata, lahko pride do zakasnitve pri odpiranju uporabniške seje, medtem ko se uporablja vrednost, ki jo določa uporabniški pravilnik. - </translation> <translation id="5302612588919538756">Ta pravilnik je zastarel, namesto njega lahko uporabite SyncDisabled. Dovoljuje uporabniku prijavo v <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb index d446d37..3284a42 100644 --- a/components/policy/resources/policy_templates_sr.xtb +++ b/components/policy/resources/policy_templates_sr.xtb
@@ -58,17 +58,6 @@ Ако се ове смернице користе, сви штампачи су доступни кориснику, осим оних чији су ИД-ови наведени у овим смерницама. </translation> -<translation id="1181881366217399113"> - НАПОМЕНА: Ове смернице су експерименталне и могу да угрозе функционалност! - Ако омогућите ове смернице, сваки извор наведен на - листи вредности раздвојених зарезима покренуће се у сопственом процесу. - Ово ће изоловати и изворе које именују поддомени; нпр. ако наведете https://example.com/, - то ће довести и до изолације адресе https://foo.example.com/ као дела - сајта https://example.com/. - Ако онемогућите ове смернице, на снагу ће ступити логика управљања процесом изолације појединачних сајтова. - Ако не конфигуришете ове смернице, корисник ће моћи да промени ово подешавање. - На производу <ph name="PRODUCT_OS_NAME" /> вам препоручујемо да подесите и смернице за уређај <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> на исту вредност. Ако се вредности наведене у две смернице не подударају, може доћи до одлагања кад улазите у корисничку сесију док се вредност наведена у смерници за корисника примењује. - </translation> <translation id="1198465924256827162">Колико често се отпрема статус уређаја, у милисекундама. Ако не подесите ове смернице, подразумевана учесталост је 3 сата. Минимална @@ -686,17 +675,6 @@ Вредност смерница треба да буде наведена у милисекундама. Вредности се скраћују како би биле краће од времена до искључивања екрана (ако је подешено) и времена до мировања или једнаке њима.</translation> <translation id="2987155890997901449">Омогући ARC</translation> <translation id="2987227569419001736">Контролиши коришћење API-ја Bluetooth за веб</translation> -<translation id="2998886474614739865"> - НАПОМЕНА: Ове смернице су експерименталне и могу да угрозе функционалност! - Ове смернице важе за екран за пријављивање. Погледајте и смернице <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> које важе за корисничку сесију. Препоручује се да обе смернице подесите на исту вредност. Ако вредности нису исте, може доћи до одлагања када улазите у корисничку сесију док се вредност наведена у смерници за корисника примењује. - Ако омогућите ове смернице, сваки извор наведен - на листи вредности раздвојених зарезима покренуће се у сопственом процесу. Ово ће изоловати и - изворе које именују поддомени; нпр. ако наведете https://example.com/, то ће - довести до изолације адресе https://foo.example.com/ као дела сајта - https://example.com/. - Ако онемогућите ове смернице, на снагу ће ступити логика управљања процесом изолације појединачних сајтова. - Ако не конфигуришете ове смернице, подразумевана подешавања изолације сајтова за платформу ће се користити за екран за пријављивање. - </translation> <translation id="3016255526521614822">Стављање апликација за прављење белешки које су дозвољене на закључаном екрану за <ph name="PRODUCT_OS_NAME" /> на белу листу</translation> <translation id="3021562480854470924">Број дозвољених тачака за враћање на претходне верзије</translation> <translation id="3030000825273123558">Омогућавање пријављивања показатеља</translation> @@ -806,17 +784,6 @@ Ако подесите ове смернице на стринг који није празан, тај стринг ће се користити као назив одредишта за <ph name="PRODUCT_NAME" />. У супротном, назив одредишта ће бити назив уређаја. Ако не подесите ове смернице, назив одредишта ће бити назив уређаја, а власник уређаја (или корисник домена који управља уређајем) ће моћи да га мења. Назив је ограничен на 24 знака.</translation> <translation id="3381968327636295719">Подразумевано користи прегледач хоста</translation> -<translation id="3386001018488754001"> - НАПОМЕНА: Ове смернице су експерименталне и могу да угрозе функционалност! - Ове смернице важе за екран за пријављивање. Погледајте и смернице <ph name="SITE_PER_PROCESS_POLICY_NAME" /> које важе за корисничку сесију. Препоручује се да обе смернице подесите на исту вредност. Ако се вредности наведене у две смернице не подударају, може доћи до одлагања када улазите у корисничку сесију док се вредност наведена у смерници за корисника примењује. - Погледајте подешавање смерница IsolateOrigins да бисте - постигли најбољи учинак у погледу изолације и ограниченог утицаја на кориснике коришћењем - смерница IsolateOrigins са листом сајтова које желите да изолујете. Ово подешавање, - SitePerProcess, изолује све сајтове. - Ако омогућите ове смернице, сваки сајт ће се покренути у сопственом процесу. - Ако онемогућите ове смернице, на снагу ће ступити логика управљања процесом изолације појединачних сајтова. - Ако не конфигуришете ове смернице, корисник ће моћи да промени ово подешавање. - </translation> <translation id="3395348522300156660">Наводе штампаче које корисник може да користи. Ове смернице се користе само ако изаберете <ph name="PRINTERS_WHITELIST" /> за <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1439,17 +1406,6 @@ Ако не подесите ове смернице или их подесите на празан низ или неважећи опсег портова, WebRTC може да користи било који доступни локални UDP порт.</translation> <translation id="5290940294294002042">Наведи листу додатних компоненти које корисник може да омогући или онемогући</translation> -<translation id="5301787427319106606"> - НАПОМЕНА: Ове смернице су експерименталне и могу да угрозе функционалност! - Погледајте подешавање смерница IsolateOrigins да бисте постигли - најбољи учинак у погледу изолације и ограниченог утицаја на кориснике коришћењем - смерница IsolateOrigins са листом сајтова које желите да изолујете. Ово подешавање, - SitePerProcess, изолује све сајтове. - Ако омогућите ове смернице, сваки сајт ће се покренути у сопственом процесу. - Ако онемогућите ове смернице, на снагу ће ступити логика управљања процесом изолације појединачних сајтова. - Ако не конфигуришете ове смернице, корисник ће моћи да промени ово подешавање. - На производу <ph name="PRODUCT_OS_NAME" /> вам препоручујемо да подесите и смернице за уређај <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> на исту вредност. Ако се вредности наведене у две смернице не подударају, може доћи до одлагања када улазите у корисничку сесију док се вредност наведена у смерници за корисника примењује. - </translation> <translation id="5302612588919538756">Ове смернице су застареле. Требало би да користите смернице SyncDisabled. Омогућавају кориснику да се пријави у <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb index a51d8bfc..45a28d09d 100644 --- a/components/policy/resources/policy_templates_sv.xtb +++ b/components/policy/resources/policy_templates_sv.xtb
@@ -58,17 +58,6 @@ Om principen används får användaren tillgång till alla skrivare utom dem vars id anges i den här principen. </translation> -<translation id="1181881366217399113"> - OBS! Det här är en experimentell princip som kan göra att något slutar fungera. - Om principen aktiveras körs alla namngivna ursprung, som anges i en - kommaavgränsad lista, som egna processer. Även underdomäner isoleras. - Om du exempelvis anger https://example.com/ isoleras även - https://foo.example.com/ som en del av webbplatsen https://example.com/. - Om principen inaktiveras hanteras processerna enligt logiken - för webbplatsisolering. - Om principen inte konfigureras kan användaren ändra inställningen. - På <ph name="PRODUCT_OS_NAME" /> bör enhetsprincipen <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> ges samma värde som används här. Om de båda principerna har olika värden kan en fördröjning uppstå i början av en användarsession medan den angivna användarprincipen tillämpas. - </translation> <translation id="1198465924256827162">Hur ofta information om enhetsstatus laddas upp, uttryckt i millisekunder. Om inget värde anges för principen är standardfrekvensen 3 timmar. Den kortaste @@ -691,17 +680,6 @@ Policyns värde anges i millisekunder. Värdena måste vara mindre än eller lika med skärmavstängningstiden (om den har ställts in) och inaktivitetstiden.</translation> <translation id="2987155890997901449">Aktivera ARC</translation> <translation id="2987227569419001736">Kontrollera användningen av Web Bluetooth API</translation> -<translation id="2998886474614739865"> - OBS! Det här är en experimentell princip som kan göra att något slutar fungera. - Den här principen tillämpas på inloggningsskärmen. Se även principen <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> som tillämpas på användarsessionen. Vi rekommenderar att samma värde anges för båda principerna. Om dessa värden inte överensstämmer kan en fördröjning uppstå när en användarsession startas medan värdet för användarprincipen tillämpas. - Om principen aktiveras körs varje namngivet ursprung i en - kommaavgränsad lista som en egen process. Även underdomäner isoleras. - Om du exempelvis anger https://example.com/ isoleras även - https://foo.example.com/ som en del av webbplatsen - https://example.com/. - Om principen inaktiveras gäller den logik för processhantering som används för webbplatsisolering per webbplats. - Om principen inte konfigureras används standardinställningarna för webbplatsisolering för inloggningsskärmen. - </translation> <translation id="3016255526521614822">Ange anteckningsappar som är tillåtna på låsskärmen i <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Antalet återställningspunkter som tillåts</translation> <translation id="3030000825273123558">Aktivera statistikrapportering</translation> @@ -811,17 +789,6 @@ Om principen är inställd på något annat än en tom sträng används den strängen som namn på målet för <ph name="PRODUCT_NAME" />. I annat fall används enhetens namn som målnamn. Om principen lämnas utan inställning används enhetens namn som målnamn och enhetens ägare (eller en användare på den domän som hanterar enheten) kan ändra det. Namnet får vara högst 24 tecken långt.</translation> <translation id="3381968327636295719">Använd värdwebbläsaren som standard</translation> -<translation id="3386001018488754001"> - OBS! Det här är en experimentell princip som kan göra att något slutar fungera. - Den här principen tillämpas på inloggningsskärmen. Se även principen <ph name="SITE_PER_PROCESS_POLICY_NAME" /> som tillämpas på användarsessionen. Vi rekommenderar att samma värde anges för båda principerna. Om dessa värden inte överensstämmer kan en fördröjning uppstå när en användarsession startas medan värdet för användarprincipen tillämpas. - Vi rekommenderar även principen IsolateOrigins. Du kan få det bästa - av två världar, isolering och begränsad inverkan på användarna, - genom att ange en lista med webbplatser som ska isoleras med IsolateOrigins. - Med den här inställningen, SitePerProcess, isoleras alla webbplatser. - Om principen aktiveras körs varje webbplats som en egen process. - Om principen inaktiveras gäller den logik för processhantering som används för webbplatsisolering per webbplats. - Om principen inte konfigureras kan användaren ändra inställningen. - </translation> <translation id="3395348522300156660">Anger vilka skrivare som får användas. Den här principen används bara när <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> är inställd på <ph name="PRINTERS_WHITELIST" />. @@ -1453,17 +1420,6 @@ Om principen inte anges eller om den har ställts in på den tomma strängen eller ett ogiltigt portintervall får vilken tillgänglig lokal UDP-port som helst användas för WebRTC.</translation> <translation id="5290940294294002042">Ange en lista med plugin-program som användaren kan aktivera och inaktivera</translation> -<translation id="5301787427319106606"> - OBS! Det här är en experimentell princip som kan göra att något slutar fungera. - Vi rekommenderar även principen IsolateOrigins. Du kan få det bästa - av två världar, isolering och begränsad inverkan på användarna, - genom att ange en lista med webbplatser som ska isoleras med IsolateOrigins. - Med den här inställningen, SitePerProcess, isoleras alla webbplatser. - Om principen aktiveras körs varje webbplats som en egen process. - Om principen inaktiveras gäller den logik för processhantering som används för webbplatsisolering per webbplats. - Om principen inte konfigureras kan användaren ändra inställningen. - I <ph name="PRODUCT_OS_NAME" /> rekommenderar vi även att ange samma värde för enhetsprincipen <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Om värdet som angetts för båda principerna inte överensstämmer kan en fördröjning uppstå när en användarsession startas medan värdet för användarprincipen tillämpas. - </translation> <translation id="5302612588919538756">Den här principen har fasats ut. Använd SyncDisabled i stället. Tillåter att användaren loggar in i <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb index c89568d8..87d90a2 100644 --- a/components/policy/resources/policy_templates_sw.xtb +++ b/components/policy/resources/policy_templates_sw.xtb
@@ -58,14 +58,6 @@ Ikiwa sera hii inatumiwa, printa zote hutolewa kwa mtumiaji isipokuwa vitambulisho vilivyoorodheshwa katika sera hii. </translation> -<translation id="1181881366217399113"> - KUMBUKA: Sera hii ni ya jaribio na huenda ikaathiri utendaji! - Kama sera imewashwa, kila chanzo kilichobainishwa kwenye orodha inayotenganishwa kwa kutumia koma itatumika katika mchakato wake. Hali hii pia itatenga vyanzo vilivyobainishwa kwa kutumia vikoa vidogo; kwa mfano, kubainisha https://example.com/ pia kutasababisha https://foo.example.com/ kutengwa kama sehemu ya tovuti ya - https://example.com/. - Kama sera imezimwa, dhana ya usimamizi wa mchakato wa Utengaji kwa Tovuti itatumika. - Kama mipangilio ya sera hii haijawekwa, mtumiaji ataweza kubadilisha mipangilio hii. - Kwenye <ph name="PRODUCT_OS_NAME" />, inapendekezwa pia uweke sera ya kifaa cha <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> iwe thamani sawa. Iwapo thamani zilizobainishwa na sera hizi mbili hazilingani, huenda shughuli ya kuanzisha kipindi cha mtumiaji ikakawia wakati inaweka thamani iliyobainishwa na sera ya mtumiaji. - </translation> <translation id="1198465924256827162">Ni mara ngapi vipakiwa vya hali ya kifaa hutumwa, katika milisekunde. Sera hii isipowekwa, idadi chaguo-msingi ni saa 3. Idadi ya chini inayoruhusiwa ni sekunde 60.</translation> @@ -674,14 +666,6 @@ Sera ya thamani inastahili kubainishwa kwa nukta. Thamani zinabanwa ili kuwa chini ya ucheleweshaji wa kutokuwa na shughuli.</translation> <translation id="2987155890997901449">Washa kipengele cha ARC</translation> <translation id="2987227569419001736">Dhibiti matumizi ya API ya Bluetooth ya Wavuti</translation> -<translation id="2998886474614739865"> - KUMBUKA: Sera hii ni ya jaribio na huenda ikaathiri utendaji! - Sera hii inatumika kwenye skrini unayotumia kuingia katika akaunti. Tafadhali angalia pia sera ya <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> ambayo inatumika katika kipindi cha mtumiaji. Tunapendekeza uweke sera zote katika thamani sawa. Kama thamani hazilingani, huenda shughuli ya kuanzisha kipindi cha mtumiaji ikakawia wakati inaweka thamani iliyobainishwa na sera ya mtumiaji. - Ikiwa sera imewashwa, kila chanzo ulichotaja katika orodha inayotenganishwa kwa koma kitatumia mchakato wake. Hatua hii pia itatenganisha vyanzo vilivyotajwa na vikoa vidogo; kwa mfano, kubainisha https://example.com/ - kutasababisha pia https://foo.example.com/ kutenganishwa kwenye tovuti ya https://example.com/. - Ikiwa sera imezimwa, itatumia dhana ya udhibiti wa mchakato wa Utengaji kulingana na Tovuti. - Ikiwa sera hii haijawekwa, itatumia mipangilio chaguo-msingi ya mfumo wa kutenga tovuti katika skrini unayotumia kuingia kwenye akaunti. - </translation> <translation id="3016255526521614822">Toa idhini kwa programu za kuandika madokezo zinazoruhusiwa kwenye skrini iliyofungwa ya <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Idadi ya matukio ya urejeshaji inaruhusiwa</translation> <translation id="3030000825273123558">Wezesha kuripoti kwa metriki</translation> @@ -789,16 +773,6 @@ Ikiwa sera hii imewekwa kwenye mfuatano ulio na maudhui, mfuatano huo utatumika kama jina la mahali ambapo <ph name="PRODUCT_NAME" /> inatuma. Vinginevyo, jina la mahali litakuwa jina la kifaa. Ikiwa sera hii haijawekwa, jina mahali litakuwa jina la kifaa na mmiliki wa kifaa (au mmiliki kutoka kwenye kikoa kinachodhibiti kifaa) ataruhusiwa kulibadilisha. Jina halitakiwi kuwa na zaidi ya herufi 24.</translation> <translation id="3381968327636295719">Tumia kivinjari kipangishi kwa chaguo-msingi</translation> -<translation id="3386001018488754001"> - KUMBUKA: Sera hii ni ya jaribio na huenda ikaathiri utendaji! - Sera hii inatumika kwenye skrini unayotumia kuingia katika akaunti. Tafadhali angalia pia sera ya <ph name="SITE_PER_PROCESS_POLICY_NAME" /> ambayo inatumika katika kipindi cha mtumiaji. Tunapendekeza uweke sera zote katika thamani sawa. Kama thamani hazilingani, huenda shughuli ya kuanzisha kipindi cha mtumiaji ikakawia wakati inaweka thamani iliyobainishwa na sera ya mtumiaji. - Huenda ukataka kuangalia mipangilio ya sera ya IsolateOrigins ili upate sehemu bora kati ya hizi mbili, utenganishaji na athari chache kwa watumiaji, kwa kutumia - IsolateOrigins yenye orodha za tovuti unazotaka kutenganisha. Mipangilio hii, - SitePerProcess, inatenganisha tovuti zote. - Ikiwa sera imewashwa, kila tovuti itatumia mchakato wake. - Ikiwa sera imezimwa, itatumia dhana ya udhibiti wa mchakato wa Utenganishaji kulingana na Tovuti. - Ikiwa sera hii haijawekwa, mtumiaji ataweza kubadilisha mipangilio hii. - </translation> <translation id="3395348522300156660">Hubainisha printa ambazo mtumiaji anaweza kutumia. Sera hii hutumika tu ikiwa mipangilio ya <ph name="PRINTERS_WHITELIST" /> imechaguliwa katika <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1417,15 +1391,6 @@ Sera hii isipowekwa, au ikiwekwa kwenye mfuatano wazi au masafa ya mlango yasiyo sahihi, WebRTC itaruhusiwa kutumia mlango wowote wa ndani wa UDP.</translation> <translation id="5290940294294002042">Bainisha orodha ya programu jalizi ambayo mtumiaji anaweza kuwezesha au kulemaza</translation> -<translation id="5301787427319106606"> - KUMBUKA: Sera hii ni ya jaribio na huenda ikaathiri utendaji! - Huenda ukataka kuangalia mipangilio ya sera ya IsolateOrigiins ili upate sehemu bora kati ya hizi mbili, utengaji na athari chache kwa watumiaji, kwa kutumia IsolateOrigins katika orodha ya tovuti ambazo ungependa kutenganisha. Mipangilio hii, - SitePerProcess, inatenganisha tovuti zote. - Ikiwa sera imewashwa, kila tovuti itatumia mchakato wake. - Ikiwa sera imezimwa, itatumia dhana ya udhibiti wa mchakato wa Utenganishaji kulingana na Tovuti. - Ikiwa sera hii haijawekwa, mtumiaji ataweza kubadilisha mipangilio hii. - Kwenye <ph name="PRODUCT_OS_NAME" />, tunapendekeza uweke pia sera ya kifaa ya <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> kuwa na thamani sawa. Kama thamani hazilingani, huenda shughuli ya kuanzisha kipindi cha mtumiaji ikakawia wakati inaweka thamani iliyobainishwa na sera ya mtumiaji. - </translation> <translation id="5302612588919538756">Sera hii imeacha kuendesha huduma, badala yake jaribu kutumia kipengee cha SyncDisabled. Humruhusu mtumiaji kuingia katika <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb index 8acc5030..b2327fa0 100644 --- a/components/policy/resources/policy_templates_ta.xtb +++ b/components/policy/resources/policy_templates_ta.xtb
@@ -54,13 +54,6 @@ இந்தக் கொள்கை பயன்படுத்தப்பட்டால், இந்தக் கொள்கையில் பட்டியலிடப்பட்ட ஐடிகளைத் தவிர, மற்ற எல்லாப் பிரிண்டர்களையும் பயனர் பயன்படுத்தலாம். </translation> -<translation id="1181881366217399113"> - குறிப்பு: இந்தக் கொள்கை சோதனைரீதியிலானது என்பதால், செயல்பாடு சீராக இல்லாமல் இருக்கக்கூடும்! - கொள்கை இயக்கப்பட்டிருந்தால், காற்புள்ளியால் பிரிக்கப்பட்ட பட்டியலில் குறிப்பிடப்பட்டுள்ள ஒவ்வொரு தளமும் அதற்குரிய செயல்முறையில் இயக்கும். இது துணை டொமைன்களின்படியும் தளங்களைத் தனிப்படுத்தும். எ.கா. https://example.com/ எனக் குறிப்பிட்டால், https://example.com/ தளத்தின் ஒரு பகுதியாக https://foo.example.com/ எனும் தளமும் தனிப்படுத்தப்படும். - கொள்கை முடக்கப்பட்டிருந்தால், ஒவ்வொரு தளத்திற்கான தனிப்படுத்தும் செயல்முறை நிர்வாகத் தருக்கம் பயன்படுத்தப்படும். - கொள்கை உள்ளமைக்கப்படவில்லை என்றால், இந்த அமைப்பைப் பயனரால் மாற்ற முடியும். - <ph name="PRODUCT_OS_NAME" /> இல், <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> இன் சாதனக் கொள்கையையும் ஒரே மதிப்பில் அமைக்கப் பரிந்துரைக்கப்படுகிறது. இரண்டு கொள்கைகளும் குறிப்பிடும் மதிப்புகள் பொருந்தவில்லை எனில், பயனர் கொள்கையால் குறிப்பிடப்படும் மதிப்பு பயன்படுத்தப்படும். அப்போது பயனர் அமைவில் உள்நுழையும் போது தாமதம் ஏற்படக்கூடும். - </translation> <translation id="1198465924256827162">சாதன நிலையின் பதிவேற்றங்கள் அனுப்பப்படும் கால இடைவெளி, மில்லிவினாடிகளில் குறிப்பிடப்படும். இந்தக் கொள்கை அமைக்கப்படாவிட்டால், இயல்பான கால இடைவெளி 3 மணிநேரமாகும். குறைந்தபட்சமாக அனுமதிக்கப்பட்ட கால இடைவெளி 60 வினாடிகளாகும்.</translation> @@ -649,13 +642,6 @@ கொள்கை மதிப்பை மில்லிவினாடிகளில் மட்டுமே குறிப்பிட வேண்டும். மதிப்புகள் திரை முடக்கத்தின் தாமதம் (அமைக்கப்பட்டால்) மற்றும் செயலற்ற நிலைக்குக் குறைவாக அல்லது சமமாக இருக்குமாறு அமைக்கப்படும்.</translation> <translation id="2987155890997901449">ARCஐ இயக்கு</translation> <translation id="2987227569419001736">இணைய புளூடூத் API இன் பயன்பாட்டைக் கட்டுப்படுத்தும்</translation> -<translation id="2998886474614739865"> - குறிப்பு: இந்தக் கொள்கை சோதனைரீதியிலானது என்பதால், செயல்பாடு சீராக இல்லாமல் இருக்கக்கூடும்! - இந்தக் கொள்கை உள்நுழைவுத் திரைக்குப் பொருந்துகிறது. பயனர் அமர்வுக்குப் பொருந்தும் <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> கொள்கையையும் பார்க்கவும். இரண்டு கொள்கைகளையும் ஒரே மதிப்பில் அமைக்கப் பரிந்துரைக்கப்படுகிறது. இரண்டு மதிப்புகளும் பொருந்தவில்லை எனில், பயனர் கொள்கையால் குறிப்பிடப்படும் மதிப்பு பயன்படுத்தப்படும். அப்போது பயனர் அமைவில் உள்நுழையும் போது தாமதம் ஏற்படக்கூடும். - கொள்கை இயக்கப்பட்டிருந்தால், காற்புள்ளியால் பிரிக்கப்பட்ட பட்டியலில் குறிப்பிடப்பட்டுள்ள ஒவ்வொரு தளமும் அதற்குரிய செயல்முறையை இயக்கும். இது துணை டொமைன்களின்படியும் தளங்களைத் தனிப்படுத்தும். எ.கா. https://example.com/ எனக் குறிப்பிட்டால், https://example.com/ தளத்தின் ஒரு பகுதியாக https://foo.example.com/ எனும் தளமும் தனிப்படுத்தப்படும். - கொள்கை முடக்கப்பட்டிருந்தால், ஒவ்வொரு தளத்திற்கான தனிப்படுத்தும் செயல்முறை நிர்வாகத் தருக்கம் பயன்படுத்தப்படும். - கொள்கை உள்ளமைக்கப்படவில்லை என்றால், இயங்குதளத்தின் இயல்பான, தளத்தைத் தனிப்படுத்தும் அமைப்புகள் உள்நுழைவுத் திரைக்குப் பயன்படுத்தப்படும். - </translation> <translation id="3016255526521614822"><ph name="PRODUCT_OS_NAME" /> பூட்டுத் திரையில் அனுமதிக்க வேண்டிய குறிப்பெடுக்கும் பயன்பாடுகளை ஏற்புப்பட்டியலில் சேர்</translation> <translation id="3021562480854470924">பதிப்பு மீட்டமைப்பதற்கு அனுமதிக்கப்படும் மைல்ஸ்டோன்களின் எண்ணிக்கை</translation> <translation id="3030000825273123558">மெட்ரிக்ஸ் அறிக்கைகளை இயக்கு</translation> @@ -757,14 +743,6 @@ இந்தக் கொள்கையைக் காலி அல்லாத எழுத்துச்சரத்திற்கு அமைத்தால், <ph name="PRODUCT_NAME" /> இலக்கின் பெயராக அந்த எழுத்துச்சரம் பயன்படுத்தப்படும். இல்லையெனில், சாதனத்தின் பெயர் இலக்கின் பெயராக இருக்கும். இந்தக் கொள்கையை அமைக்கவில்லை எனில், சாதனத்தின் பெயர் இலக்கின் பெயராக இருப்பதோடு, அதை மாற்றுவதற்குச் சாதனத்தின் உரிமையாளர் (அல்லது சாதனத்தை நிர்வகிக்கும் டொமைனில் உள்ள பயனர்) அனுமதிக்கப்படுவார். பெயரானது 24 எழுத்துக்குறிகளுக்கு வரம்பிடப்படும்.</translation> <translation id="3381968327636295719">இயல்புநிலையாக ஹோஸ்ட் உலாவியைப் பயன்படுத்து</translation> -<translation id="3386001018488754001"> - குறிப்பு: இந்தக் கொள்கை சோதனைரீதியிலானது என்பதால், செயல்பாடு சீராக இல்லாமல் இருக்கக்கூடும்! - இந்தக் கொள்கை உள்நுழைவுத் திரைக்குப் பொருந்துகிறது. பயனர் அமர்வுக்குப் பொருந்தும் <ph name="SITE_PER_PROCESS_POLICY_NAME" /> கொள்கையையும் பார்க்கவும். இரண்டு கொள்கைகளையும் ஒரே மதிப்பில் அமைக்கப் பரிந்துரைக்கப்படுகிறது. இரண்டு மதிப்புகளும் பொருந்தவில்லை எனில், பயனர் கொள்கையால் குறிப்பிடப்படும் மதிப்பு பயன்படுத்தப்படும். அப்போது பயனர் அமைவில் உள்நுழையும் போது தாமதம் ஏற்படக்கூடும். - தனிப்படுத்தல் மற்றும் பயனர்களுக்கு குறைந்த அளவிலான தாக்கம் என்ற இரண்டையும் சிறப்பாகப் பெறுவதற்கு, IsolateOrigins கொள்கை அமைப்பைப் பார்க்கவும். அதில் நீங்கள் தனிப்படுத்த விரும்பும் தளங்களின் பட்டியலுடன் IsolateOriginsஐப் பயன்படுத்தலாம். SitePerProcess எனும் இந்த அமைப்பு, எல்லாத் தளங்களையும் தனிப்படுத்தும். - கொள்கை இயக்கப்பட்டிருந்தால், ஒவ்வொரு தளமும் அதற்குரிய செயல்முறையை இயக்கும். - கொள்கை முடக்கப்பட்டிருந்தால், ஒவ்வொரு தளத்திற்கான தனிப்படுத்தும் செயல்முறை நிர்வாகத் தருக்கம் பயன்படுத்தப்படும். - கொள்கை உள்ளமைக்கப்படவில்லை என்றால், பயனரால் இந்த அமைப்பை மாற்ற முடியும். - </translation> <translation id="3395348522300156660">பயனர் பயன்படுத்தக்கூடிய பிரிண்டர்களைக் குறிப்பிடும். <ph name="DEVICE_PRINTERS_ACCESS_MODE" />க்கு <ph name="PRINTERS_WHITELIST" /> தேர்வு செய்யப்பட்டால் மட்டுமே, இந்தக் கொள்கை பயன்படுத்தப்படும் @@ -1359,14 +1337,6 @@ கொள்கையை அமைக்கவில்லை என்றாலோ, காலியான சரம் அல்லது தவறான போர்ட் வரம்பிற்கு அமைத்தாலோ, கிடைக்கும் எல்லா அக UDP போர்ட்டையும் WebRTC பயன்படுத்த அனுமதிக்கப்படும்.</translation> <translation id="5290940294294002042">பயனர் இயக்க அல்லது முடக்கக்கூடிய செருகுநிரல்களின் பட்டியலைக் குறிப்பிடுக</translation> -<translation id="5301787427319106606"> - குறிப்பு: இந்தக் கொள்கை சோதனைரீதியிலானது என்பதால், செயல்பாடு சீராக இல்லாமல் இருக்கக்கூடும்! - தனிப்படுத்தல் மற்றும் பயனர்களுக்கு குறைந்த அளவிலான தாக்கம் என்ற இரண்டையும் சிறப்பாகப் பெறுவதற்கு, IsolateOrigins கொள்கை அமைப்பைப் பார்க்கவும். அதில் நீங்கள் தனிப்படுத்த விரும்பும் தளங்களின் பட்டியலுடன் IsolateOriginsஐப் பயன்படுத்தலாம். SitePerProcess எனும் இந்த அமைப்பு, எல்லாத் தளங்களையும் தனிப்படுத்தும். - கொள்கை இயக்கப்பட்டிருந்தால், ஒவ்வொரு தளமும் அதற்குரிய செயல்முறையை இயக்கும். - கொள்கை முடக்கப்பட்டிருந்தால், ஒவ்வொரு தளத்திற்கான தனிப்படுத்தும் செயல்முறை நிர்வாகத் தருக்கம் பயன்படுத்தப்படும். - கொள்கை உள்ளமைக்கப்படவில்லை என்றால், பயனரால் இந்த அமைப்பை மாற்ற முடியும். - <ph name="PRODUCT_OS_NAME" /> இல், <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> இன் சாதனக் கொள்கையையும் ஒரே மதிப்பில் அமைக்கப் பரிந்துரைக்கப்படுகிறது. இரண்டு கொள்கைகளும் குறிப்பிடும் மதிப்புகள் பொருந்தவில்லை எனில், பயனர் கொள்கையால் குறிப்பிடப்படும் மதிப்பு பயன்படுத்தப்படும். அப்போது பயனர் அமைவில் உள்நுழையும் போது தாமதம் ஏற்படக்கூடும். - </translation> <translation id="5302612588919538756">இந்தக் கொள்கை தடுக்கப்பட்டுள்ளது, அதற்குப் பதில் SyncDisabledஐப் பயன்படுத்திப் பார்க்கவும். பயனரை <ph name="PRODUCT_NAME" /> இல் உள்நுழைய அனுமதிக்கும்.
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb index 466a1a2..6de9612 100644 --- a/components/policy/resources/policy_templates_te.xtb +++ b/components/policy/resources/policy_templates_te.xtb
@@ -58,17 +58,6 @@ ఈ విధానం ఉపయోగించినట్లయితే, అన్ని ప్రింటర్లు వినియోగదారుకు అందించబడతాయి, కానీ ఈ విధానంలో జాబితా చేసిన idలకు మినహాయించబడతాయి. </translation> -<translation id="1181881366217399113"> - గమనిక: ఈ విధానం ప్రయోగాత్మకమైనది మరియు కార్యనిర్వాహకతకు విఘాతం కలిగించే అవకాశం ఉన్నది! - ఒకవేళ విధానం ప్రారంభించబడినట్లయితే, కామాతో వేరు చేసిన జాబితాలో - పేర్కొనే ప్రతి ఒక్క ప్రారంభ స్థానంలో దాని స్వంత ప్రక్రియ అమలు చేయబడుతుంది. ఇది ఉపడొమైన్ల ద్వారా పేర్కొనబడే - ప్రారంభ స్థానాలను కూడా వేరు చేస్తుంది; ఉదా. https://example.com/ పేర్కొంటే - https://foo.example.com/ అనేదానిని కూడా https://example.com/ - సైట్లో నుండి వేరుపరచడం జరుగుతుంది. - ఒకవేళ విధానాన్ని నిలిపివేసినట్లయితే, ఒక్కో-సైట్ చొప్పున వేరుపరిచే ప్రక్రియ నిర్వహణ తార్కిక పద్ధతి ప్రభావవంతం అవుతుంది. - ఒకవేళ విధానాన్ని కాన్ఫిగర్ చేయకపోతే, వినియోగదారు ఈ సెట్టింగ్ను మార్చగలుగుతారు. - <ph name="PRODUCT_OS_NAME" />లో, <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> పరికర విధానాన్ని కూడా అదే విలువకు సెట్ చేయాల్సిందిగా సిఫార్సు చేయడమైనది. రెండు విధానాలు పేర్కొన్న విలువలు కనుక సరిపోలకుంటే, వినియోగదారు విధానం ద్వారా పేర్కొనబడిన విలువని వర్తింపజేసే సమయంలో వినియోగ సెషన్లోకి ప్రవేశించడం ఆలస్యం కావచ్చు. - </translation> <translation id="1194005076170619046">ప్రారంభిస్తే, సెషన్ సక్రియంగా ఉన్నప్పుడు మరియు స్క్రీన్ లాక్ చేయనప్పుడు, సిస్టమ్ ట్రేలో పెద్ద ఎర్రటి లాగ్అవుట్ బటన్ చూపబడుతుంది. నిలిపివేస్తే లేదా పేర్కొనకపోతే, సిస్టమ్ ట్రేలో పెద్ద ఎర్రటి లాగ్అవుట్ బటన్ చూపబడదు.</translation> @@ -742,14 +731,6 @@ ఈ విధానాన్ని సెట్ చేయనప్పుడు, మరింత-నిర్దిష్ట విధానాల యొక్క ప్రవర్తన ప్రభావితం కాదు.</translation> <translation id="2987155890997901449">ARCని ప్రారంభించండి</translation> <translation id="2987227569419001736">వెబ్ బ్లూటూత్ API వినియోగాన్ని నియంత్రించండి</translation> -<translation id="2998886474614739865"> - గమనిక: ఈ విధానం ప్రయోగాత్మకమైనది మరియు కార్యాచరణ విచ్ఛిన్నం కావచ్చు! - సైన్-ఇన్ స్క్రీన్కి ఈ విధానం వర్తిస్తుంది. దయచేసి వినియోగదారు సెషన్కి వర్తించే <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> విధానాన్ని కూడా చూడండి. రెండు విలువలనూ ఒకే విలువలకు సెట్ చేయాల్సిందిగా సిఫార్సు చేస్తున్నాము. విలువలు సరిపోలకపోతే, వినియోగదారు విధానం ద్వారా పేర్కొన్న విలువ వర్తింపజేస్తున్నప్పుడు వినియోగదారు సెషన్లో ప్రవేశించేటప్పుడు ఆలస్యం జరగవచ్చు. - విధానం ప్రారంభించబడితే, కామాతో వేరు చేయబడిన జాబితాలోని ప్రతి మూలం దాని సొంత ప్రక్రియలో అమలు అవుతుంది. -ఇది ఉపడొమైన్లచే మూలాలను కూడా వేరు చేస్తుంది; ఉదా. https://foo.example.com/ను https://example.com/ సైట్లో భాగంగా వేరు చేయడానికి https://example.com/ నిర్దేశిస్తుంది. - విధానం నిలిపివేయబడితే, ప్రీ-సైట్ వేరు చేసే పక్రియ నిర్వహణ లాజిక్ అమలు అవుతుంది. - విధానం కాన్ఫిగర్ చేయబడకపోతే, సైన్-ఇన్ స్క్రీన్ కోసం ప్లాట్ఫారమ్ డిఫాల్ట్ సైట్ వేరు చేసే సెట్టింగ్లు ఉపయోగించబడతాయి. - </translation> <translation id="3016255526521614822"><ph name="PRODUCT_OS_NAME" /> లాక్ స్క్రీన్పై అనుమతించిన వైట్లిస్ట్ విషయ సేకరణ యాప్లు</translation> <translation id="3021562480854470924">మైలురాళ్లు సంఖ్య ఉపసంహరణ అనుమతించబడింది</translation> <translation id="3030000825273123558">గణాంకాల నివేదనను ప్రారంభించు</translation> @@ -857,14 +838,6 @@ ఈ విధానాన్ని ఖాళీగా ఉండని వాక్యానికి సెట్ చేస్తే, ఆ వాక్యం <ph name="PRODUCT_NAME" /> గమ్యస్థానానికి పేరుగా ఉపయోగించబడుతుంది. లేదంటే, గమ్యస్థానం పేరు పరికరం పేరు అవుతుంది. ఈ విధానాన్ని సెట్ చేయకుంటే, గమ్యస్థానం పేరు పరికరం పేరు అవుతుంది మరియు పరికర యజమాని (లేదా పరికరాన్ని నిర్వహిస్తున్న డొమైన్ యొక్క వినియోగదారు) దీనిని మార్చడానికి అనుమతించబడతారు. పేరు 24 అక్షరాలకు పరిమితం.</translation> <translation id="3381968327636295719">హోస్ట్ బ్రౌజర్ని డిఫాల్ట్గా ఉపయోగించు</translation> -<translation id="3386001018488754001"> - గమనిక: ఈ విధానం ప్రయోగాత్మకమైనది మరియు కార్యాచరణ విచ్ఛిన్నం కావచ్చు! - సైన్-ఇన్ స్క్రీన్కి ఈ విధానం వర్తిస్తుంది. దయచేసి వినియోగదారు సెషన్కి వర్తించే <ph name="SITE_PER_PROCESS_POLICY_NAME" /> విధానాన్ని కూడా చూడండి. రెండు విలువలనూ ఒకే విలువలకు సెట్ చేయాల్సిందిగా సిఫార్సు చేస్తున్నాము. విలువలు సరిపోలకపోతే, వినియోగదారు విధానం ద్వారా పేర్కొన్న విలువ వర్తింపజేస్తున్నప్పుడు వినియోగదారు సెషన్లో ప్రవేశించేటప్పుడు ఆలస్యం జరగవచ్చు. - మీరు వేరు చేయాలనుకుంటున్న సైట్ల జాబితాతో IsolateOriginsను ఉపయోగించి, వినియోగదారుల కోసం వేరు చేయడం మరియు పరిమిత ప్రభావం రెండు అంశాలలో ఉత్తమమైనది పొందడానికి IsolateOrigins విధానం సెట్టింగ్లను పరిశీలించాలనుకోవచ్చు. ఈ SitePerProcess సెట్టింగ్, అన్ని సైట్లను వేరు చేస్తుంది. - విధానం ప్రారంభించబడితే, ప్రతి సైట్ దాని సొంత ప్రక్రియలో అమలు అవుతుంది. - విధానం నిలిపివేయబడితే, ప్రీ-సైట్ వేరు చేసే పక్రియ నిర్వహణ లాజిక్ అమలు అవుతుంది. - విధానం కాన్ఫిగర్ చేయబడకపోతే, వినియోగదారు ఈ సెట్టింగ్ను మార్చగలుగుతారు. - </translation> <translation id="3395348522300156660">వినియోగదారు ఉపయోగించగల ప్రింటర్లను పేర్కొంటుంది. <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> కోసం <ph name="PRINTERS_WHITELIST" />ని ఎంచుకుంటే మాత్రమే ఈ విధానం ఉపయోగించబడుతుంది @@ -1568,15 +1541,6 @@ విధానాన్ని సెట్ చేయకపోతే, లేదంటే ఖాళీ స్ట్రింగ్ లేదా చెల్లని పోర్ట్ పరిధికి సెట్ చేస్తే, WebRTC అందుబాటులో ఉన్న ఏదైనా UDP పోర్ట్ని ఉపయోగించడానికి అనుమతించబడుతుంది.</translation> <translation id="5290940294294002042">వినియోగదారు ప్రారంభించగల లేదా ఆపివేయగల ప్లగ్ఇన్ల జాబితాని పేర్కొను</translation> -<translation id="5301787427319106606"> - గమనిక: ఈ విధానం ప్రయోగాత్మకమైనది మరియు కార్యాచరణ విచ్ఛిన్నం కావచ్చు! - -మీరు వేరు చేయాలనుకుంటున్న సైట్ల జాబితాతో IsolateOriginsను ఉపయోగించి, వినియోగదారుల కోసం వేరు చేయడం మరియు పరిమిత ప్రభావం రెండు అంశాలలో ఉత్తమమైనది పొందడానికి IsolateOrigins విధానం సెట్టింగ్లను పరిశీలించాలనుకోవచ్చు. ఈ SitePerProcess సెట్టింగ్, అన్ని సైట్లను వేరు చేస్తుంది. - విధానం ప్రారంభించబడితే, ప్రతి సైట్ దాని సొంత ప్రక్రియలో అమలు అవుతుంది. - విధానం నిలిపివేయబడితే, ప్రీ-సైట్ వేరు చేసే పక్రియ నిర్వహణ లాజిక్ అమలు అవుతుంది. - విధానం కాన్ఫిగర్ చేయబడకపోతే, వినియోగదారు ఈ సెట్టింగ్ను మార్చగలుగుతారు. - <ph name="PRODUCT_OS_NAME" />లో, అదే విలువకు <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> పరికర విధానాన్ని సెట్ చేయడాన్ని కూడా సిఫార్సు చేయబడింది. రెండు విధానాల ద్వారా పేర్కొన్న విలువలు సరిపోలక పోతే, వినియోగదారు విధానం ద్వారా పేర్కొన్న విలువ వినియోగించబడుతున్నప్పుడు వినియోగదారు సెషన్లో ప్రవేశించేటప్పుడు ఆలస్యం జరగవచ్చు. - </translation> <translation id="5302612588919538756">ఈ విధానం నిలిపివేయబడుతోంది, బదులుగా SyncDisabled ఉపయోగించడం పరిశీలించండి. <ph name="PRODUCT_NAME" />కి సైన్ ఇన్ చేయడానికి వినియోగదారును అనుమతిస్తుంది.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index a8297b9d..a06c0047 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -58,13 +58,6 @@ ถ้าใช้นโยบายนี้ ผู้ใช้จะใช้เครื่องพิมพ์ได้ทุกเครื่องยกเว้นเครื่องที่มีรหัสตามที่ระบุไว้ในนโยบายนี้ </translation> -<translation id="1181881366217399113"> - หมายเหตุ: นโยบายนี้อยู่ในช่วงทดสอบและอาจส่งผลให้มีการทำงานผิดปกติ - หากเปิดใช้นโยบาย ต้นทางแต่ละแห่งที่มีชื่อในรายการที่คั่นด้วยจุลภาคจะทำงานตามขั้นตอนของตนเอง และยังเป็นการแยกต้นทางที่ตั้งชื่อตามโดเมนย่อย เช่น การระบุ https://example.com/ จะแยก https://foo.example.com/ ด้วย เนื่องจากเป็นส่วนหนึ่งของเว็บไซต์ https://example.com/ - หากปิดใช้นโยบาย จะมีการใช้ตรรกะการจัดการขั้นตอนการแยกเว็บไซต์ล่วงหน้า - หากไม่ได้กำหนดค่านโยบายไว้ ผู้ใช้จะเปลี่ยนการตั้งค่านี้ได้ - ใน <ph name="PRODUCT_OS_NAME" /> ขอแนะนำให้ตั้งค่านโยบายด้านอุปกรณ์ <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> เป็นค่าเดียวกันด้วย หากค่าที่นโยบายทั้งสองระบุไม่ตรงกัน อาจทำให้เกิดความล่าช้าเมื่อเข้าสู่เซสชันของผู้ใช้ในขณะที่นำค่าที่นโยบายด้านผู้ใช้ระบุไปใช้ - </translation> <translation id="1198465924256827162">ความถี่ในการส่งการอัปโหลดสถานะของอุปกรณ์ หน่วยเป็นมิลลิวินาที หากไม่ตั้งค่านโยบายนี้ ความถี่เริ่มต้นคือ 3 ชั่วโมง ค่าความถี่ต่ำสุด @@ -652,13 +645,6 @@ ค่านโยบายควรกำหนดในหน่วยมิลลิวินาที ค่าจะถูกบีบให้น้อยกว่าหรือเท่ากับระยะหน่วงเวลาการปิดหน้าจอ (หากตั้งค่า) และระยะหน่วงเวลาของการไม่ใช้งาน</translation> <translation id="2987155890997901449">เปิดใช้ ARC</translation> <translation id="2987227569419001736">ควบคุมการใช้ Web Bluetooth API</translation> -<translation id="2998886474614739865"> - หมายเหตุ: นโยบายนี้อยู่ในช่วงทดสอบและอาจส่งผลให้มีการทำงานผิดปกติ - นโยบายนี้ใช้กับหน้าจอลงชื่อเข้าใช้ โปรดดูเพิ่มเติมที่นโยบาย <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> ซึ่งใช้กับเซสชันของผู้ใช้ ขอแนะนำให้ตั้งค่าเดียวกันสำหรับทั้ง 2 นโยบาย ค่าที่ไม่ตรงกันอาจทำให้เกิดความล่าช้าเมื่อเข้าสู่เซสชันของผู้ใช้ในขณะที่นำค่าที่นโยบายด้านผู้ใช้ระบุไปใช้ - หากเปิดใช้นโยบาย ต้นทางแต่ละแห่งที่มีชื่อในรายการที่คั่นด้วยจุลภาคจะทำงานตามขั้นตอนของตนเอง และยังเป็นการแยกต้นทางที่ตั้งชื่อตามโดเมนย่อย เช่น การระบุ https://example.com/ จะแยก https://foo.example.com/ ด้วย เนื่องจากเป็นส่วนหนึ่งของเว็บไซต์ https://example.com/ - หากปิดใช้นโยบาย จะมีการใช้ตรรกะการจัดการขั้นตอนการแยกแบบทีละเว็บไซต์ - หากไม่ได้กำหนดค่านโยบายนี้ไว้ จะมีการใช้การตั้งค่าเริ่มต้นสำหรับการแยกเว็บไซต์บนแพลตฟอร์มสำหรับหน้าจอการลงชื่อเข้าใช้ - </translation> <translation id="3016255526521614822">อนุญาตพิเศษให้แอปสำหรับจดโน้ตแสดงในหน้าจอล็อกของ <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">อนุญาตให้มีจุดการย้อนกลับ</translation> <translation id="3030000825273123558">เปิดใช้งานการรายงานเมตริก</translation> @@ -762,15 +748,6 @@ หากตั้งค่านโยบายนี้เป็นสตริงที่ไม่ว่างเปล่า ระบบจะใช้สตริงนั้นเป็นชื่อปลายทางของ <ph name="PRODUCT_NAME" /> มิเช่นนั้นชื่อปลายทางจะเป็นชื่ออุปกรณ์ หากไม่ตั้งค่านโยบายนี้ ชื่อปลายทางจะเป็นชื่ออุปกรณ์ และเจ้าของอุปกรณ์ (หรือผู้ใช้จากโดเมนที่จัดการอุปกรณ์) จะได้รับอนุญาตให้เปลี่ยนชื่อ ชื่อต้องมีความยาวไม่เกิน 24 อักขระ</translation> <translation id="3381968327636295719">ใช้เบราว์เซอร์โฮสต์โดยค่าเริ่มต้น</translation> -<translation id="3386001018488754001"> - หมายเหตุ: นโยบายนี้อยู่ในช่วงทดสอบและอาจส่งผลให้มีการทำงานผิดปกติ - นโยบายนี้ใช้กับหน้าจอลงชื่อเข้าใช้ โปรดดูเพิ่มเติมที่นโยบาย <ph name="SITE_PER_PROCESS_POLICY_NAME" /> ซึ่งใช้กับเซสชันของผู้ใช้ ขอแนะนำให้ตั้งค่าเดียวกันสำหรับทั้ง 2 นโยบาย ค่าที่ไม่ตรงกันอาจทำให้เกิดความล่าช้าเมื่อเข้าสู่เซสชันของผู้ใช้ในขณะที่นำค่าที่นโยบายด้านผู้ใช้ระบุไปใช้ - คุณอาจต้องดูการตั้งค่านโยบาย IsolateOrigins เพื่อให้ได้ผลลัพธ์ที่ดีที่สุดทั้งการแยกและการจำกัดผลกระทบที่มีต่อผู้ใช้ด้วยการใช้ IsolateOrigins กับรายการเว็บไซต์ที่คุณต้องการแยก - การตั้งค่า SitePerProcess นี้จะแยกเว็บไซต์ทั้งหมด - หากเปิดใช้นโยบาย แต่ละเว็บไซต์จะทำงานตามขั้นตอนของตนเอง - หากปิดใช้นโยบาย ระบบจะใช้ตรรกะการจัดการขั้นตอนการแยกแบบทีละเว็บไซต์ - หากไม่ได้กำหนดค่านโยบายไว้ ผู้ใช้จะเปลี่ยนการตั้งค่านี้ได้ - </translation> <translation id="3395348522300156660">ระบุเครื่องพิมพ์ที่ผู้ใช้ใช้งานได้ จะใช้นโยบายนี้ก็ต่อเมื่อเลือก <ph name="PRINTERS_WHITELIST" /> สำหรับโหมด <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> เท่านั้น @@ -1358,15 +1335,6 @@ หากไม่ได้ตั้งค่านโยบายนี้ไว้ หรือตั้งค่าเป็นสตริงว่างหรือช่วงพอร์ตที่ไม่ถูกต้อง จะเป็นการอนุญาตให้ WebRTC ใช้พอร์ต UDP ที่ว่างอยู่พอร์ตใดก็ได้ในเครื่อง</translation> <translation id="5290940294294002042">ระบุรายการปลั๊กอินที่ผู้ใช้สามารถเปิดหรือปิดใช้งาน</translation> -<translation id="5301787427319106606"> - หมายเหตุ: นโยบายนี้อยู่ในช่วงทดสอบและอาจส่งผลให้มีการทำงานผิดปกติ - คุณอาจต้องดูการตั้งค่านโยบาย IsolateOrigins เพื่อให้ได้ผลลัพธ์ที่ดีที่สุดทั้งการแยกและการจำกัดผลกระทบที่มีต่อผู้ใช้ด้วยการใช้ IsolateOrigins กับรายการเว็บไซต์ที่คุณต้องการแยก - การตั้งค่า SitePerProcess นี้จะแยกเว็บไซต์ทั้งหมด - หากเปิดใช้นโยบาย แต่ละเว็บไซต์จะทำงานตามขั้นตอนของตนเอง - หากปิดใช้นโยบาย ระบบจะใช้ตรรกะการจัดการขั้นตอนการแยกแบบทีละเว็บไซต์ - หากไม่ได้กำหนดค่านโยบายไว้ ผู้ใช้จะเปลี่ยนการตั้งค่านี้ได้ - ใน <ph name="PRODUCT_OS_NAME" /> ขอแนะนำให้ตั้งค่านโยบายด้านอุปกรณ์ <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> เป็นค่าเดียวกันด้วย หากค่าที่นโยบายทั้งสองระบุไม่ตรงกัน อาจทำให้เกิดความล่าช้าเมื่อเข้าสู่เซสชันของผู้ใช้ในขณะที่นำค่าที่นโยบายด้านผู้ใช้ระบุไปใช้ - </translation> <translation id="5302612588919538756">นโยบายนี้เลิกใช้งานแล้ว ลองพิจารณาใช้ SyncDisabled แทน อนุญาตให้ผู้ใช้ลงชื่อเข้าใช้ <ph name="PRODUCT_NAME" />
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 6c9ecfc..e6087424 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -59,14 +59,6 @@ Bu politika kullanılırsa, bu politikada listelenen kimlikler dışındaki tüm yazıcılar kullanıcıya sağlanır. </translation> -<translation id="1181881366217399113"> - NOT: Bu politika deneme niteliğinde olup işleyişi bozabilir! - Bu politikanın etkinleştirilmesi halinde, virgülle ayrılmış listede adı verilen her kaynak kendi işleminde çalışır. Bu politika ayrıca alt alan adlarıyla adlandırılan kaynakları da izole eder; örneğin, https://example.com/ adresinin belirtilmesi, https://example.com/ sitesinin bir parçası olarak https://foo.example.com/ sitesinin de izole edilmesine neden olur. - Bu politikanın devre dışı bırakılması halinde Site İzolasyonu öncesi işlem yönetimi mantığı etkin olur. - Bu politikanın yapılandırılmaması halinde kullanıcı bu ayarı değiştirebilir. - - <ph name="PRODUCT_OS_NAME" /> işletim sisteminde, <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> cihaz politikasının aynı değere ayarlanması da önerilir. İki politikanın belirttiği değerler eşleşmezse, kullanıcı politikası tarafından belirtilen değer uygulanırken kullanıcı oturumuna girişte bir gecikme olabilir. - </translation> <translation id="1198465924256827162">Cihaz durumuyla ilgili güncellemelerin ne sıklıkta (mili saniye olarak) gönderileceğini belirleyin. Bu politika ayarlanmadan bırakılırsa varsayılan sıklık 3 saattir. İzin @@ -688,13 +680,6 @@ Politika değeri milisaniye olarak belirtilmelidir. Değerler ekran kapanma gecikmesinden (ayarlanmışsa) ve boşta kalma gecikmesinden küçük veya ona eşit olacak şekilde bir aralığa sıkıştırılır.</translation> <translation id="2987155890997901449">ARC'yi etkinleştir</translation> <translation id="2987227569419001736">Web Bluetooth API'sının kullanımını kontrol et</translation> -<translation id="2998886474614739865"> - NOT: Bu politika deneme niteliğinde olup işleyişi bozabilir! - Bu politika, oturum açma ekranı için geçerlidir. Lütfen ayrıca kullanıcı oturumu için geçerli olan <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> politikasına da bakın. Her iki politikanın da aynı değere ayarlanması önerilir. Değerler eşleşmezse, kullanıcı politikası tarafından belirtilen değer uygulanırken kullanıcı oturumuna girişte bir gecikme olabilir. - Bu politikanın etkinleştirilmesi halinde, virgülle ayrılmış listede ad verilmiş her kaynak kendi işleminde çalışır. Bu politika ayrıca alt alan adlarıyla adlandırılan kaynakları da izole eder; örneğin, https://example.com/ adresinin belirtilmesi, https://example.com/ sitesinin bir parçası olarak https://foo.example.com/ sitesinin de izole edilmesine neden olur. - Bu politikanın devre dışı bırakılması halinde Site Bazlı İzolasyon işlem yönetimi mantığı etkin olur. - Bu politikanın yapılandırılmaması halinde oturum açma ekranı için platformun varsayılan site izolasyonu ayarları kullanılır. - </translation> <translation id="3016255526521614822">Beyaz listedeki not alma uygulamalarına <ph name="PRODUCT_OS_NAME" /> kilit ekranında izin verilir</translation> <translation id="3021562480854470924">Geri alma işleminin izin verildiği dönüm noktası sayısı</translation> <translation id="3030000825273123558">Ölçüm raporlamayı etkinleştir</translation> @@ -803,14 +788,6 @@ Bu politika boş olmayan bir dizeye ayarlanırsa, söz konusu dize <ph name="PRODUCT_NAME" /> hedefinin adı olarak kullanılır. Aksi halde hedef adı cihaz adı olur. Bu politika ayarlanmazsa hedef adı cihaz adı olur ve cihaz sahibi (veya alandan cihazı yöneten bir kullanıcı), adı değiştirme iznine sahip olur. Ad, 24 karakterle sınırlıdır.</translation> <translation id="3381968327636295719">Varsayılan olarak ana makine tarayıcısını kullan</translation> -<translation id="3386001018488754001"> - NOT: Bu politika deneme niteliğinde olup işleyişi bozabilir! - Bu politika, oturum açma ekranı için geçerlidir. Lütfen ayrıca kullanıcı oturumu için geçerli olan <ph name="SITE_PER_PROCESS_POLICY_NAME" /> politikasına da bakın. Her iki politikanın da aynı değere ayarlanması önerilir. Değerler eşleşmezse, kullanıcı politikası tarafından belirtilen değer uygulanırken kullanıcı oturumuna girişte bir gecikme olabilir. - Hem izolasyondan hem de kullanıcılar için sınırlı etkiden en iyi şekilde yararlanmak üzere IsolateOrigins politika ayarına bakmak isteyebilirsiniz. Bunun için, izole etmek istediğiniz sitelerin listesiyle IsolateOrigins'i kullanabilirsiniz. Bu ayar (SitePerProcess) tüm siteleri izole eder. - Bu politikanın etkinleştirilmesi halinde her site kendi işleminde çalışır. - Bu politikanın devre dışı bırakılması halinde Site Bazlı İzolasyon işlem yönetimi mantığı etkin olur. - Bu politikanın yapılandırılmaması halinde kullanıcı bu ayarı değiştirebilir. - </translation> <translation id="3395348522300156660">Bir kullanıcının kullanabileceği yazıcıları belirtir. Bu politika yalnızca <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> için <ph name="PRINTERS_WHITELIST" /> değeri seçilirse kullanılır @@ -1448,15 +1425,6 @@ Politika ayarlanmazsa veya boş dize değerine ya da geçersiz bir bağlantı noktası aralığına ayarlanırsa, WebRTC'nin kullanılabilir herhangi bir yerel UDP bağlantı noktasını kullanmasına izin verilir.</translation> <translation id="5290940294294002042">Kullanıcının etkinleştirebileceği veya devre dışı bırakabileceği eklentilerin listesini belirt</translation> -<translation id="5301787427319106606"> - NOT: Bu politika deneme niteliğinde olup işleyişi bozabilir! - Hem izolasyondan hem de kullanıcılar için sınırlı etkiden en iyi şekilde yararlanmak üzere IsolateOrigins politika ayarına bakmak isteyebilirsiniz. Bunun için, izole etmek istediğiniz sitelerin listesiyle IsolateOrigins'i kullanabilirsiniz. Bu ayar (SitePerProcess) tüm siteleri izole eder. - Bu politikanın etkinleştirilmesi halinde her site kendi işleminde çalışır. - Bu politikanın devre dışı bırakılması halinde Site Bazlı İzolasyon işlem yönetimi mantığı etkin olur. - - Bu politikanın yapılandırılmaması halinde kullanıcı bu ayarı değiştirebilir. - <ph name="PRODUCT_OS_NAME" /> işletim sisteminde, <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> cihaz politikasının aynı değere ayarlanması da önerilir. İki politikanın belirttiği değerler eşleşmezse, kullanıcı politikası tarafından belirtilen değer uygulanırken kullanıcı oturumuna girişte bir gecikme olabilir. - </translation> <translation id="5302612588919538756">Bu politika kullanımdan kaldırılmıştır. Bunun yerine SyncDisabled'i kullanmayı düşünün. Kullanıcının <ph name="PRODUCT_NAME" /> ürününde oturum açmasına olanak verir.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 3cb6f67b..76cc273 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -58,18 +58,6 @@ Якщо це правило застосовується, користувачам доступні всі принтери, крім тих, чиї ідентифікатори зазначено в цьому правилі. </translation> -<translation id="1181881366217399113"> - ПРИМІТКА. Це правило експериментальне та може працювати неправильно. - Якщо це правило ввімкнено, кожне джерело в списку значень, - відокремлених комами, відкривається окремо. Також ізолюються - джерела з назвами субдоменів. Наприклад, якщо вказати example.com, - https://foo.example.com/ також буде ізольовано як частину сайту - https://example.com/. - Якщо це правило вимкнено, застосовується логіка керування процесами, - яка діяла до ізоляції сайтів. - Якщо це правило не налаштовано, користувач може змінити цей параметр. - На ОС <ph name="PRODUCT_OS_NAME" /> радимо вибрати те саме значення для правила <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" />. Якщо значення, указані двома правилами, відрізняються, сеанс користувача може запускатись із затримкою через застосування вказаного в правилі користувача значення. - </translation> <translation id="1198465924256827162">Частота надсилання статусу пристрою в мілісекундах. Якщо це правило не налаштовано, статус надсилатиметься кожні 3 години. Мінімальна @@ -667,18 +655,6 @@ Значення правила має вказуватися в мілісекундах. Також значення мають обов’язково бути меншими за затримку вимкнення екрана (якщо встановлено) і затримку через неактивність або дорівнювати їм.</translation> <translation id="2987155890997901449">Увімкнути ARC</translation> <translation id="2987227569419001736">Контролювати використання API Web Bluetooth</translation> -<translation id="2998886474614739865"> - ПРИМІТКА. Це правило експериментальне та може працювати неправильно. - Воно діє для екрана входу. Перегляньте також правило <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, яке застосовується до сеансу користувача. Радимо вибрати для обох правил однакові значення. Якщо значення відрізняються, сеанс користувача може запускатись із затримкою через застосування вказаного в правилі користувача значення. - Якщо це правило ввімкнено, кожне джерело в - списку значень, відокремлених комами, відкривається окремо. - Також ізолюються джерела з назвами субдоменів. Наприклад, - якщо вказати https://example.com/, https://foo.example.com/ - також буде ізольовано як частину сайту https://example.com/. - Якщо це правило вимкнено, застосовується логіка керування - процесами, яка діяла до ізоляції сайтів. - Якщо це правило не налаштовано, для екрана входу діють параметри платформи за умовчанням. - </translation> <translation id="3016255526521614822">Додатки для нотаток, дозволені на заблокованому екрані <ph name="PRODUCT_OS_NAME" /></translation> <translation id="3021562480854470924">Кількість версій, які можна відновити</translation> <translation id="3030000825273123558">Увімкнути повідомлення показників</translation> @@ -782,17 +758,6 @@ Якщо для цього правила вибрано непорожній рядок, цей рядок використовуватиметься як назва місця призначення <ph name="PRODUCT_NAME" />. В іншому випадку місцем призначення буде назва пристрою. Якщо це правило не налаштовано, назвою місця призначення буде назва пристрою, а власник цього пристрою (або користувач домену, що керує пристроєм) зможе змінювати її. Назва може містити не більше 24 символів.</translation> <translation id="3381968327636295719">Використовувати веб-переглядач хосту за умовчанням</translation> -<translation id="3386001018488754001"> - ПРИМІТКА. Це правило експериментальне та може працювати неправильно. - Воно діє для екрана входу. Перегляньте також правило <ph name="SITE_PER_PROCESS_POLICY_NAME" />, яке застосовується до сеансу користувача. Радимо вибрати для обох правил однакові значення. Якщо значення відрізняються, сеанс користувача може запускатись із затримкою через застосування вказаного в правилі користувача значення. - У налаштуваннях правила IsolateOrigins можна переглянути - можливості ізоляції й обмеженого впливу на користувачів. - Використовуйте правило IsolateOrigins зі списком сайтів, - які хочете ізолювати. Налаштування SitePerProcess ізолює всі сайти. - Якщо це правило ввімкнено, кожний сайт відкривається окремо. - Якщо це правило вимкнено, застосовується логіка керування процесами, яка діяла до ізоляції сайтів. - Якщо це правило не налаштовано, користувач може змінити цей параметр. - </translation> <translation id="3395348522300156660">Визначає принтери, доступні для користувачів. Це правило застосовується, лише коли для режиму доступу <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> вибрано <ph name="PRINTERS_WHITELIST" />. @@ -1383,18 +1348,6 @@ Якщо не налаштувати це правило або залишити порожній рядок чи вказати недійсний діапазон порту, WebRTC буде дозволено використовувати будь-який доступний локальний порт UDP.</translation> <translation id="5290940294294002042">Указати список плагінів, які користувач може ввімкнути або вимкнути</translation> -<translation id="5301787427319106606"> - ПРИМІТКА. Це правило експериментальне та може працювати неправильно. - У налаштуваннях правила IsolateOrigins можна - переглянути можливості ізоляції й обмеженого - впливу на користувачів. Використовуйте правило - IsolateOrigins зі списком сайтів, які хочете ізолювати. - Налаштування SitePerProcess ізолює всі сайти. - Якщо це правило ввімкнено, кожний сайт відкривається окремо. - Якщо це правило вимкнено, застосовується логіка керування процесами, яка діяла до ізоляції сайтів. - Якщо це правило не налаштовано, користувач може змінити цей параметр. - На <ph name="PRODUCT_OS_NAME" /> радимо вибрати те саме значення для правила <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" />. Якщо значення, указані двома правилами, відрізняються, сеанс користувача може запускатись із затримкою через застосування вказаного в правилі користувача значення. - </translation> <translation id="5302612588919538756">Це правило більше не використовується. Натомість застосовуйте правило "SyncDisabled". Користувач може входити в <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 07d36e0..dd0195d 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -58,17 +58,6 @@ Nếu sử dụng chính sách này, thì tất cả máy in sẽ được cung cấp cho người dùng trừ các máy in có id nằm trong chính sách này. </translation> -<translation id="1181881366217399113"> - LƯU Ý: Chính sách này chỉ mang tính thử nghiệm và có thể làm hỏng chức năng! - Nếu bạn bật chính sách này, mỗi nguồn gốc có tên trong - danh sách phân tách bằng dấu phẩy sẽ chạy theo quy trình riêng. Cài đặt này cũng sẽ cách ly - các nguồn gốc được đặt tên theo miền phụ; chẳng hạn như việc chỉ định https://example.com/ cũng sẽ - khiến cho https://foo.example.com/ bị cách ly vì là một phần của - trang https://example.com/. - Nếu bạn tắt chính sách này, logic quản lý quy trình Cách ly mỗi trang web sẽ có hiệu lực. - Nếu bạn không định cấu hình chính sách này, người dùng sẽ có thể thay đổi cài đặt này. - Trên <ph name="PRODUCT_OS_NAME" />, bạn cũng nên đặt chính sách thiết bị <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> thành cùng một giá trị. Nếu các giá trị do hai chính sách chỉ định không khớp nhau, thì có thể sẽ xảy ra hiện tượng chậm trễ khi vào một phiên người dùng trong khi áp dụng giá trị mà chính sách người dùng chỉ định. - </translation> <translation id="1198465924256827162">Tần suất tải lên trạng thái thiết bị, bằng mili giây. Nếu chính sách này không được đặt thì tần suất mặc định là 3 giờ. Tần @@ -689,17 +678,6 @@ Phải chỉ định giá trị chính sách bằng mili giây. Các giá trị được giới hạn ở mức nhỏ hơn hoặc bằng độ trễ tắt màn hình (nếu được đặt) và độ trễ khi không sử dụng.</translation> <translation id="2987155890997901449">Bật ARC</translation> <translation id="2987227569419001736">Kiểm soát việc sử dụng API Web Bluetooth</translation> -<translation id="2998886474614739865"> - LƯU Ý: Chính sách này chỉ mang tính thử nghiệm và có thể làm hỏng chức năng! - Chính sách này áp dụng cho màn hình đăng nhập. Vui lòng xem cả chính sách <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> áp dụng cho phiên người dùng. Bạn nên đặt cả hai chính sách thành cùng một giá trị. Nếu các giá trị không khớp nhau, thì có thể sẽ xảy ra hiện tượng chậm trễ khi vào một phiên người dùng trong khi áp dụng giá trị mà chính sách người dùng chỉ định. - Nếu bạn bật chính sách này, mỗi nguồn gốc có tên trong - danh sách phân tách bằng dấu phẩy sẽ chạy theo quy trình riêng. Cài đặt này cũng sẽ cách ly - các nguồn gốc được đặt tên theo miền phụ; chẳng hạn như việc chỉ định https://example.com/ cũng sẽ - khiến cho https://foo.example.com/ bị cách ly vì là một phần của - trang https://example.com/. - Nếu bạn tắt chính sách này, logic quản lý quy trình Cách ly mỗi trang web sẽ có hiệu lực. - Nếu bạn không định cấu hình chính sách này, cài đặt cách ly trang web mặc định của nền tảng sẽ được sử dụng cho màn hình đăng nhập. - </translation> <translation id="3016255526521614822">Đưa các ứng dụng ghi chú được phép trên màn hình khóa của <ph name="PRODUCT_OS_NAME" /> vào danh sách cho phép</translation> <translation id="3021562480854470924">Số mốc cho phép khôi phục</translation> <translation id="3030000825273123558">Bật báo cáo số liệu</translation> @@ -808,17 +786,6 @@ Nếu bạn đặt chính sách này thành một chuỗi không phải là chuỗi trống, thì chuỗi đó sẽ được sử dụng làm tên của đích <ph name="PRODUCT_NAME" />. Nếu không, tên đích sẽ là tên thiết bị. Nếu bạn không đặt chính sách này, thì tên đích sẽ là tên thiết bị và chủ sở hữu thiết bị (hoặc người dùng từ miền quản lý thiết bị) sẽ được phép thay đổi tên đó. Tên có độ dài tối đa là 24 ký tự.</translation> <translation id="3381968327636295719">Sử dụng trình duyệt chính theo mặc định</translation> -<translation id="3386001018488754001"> - LƯU Ý: Chính sách này chỉ mang tính thử nghiệm và có thể làm hỏng chức năng! - Chính sách này áp dụng cho màn hình đăng nhập. Vui lòng xem cả chính sách <ph name="SITE_PER_PROCESS_POLICY_NAME" /> áp dụng cho phiên người dùng. Bạn nên đặt cả hai chính sách thành cùng một giá trị. Nếu các giá trị không khớp nhau, thì có thể sẽ xảy ra hiện tượng chậm trễ khi vào một phiên người dùng trong khi áp dụng giá trị mà chính sách người dùng chỉ định. - Bạn nên xem cài đặt của chính sách IsolateOrigins để - khai thác tối đa cả hai khía cạnh, cách cách ly cũng như cách hạn chế tác động đến người dùng, bằng cách sử dụng - IsolateOrigins cùng với danh sách các trang web mà bạn muốn cách ly. Cài đặt này, - SitePerProcess, sẽ cách ly mọi trang web. - Nếu bạn bật chính sách này, mỗi trang web sẽ chạy theo quy trình riêng. - Nếu bạn tắt chính sách này, logic quản lý quy trình Cách ly mỗi trang web sẽ có hiệu lực. - Nếu bạn không định cấu hình chính sách này, người dùng sẽ có thể thay đổi cài đặt này. - </translation> <translation id="3395348522300156660">Chỉ định các máy in mà người dùng có thể sử dụng. Chỉ sử dụng chính sách này nếu đã chọn <ph name="PRINTERS_WHITELIST" /> cho <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> @@ -1438,17 +1405,6 @@ Nếu chưa đặt chính sách hoặc nếu chính sách được đặt thành chuỗi trống hoặc phạm vi cổng không hợp lệ thì WebRTC được phép sử dụng bất kỳ cổng UDP cục bộ khả dụng nào.</translation> <translation id="5290940294294002042">Chỉ định danh sách plugin mà người dùng có thể bật hoặc tắt</translation> -<translation id="5301787427319106606"> - LƯU Ý: Chính sách này chỉ mang tính thử nghiệm và có thể làm hỏng chức năng! - Bạn nên xem cài đặt của chính sách IsolateOrigins để - khai thác tối đa cả hai khía cạnh, cách cách ly cũng như cách hạn chế tác động đến người dùng, bằng cách sử dụng - IsolateOrigins cùng với danh sách các trang web mà bạn muốn cách ly. Cài đặt này, - SitePerProcess, sẽ cách ly mọi trang web. - Nếu bạn bật chính sách này, mỗi trang web sẽ chạy theo quy trình riêng. - Nếu bạn tắt chính sách này, logic quản lý quy trình Cách ly trước khi khởi chạy trang web sẽ có hiệu lực. - Nếu bạn không định cấu hình chính sách này, người dùng sẽ có thể thay đổi cài đặt này. - Trên <ph name="PRODUCT_OS_NAME" />, bạn cũng nên đặt chính sách thiết bị <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> thành cùng một giá trị. Nếu các giá trị mà hai chính sách này chỉ định không khớp nhau, thì có thể xảy ra hiện tượng chậm trễ khi vào một phiên người dùng trong khi áp dụng giá trị mà chính sách người dùng chỉ định. - </translation> <translation id="5302612588919538756">Chính sách này không được dùng nữa, thay vào đó hãy cân nhắc sử dụng SyncDisabled. Cho phép người dùng đăng nhập vào <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index f8158fb4..b53f341 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -58,13 +58,6 @@ 如果使用此政策,那么除了与此政策中所列 ID 对应的打印机之外,其他所有打印机都可供用户使用。 </translation> -<translation id="1181881366217399113"> - 请注意:此政策尚处于实验阶段,因此可能会导致功能中断! - 如果启用了此政策,则相关列表中以英文逗号分隔的每个指定来源都会在自己的进程中运行。这也会隔离以子网域命名的来源;例如,指定 https://example.com/ 也会导致 https://foo.example.com/ 被隔离(作为 https://example.com/ 网站的一部分)。 - 如果停用了此政策,“按网站隔离”进程管理逻辑即会生效。 - 如果未配置此政策,用户将能够更改此设置。 - 倘若您使用的是 <ph name="PRODUCT_OS_NAME" />,我们建议您也将 <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> 这项设备政策设为相同的值。如果这两项政策指定的值不一致,并且当前所应用的是由用户政策指定的值,那么系统在进入用户会话时便可能会发生延迟。 - </translation> <translation id="1198465924256827162">发送设备状态上传内容的频率(以毫秒为单位)。 如果此政策未设置,默认频率为 3 小时。允许的最低频率为 60 秒。</translation> @@ -641,13 +634,6 @@ 指定的政策值应以毫秒为单位,并且不得大于屏幕关闭延迟时间(如果设置了的话)和闲置延迟时间。</translation> <translation id="2987155890997901449">启用 ARC</translation> <translation id="2987227569419001736">控制对 Web Bluetooth API 的使用</translation> -<translation id="2998886474614739865"> - 请注意:此政策尚处于实验阶段,因此可能会导致功能中断! - 此政策适用于登录屏幕。另请参阅适用于用户会话的“<ph name="ISOLATE_ORIGINS_POLICY_NAME" />”政策。我们建议您将这两项政策设为相同的值。如果这两项政策指定的值不一致,并且当前所应用的是由用户政策指定的值,那么系统在进入用户会话时便可能会发生延迟。 - 如果启用了此政策,则相关列表中以英文逗号分隔的每个指定来源都会在自己的进程中运行。这也会隔离以子网域命名的来源;例如,指定 https://example.com/ 也会导致 https://foo.example.com/ 被隔离(作为 https://example.com/ 网站的一部分)。 - 如果停用了此政策,“按网站隔离”进程管理逻辑即会生效。 - 如果未配置此政策,系统则会为登录屏幕使用相应平台默认的网站隔离设置。 - </translation> <translation id="3016255526521614822">允许在 <ph name="PRODUCT_OS_NAME" />锁定屏幕启用加入白名单的备注应用</translation> <translation id="3021562480854470924">指定允许回滚到的里程碑的数量</translation> <translation id="3030000825273123558">启用指标报告</translation> @@ -747,14 +733,6 @@ 如果此政策设为非空字符串,该字符串将被用作 <ph name="PRODUCT_NAME" /> 目标名称。否则,目标名称便是设备名称。如果此政策未设置,则目标名称将是设备名称,且设备所有者(或者该设备的托管网域内的用户)将能更改该名称。该名称的长度不得超过 24 个字符。</translation> <translation id="3381968327636295719">默认情况下托管主机浏览器</translation> -<translation id="3386001018488754001"> - 请注意:此政策尚处于实验阶段,因此可能会导致功能中断! - 此政策适用于登录屏幕。另请参阅适用于用户会话的“<ph name="SITE_PER_PROCESS_POLICY_NAME" />”政策。我们建议您将这两项政策设为相同的值。如果这两项政策指定的值不一致,并且当前所应用的是由用户政策指定的值,那么系统在进入用户会话时便可能会发生延迟。 - 若想做到两全其美(既能实现隔离,又能减少给用户带来的影响),您最好先查看一下 IsolateOrigins 政策设置,了解如何使用 IsolateOrigins 政策来指定您想隔离的一系列网站。SitePerProcess 这项设置会隔离所有网站。 - 如果启用了此政策,每个网站都会在自己的进程中运行。 - 如果停用了此政策,“按网站隔离”进程管理逻辑即会生效。 - 如果未配置此政策,用户将能够更改此设置。 - </translation> <translation id="3395348522300156660">指定用户可以使用的打印机。 仅当为 <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> 选择了 <ph name="PRINTERS_WHITELIST" /> 时,才可使用此政策。 @@ -1330,14 +1308,6 @@ 如果此政策未设置,或者它设置为空字符串或无效端口范围,则允许 WebRTC 使用任何可用的本地 UDP 端口。</translation> <translation id="5290940294294002042">指定该用户可启用或停用的插件的列表</translation> -<translation id="5301787427319106606"> - 请注意:此政策尚处于实验阶段,因此可能会导致功能中断! - 若想做到两全其美(既能实现隔离,又能减少给用户带来的影响),您最好先查看一下 IsolateOrigins 政策设置,了解如何使用 IsolateOrigins 政策来指定您想隔离的一系列网站。SitePerProcess 这项设置会隔离所有网站。 - 如果启用了此政策,每个网站都会在自己的进程中运行。 - 如果停用了此政策,“按网站隔离”进程管理逻辑即会生效。 - 如果未配置此政策,用户将能够更改此设置。 - 倘若您使用的是 <ph name="PRODUCT_OS_NAME" />,我们建议您也将 <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> 这项设备政策设为相同的值。如果这两项政策指定的值不一致,并且当前所应用的是由用户政策指定的值,那么系统在进入用户会话时便可能会发生延迟。 - </translation> <translation id="5302612588919538756">此政策已弃用,请考虑改用 SyncDisabled。 允许用户登录到 <ph name="PRODUCT_NAME" />。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index c569856c..f9c8cef3 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -58,17 +58,6 @@ 一旦設定了這項政策,除了本政策中列出的 ID 外,其他所有印表機皆可供使用者使用。 </translation> -<translation id="1181881366217399113"> - 注意:這項政策仍在實驗階段,可能導致服務中斷! - 如果啟用這項政策,逗號分隔的清單中的已命名來源 - 就會以獨立程序執行。這也會隔離使用子網域名稱的來源; - 例如,指定 https://example.com/ - 也會造成 https://foo.example.com/ 遭到隔離, - 因為後者同樣屬於 https://example.com/ 網站。 - 如果停用這項政策,單一網站隔離程序管理邏輯就會生效。 - 如果未設定這項政策,使用者將可以變更這項設定。 - 在 <ph name="PRODUCT_OS_NAME" />上,建議你也將 <ph name="DEVICE_LOGIN_SCREEN_ISOLATE_ORIGINS_POLICY_NAME" /> 裝置政策設為相同的值。如果兩項政策指定的值不相符,在套用使用者政策指定的值的情況下,進入使用者工作階段時可能會發生延遲情況。 - </translation> <translation id="1198465924256827162">裝置狀態上傳的傳送頻率 (以毫秒數為單位)。 如未設定這項政策,預設頻率為 3 小時一次。可用頻率下限 @@ -664,17 +653,6 @@ 指定政策值時需以毫秒為單位。該值需小於或等於螢幕關閉延遲時間 (如有設定) 和閒置延遲時間。</translation> <translation id="2987155890997901449">啟用 ARC</translation> <translation id="2987227569419001736">控制 Web Bluetooth API 使用權限</translation> -<translation id="2998886474614739865"> - 注意:這項政策仍在實驗階段,可能導致服務中斷! - 這項政策適用於登入畫面。另請查看適用於使用者工作階段的 <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> 政策。建議你為這兩項政策設定相同的值。如果兩者的值不相符,在套用使用者政策指定的值的情況下,進入使用者工作階段時可能會發生延遲情況。 - 如果啟用這項政策,逗號分隔的清單中的已命名來源 - 就會以獨立程序執行。這也會隔離使用子網域名稱的來源; - 例如,指定 https://example.com/ - 也會造成 https://foo.example.com/ 遭到隔離, - 因為後者同樣屬於 https://example.com/ 網站。 - 如果停用這項政策,單一網站隔離程序管理邏輯就會生效。 - 如果未設定這項政策,登入畫面就會採用平台的預設網站隔離設定。 - </translation> <translation id="3016255526521614822">將「<ph name="PRODUCT_OS_NAME" />」螢幕鎖定畫面允許的筆記應用程式加入許可清單</translation> <translation id="3021562480854470924">允許復原的重要事件數</translation> <translation id="3030000825273123558">啟用計量報告</translation> @@ -778,17 +756,6 @@ 如果這項政策設為非空白字串,該字串就會成為「<ph name="PRODUCT_NAME" />」目的地的名稱,否則目的地名稱將會是裝置名稱。如果未設定這項政策,則目的地名稱會是裝置名稱,且裝置擁有者 (或裝置管理網域中的使用者) 可進行變更。名稱長度上限為 24 個字元。</translation> <translation id="3381968327636295719">根據預設使用主機瀏覽器</translation> -<translation id="3386001018488754001"> - 注意:這項政策仍在實驗階段,可能導致服務中斷! - 這項政策適用於登入畫面。另請查看適用於使用者工作階段的 <ph name="SITE_PER_PROCESS_POLICY_NAME" /> 政策。建議你為這兩項政策設定相同的值。如果兩者的值不相符,在套用使用者政策指定的值的情況下,進入使用者工作階段時可能會發生延遲情況。 - 為了儘可能減少隔離功能對使用者的影響, - 建議你先查看 IsolateOrigins 政策設定, - 瞭解如何使用 IsolateOrigins 設定需要隔離的網站清單。 - SitePerProcess 這項設定會隔離所有網站。 - 如果啟用這項政策,每個網站就會以獨立程序執行。 - 如果停用這項政策,單一網站隔離程序管理邏輯就會生效。 - 如果未設定這項政策,使用者將可以變更這項設定。 - </translation> <translation id="3395348522300156660">指定哪些印表機是可以使用的。 只有在為 <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> 選擇 <ph name="PRINTERS_WHITELIST" /> 的情況下,這項政策才有作用 @@ -1380,17 +1347,6 @@ 如果未設定這項政策,或是將這項政策設為空白字串或無效的通訊埠範圍,WebRTC 即可使用任何可用的本機 UDP 通訊埠。</translation> <translation id="5290940294294002042">指定使用者可以任意啟用或停用的外掛程式清單</translation> -<translation id="5301787427319106606"> - 注意:這項政策仍在實驗階段,可能導致服務中斷! - 為了儘可能減少隔離功能對使用者的影響, - 建議你先查看 IsolateOrigins 政策設定, - 瞭解如何使用 IsolateOrigins 設定需要隔離的網站清單。 - SitePerProcess 這項設定會隔離所有網站。 - 如果啟用這項政策,每個網站就會以獨立程序執行。 - 如果停用這項政策,單一網站隔離程序管理邏輯就會生效。 - 如果未設定這項政策,使用者將可以變更這項設定。 - 在 <ph name="PRODUCT_OS_NAME" />上,建議你也將 <ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> 裝置政策設為相同的值。如果兩項政策指定的值不相符,在套用使用者政策指定的值的情況下,進入使用者工作階段時可能會發生延遲情況。 - </translation> <translation id="5302612588919538756">這項政策已不適用,請考慮改用 SyncDisabled。 允許使用者登入 <ph name="PRODUCT_NAME" />。
diff --git a/components/services/heap_profiling/heap_profiling_service.cc b/components/services/heap_profiling/heap_profiling_service.cc index 2e69ab1f..82fb187f 100644 --- a/components/services/heap_profiling/heap_profiling_service.cc +++ b/components/services/heap_profiling/heap_profiling_service.cc
@@ -72,7 +72,7 @@ void HeapProfilingService::DumpProcessesForTracing( bool strip_path_from_mapped_files, - const DumpProcessesForTracingCallback& callback) { + DumpProcessesForTracingCallback callback) { if (!helper_) { context()->connector()->BindInterface( resource_coordinator::mojom::kServiceName, &helper_); @@ -88,16 +88,17 @@ // Need a memory map to make sense of the dump. The dump will be triggered // in the memory map global dump callback. helper_->GetVmRegionsForHeapProfiler( - pids, base::Bind(&HeapProfilingService:: - OnGetVmRegionsCompleteForDumpProcessesForTracing, - weak_factory_.GetWeakPtr(), - strip_path_from_mapped_files, callback)); + pids, + base::BindOnce(&HeapProfilingService:: + OnGetVmRegionsCompleteForDumpProcessesForTracing, + weak_factory_.GetWeakPtr(), strip_path_from_mapped_files, + std::move(callback))); } } void HeapProfilingService::OnGetVmRegionsCompleteForDumpProcessesForTracing( bool strip_path_from_mapped_files, - const DumpProcessesForTracingCallback& callback, + DumpProcessesForTracingCallback callback, VmRegions vm_regions) { connection_manager_.DumpProcessesForTracing( keep_small_allocations_, strip_path_from_mapped_files,
diff --git a/components/services/heap_profiling/heap_profiling_service.h b/components/services/heap_profiling/heap_profiling_service.h index b468a96..a279a06 100644 --- a/components/services/heap_profiling/heap_profiling_service.h +++ b/components/services/heap_profiling/heap_profiling_service.h
@@ -54,7 +54,7 @@ // HeapProfiler implementation. void DumpProcessesForTracing( bool strip_path_from_mapped_files, - const DumpProcessesForTracingCallback& callback) override; + DumpProcessesForTracingCallback callback) override; private: void OnProfilingServiceRequest(mojom::ProfilingServiceRequest request); @@ -63,7 +63,7 @@ void OnGetVmRegionsCompleteForDumpProcessesForTracing( bool strip_path_from_mapped_files, - const DumpProcessesForTracingCallback& callback, + DumpProcessesForTracingCallback callback, VmRegions vm_regions); service_manager::BinderRegistry registry_;
diff --git a/components/services/heap_profiling/public/cpp/BUILD.gn b/components/services/heap_profiling/public/cpp/BUILD.gn index 1f0b683..97cce65 100644 --- a/components/services/heap_profiling/public/cpp/BUILD.gn +++ b/components/services/heap_profiling/public/cpp/BUILD.gn
@@ -37,10 +37,13 @@ testonly = true sources = [ "sender_pipe_unittest.cc", + "switches_unittest.cc", ] deps = [ ":cpp", "//base", + "//base/allocator:buildflags", + "//base/test:test_support", "//mojo/edk", "//testing/gtest", ]
diff --git a/components/services/heap_profiling/public/cpp/controller.cc b/components/services/heap_profiling/public/cpp/controller.cc index 2f3f92d..da708a3 100644 --- a/components/services/heap_profiling/public/cpp/controller.cc +++ b/components/services/heap_profiling/public/cpp/controller.cc
@@ -19,7 +19,8 @@ uint32_t sampling_rate) : connector_(std::move(connector)), sampling_rate_(sampling_rate), - stack_mode_(stack_mode) { + stack_mode_(stack_mode), + weak_factory_(this) { DCHECK_NE(sampling_rate, 0u); // Start the Heap Profiling service. @@ -68,4 +69,14 @@ heap_profiling_service_->SetKeepSmallAllocations(keep_small_allocations); } +base::WeakPtr<Controller> Controller::GetWeakPtr() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return weak_factory_.GetWeakPtr(); +} + +service_manager::Connector* Controller::GetConnector() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return connector_.get(); +} + } // namespace heap_profiling
diff --git a/components/services/heap_profiling/public/cpp/controller.h b/components/services/heap_profiling/public/cpp/controller.h index aa278774..ab077b0d 100644 --- a/components/services/heap_profiling/public/cpp/controller.h +++ b/components/services/heap_profiling/public/cpp/controller.h
@@ -6,6 +6,7 @@ #define COMPONENTS_SERVICES_HEAP_PROFILING_PUBLIC_CPP_CONTROLLER_H_ #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "components/services/heap_profiling/public/mojom/heap_profiling_client.mojom.h" #include "components/services/heap_profiling/public/mojom/heap_profiling_service.mojom.h" @@ -57,6 +58,12 @@ void GetProfiledPids(GetProfiledPidsCallback callback); void SetKeepSmallAllocations(bool keep_small_allocations); + // Careful! WeakPtrs are also sequence-affine. + // This method must be called from the same sequence the instance is bound to. + base::WeakPtr<Controller> GetWeakPtr(); + + service_manager::Connector* GetConnector(); + private: std::unique_ptr<service_manager::Connector> connector_; mojom::ProfilingServicePtr heap_profiling_service_; @@ -66,6 +73,7 @@ const mojom::StackMode stack_mode_; SEQUENCE_CHECKER(sequence_checker_); + base::WeakPtrFactory<Controller> weak_factory_; DISALLOW_COPY_AND_ASSIGN(Controller); };
diff --git a/chrome/browser/profiling_host/profiling_process_host_unittest.cc b/components/services/heap_profiling/public/cpp/switches_unittest.cc similarity index 82% rename from chrome/browser/profiling_host/profiling_process_host_unittest.cc rename to components/services/heap_profiling/public/cpp/switches_unittest.cc index f3198e9..d26a5060d 100644 --- a/chrome/browser/profiling_host/profiling_process_host_unittest.cc +++ b/components/services/heap_profiling/public/cpp/switches_unittest.cc
@@ -2,47 +2,23 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/profiling_host/profiling_process_host.h" - +#include "components/services/heap_profiling/public/cpp/switches.h" #include "base/allocator/buildflags.h" #include "base/command_line.h" #include "base/test/scoped_command_line.h" #include "base/test/scoped_feature_list.h" -#include "chrome/common/chrome_switches.h" -#include "chrome/test/base/testing_profile.h" #include "components/services/heap_profiling/public/cpp/settings.h" -#include "components/services/heap_profiling/public/cpp/switches.h" -#include "content/public/test/mock_render_process_host.h" -#include "content/public/test/test_browser_thread_bundle.h" #include "testing/gtest/include/gtest/gtest.h" namespace heap_profiling { -TEST(ProfilingProcessHost, ShouldProfileNewRenderer) { - content::TestBrowserThreadBundle thread_bundle; - - ProfilingProcessHost pph; - TestingProfile testing_profile; - content::MockRenderProcessHost rph(&testing_profile); - - pph.SetMode(Mode::kNone); - EXPECT_FALSE(pph.ShouldProfileNewRenderer(&rph)); - - pph.SetMode(Mode::kAll); - EXPECT_TRUE(pph.ShouldProfileNewRenderer(&rph)); - - Profile* incognito_profile = testing_profile.GetOffTheRecordProfile(); - content::MockRenderProcessHost incognito_rph(incognito_profile); - EXPECT_FALSE(pph.ShouldProfileNewRenderer(&incognito_rph)); -} - #if BUILDFLAG(USE_ALLOCATOR_SHIM) -TEST(ProfilingProcessHost, GetModeForStartup_Default) { +TEST(HeapProfilingSwitches, GetModeForStartup_Default) { EXPECT_EQ(Mode::kNone, GetModeForStartup()); } -TEST(ProfilingProcessHost, GetModeForStartup_Commandline) { +TEST(HeapProfilingSwitches, GetModeForStartup_Commandline) { { base::test::ScopedCommandLine scoped_command_line; base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(kMemlog, ""); @@ -92,7 +68,7 @@ } } -TEST(ProfilingProcessHost, GetModeForStartup_Finch) { +TEST(HeapProfilingSwitches, GetModeForStartup_Finch) { EXPECT_EQ(Mode::kNone, GetModeForStartup()); std::map<std::string, std::string> parameters; @@ -155,7 +131,7 @@ } // Ensure the commandline overrides any given field trial. -TEST(ProfilingProcessHost, GetModeForStartup_CommandLinePrecedence) { +TEST(HeapProfilingSwitches, GetModeForStartup_CommandLinePrecedence) { base::test::ScopedCommandLine scoped_command_line; base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(kMemlog, kMemlogModeAll); @@ -171,7 +147,7 @@ #else -TEST(ProfilingProcessHost, GetModeForStartup_NoModeWithoutShim) { +TEST(HeapProfilingSwitches, GetModeForStartup_NoModeWithoutShim) { { base::test::ScopedCommandLine scoped_command_line; base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(kMemlog,
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index d9f81fc..e5f588b1 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -499,6 +499,7 @@ <translation id="4325863107915753736">No se pudo encontrar el artículo</translation> <translation id="4326324639298822553">Comprueba la fecha de vencimiento y vuelve a intentarlo</translation> <translation id="4331708818696583467">No seguro</translation> +<translation id="4340982228985273705">Esta computadora no se detectó como una empresa administrada, por lo que la política solo puede instalar automáticamente las extensiones alojadas en Chrome Web Store. La URL de actualización de Chrome Web Store es "<ph name="CWS_UPDATE_URL" />".</translation> <translation id="4346197816712207223">Tarjetas de crédito aceptadas</translation> <translation id="4356973930735388585">Es posible que los atacantes que se encuentren en este sitio intenten instalar programas peligrosos en tu computadora con el fin de robarte información o borrarla (p. ej., fotos, contraseñas, mensajes y tarjetas de crédito).</translation> <translation id="4372948949327679948">Valor <ph name="VALUE_TYPE" /> esperado.</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 11c139a..0592b48 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -498,6 +498,7 @@ <translation id="4325863107915753736">도움말을 찾지 못했습니다.</translation> <translation id="4326324639298822553">만료일을 확인한 후 다시 시도해 주세요.</translation> <translation id="4331708818696583467">안전하지 않음</translation> +<translation id="4340982228985273705">이 컴퓨터는 기업에서 관리하는 기기가 아닌 것으로 파악되므로, Chrome 웹 스토어에 호스팅된 확장 프로그램만 정책을 통해 자동으로 설치할 수 있습니다. Chrome 웹 스토어의 업데이트 URL은 '<ph name="CWS_UPDATE_URL" />'입니다.</translation> <translation id="4346197816712207223">사용 가능한 신용카드</translation> <translation id="4356973930735388585">이 사이트의 공격자가 사용자 정보(예: 사진, 비밀번호, 메시지, 신용카드)를 도용하거나 삭제하는 위험한 프로그램을 컴퓨터에 설치하려고 시도할 수 있습니다.</translation> <translation id="4372948949327679948">예상 <ph name="VALUE_TYPE" /> 값입니다.</translation>
diff --git a/components/sync_sessions/local_session_event_handler_impl_unittest.cc b/components/sync_sessions/local_session_event_handler_impl_unittest.cc index ed287ae..ec0db039 100644 --- a/components/sync_sessions/local_session_event_handler_impl_unittest.cc +++ b/components/sync_sessions/local_session_event_handler_impl_unittest.cc
@@ -53,9 +53,10 @@ const int kWindowId1 = 1000001; const int kWindowId2 = 1000002; -const int kTabId1 = 1000003; -const int kTabId2 = 1000004; -const int kTabId3 = 1000005; +const int kWindowId3 = 1000003; +const int kTabId1 = 1000004; +const int kTabId2 = 1000005; +const int kTabId3 = 1000006; class MockWriteBatch : public LocalSessionEventHandlerImpl::WriteBatch { public: @@ -114,10 +115,12 @@ InitHandler(&initial_batch); } - TestSyncedWindowDelegate* AddWindow(int window_id) { - return window_getter_.AddWindow( - sync_pb::SessionWindow_BrowserType_TYPE_TABBED, - SessionID::FromSerializedValue(window_id)); + TestSyncedWindowDelegate* AddWindow( + int window_id, + sync_pb::SessionWindow_BrowserType type = + sync_pb::SessionWindow_BrowserType_TYPE_TABBED) { + return window_getter_.AddWindow(type, + SessionID::FromSerializedValue(window_id)); } TestSyncedTabDelegate* AddTab(int window_id, @@ -323,17 +326,89 @@ {kTabId1, kTabId2, kTabId3})))); EXPECT_CALL(mock_batch, DoAdd(Pointee(MatchesTab(kSessionTag, kWindowId1, kTabId1, + /*tab_node_id=*/_, /*urls=*/{kFoo1})))); EXPECT_CALL(mock_batch, DoAdd(Pointee(MatchesTab(kSessionTag, kWindowId2, kTabId2, - /*urls=*/{kBar1})))); - EXPECT_CALL(mock_batch, - DoAdd(Pointee(MatchesTab(kSessionTag, kWindowId2, kTabId3, - /*urls=*/{kBar2, kBaz1})))); + /*tab_node_id=*/_, /*urls=*/{kBar1})))); + EXPECT_CALL( + mock_batch, + DoAdd(Pointee(MatchesTab(kSessionTag, kWindowId2, kTabId3, + /*tab_node_id=*/_, /*urls=*/{kBar2, kBaz1})))); InitHandler(&mock_batch); } +// Tests that calling AssociateWindowsAndTabs() reflects the open tabs in a) the +// SyncSessionTracker and b) the delegate, for the case where a custom tab +// exists without native data (no tabbed window). +TEST_F(LocalSessionEventHandlerImplTest, AssociateCustomTab) { + const int kRegularTabNodeId = 1; + const int kCustomTabNodeId = 2; + + // The tracker is initially restored from persisted state, containing a + // regular tab and a custom tab. This mimics + // SessionsSyncManager::InitFromSyncModel(). + sync_pb::SessionSpecifics regular_tab; + regular_tab.set_session_tag(kSessionTag); + regular_tab.set_tab_node_id(kRegularTabNodeId); + regular_tab.mutable_tab()->set_window_id(kWindowId1); + regular_tab.mutable_tab()->set_tab_id(kTabId1); + session_tracker_.ReassociateLocalTab(kRegularTabNodeId, + SessionID::FromSerializedValue(kTabId1)); + UpdateTrackerWithSpecifics(regular_tab, base::Time::Now(), &session_tracker_); + + sync_pb::SessionSpecifics custom_tab; + custom_tab.set_session_tag(kSessionTag); + custom_tab.set_tab_node_id(kCustomTabNodeId); + custom_tab.mutable_tab()->set_window_id(kWindowId2); + custom_tab.mutable_tab()->set_tab_id(kTabId2); + session_tracker_.ReassociateLocalTab(kCustomTabNodeId, + SessionID::FromSerializedValue(kTabId2)); + UpdateTrackerWithSpecifics(custom_tab, base::Time::Now(), &session_tracker_); + + sync_pb::SessionSpecifics header; + header.set_session_tag(kSessionTag); + header.mutable_header()->add_window()->set_window_id(kWindowId1); + header.mutable_header()->mutable_window(0)->add_tab(kTabId1); + header.mutable_header()->add_window()->set_window_id(kWindowId2); + header.mutable_header()->mutable_window(1)->add_tab(kTabId2); + UpdateTrackerWithSpecifics(header, base::Time::Now(), &session_tracker_); + + ASSERT_THAT(session_tracker_.LookupSession(kSessionTag), + MatchesSyncedSession(kSessionTag, + {{kWindowId1, std::vector<int>{kTabId1}}, + {kWindowId2, std::vector<int>{kTabId2}}})); + + // In the current session, all we have is a custom tab. + AddWindow(kWindowId3, sync_pb::SessionWindow_BrowserType_TYPE_CUSTOM_TAB); + AddTab(kWindowId3, kFoo1, kTabId3)->SetSyncId(kCustomTabNodeId); + + EXPECT_CALL(mock_delegate_, CreateLocalSessionWriteBatch()).Times(0); + + StrictMock<MockWriteBatch> mock_batch; + testing::InSequence seq; + EXPECT_CALL(mock_batch, + DoUpdate(Pointee(MatchesTab(kSessionTag, kWindowId1, kTabId1, + kRegularTabNodeId, /*urls=*/{})))); + EXPECT_CALL(mock_batch, + DoUpdate(Pointee(MatchesTab(kSessionTag, kWindowId2, kTabId2, + kCustomTabNodeId, /*urls=*/{})))); + EXPECT_CALL(mock_batch, DoUpdate(Pointee(MatchesTab(kSessionTag, kWindowId3, + kTabId3, kCustomTabNodeId, + /*urls=*/{kFoo1})))); + EXPECT_CALL(mock_batch, DoUpdate(Pointee(MatchesHeader( + kSessionTag, {kWindowId1, kWindowId2, kWindowId3}, + {kTabId1, kTabId3})))); + InitHandler(&mock_batch); + + EXPECT_THAT(session_tracker_.LookupSession(kSessionTag), + MatchesSyncedSession(kSessionTag, + {{kWindowId1, std::vector<int>{kTabId1}}, + {kWindowId2, std::vector<int>()}, + {kWindowId3, std::vector<int>{kTabId3}}})); +} + TEST_F(LocalSessionEventHandlerImplTest, PropagateNewNavigation) { AddWindow(kWindowId1); TestSyncedTabDelegate* tab = AddTab(kWindowId1, kFoo1, kTabId1); @@ -348,6 +423,7 @@ DoUpdate(Pointee(MatchesHeader(kSessionTag, {kWindowId1}, {kTabId1})))); EXPECT_CALL(*update_mock_batch, DoUpdate(Pointee(MatchesTab(kSessionTag, kWindowId1, kTabId1, + /*tab_node_id=*/_, /*urls=*/{kFoo1, kBar1})))); EXPECT_CALL(*update_mock_batch, Commit()); @@ -379,7 +455,7 @@ {kTabId1, kTabId2})))); EXPECT_CALL(*navigation_mock_batch, DoAdd(Pointee(MatchesTab(kSessionTag, kWindowId1, kTabId2, - /*urls=*/{kBar1})))); + /*tab_node_id=*/_, /*urls=*/{kBar1})))); EXPECT_CALL(*navigation_mock_batch, Commit()); EXPECT_CALL(mock_delegate_, CreateLocalSessionWriteBatch()) @@ -413,7 +489,7 @@ {kTabId1, kTabId2, kTabId3})))); EXPECT_CALL(*navigation_mock_batch, DoAdd(Pointee(MatchesTab(kSessionTag, kWindowId2, kTabId3, - /*urls=*/{kBaz1})))); + /*tab_node_id=*/_, /*urls=*/{kBaz1})))); EXPECT_CALL(*navigation_mock_batch, Commit()); EXPECT_CALL(mock_delegate_, CreateLocalSessionWriteBatch())
diff --git a/components/sync_sessions/sessions_sync_manager.cc b/components/sync_sessions/sessions_sync_manager.cc index 0ecad209..dacbe0d4 100644 --- a/components/sync_sessions/sessions_sync_manager.cc +++ b/components/sync_sessions/sessions_sync_manager.cc
@@ -558,8 +558,8 @@ return; } - std::set<int> tab_node_ids_to_delete; - session_tracker_.LookupForeignTabNodeIds(tag, &tab_node_ids_to_delete); + const std::set<int> tab_node_ids_to_delete = + session_tracker_.LookupTabNodeIds(tag); if (DisassociateForeignSession(tag)) { // Only tell sync to delete the header if there was one. change_output->push_back(
diff --git a/components/sync_sessions/sessions_sync_manager_unittest.cc b/components/sync_sessions/sessions_sync_manager_unittest.cc index 2ae6f6d..20f0ea2 100644 --- a/components/sync_sessions/sessions_sync_manager_unittest.cc +++ b/components/sync_sessions/sessions_sync_manager_unittest.cc
@@ -29,6 +29,7 @@ using syncer::SyncDataList; using syncer::SyncDataLocal; using syncer::SyncError; +using testing::ElementsAre; using testing::Eq; using testing::IsNull; @@ -1164,16 +1165,10 @@ manager()->session_tracker_.LookupSessionTab(session_tag, kTabIds1[1]), IsNull()); - std::set<int> tab_node_ids; - manager()->session_tracker_.LookupForeignTabNodeIds(session_tag, - &tab_node_ids); - EXPECT_EQ(6U, tab_node_ids.size()); - EXPECT_TRUE(tab_node_ids.find(tab1A.tab_node_id()) != tab_node_ids.end()); - EXPECT_TRUE(tab_node_ids.find(tab1B.tab_node_id()) != tab_node_ids.end()); - EXPECT_TRUE(tab_node_ids.find(tab1C.tab_node_id()) != tab_node_ids.end()); - EXPECT_TRUE(tab_node_ids.find(tab2A.tab_node_id()) != tab_node_ids.end()); - EXPECT_TRUE(tab_node_ids.find(tab2B.tab_node_id()) != tab_node_ids.end()); - EXPECT_TRUE(tab_node_ids.find(tab2C.tab_node_id()) != tab_node_ids.end()); + EXPECT_THAT(manager()->session_tracker_.LookupTabNodeIds(session_tag), + ElementsAre(tab1A.tab_node_id(), tab1B.tab_node_id(), + tab1C.tab_node_id(), tab2A.tab_node_id(), + tab2B.tab_node_id(), tab2C.tab_node_id())); SyncChangeList changes; changes.push_back(MakeRemoteChange(tab1A, SyncChange::ACTION_DELETE)); @@ -1181,13 +1176,9 @@ changes.push_back(MakeRemoteChange(tab2C, SyncChange::ACTION_DELETE)); manager()->ProcessSyncChanges(FROM_HERE, changes); - tab_node_ids.clear(); - manager()->session_tracker_.LookupForeignTabNodeIds(session_tag, - &tab_node_ids); - EXPECT_EQ(3U, tab_node_ids.size()); - EXPECT_TRUE(tab_node_ids.find(tab1C.tab_node_id()) != tab_node_ids.end()); - EXPECT_TRUE(tab_node_ids.find(tab2A.tab_node_id()) != tab_node_ids.end()); - EXPECT_TRUE(tab_node_ids.find(tab2B.tab_node_id()) != tab_node_ids.end()); + EXPECT_THAT(manager()->session_tracker_.LookupTabNodeIds(session_tag), + ElementsAre(tab1C.tab_node_id(), tab2A.tab_node_id(), + tab2B.tab_node_id())); manager()->DoGarbageCollection(); ASSERT_EQ(3U, output.size()); @@ -1224,22 +1215,15 @@ ASSERT_EQ(2U, output.size()); output.clear(); - std::set<int> tab_node_ids; - manager()->session_tracker_.LookupForeignTabNodeIds(session_tag, - &tab_node_ids); - EXPECT_EQ(2U, tab_node_ids.size()); - EXPECT_TRUE(tab_node_ids.find(tab_node_id_shared) != tab_node_ids.end()); - EXPECT_TRUE(tab_node_ids.find(tab_node_id_unique) != tab_node_ids.end()); + EXPECT_THAT(manager()->session_tracker_.LookupTabNodeIds(session_tag), + ElementsAre(tab_node_id_shared, tab_node_id_unique)); SyncChangeList changes; changes.push_back(MakeRemoteChange(tab1A, SyncChange::ACTION_DELETE)); manager()->ProcessSyncChanges(FROM_HERE, changes); - tab_node_ids.clear(); - manager()->session_tracker_.LookupForeignTabNodeIds(session_tag, - &tab_node_ids); - EXPECT_EQ(1U, tab_node_ids.size()); - EXPECT_TRUE(tab_node_ids.find(tab_node_id_unique) != tab_node_ids.end()); + EXPECT_THAT(manager()->session_tracker_.LookupTabNodeIds(session_tag), + ElementsAre(tab_node_id_unique)); manager()->DoGarbageCollection(); EXPECT_EQ(1U, output.size());
diff --git a/components/sync_sessions/synced_session_tracker.cc b/components/sync_sessions/synced_session_tracker.cc index dead372..404f9f0 100644 --- a/components/sync_sessions/synced_session_tracker.cc +++ b/components/sync_sessions/synced_session_tracker.cc
@@ -199,21 +199,19 @@ return tab_iter->second; } -void SyncedSessionTracker::LookupForeignTabNodeIds( - const std::string& session_tag, - std::set<int>* tab_node_ids) const { - tab_node_ids->clear(); +std::set<int> SyncedSessionTracker::LookupTabNodeIds( + const std::string& session_tag) const { const TrackedSession* session = LookupTrackedSession(session_tag); - if (session) { - tab_node_ids->insert(session->tab_node_ids.begin(), - session->tab_node_ids.end()); - } - // In case an invalid node id was included, remove it. - tab_node_ids->erase(TabNodePool::kInvalidTabNodeID); + return session ? session->tab_node_ids : std::set<int>(); } const SyncedSession* SyncedSessionTracker::LookupLocalSession() const { - const TrackedSession* session = LookupTrackedSession(local_session_tag_); + return LookupSession(local_session_tag_); +} + +const SyncedSession* SyncedSessionTracker::LookupSession( + const std::string& session_tag) const { + const TrackedSession* session = LookupTrackedSession(session_tag); return session ? &session->synced_session : nullptr; } @@ -319,12 +317,6 @@ return session->unmapped_tabs.count(tab_id) != 0; } -std::set<int> SyncedSessionTracker::GetTabNodeIdsForTesting( - const std::string& session_tag) const { - const TrackedSession* session = LookupTrackedSession(session_tag); - return session ? session->tab_node_ids : std::set<int>(); -} - void SyncedSessionTracker::PutWindowInSession(const std::string& session_tag, SessionID window_id) { TrackedSession* session = GetTrackedSession(session_tag); @@ -420,7 +412,9 @@ void SyncedSessionTracker::OnTabNodeSeen(const std::string& session_tag, int tab_node_id) { - GetTrackedSession(session_tag)->tab_node_ids.insert(tab_node_id); + if (tab_node_id != TabNodePool::kInvalidTabNodeID) { + GetTrackedSession(session_tag)->tab_node_ids.insert(tab_node_id); + } } sessions::SessionTab* SyncedSessionTracker::GetTab(
diff --git a/components/sync_sessions/synced_session_tracker.h b/components/sync_sessions/synced_session_tracker.h index 542d672d..8b823bd 100644 --- a/components/sync_sessions/synced_session_tracker.h +++ b/components/sync_sessions/synced_session_tracker.h
@@ -52,10 +52,9 @@ std::vector<const SyncedSession*> LookupAllForeignSessions( SessionLookup lookup) const; - // Fills |tab_node_ids| with the tab node ids (see GetTab) for all the tabs* - // associated with the session having tag |session_tag|. - void LookupForeignTabNodeIds(const std::string& session_tag, - std::set<int>* tab_node_ids) const; + // Returns the tab node ids (see GetTab) for all the tabs* associated with the + // session having tag |session_tag|. + std::set<int> LookupTabNodeIds(const std::string& session_tag) const; // Attempts to look up the session windows associatd with the session given // by |session_tag|. Ownership of SessionWindows stays within the @@ -81,6 +80,11 @@ // **** Methods for manipulating synced sessions and tabs. **** // Returns a pointer to the SyncedSession object associated with + // |session_tag|. If none exists, returns nullptr. Ownership of the + // SyncedSession remains within the SyncedSessionTracker. + const SyncedSession* LookupSession(const std::string& session_tag) const; + + // Returns a pointer to the SyncedSession object associated with // |session_tag|. If none exists, creates one. Ownership of the // SyncedSession remains within the SyncedSessionTracker. SyncedSession* GetSession(const std::string& session_tag); @@ -205,8 +209,6 @@ // Returns whether a tab is unmapped or not. bool IsTabUnmappedForTesting(SessionID tab_id); - std::set<int> GetTabNodeIdsForTesting(const std::string& session_tag) const; - private: friend class SessionsSyncManagerTest; friend class SyncedSessionTrackerTest;
diff --git a/components/sync_sessions/synced_session_tracker_unittest.cc b/components/sync_sessions/synced_session_tracker_unittest.cc index 76b4771..77ca586b 100644 --- a/components/sync_sessions/synced_session_tracker_unittest.cc +++ b/components/sync_sessions/synced_session_tracker_unittest.cc
@@ -10,6 +10,7 @@ #include "components/sessions/core/serialized_navigation_entry_test_helper.h" #include "components/sync_sessions/mock_sync_sessions_client.h" #include "components/sync_sessions/synced_tab_delegate.h" +#include "components/sync_sessions/test_matchers.h" #include "testing/gtest/include/gtest/gtest.h" using testing::AssertionFailure; @@ -132,6 +133,7 @@ TEST_F(SyncedSessionTrackerTest, GetSession) { SyncedSession* session1 = GetTracker()->GetSession(kTag); SyncedSession* session2 = GetTracker()->GetSession(kTag2); + ASSERT_EQ(session1, GetTracker()->LookupSession(kTag)); ASSERT_EQ(session1, GetTracker()->GetSession(kTag)); ASSERT_NE(session1, session2); // Should clean up memory on its own. @@ -145,7 +147,7 @@ TEST_F(SyncedSessionTrackerTest, PutWindowInSession) { GetTracker()->PutWindowInSession(kTag, kWindow1); - SyncedSession* session = GetTracker()->GetSession(kTag); + const SyncedSession* session = GetTracker()->LookupSession(kTag); ASSERT_EQ(1U, session->windows.size()); // Doing it again should have no effect. @@ -157,11 +159,11 @@ TEST_F(SyncedSessionTrackerTest, PutTabInWindow) { GetTracker()->PutWindowInSession(kTag, kWindow1); GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); - SyncedSession* session = GetTracker()->GetSession(kTag); + const SyncedSession* session = GetTracker()->LookupSession(kTag); ASSERT_EQ(1U, session->windows.size()); - ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size()); + ASSERT_EQ(1U, session->windows.at(kWindow1)->wrapped_window.tabs.size()); ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1), - session->windows[kWindow1]->wrapped_window.tabs[0].get()); + session->windows.at(kWindow1)->wrapped_window.tabs[0].get()); ASSERT_TRUE(VerifyTabIntegrity(kTag)); // Should clean up memory on its own. } @@ -308,68 +310,41 @@ } } -TEST_F(SyncedSessionTrackerTest, LookupForeignTabNodeIds) { - std::set<int> result; - +TEST_F(SyncedSessionTrackerTest, LookupTabNodeIds) { GetTracker()->OnTabNodeSeen(kTag, 1); GetTracker()->OnTabNodeSeen(kTag, 2); - GetTracker()->LookupForeignTabNodeIds(kTag, &result); - EXPECT_EQ(2U, result.size()); - EXPECT_FALSE(result.end() == result.find(1)); - EXPECT_FALSE(result.end() == result.find(2)); - GetTracker()->LookupForeignTabNodeIds(kTag2, &result); - EXPECT_TRUE(result.empty()); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag), ElementsAre(1, 2)); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag2), IsEmpty()); GetTracker()->PutWindowInSession(kTag, kWindow1); GetTracker()->PutTabInWindow(kTag, kWindow1, kTab1); - GetTracker()->LookupForeignTabNodeIds(kTag, &result); - EXPECT_EQ(2U, result.size()); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag), ElementsAre(1, 2)); GetTracker()->OnTabNodeSeen(kTag, 3); - GetTracker()->LookupForeignTabNodeIds(kTag, &result); - EXPECT_EQ(3U, result.size()); - EXPECT_FALSE(result.end() == result.find(3)); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag), ElementsAre(1, 2, 3)); GetTracker()->OnTabNodeSeen(kTag2, 21); GetTracker()->OnTabNodeSeen(kTag2, 22); - GetTracker()->LookupForeignTabNodeIds(kTag2, &result); - EXPECT_EQ(2U, result.size()); - EXPECT_FALSE(result.end() == result.find(21)); - EXPECT_FALSE(result.end() == result.find(22)); - GetTracker()->LookupForeignTabNodeIds(kTag, &result); - EXPECT_EQ(3U, result.size()); - EXPECT_FALSE(result.end() == result.find(1)); - EXPECT_FALSE(result.end() == result.find(2)); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag2), ElementsAre(21, 22)); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag), ElementsAre(1, 2, 3)); - GetTracker()->LookupForeignTabNodeIds(kTag3, &result); - EXPECT_TRUE(result.empty()); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag3), IsEmpty()); GetTracker()->PutWindowInSession(kTag3, kWindow2); GetTracker()->PutTabInWindow(kTag3, kWindow2, kTab2); - GetTracker()->LookupForeignTabNodeIds(kTag3, &result); - EXPECT_TRUE(result.empty()); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag3), IsEmpty()); EXPECT_FALSE(GetTracker()->DeleteForeignSession(kTag3)); - GetTracker()->LookupForeignTabNodeIds(kTag3, &result); - EXPECT_TRUE(result.empty()); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag3), IsEmpty()); EXPECT_FALSE(GetTracker()->DeleteForeignSession(kTag)); - GetTracker()->LookupForeignTabNodeIds(kTag, &result); - EXPECT_TRUE(result.empty()); - GetTracker()->LookupForeignTabNodeIds(kTag2, &result); - EXPECT_EQ(2U, result.size()); - EXPECT_FALSE(result.end() == result.find(21)); - EXPECT_FALSE(result.end() == result.find(22)); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag), IsEmpty()); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag2), ElementsAre(21, 22)); GetTracker()->OnTabNodeSeen(kTag2, 21); GetTracker()->OnTabNodeSeen(kTag2, 23); - GetTracker()->LookupForeignTabNodeIds(kTag2, &result); - EXPECT_EQ(3U, result.size()); - EXPECT_FALSE(result.end() == result.find(21)); - EXPECT_FALSE(result.end() == result.find(22)); - EXPECT_FALSE(result.end() == result.find(23)); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag2), ElementsAre(21, 22, 23)); EXPECT_FALSE(GetTracker()->DeleteForeignSession(kTag2)); - GetTracker()->LookupForeignTabNodeIds(kTag2, &result); - EXPECT_TRUE(result.empty()); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag2), IsEmpty()); } TEST_F(SyncedSessionTrackerTest, SessionTracking) { @@ -441,19 +416,14 @@ GetTracker()->OnTabNodeSeen(kTag, tab_node_id_1); GetTracker()->OnTabNodeSeen(kTag, tab_node_id_2); - GetTracker()->LookupForeignTabNodeIds(kTag, &result); - EXPECT_EQ(2U, result.size()); - EXPECT_TRUE(result.find(tab_node_id_1) != result.end()); - EXPECT_TRUE(result.find(tab_node_id_2) != result.end()); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag), + ElementsAre(tab_node_id_1, tab_node_id_2)); GetTracker()->DeleteForeignTab(kTag, tab_node_id_1); - GetTracker()->LookupForeignTabNodeIds(kTag, &result); - EXPECT_EQ(1U, result.size()); - EXPECT_TRUE(result.find(tab_node_id_2) != result.end()); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag), ElementsAre(tab_node_id_2)); GetTracker()->DeleteForeignTab(kTag, tab_node_id_2); - GetTracker()->LookupForeignTabNodeIds(kTag, &result); - EXPECT_TRUE(result.empty()); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag), IsEmpty()); ASSERT_TRUE(VerifyTabIntegrity(kTag)); } @@ -533,11 +503,11 @@ GetTracker()->CleanupLocalTabs(&free_node_ids); ASSERT_TRUE(VerifyTabIntegrity(kTag)); EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); - SyncedSession* session = GetTracker()->GetSession(kTag); + const SyncedSession* session = GetTracker()->LookupSession(kTag); ASSERT_EQ(1U, session->windows.size()); - ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size()); + ASSERT_EQ(1U, session->windows.at(kWindow1)->wrapped_window.tabs.size()); ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1), - session->windows[kWindow1]->wrapped_window.tabs[0].get()); + session->windows.at(kWindow1)->wrapped_window.tabs[0].get()); // Then reassociate with a new tab id. GetTracker()->ReassociateLocalTab(kTabNode1, kTab2); @@ -559,9 +529,9 @@ // Now that it's been mapped, it should be accessible both via the // GetSession as well as the GetTab. ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), - session->windows[kWindow1]->wrapped_window.tabs[0].get()); - ASSERT_EQ(GetTracker()->GetTabNodeIdsForTesting(kTag).size(), - GetTracker()->GetTabNodeIdsForTesting(kTag).count(kTabNode1)); + session->windows.at(kWindow1)->wrapped_window.tabs[0].get()); + ASSERT_EQ(GetTracker()->LookupTabNodeIds(kTag).size(), + GetTracker()->LookupTabNodeIds(kTag).count(kTabNode1)); ASSERT_EQ(1U, GetTabNodePool()->Capacity()); ASSERT_TRUE(VerifyTabIntegrity(kTag)); } @@ -585,11 +555,11 @@ ASSERT_TRUE(VerifyTabIntegrity(kTag)); EXPECT_TRUE(free_node_ids.empty()); EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); - SyncedSession* session = GetTracker()->GetSession(kTag); + const SyncedSession* session = GetTracker()->LookupSession(kTag); ASSERT_EQ(1U, session->windows.size()); - ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size()); + ASSERT_EQ(1U, session->windows.at(kWindow1)->wrapped_window.tabs.size()); EXPECT_EQ(GetTracker()->GetTab(kTag, kTab1), - session->windows[kWindow1]->wrapped_window.tabs[0].get()); + session->windows.at(kWindow1)->wrapped_window.tabs[0].get()); // Then reassociate with a new tab id. GetTracker()->ReassociateLocalTab(kTabNode1, kTab2); @@ -617,9 +587,9 @@ // Now that it's been mapped, it should be accessible both via the // GetSession as well as the GetTab. EXPECT_EQ(GetTracker()->GetTab(kTag, kTab2), - session->windows[kWindow1]->wrapped_window.tabs[1].get()); - EXPECT_EQ(GetTracker()->GetTabNodeIdsForTesting(kTag).size(), - GetTracker()->GetTabNodeIdsForTesting(kTag).count(kTabNode1)); + session->windows.at(kWindow1)->wrapped_window.tabs[1].get()); + EXPECT_EQ(GetTracker()->LookupTabNodeIds(kTag).size(), + GetTracker()->LookupTabNodeIds(kTag).count(kTabNode1)); EXPECT_EQ(1U, GetTabNodePool()->Capacity()); // Attempting to access the original tab will create a new SessionTab object. @@ -657,11 +627,11 @@ // Now that it's been mapped, it should be accessible both via the // GetSession as well as GetTab. - SyncedSession* session = GetTracker()->GetSession(kTag); + const SyncedSession* session = GetTracker()->LookupSession(kTag); ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), - session->windows[kWindow1]->wrapped_window.tabs[0].get()); - ASSERT_EQ(GetTracker()->GetTabNodeIdsForTesting(kTag).size(), - GetTracker()->GetTabNodeIdsForTesting(kTag).count(kTabNode1)); + session->windows.at(kWindow1)->wrapped_window.tabs[0].get()); + ASSERT_EQ(GetTracker()->LookupTabNodeIds(kTag).size(), + GetTracker()->LookupTabNodeIds(kTag).count(kTabNode1)); ASSERT_EQ(1U, GetTabNodePool()->Capacity()); ASSERT_TRUE(VerifyTabIntegrity(kTag)); } @@ -695,11 +665,11 @@ // Now that it's been mapped, it should be accessible both via the // GetSession as well as GetTab. - SyncedSession* session = GetTracker()->GetSession(kTag); + const SyncedSession* session = GetTracker()->LookupSession(kTag); ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), - session->windows[kWindow1]->wrapped_window.tabs[0].get()); - ASSERT_EQ(GetTracker()->GetTabNodeIdsForTesting(kTag).size(), - GetTracker()->GetTabNodeIdsForTesting(kTag).count(kTabNode1)); + session->windows.at(kWindow1)->wrapped_window.tabs[0].get()); + ASSERT_EQ(GetTracker()->LookupTabNodeIds(kTag).size(), + GetTracker()->LookupTabNodeIds(kTag).count(kTabNode1)); ASSERT_EQ(1U, GetTabNodePool()->Capacity()); ASSERT_TRUE(VerifyTabIntegrity(kTag)); } @@ -722,11 +692,11 @@ GetTracker()->CleanupLocalTabs(&free_node_ids); ASSERT_TRUE(VerifyTabIntegrity(kTag)); EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); - SyncedSession* session = GetTracker()->GetSession(kTag); + const SyncedSession* session = GetTracker()->LookupSession(kTag); ASSERT_EQ(1U, session->windows.size()); - ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size()); + ASSERT_EQ(1U, session->windows.at(kWindow1)->wrapped_window.tabs.size()); ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1), - session->windows[kWindow1]->wrapped_window.tabs[0].get()); + session->windows.at(kWindow1)->wrapped_window.tabs[0].get()); // Reassociate, using the same tab id. GetTracker()->ReassociateLocalTab(kTabNode1, kTab1); @@ -747,9 +717,9 @@ // Now that it's been mapped, it should be accessible both via the // GetSession as well as the GetTab. ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1), - session->windows[kWindow1]->wrapped_window.tabs[0].get()); - ASSERT_EQ(GetTracker()->GetTabNodeIdsForTesting(kTag).size(), - GetTracker()->GetTabNodeIdsForTesting(kTag).count(kTabNode1)); + session->windows.at(kWindow1)->wrapped_window.tabs[0].get()); + ASSERT_EQ(GetTracker()->LookupTabNodeIds(kTag).size(), + GetTracker()->LookupTabNodeIds(kTag).count(kTabNode1)); ASSERT_EQ(1U, GetTabNodePool()->Capacity()); ASSERT_TRUE(VerifyTabIntegrity(kTag)); } @@ -772,11 +742,11 @@ GetTracker()->CleanupLocalTabs(&free_node_ids); ASSERT_TRUE(VerifyTabIntegrity(kTag)); EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); - SyncedSession* session = GetTracker()->GetSession(kTag); + const SyncedSession* session = GetTracker()->LookupSession(kTag); ASSERT_EQ(1U, session->windows.size()); - ASSERT_EQ(1U, session->windows[kWindow1]->wrapped_window.tabs.size()); + ASSERT_EQ(1U, session->windows.at(kWindow1)->wrapped_window.tabs.size()); ASSERT_EQ(GetTracker()->GetTab(kTag, kTab1), - session->windows[kWindow1]->wrapped_window.tabs[0].get()); + session->windows.at(kWindow1)->wrapped_window.tabs[0].get()); // Create a second unmapped tab. GetTracker()->ReassociateLocalTab(kTabNode2, kTab2); @@ -804,9 +774,142 @@ // Now that it's been mapped, it should be accessible both via the // GetSession as well as the GetTab. ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), - session->windows[kWindow1]->wrapped_window.tabs[0].get()); + session->windows.at(kWindow1)->wrapped_window.tabs[0].get()); ASSERT_EQ(2U, GetTabNodePool()->Capacity()); ASSERT_TRUE(VerifyTabIntegrity(kTag)); } +TEST_F(SyncedSessionTrackerTest, UpdateTrackerWithHeader) { + sync_pb::SessionSpecifics header; + header.set_session_tag(kTag); + header.mutable_header()->add_window()->set_window_id(kWindow1.id()); + header.mutable_header()->mutable_window(0)->add_tab(kTab1.id()); + header.mutable_header()->mutable_window(0)->add_tab(kTab2.id()); + UpdateTrackerWithSpecifics(header, base::Time::Now(), GetTracker()); + + EXPECT_THAT( + GetTracker()->LookupSession(kTag), + MatchesSyncedSession(kTag, {{kWindow1.id(), {kTab1.id(), kTab2.id()}}})); + EXPECT_THAT(GetTracker()->LookupSessionTab(kTag, kTab1), NotNull()); + EXPECT_THAT(GetTracker()->LookupSessionTab(kTag, kTab2), NotNull()); +} + +TEST_F(SyncedSessionTrackerTest, UpdateTrackerWithIdenticalHeader) { + sync_pb::SessionSpecifics header; + header.set_session_tag(kTag); + header.mutable_header()->add_window()->set_window_id(kWindow1.id()); + header.mutable_header()->mutable_window(0)->add_tab(kTab1.id()); + header.mutable_header()->mutable_window(0)->add_tab(kTab2.id()); + UpdateTrackerWithSpecifics(header, base::Time::Now(), GetTracker()); + ASSERT_THAT( + GetTracker()->LookupSession(kTag), + MatchesSyncedSession(kTag, {{kWindow1.id(), {kTab1.id(), kTab2.id()}}})); + + // Update with an exact header entity. + UpdateTrackerWithSpecifics(header, base::Time::Now(), GetTracker()); + + EXPECT_THAT( + GetTracker()->LookupSession(kTag), + MatchesSyncedSession(kTag, {{kWindow1.id(), {kTab1.id(), kTab2.id()}}})); + EXPECT_THAT(GetTracker()->LookupSessionTab(kTag, kTab1), NotNull()); +} + +// Verifies that an invalid header (with duplicated tab IDs) is discarded. +TEST_F(SyncedSessionTrackerTest, UpdateTrackerWithHeaderWithDuplicateTabIds) { + sync_pb::SessionSpecifics header; + header.set_session_tag(kTag); + header.mutable_header()->add_window()->set_window_id(kWindow1.id()); + header.mutable_header()->mutable_window(0)->add_tab(kTab1.id()); + header.mutable_header()->mutable_window(0)->add_tab(kTab1.id()); + UpdateTrackerWithSpecifics(header, base::Time::Now(), GetTracker()); + + EXPECT_THAT(GetTracker()->LookupSession(kTag), + MatchesSyncedSession(kTag, /*window_id_to_tabs=*/{})); +} + +TEST_F(SyncedSessionTrackerTest, UpdateTrackerWithTab) { + sync_pb::SessionSpecifics tab; + tab.set_session_tag(kTag); + tab.set_tab_node_id(kTabNode1); + tab.mutable_tab()->set_window_id(kWindow1.id()); + tab.mutable_tab()->set_tab_id(kTab1.id()); + UpdateTrackerWithSpecifics(tab, base::Time::Now(), GetTracker()); + + const sessions::SessionTab* tracked_tab = + GetTracker()->LookupSessionTab(kTag, kTab1); + ASSERT_THAT(tracked_tab, NotNull()); + EXPECT_EQ(kWindow1, tracked_tab->window_id); + EXPECT_EQ(false, tracked_tab->pinned); + + EXPECT_THAT(GetTracker()->LookupSession(kTag), + MatchesSyncedSession(kTag, /*window_id_to_tabs*/ {})); + + // Overwrite some attribute. + tab.mutable_tab()->set_pinned(true); + UpdateTrackerWithSpecifics(tab, base::Time::Now(), GetTracker()); + tracked_tab = GetTracker()->LookupSessionTab(kTag, kTab1); + ASSERT_THAT(tracked_tab, NotNull()); + EXPECT_EQ(kWindow1, tracked_tab->window_id); + EXPECT_EQ(true, tracked_tab->pinned); + + EXPECT_THAT(GetTracker()->LookupSession(kTag), + MatchesSyncedSession(kTag, /*window_id_to_tabs*/ {})); +} + +TEST_F(SyncedSessionTrackerTest, UpdateTrackerWithTabThenHeader) { + sync_pb::SessionSpecifics tab; + tab.set_session_tag(kTag); + tab.set_tab_node_id(kTabNode1); + tab.mutable_tab()->set_window_id(kWindow1.id()); + tab.mutable_tab()->set_tab_id(kTab1.id()); + UpdateTrackerWithSpecifics(tab, base::Time::Now(), GetTracker()); + + EXPECT_THAT(GetTracker()->LookupSession(kTag), + MatchesSyncedSession(kTag, /*window_id_to_tabs*/ {})); + + sync_pb::SessionSpecifics header; + header.set_session_tag(kTag); + header.mutable_header()->add_window()->set_window_id(kWindow1.id()); + header.mutable_header()->mutable_window(0)->add_tab(kTab1.id()); + UpdateTrackerWithSpecifics(header, base::Time::Now(), GetTracker()); + + const sessions::SessionTab* tracked_tab = + GetTracker()->LookupSessionTab(kTag, kTab1); + ASSERT_THAT(tracked_tab, NotNull()); + EXPECT_EQ(kWindow1, tracked_tab->window_id); + + EXPECT_THAT(GetTracker()->LookupSession(kTag), + MatchesSyncedSession( + kTag, {{kWindow1.id(), std::vector<int>{kTab1.id()}}})); +} + +TEST_F(SyncedSessionTrackerTest, UpdateTrackerWithTwoTabsSameId) { + sync_pb::SessionSpecifics tab1; + tab1.set_session_tag(kTag); + tab1.set_tab_node_id(kTabNode1); + tab1.mutable_tab()->set_window_id(kWindow1.id()); + tab1.mutable_tab()->set_tab_id(kTab1.id()); + tab1.mutable_tab()->set_pinned(false); + UpdateTrackerWithSpecifics(tab1, base::Time::Now(), GetTracker()); + + sync_pb::SessionSpecifics tab2; + tab2.set_session_tag(kTag); + tab2.set_tab_node_id(kTabNode2); + tab2.mutable_tab()->set_window_id(kWindow1.id()); + tab2.mutable_tab()->set_tab_id(kTab1.id()); + tab2.mutable_tab()->set_pinned(true); + UpdateTrackerWithSpecifics(tab2, base::Time::Now(), GetTracker()); + + EXPECT_THAT(GetTracker()->LookupSession(kTag), + MatchesSyncedSession(kTag, /*window_id_to_tabs*/ {})); + EXPECT_THAT(GetTracker()->LookupTabNodeIds(kTag), + ElementsAre(kTabNode1, kTabNode2)); + + const sessions::SessionTab* tracked_tab = + GetTracker()->LookupSessionTab(kTag, kTab1); + ASSERT_THAT(tracked_tab, NotNull()); + EXPECT_EQ(kWindow1, tracked_tab->window_id); + EXPECT_EQ(true, tracked_tab->pinned); +} + } // namespace sync_sessions
diff --git a/components/sync_sessions/test_matchers.cc b/components/sync_sessions/test_matchers.cc index 4358e0f3..b5292cec 100644 --- a/components/sync_sessions/test_matchers.cc +++ b/components/sync_sessions/test_matchers.cc
@@ -12,10 +12,12 @@ namespace sync_sessions { namespace { +using testing::ContainerEq; using testing::ElementsAreArray; using testing::Matcher; using testing::MatcherInterface; using testing::MatchResultListener; +using testing::PrintToString; class MatchesHeaderMatcher : public MatcherInterface<const sync_pb::SessionSpecifics&> { @@ -28,11 +30,15 @@ bool MatchAndExplain(const sync_pb::SessionSpecifics& actual, MatchResultListener* listener) const override { if (!actual.has_header()) { - *listener << "which is not a header entity"; + *listener << " which is not a header entity"; + return false; + } + if (actual.tab_node_id() != -1) { + *listener << " which has a valid tab node ID: " << actual.tab_node_id(); return false; } if (!session_tag_.MatchAndExplain(actual.session_tag(), listener)) { - *listener << "which contains an unexpected session tag: " + *listener << " which contains an unexpected session tag: " << actual.session_tag(); return false; } @@ -44,11 +50,13 @@ window.tab().end()); } if (!window_ids_.MatchAndExplain(actual_window_ids, listener)) { - *listener << "which contains an unexpected windows"; + *listener << " which contains unexpected windows: " + << PrintToString(actual_window_ids); return false; } if (!tab_ids_.MatchAndExplain(actual_tab_ids, listener)) { - *listener << "which contains an unexpected tabs"; + *listener << " which contains unexpected tabs: " + << PrintToString(actual_tab_ids); return false; } return true; @@ -74,39 +82,46 @@ MatchesTabMatcher(Matcher<std::string> session_tag, Matcher<int> window_id, Matcher<int> tab_id, + Matcher<int> tab_node_id, Matcher<std::vector<std::string>> urls) : session_tag_(session_tag), window_id_(window_id), tab_id_(tab_id), + tab_node_id_(tab_node_id), urls_(urls) {} bool MatchAndExplain(const sync_pb::SessionSpecifics& actual, MatchResultListener* listener) const override { if (!actual.has_tab()) { - *listener << "which is not a tab entity"; + *listener << " which is not a tab entity"; return false; } if (!session_tag_.MatchAndExplain(actual.session_tag(), listener)) { - *listener << "which contains an unexpected session tag: " + *listener << " which contains an unexpected session tag: " << actual.session_tag(); return false; } if (!window_id_.MatchAndExplain(actual.tab().window_id(), listener)) { - *listener << "which contains an unexpected window ID: " + *listener << " which contains an unexpected window ID: " << actual.tab().window_id(); return false; } if (!tab_id_.MatchAndExplain(actual.tab().tab_id(), listener)) { - *listener << "which contains an unexpected tab ID: " + *listener << " which contains an unexpected tab ID: " << actual.tab().tab_id(); return false; } + if (!tab_node_id_.MatchAndExplain(actual.tab_node_id(), listener)) { + *listener << " which contains an unexpected tab node ID: " + << actual.tab_node_id(); + return false; + } std::vector<std::string> actual_urls; for (const sync_pb::TabNavigation& navigation : actual.tab().navigation()) { actual_urls.push_back(navigation.virtual_url()); } if (!urls_.MatchAndExplain(actual_urls, listener)) { - *listener << "which contains unexpected navigation URLs"; + *listener << " which contains unexpected navigation URLs"; return false; } return true; @@ -124,43 +139,47 @@ Matcher<std::string> session_tag_; Matcher<int> window_id_; Matcher<int> tab_id_; + Matcher<int> tab_node_id_; Matcher<std::vector<std::string>> urls_; }; class MatchesSyncedSessionMatcher : public MatcherInterface<const SyncedSession*> { public: - MatchesSyncedSessionMatcher(Matcher<std::string> session_tag, - Matcher<std::vector<int>> window_ids, - Matcher<std::vector<int>> tab_ids) - : session_tag_(session_tag), window_ids_(window_ids), tab_ids_(tab_ids) {} + MatchesSyncedSessionMatcher( + Matcher<std::string> session_tag, + Matcher<std::map<int, std::vector<int>>> window_id_to_tabs) + : session_tag_(session_tag), window_id_to_tabs_(window_id_to_tabs) {} bool MatchAndExplain(const SyncedSession* actual, MatchResultListener* listener) const override { if (!actual) { - *listener << "which is null"; + *listener << " which is null"; return false; } if (!session_tag_.MatchAndExplain(actual->session_tag, listener)) { - *listener << "which contains an unexpected session tag: " + *listener << " which contains an unexpected session tag: " << actual->session_tag; return false; } - std::vector<int> actual_window_ids; - std::vector<int> actual_tab_ids; + + std::map<int, std::vector<int>> actual_window_id_to_tabs; for (const auto& id_and_window : actual->windows) { - actual_window_ids.push_back( - id_and_window.second->wrapped_window.window_id.id()); - for (const auto& id : id_and_window.second->wrapped_window.tabs) { - actual_tab_ids.push_back(id->tab_id.id()); + const SessionID actual_window_id = id_and_window.first; + if (actual_window_id != id_and_window.second->wrapped_window.window_id) { + *listener << " which has an inconsistent window representation"; + return false; + } + actual_window_id_to_tabs.emplace(actual_window_id.id(), + std::vector<int>()); + for (const auto& tab : id_and_window.second->wrapped_window.tabs) { + actual_window_id_to_tabs[actual_window_id.id()].push_back( + tab->tab_id.id()); } } - if (!window_ids_.MatchAndExplain(actual_window_ids, listener)) { - *listener << "which contains an unexpected window set"; - return false; - } - if (!tab_ids_.MatchAndExplain(actual_tab_ids, listener)) { - *listener << "which contains an unexpected tab set"; + + if (!window_id_to_tabs_.MatchAndExplain(actual_window_id_to_tabs, + listener)) { return false; } return true; @@ -176,8 +195,7 @@ private: Matcher<std::string> session_tag_; - Matcher<std::vector<int>> window_ids_; - Matcher<std::vector<int>> tab_ids_; + Matcher<std::map<int, std::vector<int>>> window_id_to_tabs_; }; } // namespace @@ -190,8 +208,8 @@ new MatchesHeaderMatcher(session_tag, window_ids, tab_ids)); } -testing::Matcher<const sync_pb::SessionSpecifics&> MatchesHeader( - testing::Matcher<std::string> session_tag, +Matcher<const sync_pb::SessionSpecifics&> MatchesHeader( + Matcher<std::string> session_tag, const std::vector<int>& window_ids, const std::vector<int>& tab_ids) { return MatchesHeader(session_tag, ElementsAreArray(window_ids), @@ -202,33 +220,33 @@ Matcher<std::string> session_tag, Matcher<int> window_id, Matcher<int> tab_id, + Matcher<int> tab_node_id, Matcher<std::vector<std::string>> urls) { return testing::MakeMatcher( - new MatchesTabMatcher(session_tag, window_id, tab_id, urls)); + new MatchesTabMatcher(session_tag, window_id, tab_id, tab_node_id, urls)); } -testing::Matcher<const sync_pb::SessionSpecifics&> MatchesTab( - testing::Matcher<std::string> session_tag, - testing::Matcher<int> window_id, - testing::Matcher<int> tab_id, +Matcher<const sync_pb::SessionSpecifics&> MatchesTab( + Matcher<std::string> session_tag, + Matcher<int> window_id, + Matcher<int> tab_id, + Matcher<int> tab_node_id, const std::vector<std::string>& urls) { - return MatchesTab(session_tag, window_id, tab_id, ElementsAreArray(urls)); + return MatchesTab(session_tag, window_id, tab_id, tab_node_id, + ElementsAreArray(urls)); } Matcher<const SyncedSession*> MatchesSyncedSession( Matcher<std::string> session_tag, - Matcher<std::vector<int>> window_ids, - Matcher<std::vector<int>> tab_ids) { + Matcher<std::map<int, std::vector<int>>> window_id_to_tabs) { return testing::MakeMatcher( - new MatchesSyncedSessionMatcher(session_tag, window_ids, tab_ids)); + new MatchesSyncedSessionMatcher(session_tag, window_id_to_tabs)); } -testing::Matcher<const SyncedSession*> MatchesSyncedSession( - testing::Matcher<std::string> session_tag, - const std::vector<int>& window_ids, - const std::vector<int>& tab_ids) { - return MatchesSyncedSession(session_tag, ElementsAreArray(window_ids), - ElementsAreArray(tab_ids)); +Matcher<const SyncedSession*> MatchesSyncedSession( + Matcher<std::string> session_tag, + const std::map<int, std::vector<int>>& window_id_to_tabs) { + return MatchesSyncedSession(session_tag, ContainerEq(window_id_to_tabs)); } } // namespace sync_sessions
diff --git a/components/sync_sessions/test_matchers.h b/components/sync_sessions/test_matchers.h index e6c8014..8e5ac1b3 100644 --- a/components/sync_sessions/test_matchers.h +++ b/components/sync_sessions/test_matchers.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_SYNC_SESSIONS_TEST_MATCHERS_H_ #define COMPONENTS_SYNC_SESSIONS_TEST_MATCHERS_H_ +#include <map> #include <string> #include <vector> @@ -30,6 +31,7 @@ testing::Matcher<std::string> session_tag, testing::Matcher<int> window_id, testing::Matcher<int> tab_id, + testing::Matcher<int> tab_node_id, testing::Matcher<std::vector<std::string>> urls); // Convenience overload. @@ -37,18 +39,17 @@ testing::Matcher<std::string> session_tag, testing::Matcher<int> window_id, testing::Matcher<int> tab_id, + testing::Matcher<int> tab_node_id, const std::vector<std::string>& urls); testing::Matcher<const SyncedSession*> MatchesSyncedSession( testing::Matcher<std::string> session_tag, - testing::Matcher<std::vector<int>> window_ids, - testing::Matcher<std::vector<int>> tab_ids); + testing::Matcher<std::map<int, std::vector<int>>> window_id_to_tabs); // Convenience overload. testing::Matcher<const SyncedSession*> MatchesSyncedSession( testing::Matcher<std::string> session_tag, - const std::vector<int>& window_ids, - const std::vector<int>& tab_ids); + const std::map<int, std::vector<int>>& window_id_to_tabs); } // namespace sync_sessions
diff --git a/components/viz/client/client_layer_tree_frame_sink.cc b/components/viz/client/client_layer_tree_frame_sink.cc index 936b7ab..58c487fce 100644 --- a/components/viz/client/client_layer_tree_frame_sink.cc +++ b/components/viz/client/client_layer_tree_frame_sink.cc
@@ -133,10 +133,6 @@ if (!enable_surface_synchronization_) { local_surface_id_ = local_surface_id_provider_->GetLocalSurfaceIdForFrame(frame); - } else { - CHECK(local_surface_id_ != last_submitted_local_surface_id_ || - (last_submitted_device_scale_factor_ == frame.device_scale_factor() && - last_submitted_size_in_pixels_ == frame.size_in_pixels())); } TRACE_EVENT_FLOW_BEGIN0(TRACE_DISABLED_BY_DEFAULT("cc.debug.ipc"), @@ -149,10 +145,6 @@ if (hit_test_data_provider_) hit_test_region_list = hit_test_data_provider_->GetHitTestData(frame); - last_submitted_local_surface_id_ = local_surface_id_; - last_submitted_device_scale_factor_ = frame.device_scale_factor(); - last_submitted_size_in_pixels_ = frame.size_in_pixels(); - compositor_frame_sink_ptr_->SubmitCompositorFrame( local_surface_id_, std::move(frame), std::move(hit_test_region_list), tracing_enabled ? base::TimeTicks::Now().since_origin().InMicroseconds()
diff --git a/components/viz/client/client_layer_tree_frame_sink.h b/components/viz/client/client_layer_tree_frame_sink.h index 151af13e..06101ea8 100644 --- a/components/viz/client/client_layer_tree_frame_sink.h +++ b/components/viz/client/client_layer_tree_frame_sink.h
@@ -128,10 +128,6 @@ const bool enable_surface_synchronization_; const bool wants_animate_only_begin_frames_; - LocalSurfaceId last_submitted_local_surface_id_; - float last_submitted_device_scale_factor_ = 1.f; - gfx::Size last_submitted_size_in_pixels_; - base::WeakPtrFactory<ClientLayerTreeFrameSink> weak_factory_; DISALLOW_COPY_AND_ASSIGN(ClientLayerTreeFrameSink);
diff --git a/components/viz/service/display/display_unittest.cc b/components/viz/service/display/display_unittest.cc index 37ebe45c..6e4de4ff 100644 --- a/components/viz/service/display/display_unittest.cc +++ b/components/viz/service/display/display_unittest.cc
@@ -206,10 +206,9 @@ display_->Initialize(&client, manager_.surface_manager()); display_->SetColorSpace(color_space_1, color_space_1); - LocalSurfaceId local_surface_id(id_allocator_.GenerateId()); EXPECT_FALSE(scheduler_->damaged); EXPECT_FALSE(scheduler_->has_new_root_surface); - display_->SetLocalSurfaceId(local_surface_id, 1.f); + display_->SetLocalSurfaceId(id_allocator_.GenerateId(), 1.f); EXPECT_FALSE(scheduler_->damaged); EXPECT_FALSE(scheduler_->display_resized_); EXPECT_TRUE(scheduler_->has_new_root_surface); @@ -229,7 +228,7 @@ pass_list.push_back(std::move(pass)); scheduler_->ResetDamageForTest(); - SubmitCompositorFrame(&pass_list, local_surface_id); + SubmitCompositorFrame(&pass_list, id_allocator_.GetCurrentLocalSurfaceId()); EXPECT_TRUE(scheduler_->damaged); EXPECT_FALSE(scheduler_->display_resized_); EXPECT_FALSE(scheduler_->has_new_root_surface); @@ -254,7 +253,7 @@ pass_list.push_back(std::move(pass)); scheduler_->ResetDamageForTest(); - SubmitCompositorFrame(&pass_list, local_surface_id); + SubmitCompositorFrame(&pass_list, id_allocator_.GetCurrentLocalSurfaceId()); EXPECT_TRUE(scheduler_->damaged); EXPECT_FALSE(scheduler_->display_resized_); EXPECT_FALSE(scheduler_->has_new_root_surface); @@ -283,7 +282,7 @@ pass_list.push_back(std::move(pass)); scheduler_->ResetDamageForTest(); - SubmitCompositorFrame(&pass_list, local_surface_id); + SubmitCompositorFrame(&pass_list, id_allocator_.GetCurrentLocalSurfaceId()); EXPECT_TRUE(scheduler_->damaged); EXPECT_FALSE(scheduler_->display_resized_); EXPECT_FALSE(scheduler_->has_new_root_surface); @@ -297,8 +296,7 @@ // Pass is wrong size so shouldn't be swapped. However, damage should // result in latency info being stored for the next swap. { - local_surface_id = id_allocator_.GenerateId(); - display_->SetLocalSurfaceId(local_surface_id, 1.f); + display_->SetLocalSurfaceId(id_allocator_.GenerateId(), 1.f); scheduler_->ResetDamageForTest(); @@ -309,7 +307,8 @@ .AddLatencyInfo(ui::LatencyInfo()) .Build(); - support_->SubmitCompositorFrame(local_surface_id, std::move(frame)); + support_->SubmitCompositorFrame(id_allocator_.GetCurrentLocalSurfaceId(), + std::move(frame)); EXPECT_TRUE(scheduler_->damaged); EXPECT_FALSE(scheduler_->display_resized_); EXPECT_FALSE(scheduler_->has_new_root_surface); @@ -327,12 +326,11 @@ pass->damage_rect = gfx::Rect(10, 10, 0, 0); pass->id = 1u; - local_surface_id = id_allocator_.GenerateId(); - display_->SetLocalSurfaceId(local_surface_id, 1.f); + display_->SetLocalSurfaceId(id_allocator_.GenerateId(), 1.f); pass_list.push_back(std::move(pass)); scheduler_->ResetDamageForTest(); - SubmitCompositorFrame(&pass_list, local_surface_id); + SubmitCompositorFrame(&pass_list, id_allocator_.GetCurrentLocalSurfaceId()); EXPECT_TRUE(scheduler_->damaged); EXPECT_FALSE(scheduler_->display_resized_); EXPECT_FALSE(scheduler_->has_new_root_surface); @@ -362,7 +360,7 @@ pass_list.push_back(std::move(pass)); scheduler_->ResetDamageForTest(); - SubmitCompositorFrame(&pass_list, local_surface_id); + SubmitCompositorFrame(&pass_list, id_allocator_.GetCurrentLocalSurfaceId()); EXPECT_TRUE(scheduler_->damaged); EXPECT_FALSE(scheduler_->display_resized_); EXPECT_FALSE(scheduler_->has_new_root_surface); @@ -386,7 +384,8 @@ .AddLatencyInfo(ui::LatencyInfo()) .Build(); - support_->SubmitCompositorFrame(local_surface_id, std::move(frame)); + support_->SubmitCompositorFrame(id_allocator_.GetCurrentLocalSurfaceId(), + std::move(frame)); EXPECT_TRUE(scheduler_->damaged); EXPECT_FALSE(scheduler_->display_resized_); EXPECT_FALSE(scheduler_->has_new_root_surface); @@ -400,8 +399,7 @@ // Resize should cause a swap if no frame was swapped at the previous size. { - local_surface_id = id_allocator_.GenerateId(); - display_->SetLocalSurfaceId(local_surface_id, 1.f); + display_->SetLocalSurfaceId(id_allocator_.GenerateId(), 1.f); scheduler_->swapped = false; display_->Resize(gfx::Size(200, 200)); EXPECT_FALSE(scheduler_->swapped); @@ -414,7 +412,8 @@ .AddRenderPass(kOutputRect, kDamageRect) .Build(); - support_->SubmitCompositorFrame(local_surface_id, std::move(frame)); + support_->SubmitCompositorFrame(id_allocator_.GetCurrentLocalSurfaceId(), + std::move(frame)); EXPECT_TRUE(scheduler_->damaged); EXPECT_FALSE(scheduler_->display_resized_); EXPECT_FALSE(scheduler_->has_new_root_surface); @@ -431,8 +430,7 @@ // Surface that's damaged completely should be resized and swapped. { - local_surface_id = id_allocator_.GenerateId(); - display_->SetLocalSurfaceId(local_surface_id, 1.0f); + display_->SetLocalSurfaceId(id_allocator_.GenerateId(), 1.0f); pass = RenderPass::Create(); pass->output_rect = gfx::Rect(0, 0, 99, 99); pass->damage_rect = gfx::Rect(0, 0, 99, 99); @@ -440,7 +438,7 @@ pass_list.push_back(std::move(pass)); scheduler_->ResetDamageForTest(); - SubmitCompositorFrame(&pass_list, local_surface_id); + SubmitCompositorFrame(&pass_list, id_allocator_.GetCurrentLocalSurfaceId()); EXPECT_TRUE(scheduler_->damaged); EXPECT_FALSE(scheduler_->display_resized_); EXPECT_FALSE(scheduler_->has_new_root_surface);
diff --git a/content/app/content_main_runner.cc b/content/app/content_main_runner.cc index a6b08d7..9da04f9 100644 --- a/content/app/content_main_runner.cc +++ b/content/app/content_main_runner.cc
@@ -61,6 +61,8 @@ #include "services/service_manager/sandbox/sandbox_type.h" #include "ui/base/ui_base_paths.h" #include "ui/base/ui_base_switches.h" +#include "ui/display/display_switches.h" +#include "ui/gfx/switches.h" #if defined(OS_WIN) #include <malloc.h> @@ -112,6 +114,15 @@ #include "content/utility/in_process_utility_thread.h" #endif +#if BUILDFLAG(USE_ZYGOTE_HANDLE) +#include "content/browser/sandbox_host_linux.h" +#include "content/browser/zygote_host/zygote_communication_linux.h" +#include "content/browser/zygote_host/zygote_host_impl_linux.h" +#include "content/public/common/common_sandbox_support_linux.h" +#include "content/public/common/zygote_handle.h" +#include "media/base/media_switches.h" +#endif + namespace content { extern int GpuMain(const content::MainFunctionParams&); #if BUILDFLAG(ENABLE_PLUGINS) @@ -233,6 +244,67 @@ #endif // V8_USE_EXTERNAL_STARTUP_DATA } +#if BUILDFLAG(USE_ZYGOTE_HANDLE) +pid_t LaunchZygoteHelper(base::CommandLine* cmd_line, + base::ScopedFD* control_fd) { + // Append any switches from the browser process that need to be forwarded on + // to the zygote/renderers. + static const char* const kForwardSwitches[] = { + switches::kAndroidFontsPath, switches::kClearKeyCdmPathForTesting, + switches::kEnableHeapProfiling, + switches::kEnableLogging, // Support, e.g., --enable-logging=stderr. + // Need to tell the zygote that it is headless so that we don't try to use + // the wrong type of main delegate. + switches::kHeadless, + // Zygote process needs to know what resources to have loaded when it + // becomes a renderer process. + switches::kForceDeviceScaleFactor, switches::kLoggingLevel, + switches::kPpapiInProcess, switches::kRegisterPepperPlugins, switches::kV, + switches::kVModule, + }; + cmd_line->CopySwitchesFrom(*base::CommandLine::ForCurrentProcess(), + kForwardSwitches, arraysize(kForwardSwitches)); + + GetContentClient()->browser()->AppendExtraCommandLineSwitches(cmd_line, -1); + + // Start up the sandbox host process and get the file descriptor for the + // sandboxed processes to talk to it. + base::FileHandleMappingVector additional_remapped_fds; + additional_remapped_fds.emplace_back( + SandboxHostLinux::GetInstance()->GetChildSocket(), GetSandboxFD()); + + return ZygoteHostImpl::GetInstance()->LaunchZygote( + cmd_line, control_fd, std::move(additional_remapped_fds)); +} + +// Initializes the Zygote sandbox host. No thread should be created before this +// call, as InitializeZygoteSandboxForBrowserProcess() will end-up using fork(). +void InitializeZygoteSandboxForBrowserProcess( + const base::CommandLine& parsed_command_line) { + TRACE_EVENT0("startup", "SetupSandbox"); + // SandboxHostLinux needs to be initialized even if the sandbox and + // zygote are both disabled. It initializes the sandboxed process socket. + SandboxHostLinux::GetInstance()->Init(); + + if (parsed_command_line.HasSwitch(switches::kNoZygote) && + !parsed_command_line.HasSwitch(switches::kNoSandbox)) { + LOG(ERROR) << "--no-sandbox should be used together with --no--zygote"; + exit(EXIT_FAILURE); + } + + // Tickle the zygote host so it forks now. + ZygoteHostImpl::GetInstance()->Init(parsed_command_line); + ZygoteHandle generic_zygote = + CreateGenericZygote(base::BindOnce(LaunchZygoteHelper)); + + // TODO(kerrnel): Investigate doing this without the ZygoteHostImpl as a + // proxy. It is currently done this way due to concerns about race + // conditions. + ZygoteHostImpl::GetInstance()->SetRendererSandboxStatus( + generic_zygote->GetSandboxStatus()); +} +#endif // BUILDFLAG(USE_ZYGOTE_HANDLE) + } // namespace #if !defined(CHROME_MULTIPLE_DLL_CHILD) @@ -676,6 +748,16 @@ if (delegate_) delegate_->SandboxInitialized(process_type); +#if BUILDFLAG(USE_ZYGOTE_HANDLE) + if (process_type.empty()) { + // The sandbox host needs to be initialized before forking a thread to + // start the ServiceManager, and after setting up the sandbox and invoking + // SandboxInitialized(). + InitializeZygoteSandboxForBrowserProcess( + *base::CommandLine::ForCurrentProcess()); + } +#endif // BUILDFLAG(USE_ZYGOTE_HANDLE) + // Return -1 to indicate no early termination. return -1; }
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 6cbb26bc..61c8b57 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -692,6 +692,8 @@ "dom_storage/session_storage_database_adapter.h", "dom_storage/session_storage_namespace_impl.cc", "dom_storage/session_storage_namespace_impl.h", + "download/blob_download_url_loader_factory_getter.cc", + "download/blob_download_url_loader_factory_getter.h", "download/byte_stream_input_stream.cc", "download/byte_stream_input_stream.h", "download/download_item_utils.cc", @@ -714,6 +716,8 @@ "download/mhtml_extra_parts_impl.h", "download/mhtml_generation_manager.cc", "download/mhtml_generation_manager.h", + "download/network_download_url_loader_factory_getter.cc", + "download/network_download_url_loader_factory_getter.h", "download/save_file.cc", "download/save_file.h", "download/save_file_manager.cc", @@ -1557,6 +1561,10 @@ "shared_worker/shared_worker_host.h", "shared_worker/shared_worker_instance.cc", "shared_worker/shared_worker_instance.h", + "shared_worker/shared_worker_script_loader.cc", + "shared_worker/shared_worker_script_loader.h", + "shared_worker/shared_worker_script_loader_factory.cc", + "shared_worker/shared_worker_script_loader_factory.h", "shared_worker/shared_worker_service_impl.cc", "shared_worker/shared_worker_service_impl.h", "site_instance_impl.cc",
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc index 3a6d098..3e67b927 100644 --- a/content/browser/browser_main_loop.cc +++ b/content/browser/browser_main_loop.cc
@@ -20,7 +20,6 @@ #include "base/feature_list.h" #include "base/location.h" #include "base/logging.h" -#include "base/macros.h" #include "base/memory/memory_coordinator_proxy.h" #include "base/memory/memory_pressure_monitor.h" #include "base/message_loop/message_loop.h" @@ -145,12 +144,6 @@ #include "ui/aura/env.h" #endif -#if BUILDFLAG(USE_ZYGOTE_HANDLE) -#include "content/public/common/common_sandbox_support_linux.h" -#include "content/public/common/zygote_handle.h" -#include "media/base/media_switches.h" -#endif - #if defined(OS_ANDROID) #include "base/android/jni_android.h" #include "components/tracing/common/graphics_memory_dump_provider_android.h" @@ -214,13 +207,7 @@ #if defined(OS_POSIX) && !defined(OS_MACOSX) #include "content/browser/sandbox_host_linux.h" -#include "content/browser/zygote_host/zygote_host_impl_linux.h" - -#if !defined(OS_ANDROID) -#include "content/browser/zygote_host/zygote_communication_linux.h" -#endif // !defined(OS_ANDROID) -#endif // defined(OS_POSIX) && !defined(OS_MACOSX) - +#endif #if BUILDFLAG(ENABLE_PLUGINS) #include "content/browser/plugin_service_impl.h" @@ -261,64 +248,6 @@ namespace content { namespace { -#if BUILDFLAG(USE_ZYGOTE_HANDLE) -pid_t LaunchZygoteHelper(base::CommandLine* cmd_line, - base::ScopedFD* control_fd) { - // Append any switches from the browser process that need to be forwarded on - // to the zygote/renderers. - static const char* const kForwardSwitches[] = { - switches::kAndroidFontsPath, switches::kClearKeyCdmPathForTesting, - switches::kEnableHeapProfiling, - switches::kEnableLogging, // Support, e.g., --enable-logging=stderr. - // Need to tell the zygote that it is headless so that we don't try to use - // the wrong type of main delegate. - switches::kHeadless, - // Zygote process needs to know what resources to have loaded when it - // becomes a renderer process. - switches::kForceDeviceScaleFactor, switches::kLoggingLevel, - switches::kPpapiInProcess, switches::kRegisterPepperPlugins, switches::kV, - switches::kVModule, - }; - cmd_line->CopySwitchesFrom(*base::CommandLine::ForCurrentProcess(), - kForwardSwitches, arraysize(kForwardSwitches)); - - GetContentClient()->browser()->AppendExtraCommandLineSwitches(cmd_line, -1); - - // Start up the sandbox host process and get the file descriptor for the - // sandboxed processes to talk to it. - base::FileHandleMappingVector additional_remapped_fds; - additional_remapped_fds.emplace_back( - SandboxHostLinux::GetInstance()->GetChildSocket(), GetSandboxFD()); - - return ZygoteHostImpl::GetInstance()->LaunchZygote( - cmd_line, control_fd, std::move(additional_remapped_fds)); -} - -void SetupSandbox(const base::CommandLine& parsed_command_line) { - TRACE_EVENT0("startup", "SetupSandbox"); - // SandboxHostLinux needs to be initialized even if the sandbox and - // zygote are both disabled. It initializes the sandboxed process socket. - SandboxHostLinux::GetInstance()->Init(); - - if (parsed_command_line.HasSwitch(switches::kNoZygote) && - !parsed_command_line.HasSwitch(switches::kNoSandbox)) { - LOG(ERROR) << "--no-sandbox should be used together with --no--zygote"; - exit(EXIT_FAILURE); - } - - // Tickle the zygote host so it forks now. - ZygoteHostImpl::GetInstance()->Init(parsed_command_line); - ZygoteHandle generic_zygote = - CreateGenericZygote(base::BindOnce(LaunchZygoteHelper)); - - // TODO(kerrnel): Investigate doing this without the ZygoteHostImpl as a - // proxy. It is currently done this way due to concerns about race - // conditions. - ZygoteHostImpl::GetInstance()->SetRendererSandboxStatus( - generic_zygote->GetSandboxStatus()); -} -#endif // BUILDFLAG(USE_ZYGOTE_HANDLE) - #if defined(USE_GLIB) static void GLibLogHandler(const gchar* log_domain, GLogLevelFlags log_level, @@ -614,9 +543,11 @@ TRACE_EVENT0("startup", "BrowserMainLoop::EarlyInitialization"); #if BUILDFLAG(USE_ZYGOTE_HANDLE) - // No thread should be created before this call, as SetupSandbox() - // will end-up using fork(). - SetupSandbox(parsed_command_line_); + // The initialization of the sandbox host ends up with forking the Zygote + // process and requires no thread been forked. The initialization has happened + // by now since a thread to start the ServiceManager has been created + // before the browser main loop starts. + DCHECK(SandboxHostLinux::GetInstance()->IsInitialized()); #endif #if defined(USE_X11)
diff --git a/content/browser/devtools/protocol/emulation_handler.cc b/content/browser/devtools/protocol/emulation_handler.cc index ea940405..f61f934 100644 --- a/content/browser/devtools/protocol/emulation_handler.cc +++ b/content/browser/devtools/protocol/emulation_handler.cc
@@ -323,16 +323,16 @@ } void EmulationHandler::UpdateTouchEventEmulationState() { - RenderWidgetHostImpl* widget_host = - host_ ? host_->GetRenderWidgetHost() : nullptr; - if (!widget_host) + if (!host_ || !host_->GetRenderWidgetHost()) + return; + if (host_->GetParent() && !host_->IsCrossProcessSubframe()) return; if (touch_emulation_enabled_) { - widget_host->GetTouchEmulator()->Enable( + host_->GetRenderWidgetHost()->GetTouchEmulator()->Enable( TouchEmulator::Mode::kEmulatingTouchFromMouse, TouchEmulationConfigurationToType(touch_emulation_configuration_)); } else { - widget_host->GetTouchEmulator()->Disable(); + host_->GetRenderWidgetHost()->GetTouchEmulator()->Disable(); } if (GetWebContents()) { GetWebContents()->SetForceDisableOverscrollContent( @@ -341,9 +341,9 @@ } void EmulationHandler::UpdateDeviceEmulationState() { - RenderWidgetHostImpl* widget_host = - host_ ? host_->GetRenderWidgetHost() : nullptr; - if (!widget_host) + if (!host_ || !host_->GetRenderWidgetHost()) + return; + if (host_->GetParent() && !host_->IsCrossProcessSubframe()) return; // TODO(eseckler): Once we change this to mojo, we should wait for an ack to // these messages from the renderer. The renderer should send the ack once the @@ -353,11 +353,12 @@ // ViewMsg and acknowledgment, as well as plump the acknowledgment back to the // EmulationHandler somehow. Mojo callbacks should make this much simpler. if (device_emulation_enabled_) { - widget_host->Send(new ViewMsg_EnableDeviceEmulation( - widget_host->GetRoutingID(), device_emulation_params_)); + host_->GetRenderWidgetHost()->Send(new ViewMsg_EnableDeviceEmulation( + host_->GetRenderWidgetHost()->GetRoutingID(), + device_emulation_params_)); } else { - widget_host->Send(new ViewMsg_DisableDeviceEmulation( - widget_host->GetRoutingID())); + host_->GetRenderWidgetHost()->Send(new ViewMsg_DisableDeviceEmulation( + host_->GetRenderWidgetHost()->GetRoutingID())); } }
diff --git a/content/browser/download/blob_download_url_loader_factory_getter.cc b/content/browser/download/blob_download_url_loader_factory_getter.cc new file mode 100644 index 0000000..9302749 --- /dev/null +++ b/content/browser/download/blob_download_url_loader_factory_getter.cc
@@ -0,0 +1,38 @@ +// 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. + +#include "content/browser/download/blob_download_url_loader_factory_getter.h" + +#include "components/download/public/common/download_task_runner.h" +#include "content/browser/url_loader_factory_getter.h" +#include "content/common/wrapper_shared_url_loader_factory.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" +#include "storage/browser/blob/blob_data_handle.h" +#include "storage/browser/blob/blob_url_loader_factory.h" + +namespace content { + +BlobDownloadURLLoaderFactoryGetter::BlobDownloadURLLoaderFactoryGetter( + const GURL& url, + std::unique_ptr<storage::BlobDataHandle> blob_data_handle) + : url_(url), blob_data_handle_(std::move(blob_data_handle)) { + DCHECK(url.SchemeIs(url::kBlobScheme)); +} + +BlobDownloadURLLoaderFactoryGetter::~BlobDownloadURLLoaderFactoryGetter() = + default; + +scoped_refptr<network::SharedURLLoaderFactory> +BlobDownloadURLLoaderFactoryGetter::GetURLLoaderFactory() { + DCHECK(download::GetIOTaskRunner()); + DCHECK(download::GetIOTaskRunner()->BelongsToCurrentThread()); + network::mojom::URLLoaderFactoryPtrInfo url_loader_factory_ptr_info; + storage::BlobURLLoaderFactory::Create( + std::move(blob_data_handle_), url_, + mojo::MakeRequest(&url_loader_factory_ptr_info)); + return base::MakeRefCounted<WrapperSharedURLLoaderFactory>( + std::move(url_loader_factory_ptr_info)); +} + +} // namespace content
diff --git a/content/browser/download/blob_download_url_loader_factory_getter.h b/content/browser/download/blob_download_url_loader_factory_getter.h new file mode 100644 index 0000000..10938f4 --- /dev/null +++ b/content/browser/download/blob_download_url_loader_factory_getter.h
@@ -0,0 +1,40 @@ +// 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 CONTENT_BROWSER_DOWNLOAD_BLOB_DOWNLOAD_URL_LOADER_FACTORY_GETTER_H_ +#define CONTENT_BROWSER_DOWNLOAD_BLOB_DOWNLOAD_URL_LOADER_FACTORY_GETTER_H_ + +#include "components/download/public/common/download_url_loader_factory_getter.h" +#include "url/gurl.h" + +namespace storage { +class BlobDataHandle; +} + +namespace content { + +// Class for retrieving the URLLoaderFactory for a blob URL. +class BlobDownloadURLLoaderFactoryGetter + : public download::DownloadURLLoaderFactoryGetter { + public: + BlobDownloadURLLoaderFactoryGetter( + const GURL& url, + std::unique_ptr<storage::BlobDataHandle> blob_data_handle); + + // download::DownloadURLLoaderFactoryGetter implementation. + scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override; + + protected: + ~BlobDownloadURLLoaderFactoryGetter() override; + + private: + GURL url_; + std::unique_ptr<storage::BlobDataHandle> blob_data_handle_; + + DISALLOW_COPY_AND_ASSIGN(BlobDownloadURLLoaderFactoryGetter); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_DOWNLOAD_BLOB_DOWNLOAD_URL_LOADER_FACTORY_GETTER_H_
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc index 340e6e9..316ddd4 100644 --- a/content/browser/download/download_manager_impl.cc +++ b/content/browser/download/download_manager_impl.cc
@@ -34,15 +34,18 @@ #include "components/download/public/common/download_request_handle_interface.h" #include "components/download/public/common/download_stats.h" #include "components/download/public/common/download_task_runner.h" +#include "components/download/public/common/download_url_loader_factory_getter.h" #include "components/download/public/common/download_url_parameters.h" #include "components/download/public/common/download_utils.h" #include "components/download/public/common/resource_downloader.h" #include "components/download/public/common/url_download_handler_factory.h" #include "content/browser/byte_stream.h" #include "content/browser/child_process_security_policy_impl.h" +#include "content/browser/download/blob_download_url_loader_factory_getter.h" #include "content/browser/download/byte_stream_input_stream.h" #include "content/browser/download/download_resource_handler.h" #include "content/browser/download/download_utils.h" +#include "content/browser/download/network_download_url_loader_factory_getter.h" #include "content/browser/download/url_downloader.h" #include "content/browser/download/url_downloader_factory.h" #include "content/browser/loader/resource_dispatcher_host_impl.h" @@ -204,8 +207,8 @@ void BeginResourceDownload( std::unique_ptr<download::DownloadUrlParameters> params, std::unique_ptr<network::ResourceRequest> request, - std::unique_ptr<storage::BlobDataHandle> blob_data_handle, - scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter, + scoped_refptr<download::DownloadURLLoaderFactoryGetter> + url_loader_factory_getter, uint32_t download_id, base::WeakPtr<DownloadManagerImpl> download_manager, const GURL& site_url, @@ -226,26 +229,13 @@ download::DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST, download_manager); } else { - scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory; - if (params->url().SchemeIs(url::kBlobScheme)) { - network::mojom::URLLoaderFactoryPtrInfo url_loader_factory_ptr_info; - storage::BlobURLLoaderFactory::Create( - std::move(blob_data_handle), params->url(), - mojo::MakeRequest(&url_loader_factory_ptr_info)); - shared_url_loader_factory = - base::MakeRefCounted<WrapperSharedURLLoaderFactory>( - std::move(url_loader_factory_ptr_info)); - } else { - shared_url_loader_factory = - url_loader_factory_getter->GetNetworkFactory(); - } // TODO(qinmin): Check the storage permission before creating the URLLoader. // This is already done for context menu download, but it is missing for // download service and download resumption. downloader.reset( download::ResourceDownloader::BeginDownload( download_manager, std::move(params), std::move(request), - std::move(shared_url_loader_factory), site_url, tab_url, + url_loader_factory_getter->GetURLLoaderFactory(), site_url, tab_url, tab_referrer_url, download_id, false, task_runner) .release()); } @@ -1326,12 +1316,22 @@ } } + scoped_refptr<download::DownloadURLLoaderFactoryGetter> + url_loader_factory_getter; + if (params->url().SchemeIs(url::kBlobScheme)) { + url_loader_factory_getter = + base::MakeRefCounted<BlobDownloadURLLoaderFactoryGetter>( + params->url(), std::move(blob_data_handle)); + } else { + url_loader_factory_getter = + base::MakeRefCounted<NetworkDownloadURLLoaderFactoryGetter>( + storage_partition->url_loader_factory_getter()); + } BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::BindOnce(&BeginResourceDownload, std::move(params), - std::move(request), std::move(blob_data_handle), - storage_partition->url_loader_factory_getter(), id, - weak_factory_.GetWeakPtr(), site_url, tab_url, + std::move(request), std::move(url_loader_factory_getter), + id, weak_factory_.GetWeakPtr(), site_url, tab_url, tab_referrer_url, base::MessageLoop::current()->task_runner())); } else {
diff --git a/content/browser/download/network_download_url_loader_factory_getter.cc b/content/browser/download/network_download_url_loader_factory_getter.cc new file mode 100644 index 0000000..df96621f --- /dev/null +++ b/content/browser/download/network_download_url_loader_factory_getter.cc
@@ -0,0 +1,27 @@ +// 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. + +#include "content/browser/download/network_download_url_loader_factory_getter.h" + +#include "components/download/public/common/download_task_runner.h" +#include "content/browser/url_loader_factory_getter.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" + +namespace content { + +NetworkDownloadURLLoaderFactoryGetter::NetworkDownloadURLLoaderFactoryGetter( + scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter) + : url_loader_factory_getter_(url_loader_factory_getter) {} + +NetworkDownloadURLLoaderFactoryGetter:: + ~NetworkDownloadURLLoaderFactoryGetter() = default; + +scoped_refptr<network::SharedURLLoaderFactory> +NetworkDownloadURLLoaderFactoryGetter::GetURLLoaderFactory() { + DCHECK(download::GetIOTaskRunner()); + DCHECK(download::GetIOTaskRunner()->BelongsToCurrentThread()); + return url_loader_factory_getter_->GetNetworkFactory(); +} + +} // namespace content
diff --git a/content/browser/download/network_download_url_loader_factory_getter.h b/content/browser/download/network_download_url_loader_factory_getter.h new file mode 100644 index 0000000..cf6eaa1 --- /dev/null +++ b/content/browser/download/network_download_url_loader_factory_getter.h
@@ -0,0 +1,35 @@ +// 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 CONTENT_BROWSER_DOWNLOAD_NETWORK_DOWNLOAD_URL_LOADER_FACTORY_GETTER_H_ +#define CONTENT_BROWSER_DOWNLOAD_NETWORK_DOWNLOAD_URL_LOADER_FACTORY_GETTER_H_ + +#include "components/download/public/common/download_url_loader_factory_getter.h" + +namespace content { + +class URLLoaderFactoryGetter; + +// Wrapper of URLLoaderFactoryGetter to retrieve URLLoaderFactory. +class NetworkDownloadURLLoaderFactoryGetter + : public download::DownloadURLLoaderFactoryGetter { + public: + explicit NetworkDownloadURLLoaderFactoryGetter( + scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter); + + // download::DownloadURLLoaderFactoryGetter implementation. + scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override; + + protected: + ~NetworkDownloadURLLoaderFactoryGetter() override; + + private: + scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_; + + DISALLOW_COPY_AND_ASSIGN(NetworkDownloadURLLoaderFactoryGetter); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_DOWNLOAD_NETWORK_DOWNLOAD_URL_LOADER_FACTORY_GETTER_H_
diff --git a/content/browser/renderer_host/p2p/socket_dispatcher_host.cc b/content/browser/renderer_host/p2p/socket_dispatcher_host.cc index ab3baf5..c8bfe794 100644 --- a/content/browser/renderer_host/p2p/socket_dispatcher_host.cc +++ b/content/browser/renderer_host/p2p/socket_dispatcher_host.cc
@@ -43,6 +43,11 @@ 0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0, 0, 0, 0, 0, 0, 0, 0, 0x88, 0x88}; const int kPublicPort = 53; // DNS port. +// Experimentation shows that creating too many sockets creates odd problems +// because of resource exhaustion in the Unix sockets domain. +// Trouble has been seen on Linux at 3479 sockets in test, so leave a margin. +const int kMaxSimultaneousSockets = 3000; + } // namespace const size_t kMaximumPacketSize = 32768; @@ -267,6 +272,11 @@ std::make_unique<network::ProxyResolvingClientSocketFactory>( nullptr, url_context_->GetURLRequestContext()); } + if (sockets_.size() > kMaxSimultaneousSockets) { + LOG(ERROR) << "Too many sockets created"; + Send(new P2PMsg_OnError(socket_id)); + return; + } std::unique_ptr<P2PSocketHost> socket(P2PSocketHost::Create( this, socket_id, type, url_context_.get(), proxy_resolving_socket_factory_.get(), &throttler_));
diff --git a/content/browser/sandbox_host_linux.h b/content/browser/sandbox_host_linux.h index 10248ba..cbaaaa6b 100644 --- a/content/browser/sandbox_host_linux.h +++ b/content/browser/sandbox_host_linux.h
@@ -38,6 +38,8 @@ } void Init(); + bool IsInitialized() const { return initialized_; } + private: friend struct base::DefaultSingletonTraits<SandboxHostLinux>; // This object must be constructed on the main thread.
diff --git a/content/browser/sandbox_ipc_linux.cc b/content/browser/sandbox_ipc_linux.cc index 930fa23..3206764 100644 --- a/content/browser/sandbox_ipc_linux.cc +++ b/content/browser/sandbox_ipc_linux.cc
@@ -144,7 +144,13 @@ base::UnixDomainSocket::RecvMsg(fd, buf, sizeof(buf), &fds); if (len == -1) { // TODO: should send an error reply, or the sender might block forever. - NOTREACHED() << "Sandbox host message is larger than kMaxFontFamilyLength"; + if (errno == EMSGSIZE) { + NOTREACHED() + << "Sandbox host message is larger than kMaxFontFamilyLength"; + } else { + PLOG(ERROR) << "Recvmsg failed"; + NOTREACHED(); + } return; } if (fds.empty())
diff --git a/content/browser/service_worker/embedded_worker_instance_unittest.cc b/content/browser/service_worker/embedded_worker_instance_unittest.cc index 62d7e479..b77c071 100644 --- a/content/browser/service_worker/embedded_worker_instance_unittest.cc +++ b/content/browser/service_worker/embedded_worker_instance_unittest.cc
@@ -95,6 +95,7 @@ mojom::ServiceWorkerContainerHostRequest request) override { NOTIMPLEMENTED(); } + void Ping(PingCallback callback) override { NOTIMPLEMENTED(); } mojom::ServiceWorkerContainerAssociatedPtr client_; mojo::AssociatedBinding<mojom::ServiceWorkerContainerHost> binding_;
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc index 25c621e..d5b665ca 100644 --- a/content/browser/service_worker/service_worker_context_core.cc +++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -89,7 +89,10 @@ bool IsSameOriginClientProviderHost(const GURL& origin, ServiceWorkerProviderHost* host) { return host->IsProviderForClient() && - host->document_url().GetOrigin() == origin; + host->document_url().GetOrigin() == origin && + // Don't expose "reserved" clients (clients that are not yet execution + // ready) to the Clients API. + host->is_execution_ready(); } bool IsSameOriginWindowProviderHost(const GURL& origin, @@ -389,13 +392,6 @@ } std::unique_ptr<ServiceWorkerContextCore::ProviderHostIterator> -ServiceWorkerContextCore::GetProviderHostIterator() { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - return base::WrapUnique(new ProviderHostIterator( - providers_.get(), ProviderHostIterator::ProviderHostPredicate())); -} - -std::unique_ptr<ServiceWorkerContextCore::ProviderHostIterator> ServiceWorkerContextCore::GetClientProviderHostIterator(const GURL& origin) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); return base::WrapUnique(new ProviderHostIterator(
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h index f5c382a..18389af 100644 --- a/content/browser/service_worker/service_worker_context_core.h +++ b/content/browser/service_worker/service_worker_context_core.h
@@ -174,11 +174,11 @@ ServiceWorkerProviderHost* GetProviderHost(int process_id, int provider_id); void RemoveProviderHost(int process_id, int provider_id); void RemoveAllProviderHostsForProcess(int process_id); - std::unique_ptr<ProviderHostIterator> GetProviderHostIterator(); - // Returns a ProviderHost iterator for all ServiceWorker clients for - // the |origin|. This only returns ProviderHosts that are of CONTROLLEE - // and belong to the |origin|. + // Returns a ProviderHost iterator for all service worker clients for the + // |origin|. This only returns clients that are execution ready (i.e., for + // windows, the navigation has been committed and for workers, the final + // response after redirects has been delivered). std::unique_ptr<ProviderHostIterator> GetClientProviderHostIterator( const GURL& origin);
diff --git a/content/browser/service_worker/service_worker_context_unittest.cc b/content/browser/service_worker/service_worker_context_unittest.cc index fc71f81c..06decdcd 100644 --- a/content/browser/service_worker/service_worker_context_unittest.cc +++ b/content/browser/service_worker/service_worker_context_unittest.cc
@@ -642,26 +642,13 @@ ServiceWorkerProviderHost* host1_raw = host1.get(); ServiceWorkerProviderHost* host2_raw = host2.get(); ServiceWorkerProviderHost* host3_raw = host3.get(); - ServiceWorkerProviderHost* host4_raw = host4.get(); context()->AddProviderHost(std::move(host1)); context()->AddProviderHost(std::move(host2)); context()->AddProviderHost(std::move(host3)); context()->AddProviderHost(std::move(host4)); - // Iterate over all provider hosts. - std::set<ServiceWorkerProviderHost*> results; - for (auto it = context()->GetProviderHostIterator(); !it->IsAtEnd(); - it->Advance()) { - results.insert(it->GetProviderHost()); - } - EXPECT_EQ(4u, results.size()); - EXPECT_TRUE(ContainsKey(results, host1_raw)); - EXPECT_TRUE(ContainsKey(results, host2_raw)); - EXPECT_TRUE(ContainsKey(results, host3_raw)); - EXPECT_TRUE(ContainsKey(results, host4_raw)); - // Iterate over the client provider hosts that belong to kOrigin1. - results.clear(); + std::set<ServiceWorkerProviderHost*> results; for (auto it = context()->GetClientProviderHostIterator(kOrigin1); !it->IsAtEnd(); it->Advance()) { results.insert(it->GetProviderHost());
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc index b5bcaef..241193f 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.cc +++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -817,6 +817,16 @@ core_observer_list_->RemoveObserver(observer); } +base::WeakPtr<ServiceWorkerProviderHost> +ServiceWorkerContextWrapper::PreCreateHostForSharedWorker( + int process_id, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr* out_provider_info) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + + return ServiceWorkerProviderHost::PreCreateForSharedWorker( + context()->AsWeakPtr(), process_id, out_provider_info); +} + ServiceWorkerContextWrapper::~ServiceWorkerContextWrapper() { // Explicitly remove this object as an observer to avoid use-after-frees in // tests where this object is not guaranteed to outlive the
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h index 86a637e..96ec90d 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.h +++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -254,6 +254,17 @@ bool is_incognito() const { return is_incognito_; } + // S13nServiceWorker: + // Used for starting a shared worker. Returns a provider host for the shared + // worker and fills |out_provider_info| with info to send to the renderer to + // connect to the host. The host stays alive as long as this info stays alive + // (namely, as long as |out_provider_info->host_ptr_info| stays alive). + // + // Must be called on the IO thread. + base::WeakPtr<ServiceWorkerProviderHost> PreCreateHostForSharedWorker( + int process_id, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr* out_provider_info); + private: friend class BackgroundSyncManagerTest; friend class base::RefCountedThreadSafe<ServiceWorkerContextWrapper>;
diff --git a/content/browser/service_worker/service_worker_navigation_loader.cc b/content/browser/service_worker/service_worker_navigation_loader.cc index c9d8008..241e860 100644 --- a/content/browser/service_worker/service_worker_navigation_loader.cc +++ b/content/browser/service_worker/service_worker_navigation_loader.cc
@@ -83,12 +83,7 @@ weak_factory_(this) { DCHECK(ServiceWorkerUtils::IsMainResourceType( static_cast<ResourceType>(resource_request.resource_type))); - DCHECK_EQ(network::mojom::FetchRequestMode::kNavigate, - resource_request_.fetch_request_mode); - DCHECK_EQ(network::mojom::FetchCredentialsMode::kInclude, - resource_request_.fetch_credentials_mode); - DCHECK_EQ(network::mojom::FetchRedirectMode::kManual, - resource_request_.fetch_redirect_mode); + response_head_.load_timing.request_start = base::TimeTicks::Now(); response_head_.load_timing.request_start_time = base::Time::Now(); }
diff --git a/content/browser/service_worker/service_worker_navigation_loader.h b/content/browser/service_worker/service_worker_navigation_loader.h index 6c2e2a22..4f12d5b 100644 --- a/content/browser/service_worker/service_worker_navigation_loader.h +++ b/content/browser/service_worker/service_worker_navigation_loader.h
@@ -30,17 +30,18 @@ class ServiceWorkerVersion; // S13nServiceWorker: -// ServiceWorkerNavigationLoader is the URLLoader used for navigation requests -// that (potentially) go through a service worker. This loader is only used for -// the main resource request; once the navigation is committed, the page loads +// ServiceWorkerNavigationLoader is the URLLoader used for main resource +// requests (i.e., navigation and shared worker requests) that (potentially) go +// through a service worker. This loader is only used for the main resource +// request; once the response is delivered, the resulting client loads // subresources via ServiceWorkerSubresourceLoader. // // This class works similarly to ServiceWorkerURLRequestJob but with // network::mojom::URLLoader instead of URLRequest. // // This class is owned by the job wrapper until it is bound to a URLLoader -// request. After it is bound |this| is kept alive until the Mojo connection -// to this URLLoader is dropped. +// request. After it is bound |this| is kept alive until the Mojo connection to +// this URLLoader is dropped. class CONTENT_EXPORT ServiceWorkerNavigationLoader : public network::mojom::URLLoader { public: @@ -48,9 +49,9 @@ using ResponseType = ServiceWorkerResponseType; // Created by ServiceWorkerControlleeRequestHandler::MaybeCreateLoader - // when starting to load a page for navigation. + // when starting to load a main resource. // - // This job typically works in the following order: + // For the navigation case, this job typically works in the following order: // 1. One of the FallbackTo* or ForwardTo* methods are called via // URLJobWrapper by ServiceWorkerControlleeRequestHandler, which // determines how the request should be served (e.g. should fallback @@ -71,6 +72,9 @@ // NavigationURLLoaderNetworkService (for resource loading for navigation). // This forwards the blob/stream data pipe to the NavigationURLLoader if // the response body was sent as a blob/stream. + // + // Loads for shared workers work similarly, except SharedWorkerScriptLoader + // is used instead of NavigationURLLoaderNetworkService. ServiceWorkerNavigationLoader( NavigationLoaderInterceptor::LoaderCallback loader_callback, Delegate* delegate,
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc index d69b6c23..bdbd4e1 100644 --- a/content/browser/service_worker/service_worker_provider_host.cc +++ b/content/browser/service_worker/service_worker_provider_host.cc
@@ -202,13 +202,43 @@ } // static +base::WeakPtr<ServiceWorkerProviderHost> +ServiceWorkerProviderHost::PreCreateForSharedWorker( + base::WeakPtr<ServiceWorkerContextCore> context, + int process_id, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr* out_provider_info) { + auto host = base::WrapUnique(new ServiceWorkerProviderHost( + ChildProcessHost::kInvalidUniqueID, + ServiceWorkerProviderHostInfo( + NextBrowserProvidedProviderId(), MSG_ROUTING_NONE, + blink::mojom::ServiceWorkerProviderType::kForSharedWorker, + true /* is_parent_frame_secure */), + context, nullptr)); + host->dispatcher_host_ = context->GetDispatcherHost(process_id)->AsWeakPtr(); + host->render_process_id_ = process_id; + + (*out_provider_info)->provider_id = host->provider_id(); + (*out_provider_info)->client_request = mojo::MakeRequest(&host->container_); + host->binding_.Bind( + mojo::MakeRequest(&((*out_provider_info)->host_ptr_info))); + host->binding_.set_connection_error_handler(base::BindOnce( + &RemoveProviderHost, context, process_id, host->provider_id())); + + auto weak_ptr = host->AsWeakPtr(); + context->AddProviderHost(std::move(host)); + return weak_ptr; +} + +// static std::unique_ptr<ServiceWorkerProviderHost> ServiceWorkerProviderHost::Create( int process_id, ServiceWorkerProviderHostInfo info, base::WeakPtr<ServiceWorkerContextCore> context, base::WeakPtr<ServiceWorkerDispatcherHost> dispatcher_host) { - return base::WrapUnique(new ServiceWorkerProviderHost( + auto host = base::WrapUnique(new ServiceWorkerProviderHost( process_id, std::move(info), context, dispatcher_host)); + host->is_execution_ready_ = true; + return host; } ServiceWorkerProviderHost::ServiceWorkerProviderHost( @@ -612,6 +642,8 @@ DCHECK_EQ(info_.provider_id, info.provider_id); DCHECK_NE(MSG_ROUTING_NONE, info.route_id); + is_execution_ready_ = true; + // Connect with the mojom::ServiceWorkerContainer on the renderer. DCHECK(!container_.is_bound()); DCHECK(!binding_.is_bound()); @@ -696,6 +728,12 @@ return provider_info; } +void ServiceWorkerProviderHost::CompleteSharedWorkerPreparation() { + DCHECK_EQ(blink::mojom::ServiceWorkerProviderType::kForSharedWorker, + provider_type()); + is_execution_ready_ = true; +} + void ServiceWorkerProviderHost::SendServiceWorkerStateChangedMessage( int worker_handle_id, blink::mojom::ServiceWorkerState state) { @@ -1073,6 +1111,10 @@ std::move(container_host_request)); } +void ServiceWorkerProviderHost::Ping(PingCallback callback) { + std::move(callback).Run(); +} + bool ServiceWorkerProviderHost::IsValidRegisterMessage( const GURL& script_url, const blink::mojom::ServiceWorkerRegistrationOptions& options,
diff --git a/content/browser/service_worker/service_worker_provider_host.h b/content/browser/service_worker/service_worker_provider_host.h index ba2545e..a82b1ff 100644 --- a/content/browser/service_worker/service_worker_provider_host.h +++ b/content/browser/service_worker/service_worker_provider_host.h
@@ -148,6 +148,16 @@ static std::unique_ptr<ServiceWorkerProviderHost> PreCreateForController( base::WeakPtr<ServiceWorkerContextCore> context); + // S13nServiceWorker: + // Used for starting a shared worker. Returns a provider host for the shared + // worker and fills |out_provider_info| with info to send to the renderer to + // connect to the host. The host stays alive as long as this info stays alive + // (namely, as long as |out_provider_info->host_ptr_info| stays alive). + static base::WeakPtr<ServiceWorkerProviderHost> PreCreateForSharedWorker( + base::WeakPtr<ServiceWorkerContextCore> context, + int process_id, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr* out_provider_info); + // Used to create a ServiceWorkerProviderHost when the renderer-side provider // is created. This ProviderHost will be created for the process specified by // |process_id|. @@ -371,6 +381,10 @@ int process_id, scoped_refptr<ServiceWorkerVersion> hosted_version); + // Called when the shared worker main script resource has finished loading. + // After this is called, is_execution_ready() returns true. + void CompleteSharedWorkerPreparation(); + // Sends event messages to the renderer. Events for the worker are queued up // until the worker thread id is known via SetReadyToSendMessagesToWorker(). void SendServiceWorkerStateChangedMessage( @@ -405,6 +419,8 @@ // cache. void NotifyControllerLost(); + bool is_execution_ready() const { return is_execution_ready_; } + private: friend class LinkHeaderServiceWorkerTest; friend class ServiceWorkerProviderHostTest; @@ -488,6 +504,7 @@ mojom::ControllerServiceWorkerPurpose purpose) override; void CloneForWorker( mojom::ServiceWorkerContainerHostRequest container_host_request) override; + void Ping(PingCallback callback) override; // Callback for ServiceWorkerContextCore::RegisterServiceWorker(). void RegistrationComplete(RegisterCallback callback, @@ -652,6 +669,11 @@ mojo::Binding<service_manager::mojom::InterfaceProvider> interface_provider_binding_; + // For service worker clients. True if the main resource for this host has + // finished loading. When false, the document URL may still change due to + // redirects. + bool is_execution_ready_ = false; + DISALLOW_COPY_AND_ASSIGN(ServiceWorkerProviderHost); };
diff --git a/content/browser/service_worker/service_worker_provider_host_unittest.cc b/content/browser/service_worker/service_worker_provider_host_unittest.cc index 787912d..2172214 100644 --- a/content/browser/service_worker/service_worker_provider_host_unittest.cc +++ b/content/browser/service_worker/service_worker_provider_host_unittest.cc
@@ -225,6 +225,17 @@ void OnMojoError(const std::string& error) { bad_messages_.push_back(error); } + bool CanFindClientProviderHost(ServiceWorkerProviderHost* host) { + for (std::unique_ptr<ServiceWorkerContextCore::ProviderHostIterator> it = + context_->GetClientProviderHostIterator( + host->document_url().GetOrigin()); + !it->IsAtEnd(); it->Advance()) { + if (host == it->GetProviderHost()) + return true; + } + return false; + } + std::vector<std::string> bad_messages_; TestBrowserThreadBundle thread_bundle_; std::unique_ptr<EmbeddedWorkerTestHelper> helper_; @@ -798,4 +809,46 @@ EXPECT_EQ(1u, bad_messages_.size()); } +// Test that a "reserved" (i.e., not execution ready) shared worker client is +// not included when iterating over client provider hosts. If it were, it'd be +// undesirably exposed via the Clients API. +TEST_F(ServiceWorkerProviderHostTest, + ReservedClientsAreNotExposedToClientsAPI) { + { + auto provider_info = mojom::ServiceWorkerProviderInfoForSharedWorker::New(); + base::WeakPtr<ServiceWorkerProviderHost> host = + ServiceWorkerProviderHost::PreCreateForSharedWorker( + context_->AsWeakPtr(), helper_->mock_render_process_id(), + &provider_info); + const GURL url("https://www.example.com/shared_worker.js"); + host->SetTopmostFrameUrl(url); + EXPECT_FALSE(CanFindClientProviderHost(host.get())); + host->CompleteSharedWorkerPreparation(); + EXPECT_TRUE(CanFindClientProviderHost(host.get())); + } + + { + std::unique_ptr<ServiceWorkerProviderHost> host = + ServiceWorkerProviderHost::PreCreateNavigationHost( + helper_->context()->AsWeakPtr(), true, + base::RepeatingCallback<WebContents*(void)>()); + ServiceWorkerProviderHostInfo info( + host->provider_id(), 1 /* route_id */, + blink::mojom::ServiceWorkerProviderType::kForWindow, + true /* is_parent_frame_secure */); + ServiceWorkerRemoteProviderEndpoint remote_endpoint; + remote_endpoint.BindWithProviderHostInfo(&info); + host->SetDocumentUrl(GURL("https://www.example.com/page")); + EXPECT_FALSE(CanFindClientProviderHost(host.get())); + + host->CompleteNavigationInitialized( + helper_->mock_render_process_id(), std::move(info), + helper_->GetDispatcherHostForProcess(helper_->mock_render_process_id()) + ->AsWeakPtr()); + auto* host_rawptr = host.get(); + context_->AddProviderHost(std::move(host)); + EXPECT_TRUE(CanFindClientProviderHost(host_rawptr)); + } +} + } // namespace content
diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc index eefd93c..d1d5416 100644 --- a/content/browser/service_worker/service_worker_register_job.cc +++ b/content/browser/service_worker/service_worker_register_job.cc
@@ -587,14 +587,14 @@ ServiceWorkerRegistration* registration) { DCHECK(registration); for (std::unique_ptr<ServiceWorkerContextCore::ProviderHostIterator> it = - context_->GetProviderHostIterator(); + context_->GetClientProviderHostIterator( + registration->pattern().GetOrigin()); !it->IsAtEnd(); it->Advance()) { ServiceWorkerProviderHost* host = it->GetProviderHost(); - if (!host->IsProviderForClient()) - continue; if (!ServiceWorkerUtils::ScopeMatches(registration->pattern(), - host->document_url())) + host->document_url())) { continue; + } host->AddMatchingRegistration(registration); } }
diff --git a/content/browser/service_worker/service_worker_registration.cc b/content/browser/service_worker/service_worker_registration.cc index 6624761..3791d4e 100644 --- a/content/browser/service_worker/service_worker_registration.cc +++ b/content/browser/service_worker/service_worker_registration.cc
@@ -219,11 +219,9 @@ DCHECK(active_version()); for (std::unique_ptr<ServiceWorkerContextCore::ProviderHostIterator> it = - context_->GetProviderHostIterator(); + context_->GetClientProviderHostIterator(pattern_.GetOrigin()); !it->IsAtEnd(); it->Advance()) { ServiceWorkerProviderHost* host = it->GetProviderHost(); - if (!host->IsProviderForClient()) - continue; if (host->controller() == active_version()) continue; if (!host->IsContextSecureForServiceWorker())
diff --git a/content/browser/service_worker/service_worker_request_handler.cc b/content/browser/service_worker/service_worker_request_handler.cc index bb16c71..2ca37e9 100644 --- a/content/browser/service_worker/service_worker_request_handler.cc +++ b/content/browser/service_worker/service_worker_request_handler.cc
@@ -194,6 +194,34 @@ } // static +std::unique_ptr<NavigationLoaderInterceptor> +ServiceWorkerRequestHandler::InitializeForSharedWorker( + const network::ResourceRequest& resource_request, + base::WeakPtr<ServiceWorkerProviderHost> host) { + DCHECK(ServiceWorkerUtils::IsServicificationEnabled()); + + // Create the handler even for insecure HTTP since it's used in the + // case of redirect to HTTPS. + if (!resource_request.url.SchemeIsHTTPOrHTTPS() && + !OriginCanAccessServiceWorkers(resource_request.url)) { + return nullptr; + } + + std::unique_ptr<ServiceWorkerRequestHandler> handler( + host->CreateRequestHandler( + resource_request.fetch_request_mode, + resource_request.fetch_credentials_mode, + resource_request.fetch_redirect_mode, + resource_request.fetch_integrity, resource_request.keepalive, + RESOURCE_TYPE_SHARED_WORKER, REQUEST_CONTEXT_TYPE_SHARED_WORKER, + resource_request.fetch_frame_type, + nullptr /* blob_storage_context: unused in S13n */, + resource_request.request_body, resource_request.skip_service_worker)); + + return base::WrapUnique<NavigationLoaderInterceptor>(handler.release()); +} + +// static void ServiceWorkerRequestHandler::InitializeHandler( net::URLRequest* request, ServiceWorkerContextWrapper* context_wrapper,
diff --git a/content/browser/service_worker/service_worker_request_handler.h b/content/browser/service_worker/service_worker_request_handler.h index b483853..da73b702 100644 --- a/content/browser/service_worker/service_worker_request_handler.h +++ b/content/browser/service_worker/service_worker_request_handler.h
@@ -83,6 +83,10 @@ scoped_refptr<network::ResourceRequestBody> body, const base::Callback<WebContents*(void)>& web_contents_getter); + static std::unique_ptr<NavigationLoaderInterceptor> InitializeForSharedWorker( + const network::ResourceRequest& resource_request, + base::WeakPtr<ServiceWorkerProviderHost> host); + // Attaches a newly created handler if the given |request| needs to // be handled by ServiceWorker. // TODO(kinuko): While utilizing UserData to attach data to URLRequest
diff --git a/content/browser/shared_worker/shared_worker_host.cc b/content/browser/shared_worker/shared_worker_host.cc index 1835a3cf0..623c661 100644 --- a/content/browser/shared_worker/shared_worker_host.cc +++ b/content/browser/shared_worker/shared_worker_host.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/metrics/histogram_macros.h" +#include "base/unguessable_token.h" #include "content/browser/devtools/shared_worker_devtools_manager.h" #include "content/browser/interface_provider_filtering.h" #include "content/browser/renderer_interface_binders.h" @@ -77,29 +78,44 @@ void SharedWorkerHost::Start( mojom::SharedWorkerFactoryPtr factory, - bool pause_on_start, - const base::UnguessableToken& devtools_worker_token) { - blink::mojom::WorkerContentSettingsProxyPtr content_settings; - content_settings_ = std::make_unique<SharedWorkerContentSettingsProxyImpl>( - instance_->url(), this, mojo::MakeRequest(&content_settings)); - - mojom::SharedWorkerHostPtr host; - binding_.Bind(mojo::MakeRequest(&host)); - - service_manager::mojom::InterfaceProviderPtr interface_provider; - interface_provider_binding_.Bind(FilterRendererExposedInterfaces( - mojom::kNavigation_SharedWorkerSpec, process_id_, - mojo::MakeRequest(&interface_provider))); + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr + service_worker_provider_info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); mojom::SharedWorkerInfoPtr info(mojom::SharedWorkerInfo::New( instance_->url(), instance_->name(), instance_->content_security_policy(), instance_->content_security_policy_type(), instance_->creation_address_space())); - factory->CreateSharedWorker( + // Register with DevTools. + bool pause_on_start; + base::UnguessableToken devtools_worker_token; + SharedWorkerDevToolsManager::GetInstance()->WorkerCreated( + this, &pause_on_start, &devtools_worker_token); + + // Set up content settings interface. + blink::mojom::WorkerContentSettingsProxyPtr content_settings; + content_settings_ = std::make_unique<SharedWorkerContentSettingsProxyImpl>( + instance_->url(), this, mojo::MakeRequest(&content_settings)); + + // Set up host interface. + mojom::SharedWorkerHostPtr host; + binding_.Bind(mojo::MakeRequest(&host)); + + // Set up interface provider interface. + service_manager::mojom::InterfaceProviderPtr interface_provider; + interface_provider_binding_.Bind(FilterRendererExposedInterfaces( + mojom::kNavigation_SharedWorkerSpec, process_id_, + mojo::MakeRequest(&interface_provider))); + + // Send the CreateSharedWorker message. + factory_ = std::move(factory); + factory_->CreateSharedWorker( std::move(info), pause_on_start, devtools_worker_token, - std::move(content_settings), std::move(host), mojo::MakeRequest(&worker_), - std::move(interface_provider)); + std::move(content_settings), std::move(service_worker_provider_info), + std::move(script_loader_factory), std::move(host), + mojo::MakeRequest(&worker_), std::move(interface_provider)); // Monitor the lifetime of the worker. worker_.set_connection_error_handler(base::BindOnce(
diff --git a/content/browser/shared_worker/shared_worker_host.h b/content/browser/shared_worker/shared_worker_host.h index 5b4642a..dd95fc3 100644 --- a/content/browser/shared_worker/shared_worker_host.h +++ b/content/browser/shared_worker/shared_worker_host.h
@@ -16,11 +16,13 @@ #include "base/strings/string16.h" #include "base/time/time.h" #include "base/unguessable_token.h" +#include "content/common/service_worker/service_worker_provider.mojom.h" #include "content/common/shared_worker/shared_worker.mojom.h" #include "content/common/shared_worker/shared_worker_client.mojom.h" #include "content/common/shared_worker/shared_worker_factory.mojom.h" #include "content/common/shared_worker/shared_worker_host.mojom.h" #include "mojo/public/cpp/bindings/binding.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" #include "services/service_manager/public/mojom/interface_provider.mojom.h" #include "third_party/blink/public/web/devtools_agent.mojom.h" @@ -31,7 +33,6 @@ } namespace content { - class SharedWorkerContentSettingsProxyImpl; class SharedWorkerInstance; class SharedWorkerServiceImpl; @@ -49,9 +50,22 @@ ~SharedWorkerHost() override; // Starts the SharedWorker in the renderer process. - void Start(mojom::SharedWorkerFactoryPtr factory, - bool pause_on_start, - const base::UnguessableToken& devtools_worker_token); + // + // S13nServiceWorker: + // |service_worker_provider_info| is sent to the renderer process and contains + // information about its ServiceWorkerProviderHost, the browser-side host for + // supporting the shared worker as a service worker client. + // + // S13nServiceWorker: + // |script_loader_factory| is sent to the renderer process and is to be used + // to request the shared worker's script. Currently it's only non-null when + // S13nServiceWorker is enabled, to allow service worker machinery to observe + // the request, but other web platform features may also use it someday. + void Start( + mojom::SharedWorkerFactoryPtr factory, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr + service_worker_provider_info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory); void AllowFileSystem(const GURL& url, base::OnceCallback<void(bool)> callback); @@ -127,6 +141,12 @@ std::unique_ptr<SharedWorkerContentSettingsProxyImpl> content_settings_; + // This is kept alive during the lifetime of the shared worker, since it's + // associated with Mojo interfaces (ServiceWorkerContainer and + // URLLoaderFactory) that are needed to stay alive while the worker is + // starting or running. + mojom::SharedWorkerFactoryPtr factory_; + mojo::Binding<service_manager::mojom::InterfaceProvider> interface_provider_binding_;
diff --git a/content/browser/shared_worker/shared_worker_script_loader.cc b/content/browser/shared_worker/shared_worker_script_loader.cc new file mode 100644 index 0000000..ff39e06 --- /dev/null +++ b/content/browser/shared_worker/shared_worker_script_loader.cc
@@ -0,0 +1,203 @@ +// 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. + +#include "content/browser/shared_worker/shared_worker_script_loader.h" + +#include "content/browser/loader/navigation_loader_interceptor.h" +#include "content/browser/service_worker/service_worker_provider_host.h" +#include "content/browser/url_loader_factory_getter.h" +#include "content/common/service_worker/service_worker_utils.h" +#include "content/public/browser/resource_context.h" +#include "net/url_request/redirect_util.h" + +namespace content { + +SharedWorkerScriptLoader::SharedWorkerScriptLoader( + int32_t routing_id, + int32_t request_id, + uint32_t options, + const network::ResourceRequest& resource_request, + network::mojom::URLLoaderClientPtr client, + base::WeakPtr<ServiceWorkerProviderHost> service_worker_provider_host, + ResourceContext* resource_context, + scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) + : routing_id_(routing_id), + request_id_(request_id), + options_(options), + resource_request_(resource_request), + client_(std::move(client)), + service_worker_provider_host_(service_worker_provider_host), + resource_context_(resource_context), + loader_factory_getter_(std::move(loader_factory_getter)), + traffic_annotation_(traffic_annotation), + url_loader_client_binding_(this), + weak_factory_(this) { + DCHECK(ServiceWorkerUtils::IsServicificationEnabled()); + + if (service_worker_provider_host_) { + service_worker_interceptor_ = + ServiceWorkerRequestHandler::InitializeForSharedWorker( + resource_request_, service_worker_provider_host_); + } + + Start(); +} + +SharedWorkerScriptLoader::~SharedWorkerScriptLoader() = default; + +void SharedWorkerScriptLoader::Start() { + if (service_worker_interceptor_) { + service_worker_interceptor_->MaybeCreateLoader( + resource_request_, resource_context_, + base::BindOnce(&SharedWorkerScriptLoader::MaybeStartLoader, + weak_factory_.GetWeakPtr(), + service_worker_interceptor_.get())); + return; + } + + LoadFromNetwork(); +} + +void SharedWorkerScriptLoader::MaybeStartLoader( + NavigationLoaderInterceptor* interceptor, + SingleRequestURLLoaderFactory::RequestHandler single_request_handler) { + if (single_request_handler) { + // The interceptor elected to handle the request. Use it. + network::mojom::URLLoaderClientPtr client; + url_loader_client_binding_.Bind(mojo::MakeRequest(&client)); + url_loader_factory_ = base::MakeRefCounted<SingleRequestURLLoaderFactory>( + std::move(single_request_handler)); + url_loader_factory_->CreateLoaderAndStart( + mojo::MakeRequest(&url_loader_), routing_id_, request_id_, options_, + resource_request_, std::move(client), traffic_annotation_); + // We continue in URLLoaderClient calls. + return; + } + + // TODO(falken): Support blob urls. + + LoadFromNetwork(); +} + +void SharedWorkerScriptLoader::LoadFromNetwork() { + network::mojom::URLLoaderClientPtr client; + url_loader_client_binding_.Bind(mojo::MakeRequest(&client)); + url_loader_factory_ = loader_factory_getter_->GetNetworkFactory(); + url_loader_factory_->CreateLoaderAndStart( + mojo::MakeRequest(&url_loader_), routing_id_, request_id_, options_, + resource_request_, std::move(client), traffic_annotation_); + // We continue in URLLoaderClient calls. +} + +// URLLoader ------------------------------------------------------------------- +// When this class gets a FollowRedirect IPC from the renderer, it restarts with +// the new URL. + +void SharedWorkerScriptLoader::FollowRedirect() { + DCHECK(redirect_info_); + + // |should_clear_upload| is unused because there is no body anyway. + DCHECK(!resource_request_.request_body); + bool should_clear_upload = false; + net::RedirectUtil::UpdateHttpRequest( + resource_request_.url, resource_request_.method, *redirect_info_, + &resource_request_.headers, &should_clear_upload); + + resource_request_.url = redirect_info_->new_url; + resource_request_.method = redirect_info_->new_method; + resource_request_.site_for_cookies = redirect_info_->new_site_for_cookies; + resource_request_.referrer = GURL(redirect_info_->new_referrer); + resource_request_.referrer_policy = redirect_info_->new_referrer_policy; + + // Restart the request. + url_loader_client_binding_.Unbind(); + redirect_info_.reset(); + Start(); +} + +void SharedWorkerScriptLoader::ProceedWithResponse() { + // Only for navigations. + NOTREACHED(); +} + +// Below we make a small effort to support the other URLLoader functions by +// forwarding to the current |url_loader_| if any, but don't bother queuing +// state or propagating state to a new URLLoader upon redirect. +void SharedWorkerScriptLoader::SetPriority(net::RequestPriority priority, + int32_t intra_priority_value) { + if (url_loader_) + url_loader_->SetPriority(priority, intra_priority_value); +} + +void SharedWorkerScriptLoader::PauseReadingBodyFromNet() { + if (url_loader_) + url_loader_->PauseReadingBodyFromNet(); +} + +void SharedWorkerScriptLoader::ResumeReadingBodyFromNet() { + if (url_loader_) + url_loader_->ResumeReadingBodyFromNet(); +} + +// URLLoaderClient ---------------------------------------------------------- +// This class forwards any client messages to the outer client in the renderer. +// Additionally, on redirects it saves the redirect info so if the renderer +// calls FollowRedirect(), it can do so. + +void SharedWorkerScriptLoader::OnReceiveResponse( + const network::ResourceResponseHead& response_head, + network::mojom::DownloadedTempFilePtr downloaded_file) { + client_->OnReceiveResponse(response_head, std::move(downloaded_file)); +} + +void SharedWorkerScriptLoader::OnReceiveRedirect( + const net::RedirectInfo& redirect_info, + const network::ResourceResponseHead& response_head) { + if (--redirect_limit_ == 0) { + client_->OnComplete( + network::URLLoaderCompletionStatus(net::ERR_TOO_MANY_REDIRECTS)); + return; + } + + redirect_info_ = redirect_info; + client_->OnReceiveRedirect(redirect_info, response_head); +} + +void SharedWorkerScriptLoader::OnDataDownloaded(int64_t data_len, + int64_t encoded_data_len) { + client_->OnDataDownloaded(data_len, encoded_data_len); +} + +void SharedWorkerScriptLoader::OnUploadProgress( + int64_t current_position, + int64_t total_size, + OnUploadProgressCallback ack_callback) { + client_->OnUploadProgress(current_position, total_size, + std::move(ack_callback)); +} + +void SharedWorkerScriptLoader::OnReceiveCachedMetadata( + const std::vector<uint8_t>& data) { + client_->OnReceiveCachedMetadata(data); +} + +void SharedWorkerScriptLoader::OnTransferSizeUpdated( + int32_t transfer_size_diff) { + client_->OnTransferSizeUpdated(transfer_size_diff); +} + +void SharedWorkerScriptLoader::OnStartLoadingResponseBody( + mojo::ScopedDataPipeConsumerHandle consumer) { + client_->OnStartLoadingResponseBody(std::move(consumer)); +} + +void SharedWorkerScriptLoader::OnComplete( + const network::URLLoaderCompletionStatus& status) { + if (status.error_code == net::OK) + service_worker_provider_host_->CompleteSharedWorkerPreparation(); + client_->OnComplete(status); +} + +} // namespace content
diff --git a/content/browser/shared_worker/shared_worker_script_loader.h b/content/browser/shared_worker/shared_worker_script_loader.h new file mode 100644 index 0000000..7e61d8c --- /dev/null +++ b/content/browser/shared_worker/shared_worker_script_loader.h
@@ -0,0 +1,106 @@ +// 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 CONTENT_BROWSER_SHARED_WORKER_SHARED_WORKER_SCRIPT_LOADER_H_ +#define CONTENT_BROWSER_SHARED_WORKER_SHARED_WORKER_SCRIPT_LOADER_H_ + +#include "base/macros.h" +#include "content/common/single_request_url_loader_factory.h" +#include "mojo/public/cpp/bindings/binding.h" +#include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/network/public/cpp/resource_request.h" +#include "services/network/public/mojom/url_loader.mojom.h" + +namespace content { +class NavigationLoaderInterceptor; +class ResourceContext; +class ServiceWorkerProviderHost; +class URLLoaderFactoryGetter; + +// The URLLoader for loading a shared worker script. Only used for the main +// script request. +// +// This acts much like NavigationURLLoaderNetworkService. It allows a +// NavigationLoaderInterceptor to intercept the request with its own loader, and +// goes to the network loader otherwise. Once a loader is started, this class +// acts as the URLLoaderClient for it, forwarding messages to the outer client. +// On redirects, it starts over with the new request URL, possibly starting a +// new loader and becoming the client of that. +// +// Lives on the IO thread. +class SharedWorkerScriptLoader : public network::mojom::URLLoader, + public network::mojom::URLLoaderClient { + public: + SharedWorkerScriptLoader( + int32_t routing_id, + int32_t request_id, + uint32_t options, + const network::ResourceRequest& resource_request, + network::mojom::URLLoaderClientPtr client, + base::WeakPtr<ServiceWorkerProviderHost> service_worker_provider_host, + ResourceContext* resource_context, + scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation); + ~SharedWorkerScriptLoader() override; + + // network::mojom::URLLoader: + void FollowRedirect() override; + void ProceedWithResponse() override; + void SetPriority(net::RequestPriority priority, + int32_t intra_priority_value) override; + void PauseReadingBodyFromNet() override; + void ResumeReadingBodyFromNet() override; + + // network::mojom::URLLoaderClient: + void OnReceiveResponse( + const network::ResourceResponseHead& response_head, + network::mojom::DownloadedTempFilePtr downloaded_file) override; + void OnReceiveRedirect( + const net::RedirectInfo& redirect_info, + const network::ResourceResponseHead& response_head) override; + void OnDataDownloaded(int64_t data_len, int64_t encoded_data_len) override; + void OnUploadProgress(int64_t current_position, + int64_t total_size, + OnUploadProgressCallback ack_callback) override; + void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override; + void OnTransferSizeUpdated(int32_t transfer_size_diff) override; + void OnStartLoadingResponseBody( + mojo::ScopedDataPipeConsumerHandle body) override; + void OnComplete(const network::URLLoaderCompletionStatus& status) override; + + private: + void Start(); + void MaybeStartLoader( + NavigationLoaderInterceptor* interceptor, + SingleRequestURLLoaderFactory::RequestHandler single_request_handler); + void LoadFromNetwork(); + + // TODO(falken): Add other interceptors like in + // NavigationURLLoaderNetworkService. + std::unique_ptr<NavigationLoaderInterceptor> service_worker_interceptor_; + + const int32_t routing_id_; + const int32_t request_id_; + const uint32_t options_; + network::ResourceRequest resource_request_; + network::mojom::URLLoaderClientPtr client_; + base::WeakPtr<ServiceWorkerProviderHost> service_worker_provider_host_; + ResourceContext* resource_context_; + scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter_; + net::MutableNetworkTrafficAnnotationTag traffic_annotation_; + + base::Optional<net::RedirectInfo> redirect_info_; + int redirect_limit_ = net::URLRequest::kMaxRedirects; + + network::mojom::URLLoaderPtr url_loader_; + mojo::Binding<network::mojom::URLLoaderClient> url_loader_client_binding_; + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; + + base::WeakPtrFactory<SharedWorkerScriptLoader> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(SharedWorkerScriptLoader); +}; + +} // namespace content +#endif // CONTENT_BROWSER_SHARED_WORKER_SHARED_WORKER_SCRIPT_LOADER_H_
diff --git a/content/browser/shared_worker/shared_worker_script_loader_factory.cc b/content/browser/shared_worker/shared_worker_script_loader_factory.cc new file mode 100644 index 0000000..f819351 --- /dev/null +++ b/content/browser/shared_worker/shared_worker_script_loader_factory.cc
@@ -0,0 +1,69 @@ +// 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. + +#include "content/browser/shared_worker/shared_worker_script_loader_factory.h" + +#include <memory> +#include "content/browser/service_worker/service_worker_context_core.h" +#include "content/browser/service_worker/service_worker_context_wrapper.h" +#include "content/browser/service_worker/service_worker_provider_host.h" +#include "content/browser/service_worker/service_worker_version.h" +#include "content/browser/shared_worker/shared_worker_script_loader.h" +#include "content/browser/url_loader_factory_getter.h" +#include "content/common/service_worker/service_worker_utils.h" +#include "mojo/public/cpp/bindings/strong_binding.h" +#include "services/network/public/cpp/resource_response.h" +#include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h" + +namespace content { + +SharedWorkerScriptLoaderFactory::SharedWorkerScriptLoaderFactory( + ServiceWorkerContextWrapper* context, + base::WeakPtr<ServiceWorkerProviderHost> service_worker_provider_host, + ResourceContext* resource_context, + scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter) + : service_worker_provider_host_(service_worker_provider_host), + resource_context_(resource_context), + loader_factory_getter_(loader_factory_getter) { + DCHECK(ServiceWorkerUtils::IsServicificationEnabled()); + DCHECK_EQ(service_worker_provider_host_->provider_type(), + blink::mojom::ServiceWorkerProviderType::kForSharedWorker); +} + +SharedWorkerScriptLoaderFactory::~SharedWorkerScriptLoaderFactory() {} + +void SharedWorkerScriptLoaderFactory::CreateLoaderAndStart( + network::mojom::URLLoaderRequest request, + int32_t routing_id, + int32_t request_id, + uint32_t options, + const network::ResourceRequest& resource_request, + network::mojom::URLLoaderClientPtr client, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) { + // Handle only the main script (RESOURCE_TYPE_SHARED_WORKER). Import scripts + // should go to the network loader or controller. + if (resource_request.resource_type != RESOURCE_TYPE_SHARED_WORKER) { + mojo::ReportBadMessage( + "SharedWorkerScriptLoaderFactory should only get requests for shared " + "worker scripts"); + return; + } + + // Create a SharedWorkerScriptLoader to load the script. + mojo::MakeStrongBinding( + std::make_unique<SharedWorkerScriptLoader>( + routing_id, request_id, options, resource_request, std::move(client), + service_worker_provider_host_, resource_context_, + loader_factory_getter_, traffic_annotation), + std::move(request)); +} + +void SharedWorkerScriptLoaderFactory::Clone( + network::mojom::URLLoaderFactoryRequest request) { + // This method is required to support synchronous requests, which shared + // worker script requests are not. + NOTIMPLEMENTED(); +} + +} // namespace content
diff --git a/content/browser/shared_worker/shared_worker_script_loader_factory.h b/content/browser/shared_worker/shared_worker_script_loader_factory.h new file mode 100644 index 0000000..7e0e4c5c --- /dev/null +++ b/content/browser/shared_worker/shared_worker_script_loader_factory.h
@@ -0,0 +1,59 @@ +// 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 CONTENT_BROWSER_SHARED_WORKER_SHARED_WORKER_SCRIPT_LOADER_FACTORY_H_ +#define CONTENT_BROWSER_SHARED_WORKER_SHARED_WORKER_SCRIPT_LOADER_FACTORY_H_ + +#include "base/macros.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" + +namespace content { + +class ServiceWorkerContextWrapper; +class ServiceWorkerProviderHost; +class URLLoaderFactoryGetter; +class ResourceContext; + +// S13nServiceWorker: +// Created per one running shared worker for loading its script. +// +// Shared worker script loads require special logic because they are similiar to +// navigations from the point of view of web platform features like service +// worker. +// +// This creates a SharedWorkerScriptLoader to load the script, which follows +// redirects and sets the controller service worker on the shared worker if +// needed. +class SharedWorkerScriptLoaderFactory + : public network::mojom::URLLoaderFactory { + public: + SharedWorkerScriptLoaderFactory( + ServiceWorkerContextWrapper* context, + base::WeakPtr<ServiceWorkerProviderHost> provider_host, + ResourceContext* resource_context, + scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter); + ~SharedWorkerScriptLoaderFactory() override; + + // network::mojom::URLLoaderFactory: + void CreateLoaderAndStart(network::mojom::URLLoaderRequest request, + int32_t routing_id, + int32_t request_id, + uint32_t options, + const network::ResourceRequest& resource_request, + network::mojom::URLLoaderClientPtr client, + const net::MutableNetworkTrafficAnnotationTag& + traffic_annotation) override; + void Clone(network::mojom::URLLoaderFactoryRequest request) override; + + private: + base::WeakPtr<ServiceWorkerProviderHost> service_worker_provider_host_; + ResourceContext* resource_context_ = nullptr; + scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter_; + + DISALLOW_COPY_AND_ASSIGN(SharedWorkerScriptLoaderFactory); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_SHARED_WORKER_SHARED_WORKER_SCRIPT_LOADER_FACTORY_H_
diff --git a/content/browser/shared_worker/shared_worker_service_impl.cc b/content/browser/shared_worker/shared_worker_service_impl.cc index 4a5a8cfdc..5589e34 100644 --- a/content/browser/shared_worker/shared_worker_service_impl.cc +++ b/content/browser/shared_worker/shared_worker_service_impl.cc
@@ -12,10 +12,13 @@ #include "base/callback.h" #include "base/logging.h" #include "base/macros.h" -#include "content/browser/devtools/shared_worker_devtools_manager.h" #include "content/browser/shared_worker/shared_worker_host.h" #include "content/browser/shared_worker/shared_worker_instance.h" +#include "content/browser/shared_worker/shared_worker_script_loader_factory.h" +#include "content/browser/storage_partition_impl.h" #include "content/browser/web_contents/web_contents_impl.h" +#include "content/common/service_worker/service_worker_provider.mojom.h" +#include "content/common/service_worker/service_worker_utils.h" #include "content/common/shared_worker/shared_worker_client.mojom.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/content_browser_client.h" @@ -23,6 +26,7 @@ #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/common/bind_interface_helpers.h" +#include "mojo/public/cpp/bindings/strong_associated_binding.h" #include "third_party/blink/public/common/message_port/message_port_channel.h" #include "url/origin.h" @@ -34,9 +38,38 @@ host->IsKeepAliveRefCountDisabled(); } +void CreateScriptLoaderOnIO( + scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter, + scoped_refptr<ServiceWorkerContextWrapper> context, + int process_id, + base::OnceCallback<void(mojom::ServiceWorkerProviderInfoForSharedWorkerPtr, + network::mojom::URLLoaderFactoryAssociatedPtrInfo)> + callback) { + // Set up for service worker. + auto provider_info = mojom::ServiceWorkerProviderInfoForSharedWorker::New(); + base::WeakPtr<ServiceWorkerProviderHost> host = + context->PreCreateHostForSharedWorker(process_id, &provider_info); + + // Create the SharedWorkerScriptLoaderFactory. + network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory; + mojo::MakeStrongAssociatedBinding( + std::make_unique<SharedWorkerScriptLoaderFactory>( + context.get(), host->AsWeakPtr(), context->resource_context(), + std::move(loader_factory_getter)), + mojo::MakeRequest(&script_loader_factory)); + + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::BindOnce(std::move(callback), std::move(provider_info), + std::move(script_loader_factory))); +} + } // namespace -SharedWorkerServiceImpl::SharedWorkerServiceImpl() {} +SharedWorkerServiceImpl::SharedWorkerServiceImpl( + scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) + : service_worker_context_(std::move(service_worker_context)), + weak_factory_(this) {} SharedWorkerServiceImpl::~SharedWorkerServiceImpl() {} @@ -127,8 +160,26 @@ DestroyHost(host); } + // Bounce to the IO thread to setup service worker support in case the request + // for the worker script will need to be intercepted by service workers. + // TODO(falken): Move service worker to the UI thread. + if (ServiceWorkerUtils::IsServicificationEnabled()) { + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::BindOnce(&CreateScriptLoaderOnIO, + service_worker_context_->storage_partition() + ->url_loader_factory_getter(), + service_worker_context_, process_id, + base::BindOnce(&SharedWorkerServiceImpl::CreateWorker, + weak_factory_.GetWeakPtr(), + std::move(instance), std::move(client), + process_id, frame_id, message_port))); + return; + } + CreateWorker(std::move(instance), std::move(client), process_id, frame_id, - message_port); + message_port, nullptr /* service_worker_provider_info */, + {} /* script_loader_factory */); } void SharedWorkerServiceImpl::DestroyHost(SharedWorkerHost* host) { @@ -150,9 +201,12 @@ mojom::SharedWorkerClientPtr client, int process_id, int frame_id, - const blink::MessagePortChannel& message_port) { - // Re-use the process that requested the shared worker. - int worker_process_id = process_id; + const blink::MessagePortChannel& message_port, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr + service_worker_provider_info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo + script_loader_factory_info) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); RenderProcessHost* process_host = RenderProcessHost::FromID(process_id); // If the requesting process is shutting down, then just drop this request on @@ -163,21 +217,16 @@ // Keep the renderer process alive that will be hosting the shared worker. process_host->IncrementKeepAliveRefCount( RenderProcessHost::KeepAliveClientType::kSharedWorker); - - auto host = std::make_unique<SharedWorkerHost>(this, std::move(instance), - worker_process_id); - - bool pause_on_start; - base::UnguessableToken devtools_worker_token; - SharedWorkerDevToolsManager::GetInstance()->WorkerCreated( - host.get(), &pause_on_start, &devtools_worker_token); + auto host = + std::make_unique<SharedWorkerHost>(this, std::move(instance), process_id); // Get the factory used to instantiate the new shared worker instance in // the target process. mojom::SharedWorkerFactoryPtr factory; BindInterface(process_host, &factory); - host->Start(std::move(factory), pause_on_start, devtools_worker_token); + host->Start(std::move(factory), std::move(service_worker_provider_info), + std::move(script_loader_factory_info)); host->AddClient(std::move(client), process_id, frame_id, message_port); worker_hosts_.insert(std::move(host));
diff --git a/content/browser/shared_worker/shared_worker_service_impl.h b/content/browser/shared_worker/shared_worker_service_impl.h index 86cd0e8e..c4075f8 100644 --- a/content/browser/shared_worker/shared_worker_service_impl.h +++ b/content/browser/shared_worker/shared_worker_service_impl.h
@@ -14,23 +14,26 @@ #include "base/containers/unique_ptr_adapters.h" #include "base/macros.h" #include "base/memory/singleton.h" +#include "content/browser/service_worker/service_worker_context_wrapper.h" #include "content/browser/shared_worker/shared_worker_host.h" +#include "content/common/service_worker/service_worker_provider.mojom.h" #include "content/common/shared_worker/shared_worker_connector.mojom.h" #include "content/common/shared_worker/shared_worker_factory.mojom.h" #include "content/public/browser/shared_worker_service.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" namespace blink { class MessagePortChannel; } namespace content { - class SharedWorkerInstance; class SharedWorkerHost; class CONTENT_EXPORT SharedWorkerServiceImpl : public SharedWorkerService { public: - SharedWorkerServiceImpl(); + explicit SharedWorkerServiceImpl( + scoped_refptr<ServiceWorkerContextWrapper> service_worker_context); ~SharedWorkerServiceImpl() override; // SharedWorkerService implementation. @@ -58,7 +61,11 @@ mojom::SharedWorkerClientPtr client, int process_id, int frame_id, - const blink::MessagePortChannel& message_port); + const blink::MessagePortChannel& message_port, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr + service_worker_provider_info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo + script_loader_factory_info); // Returns nullptr if there is no such host. SharedWorkerHost* FindSharedWorkerHost(int process_id, int route_id); @@ -69,6 +76,10 @@ worker_hosts_; base::OnceClosure terminate_all_workers_callback_; + scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_; + + base::WeakPtrFactory<SharedWorkerServiceImpl> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(SharedWorkerServiceImpl); };
diff --git a/content/browser/shared_worker/shared_worker_service_impl_unittest.cc b/content/browser/shared_worker/shared_worker_service_impl_unittest.cc index 97bc324..d3ac80d6 100644 --- a/content/browser/shared_worker/shared_worker_service_impl_unittest.cc +++ b/content/browser/shared_worker/shared_worker_service_impl_unittest.cc
@@ -192,6 +192,10 @@ bool pause_on_start, const base::UnguessableToken& devtools_worker_token, blink::mojom::WorkerContentSettingsProxyPtr content_settings, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr + service_worker_provider_info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo + script_loader_factory_ptr_info, mojom::SharedWorkerHostPtr host, mojom::SharedWorkerRequest request, service_manager::mojom::InterfaceProviderPtr interface_provider)
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc index d6fbadbff..9f04237 100644 --- a/content/browser/storage_partition_impl.cc +++ b/content/browser/storage_partition_impl.cc
@@ -634,8 +634,8 @@ partition->service_worker_context_ = new ServiceWorkerContextWrapper(context); partition->service_worker_context_->set_storage_partition(partition.get()); - partition->shared_worker_service_ = - std::make_unique<SharedWorkerServiceImpl>(); + partition->shared_worker_service_ = std::make_unique<SharedWorkerServiceImpl>( + partition->service_worker_context_); partition->appcache_service_ = new ChromeAppCacheService(quota_manager_proxy.get());
diff --git a/content/browser/web_contents/web_contents_android.cc b/content/browser/web_contents/web_contents_android.cc index c7d8643..775b212 100644 --- a/content/browser/web_contents/web_contents_android.cc +++ b/content/browser/web_contents/web_contents_android.cc
@@ -8,6 +8,7 @@ #include <string> #include <vector> +#include "base/android/callback_android.h" #include "base/android/jni_android.h" #include "base/android/jni_array.h" #include "base/android/jni_string.h" @@ -16,6 +17,7 @@ #include "base/json/json_writer.h" #include "base/lazy_instance.h" #include "base/logging.h" +#include "base/task_scheduler/post_task.h" #include "content/browser/accessibility/browser_accessibility_android.h" #include "content/browser/accessibility/browser_accessibility_manager_android.h" #include "content/browser/android/content_view_core.h" @@ -44,6 +46,7 @@ #include "ui/android/overscroll_refresh_handler.h" #include "ui/android/window_android.h" #include "ui/gfx/android/java_bitmap.h" +#include "ui/gfx/codec/jpeg_codec.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" @@ -131,6 +134,34 @@ Java_WebContentsImpl_onAccessibilitySnapshot(env, j_root, callback); } +std::string CompressAndSaveBitmap(const std::string& dir, + const SkBitmap& bitmap) { + base::AssertBlockingAllowed(); + + std::vector<unsigned char> data; + if (!gfx::JPEGCodec::Encode(bitmap, 85, &data)) + return std::string(); + + base::FilePath screenshot_dir(dir); + if (!base::DirectoryExists(screenshot_dir)) { + base::CreateDirectory(screenshot_dir); + } + + base::FilePath screenshot_path; + base::ScopedFILE out_file( + base::CreateAndOpenTemporaryFileInDir(screenshot_dir, &screenshot_path)); + unsigned int bytes_written = + fwrite(reinterpret_cast<const char*>(data.data()), 1, data.size(), + out_file.get()); + + // If there were errors, don't leave a partial file around. + if (bytes_written != data.size()) { + base::DeleteFile(screenshot_path, false); + return std::string(); + } + return screenshot_path.value(); +} + } // namespace // static @@ -589,12 +620,14 @@ const JavaParamRef<jobject>& obj, jint width, jint height, + const JavaParamRef<jstring>& jpath, const JavaParamRef<jobject>& jcallback) { - RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid(); base::OnceCallback<void(const SkBitmap&)> result_callback = base::BindOnce( &WebContentsAndroid::OnFinishGetContentBitmap, weak_factory_.GetWeakPtr(), ScopedJavaGlobalRef<jobject>(env, obj), - ScopedJavaGlobalRef<jobject>(env, jcallback)); + ScopedJavaGlobalRef<jobject>(env, jcallback), + ConvertJavaStringToUTF8(env, jpath)); + RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid(); if (!view) { std::move(result_callback).Run(SkBitmap()); return; @@ -704,13 +737,22 @@ void WebContentsAndroid::OnFinishGetContentBitmap( const JavaRef<jobject>& obj, const JavaRef<jobject>& callback, + const std::string& path, const SkBitmap& bitmap) { JNIEnv* env = base::android::AttachCurrentThread(); ScopedJavaLocalRef<jobject> java_bitmap; - if (!bitmap.drawsNothing()) - java_bitmap = gfx::ConvertToJavaBitmap(&bitmap); - Java_WebContentsImpl_onGetContentBitmapFinished(env, obj, callback, - java_bitmap); + if (!bitmap.drawsNothing()) { + auto task_runner = base::CreateSequencedTaskRunnerWithTraits( + {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); + base::PostTaskAndReplyWithResult( + task_runner.get(), FROM_HERE, + base::BindOnce(&CompressAndSaveBitmap, path, bitmap), + base::BindOnce(&base::android::RunStringCallbackAndroid, + ScopedJavaGlobalRef<jobject>(env, callback.obj()))); + return; + } + // If readback failed, call empty callback + base::android::RunStringCallbackAndroid(callback, std::string()); } void WebContentsAndroid::OnFinishDownloadImage(
diff --git a/content/browser/web_contents/web_contents_android.h b/content/browser/web_contents/web_contents_android.h index 47e379e..2896fa2 100644 --- a/content/browser/web_contents/web_contents_android.h +++ b/content/browser/web_contents/web_contents_android.h
@@ -178,6 +178,7 @@ const base::android::JavaParamRef<jobject>& obj, jint width, jint height, + const base::android::JavaParamRef<jstring>& jpath, const base::android::JavaParamRef<jobject>& jcallback); void ReloadLoFiImages(JNIEnv* env, @@ -206,6 +207,7 @@ bool IsPictureInPictureAllowedForFullscreenVideo( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); + base::android::ScopedJavaLocalRef<jobject> GetFullscreenVideoSize( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); @@ -228,6 +230,7 @@ void OnFinishGetContentBitmap(const base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jobject>& callback, + const std::string& path, const SkBitmap& bitmap); void OnFinishDownloadImage(const base::android::JavaRef<jobject>& obj,
diff --git a/content/browser/webauth/authenticator_impl.cc b/content/browser/webauth/authenticator_impl.cc index eefa503..20fcc68 100644 --- a/content/browser/webauth/authenticator_impl.cc +++ b/content/browser/webauth/authenticator_impl.cc
@@ -19,6 +19,7 @@ #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" +#include "content/public/browser/render_widget_host_view.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_client.h" #include "content/public/common/content_features.h" @@ -236,9 +237,9 @@ options->allow_credentials); request_parameter.SetAllowList(std::move(allowed_list)); - request_parameter.SetUserVerificationRequired( - options->user_verification == - webauth::mojom::UserVerificationRequirement::REQUIRED); + request_parameter.SetUserVerification( + mojo::ConvertTo<device::UserVerificationRequirement>( + options->user_verification)); return request_parameter; } @@ -426,6 +427,13 @@ return; } + if (GetContentClient()->browser()->ShouldEnforceFocusChecksForWebauthn() && + !render_frame_host_->GetView()->HasFocus()) { + std::move(callback).Run(webauth::mojom::AuthenticatorStatus::NOT_FOCUSED, + nullptr); + return; + } + url::Origin caller_origin = render_frame_host_->GetLastCommittedOrigin(); relying_party_id_ = options->relying_party->id; @@ -539,6 +547,13 @@ return; } + if (GetContentClient()->browser()->ShouldEnforceFocusChecksForWebauthn() && + !render_frame_host_->GetView()->HasFocus()) { + std::move(callback).Run(webauth::mojom::AuthenticatorStatus::NOT_FOCUSED, + nullptr); + return; + } + url::Origin caller_origin = render_frame_host_->GetLastCommittedOrigin(); if (!HasValidEffectiveDomain(caller_origin)) { @@ -788,7 +803,14 @@ MakeCredentialCallback callback, webauth::mojom::AuthenticatorStatus status, webauth::mojom::MakeCredentialAuthenticatorResponsePtr response) { - std::move(callback).Run(status, std::move(response)); + if (GetContentClient()->browser()->ShouldEnforceFocusChecksForWebauthn() && + !render_frame_host_->GetView()->HasFocus()) { + std::move(callback).Run(webauth::mojom::AuthenticatorStatus::NOT_FOCUSED, + nullptr); + } else { + std::move(callback).Run(status, std::move(response)); + } + Cleanup(); } @@ -796,7 +818,14 @@ GetAssertionCallback callback, webauth::mojom::AuthenticatorStatus status, webauth::mojom::GetAssertionAuthenticatorResponsePtr response) { - std::move(callback).Run(status, std::move(response)); + if (GetContentClient()->browser()->ShouldEnforceFocusChecksForWebauthn() && + !render_frame_host_->GetView()->HasFocus()) { + std::move(callback).Run(webauth::mojom::AuthenticatorStatus::NOT_FOCUSED, + nullptr); + } else { + std::move(callback).Run(status, std::move(response)); + } + Cleanup(); }
diff --git a/content/browser/webauth/authenticator_type_converters.cc b/content/browser/webauth/authenticator_type_converters.cc index 851a824c..8a7ffc8 100644 --- a/content/browser/webauth/authenticator_type_converters.cc +++ b/content/browser/webauth/authenticator_type_converters.cc
@@ -85,25 +85,20 @@ } // static -::device::AuthenticatorSelectionCriteria::UserVerificationRequirement -TypeConverter< - ::device::AuthenticatorSelectionCriteria::UserVerificationRequirement, - UserVerificationRequirement>:: +::device::UserVerificationRequirement +TypeConverter<::device::UserVerificationRequirement, + UserVerificationRequirement>:: Convert(const ::webauth::mojom::UserVerificationRequirement& input) { switch (input) { case UserVerificationRequirement::PREFERRED: - return ::device::AuthenticatorSelectionCriteria:: - UserVerificationRequirement::kPreferred; + return ::device::UserVerificationRequirement::kPreferred; case UserVerificationRequirement::REQUIRED: - return ::device::AuthenticatorSelectionCriteria:: - UserVerificationRequirement::kRequired; + return ::device::UserVerificationRequirement::kRequired; case UserVerificationRequirement::DISCOURAGED: - return ::device::AuthenticatorSelectionCriteria:: - UserVerificationRequirement::kDiscouraged; + return ::device::UserVerificationRequirement::kDiscouraged; } NOTREACHED(); - return ::device::AuthenticatorSelectionCriteria::UserVerificationRequirement:: - kPreferred; + return ::device::UserVerificationRequirement::kPreferred; } // static @@ -136,8 +131,8 @@ ::device::AuthenticatorSelectionCriteria::AuthenticatorAttachment>( input->authenticator_attachment), input->require_resident_key, - ConvertTo<::device::AuthenticatorSelectionCriteria:: - UserVerificationRequirement>(input->user_verification)); + ConvertTo<::device::UserVerificationRequirement>( + input->user_verification)); } // static
diff --git a/content/browser/webauth/authenticator_type_converters.h b/content/browser/webauth/authenticator_type_converters.h index a239bfc..b11c768 100644 --- a/content/browser/webauth/authenticator_type_converters.h +++ b/content/browser/webauth/authenticator_type_converters.h
@@ -62,11 +62,10 @@ }; template <> -struct TypeConverter< - ::device::AuthenticatorSelectionCriteria::UserVerificationRequirement, - ::webauth::mojom::UserVerificationRequirement> { - static ::device::AuthenticatorSelectionCriteria::UserVerificationRequirement - Convert(const ::webauth::mojom::UserVerificationRequirement& input); +struct TypeConverter<::device::UserVerificationRequirement, + ::webauth::mojom::UserVerificationRequirement> { + static ::device::UserVerificationRequirement Convert( + const ::webauth::mojom::UserVerificationRequirement& input); }; template <>
diff --git a/content/common/service_worker/service_worker_container.mojom b/content/common/service_worker/service_worker_container.mojom index 1216127..07dc025 100644 --- a/content/common/service_worker/service_worker_container.mojom +++ b/content/common/service_worker/service_worker_container.mojom
@@ -78,6 +78,11 @@ // Clones the Mojo end point to the ServiceWorker container host. This is // used to communicate with the host from dedicated and shared workers. CloneForWorker(ServiceWorkerContainerHost& container_host_for_worker); + + // Does nothing but calls the callback. Useful for pumping the message pipe + // for this interface and associated interfaces: when the callback is called, + // you know all incoming messages up to the Ping() call have been received. + Ping() => (); }; // mojom::ServiceWorkerContainer is a renderer-side interface.
diff --git a/content/common/service_worker/service_worker_provider.mojom b/content/common/service_worker/service_worker_provider.mojom index b2b9cb4..de8bda5 100644 --- a/content/common/service_worker/service_worker_provider.mojom +++ b/content/common/service_worker/service_worker_provider.mojom
@@ -15,6 +15,16 @@ // and browser. const string kNavigation_ServiceWorkerSpec = "navigation:service_worker"; +// S13nServiceWorker: +// Sent from the browser process to the renderer. Contains parameteres for the +// constructor of ServiceWorkerNetworkProvider used for starting a shared +// worker. +struct ServiceWorkerProviderInfoForSharedWorker { + int32 provider_id; + associated ServiceWorkerContainerHost host_ptr_info; + associated ServiceWorkerContainer& client_request; +}; + // Sent from the browser process to the renderer. Contains parameters for the // constructor of ServiceWorkerNetworkProvider used for starting a service // worker.
diff --git a/content/common/shared_worker/shared_worker_factory.mojom b/content/common/shared_worker/shared_worker_factory.mojom index c290bc7..13c068a 100644 --- a/content/common/shared_worker/shared_worker_factory.mojom +++ b/content/common/shared_worker/shared_worker_factory.mojom
@@ -4,10 +4,12 @@ module content.mojom; +import "content/common/service_worker/service_worker_provider.mojom"; import "content/common/shared_worker/shared_worker.mojom"; import "content/common/shared_worker/shared_worker_host.mojom"; import "content/common/shared_worker/shared_worker_info.mojom"; import "mojo/public/mojom/base/unguessable_token.mojom"; +import "services/network/public/mojom/url_loader_factory.mojom"; import "services/service_manager/public/mojom/interface_provider.mojom"; import "third_party/blink/public/web/worker_content_settings_proxy.mojom"; @@ -29,6 +31,28 @@ bool pause_on_start, mojo_base.mojom.UnguessableToken devtools_worker_token, blink.mojom.WorkerContentSettingsProxy content_settings, + + // S13nServiceWorker: + // The info about the host in the browser process that provides support + // for this shared worker to be a service worker client. Null when + // S13nServiceWorker is disabled. + ServiceWorkerProviderInfoForSharedWorker? service_worker_provider_info, + + // S13nServiceWorker: + // The URLLoaderFactory to use to request the shared worker's script + // (just the main script resource; importScripts() should go through the + // usual loader or the controller service worker if appropriate). + // + // Null when S13nServiceWorker is disabled. + // + // It doesn't really need to be associated, but a similar associated + // interface ptr is sent for service worker startup, so making this + // associated too simplifies code on the renderer, as + // ServiceWorkerNetworkProvider::script_loader_factory_ can be an + // associated interface ptr used for both service worker and shared + // worker execution contexts. + associated network.mojom.URLLoaderFactory? script_loader_factory_ptr_info, + SharedWorkerHost host, SharedWorker& shared_worker, service_manager.mojom.InterfaceProvider interface_provider);
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn index 9e72dea..cae8e5c 100644 --- a/content/public/android/BUILD.gn +++ b/content/public/android/BUILD.gn
@@ -232,7 +232,6 @@ "java/src/org/chromium/content_public/browser/ActionModeCallbackHelper.java", "java/src/org/chromium/content_public/browser/ChildProcessUtils.java", "java/src/org/chromium/content_public/browser/InputMethodManagerWrapper.java", - "java/src/org/chromium/content_public/browser/ContentBitmapCallback.java", "java/src/org/chromium/content_public/browser/ContentViewCore.java", "java/src/org/chromium/content_public/browser/GestureListenerManager.java", "java/src/org/chromium/content_public/browser/GestureStateListener.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java index 8b6e000..3d89034a 100644 --- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
@@ -15,6 +15,7 @@ import android.os.Parcelable; import android.support.annotation.Nullable; +import org.chromium.base.Callback; import org.chromium.base.Log; import org.chromium.base.ThreadUtils; import org.chromium.base.VisibleForTesting; @@ -30,7 +31,6 @@ import org.chromium.content_public.browser.AccessibilitySnapshotCallback; import org.chromium.content_public.browser.AccessibilitySnapshotNode; import org.chromium.content_public.browser.ChildProcessImportance; -import org.chromium.content_public.browser.ContentBitmapCallback; import org.chromium.content_public.browser.ImageDownloadCallback; import org.chromium.content_public.browser.JavaScriptCallback; import org.chromium.content_public.browser.MessagePort; @@ -622,13 +622,9 @@ } @Override - public void getContentBitmapAsync(int width, int height, ContentBitmapCallback callback) { - nativeGetContentBitmap(mNativeWebContentsAndroid, width, height, callback); - } - - @CalledByNative - private void onGetContentBitmapFinished(ContentBitmapCallback callback, Bitmap bitmap) { - callback.onFinishGetBitmap(bitmap); + public void getContentBitmapAsync( + int width, int height, String path, Callback<String> callback) { + nativeGetContentBitmap(mNativeWebContentsAndroid, width, height, path, callback); } @Override @@ -827,8 +823,8 @@ long nativeWebContentsAndroid, AccessibilitySnapshotCallback callback); private native void nativeSetOverscrollRefreshHandler( long nativeWebContentsAndroid, OverscrollRefreshHandler nativeOverscrollRefreshHandler); - private native void nativeGetContentBitmap( - long nativeWebContentsAndroid, int width, int height, ContentBitmapCallback callback); + private native void nativeGetContentBitmap(long nativeWebContentsAndroid, int width, int height, + String path, Callback<String> callback); private native void nativeReloadLoFiImages(long nativeWebContentsAndroid); private native int nativeDownloadImage(long nativeWebContentsAndroid, String url, boolean isFavicon, int maxBitmapSize,
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/ContentBitmapCallback.java b/content/public/android/java/src/org/chromium/content_public/browser/ContentBitmapCallback.java deleted file mode 100644 index 83571c5..0000000 --- a/content/public/android/java/src/org/chromium/content_public/browser/ContentBitmapCallback.java +++ /dev/null
@@ -1,20 +0,0 @@ -// Copyright 2015 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.content_public.browser; - -import android.graphics.Bitmap; - -/** -* An interface used to get notified of the completion of content bitmap acquisition. -*/ -public interface ContentBitmapCallback { - /** - * Called when bitmap version of the content is acquired. - * - * @param bitmap content snapshot in the format of {@link Bitmap}, or null - * if the operation failed. - */ - void onFinishGetBitmap(Bitmap bitmap); -}
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java index c933af4a..bdc3f2e 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
@@ -9,6 +9,7 @@ import android.os.Parcelable; import android.support.annotation.Nullable; +import org.chromium.base.Callback; import org.chromium.base.VisibleForTesting; import org.chromium.ui.OverscrollRefreshHandler; import org.chromium.ui.base.EventForwarder; @@ -393,10 +394,11 @@ * * @param width The width of the resulting bitmap, or 0 for "auto." * @param height The height of the resulting bitmap, or 0 for "auto." + * @param path The folder in which to store the screenshot. * @param callback May be called synchronously, or at a later point, to deliver the bitmap * result (or a failure code). */ - void getContentBitmapAsync(int width, int height, ContentBitmapCallback callback); + void getContentBitmapAsync(int width, int height, String path, Callback<String> callback); /** * Reloads all the Lo-Fi images in this WebContents.
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc index 4a9b1dd..63feb661 100644 --- a/content/public/browser/content_browser_client.cc +++ b/content/public/browser/content_browser_client.cc
@@ -683,6 +683,10 @@ std::move(callback).Run(true); } +bool ContentBrowserClient::ShouldEnforceFocusChecksForWebauthn() { + return false; +} + std::unique_ptr<net::ClientCertStore> ContentBrowserClient::CreateClientCertStore(ResourceContext* resource_context) { return nullptr;
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h index 801300c..8e7f798 100644 --- a/content/public/browser/content_browser_client.h +++ b/content/public/browser/content_browser_client.h
@@ -1120,6 +1120,11 @@ const url::Origin& origin, base::OnceCallback<void(bool)> callback); + // Returns true if the Webauthn implementation should require that the + // |RenderFrameHost|'s View has focus before processing requests, and before + // sending replies. + virtual bool ShouldEnforceFocusChecksForWebauthn(); + // Get platform ClientCertStore. May return nullptr. virtual std::unique_ptr<net::ClientCertStore> CreateClientCertStore( ResourceContext* resource_context);
diff --git a/content/public/test/android/javatests/src/org/chromium/content/browser/test/mock/MockWebContents.java b/content/public/test/android/javatests/src/org/chromium/content/browser/test/mock/MockWebContents.java index f2630a8d..c29df51 100644 --- a/content/public/test/android/javatests/src/org/chromium/content/browser/test/mock/MockWebContents.java +++ b/content/public/test/android/javatests/src/org/chromium/content/browser/test/mock/MockWebContents.java
@@ -9,8 +9,8 @@ import android.os.Handler; import android.os.Parcel; +import org.chromium.base.Callback; import org.chromium.content_public.browser.AccessibilitySnapshotCallback; -import org.chromium.content_public.browser.ContentBitmapCallback; import org.chromium.content_public.browser.ImageDownloadCallback; import org.chromium.content_public.browser.JavaScriptCallback; import org.chromium.content_public.browser.MessagePort; @@ -213,7 +213,8 @@ public void setOverscrollRefreshHandler(OverscrollRefreshHandler handler) {} @Override - public void getContentBitmapAsync(int width, int height, ContentBitmapCallback callback) {} + public void getContentBitmapAsync( + int width, int height, String path, Callback<String> callback) {} @Override public void reloadLoFiImages() {}
diff --git a/content/renderer/media/mojo_audio_input_ipc.cc b/content/renderer/media/mojo_audio_input_ipc.cc index 108fd7c..a346a84 100644 --- a/content/renderer/media/mojo_audio_input_ipc.cc +++ b/content/renderer/media/mojo_audio_input_ipc.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/bind_helpers.h" +#include "base/metrics/histogram_macros.h" #include "media/audio/audio_device_description.h" #include "mojo/public/cpp/system/platform_handle.h" @@ -39,6 +40,7 @@ factory_client_binding_.set_connection_error_handler(base::BindOnce( &media::AudioInputIPCDelegate::OnError, base::Unretained(delegate_))); + stream_creation_start_time_ = base::TimeTicks::Now(); stream_creator_.Run(std::move(client), session_id, params, automatic_gain_control, total_segments); } @@ -75,6 +77,9 @@ DCHECK(!stream_); DCHECK(!stream_client_binding_.is_bound()); + UMA_HISTOGRAM_TIMES("Media.Audio.Render.InputDeviceStreamCreationTime", + base::TimeTicks::Now() - stream_creation_start_time_); + stream_ = std::move(stream); stream_client_binding_.Bind(std::move(stream_client_request));
diff --git a/content/renderer/media/mojo_audio_input_ipc.h b/content/renderer/media/mojo_audio_input_ipc.h index 329846b6..9b1533b 100644 --- a/content/renderer/media/mojo_audio_input_ipc.h +++ b/content/renderer/media/mojo_audio_input_ipc.h
@@ -11,6 +11,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" +#include "base/time/time.h" #include "content/common/content_export.h" #include "content/common/media/renderer_audio_input_stream_factory.mojom.h" #include "media/audio/audio_input_ipc.h" @@ -68,6 +69,8 @@ mojo::Binding<RendererAudioInputStreamFactoryClient> factory_client_binding_; media::AudioInputIPCDelegate* delegate_ = nullptr; + base::TimeTicks stream_creation_start_time_; + base::WeakPtrFactory<MojoAudioInputIPC> weak_factory_; DISALLOW_COPY_AND_ASSIGN(MojoAudioInputIPC);
diff --git a/content/renderer/media/mojo_audio_output_ipc.cc b/content/renderer/media/mojo_audio_output_ipc.cc index b5a56ae2..5a4c867 100644 --- a/content/renderer/media/mojo_audio_output_ipc.cc +++ b/content/renderer/media/mojo_audio_output_ipc.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/metrics/histogram_macros.h" #include "media/audio/audio_device_description.h" #include "mojo/public/cpp/bindings/callback_helpers.h" #include "mojo/public/cpp/system/platform_handle.h" @@ -80,6 +81,7 @@ DCHECK_EQ(delegate_, delegate); // Since the creation callback won't fire if the provider binding is gone // and |this| owns |stream_provider_|, unretained is safe. + stream_creation_start_time_ = base::TimeTicks::Now(); media::mojom::AudioOutputStreamClientPtr client_ptr; binding_.Bind(mojo::MakeRequest(&client_ptr)); stream_provider_->Acquire(mojo::MakeRequest(&stream_), std::move(client_ptr), @@ -198,6 +200,9 @@ DCHECK(io_task_runner_->RunsTasksInCurrentSequence()); DCHECK(delegate_); + UMA_HISTOGRAM_TIMES("Media.Audio.Render.OutputDeviceStreamCreationTime", + base::TimeTicks::Now() - stream_creation_start_time_); + base::PlatformFile socket_handle; auto result = mojo::UnwrapPlatformFile(std::move(data_pipe->socket), &socket_handle);
diff --git a/content/renderer/media/mojo_audio_output_ipc.h b/content/renderer/media/mojo_audio_output_ipc.h index 96c5cf6..a38363bc 100644 --- a/content/renderer/media/mojo_audio_output_ipc.h +++ b/content/renderer/media/mojo_audio_output_ipc.h
@@ -10,6 +10,7 @@ #include "base/callback_helpers.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/time/time.h" #include "content/common/content_export.h" #include "content/common/media/renderer_audio_output_stream_factory.mojom.h" #include "media/audio/audio_output_ipc.h" @@ -80,6 +81,8 @@ media::AudioOutputIPCDelegate* delegate_ = nullptr; scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; + base::TimeTicks stream_creation_start_time_; + // To make sure we don't send an "authorization completed" callback for a // stream after it's closed, we use this weak factory. base::WeakPtrFactory<MojoAudioOutputIPC> weak_factory_;
diff --git a/content/renderer/render_frame_metadata_observer_impl.cc b/content/renderer/render_frame_metadata_observer_impl.cc index 35a4dbd4..5b5c8b8 100644 --- a/content/renderer/render_frame_metadata_observer_impl.cc +++ b/content/renderer/render_frame_metadata_observer_impl.cc
@@ -36,10 +36,12 @@ last_frame_token_ = frame_token_allocator_->GetOrAllocateFrameToken(); render_frame_metadata_observer_client_->OnFrameSubmissionForTesting( last_frame_token_); - send_metadata = last_render_frame_metadata_ != metadata; + send_metadata = !last_render_frame_metadata_ || + *last_render_frame_metadata_ != metadata; } else { - send_metadata = cc::RenderFrameMetadata::HasAlwaysUpdateMetadataChanged( - last_render_frame_metadata_, metadata); + send_metadata = !last_render_frame_metadata_ || + cc::RenderFrameMetadata::HasAlwaysUpdateMetadataChanged( + *last_render_frame_metadata_, metadata); } } @@ -48,11 +50,14 @@ // compared the two for changes. last_render_frame_metadata_ = metadata; + // If the metadata is different, updates all the observers; or the metadata is + // generated for first time and same as the default value, update the default + // value to all the observers. if (send_metadata && render_frame_metadata_observer_client_) { // Sending |root_scroll_offset| outside of tests would leave the browser // process with out of date information. It is an optional parameter // which we clear here. - if (!render_frame_metadata_observer_client_) + if (!report_all_frame_submissions_for_testing_enabled_) metadata.root_scroll_offset = base::nullopt; last_frame_token_ = frame_token_allocator_->GetOrAllocateFrameToken(); @@ -75,8 +80,9 @@ // When enabled for testing send the cached metadata. DCHECK(render_frame_metadata_observer_client_); + DCHECK(last_render_frame_metadata_.has_value()); render_frame_metadata_observer_client_->OnRenderFrameMetadataChanged( - last_frame_token_, last_render_frame_metadata_); + last_frame_token_, *last_render_frame_metadata_); } } // namespace content
diff --git a/content/renderer/render_frame_metadata_observer_impl.h b/content/renderer/render_frame_metadata_observer_impl.h index cc07fe99..d7b1591 100644 --- a/content/renderer/render_frame_metadata_observer_impl.h +++ b/content/renderer/render_frame_metadata_observer_impl.h
@@ -48,7 +48,7 @@ bool report_all_frame_submissions_for_testing_enabled_ = false; uint32_t last_frame_token_ = 0; - cc::RenderFrameMetadata last_render_frame_metadata_; + base::Optional<cc::RenderFrameMetadata> last_render_frame_metadata_; // Not owned. cc::FrameTokenAllocator* frame_token_allocator_ = nullptr;
diff --git a/content/renderer/service_worker/service_worker_network_provider.cc b/content/renderer/service_worker/service_worker_network_provider.cc index 94170a87..a81f3344 100644 --- a/content/renderer/service_worker/service_worker_network_provider.cc +++ b/content/renderer/service_worker/service_worker_network_provider.cc
@@ -9,12 +9,13 @@ #include "content/common/service_worker/service_worker_messages.h" #include "content/common/service_worker/service_worker_provider_host_info.h" #include "content/common/service_worker/service_worker_utils.h" +#include "content/common/wrapper_shared_url_loader_factory.h" #include "content/public/common/browser_side_navigation_policy.h" #include "content/public/common/weak_wrapper_shared_url_loader_factory.h" #include "content/renderer/loader/request_extra_data.h" #include "content/renderer/render_thread_impl.h" +#include "content/renderer/renderer_blink_platform_impl.h" #include "content/renderer/service_worker/service_worker_dispatcher.h" -#include "content/renderer/service_worker/service_worker_provider_context.h" #include "ipc/ipc_sync_channel.h" #include "mojo/public/cpp/bindings/associated_group.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -191,15 +192,25 @@ // static std::unique_ptr<ServiceWorkerNetworkProvider> -ServiceWorkerNetworkProvider::CreateForSharedWorker() { - // TODO(kinuko): Provide SharedURLLoaderFactory associated with the - // SharedWorker. +ServiceWorkerNetworkProvider::CreateForSharedWorker( + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo + script_loader_factory_info, + scoped_refptr<network::SharedURLLoaderFactory> default_loader_factory) { + // S13nServiceWorker: |info| holds info about the precreated provider host. + if (info) { + DCHECK(ServiceWorkerUtils::IsServicificationEnabled()); + return base::WrapUnique(new ServiceWorkerNetworkProvider( + std::move(info), std::move(script_loader_factory_info), + std::move(default_loader_factory))); + } + return base::WrapUnique(new ServiceWorkerNetworkProvider( MSG_ROUTING_NONE, blink::mojom::ServiceWorkerProviderType::kForSharedWorker, GetNextProviderId(), true /* is_parent_frame_secure */, nullptr /* controller_service_worker */, - nullptr /* default_loader_factory*/)); + std::move(default_loader_factory))); } // static @@ -282,6 +293,22 @@ } } +// Constructor for precreated shared worker. +ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider( + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo + script_loader_factory_info, + scoped_refptr<network::SharedURLLoaderFactory> default_loader_factory) { + ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance(); + context_ = base::MakeRefCounted<ServiceWorkerProviderContext>( + info->provider_id, + blink::mojom::ServiceWorkerProviderType::kForSharedWorker, + std::move(info->client_request), std::move(info->host_ptr_info), + nullptr /* controller */, std::move(default_loader_factory)); + if (script_loader_factory_info.is_valid()) + script_loader_factory_.Bind(std::move(script_loader_factory_info)); +} + // Constructor for service worker execution contexts. ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider( mojom::ServiceWorkerProviderInfoForStartWorkerPtr info) {
diff --git a/content/renderer/service_worker/service_worker_network_provider.h b/content/renderer/service_worker/service_worker_network_provider.h index e112591..35e76fb 100644 --- a/content/renderer/service_worker/service_worker_network_provider.h +++ b/content/renderer/service_worker/service_worker_network_provider.h
@@ -18,6 +18,7 @@ #include "content/common/service_worker/controller_service_worker.mojom.h" #include "content/common/service_worker/service_worker.mojom.h" #include "content/common/service_worker/service_worker_provider.mojom.h" +#include "content/renderer/service_worker/service_worker_provider_context.h" #include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h" namespace blink { @@ -77,9 +78,11 @@ // Creates a ServiceWorkerNetworkProvider for a shared worker (as a // non-document service worker client). - // TODO(kinuko): This should also take SharedURLLoaderFactory associated - // with the SharedWorker. - static std::unique_ptr<ServiceWorkerNetworkProvider> CreateForSharedWorker(); + static std::unique_ptr<ServiceWorkerNetworkProvider> CreateForSharedWorker( + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo + script_loader_factory_info, + scoped_refptr<network::SharedURLLoaderFactory> default_loader_factory); // Creates a ServiceWorkerNetworkProvider for a "controller" (i.e. // a service worker execution context). @@ -122,12 +125,21 @@ mojom::ControllerServiceWorkerInfoPtr controller_info, scoped_refptr<network::SharedURLLoaderFactory> default_loader_factory); + ServiceWorkerNetworkProvider( + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo + script_loader_factory_info, + scoped_refptr<network::SharedURLLoaderFactory> default_loader_factory); + // This is for controllers, used in CreateForController. explicit ServiceWorkerNetworkProvider( mojom::ServiceWorkerProviderInfoForStartWorkerPtr info); scoped_refptr<ServiceWorkerProviderContext> context_; mojom::ServiceWorkerDispatcherHostAssociatedPtr dispatcher_host_; + + // The URL loader factory for loading worker scripts, used for service workers + // and shared workers. network::mojom::URLLoaderFactoryAssociatedPtr script_loader_factory_; DISALLOW_COPY_AND_ASSIGN(ServiceWorkerNetworkProvider);
diff --git a/content/renderer/service_worker/service_worker_provider_context.cc b/content/renderer/service_worker/service_worker_provider_context.cc index fec1063..04c6639 100644 --- a/content/renderer/service_worker/service_worker_provider_context.cc +++ b/content/renderer/service_worker/service_worker_provider_context.cc
@@ -281,6 +281,12 @@ state_for_client_->controller_connector->OnContainerHostConnectionClosed(); } +void ServiceWorkerProviderContext::PingContainerHost( + base::OnceClosure callback) { + DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence()); + container_host_->Ping(std::move(callback)); +} + void ServiceWorkerProviderContext::UnregisterWorkerFetchContext( mojom::ServiceWorkerWorkerClient* client) { DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence()); @@ -420,9 +426,7 @@ // Expected that it is called only for clients. DCHECK(state_for_client_); // |state_for_client_->default_loader_factory| could be null - // for SharedWorker case (which is not supported by S13nServiceWorker - // yet, https://crbug.com/796819) and in unit tests, return early in such - // cases too. + // in unit tests. return (ServiceWorkerUtils::IsServicificationEnabled() && state_for_client_->default_loader_factory); }
diff --git a/content/renderer/service_worker/service_worker_provider_context.h b/content/renderer/service_worker/service_worker_provider_context.h index ffeeab3d..aa6858d 100644 --- a/content/renderer/service_worker/service_worker_provider_context.h +++ b/content/renderer/service_worker/service_worker_provider_context.h
@@ -179,6 +179,10 @@ // see comments of |container_host_|. mojom::ServiceWorkerContainerHost* container_host() const; + // Pings the container host and calls |callback| once a pong arrived. Useful + // for waiting for all messages the host sent thus far to arrive. + void PingContainerHost(base::OnceClosure callback); + private: friend class base::DeleteHelper<ServiceWorkerProviderContext>; friend class base::RefCountedThreadSafe<ServiceWorkerProviderContext,
diff --git a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc index 28507ca..0c04458d 100644 --- a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc +++ b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
@@ -314,6 +314,7 @@ mojom::ServiceWorkerContainerHostRequest request) override { NOTIMPLEMENTED(); } + void Ping(PingCallback callback) override { NOTIMPLEMENTED(); } int get_controller_service_worker_count_ = 0; FakeControllerServiceWorker* fake_controller_;
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.cc b/content/renderer/shared_worker/embedded_shared_worker_stub.cc index 2c92c23..56478f0 100644 --- a/content/renderer/shared_worker/embedded_shared_worker_stub.cc +++ b/content/renderer/shared_worker/embedded_shared_worker_stub.cc
@@ -16,6 +16,7 @@ #include "content/public/common/content_client.h" #include "content/public/common/content_features.h" #include "content/public/common/origin_util.h" +#include "content/public/common/weak_wrapper_shared_url_loader_factory.h" #include "content/public/renderer/content_renderer_client.h" #include "content/renderer/appcache/appcache_dispatcher.h" #include "content/renderer/appcache/web_application_cache_host_impl.h" @@ -115,8 +116,55 @@ ServiceWorkerNetworkProvider* provider() { return provider_.get(); } - // TODO(kinuko): Implement CreateURLLoader with provider_->context()-> - // subresource_loader if Servicification is enabled. + std::unique_ptr<blink::WebURLLoader> CreateURLLoader( + const blink::WebURLRequest& request, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) override { + // S13nServiceWorker: + // We only install our own URLLoader if Servicification is enabled. + if (!ServiceWorkerUtils::IsServicificationEnabled()) + return nullptr; + + RenderThreadImpl* render_thread = RenderThreadImpl::current(); + // RenderThreadImpl is nullptr in some tests. + if (!render_thread) { + return nullptr; + } + // If the request is for the main script, use the script_loader_factory. + if (provider_->script_loader_factory() && + request.GetRequestContext() == + blink::WebURLRequest::kRequestContextSharedWorker) { + // TODO(crbug.com/796425): Temporarily wrap the raw + // mojom::URLLoaderFactory pointer into SharedURLLoaderFactory. + return std::make_unique<WebURLLoaderImpl>( + render_thread->resource_dispatcher(), std::move(task_runner), + base::MakeRefCounted<WeakWrapperSharedURLLoaderFactory>( + provider_->script_loader_factory())); + } + + // Otherwise, it's an importScript. Use the subresource loader factory. + if (!provider_->context() || + !provider_->context()->GetSubresourceLoaderFactory()) { + return nullptr; + } + + // If it's not for HTTP or HTTPS, no need to intercept the request. + if (!GURL(request.Url()).SchemeIsHTTPOrHTTPS()) + return nullptr; + + // If GetSkipServiceWorker() returns true, do not intercept the request. + if (request.GetSkipServiceWorker()) + return nullptr; + + // Create our own SubresourceLoader to route the request + // to the controller ServiceWorker. + // TODO(crbug.com/796425): Temporarily wrap the raw mojom::URLLoaderFactory + // pointer into SharedURLLoaderFactory. + return std::make_unique<WebURLLoaderImpl>( + RenderThreadImpl::current()->resource_dispatcher(), + std::move(task_runner), + base::MakeRefCounted<WeakWrapperSharedURLLoaderFactory>( + provider_->context()->GetSubresourceLoaderFactory())); + } private: std::unique_ptr<ServiceWorkerNetworkProvider> provider_; @@ -130,6 +178,10 @@ bool pause_on_start, const base::UnguessableToken& devtools_worker_token, blink::mojom::WorkerContentSettingsProxyPtr content_settings, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr + service_worker_provider_info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo + script_loader_factory_info, mojom::SharedWorkerHostPtr host, mojom::SharedWorkerRequest request, service_manager::mojom::InterfaceProviderPtr interface_provider) @@ -143,6 +195,10 @@ // is attached or explicit resume notification is received. impl_->PauseWorkerContextOnStart(); } + + service_worker_provider_info_ = std::move(service_worker_provider_info); + script_loader_factory_info_ = std::move(script_loader_factory_info); + impl_->StartWorkerContext( url_, blink::WebString::FromUTF8(name_), blink::WebString::FromUTF8(info->content_security_policy), @@ -218,16 +274,35 @@ std::unique_ptr<blink::WebServiceWorkerNetworkProvider> EmbeddedSharedWorkerStub::CreateServiceWorkerNetworkProvider() { - // Create a content::ServiceWorkerNetworkProvider for this data source so - // we can observe its requests. - std::unique_ptr<ServiceWorkerNetworkProvider> provider( - ServiceWorkerNetworkProvider::CreateForSharedWorker()); + scoped_refptr<network::SharedURLLoaderFactory> direct_network_loader_factory; + // current() may be null in tests. + if (RenderThreadImpl* render_thread = RenderThreadImpl::current()) { + direct_network_loader_factory = + base::MakeRefCounted<PossiblyAssociatedWrapperSharedURLLoaderFactory>( + render_thread->blink_platform_impl() + ->CreateNetworkURLLoaderFactory()); + } - // Blink is responsible for deleting the returned object. + std::unique_ptr<ServiceWorkerNetworkProvider> provider = + ServiceWorkerNetworkProvider::CreateForSharedWorker( + std::move(service_worker_provider_info_), + std::move(script_loader_factory_info_), + std::move(direct_network_loader_factory)); return std::make_unique<WebServiceWorkerNetworkProviderForSharedWorker>( std::move(provider), IsOriginSecure(url_)); } +void EmbeddedSharedWorkerStub::WaitForServiceWorkerControllerInfo( + blink::WebServiceWorkerNetworkProvider* web_network_provider, + base::OnceClosure callback) { + ServiceWorkerProviderContext* context = + static_cast<WebServiceWorkerNetworkProviderForSharedWorker*>( + web_network_provider) + ->provider() + ->context(); + context->PingContainerHost(std::move(callback)); +} + std::unique_ptr<blink::WebWorkerFetchContext> EmbeddedSharedWorkerStub::CreateWorkerFetchContext( blink::WebServiceWorkerNetworkProvider* web_network_provider) {
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.h b/content/renderer/shared_worker/embedded_shared_worker_stub.h index 1d6e854..25b8d13 100644 --- a/content/renderer/shared_worker/embedded_shared_worker_stub.h +++ b/content/renderer/shared_worker/embedded_shared_worker_stub.h
@@ -11,12 +11,14 @@ #include "base/macros.h" #include "base/unguessable_token.h" #include "content/child/scoped_child_process_reference.h" +#include "content/common/service_worker/service_worker_provider.mojom.h" #include "content/common/shared_worker/shared_worker.mojom.h" #include "content/common/shared_worker/shared_worker_host.mojom.h" #include "content/common/shared_worker/shared_worker_info.mojom.h" #include "content/renderer/child_message_filter.h" #include "ipc/ipc_listener.h" #include "mojo/public/cpp/bindings/binding.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" #include "services/service_manager/public/mojom/interface_provider.mojom.h" #include "third_party/blink/public/platform/web_content_security_policy.h" #include "third_party/blink/public/platform/web_content_settings_client.h" @@ -57,6 +59,10 @@ bool pause_on_start, const base::UnguessableToken& devtools_worker_token, blink::mojom::WorkerContentSettingsProxyPtr content_settings, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr + service_worker_provider_info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo + script_loader_factory_info, mojom::SharedWorkerHostPtr host, mojom::SharedWorkerRequest request, service_manager::mojom::InterfaceProviderPtr interface_provider); @@ -77,6 +83,9 @@ CreateServiceWorkerNetworkProvider() override; std::unique_ptr<blink::WebWorkerFetchContext> CreateWorkerFetchContext( blink::WebServiceWorkerNetworkProvider*) override; + void WaitForServiceWorkerControllerInfo( + blink::WebServiceWorkerNetworkProvider* web_network_provider, + base::OnceClosure callback) override; private: // WebSharedWorker will own |channel|. @@ -104,6 +113,14 @@ ScopedChildProcessReference process_ref_; WebApplicationCacheHostImpl* app_cache_host_ = nullptr; // Not owned. + // S13nServiceWorker: The info needed to connect to the + // ServiceWorkerProviderHost on the browser. + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr + service_worker_provider_info_; + // NetworkService: The URLLoaderFactory used for loading the shared worker + // script. + network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory_info_; + DISALLOW_COPY_AND_ASSIGN(EmbeddedSharedWorkerStub); };
diff --git a/content/renderer/shared_worker/shared_worker_factory_impl.cc b/content/renderer/shared_worker/shared_worker_factory_impl.cc index 2fa3f66..3fe8d6c 100644 --- a/content/renderer/shared_worker/shared_worker_factory_impl.cc +++ b/content/renderer/shared_worker/shared_worker_factory_impl.cc
@@ -24,14 +24,19 @@ bool pause_on_start, const base::UnguessableToken& devtools_worker_token, blink::mojom::WorkerContentSettingsProxyPtr content_settings, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr + service_worker_provider_info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo + script_loader_factory_ptr_info, mojom::SharedWorkerHostPtr host, mojom::SharedWorkerRequest request, service_manager::mojom::InterfaceProviderPtr interface_provider) { // Bound to the lifetime of the underlying blink::WebSharedWorker instance. new EmbeddedSharedWorkerStub( std::move(info), pause_on_start, devtools_worker_token, - std::move(content_settings), std::move(host), std::move(request), - std::move(interface_provider)); + std::move(content_settings), std::move(service_worker_provider_info), + std::move(script_loader_factory_ptr_info), std::move(host), + std::move(request), std::move(interface_provider)); } } // namespace content
diff --git a/content/renderer/shared_worker/shared_worker_factory_impl.h b/content/renderer/shared_worker/shared_worker_factory_impl.h index 880fb96a..0fc2cfdf 100644 --- a/content/renderer/shared_worker/shared_worker_factory_impl.h +++ b/content/renderer/shared_worker/shared_worker_factory_impl.h
@@ -6,7 +6,9 @@ #define CONTENT_RENDERER_SHARED_WORKER_SHARED_WORKER_FACTORY_IMPL_H_ #include "base/macros.h" +#include "content/common/service_worker/service_worker_provider.mojom.h" #include "content/common/shared_worker/shared_worker_factory.mojom.h" +#include "services/network/public/mojom/url_loader_factory.mojom.h" namespace content { @@ -23,6 +25,10 @@ bool pause_on_start, const base::UnguessableToken& devtools_worker_token, blink::mojom::WorkerContentSettingsProxyPtr content_settings, + mojom::ServiceWorkerProviderInfoForSharedWorkerPtr + service_worker_provider_info, + network::mojom::URLLoaderFactoryAssociatedPtrInfo + script_loader_factory_ptr_info, mojom::SharedWorkerHostPtr host, mojom::SharedWorkerRequest request, service_manager::mojom::InterfaceProviderPtr interface_provider) override;
diff --git a/content/test/gpu/PRESUBMIT.py b/content/test/gpu/PRESUBMIT.py index 522385a..fbb651b 100644 --- a/content/test/gpu/PRESUBMIT.py +++ b/content/test/gpu/PRESUBMIT.py
@@ -37,7 +37,7 @@ [ 'luci.chromium.try:linux_optional_gpu_tests_rel', 'luci.chromium.try:mac_optional_gpu_tests_rel', - 'master.tryserver.chromium.win:win_optional_gpu_tests_rel', + 'luci.chromium.try:win_optional_gpu_tests_rel', 'luci.chromium.try:android_optional_gpu_tests_rel', ], 'Automatically added optional GPU tests to run on CQ.')
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic.cc index 072db89..d72c8f80 100644 --- a/device/bluetooth/bluetooth_remote_gatt_characteristic.cc +++ b/device/bluetooth/bluetooth_remote_gatt_characteristic.cc
@@ -85,6 +85,12 @@ } } +bool BluetoothRemoteGattCharacteristic::WriteWithoutResponse( + base::span<const uint8_t> value) { + NOTIMPLEMENTED(); + return false; +} + void BluetoothRemoteGattCharacteristic::ExecuteStartNotifySession( NotifySessionCallback callback, ErrorCallback error_callback,
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic.h b/device/bluetooth/bluetooth_remote_gatt_characteristic.h index 2fa05fc..6191a43 100644 --- a/device/bluetooth/bluetooth_remote_gatt_characteristic.h +++ b/device/bluetooth/bluetooth_remote_gatt_characteristic.h
@@ -14,6 +14,7 @@ #include "base/callback.h" #include "base/callback_forward.h" #include "base/containers/queue.h" +#include "base/containers/span.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "device/bluetooth/bluetooth_export.h" @@ -132,6 +133,15 @@ const base::Closure& callback, const ErrorCallback& error_callback) = 0; + // Sends a write request to a remote characteristic with the value |value| + // without waiting for a response. This method returns false to signal + // failures. When attempting to write the remote characteristic true is + // returned without a guarantee of success. This method only applies to remote + // characteristics and will fail for those that are locally hosted. + // This method is currently implemented only on macOS. + // TODO(https://crbug.com/831524): Implement it on other platforms as well. + virtual bool WriteWithoutResponse(base::span<const uint8_t> value); + protected: BluetoothRemoteGattCharacteristic(); ~BluetoothRemoteGattCharacteristic() override;
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_mac.h b/device/bluetooth/bluetooth_remote_gatt_characteristic_mac.h index 1f54f86..744e8aa9 100644 --- a/device/bluetooth/bluetooth_remote_gatt_characteristic_mac.h +++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_mac.h
@@ -47,6 +47,7 @@ void WriteRemoteCharacteristic(const std::vector<uint8_t>& value, const base::Closure& callback, const ErrorCallback& error_callback) override; + bool WriteWithoutResponse(base::span<const uint8_t> value) override; DISALLOW_COPY_AND_ASSIGN(BluetoothRemoteGattCharacteristicMac); @@ -84,6 +85,8 @@ bool IsReadable() const; // Returns true if the characteristic is writable. bool IsWritable() const; + // Returns true if the characteristic is writable without response. + bool IsWritableWithoutResponse() const; // Returns true if the characteristic supports notifications or indications. bool SupportsNotificationsOrIndications() const; // Returns the write type (with or without responses).
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_mac.mm b/device/bluetooth/bluetooth_remote_gatt_characteristic_mac.mm index 1131a84a..c2c2ee0 100644 --- a/device/bluetooth/bluetooth_remote_gatt_characteristic_mac.mm +++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_mac.mm
@@ -213,6 +213,26 @@ } } +bool BluetoothRemoteGattCharacteristicMac::WriteWithoutResponse( + base::span<const uint8_t> value) { + if (!IsWritableWithoutResponse()) { + VLOG(1) << *this << ": Characteristic not writable without response."; + return false; + } + if (HasPendingRead() || HasPendingWrite()) { + VLOG(1) << *this << ": Characteristic write already in progress."; + return false; + } + + VLOG(1) << *this << ": Write characteristic without response."; + base::scoped_nsobject<NSData> nsdata_value( + [[NSData alloc] initWithBytes:value.data() length:value.size()]); + [GetCBPeripheral() writeValue:nsdata_value + forCharacteristic:cb_characteristic_ + type:CBCharacteristicWriteWithoutResponse]; + return true; +} + void BluetoothRemoteGattCharacteristicMac::SubscribeToNotifications( BluetoothRemoteGattDescriptor* ccc_descriptor, const base::Closure& callback, @@ -413,6 +433,10 @@ (properties & PROPERTY_WRITE_WITHOUT_RESPONSE); } +bool BluetoothRemoteGattCharacteristicMac::IsWritableWithoutResponse() const { + return (GetProperties() & PROPERTY_WRITE_WITHOUT_RESPONSE); +} + bool BluetoothRemoteGattCharacteristicMac::SupportsNotificationsOrIndications() const { BluetoothGattCharacteristic::Properties properties = GetProperties();
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc index ce7c79ec..c642513a 100644 --- a/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc +++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc
@@ -2865,18 +2865,19 @@ } #if defined(OS_MACOSX) -#define MAYBE_WriteWithoutResponseDuringDisconnect \ - WriteWithoutResponseDuringDisconnect +#define MAYBE_WriteWithoutResponseOnlyCharacteristic_WriteRemoteCharacteristicDuringDisconnect \ + WriteWithoutResponseOnlyCharacteristic_WriteRemoteCharacteristicDuringDisconnect #else -#define MAYBE_WriteWithoutResponseDuringDisconnect \ - DISABLED_WriteWithoutResponseDuringDisconnect +#define MAYBE_WriteWithoutResponseOnlyCharacteristic_WriteRemoteCharacteristicDuringDisconnect \ + DISABLED_WriteWithoutResponseOnlyCharacteristic_WriteRemoteCharacteristicDuringDisconnect #endif // Tests that writing without response during a disconnect results in an error. // Only applies to macOS whose events arrive all on the UI thread. See other // *DuringDisconnect tests for Android and Windows whose events arrive on a // different thread. -TEST_F(BluetoothRemoteGattCharacteristicTest, - MAYBE_WriteWithoutResponseDuringDisconnect) { +TEST_F( + BluetoothRemoteGattCharacteristicTest, + MAYBE_WriteWithoutResponseOnlyCharacteristic_WriteRemoteCharacteristicDuringDisconnect) { if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -2895,18 +2896,19 @@ } #if defined(OS_MACOSX) -#define MAYBE_DisconnectCalledDuringWriteWithoutResponse \ - DisconnectCalledDuringWriteWithoutResponse +#define MAYBE_WriteWithoutResponseOnlyCharacteristic_DisconnectCalledDuringWriteRemoteCharacteristic \ + WriteWithoutResponseOnlyCharacteristic_DisconnectCalledDuringWriteRemoteCharacteristic #else -#define MAYBE_DisconnectCalledDuringWriteWithoutResponse \ - DISABLED_DisconnectCalledDuringWriteWithoutResponse +#define MAYBE_WriteWithoutResponseOnlyCharacteristic_DisconnectCalledDuringWriteRemoteCharacteristic \ + DISABLED_WriteWithoutResponseOnlyCharacteristic_DisconnectCalledDuringWriteRemoteCharacteristic #endif // Tests that disconnecting right after a write without response results in an // error. // TODO(crbug.com/726534): Enable on other platforms depending on the resolution // of crbug.com/726534. -TEST_F(BluetoothRemoteGattCharacteristicTest, - MAYBE_DisconnectCalledDuringWriteWithoutResponse) { +TEST_F( + BluetoothRemoteGattCharacteristicTest, + MAYBE_WriteWithoutResponseOnlyCharacteristic_DisconnectCalledDuringWriteRemoteCharacteristic) { if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -2928,18 +2930,19 @@ } #if defined(OS_MACOSX) -#define MAYBE_DisconnectCalledBeforeWriteWithoutResponse \ - DisconnectCalledBeforeWriteWithoutResponse +#define MAYBE_WriteWithoutResponseOnlyCharacteristic_DisconnectCalledBeforeWriteRemoteCharacteristic \ + WriteWithoutResponseOnlyCharacteristic_DisconnectCalledBeforeWriteRemoteCharacteristic #else -#define MAYBE_DisconnectCalledBeforeWriteWithoutResponse \ - DISABLED_DisconnectCalledBeforeWriteWithoutResponse +#define MAYBE_WriteWithoutResponseOnlyCharacteristic_DisconnectCalledBeforeWriteRemoteCharacteristic \ + DISABLED_WriteWithoutResponseOnlyCharacteristic_DisconnectCalledBeforeWriteRemoteCharacteristic #endif // Tests that disconnecting right before a write without response results in an // error. // TODO(crbug.com/726534): Enable on other platforms depending on the resolution // of crbug.com/726534. -TEST_F(BluetoothRemoteGattCharacteristicTest, - MAYBE_DisconnectCalledBeforeWriteWithoutResponse) { +TEST_F( + BluetoothRemoteGattCharacteristicTest, + MAYBE_WriteWithoutResponseOnlyCharacteristic_DisconnectCalledBeforeWriteRemoteCharacteristic) { if (!PlatformSupportsLowEnergy()) { LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; return; @@ -2960,6 +2963,128 @@ base::RunLoop().RunUntilIdle(); } +#if defined(OS_MACOSX) +#define MAYBE_WriteWithoutResponse_PropertyNotPresent \ + WriteWithoutResponse_PropertyNotPresent +#else +#define MAYBE_WriteWithoutResponse_PropertyNotPresent \ + DISABLED_WriteWithoutResponse_PropertyNotPresent +#endif +// Tests that WriteWithoutResponse fails when a characteristic does not have the +// required property. +// TODO(https://crbug.com/831524): Enable for other platforms once supported. +TEST_F(BluetoothRemoteGattCharacteristicTest, + MAYBE_WriteWithoutResponse_PropertyNotPresent) { + if (!PlatformSupportsLowEnergy()) { + LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; + return; + } + ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( + BluetoothRemoteGattCharacteristic::PROPERTY_WRITE)); + + std::vector<uint8_t> test_vector = {0, 1, 2, 3, 4, 0xf, 0xf0, 0xff}; + EXPECT_FALSE(characteristic1_->WriteWithoutResponse(test_vector)); +} + +#if defined(OS_MACOSX) +#define MAYBE_WriteWithoutResponse_PendingWrite \ + WriteWithoutResponse_PendingWrite +#else +#define MAYBE_WriteWithoutResponse_PendingWrite \ + DISABLED_WriteWithoutResponse_PendingWrite +#endif +// Tests that WriteWithoutResponse fails when a characteristic already has a +// pending write. +// TODO(https://crbug.com/831524): Enable for other platforms once supported. +TEST_F(BluetoothRemoteGattCharacteristicTest, + MAYBE_WriteWithoutResponse_PendingWrite) { + if (!PlatformSupportsLowEnergy()) { + LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; + return; + } + ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( + BluetoothRemoteGattCharacteristic::PROPERTY_WRITE | + BluetoothRemoteGattCharacteristic::PROPERTY_WRITE_WITHOUT_RESPONSE)); + + std::vector<uint8_t> test_vector = {0, 1, 2, 3, 4, 0xf, 0xf0, 0xff}; + characteristic1_->WriteRemoteCharacteristic( + test_vector, GetCallback(Call::EXPECTED), + GetGattErrorCallback(Call::NOT_EXPECTED)); + + // Explicitly make sure that the callback has not been invoked yet. Since + // WriteRemoteCharacteristic is still pending, this results in an error for + // WriteWithoutResponse. + EXPECT_EQ(0, callback_count_); + EXPECT_FALSE(characteristic1_->WriteWithoutResponse(test_vector)); + + // Test that the failed WriteWithoutReponse request does not interfere with + // the pending WriteRemoteCharacteristic request. + SimulateGattCharacteristicWrite(characteristic1_); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1, callback_count_); + EXPECT_EQ(test_vector, last_write_value_); +} + +#if defined(OS_MACOSX) +#define MAYBE_WriteWithoutResponse_PendingRead WriteWithoutResponse_PendingRead +#else +#define MAYBE_WriteWithoutResponse_PendingRead \ + DISABLED_WriteWithoutResponse_PendingRead +#endif +// Tests that WriteWithoutResponse fails when a characteristic already has a +// pending read. +// TODO(https://crbug.com/831524): Enable for other platforms once supported. +TEST_F(BluetoothRemoteGattCharacteristicTest, + MAYBE_WriteWithoutResponse_PendingRead) { + if (!PlatformSupportsLowEnergy()) { + LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; + return; + } + ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( + BluetoothRemoteGattCharacteristic::PROPERTY_READ | + BluetoothRemoteGattCharacteristic::PROPERTY_WRITE_WITHOUT_RESPONSE)); + + characteristic1_->ReadRemoteCharacteristic( + GetReadValueCallback(Call::EXPECTED), + GetGattErrorCallback(Call::NOT_EXPECTED)); + + // Explicitly make sure that the callback has not been invoked yet. Since + // ReadRemoteCharacteristic is still pending, this results in an error for + // WriteWithoutResponse. + EXPECT_EQ(0, callback_count_); + std::vector<uint8_t> test_vector = {0, 1, 2, 3, 4, 0xf, 0xf0, 0xff}; + EXPECT_FALSE(characteristic1_->WriteWithoutResponse(test_vector)); + + // Test that the failed WriteWithoutReponse request does not interfere with + // the pending ReadRemoteCharacteristic request. + SimulateGattCharacteristicRead(characteristic1_, test_vector); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1, callback_count_); + EXPECT_EQ(test_vector, last_read_value_); +} + +#if defined(OS_MACOSX) +#define MAYBE_WriteWithoutResponse_Success WriteWithoutResponse_Success +#else +#define MAYBE_WriteWithoutResponse_Success DISABLED_WriteWithoutResponse_Success +#endif +// Tests that WriteWithoutResponse indicates success if the proper conditions +// are met. +// TODO(https://crbug.com/831524): Enable for other platforms once supported. +TEST_F(BluetoothRemoteGattCharacteristicTest, + MAYBE_WriteWithoutResponse_Success) { + if (!PlatformSupportsLowEnergy()) { + LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; + return; + } + ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( + BluetoothRemoteGattCharacteristic::PROPERTY_WRITE_WITHOUT_RESPONSE)); + + std::vector<uint8_t> test_vector = {1, 2, 3, 4}; + EXPECT_TRUE(characteristic1_->WriteWithoutResponse(test_vector)); + EXPECT_EQ(test_vector, last_write_value_); +} + #if defined(OS_ANDROID) #define MAYBE_StartNotifySessionDuringDisconnect \ StartNotifySessionDuringDisconnect
diff --git a/device/bluetooth/test/fake_remote_gatt_characteristic.cc b/device/bluetooth/test/fake_remote_gatt_characteristic.cc index 31acc78..507ad64 100644 --- a/device/bluetooth/test/fake_remote_gatt_characteristic.cc +++ b/device/bluetooth/test/fake_remote_gatt_characteristic.cc
@@ -183,6 +183,16 @@ value)); } +bool FakeRemoteGattCharacteristic::WriteWithoutResponse( + base::span<const uint8_t> value) { + if (properties_ & PROPERTY_WRITE_WITHOUT_RESPONSE) { + last_written_value_.emplace(value.begin(), value.end()); + return true; + } + + return false; +} + void FakeRemoteGattCharacteristic::SubscribeToNotifications( device::BluetoothRemoteGattDescriptor* ccc_descriptor, const base::Closure& callback,
diff --git a/device/bluetooth/test/fake_remote_gatt_characteristic.h b/device/bluetooth/test/fake_remote_gatt_characteristic.h index a4b0cc0b..a952d43 100644 --- a/device/bluetooth/test/fake_remote_gatt_characteristic.h +++ b/device/bluetooth/test/fake_remote_gatt_characteristic.h
@@ -92,6 +92,7 @@ void WriteRemoteCharacteristic(const std::vector<uint8_t>& value, const base::Closure& callback, const ErrorCallback& error_callback) override; + bool WriteWithoutResponse(base::span<const uint8_t> value) override; protected: // device::BluetoothRemoteGattCharacteristic overrides:
diff --git a/device/fido/authenticator_selection_criteria.h b/device/fido/authenticator_selection_criteria.h index 7f2c3cb..82d22d07 100644 --- a/device/fido/authenticator_selection_criteria.h +++ b/device/fido/authenticator_selection_criteria.h
@@ -6,6 +6,7 @@ #define DEVICE_FIDO_AUTHENTICATOR_SELECTION_CRITERIA_H_ #include "base/component_export.h" +#include "device/fido/fido_constants.h" namespace device { @@ -20,12 +21,6 @@ kCrossPlatform, }; - enum class UserVerificationRequirement { - kRequired, - kPreferred, - kDiscouraged, - }; - AuthenticatorSelectionCriteria(); AuthenticatorSelectionCriteria( AuthenticatorAttachment authenticator_attachement,
diff --git a/device/fido/ctap_get_assertion_request.cc b/device/fido/ctap_get_assertion_request.cc index 9f8762b..9e3dfc1 100644 --- a/device/fido/ctap_get_assertion_request.cc +++ b/device/fido/ctap_get_assertion_request.cc
@@ -54,11 +54,22 @@ } cbor::CBORValue::MapValue option_map; - option_map[cbor::CBORValue(kUserPresenceMapKey)] = - cbor::CBORValue(user_presence_required_); - option_map[cbor::CBORValue(kUserVerificationMapKey)] = - cbor::CBORValue(user_verification_required_); - cbor_map[cbor::CBORValue(7)] = cbor::CBORValue(std::move(option_map)); + + // User presence is required by default. + if (!user_presence_required_) { + option_map[cbor::CBORValue(kUserPresenceMapKey)] = + cbor::CBORValue(user_presence_required_); + } + + // User verification is not required by default. + if (user_verification_ == UserVerificationRequirement::kRequired) { + option_map[cbor::CBORValue(kUserVerificationMapKey)] = + cbor::CBORValue(true); + } + + if (!option_map.empty()) { + cbor_map[cbor::CBORValue(5)] = cbor::CBORValue(std::move(option_map)); + } auto serialized_param = cbor::CBORWriter::Write(cbor::CBORValue(std::move(cbor_map))); @@ -71,9 +82,9 @@ return cbor_request; } -CtapGetAssertionRequest& CtapGetAssertionRequest::SetUserVerificationRequired( - bool user_verification_required) { - user_verification_required_ = user_verification_required; +CtapGetAssertionRequest& CtapGetAssertionRequest::SetUserVerification( + UserVerificationRequirement user_verification) { + user_verification_ = user_verification; return *this; }
diff --git a/device/fido/ctap_get_assertion_request.h b/device/fido/ctap_get_assertion_request.h index a37acee..3983ceb 100644 --- a/device/fido/ctap_get_assertion_request.h +++ b/device/fido/ctap_get_assertion_request.h
@@ -13,6 +13,7 @@ #include "base/component_export.h" #include "base/macros.h" #include "base/optional.h" +#include "device/fido/fido_constants.h" #include "device/fido/public_key_credential_descriptor.h" namespace device { @@ -35,8 +36,8 @@ // https://drafts.fidoalliance.org/fido-2/latest/fido-client-to-authenticator-protocol-v2.0-wd-20180305.html#authenticatorGetAssertion std::vector<uint8_t> EncodeAsCBOR() const; - CtapGetAssertionRequest& SetUserVerificationRequired( - bool user_verfication_required); + CtapGetAssertionRequest& SetUserVerification( + UserVerificationRequirement user_verfication); CtapGetAssertionRequest& SetUserPresenceRequired(bool user_presence_required); CtapGetAssertionRequest& SetAllowList( std::vector<PublicKeyCredentialDescriptor> allow_list); @@ -48,8 +49,8 @@ return client_data_hash_; } - bool user_verification_required() const { - return user_verification_required_; + UserVerificationRequirement user_verification() const { + return user_verification_; } bool user_presence_required() const { return user_presence_required_; } @@ -67,7 +68,8 @@ private: std::string rp_id_; std::vector<uint8_t> client_data_hash_; - bool user_verification_required_ = false; + UserVerificationRequirement user_verification_ = + UserVerificationRequirement::kPreferred; bool user_presence_required_ = true; base::Optional<std::vector<PublicKeyCredentialDescriptor>> allow_list_;
diff --git a/device/fido/ctap_make_credential_request.cc b/device/fido/ctap_make_credential_request.cc index 2aa49ca..5b8049d 100644 --- a/device/fido/ctap_make_credential_request.cc +++ b/device/fido/ctap_make_credential_request.cc
@@ -59,11 +59,22 @@ } cbor::CBORValue::MapValue option_map; - option_map[cbor::CBORValue(kResidentKeyMapKey)] = - cbor::CBORValue(resident_key_supported_); - option_map[cbor::CBORValue(kUserVerificationMapKey)] = - cbor::CBORValue(user_verification_required_); - cbor_map[cbor::CBORValue(7)] = cbor::CBORValue(std::move(option_map)); + + // Resident keys are not supported by default. + if (resident_key_supported_) { + option_map[cbor::CBORValue(kResidentKeyMapKey)] = + cbor::CBORValue(resident_key_supported_); + } + + // User verification is not required by default. + if (user_verification_required_) { + option_map[cbor::CBORValue(kUserVerificationMapKey)] = + cbor::CBORValue(user_verification_required_); + } + + if (!option_map.empty()) { + cbor_map[cbor::CBORValue(7)] = cbor::CBORValue(std::move(option_map)); + } auto serialized_param = cbor::CBORWriter::Write(cbor::CBORValue(std::move(cbor_map)));
diff --git a/device/fido/ctap_request_unittest.cc b/device/fido/ctap_request_unittest.cc index cde4643c..40b6f1d 100644 --- a/device/fido/ctap_request_unittest.cc +++ b/device/fido/ctap_request_unittest.cc
@@ -185,11 +185,11 @@ // "public-key" 0x70, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x2D, 0x6B, 0x65, 0x79, - 0x07, // unsigned(7) - options + 0x05, // unsigned(5) - options 0xa2, // map(2) 0x62, // text(2) 0x75, 0x70, // "up" - 0xf5, // True(21) + 0xf4, // False(20) 0x62, // text(2) 0x75, 0x76, // "uv" 0xf5 // True(21) @@ -219,8 +219,8 @@ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03})); get_assertion_req.SetAllowList(std::move(allowed_list)) - .SetUserPresenceRequired(true) - .SetUserVerificationRequired(true); + .SetUserPresenceRequired(false) + .SetUserVerification(UserVerificationRequirement::kRequired); auto serialized_data = get_assertion_req.EncodeAsCBOR(); EXPECT_THAT(serialized_data, ::testing::ElementsAreArray(kSerializedRequest));
diff --git a/device/fido/fido_ble_connection.cc b/device/fido/fido_ble_connection.cc index 2ab0ca5..093901a27 100644 --- a/device/fido/fido_ble_connection.cc +++ b/device/fido/fido_ble_connection.cc
@@ -213,10 +213,19 @@ return; } - auto copyable_callback = base::AdaptCallbackForRepeating(std::move(callback)); - control_point->WriteRemoteCharacteristic( - data, base::Bind(OnWrite, copyable_callback), - base::Bind(OnWriteError, copyable_callback)); + // Attempt a write without response for performance reasons. Fall back to a + // confirmed write in case of failure, e.g. when the characteristic does not + // provide the required property. + if (control_point->WriteWithoutResponse(data)) { + DVLOG(2) << "Write without response succeeded."; + std::move(callback).Run(true); + } else { + auto copyable_callback = + base::AdaptCallbackForRepeating(std::move(callback)); + control_point->WriteRemoteCharacteristic( + data, base::Bind(OnWrite, copyable_callback), + base::Bind(OnWriteError, copyable_callback)); + } } void FidoBleConnection::WriteServiceRevision(ServiceRevision service_revision,
diff --git a/device/fido/fido_ble_frames.cc b/device/fido/fido_ble_frames.cc index 9b54d32..1f042531 100644 --- a/device/fido/fido_ble_frames.cc +++ b/device/fido/fido_ble_frames.cc
@@ -10,6 +10,7 @@ #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "device/fido/fido_constants.h" +#include "device/fido/u2f_parsing_utils.h" namespace device { @@ -70,15 +71,11 @@ base::queue<FidoBleFrameContinuationFragment> other_fragments; data_view = data_view.subspan(init_fragment_size); - while (!data_view.empty()) { - // Subtract 1 to account for SEQ byte. - const size_t cont_fragment_size = - std::min(max_fragment_size - 1, data_view.size()); + // Subtract 1 to account for SEQ byte. + for (auto cont_data : + u2f_parsing_utils::SplitSpan(data_view, max_fragment_size - 1)) { // High bit must stay cleared. - other_fragments.emplace(data_view.first(cont_fragment_size), - other_fragments.size() & 0x7F); - - data_view = data_view.subspan(cont_fragment_size); + other_fragments.emplace(cont_data, other_fragments.size() & 0x7F); } return {initial_fragment, std::move(other_fragments)};
diff --git a/device/fido/fido_constants.h b/device/fido/fido_constants.h index 5c4fd95..3ec3d1d 100644 --- a/device/fido/fido_constants.h +++ b/device/fido/fido_constants.h
@@ -203,6 +203,15 @@ enum class CredentialType { kPublicKey }; +// User verification constraint passed on from the relying party as a parameter +// for AuthenticatorSelectionCriteria and for CtapGetAssertion request. +// https://w3c.github.io/webauthn/#enumdef-userverificationrequirement +enum class UserVerificationRequirement { + kRequired, + kPreferred, + kDiscouraged, +}; + // Parameters for fake U2F registration used to check for user presence. COMPONENT_EXPORT(DEVICE_FIDO) extern const std::array<uint8_t, 32> kBogusAppParam;
diff --git a/device/fido/fido_hid_message.cc b/device/fido/fido_hid_message.cc index e2f2581..b72f86fe 100644 --- a/device/fido/fido_hid_message.cc +++ b/device/fido/fido_hid_message.cc
@@ -10,6 +10,7 @@ #include "base/memory/ptr_util.h" #include "base/numerics/safe_conversions.h" +#include "device/fido/u2f_parsing_utils.h" namespace device { @@ -135,13 +136,10 @@ std::vector<uint8_t>(init_data.begin(), init_data.end()), data.size())); data = data.subspan(init_data.size()); - while (!data.empty()) { - auto cont_data = - data.first(std::min(kHidContinuationPacketDataSize, data.size())); + for (auto cont_data : + u2f_parsing_utils::SplitSpan(data, kHidContinuationPacketDataSize)) { packets_.push_back(std::make_unique<FidoHidContinuationPacket>( - channel_id, sequence++, - std::vector<uint8_t>(cont_data.begin(), cont_data.end()))); - data = data.subspan(cont_data.size()); + channel_id, sequence++, u2f_parsing_utils::Materialize(cont_data))); } }
diff --git a/device/fido/fido_request_handler_base.cc b/device/fido/fido_request_handler_base.cc index a8ec82c6..3bc4418c 100644 --- a/device/fido/fido_request_handler_base.cc +++ b/device/fido/fido_request_handler_base.cc
@@ -62,8 +62,10 @@ void FidoRequestHandlerBase::DeviceRemoved(FidoDiscovery* discovery, FidoDevice* device) { // Device connection has been lost or device has already been removed. - // Thus, calling CancelTask() is not necessary. - DCHECK(base::ContainsKey(ongoing_tasks_, device->GetId())); + // Thus, calling CancelTask() is not necessary. Also, below + // ongoing_tasks_.erase() will have no effect for the devices that have been + // already removed due to processing error or due to invocation of + // CancelOngoingTasks(). ongoing_tasks_.erase(device->GetId()); }
diff --git a/device/fido/fido_request_handler_unittest.cc b/device/fido/fido_request_handler_unittest.cc index b8999d1..df2be6e 100644 --- a/device/fido/fido_request_handler_unittest.cc +++ b/device/fido/fido_request_handler_unittest.cc
@@ -6,6 +6,7 @@ #include <utility> #include <vector> +#include "base/numerics/safe_conversions.h" #include "base/test/scoped_task_environment.h" #include "device/fido/fake_fido_discovery.h" #include "device/fido/fido_constants.h" @@ -35,9 +36,14 @@ test::StatusAndValueCallbackReceiver<FidoReturnCode, base::Optional<std::vector<uint8_t>>>; -// Fake FidoTask implementation that treats all response from FidoDevice as -// success if the response is a non-empty vector and sends an empty byte array -// to the device when StartTask() is invoked. +enum class FakeTaskResponse : uint8_t { + kSuccess = 0x00, + kErrorReceivedAfterObtainingUserPresence = 0x01, + kProcessingError = 0x02, +}; + +// Fake FidoTask implementation that sends an empty byte array to the device +// when StartTask() is invoked. class FakeFidoTask : public FidoTask { public: FakeFidoTask(FidoDevice* device, FakeTaskCallback callback) @@ -50,25 +56,26 @@ weak_factory_.GetWeakPtr())); } - // Fake callback that treats all response with non-empty |device_response| as - // a successful response, empty (not base::nullopt) response as an error - // received after obtaining user presence, and base::nullopt as a device - // processing error. - // TODO(hongjunchoi): Change criteria for deciding when to return success, - // UP-verified error, or processing error for readability. void CompletionCallback( base::Optional<std::vector<uint8_t>> device_response) { - if (!device_response) { - std::move(callback_).Run(CtapDeviceResponseCode::kCtap2ErrOther, - base::nullopt); - return; - } + DCHECK(device_response && device_response->size() == 1); + switch (static_cast<FakeTaskResponse>(device_response->front())) { + case FakeTaskResponse::kSuccess: + std::move(callback_).Run(CtapDeviceResponseCode::kSuccess, + std::vector<uint8_t>()); + return; - device_response->empty() - ? std::move(callback_).Run( - CtapDeviceResponseCode::kCtap2ErrNoCredentials, base::nullopt) - : std::move(callback_).Run(CtapDeviceResponseCode::kSuccess, - std::vector<uint8_t>()); + case FakeTaskResponse::kErrorReceivedAfterObtainingUserPresence: + std::move(callback_).Run(CtapDeviceResponseCode::kCtap2ErrNoCredentials, + std::vector<uint8_t>()); + return; + + case FakeTaskResponse::kProcessingError: + default: + std::move(callback_).Run(CtapDeviceResponseCode::kCtap2ErrOther, + base::nullopt); + return; + } } private: @@ -99,8 +106,16 @@ }; std::vector<uint8_t> CreateFakeSuccessDeviceResponse() { - return std::vector<uint8_t>{ - base::strict_cast<uint8_t>(CtapDeviceResponseCode::kSuccess)}; + return {base::strict_cast<uint8_t>(FakeTaskResponse::kSuccess)}; +} + +std::vector<uint8_t> CreateFakeUserPresenceVerifiedError() { + return {base::strict_cast<uint8_t>( + FakeTaskResponse::kErrorReceivedAfterObtainingUserPresence)}; +} + +std::vector<uint8_t> CreateFakeDeviceProcesssingError() { + return {base::strict_cast<uint8_t>(FakeTaskResponse::kProcessingError)}; } } // namespace @@ -136,7 +151,7 @@ auto device = std::make_unique<MockFidoDevice>(); EXPECT_CALL(*device, GetId()).WillRepeatedly(testing::Return("device0")); - // Device returns success (non-empty vector) response. + // Device returns success response. device->ExpectRequestAndRespondWith(std::vector<uint8_t>(), CreateFakeSuccessDeviceResponse()); @@ -212,7 +227,6 @@ auto device0 = std::make_unique<MockFidoDevice>(); device0->set_supported_protocol(ProtocolVersion::kCtap); EXPECT_CALL(*device0, GetId()).WillRepeatedly(testing::Return("device0")); - // Device responds successfully after short delay. device0->ExpectRequestAndRespondWith(std::vector<uint8_t>(), CreateFakeSuccessDeviceResponse(), base::TimeDelta::FromMicroseconds(1)); @@ -221,9 +235,7 @@ // delay. auto device1 = std::make_unique<MockFidoDevice>(); device1->set_supported_protocol(ProtocolVersion::kCtap); - EXPECT_CALL(*device1, GetId()).WillRepeatedly(testing::Return("device1")); - // Returns success response after long delay. device1->ExpectRequestAndRespondWith(std::vector<uint8_t>(), CreateFakeSuccessDeviceResponse(), base::TimeDelta::FromMicroseconds(10)); @@ -249,31 +261,29 @@ auto request_handler = CreateFakeHandler(); discovery()->WaitForCallToStartAndSimulateSuccess(); - // Represents a connected device that immediately responds with processing + // Represents a connected device that immediately responds with a processing // error. auto device0 = std::make_unique<MockFidoDevice>(); EXPECT_CALL(*device0, GetId()).WillRepeatedly(testing::Return("device0")); - // Responds with base::nullopt which represents a processing error. - device0->ExpectRequestAndRespondWith(std::vector<uint8_t>(), base::nullopt); + device0->ExpectRequestAndRespondWith(std::vector<uint8_t>(), + CreateFakeDeviceProcesssingError()); - // Represents a device that returns UP verified failure response after a small - // time delay. + // Represents a device that returns an UP verified failure response after a + // small time delay. auto device1 = std::make_unique<MockFidoDevice>(); EXPECT_CALL(*device1, GetId()).WillRepeatedly(testing::Return("device1")); - device1->ExpectRequestAndRespondWith( - std::vector<uint8_t>(), - // Responds with an empty vector that represents a UP-verified error. - std::vector<uint8_t>(), base::TimeDelta::FromMicroseconds(1)); + device1->ExpectRequestAndRespondWith(std::vector<uint8_t>(), + CreateFakeUserPresenceVerifiedError(), + base::TimeDelta::FromMicroseconds(1)); - // Represents a device that returns UP verified failure response after a big - // time delay. + // Represents a device that returns an UP verified failure response after a + // big time delay. auto device2 = std::make_unique<MockFidoDevice>(); device2->set_supported_protocol(ProtocolVersion::kCtap); EXPECT_CALL(*device2, GetId()).WillRepeatedly(testing::Return("device2")); - device2->ExpectRequestAndRespondWith( - std::vector<uint8_t>(), - // Responds with an empty vector that represents a UP-verified error. - std::vector<uint8_t>(), base::TimeDelta::FromMicroseconds(10)); + device2->ExpectRequestAndRespondWith(std::vector<uint8_t>(), + CreateFakeDeviceProcesssingError(), + base::TimeDelta::FromMicroseconds(10)); EXPECT_CALL(*device2, Cancel()); discovery()->AddDevice(std::move(device0));
diff --git a/device/fido/fido_task.cc b/device/fido/fido_task.cc index e210b320..4c3138d 100644 --- a/device/fido/fido_task.cc +++ b/device/fido/fido_task.cc
@@ -7,7 +7,6 @@ #include <utility> #include "base/bind.h" -#include "base/bind_helpers.h" #include "base/threading/sequenced_task_runner_handle.h" #include "device/fido/ctap_empty_authenticator_request.h" #include "device/fido/device_response_converter.h"
diff --git a/device/fido/get_assertion_task.cc b/device/fido/get_assertion_task.cc index d38b665..282d96b 100644 --- a/device/fido/get_assertion_task.cc +++ b/device/fido/get_assertion_task.cc
@@ -46,6 +46,12 @@ } void GetAssertionTask::GetAssertion() { + if (!CheckUserVerificationCompatible()) { + std::move(callback_).Run(CtapDeviceResponseCode::kCtap2ErrOther, + base::nullopt); + return; + } + device()->DeviceTransact( request_.EncodeAsCBOR(), base::BindOnce(&GetAssertionTask::OnCtapGetAssertionResponseReceived, @@ -126,4 +132,33 @@ std::move(callback_).Run(response_code, std::move(parsed_response)); } +bool GetAssertionTask::CheckUserVerificationCompatible() { + DCHECK(device()->device_info()); + const auto uv_availability = + device()->device_info()->options().user_verification_availability(); + + switch (request_.user_verification()) { + case UserVerificationRequirement::kRequired: + return uv_availability == + AuthenticatorSupportedOptions::UserVerificationAvailability:: + kSupportedAndConfigured; + + case UserVerificationRequirement::kDiscouraged: + return true; + + case UserVerificationRequirement::kPreferred: + if (uv_availability == + AuthenticatorSupportedOptions::UserVerificationAvailability:: + kSupportedAndConfigured) { + request_.SetUserVerification(UserVerificationRequirement::kRequired); + } else { + request_.SetUserVerification(UserVerificationRequirement::kDiscouraged); + } + return true; + } + + NOTREACHED(); + return false; +} + } // namespace device
diff --git a/device/fido/get_assertion_task.h b/device/fido/get_assertion_task.h index 5d25f7b..22ef34e 100644 --- a/device/fido/get_assertion_task.h +++ b/device/fido/get_assertion_task.h
@@ -63,6 +63,17 @@ bool CheckRequirementsOnReturnedCredentialId( const AuthenticatorGetAssertionResponse& response); + // Checks UserVerificationRequirement enum passed from the relying party + // is compatible with the authenticator using the following logic: + // - If UserVerificationRequirement is set to kRequired, user verification + // option parameter should be set to true. + // - If UserVerificationRequirement is set to kPreferred, user verification + // option is set to true only if the authenticator supports UV. + // - If UserVerificationRequirement is set to kDiscouraged, user verification + // is set to false. + // https://w3c.github.io/webauthn/#enumdef-userverificationrequirement + bool CheckUserVerificationCompatible(); + void OnCtapGetAssertionResponseReceived( base::Optional<std::vector<uint8_t>> device_response);
diff --git a/device/fido/get_assertion_task_unittest.cc b/device/fido/get_assertion_task_unittest.cc index add60183..8c42ac9 100644 --- a/device/fido/get_assertion_task_unittest.cc +++ b/device/fido/get_assertion_task_unittest.cc
@@ -150,4 +150,26 @@ EXPECT_FALSE(get_assertion_callback_receiver().value()); } +TEST_F(FidoGetAssertionTaskTest, TestIncompatibleUserVerificationSetting) { + auto device = std::make_unique<MockFidoDevice>(); + + device->ExpectCtap2CommandAndRespondWith( + CtapRequestCommand::kAuthenticatorGetInfo, + test_data::kTestGetInfoResponseWithoutUvSupport); + + auto request = CtapGetAssertionRequest( + kRpId, u2f_parsing_utils::Materialize(kClientDataHash)); + request.SetUserVerification(UserVerificationRequirement::kRequired); + + auto task = std::make_unique<GetAssertionTask>( + device.get(), std::move(request), + get_assertion_callback_receiver().callback()); + + get_assertion_callback_receiver().WaitForCallback(); + EXPECT_EQ(device->supported_protocol(), ProtocolVersion::kCtap); + EXPECT_EQ(CtapDeviceResponseCode::kCtap2ErrOther, + get_assertion_callback_receiver().status()); + EXPECT_FALSE(get_assertion_callback_receiver().value()); +} + } // namespace device
diff --git a/device/fido/make_credential_task.cc b/device/fido/make_credential_task.cc index c55eda8..824bf43 100644 --- a/device/fido/make_credential_task.cc +++ b/device/fido/make_credential_task.cc
@@ -70,8 +70,6 @@ bool MakeCredentialTask::CheckIfAuthenticatorSelectionCriteriaAreSatisfied() { using AuthenticatorAttachment = AuthenticatorSelectionCriteria::AuthenticatorAttachment; - using UvRequirement = - AuthenticatorSelectionCriteria::UserVerificationRequirement; using UvAvailability = AuthenticatorSupportedOptions::UserVerificationAvailability; @@ -81,7 +79,7 @@ if (!device_info) { return !authenticator_selection_criteria_.require_resident_key() && authenticator_selection_criteria_.user_verification_requirement() != - UvRequirement::kRequired && + UserVerificationRequirement::kRequired && authenticator_selection_criteria_.authenticator_attachement() != AuthenticatorAttachment::kPlatform; } @@ -101,8 +99,14 @@ return false; } - return authenticator_selection_criteria_.user_verification_requirement() != - UvRequirement::kRequired || + const auto user_verification_requirement = + authenticator_selection_criteria_.user_verification_requirement(); + if (user_verification_requirement == UserVerificationRequirement::kRequired) { + request_parameter_.SetUserVerificationRequired(true); + } + + return user_verification_requirement != + UserVerificationRequirement::kRequired || options.user_verification_availability() == UvAvailability::kSupportedAndConfigured; }
diff --git a/device/fido/make_credential_task_unittest.cc b/device/fido/make_credential_task_unittest.cc index e3572247..78947f8 100644 --- a/device/fido/make_credential_task_unittest.cc +++ b/device/fido/make_credential_task_unittest.cc
@@ -130,8 +130,7 @@ AuthenticatorSelectionCriteria( AuthenticatorSelectionCriteria::AuthenticatorAttachment::kAny, false /* require_resident_key */, - AuthenticatorSelectionCriteria::UserVerificationRequirement:: - kRequired)); + UserVerificationRequirement::kRequired)); make_credential_callback_receiver().WaitForCallback(); EXPECT_EQ(CtapDeviceResponseCode::kCtap2ErrOther, @@ -156,8 +155,7 @@ AuthenticatorSelectionCriteria( AuthenticatorSelectionCriteria::AuthenticatorAttachment::kPlatform, false /* require_resident_key */, - AuthenticatorSelectionCriteria::UserVerificationRequirement:: - kPreferred)); + UserVerificationRequirement::kPreferred)); make_credential_callback_receiver().WaitForCallback(); EXPECT_EQ(CtapDeviceResponseCode::kCtap2ErrOther, @@ -180,8 +178,7 @@ AuthenticatorSelectionCriteria( AuthenticatorSelectionCriteria::AuthenticatorAttachment::kAny, true /* require_resident_key */, - AuthenticatorSelectionCriteria::UserVerificationRequirement:: - kPreferred)); + UserVerificationRequirement::kPreferred)); make_credential_callback_receiver().WaitForCallback(); EXPECT_EQ(CtapDeviceResponseCode::kCtap2ErrOther, @@ -207,8 +204,7 @@ AuthenticatorSelectionCriteria( AuthenticatorSelectionCriteria::AuthenticatorAttachment::kPlatform, true /* require_resident_key */, - AuthenticatorSelectionCriteria::UserVerificationRequirement:: - kRequired)); + UserVerificationRequirement::kRequired)); make_credential_callback_receiver().WaitForCallback(); EXPECT_EQ(CtapDeviceResponseCode::kSuccess, @@ -224,4 +220,24 @@ device_options.user_verification_availability()); } +TEST_F(FidoMakeCredentialTaskTest, TestIncompatibleUserVerificationSetting) { + auto device = std::make_unique<MockFidoDevice>(); + + device->ExpectCtap2CommandAndRespondWith( + CtapRequestCommand::kAuthenticatorGetInfo, + test_data::kTestGetInfoResponseWithoutUvSupport); + + const auto task = CreateMakeCredentialTaskWithAuthenticatorSelectionCriteria( + device.get(), + AuthenticatorSelectionCriteria( + AuthenticatorSelectionCriteria::AuthenticatorAttachment::kAny, + false /* require_resident_key */, + UserVerificationRequirement::kRequired)); + make_credential_callback_receiver().WaitForCallback(); + EXPECT_EQ(ProtocolVersion::kCtap, device->supported_protocol()); + EXPECT_EQ(CtapDeviceResponseCode::kCtap2ErrOther, + make_credential_callback_receiver().status()); + EXPECT_FALSE(make_credential_callback_receiver().value()); +} + } // namespace device
diff --git a/device/fido/u2f_parsing_utils.cc b/device/fido/u2f_parsing_utils.cc index c0213abd..2da8ba0 100644 --- a/device/fido/u2f_parsing_utils.cc +++ b/device/fido/u2f_parsing_utils.cc
@@ -64,5 +64,20 @@ return span.subspan(pos); } +std::vector<base::span<const uint8_t>> SplitSpan(base::span<const uint8_t> span, + size_t max_chunk_size) { + DCHECK_NE(0u, max_chunk_size); + std::vector<base::span<const uint8_t>> chunks; + const size_t num_chunks = (span.size() + max_chunk_size - 1) / max_chunk_size; + chunks.reserve(num_chunks); + while (!span.empty()) { + const size_t chunk_size = std::min(span.size(), max_chunk_size); + chunks.emplace_back(span.subspan(0, chunk_size)); + span = span.subspan(chunk_size); + } + + return chunks; +} + } // namespace u2f_parsing_utils } // namespace device
diff --git a/device/fido/u2f_parsing_utils.h b/device/fido/u2f_parsing_utils.h index 4c561530..15ca8c7f 100644 --- a/device/fido/u2f_parsing_utils.h +++ b/device/fido/u2f_parsing_utils.h
@@ -73,6 +73,14 @@ return true; } +// Partitions |span| into N = ⌈span.size() / max_chunk_size⌉ consecutive chunks. +// The first N-1 chunks are of size |max_chunk_size|, and the Nth chunk is of +// size span.size() % max_chunk_size. |max_chunk_size| must be greater than 0. +// Returns an empty vector in case |span| is empty. +COMPONENT_EXPORT(DEVICE_FIDO) +std::vector<base::span<const uint8_t>> SplitSpan(base::span<const uint8_t> span, + size_t max_chunk_size); + } // namespace u2f_parsing_utils } // namespace device
diff --git a/device/fido/u2f_parsing_utils_unittest.cc b/device/fido/u2f_parsing_utils_unittest.cc index 02791736..7dffb524 100644 --- a/device/fido/u2f_parsing_utils_unittest.cc +++ b/device/fido/u2f_parsing_utils_unittest.cc
@@ -12,6 +12,8 @@ namespace { constexpr uint8_t kOne[] = {0x01}; +constexpr uint8_t kOneTwo[] = {0x01, 0x02}; +constexpr uint8_t kTwo[] = {0x02}; constexpr uint8_t kTwoThree[] = {0x02, 0x03}; constexpr uint8_t kThree[] = {0x03}; constexpr uint8_t kOneTwoThree[] = {0x01, 0x02, 0x03}; @@ -144,5 +146,47 @@ EXPECT_THAT(array_three, ::testing::ElementsAreArray(kThree)); } +TEST(U2fParsingUtils, SplitSpan) { + std::vector<uint8_t> empty; + EXPECT_THAT(SplitSpan(empty, 1), ::testing::IsEmpty()); + EXPECT_THAT(SplitSpan(empty, 2), ::testing::IsEmpty()); + EXPECT_THAT(SplitSpan(empty, 3), ::testing::IsEmpty()); + + EXPECT_THAT(SplitSpan(kOne, 1), + ::testing::ElementsAre(::testing::ElementsAreArray(kOne))); + EXPECT_THAT(SplitSpan(kOne, 2), + ::testing::ElementsAre(::testing::ElementsAreArray(kOne))); + EXPECT_THAT(SplitSpan(kOne, 3), + ::testing::ElementsAre(::testing::ElementsAreArray(kOne))); + + EXPECT_THAT(SplitSpan(kOneTwo, 1), + ::testing::ElementsAre(::testing::ElementsAreArray(kOne), + ::testing::ElementsAreArray(kTwo))); + EXPECT_THAT(SplitSpan(kOneTwo, 2), + ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwo))); + EXPECT_THAT(SplitSpan(kOneTwo, 3), + ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwo))); + + EXPECT_THAT(SplitSpan(kOneTwoThree, 1), + ::testing::ElementsAre(::testing::ElementsAreArray(kOne), + ::testing::ElementsAreArray(kTwo), + ::testing::ElementsAreArray(kThree))); + EXPECT_THAT(SplitSpan(kOneTwoThree, 2), + ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwo), + ::testing::ElementsAreArray(kThree))); + EXPECT_THAT( + SplitSpan(kOneTwoThree, 3), + ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwoThree))); + EXPECT_THAT( + SplitSpan(kOneTwoThree, 4), + ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwoThree))); + EXPECT_THAT( + SplitSpan(kOneTwoThree, 5), + ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwoThree))); + EXPECT_THAT( + SplitSpan(kOneTwoThree, 6), + ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwoThree))); +} + } // namespace u2f_parsing_utils } // namespace device
diff --git a/docs/gpu/gpu_testing.md b/docs/gpu/gpu_testing.md index 9c401f3..71a8545 100644 --- a/docs/gpu/gpu_testing.md +++ b/docs/gpu/gpu_testing.md
@@ -143,13 +143,13 @@ CLs due to lack of hardware capacity. They are added as part of the included tryservers for code changes to certain sub-directories. -* [linux_optional_gpu_tests_rel] on the [tryserver.chromium.linux] waterfall -* [mac_optional_gpu_tests_rel] on the [tryserver.chromium.mac] waterfall -* [win_optional_gpu_tests_rel] on the [tryserver.chromium.win] waterfall +* [linux_optional_gpu_tests_rel] on the [luci.chromium.try] waterfall +* [mac_optional_gpu_tests_rel] on the [luci.chromium.try] waterfall +* [win_optional_gpu_tests_rel] on the [luci.chromium.try] waterfall -[linux_optional_gpu_tests_rel]: https://build.chromium.org/p/tryserver.chromium.linux/builders/linux_optional_gpu_tests_rel?numbuilds=200 -[mac_optional_gpu_tests_rel]: https://build.chromium.org/p/tryserver.chromium.mac/builders/mac_optional_gpu_tests_rel?numbuilds=200 -[win_optional_gpu_tests_rel]: https://build.chromium.org/p/tryserver.chromium.win/builders/win_optional_gpu_tests_rel?numbuilds=200 +[linux_optional_gpu_tests_rel]: https://ci.chromium.org/p/chromium/builders/luci.chromium.try/linux_optional_gpu_tests_rel +[mac_optional_gpu_tests_rel]: https://ci.chromium.org/p/chromium/builders/luci.chromium.try/mac_optional_gpu_tests_rel +[win_optional_gpu_tests_rel]: https://ci.chromium.org/p/chromium/builders/luci.chromium.try/win_optional_gpu_tests_rel Tryservers for the [ANGLE project] are also present on the [tryserver.chromium.angle] waterfall. These are invoked from the Gerrit user
diff --git a/extensions/browser/api/bluetooth/bluetooth_api.cc b/extensions/browser/api/bluetooth/bluetooth_api.cc index 5bbd0b9..701052b4 100644 --- a/extensions/browser/api/bluetooth/bluetooth_api.cc +++ b/extensions/browser/api/bluetooth/bluetooth_api.cc
@@ -20,6 +20,10 @@ #include "extensions/browser/event_router.h" #include "extensions/common/api/bluetooth.h" +#if defined(OS_CHROMEOS) +#include "device/bluetooth/chromeos/bluetooth_utils.h" +#endif + using content::BrowserContext; using content::BrowserThread; @@ -120,13 +124,34 @@ BluetoothGetDevicesFunction::~BluetoothGetDevicesFunction() = default; +bool BluetoothGetDevicesFunction::CreateParams() { + params_ = GetDevices::Params::Create(*args_); + return params_ != nullptr; +} + void BluetoothGetDevicesFunction::DoWork( scoped_refptr<BluetoothAdapter> adapter) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); std::unique_ptr<base::ListValue> device_list(new base::ListValue); - BluetoothAdapter::DeviceList devices = adapter->GetDevices(); + BluetoothAdapter::DeviceList devices; +#if defined(OS_CHROMEOS) + // Default filter values. + bluetooth::FilterType filter_type = bluetooth::FilterType::FILTER_TYPE_ALL; + int limit = 0; /*no limit*/ + if (params_->filter) { + filter_type = params_->filter->filter_type; + if (params_->filter->limit) + limit = *params_->filter->limit; + } + + devices = device::FilterBluetoothDeviceList( + adapter->GetDevices(), ToBluetoothDeviceFilterType(filter_type), limit); +#else + devices = adapter->GetDevices(); +#endif + for (BluetoothAdapter::DeviceList::const_iterator iter = devices.begin(); iter != devices.end(); ++iter) {
diff --git a/extensions/browser/api/bluetooth/bluetooth_api.h b/extensions/browser/api/bluetooth/bluetooth_api.h index e7af4ea..26714c42 100644 --- a/extensions/browser/api/bluetooth/bluetooth_api.h +++ b/extensions/browser/api/bluetooth/bluetooth_api.h
@@ -88,9 +88,12 @@ ~BluetoothGetDevicesFunction() override; // BluetoothExtensionFunction: + bool CreateParams() override; void DoWork(scoped_refptr<device::BluetoothAdapter> adapter) override; private: + std::unique_ptr<bluetooth::GetDevices::Params> params_; + DISALLOW_COPY_AND_ASSIGN(BluetoothGetDevicesFunction); };
diff --git a/extensions/browser/api/bluetooth/bluetooth_api_utils.cc b/extensions/browser/api/bluetooth/bluetooth_api_utils.cc index b00d2645..81851c3 100644 --- a/extensions/browser/api/bluetooth/bluetooth_api_utils.cc +++ b/extensions/browser/api/bluetooth/bluetooth_api_utils.cc
@@ -143,6 +143,20 @@ out->address = adapter.GetAddress(); } +#if defined(OS_CHROMEOS) +device::BluetoothFilterType ToBluetoothDeviceFilterType(FilterType type) { + switch (type) { + case FilterType::FILTER_TYPE_NONE: + case FilterType::FILTER_TYPE_ALL: + return device::BluetoothFilterType::ALL; + case FilterType::FILTER_TYPE_KNOWN: + return device::BluetoothFilterType::KNOWN; + default: + NOTREACHED(); + } +} +#endif + } // namespace bluetooth } // namespace api } // namespace extensions
diff --git a/extensions/browser/api/bluetooth/bluetooth_api_utils.h b/extensions/browser/api/bluetooth/bluetooth_api_utils.h index a58eb42..1cb9a633 100644 --- a/extensions/browser/api/bluetooth/bluetooth_api_utils.h +++ b/extensions/browser/api/bluetooth/bluetooth_api_utils.h
@@ -10,6 +10,10 @@ #include "device/bluetooth/bluetooth_device.h" #include "extensions/common/api/bluetooth.h" +#if defined(OS_CHROMEOS) +#include "device/bluetooth/chromeos/bluetooth_utils.h" +#endif + namespace extensions { namespace api { namespace bluetooth { @@ -23,6 +27,10 @@ void PopulateAdapterState(const device::BluetoothAdapter& adapter, AdapterState* out); +#if defined(OS_CHROMEOS) +device::BluetoothFilterType ToBluetoothDeviceFilterType(FilterType type); +#endif + } // namespace bluetooth } // namespace api } // namespace extensions
diff --git a/extensions/browser/api/declarative/rules_registry_unittest.cc b/extensions/browser/api/declarative/rules_registry_unittest.cc index ce448621..6567f16b 100644 --- a/extensions/browser/api/declarative/rules_registry_unittest.cc +++ b/extensions/browser/api/declarative/rules_registry_unittest.cc
@@ -127,15 +127,8 @@ EXPECT_EQ(kRuleId, *get_rules_4b[0]->id); // Create extension - std::unique_ptr<base::DictionaryValue> manifest = ParseDictionary( - "{" - " \"name\": \"Test\"," - " \"version\": \"1\"" - "}"); - scoped_refptr<Extension> extension = ExtensionBuilder() - .SetManifest(std::move(manifest)) - .SetID(kExtensionId) - .Build(); + scoped_refptr<Extension> extension = + ExtensionBuilder("Test").SetID(kExtensionId).Build(); registry->OnExtensionUninstalled(extension.get()); EXPECT_EQ(0u /*extensions*/ + 0u /*rules*/, registry->GetNumberOfUsedRuleIdentifiersForTesting()); @@ -189,6 +182,7 @@ "{" " \"name\": \"Test\"," " \"version\": \"1\"," + " \"manifest_version\": 2," " \"event_rules\": [" " {" " \"id\": \"000\"," @@ -269,6 +263,7 @@ "{" " \"name\": \"Test\"," " \"version\": \"1\"," + " \"manifest_version\": 2," " \"event_rules\": [{" " \"id\": \"manifest_rule_0\"," " \"event\": \"declarativeContent.onPageChanged\","
diff --git a/extensions/browser/api/power/power_api_unittest.cc b/extensions/browser/api/power/power_api_unittest.cc index 60f7459..7499039 100644 --- a/extensions/browser/api/power/power_api_unittest.cc +++ b/extensions/browser/api/power/power_api_unittest.cc
@@ -276,7 +276,7 @@ // Create a second extension that blocks system suspend. No additional // wake lock is needed; the wake lock from the first extension // already covers the behavior requested by the second extension. - scoped_refptr<Extension> extension2(ExtensionBuilder("Test").Build()); + scoped_refptr<Extension> extension2(ExtensionBuilder("Test2").Build()); ASSERT_TRUE(CallFunction(REQUEST, kSystemArgs, extension2.get())); EXPECT_EQ(NONE, manager_->PopFirstRequest());
diff --git a/extensions/browser/api/storage/settings_test_util.cc b/extensions/browser/api/storage/settings_test_util.cc index b9d34e0..7993710 100644 --- a/extensions/browser/api/storage/settings_test_util.cc +++ b/extensions/browser/api/storage/settings_test_util.cc
@@ -74,6 +74,7 @@ base::DictionaryValue manifest; manifest.SetString("name", std::string("Test extension ") + id); manifest.SetString("version", "1.0"); + manifest.SetInteger("manifest_version", 2); std::unique_ptr<base::ListValue> permissions(new base::ListValue()); for (std::set<std::string>::const_iterator it = permissions_set.begin();
diff --git a/extensions/browser/api/web_request/web_request_permissions.cc b/extensions/browser/api/web_request/web_request_permissions.cc index d3b2441..426bdc336 100644 --- a/extensions/browser/api/web_request/web_request_permissions.cc +++ b/extensions/browser/api/web_request/web_request_permissions.cc
@@ -81,7 +81,16 @@ bool IsWebUIAllowedToMakeNetworkRequests(const url::Origin& origin) { // Whitelist to work around exceptional cases. This is only used to elide a // DCHECK. - return origin.host() == "print" || origin.host() == "sync-confirmation"; + // + // If you are adding a new host to this list, please file a corresponding bug + // to track its removal. See https://crbug.com/829412 for the metabug. + return + // https://crbug.com/829414 + origin.host() == "print" || + // https://crbug.com/831812 + origin.host() == "sync-confirmation" || + // https://crbug.com/831813 + origin.host() == "inspect"; } } // namespace
diff --git a/extensions/browser/api_test_utils.cc b/extensions/browser/api_test_utils.cc index 4230911..b1537b85 100644 --- a/extensions/browser/api_test_utils.cc +++ b/extensions/browser/api_test_utils.cc
@@ -114,7 +114,12 @@ scoped_refptr<Extension> CreateEmptyExtensionWithLocation( Manifest::Location location) { std::unique_ptr<base::DictionaryValue> test_extension_value = - ParseDictionary("{\"name\": \"Test\", \"version\": \"1.0\"}"); + ParseDictionary(R"( + { + "name": "Test", + "version": "1.0", + "manifest_version": 2 + })"); return CreateExtension(location, test_extension_value.get(), std::string()); }
diff --git a/extensions/browser/api_unittest.cc b/extensions/browser/api_unittest.cc index 6aefff6..c442c39 100644 --- a/extensions/browser/api_unittest.cc +++ b/extensions/browser/api_unittest.cc
@@ -37,13 +37,7 @@ user_prefs::UserPrefs::Set(browser_context(), &testing_pref_service_); - extension_ = ExtensionBuilder() - .SetManifest(DictionaryBuilder() - .Set("name", "Test") - .Set("version", "1.0") - .Build()) - .SetLocation(Manifest::UNPACKED) - .Build(); + extension_ = ExtensionBuilder("Test").Build(); } void ApiUnitTest::TearDown() {
diff --git a/extensions/browser/app_window/app_window_geometry_cache_unittest.cc b/extensions/browser/app_window/app_window_geometry_cache_unittest.cc index a6ede95..a544b82 100644 --- a/extensions/browser/app_window/app_window_geometry_cache_unittest.cc +++ b/extensions/browser/app_window/app_window_geometry_cache_unittest.cc
@@ -27,11 +27,7 @@ // Create a very simple extension with id. scoped_refptr<Extension> CreateExtension(const std::string& id) { - return ExtensionBuilder() - .SetManifest( - DictionaryBuilder().Set("name", "test").Set("version", "0.1").Build()) - .SetID(id) - .Build(); + return ExtensionBuilder("test").SetID(id).Build(); } } // namespace @@ -126,13 +122,7 @@ base::FilePath path = browser_context()->GetPath().AppendASCII("Extensions").AppendASCII(name); scoped_refptr<Extension> extension = - ExtensionBuilder() - .SetManifest(DictionaryBuilder() - .Set("name", "test") - .Set("version", "0.1") - .Build()) - .SetPath(path) - .Build(); + ExtensionBuilder(name).SetPath(path).Build(); extension_prefs_->OnExtensionInstalled( extension.get(),
diff --git a/extensions/browser/extension_registry_unittest.cc b/extensions/browser/extension_registry_unittest.cc index 05c930b..dce8a836 100644 --- a/extensions/browser/extension_registry_unittest.cc +++ b/extensions/browser/extension_registry_unittest.cc
@@ -280,6 +280,7 @@ .SetManifest(DictionaryBuilder() .Set("name", "Test") .Set("version", kVersionString) + .Set("manifest_version", 2) .Build()) .Build(); const ExtensionId extension_id = extension->id();
diff --git a/extensions/browser/info_map_unittest.cc b/extensions/browser/info_map_unittest.cc index 331fe66..271ed11b 100644 --- a/extensions/browser/info_map_unittest.cc +++ b/extensions/browser/info_map_unittest.cc
@@ -7,6 +7,7 @@ #include "base/path_service.h" #include "content/public/test/test_browser_thread_bundle.h" #include "extensions/common/extension.h" +#include "extensions/common/extension_builder.h" #include "extensions/common/extension_paths.h" #include "extensions/common/manifest_constants.h" #include "testing/gtest/include/gtest/gtest.h" @@ -28,20 +29,7 @@ base::FilePath path; PathService::Get(DIR_TEST_DATA, &path); - base::DictionaryValue manifest; - manifest.SetString(keys::kVersion, "1.0.0.0"); - manifest.SetString(keys::kName, name); - - std::string error; - scoped_refptr<Extension> extension = - Extension::Create(path.AppendASCII(name), - Manifest::INVALID_LOCATION, - manifest, - Extension::NO_FLAGS, - &error); - EXPECT_TRUE(extension.get()) << error; - - return extension; + return ExtensionBuilder(name).SetPath(path.AppendASCII(name)).Build(); } // Test that the InfoMap handles refcounting properly.
diff --git a/extensions/browser/policy_check_unittest.cc b/extensions/browser/policy_check_unittest.cc index 7d192b4..fb19a5c 100644 --- a/extensions/browser/policy_check_unittest.cc +++ b/extensions/browser/policy_check_unittest.cc
@@ -19,6 +19,7 @@ #include "extensions/browser/test_extensions_browser_client.h" #include "extensions/common/constants.h" #include "extensions/common/extension.h" +#include "extensions/common/extension_builder.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -76,14 +77,7 @@ // Replace the MockExtensionSystemFactory set by ExtensionsTest. extensions_browser_client()->set_extension_system_factory(&factory_); - base::DictionaryValue manifest_dict; - manifest_dict.SetString("name", "dummy name"); - manifest_dict.SetString("version", "1"); - std::string error; - - extension_ = Extension::Create(base::FilePath(), Manifest::UNPACKED, - manifest_dict, Extension::NO_FLAGS, &error); - EXPECT_TRUE(extension_.get()) << error; + extension_ = ExtensionBuilder("dummy name").Build(); } protected:
diff --git a/extensions/browser/requirements_checker_unittest.cc b/extensions/browser/requirements_checker_unittest.cc index 0beb5c6..eaa5234 100644 --- a/extensions/browser/requirements_checker_unittest.cc +++ b/extensions/browser/requirements_checker_unittest.cc
@@ -56,6 +56,7 @@ void CreateExtension() { manifest_dict_->SetString("name", "dummy name"); manifest_dict_->SetString("version", "1"); + manifest_dict_->SetInteger("manifest_version", 2); std::string error; extension_ =
diff --git a/extensions/browser/runtime_data_unittest.cc b/extensions/browser/runtime_data_unittest.cc index 1bd5baa6..14b4387 100644 --- a/extensions/browser/runtime_data_unittest.cc +++ b/extensions/browser/runtime_data_unittest.cc
@@ -19,13 +19,12 @@ // Creates a very simple extension with a background page. scoped_refptr<Extension> CreateExtensionWithBackgroundPage() { - return ExtensionBuilder() - .SetManifest(DictionaryBuilder() - .Set("name", "test") - .Set("version", "0.1") - .Set("background", - DictionaryBuilder().Set("page", "bg.html").Build()) - .Build()) + return ExtensionBuilder("test") + .MergeManifest( + DictionaryBuilder() + .Set("background", + DictionaryBuilder().Set("page", "bg.html").Build()) + .Build()) .SetID("id2") .Build(); }
diff --git a/extensions/common/api/bluetooth.idl b/extensions/common/api/bluetooth.idl index b5523dc..ca72e77 100644 --- a/extensions/common/api/bluetooth.idl +++ b/extensions/common/api/bluetooth.idl
@@ -13,6 +13,9 @@ joystick, gamepad, keyboard, mouse, tablet, keyboardMouseCombo}; + // Types for filtering bluetooth devices. + enum FilterType {all, known}; + // Information about the state of the Bluetooth adapter. dictionary AdapterState { // The address of the adapter, in the format 'XX:XX:XX:XX:XX:XX'. @@ -82,13 +85,22 @@ // The received signal strength, in dBm. This field is avaliable and valid // only during discovery. Outside of discovery it's value is not specified. long? inquiryRssi; - + // The transmitted power level. This field is avaliable only for LE devices // that include this field in AD. It is avaliable and valid only during // discovery. long? inquiryTxPower; }; + dictionary BluetoothFilter { + // Type of filter to apply to the device list. Default is all. + FilterType? filterType; + + // Maximum number of bluetoth devices to return. Default is 0 (no limit) + // if unspecified. + long? limit; + }; + // Callback from the <code>getDevice</code> method. // |deviceInfo| : Object containing the device information. callback GetDeviceCallback = void(Device deviceInfo); @@ -117,8 +129,13 @@ // Get a list of Bluetooth devices known to the system, including paired // and recently discovered devices. + // |filter|: Some criteria to filter the list of returned bluetooth devices. + // If the filter is not set or set to <code>{}</code>, returned device list + // will contain all bluetooth devices. Right now this is only supported in + // ChromeOS, for other platforms, a full list is returned. // |callback| : Called when the search is completed. - static void getDevices(GetDevicesCallback callback); + static void getDevices(optional BluetoothFilter filter, + GetDevicesCallback callback); // Start discovery. Newly discovered devices will be returned via the // onDeviceAdded event. Previously discovered devices already known to
diff --git a/extensions/common/api/declarative/declarative_manifest_unittest.cc b/extensions/common/api/declarative/declarative_manifest_unittest.cc index cacfa73..e6d0066 100644 --- a/extensions/common/api/declarative/declarative_manifest_unittest.cc +++ b/extensions/common/api/declarative/declarative_manifest_unittest.cc
@@ -39,6 +39,7 @@ "{" " \"name\": \"Test\"," " \"version\": \"1\"," + " \"manifest_version\": 2," " \"event_rules\": [" " {" " \"event\": \"declarativeContent.onPageChanged\"," @@ -61,6 +62,7 @@ "{" " \"name\": \"Test\"," " \"version\": \"1\"," + " \"manifest_version\": 2," " \"event_rules\": [" " {" " \"event\": \"declarativeContent.onPageChanged\"," @@ -81,6 +83,7 @@ "{" " \"name\": \"Test\"," " \"version\": \"1\"," + " \"manifest_version\": 2," " \"event_rules\": [" " {" " \"event\": \"declarativeContent.onPageChanged\"," @@ -102,6 +105,7 @@ "{" " \"name\": \"Test\"," " \"version\": \"1\"," + " \"manifest_version\": 2," " \"event_rules\": [" " {" " \"event\": \"declarativeContent.onPageChanged\"," @@ -123,6 +127,7 @@ "{" " \"name\": \"Test\"," " \"version\": \"1\"," + " \"manifest_version\": 2," " \"event_rules\": {}" "}"); ManifestData manifest(std::move(manifest_data), "test"); @@ -135,6 +140,7 @@ "{" " \"name\": \"Test\"," " \"version\": \"1\"," + " \"manifest_version\": 2," " \"event_rules\": [0,1,2]" "}"); ManifestData manifest(std::move(manifest_data), "test"); @@ -147,6 +153,7 @@ "{" " \"name\": \"Test\"," " \"version\": \"1\"," + " \"manifest_version\": 2," " \"event_rules\": [" " {" " \"actions\": [{" @@ -169,6 +176,7 @@ "{" " \"name\": \"Test\"," " \"version\": \"1\"," + " \"manifest_version\": 2," " \"event_rules\": [" " {" " \"event\": \"declarativeContent.onPageChanged\""
diff --git a/extensions/common/extension_set_unittest.cc b/extensions/common/extension_set_unittest.cc index 88d0170..8e131206 100644 --- a/extensions/common/extension_set_unittest.cc +++ b/extensions/common/extension_set_unittest.cc
@@ -32,6 +32,7 @@ base::DictionaryValue manifest; manifest.SetString("name", name); manifest.SetString("version", "1"); + manifest.SetInteger("manifest_version", 2); if (!launch_url.empty()) manifest.SetString("app.launch.web_url", launch_url);
diff --git a/extensions/common/file_util_unittest.cc b/extensions/common/file_util_unittest.cc index 9b4912a..c7801a5 100644 --- a/extensions/common/file_util_unittest.cc +++ b/extensions/common/file_util_unittest.cc
@@ -349,7 +349,7 @@ std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); value->SetString("name", "test"); value->SetString("version", "1"); - value->SetInteger("manifest_version", 1); + value->SetInteger("manifest_version", 2); base::ListValue* scripts = value->SetList("background.scripts", std::make_unique<base::ListValue>());
diff --git a/extensions/common/value_builder.cc b/extensions/common/value_builder.cc index c0d831ab..cce008f 100644 --- a/extensions/common/value_builder.cc +++ b/extensions/common/value_builder.cc
@@ -28,6 +28,11 @@ } DictionaryBuilder& DictionaryBuilder::Set(const std::string& path, + const char* in_value) { + return Set(path, std::string(in_value)); +} + +DictionaryBuilder& DictionaryBuilder::Set(const std::string& path, int in_value) { dict_->SetWithoutPathExpansion(path, std::make_unique<base::Value>(in_value)); return *this; @@ -81,6 +86,10 @@ return *this; } +ListBuilder& ListBuilder::Append(const char* in_value) { + return Append(std::string(in_value)); +} + ListBuilder& ListBuilder::Append(const std::string& in_value) { list_->AppendString(in_value); return *this;
diff --git a/extensions/common/value_builder.h b/extensions/common/value_builder.h index 4b4061bf..a01af35 100644 --- a/extensions/common/value_builder.h +++ b/extensions/common/value_builder.h
@@ -53,14 +53,21 @@ // times as you like. std::string ToJSON() const; + // TODO(lazyboy): Switch |path| to base::StringPiece, just like base::Value's + // parameters. DictionaryBuilder& Set(const std::string& path, int in_value); DictionaryBuilder& Set(const std::string& path, double in_value); + DictionaryBuilder& Set(const std::string& path, const char* in_value); DictionaryBuilder& Set(const std::string& path, const std::string& in_value); DictionaryBuilder& Set(const std::string& path, const base::string16& in_value); DictionaryBuilder& Set(const std::string& path, std::unique_ptr<base::Value> in_value); + // WARNING: This is not defined (intentional). Linking will fail. Use + // SetBoolean for now. + // TODO(lazyboy): Define this and remove SetBoolean(). + DictionaryBuilder& Set(const std::string& path, bool in_value) = delete; // Named differently because overload resolution is too eager to // convert implicitly to bool. DictionaryBuilder& SetBoolean(const std::string& path, bool in_value); @@ -80,10 +87,15 @@ ListBuilder& Append(int in_value); ListBuilder& Append(double in_value); + ListBuilder& Append(const char* in_value); ListBuilder& Append(const std::string& in_value); ListBuilder& Append(const base::string16& in_value); ListBuilder& Append(std::unique_ptr<base::Value> in_value); + // WARNING: This is not defined (intentional). Linking will fail. Use + // AppendBoolean for now. + // TODO(lazyboy): Define this and remove AppendBoolean(). + ListBuilder& Append(bool in_value) = delete; // Named differently because overload resolution is too eager to // convert implicitly to bool. ListBuilder& AppendBoolean(bool in_value);
diff --git a/extensions/shell/browser/api/identity/identity_api_unittest.cc b/extensions/shell/browser/api/identity/identity_api_unittest.cc index 342e831..67567dc 100644 --- a/extensions/shell/browser/api/identity/identity_api_unittest.cc +++ b/extensions/shell/browser/api/identity/identity_api_unittest.cc
@@ -11,6 +11,7 @@ #include "base/values.h" #include "extensions/browser/api_unittest.h" #include "extensions/common/extension_builder.h" +#include "extensions/common/value_builder.h" #include "extensions/shell/browser/shell_oauth2_token_service.h" #include "google_apis/gaia/oauth2_mint_token_flow.h" @@ -61,25 +62,16 @@ // testing::Test: void SetUp() override { ApiUnitTest::SetUp(); + DictionaryBuilder oauth2; + oauth2.Set("client_id", "123456.apps.googleusercontent.com") + .Set("scopes", ListBuilder() + .Append("https://www.googleapis.com/auth/drive") + .Build()); // Create an extension with OAuth2 scopes. set_extension( - ExtensionBuilder() - .SetManifest( - DictionaryBuilder() - .Set("name", "Test") - .Set("version", "1.0") - .Set("oauth2", - DictionaryBuilder() - .Set("client_id", - "123456.apps.googleusercontent.com") - .Set("scopes", - ListBuilder() - .Append("https://www.googleapis.com/" - "auth/drive") - .Build()) - .Build()) - .Build()) - .SetLocation(Manifest::UNPACKED) + ExtensionBuilder("Test") + .MergeManifest( + DictionaryBuilder().Set("oauth2", oauth2.Build()).Build()) .Build()); } };
diff --git a/extensions/shell/browser/system_logs/shell_system_logs_fetcher_unittest.cc b/extensions/shell/browser/system_logs/shell_system_logs_fetcher_unittest.cc index fb5b493..991b78f 100644 --- a/extensions/shell/browser/system_logs/shell_system_logs_fetcher_unittest.cc +++ b/extensions/shell/browser/system_logs/shell_system_logs_fetcher_unittest.cc
@@ -33,11 +33,8 @@ scoped_refptr<Extension> BuildExtension(const std::string& name, const std::string& version, const std::string& id) { - return ExtensionBuilder() - .SetManifest(DictionaryBuilder() - .Set("name", name) - .Set("version", version) - .Build()) + return ExtensionBuilder(name) + .MergeManifest(DictionaryBuilder().Set("version", version).Build()) .SetID(id) .Build(); }
diff --git a/gpu/PRESUBMIT.py b/gpu/PRESUBMIT.py index 02d4977..f30a616 100644 --- a/gpu/PRESUBMIT.py +++ b/gpu/PRESUBMIT.py
@@ -25,7 +25,7 @@ [ 'luci.chromium.try:linux_optional_gpu_tests_rel', 'luci.chromium.try:mac_optional_gpu_tests_rel', - 'master.tryserver.chromium.win:win_optional_gpu_tests_rel', + 'luci.chromium.try:win_optional_gpu_tests_rel', 'luci.chromium.try:android_optional_gpu_tests_rel', ], 'Automatically added optional GPU tests to run on CQ.')
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index 057046e..3b851d6 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -1782,13 +1782,6 @@ return; } - Texture* texture = texture_ref->texture(); - if (texture->IsImmutable()) { - LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "BindTexImage2DCHROMIUM", - "texture is immutable"); - return; - } - Texture::ImageState image_state = Texture::UNBOUND; {
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm index 37d3b95..9e74818 100644 --- a/ios/chrome/browser/passwords/password_controller.mm +++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -16,6 +16,7 @@ #include "base/json/json_writer.h" #import "base/mac/bind_objc_block.h" #include "base/mac/foundation_util.h" +#include "base/metrics/histogram_macros.h" #include "base/strings/string16.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" @@ -76,6 +77,16 @@ // Types of password infobars to display. enum class PasswordInfoBarType { SAVE, UPDATE }; +// Types of password suggestion in the keyboard accessory. Used for metrics +// collection. +enum class PasswordSuggestionType { + // Credentials are listed. + CREDENTIALS = 0, + // Only "Show All" is listed. + SHOW_ALL = 1, + COUNT +}; + // Duration for notify user auto-sign in dialog being displayed. constexpr int kNotifyAutoSigninDuration = 3; // seconds @@ -85,8 +96,18 @@ // The string ' •••' appended to the username in the suggestion. NSString* const kSuggestionSuffix = @" ••••••••"; + +void LogSuggestionClicked(PasswordSuggestionType type) { + UMA_HISTOGRAM_ENUMERATION("PasswordManager.SuggestionClicked", type, + PasswordSuggestionType::COUNT); } +void LogSuggestionShown(PasswordSuggestionType type) { + UMA_HISTOGRAM_ENUMERATION("PasswordManager.SuggestionShown", type, + PasswordSuggestionType::COUNT); +} +} // namespace + @interface PasswordController () // This is set to YES as soon as the associated WebState is destroyed. @@ -170,6 +191,7 @@ bool is_password_field = [fieldType isEqualToString:@"password"]; NSMutableArray* suggestions = [NSMutableArray array]; + PasswordSuggestionType suggestion_type = PasswordSuggestionType::SHOW_ALL; if (fillData.IsSuggestionsAvailable(form_name, field_identifier, is_password_field)) { std::vector<password_manager::UsernameAndRealm> username_and_realms_ = @@ -189,6 +211,7 @@ displayDescription:origin icon:nil identifier:0]]; + suggestion_type = PasswordSuggestionType::CREDENTIALS; } } @@ -198,6 +221,7 @@ displayDescription:nil icon:nil identifier:1]]; + LogSuggestionShown(suggestion_type); return [suggestions copy]; } @@ -698,8 +722,10 @@ // Navigate to the settings list. [self.delegate displaySavedPasswordList]; completion(); + LogSuggestionClicked(PasswordSuggestionType::SHOW_ALL); return; } + LogSuggestionClicked(PasswordSuggestionType::CREDENTIALS); base::string16 value = base::SysNSStringToUTF16(suggestion.value); DCHECK([suggestion.value hasSuffix:kSuggestionSuffix]); value.erase(value.length() - kSuggestionSuffix.length);
diff --git a/ios/chrome/browser/ui/history_popup/BUILD.gn b/ios/chrome/browser/ui/history_popup/BUILD.gn index bd9001c..83008267 100644 --- a/ios/chrome/browser/ui/history_popup/BUILD.gn +++ b/ios/chrome/browser/ui/history_popup/BUILD.gn
@@ -16,6 +16,7 @@ "//base", "//ios/chrome/browser/ui", "//ios/chrome/browser/ui/commands", + "//ios/chrome/browser/ui/popup_menu:constants", "//ios/chrome/browser/ui/popup_menu:popup_menu_ui", "//ios/chrome/browser/ui/util", "//ios/chrome/common",
diff --git a/ios/chrome/browser/ui/history_popup/tab_history_view_controller.mm b/ios/chrome/browser/ui/history_popup/tab_history_view_controller.mm index e7f958c..f47235b0 100644 --- a/ios/chrome/browser/ui/history_popup/tab_history_view_controller.mm +++ b/ios/chrome/browser/ui/history_popup/tab_history_view_controller.mm
@@ -9,6 +9,7 @@ #include "base/strings/sys_string_conversions.h" #include "ios/chrome/browser/ui/commands/history_popup_commands.h" #import "ios/chrome/browser/ui/history_popup/tab_history_cell.h" +#import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h" #include "ios/chrome/browser/ui/rtl_geometry.h" #import "ios/third_party/material_components_ios/src/components/Ink/src/MaterialInk.h" #include "ios/web/public/favicon_status.h" @@ -24,9 +25,6 @@ // Visible percentage of the last visible row on the Tools menu if the // Tools menu is scrollable. const CGFloat kLastRowVisiblePercentage = 0.6; -// The collection view's a11y ID. -// TODO(crbug.com/697648): Decide better a11y behavior for this feature. -NSString* const kCollectionViewIdentifier = @"Tab History"; // Reuse identifier for cells. NSString* const kCellIdentifier = @"TabHistoryCell"; NSString* const kFooterIdentifier = @"Footer"; @@ -285,7 +283,7 @@ // Set up the UICollectionView. UICollectionView* collectionView = [self collectionView]; - collectionView.accessibilityIdentifier = kCollectionViewIdentifier; + collectionView.accessibilityIdentifier = kPopupMenuNavigationTableViewId; collectionView.backgroundColor = [UIColor whiteColor]; [collectionView registerClass:[TabHistoryCell class] forCellWithReuseIdentifier:kCellIdentifier];
diff --git a/ios/chrome/browser/ui/popup_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/BUILD.gn index 5938d2b9..63a7258 100644 --- a/ios/chrome/browser/ui/popup_menu/BUILD.gn +++ b/ios/chrome/browser/ui/popup_menu/BUILD.gn
@@ -11,6 +11,7 @@ "popup_menu_mediator.mm", ] deps = [ + ":constants", ":popup_menu_ui", "//base", "//components/bookmarks/browser", @@ -55,6 +56,7 @@ "popup_menu_view_controller.mm", ] deps = [ + ":constants", ":flags", "resources:popup_background", "resources:popup_menu_add_bookmark", @@ -94,6 +96,14 @@ ] } +source_set("constants") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "popup_menu_constants.h", + "popup_menu_constants.mm", + ] +} + source_set("unit_tests") { testonly = true
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h new file mode 100644 index 0000000..4cd6908 --- /dev/null +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h
@@ -0,0 +1,14 @@ +// 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 IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_CONSTANTS_H_ +#define IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_CONSTANTS_H_ + +#import <Foundation/Foundation.h> + +// Accessibility IDs for the table view in various kinds of popup menus. +extern NSString* const kPopupMenuToolsMenuTableViewId; +extern NSString* const kPopupMenuNavigationTableViewId; + +#endif // IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_constants.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.mm new file mode 100644 index 0000000..618de3f --- /dev/null +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.mm
@@ -0,0 +1,14 @@ +// 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. + +#import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +NSString* const kPopupMenuToolsMenuTableViewId = + @"kPopupMenuToolsMenuTableViewId"; +NSString* const kPopupMenuNavigationTableViewId = + @"kPopupMenuNavigationTableViewId";
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm index ef922f5e..b9ab9d2 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
@@ -17,6 +17,7 @@ #import "ios/chrome/browser/ui/popup_menu/cells/popup_menu_item.h" #import "ios/chrome/browser/ui/popup_menu/cells/popup_menu_navigation_item.h" #import "ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.h" +#import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h" #import "ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.h" #import "ios/chrome/browser/ui/reading_list/reading_list_menu_notification_delegate.h" #import "ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.h" @@ -297,7 +298,12 @@ _popupMenu = popupMenu; if (self.type == PopupMenuTypeToolsMenu) { - _popupMenu.tableView.accessibilityIdentifier = kToolsMenuTableViewId; + _popupMenu.tableView.accessibilityIdentifier = + kPopupMenuToolsMenuTableViewId; + } else if (self.type == PopupMenuTypeNavigationBackward || + self.type == PopupMenuTypeNavigationForward) { + _popupMenu.tableView.accessibilityIdentifier = + kPopupMenuNavigationTableViewId; } [_popupMenu setPopupMenuItems:self.items];
diff --git a/ios/chrome/browser/ui/tools_menu/BUILD.gn b/ios/chrome/browser/ui/tools_menu/BUILD.gn index 6fb7f73..4404360 100644 --- a/ios/chrome/browser/ui/tools_menu/BUILD.gn +++ b/ios/chrome/browser/ui/tools_menu/BUILD.gn
@@ -35,6 +35,7 @@ "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/coordinators:chrome_coordinators", "//ios/chrome/browser/ui/fullscreen:coordinators", + "//ios/chrome/browser/ui/popup_menu:constants", "//ios/chrome/browser/ui/popup_menu:popup_menu_ui", "//ios/chrome/browser/ui/reading_list", "//ios/chrome/browser/ui/reading_list:reading_list_ui",
diff --git a/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h b/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h index b065315..05d4d0c 100644 --- a/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h +++ b/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h
@@ -17,9 +17,6 @@ // Notification that the tools menu did dismiss. extern NSString* const kToolsMenuDidHideNotification; -// Tools menu table view ID. -extern NSString* const kToolsMenuTableViewId; - // Tools Menu item IDs. // Reload item accessibility Identifier. extern NSString* const kToolsMenuReload;
diff --git a/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.mm b/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.mm index 4bb8554..e01bae2 100644 --- a/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.mm +++ b/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.mm
@@ -18,9 +18,6 @@ NSString* const kToolsMenuDidHideNotification = @"kToolsMenuDidHideNotification"; -// Tools menu table view ID. -NSString* const kToolsMenuTableViewId = @"kToolsMenuTableViewId"; - // Tools menu item IDs. NSString* const kToolsMenuReload = @"kToolsMenuReload"; NSString* const kToolsMenuStop = @"kToolsMenuStop";
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm index bbec4d2d..23b1c94 100644 --- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm +++ b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm
@@ -17,6 +17,7 @@ #import "ios/chrome/browser/ui/animation_util.h" #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h" #import "ios/chrome/browser/ui/commands/browser_commands.h" +#import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h" #import "ios/chrome/browser/ui/reading_list/reading_list_menu_notification_delegate.h" #import "ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.h" #import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h" @@ -362,7 +363,7 @@ _menuView = [[ToolsMenuCollectionView alloc] initWithFrame:[rootView bounds] collectionViewLayout:menuItemsLayout]; [_menuView setAccessibilityLabel:l10n_util::GetNSString(IDS_IOS_TOOLS_MENU)]; - [_menuView setAccessibilityIdentifier:kToolsMenuTableViewId]; + [_menuView setAccessibilityIdentifier:kPopupMenuToolsMenuTableViewId]; [_menuView setTranslatesAutoresizingMaskIntoConstraints:NO]; [_menuView setBackgroundColor:[UIColor whiteColor]]; [_menuView setDataSource:self];
diff --git a/ios/chrome/browser/web/BUILD.gn b/ios/chrome/browser/web/BUILD.gn index 12ff25a..91ad581 100644 --- a/ios/chrome/browser/web/BUILD.gn +++ b/ios/chrome/browser/web/BUILD.gn
@@ -290,6 +290,7 @@ "//ios/chrome/browser/browser_state", "//ios/chrome/browser/ui", "//ios/chrome/browser/ui/commands", + "//ios/chrome/browser/ui/popup_menu:constants", "//ios/chrome/test:test_support", "//ios/chrome/test/app:test_support", "//ios/chrome/test/earl_grey:test_support",
diff --git a/ios/chrome/browser/web/forms_egtest.mm b/ios/chrome/browser/web/forms_egtest.mm index ca378c0e..3fc8912 100644 --- a/ios/chrome/browser/web/forms_egtest.mm +++ b/ios/chrome/browser/web/forms_egtest.mm
@@ -9,6 +9,7 @@ #include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" #include "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h" #include "ios/chrome/browser/ui/ui_util.h" #import "ios/chrome/test/app/chrome_test_util.h" #include "ios/chrome/test/app/navigation_test_util.h" @@ -159,7 +160,7 @@ block:^BOOL { NSError* error = nil; id<GREYMatcher> tabHistory = - grey_accessibilityID(@"Tab History"); + grey_accessibilityID(kPopupMenuNavigationTableViewId); [[EarlGrey selectElementWithMatcher:tabHistory] assertWithMatcher:grey_notNil() error:&error];
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn index 99fb4f3..d1ef0cf 100644 --- a/ios/chrome/test/earl_grey/BUILD.gn +++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -231,6 +231,7 @@ "//ios/chrome/browser/ui/location_bar:location_bar", "//ios/chrome/browser/ui/omnibox:omnibox_internal", "//ios/chrome/browser/ui/payments:payments_ui", + "//ios/chrome/browser/ui/popup_menu:constants", "//ios/chrome/browser/ui/settings:settings", "//ios/chrome/browser/ui/settings/cells", "//ios/chrome/browser/ui/static_content",
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm index 5c4be9a3..49e7f81 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers.mm +++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -20,6 +20,7 @@ #import "ios/chrome/browser/ui/payments/payment_request_error_view_controller.h" #import "ios/chrome/browser/ui/payments/payment_request_picker_view_controller.h" #import "ios/chrome/browser/ui/payments/payment_request_view_controller.h" +#import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h" #import "ios/chrome/browser/ui/settings/accounts_collection_view_controller.h" #import "ios/chrome/browser/ui/settings/cells/sync_switch_item.h" #import "ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.h" @@ -269,7 +270,7 @@ } id<GREYMatcher> ToolsMenuView() { - return grey_accessibilityID(kToolsMenuTableViewId); + return grey_accessibilityID(kPopupMenuToolsMenuTableViewId); } id<GREYMatcher> OKButton() {
diff --git a/ios/third_party/material_components_ios/README.chromium b/ios/third_party/material_components_ios/README.chromium index f75495df..21e885b9 100644 --- a/ios/third_party/material_components_ios/README.chromium +++ b/ios/third_party/material_components_ios/README.chromium
@@ -1,7 +1,7 @@ Name: Material Components for iOS URL: https://github.com/material-components/material-components-ios Version: 0 -Revision: 6cee78256b6c519ab026582e369676d75fdf6878 +Revision: f31cb3b806c925e898266f5350fd2ab6f7217dd8 License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/ios/web/navigation/navigation_manager_impl.mm b/ios/web/navigation/navigation_manager_impl.mm index 44a7ea9f..d49501c 100644 --- a/ios/web/navigation/navigation_manager_impl.mm +++ b/ios/web/navigation/navigation_manager_impl.mm
@@ -267,6 +267,9 @@ last_committed_url.EqualsIgnoringRef(pending_url)) { pending_item->SetIsCreatedFromHashChange(true); } + + if (params.virtual_url.is_valid()) + pending_item->SetVirtualURL(params.virtual_url); } // Add additional headers to the NavigationItem before loading it in the web
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl.mm b/ios/web/navigation/wk_based_navigation_manager_impl.mm index ed2ab4f..f73bfe8 100644 --- a/ios/web/navigation/wk_based_navigation_manager_impl.mm +++ b/ios/web/navigation/wk_based_navigation_manager_impl.mm
@@ -446,10 +446,11 @@ // For now, use RELOAD because restoring history is kind of like a reload of // the current page. params.transition_type = ui::PAGE_TRANSITION_RELOAD; - LoadURLWithParams(params); // This pending item will become the first item in the restored history. - GetPendingItemImpl()->SetVirtualURL(items[0]->GetVirtualURL()); + params.virtual_url = items[0]->GetVirtualURL(); + + LoadURLWithParams(params); } void WKBasedNavigationManagerImpl::LoadIfNecessary() {
diff --git a/ios/web/public/navigation_manager.h b/ios/web/public/navigation_manager.h index 5c2ea04..c77ba4d 100644 --- a/ios/web/public/navigation_manager.h +++ b/ios/web/public/navigation_manager.h
@@ -51,6 +51,9 @@ // The URL to load. Must be set. GURL url; + // The URL to display in Omnibox. If empty, |url| will be displayed. + GURL virtual_url; + // The referrer for the load. May be empty. Referrer referrer;
diff --git a/media/audio/PRESUBMIT.py b/media/audio/PRESUBMIT.py index a517435..401a6ae 100644 --- a/media/audio/PRESUBMIT.py +++ b/media/audio/PRESUBMIT.py
@@ -22,7 +22,7 @@ [ 'luci.chromium.try:linux_optional_gpu_tests_rel', 'luci.chromium.try:mac_optional_gpu_tests_rel', - 'master.tryserver.chromium.win:win_optional_gpu_tests_rel', + 'luci.chromium.try:win_optional_gpu_tests_rel', 'luci.chromium.try:android_optional_gpu_tests_rel', ], 'Automatically added optional GPU tests to run on CQ.')
diff --git a/media/cast/BUILD.gn b/media/cast/BUILD.gn index 5b7f5c7..07122a4 100644 --- a/media/cast/BUILD.gn +++ b/media/cast/BUILD.gn
@@ -342,6 +342,7 @@ ":sender", ":test_support", "//base", + "//base:cfi_buildflags", "//base/test:test_support", "//media:test_support", "//media/test:run_all_unittests",
diff --git a/media/cast/receiver/audio_decoder_unittest.cc b/media/cast/receiver/audio_decoder_unittest.cc index f2cc50f3..4e921997 100644 --- a/media/cast/receiver/audio_decoder_unittest.cc +++ b/media/cast/receiver/audio_decoder_unittest.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" +#include "base/cfi_buildflags.h" #include "base/macros.h" #include "base/synchronization/condition_variable.h" #include "base/synchronization/lock.h" @@ -237,6 +238,7 @@ WaitForAllAudioToBeDecoded(); } +#if !BUILDFLAG(CFI_CAST_CHECK) // https://crbug.com/831999 INSTANTIATE_TEST_CASE_P( AudioDecoderTestScenarios, AudioDecoderTest, @@ -245,6 +247,7 @@ TestScenario(CODEC_AUDIO_PCM16, 2, 48000), TestScenario(CODEC_AUDIO_OPUS, 1, 8000), TestScenario(CODEC_AUDIO_OPUS, 2, 48000))); +#endif } // namespace cast } // namespace media
diff --git a/media/filters/PRESUBMIT.py b/media/filters/PRESUBMIT.py index 3adf448..a46c3061 100644 --- a/media/filters/PRESUBMIT.py +++ b/media/filters/PRESUBMIT.py
@@ -22,7 +22,7 @@ [ 'luci.chromium.try:linux_optional_gpu_tests_rel', 'luci.chromium.try:mac_optional_gpu_tests_rel', - 'master.tryserver.chromium.win:win_optional_gpu_tests_rel', + 'luci.chromium.try:win_optional_gpu_tests_rel', 'luci.chromium.try:android_optional_gpu_tests_rel', ], 'Automatically added optional GPU tests to run on CQ.')
diff --git a/media/gpu/PRESUBMIT.py b/media/gpu/PRESUBMIT.py index 5d79d65d..c00d8905 100644 --- a/media/gpu/PRESUBMIT.py +++ b/media/gpu/PRESUBMIT.py
@@ -22,7 +22,7 @@ [ 'luci.chromium.try:linux_optional_gpu_tests_rel', 'luci.chromium.try:mac_optional_gpu_tests_rel', - 'master.tryserver.chromium.win:win_optional_gpu_tests_rel', + 'luci.chromium.try:win_optional_gpu_tests_rel', 'luci.chromium.try:android_optional_gpu_tests_rel', ], 'Automatically added optional GPU tests to run on CQ.')
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc index ecbbb33..228ce1b 100644 --- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
@@ -414,7 +414,8 @@ // All surfaces released, destroy them and dismiss all PictureBuffers. awaiting_va_surfaces_recycle_ = false; - available_va_surfaces_ = {}; + base::queue<VASurfaceID> empty; + std::swap(available_va_surfaces_, empty); vaapi_wrapper_->DestroySurfaces(); for (PictureMap::iterator iter = picture_map_.begin(); @@ -481,7 +482,8 @@ base::AutoLock auto_lock(lock_); DCHECK(picture_map_.empty()); - available_picture_buffers_ = {}; + base::queue<int32_t> empty; + std::swap(available_picture_buffers_, empty); RETURN_AND_NOTIFY_ON_FAILURE( buffers.size() >= requested_num_pics_, @@ -600,6 +602,10 @@ available_picture_buffers_.push(picture_buffer_id); TryOutputPicture(); + + decoder_thread_task_runner_->PostTask( + FROM_HERE, base::Bind(&VaapiVideoDecodeAccelerator::DecodeTask, + base::Unretained(this))); } void VaapiVideoDecodeAccelerator::FlushTask() {
diff --git a/net/BUILD.gn b/net/BUILD.gn index 24946a35..1707fb53 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -1586,6 +1586,7 @@ "socket/tcp_socket_posix.h", "socket/tcp_socket_win.cc", "socket/tcp_socket_win.h", + "socket/transport_client_socket.h", "socket/transport_client_socket_pool.cc", "socket/transport_client_socket_pool.h", "socket/udp_client_socket.cc",
diff --git a/net/data/ssl/scripts/quic-test.cnf.txt b/net/data/ssl/scripts/quic-test.cnf similarity index 99% rename from net/data/ssl/scripts/quic-test.cnf.txt rename to net/data/ssl/scripts/quic-test.cnf index 13ad8d9c..c8daaf3 100644 --- a/net/data/ssl/scripts/quic-test.cnf.txt +++ b/net/data/ssl/scripts/quic-test.cnf
@@ -1,54 +1,54 @@ -CA_DIR=out -CA_NAME=quic-test-root -HOST_NAME=test.example.com - -[ca] -default_ca = CA_root -preserve = yes - -[CA_root] -dir = ${ENV::CA_DIR} -key_size = 2048 -algo = sha256 -database = $dir/${ENV::CA_NAME}-index.txt -new_certs_dir = $dir -serial = $dir/${ENV::CA_NAME}-serial -certificate = $dir/${ENV::CA_NAME}.pem -private_key = $dir/${ENV::CA_NAME}.key -RANDFILE = $dir/.rand -default_days = 3650 -default_crl_days = 30 -default_md = sha256 -policy = policy_anything -unique_subject = no -copy_extensions = copy - -[user_cert] -basicConstraints = critical, CA:false -extendedKeyUsage = serverAuth, clientAuth -subjectAltName = DNS:${ENV::HOST_NAME} - -[ca_cert] -basicConstraints = critical, CA:true -keyUsage = critical, keyCertSign, cRLSign - -[policy_anything] -# Default signing policy -countryName = optional -stateOrProvinceName = optional -localityName = optional -organizationName = optional -organizationalUnitName = optional -commonName = optional -emailAddress = optional - -[req] -default_bits = 2048 -default_md = sha256 -string_mask = utf8only -prompt = no -encrypt_key = no -distinguished_name = req_env_dn - -[req_env_dn] -CN = ${ENV::CA_COMMON_NAME} +CA_DIR=out +CA_NAME=quic-test-root +HOST_NAME=test.example.com + +[ca] +default_ca = CA_root +preserve = yes + +[CA_root] +dir = ${ENV::CA_DIR} +key_size = 2048 +algo = sha256 +database = $dir/${ENV::CA_NAME}-index.txt +new_certs_dir = $dir +serial = $dir/${ENV::CA_NAME}-serial +certificate = $dir/${ENV::CA_NAME}.pem +private_key = $dir/${ENV::CA_NAME}.key +RANDFILE = $dir/.rand +default_days = 3650 +default_crl_days = 30 +default_md = sha256 +policy = policy_anything +unique_subject = no +copy_extensions = copy + +[user_cert] +basicConstraints = critical, CA:false +extendedKeyUsage = serverAuth, clientAuth +subjectAltName = DNS:${ENV::HOST_NAME} + +[ca_cert] +basicConstraints = critical, CA:true +keyUsage = critical, keyCertSign, cRLSign + +[policy_anything] +# Default signing policy +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = optional +emailAddress = optional + +[req] +default_bits = 2048 +default_md = sha256 +string_mask = utf8only +prompt = no +encrypt_key = no +distinguished_name = req_env_dn + +[req_env_dn] +CN = ${ENV::CA_COMMON_NAME}
diff --git a/net/dns/address_sorter_posix_unittest.cc b/net/dns/address_sorter_posix_unittest.cc index 7cd2a10..c91fcf44b 100644 --- a/net/dns/address_sorter_posix_unittest.cc +++ b/net/dns/address_sorter_posix_unittest.cc
@@ -143,13 +143,13 @@ return std::unique_ptr<DatagramClientSocket>( new TestUDPClientSocket(&mapping_)); } - std::unique_ptr<StreamSocket> CreateTransportClientSocket( + std::unique_ptr<TransportClientSocket> CreateTransportClientSocket( const AddressList&, std::unique_ptr<SocketPerformanceWatcher>, NetLog*, const NetLogSource&) override { NOTIMPLEMENTED(); - return std::unique_ptr<StreamSocket>(); + return nullptr; } std::unique_ptr<SSLClientSocket> CreateSSLClientSocket( std::unique_ptr<ClientSocketHandle>,
diff --git a/net/dns/dns_session_unittest.cc b/net/dns/dns_session_unittest.cc index e2807241..a703802 100644 --- a/net/dns/dns_session_unittest.cc +++ b/net/dns/dns_session_unittest.cc
@@ -34,13 +34,13 @@ NetLog* net_log, const NetLogSource& source) override; - std::unique_ptr<StreamSocket> CreateTransportClientSocket( + std::unique_ptr<TransportClientSocket> CreateTransportClientSocket( const AddressList& addresses, std::unique_ptr<SocketPerformanceWatcher>, NetLog*, const NetLogSource&) override { NOTIMPLEMENTED(); - return std::unique_ptr<StreamSocket>(); + return nullptr; } std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc index 0d122b2..39cb246b 100644 --- a/net/http/http_cache_unittest.cc +++ b/net/http/http_cache_unittest.cc
@@ -83,6 +83,8 @@ using CacheEntryStatus = HttpResponseInfo::CacheEntryStatus; +class WebSocketEndpointLockManager; + namespace { // Returns a simple text serialization of the given @@ -644,7 +646,8 @@ ~FakeWebSocketHandshakeStreamCreateHelper() override = default; std::unique_ptr<WebSocketHandshakeStreamBase> CreateBasicStream( std::unique_ptr<ClientSocketHandle> connect, - bool using_proxy) override { + bool using_proxy, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager) override { return nullptr; } std::unique_ptr<WebSocketHandshakeStreamBase> CreateHttp2Stream(
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc index 960daf08..3d2662a3 100644 --- a/net/http/http_network_session.cc +++ b/net/http/http_network_session.cc
@@ -36,6 +36,7 @@ #include "net/socket/client_socket_pool_manager_impl.h" #include "net/socket/next_proto.h" #include "net/socket/ssl_client_socket.h" +#include "net/socket/websocket_endpoint_lock_manager.h" #include "net/spdy/chromium/spdy_session_pool.h" namespace net { @@ -47,7 +48,8 @@ std::unique_ptr<ClientSocketPoolManager> CreateSocketPoolManager( HttpNetworkSession::SocketPoolType pool_type, const HttpNetworkSession::Context& context, - const std::string& ssl_session_cache_shard) { + const std::string& ssl_session_cache_shard, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager) { // TODO(yutak): Differentiate WebSocket pool manager and allow more // simultaneous connections for WebSockets. return std::make_unique<ClientSocketPoolManagerImpl>( @@ -59,7 +61,7 @@ context.cert_verifier, context.channel_id_service, context.transport_security_state, context.cert_transparency_verifier, context.ct_policy_enforcer, ssl_session_cache_shard, - context.ssl_config_service, pool_type); + context.ssl_config_service, websocket_endpoint_lock_manager, pool_type); } } // unnamed namespace @@ -180,6 +182,8 @@ http_auth_handler_factory_(context.http_auth_handler_factory), proxy_resolution_service_(context.proxy_resolution_service), ssl_config_service_(context.ssl_config_service), + websocket_endpoint_lock_manager_( + std::make_unique<WebSocketEndpointLockManager>()), push_delegate_(nullptr), quic_stream_factory_( context.net_log, @@ -243,9 +247,11 @@ const std::string ssl_session_cache_shard = "http_network_session/" + base::IntToString(g_next_shard_id.GetNext()); normal_socket_pool_manager_ = CreateSocketPoolManager( - NORMAL_SOCKET_POOL, context, ssl_session_cache_shard); + NORMAL_SOCKET_POOL, context, ssl_session_cache_shard, + websocket_endpoint_lock_manager_.get()); websocket_socket_pool_manager_ = CreateSocketPoolManager( - WEBSOCKET_SOCKET_POOL, context, ssl_session_cache_shard); + WEBSOCKET_SOCKET_POOL, context, ssl_session_cache_shard, + websocket_endpoint_lock_manager_.get()); if (params_.enable_http2) { next_protos_.push_back(kProtoHTTP2);
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h index 3878a2e..7c1b196 100644 --- a/net/http/http_network_session.h +++ b/net/http/http_network_session.h
@@ -67,6 +67,7 @@ class SSLConfigService; class TransportClientSocketPool; class TransportSecurityState; +class WebSocketEndpointLockManager; // Specifies the maximum HPACK dynamic table size the server is allowed to set. const uint32_t kSpdyMaxHeaderTableSize = 64 * 1024; @@ -284,6 +285,9 @@ return proxy_resolution_service_; } SSLConfigService* ssl_config_service() { return ssl_config_service_.get(); } + WebSocketEndpointLockManager* websocket_endpoint_lock_manager() { + return websocket_endpoint_lock_manager_.get(); + } SpdySessionPool* spdy_session_pool() { return &spdy_session_pool_; } QuicStreamFactory* quic_stream_factory() { return &quic_stream_factory_; } HttpAuthHandlerFactory* http_auth_handler_factory() { @@ -363,6 +367,8 @@ HttpAuthCache http_auth_cache_; SSLClientAuthCache ssl_client_auth_cache_; + std::unique_ptr<WebSocketEndpointLockManager> + websocket_endpoint_lock_manager_; std::unique_ptr<ClientSocketPoolManager> normal_socket_pool_manager_; std::unique_ptr<ClientSocketPoolManager> websocket_socket_pool_manager_; std::unique_ptr<ServerPushDelegate> push_delegate_;
diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc index a8357f0..28e6bb4d 100644 --- a/net/http/http_stream_factory_impl_job.cc +++ b/net/http/http_stream_factory_impl_job.cc
@@ -1215,7 +1215,8 @@ DCHECK(delegate_->websocket_handshake_stream_create_helper()); websocket_stream_ = delegate_->websocket_handshake_stream_create_helper() - ->CreateBasicStream(std::move(connection_), using_proxy); + ->CreateBasicStream(std::move(connection_), using_proxy, + session_->websocket_endpoint_lock_manager()); } else { stream_ = std::make_unique<HttpBasicStream>( std::move(connection_), using_proxy,
diff --git a/net/http/http_stream_factory_impl_unittest.cc b/net/http/http_stream_factory_impl_unittest.cc index ccf0051..07b156e 100644 --- a/net/http/http_stream_factory_impl_unittest.cc +++ b/net/http/http_stream_factory_impl_unittest.cc
@@ -89,6 +89,7 @@ namespace net { class BidirectionalStreamImpl; +class WebSocketEndpointLockManager; namespace { @@ -334,7 +335,8 @@ std::unique_ptr<WebSocketHandshakeStreamBase> CreateBasicStream( std::unique_ptr<ClientSocketHandle> connection, - bool using_proxy) override { + bool using_proxy, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager) override { return std::make_unique<WebSocketBasicHandshakeStream>( std::move(connection)); }
diff --git a/net/log/file_net_log_observer.cc b/net/log/file_net_log_observer.cc index 5778786..5001d4b 100644 --- a/net/log/file_net_log_observer.cc +++ b/net/log/file_net_log_observer.cc
@@ -11,6 +11,7 @@ #include "base/bind.h" #include "base/containers/queue.h" +#include "base/files/file.h" #include "base/files/file_util.h" #include "base/json/json_writer.h" #include "base/logging.h" @@ -41,31 +42,34 @@ base::TaskShutdownBehavior::BLOCK_SHUTDOWN}); } -// Opens |path| in write mode. Returns the file handle on success, or nullptr on -// failure. -base::ScopedFILE OpenFileForWrite(const base::FilePath& path) { - base::ScopedFILE result(base::OpenFile(path, "wb")); - LOG_IF(ERROR, !result) << "Failed opening: " << path.value(); +// Opens |path| in write mode. +base::File OpenFileForWrite(const base::FilePath& path) { + base::File result(path, + base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); + LOG_IF(ERROR, !result.IsValid()) << "Failed opening: " << path.value(); return result; } -// Helper that writes data to a file. The |file| handle may optionally be null, +// Helper that writes data to a file. |file->IsValid()| may be false, // in which case nothing will be written. Returns the number of bytes // successfully written (may be less than input data in case of errors). -size_t WriteToFile(FILE* file, +size_t WriteToFile(base::File* file, base::StringPiece data1, base::StringPiece data2 = base::StringPiece(), base::StringPiece data3 = base::StringPiece()) { size_t bytes_written = 0; - if (file) { + if (file->IsValid()) { // Append each of data1, data2 and data3. if (!data1.empty()) - bytes_written += fwrite(data1.data(), 1, data1.size(), file); + bytes_written += + std::max(0, file->WriteAtCurrentPos(data1.data(), data1.size())); if (!data2.empty()) - bytes_written += fwrite(data2.data(), 1, data2.size(), file); + bytes_written += + std::max(0, file->WriteAtCurrentPos(data2.data(), data2.size())); if (!data3.empty()) - bytes_written += fwrite(data3.data(), 1, data3.size(), file); + bytes_written += + std::max(0, file->WriteAtCurrentPos(data3.data(), data3.size())); } return bytes_written; @@ -74,7 +78,7 @@ // Copies all of the data at |source_path| and appends it to |destination_file|, // then deletes |source_path|. void AppendToFileThenDelete(const base::FilePath& source_path, - FILE* destination_file, + base::File* destination_file, char* read_buffer, size_t read_buffer_size) { base::ScopedFILE source_file(base::OpenFile(source_path, "rb")); @@ -247,16 +251,16 @@ // Writes |constants_value| to a file. static void WriteConstantsToFile(std::unique_ptr<base::Value> constants_value, - FILE* file); + base::File* file); // Writes |polled_data| to a file. static void WritePolledDataToFile(std::unique_ptr<base::Value> polled_data, - FILE* file); + base::File* file); // If any events were written (wrote_event_bytes_), rewinds |file| by 2 bytes // in order to overwrite the trailing ",\n" that was written by the last event // line. - void RewindIfWroteEventBytes(FILE* file) const; + void RewindIfWroteEventBytes(base::File* file) const; // Concatenates all the log files to assemble the final // |final_log_file_|. This single "stitched" file is what other @@ -264,20 +268,19 @@ void StitchFinalLogFile(); // Creates the .inprogress directory used by bounded mode. - void CreateInprogressDirectory() const; + void CreateInprogressDirectory(); // The path (and associated file handle) where the final netlog is written. In // bounded mode this is mostly written to once logging is stopped, whereas in // unbounded mode events will be directly written to it. const base::FilePath final_log_path_; - base::ScopedFILE final_log_file_; + base::File final_log_file_; - // Holds the file handle for the numbered events file where data is currently - // being written to. The file path of this file is - // GetEventFilePath(current_event_file_number_). The - // file handle may be null if an error previously occurred opening the file, - // or logging has been stopped. - base::ScopedFILE current_event_file_; + // Holds the numbered events file where data is currently being written to. + // The file path of this file is GetEventFilePath(current_event_file_number_). + // The file may be !IsValid() if an error previously occurred opening the + // file, or logging has been stopped. + base::File current_event_file_; size_t current_event_file_size_; // Indicates the total number of netlog event files allowed. @@ -488,10 +491,10 @@ if (IsBounded()) { CreateInprogressDirectory(); - base::ScopedFILE constants_file = OpenFileForWrite(GetConstantsFilePath()); - WriteConstantsToFile(std::move(constants_value), constants_file.get()); + base::File constants_file = OpenFileForWrite(GetConstantsFilePath()); + WriteConstantsToFile(std::move(constants_value), &constants_file); } else { - WriteConstantsToFile(std::move(constants_value), final_log_file_.get()); + WriteConstantsToFile(std::move(constants_value), &final_log_file_); } } @@ -501,11 +504,11 @@ // Write out the polled data. if (IsBounded()) { - base::ScopedFILE closing_file = OpenFileForWrite(GetClosingFilePath()); - WritePolledDataToFile(std::move(polled_data), closing_file.get()); + base::File closing_file = OpenFileForWrite(GetClosingFilePath()); + WritePolledDataToFile(std::move(polled_data), &closing_file); } else { - RewindIfWroteEventBytes(final_log_file_.get()); - WritePolledDataToFile(std::move(polled_data), final_log_file_.get()); + RewindIfWroteEventBytes(&final_log_file_); + WritePolledDataToFile(std::move(polled_data), &final_log_file_); } // If operating in bounded mode, the events were written to separate files @@ -515,7 +518,7 @@ StitchFinalLogFile(); // Ensure the final log file has been flushed. - final_log_file_.reset(); + final_log_file_.Close(); } void FileNetLogObserver::FileWriter::Flush( @@ -526,7 +529,7 @@ write_queue->SwapQueue(&local_file_queue); while (!local_file_queue.empty()) { - FILE* output_file; + base::File* output_file; // If in bounded mode, output events to the current event file. Otherwise // output events to the final log path. @@ -535,9 +538,9 @@ current_event_file_size_ >= max_event_file_size_) { IncrementCurrentEventFile(); } - output_file = current_event_file_.get(); + output_file = ¤t_event_file_; } else { - output_file = final_log_file_.get(); + output_file = &final_log_file_; } size_t bytes_written = @@ -556,10 +559,10 @@ void FileNetLogObserver::FileWriter::DeleteAllFiles() { DCHECK(task_runner_->RunsTasksInCurrentSequence()); - final_log_file_.reset(); + final_log_file_.Close(); if (IsBounded()) { - current_event_file_.reset(); + current_event_file_.Close(); base::DeleteFile(GetInprogressDirectory(), true); } @@ -620,7 +623,7 @@ void FileNetLogObserver::FileWriter::WriteConstantsToFile( std::unique_ptr<base::Value> constants_value, - FILE* file) { + base::File* file) { // Print constants to file and open events array. std::string json; @@ -632,7 +635,7 @@ void FileNetLogObserver::FileWriter::WritePolledDataToFile( std::unique_ptr<base::Value> polled_data, - FILE* file) { + base::File* file) { // Close the events array. WriteToFile(file, "]"); @@ -648,18 +651,19 @@ WriteToFile(file, "}\n"); } -void FileNetLogObserver::FileWriter::RewindIfWroteEventBytes(FILE* file) const { - if (file && wrote_event_bytes_) { +void FileNetLogObserver::FileWriter::RewindIfWroteEventBytes( + base::File* file) const { + if (file->IsValid() && wrote_event_bytes_) { // To be valid JSON the events array should not end with a comma. If events // were written though, they will have been terminated with "\n," so strip // it before closing the events array. - fseek(file, -2, SEEK_END); + file->Seek(base::File::FROM_END, -2); } } void FileNetLogObserver::FileWriter::StitchFinalLogFile() { // Make sure all the events files are flushed (as will read them next). - current_event_file_.reset(); + current_event_file_.Close(); // Allocate a 64K buffer used for reading the files. At most kReadBufferSize // bytes will be in memory at a time. @@ -670,7 +674,7 @@ final_log_file_ = OpenFileForWrite(final_log_path_); // Append the constants file. - AppendToFileThenDelete(GetConstantsFilePath(), final_log_file_.get(), + AppendToFileThenDelete(GetConstantsFilePath(), &final_log_file_, read_buffer.get(), kReadBufferSize); // Iterate over the events files, from oldest to most recent, and append them @@ -682,16 +686,16 @@ for (size_t filenumber = begin_filenumber; filenumber < end_filenumber; ++filenumber) { AppendToFileThenDelete(GetEventFilePath(FileNumberToIndex(filenumber)), - final_log_file_.get(), read_buffer.get(), + &final_log_file_, read_buffer.get(), kReadBufferSize); } // Account for the final event line ending in a ",\n". Strip it to form valid // JSON. - RewindIfWroteEventBytes(final_log_file_.get()); + RewindIfWroteEventBytes(&final_log_file_); // Append the polled data. - AppendToFileThenDelete(GetClosingFilePath(), final_log_file_.get(), + AppendToFileThenDelete(GetClosingFilePath(), &final_log_file_, read_buffer.get(), kReadBufferSize); // Delete the inprogress directory (and anything that may still be left inside @@ -699,13 +703,13 @@ base::DeleteFile(GetInprogressDirectory(), true); } -void FileNetLogObserver::FileWriter::CreateInprogressDirectory() const { +void FileNetLogObserver::FileWriter::CreateInprogressDirectory() { DCHECK(IsBounded()); // base::CreateDirectory() creates missing parent directories. Since the // target directory is a sibling to |final_log_path_|, if that file couldn't // be opened don't attempt to create the directory either. - if (!final_log_file_) + if (!final_log_file_.IsValid()) return; if (!base::CreateDirectory(GetInprogressDirectory())) { @@ -724,7 +728,7 @@ // stopping) however if logging does not end gracefully the comments are // useful for recovery. WriteToFile( - final_log_file_.get(), "Logging is in progress writing data to:\n ", + &final_log_file_, "Logging is in progress writing data to:\n ", in_progress_path, "\n\n" "That data will be stitched into a single file (this one) once logging\n" @@ -735,7 +739,6 @@ "\n" "https://chromium.googlesource.com/chromium/src/+/master/net/tools/" "stitch_net_log_files.py\n"); - fflush(final_log_file_.get()); } } // namespace net
diff --git a/net/socket/client_socket_factory.cc b/net/socket/client_socket_factory.cc index c84685d..c54fdf7d 100644 --- a/net/socket/client_socket_factory.cc +++ b/net/socket/client_socket_factory.cc
@@ -46,13 +46,13 @@ new UDPClientSocket(bind_type, net_log, source)); } - std::unique_ptr<StreamSocket> CreateTransportClientSocket( + std::unique_ptr<TransportClientSocket> CreateTransportClientSocket( const AddressList& addresses, std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher, NetLog* net_log, const NetLogSource& source) override { - return std::unique_ptr<StreamSocket>(new TCPClientSocket( - addresses, std::move(socket_performance_watcher), net_log, source)); + return std::make_unique<TCPClientSocket>( + addresses, std::move(socket_performance_watcher), net_log, source); } std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
diff --git a/net/socket/client_socket_factory.h b/net/socket/client_socket_factory.h index c17c342..39d14a80 100644 --- a/net/socket/client_socket_factory.h +++ b/net/socket/client_socket_factory.h
@@ -11,6 +11,7 @@ #include "net/base/net_export.h" #include "net/socket/datagram_socket.h" #include "net/socket/socket_performance_watcher.h" +#include "net/socket/transport_client_socket.h" namespace net { @@ -23,7 +24,6 @@ class SSLClientSocket; struct SSLClientSocketContext; struct SSLConfig; -class StreamSocket; // An interface used to instantiate StreamSocket objects. Used to facilitate // testing code with mock socket implementations. @@ -38,7 +38,7 @@ NetLog* net_log, const NetLogSource& source) = 0; - virtual std::unique_ptr<StreamSocket> CreateTransportClientSocket( + virtual std::unique_ptr<TransportClientSocket> CreateTransportClientSocket( const AddressList& addresses, std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher, NetLog* net_log,
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc index 3f3c08a..54f1e4e5 100644 --- a/net/socket/client_socket_pool_base_unittest.cc +++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -231,14 +231,14 @@ return std::unique_ptr<DatagramClientSocket>(); } - std::unique_ptr<StreamSocket> CreateTransportClientSocket( + std::unique_ptr<TransportClientSocket> CreateTransportClientSocket( const AddressList& addresses, std::unique_ptr< SocketPerformanceWatcher> /* socket_performance_watcher */, NetLog* /* net_log */, const NetLogSource& /*source*/) override { allocation_count_++; - return std::unique_ptr<StreamSocket>(); + return nullptr; } std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
diff --git a/net/socket/client_socket_pool_manager_impl.cc b/net/socket/client_socket_pool_manager_impl.cc index 872582e..1eb7071 100644 --- a/net/socket/client_socket_pool_manager_impl.cc +++ b/net/socket/client_socket_pool_manager_impl.cc
@@ -52,6 +52,7 @@ CTPolicyEnforcer* ct_policy_enforcer, const std::string& ssl_session_cache_shard, SSLConfigService* ssl_config_service, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager, HttpNetworkSession::SocketPoolType pool_type) : net_log_(net_log), socket_factory_(socket_factory), @@ -73,6 +74,7 @@ max_sockets_per_group(pool_type), host_resolver, socket_factory_, + websocket_endpoint_lock_manager, net_log) : new TransportClientSocketPool( max_sockets_per_pool(pool_type),
diff --git a/net/socket/client_socket_pool_manager_impl.h b/net/socket/client_socket_pool_manager_impl.h index 7946a4ed..add67d2 100644 --- a/net/socket/client_socket_pool_manager_impl.h +++ b/net/socket/client_socket_pool_manager_impl.h
@@ -41,6 +41,7 @@ class SSLConfigService; class TransportClientSocketPool; class TransportSecurityState; +class WebSocketEndpointLockManager; class NET_EXPORT_PRIVATE ClientSocketPoolManagerImpl : public ClientSocketPoolManager, @@ -59,6 +60,7 @@ CTPolicyEnforcer* ct_policy_enforcer, const std::string& ssl_session_cache_shard, SSLConfigService* ssl_config_service, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager, HttpNetworkSession::SocketPoolType pool_type); ~ClientSocketPoolManagerImpl() override;
diff --git a/net/socket/fuzzed_socket.cc b/net/socket/fuzzed_socket.cc index 0ac8a6cb..1eec23d 100644 --- a/net/socket/fuzzed_socket.cc +++ b/net/socket/fuzzed_socket.cc
@@ -150,6 +150,11 @@ return OK; } +int FuzzedSocket::Bind(const net::IPEndPoint& local_addr) { + NOTREACHED(); + return ERR_NOT_IMPLEMENTED; +} + int FuzzedSocket::Connect(const CompletionCallback& callback) { // Sockets can normally be reused, but don't support it here. DCHECK_NE(net_error_, OK);
diff --git a/net/socket/fuzzed_socket.h b/net/socket/fuzzed_socket.h index f4dcaab..9febde1 100644 --- a/net/socket/fuzzed_socket.h +++ b/net/socket/fuzzed_socket.h
@@ -14,7 +14,7 @@ #include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" #include "net/log/net_log_with_source.h" -#include "net/socket/stream_socket.h" +#include "net/socket/transport_client_socket.h" #include "net/traffic_annotation/network_traffic_annotation.h" namespace base { @@ -39,7 +39,7 @@ // reads and writes must be done in a deterministic order and for a // deterministic number of bytes, every time the fuzzer is run with the same // data. -class FuzzedSocket : public StreamSocket { +class FuzzedSocket : public TransportClientSocket { public: // |data_provider| is used as to determine behavior of the FuzzedSocket. It // must remain valid until after the FuzzedSocket is destroyed. @@ -69,7 +69,8 @@ int SetReceiveBufferSize(int32_t size) override; int SetSendBufferSize(int32_t size) override; - // StreamSocket implementation: + // TransportClientSocket implementation: + int Bind(const net::IPEndPoint& local_addr) override; int Connect(const CompletionCallback& callback) override; void Disconnect() override; bool IsConnected() const override;
diff --git a/net/socket/fuzzed_socket_factory.cc b/net/socket/fuzzed_socket_factory.cc index dfff012..a28ac314 100644 --- a/net/socket/fuzzed_socket_factory.cc +++ b/net/socket/fuzzed_socket_factory.cc
@@ -144,7 +144,8 @@ return std::make_unique<FuzzedDatagramClientSocket>(data_provider_); } -std::unique_ptr<StreamSocket> FuzzedSocketFactory::CreateTransportClientSocket( +std::unique_ptr<TransportClientSocket> +FuzzedSocketFactory::CreateTransportClientSocket( const AddressList& addresses, std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher, NetLog* net_log,
diff --git a/net/socket/fuzzed_socket_factory.h b/net/socket/fuzzed_socket_factory.h index 559d1465..081904a3 100644 --- a/net/socket/fuzzed_socket_factory.h +++ b/net/socket/fuzzed_socket_factory.h
@@ -40,7 +40,7 @@ NetLog* net_log, const NetLogSource& source) override; - std::unique_ptr<StreamSocket> CreateTransportClientSocket( + std::unique_ptr<TransportClientSocket> CreateTransportClientSocket( const AddressList& addresses, std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher, NetLog* net_log,
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc index 721f2687..9d53bf9e 100644 --- a/net/socket/socket_test_util.cc +++ b/net/socket/socket_test_util.cc
@@ -737,7 +737,7 @@ return std::move(socket); } -std::unique_ptr<StreamSocket> +std::unique_ptr<TransportClientSocket> MockClientSocketFactory::CreateTransportClientSocket( const AddressList& addresses, std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher, @@ -774,6 +774,7 @@ MockClientSocket::MockClientSocket(const NetLogWithSource& net_log) : connected_(false), net_log_(net_log), weak_factory_(this) { + local_addr_ = IPEndPoint(IPAddress(192, 0, 2, 33), 123); peer_addr_ = IPEndPoint(IPAddress(192, 0, 2, 33), 0); } @@ -785,6 +786,11 @@ return OK; } +int MockClientSocket::Bind(const net::IPEndPoint& local_addr) { + local_addr_ = local_addr; + return net::OK; +} + void MockClientSocket::Disconnect() { connected_ = false; } @@ -805,7 +811,7 @@ } int MockClientSocket::GetLocalAddress(IPEndPoint* address) const { - *address = IPEndPoint(IPAddress(192, 0, 2, 33), 123); + *address = local_addr_; return OK; } @@ -825,41 +831,6 @@ out->clear(); } -int64_t MockClientSocket::GetTotalReceivedBytes() const { - NOTIMPLEMENTED(); - return 0; -} - -void MockClientSocket::GetSSLCertRequestInfo( - SSLCertRequestInfo* cert_request_info) { -} - -int MockClientSocket::ExportKeyingMaterial(const base::StringPiece& label, - bool has_context, - const base::StringPiece& context, - unsigned char* out, - unsigned int outlen) { - memset(out, 'A', outlen); - return OK; -} - -ChannelIDService* MockClientSocket::GetChannelIDService() const { - NOTREACHED(); - return NULL; -} - -Error MockClientSocket::GetTokenBindingSignature(crypto::ECPrivateKey* key, - TokenBindingType tb_type, - std::vector<uint8_t>* out) { - NOTREACHED(); - return ERR_NOT_IMPLEMENTED; -} - -crypto::ECPrivateKey* MockClientSocket::GetChannelIDKey() const { - NOTREACHED(); - return NULL; -} - MockClientSocket::~MockClientSocket() = default; void MockClientSocket::RunCallbackAsync(const CompletionCallback& callback, @@ -1175,13 +1146,10 @@ const HostPortPair& host_port_pair, const SSLConfig& ssl_config, SSLSocketDataProvider* data) - : MockClientSocket( - // Have to use the right NetLogWithSource for LoadTimingInfo - // regression - // tests. - transport_socket->socket()->NetLog()), + : net_log_(transport_socket->socket()->NetLog()), transport_(std::move(transport_socket)), - data_(data) { + data_(data), + weak_factory_(this) { DCHECK(data_); peer_addr_ = data->connect.peer_addr; } @@ -1223,7 +1191,6 @@ } void MockSSLClientSocket::Disconnect() { - MockClientSocket::Disconnect(); if (transport_->socket() != NULL) transport_->socket()->Disconnect(); } @@ -1240,6 +1207,11 @@ return transport_->socket()->WasEverUsed(); } +int MockSSLClientSocket::GetLocalAddress(IPEndPoint* address) const { + *address = IPEndPoint(IPAddress(192, 0, 2, 33), 123); + return OK; +} + int MockSSLClientSocket::GetPeerAddress(IPEndPoint* address) const { return transport_->socket()->GetPeerAddress(address); } @@ -1262,6 +1234,32 @@ return transport_->socket()->ApplySocketTag(tag); } +const NetLogWithSource& MockSSLClientSocket::NetLog() const { + return net_log_; +} + +void MockSSLClientSocket::GetConnectionAttempts(ConnectionAttempts* out) const { + out->clear(); +} + +int64_t MockSSLClientSocket::GetTotalReceivedBytes() const { + NOTIMPLEMENTED(); + return 0; +} + +int64_t MockClientSocket::GetTotalReceivedBytes() const { + NOTIMPLEMENTED(); + return 0; +} + +int MockSSLClientSocket::SetReceiveBufferSize(int32_t size) { + return OK; +} + +int MockSSLClientSocket::SetSendBufferSize(int32_t size) { + return OK; +} + void MockSSLClientSocket::GetSSLCertRequestInfo( SSLCertRequestInfo* cert_request_info) { DCHECK(cert_request_info); @@ -1289,6 +1287,33 @@ return OK; } +int MockSSLClientSocket::ExportKeyingMaterial(const base::StringPiece& label, + bool has_context, + const base::StringPiece& context, + unsigned char* out, + unsigned int outlen) { + memset(out, 'A', outlen); + return OK; +} + +crypto::ECPrivateKey* MockSSLClientSocket::GetChannelIDKey() const { + NOTREACHED(); + return NULL; +} + +void MockSSLClientSocket::RunCallbackAsync(const CompletionCallback& callback, + int result) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&MockSSLClientSocket::RunCallback, + weak_factory_.GetWeakPtr(), callback, result)); +} + +void MockSSLClientSocket::RunCallback(const CompletionCallback& callback, + int result) { + if (!callback.is_null()) + callback.Run(result); +} + void MockSSLClientSocket::OnReadComplete(const MockRead& data) { NOTIMPLEMENTED(); } @@ -1858,26 +1883,15 @@ return transport_pool_->ReleaseSocket(group_name, std::move(socket), id); } -ScopedWebSocketEndpointZeroUnlockDelay:: - ScopedWebSocketEndpointZeroUnlockDelay() { - old_delay_ = - WebSocketEndpointLockManager::GetInstance()->SetUnlockDelayForTesting( - base::TimeDelta()); -} - -ScopedWebSocketEndpointZeroUnlockDelay:: - ~ScopedWebSocketEndpointZeroUnlockDelay() { - base::TimeDelta active_delay = - WebSocketEndpointLockManager::GetInstance()->SetUnlockDelayForTesting( - old_delay_); - EXPECT_EQ(active_delay, base::TimeDelta()); -} - WrappedStreamSocket::WrappedStreamSocket( std::unique_ptr<StreamSocket> transport) : transport_(std::move(transport)) {} WrappedStreamSocket::~WrappedStreamSocket() {} +int WrappedStreamSocket::Bind(const net::IPEndPoint& local_addr) { + NOTREACHED(); + return ERR_FAILED; +} int WrappedStreamSocket::Connect(const CompletionCallback& callback) { return transport_->Connect(callback); } @@ -1991,7 +2005,7 @@ transport_->ApplySocketTag(tag); } -std::unique_ptr<StreamSocket> +std::unique_ptr<TransportClientSocket> MockTaggingClientSocketFactory::CreateTransportClientSocket( const AddressList& addresses, std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
diff --git a/net/socket/socket_test_util.h b/net/socket/socket_test_util.h index 6a61415..97c1b1cfc 100644 --- a/net/socket/socket_test_util.h +++ b/net/socket/socket_test_util.h
@@ -21,7 +21,6 @@ #include "base/memory/weak_ptr.h" #include "base/optional.h" #include "base/strings/string16.h" -#include "base/time/time.h" #include "build/build_config.h" #include "net/base/address_list.h" #include "net/base/io_buffer.h" @@ -39,6 +38,7 @@ #include "net/socket/socks_client_socket_pool.h" #include "net/socket/ssl_client_socket.h" #include "net/socket/ssl_client_socket_pool.h" +#include "net/socket/transport_client_socket.h" #include "net/socket/transport_client_socket_pool.h" #include "net/ssl/ssl_config_service.h" #include "net/traffic_annotation/network_traffic_annotation.h" @@ -535,7 +535,7 @@ DatagramSocket::BindType bind_type, NetLog* net_log, const NetLogSource& source) override; - std::unique_ptr<StreamSocket> CreateTransportClientSocket( + std::unique_ptr<TransportClientSocket> CreateTransportClientSocket( const AddressList& addresses, std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher, NetLog* net_log, @@ -563,7 +563,7 @@ DISALLOW_COPY_AND_ASSIGN(MockClientSocketFactory); }; -class MockClientSocket : public SSLClientSocket { +class MockClientSocket : public TransportClientSocket { public: // The NetLogWithSource is needed to test LoadTimingInfo, which uses NetLog // IDs as @@ -581,7 +581,8 @@ int SetReceiveBufferSize(int32_t size) override; int SetSendBufferSize(int32_t size) override; - // StreamSocket implementation. + // TransportClientSocket implementation. + int Bind(const net::IPEndPoint& local_addr) override; int Connect(const CompletionCallback& callback) override = 0; void Disconnect() override; bool IsConnected() const override; @@ -599,19 +600,6 @@ int64_t GetTotalReceivedBytes() const override; void ApplySocketTag(const SocketTag& tag) override {} - // SSLClientSocket implementation. - void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override; - int ExportKeyingMaterial(const base::StringPiece& label, - bool has_context, - const base::StringPiece& context, - unsigned char* out, - unsigned int outlen) override; - ChannelIDService* GetChannelIDService() const override; - Error GetTokenBindingSignature(crypto::ECPrivateKey* key, - TokenBindingType tb_type, - std::vector<uint8_t>* out) override; - crypto::ECPrivateKey* GetChannelIDKey() const override; - protected: ~MockClientSocket() override; void RunCallbackAsync(const CompletionCallback& callback, int result); @@ -620,7 +608,7 @@ // True if Connect completed successfully and Disconnect hasn't been called. bool connected_; - // Address of the "remote" peer we're connected to. + IPEndPoint local_addr_; IPEndPoint peer_addr_; NetLogWithSource net_log_; @@ -713,7 +701,7 @@ DISALLOW_COPY_AND_ASSIGN(MockTCPClientSocket); }; -class MockSSLClientSocket : public MockClientSocket, public AsyncSocket { +class MockSSLClientSocket : public AsyncSocket, public SSLClientSocket { public: MockSSLClientSocket(std::unique_ptr<ClientSocketHandle> transport_socket, const HostPortPair& host_and_port, @@ -740,16 +728,34 @@ bool IsConnectedAndIdle() const override; bool WasEverUsed() const override; int GetPeerAddress(IPEndPoint* address) const override; + int GetLocalAddress(IPEndPoint* address) const override; bool WasAlpnNegotiated() const override; NextProto GetNegotiatedProtocol() const override; bool GetSSLInfo(SSLInfo* ssl_info) override; void ApplySocketTag(const SocketTag& tag) override; + const NetLogWithSource& NetLog() const override; + void SetSubresourceSpeculation() override {} + void SetOmniboxSpeculation() override {} + void GetConnectionAttempts(ConnectionAttempts* out) const override; + void ClearConnectionAttempts() override {} + void AddConnectionAttempts(const ConnectionAttempts& attempts) override {} + int64_t GetTotalReceivedBytes() const override; + int SetReceiveBufferSize(int32_t size) override; + int SetSendBufferSize(int32_t size) override; // SSLClientSocket implementation. void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override; Error GetTokenBindingSignature(crypto::ECPrivateKey* key, TokenBindingType tb_type, std::vector<uint8_t>* out) override; + int ExportKeyingMaterial(const base::StringPiece& label, + bool has_context, + const base::StringPiece& context, + unsigned char* out, + unsigned int outlen) override; + ChannelIDService* GetChannelIDService() const override; + crypto::ECPrivateKey* GetChannelIDKey() const override; + // This MockSocket does not implement the manual async IO feature. void OnReadComplete(const MockRead& data) override; void OnWriteComplete(int rv) override; @@ -759,15 +765,22 @@ // TODO(mmenke): Probably a good idea to support it, anyways. void OnDataProviderDestroyed() override {} - ChannelIDService* GetChannelIDService() const override; - private: static void ConnectCallback(MockSSLClientSocket* ssl_client_socket, const CompletionCallback& callback, int rv); + void RunCallbackAsync(const CompletionCallback& callback, int result); + void RunCallback(const CompletionCallback& callback, int result); + + bool connected_ = false; + NetLogWithSource net_log_; std::unique_ptr<ClientSocketHandle> transport_; SSLSocketDataProvider* data_; + // Address of the "remote" peer we're connected to. + IPEndPoint peer_addr_; + + base::WeakPtrFactory<MockSSLClientSocket> weak_factory_; DISALLOW_COPY_AND_ASSIGN(MockSSLClientSocket); }; @@ -1071,30 +1084,19 @@ DISALLOW_COPY_AND_ASSIGN(MockSOCKSClientSocketPool); }; -// Convenience class to temporarily set the WebSocketEndpointLockManager unlock -// delay to zero for testing purposes. Automatically restores the original value -// when destroyed. -class ScopedWebSocketEndpointZeroUnlockDelay { - public: - ScopedWebSocketEndpointZeroUnlockDelay(); - ~ScopedWebSocketEndpointZeroUnlockDelay(); - - private: - base::TimeDelta old_delay_; -}; - // WrappedStreamSocket is a base class that wraps an existing StreamSocket, // forwarding the Socket and StreamSocket interfaces to the underlying // transport. // This is to provide a common base class for subclasses to override specific // StreamSocket methods for testing, while still communicating with a 'real' // StreamSocket. -class WrappedStreamSocket : public StreamSocket { +class WrappedStreamSocket : public TransportClientSocket { public: explicit WrappedStreamSocket(std::unique_ptr<StreamSocket> transport); ~WrappedStreamSocket() override; // StreamSocket implementation: + int Bind(const net::IPEndPoint& local_addr) override; int Connect(const CompletionCallback& callback) override; void Disconnect() override; bool IsConnected() const override; @@ -1170,7 +1172,7 @@ DatagramSocket::BindType bind_type, NetLog* net_log, const NetLogSource& source) override; - std::unique_ptr<StreamSocket> CreateTransportClientSocket( + std::unique_ptr<TransportClientSocket> CreateTransportClientSocket( const AddressList& addresses, std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher, NetLog* net_log,
diff --git a/net/socket/tcp_client_socket.h b/net/socket/tcp_client_socket.h index cda599b..f4861d01 100644 --- a/net/socket/tcp_client_socket.h +++ b/net/socket/tcp_client_socket.h
@@ -17,6 +17,7 @@ #include "net/socket/connection_attempts.h" #include "net/socket/stream_socket.h" #include "net/socket/tcp_socket.h" +#include "net/socket/transport_client_socket.h" #include "net/traffic_annotation/network_traffic_annotation.h" namespace net { @@ -26,7 +27,7 @@ class SocketPerformanceWatcher; // A client socket that uses TCP as the transport layer. -class NET_EXPORT TCPClientSocket : public StreamSocket { +class NET_EXPORT TCPClientSocket : public TransportClientSocket { public: // The IP address(es) and port number to connect to. The TCP socket will try // each IP address in the list until it succeeds in establishing a @@ -44,10 +45,8 @@ ~TCPClientSocket() override; - // Binds the socket to a local IP address and port. - int Bind(const IPEndPoint& address); - - // StreamSocket implementation. + // TransportClientSocket implementation. + int Bind(const IPEndPoint& address) override; int Connect(const CompletionCallback& callback) override; void Disconnect() override; bool IsConnected() const override;
diff --git a/net/socket/transport_client_socket.h b/net/socket/transport_client_socket.h new file mode 100644 index 0000000..8f64e92c --- /dev/null +++ b/net/socket/transport_client_socket.h
@@ -0,0 +1,27 @@ +// 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 NET_SOCKET_TRANSPORT_CLIENT_SOCKET_H_ +#define NET_SOCKET_TRANSPORT_CLIENT_SOCKET_H_ + +#include "net/base/ip_endpoint.h" +#include "net/base/net_export.h" +#include "net/socket/stream_socket.h" + +namespace net { + +// A socket class that extends StreamSocket to provide methods that are relevant +// to a transport client socket. +class NET_EXPORT_PRIVATE TransportClientSocket : public StreamSocket { + public: + ~TransportClientSocket() override {} + + // Binds the socket to a local address, |local_addr|. Returns OK on success, + // and a net error code on failure. + virtual int Bind(const net::IPEndPoint& local_addr) = 0; +}; + +} // namespace net + +#endif // NET_SOCKET_TRANSPORT_CLIENT_SOCKET_H_
diff --git a/net/socket/transport_client_socket_pool_test_util.cc b/net/socket/transport_client_socket_pool_test_util.cc index a516afd..d8599e96 100644 --- a/net/socket/transport_client_socket_pool_test_util.cc +++ b/net/socket/transport_client_socket_pool_test_util.cc
@@ -25,6 +25,7 @@ #include "net/socket/client_socket_handle.h" #include "net/socket/datagram_client_socket.h" #include "net/socket/ssl_client_socket.h" +#include "net/socket/transport_client_socket.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "testing/gtest/include/gtest/gtest.h" @@ -39,14 +40,18 @@ } // A StreamSocket which connects synchronously and successfully. -class MockConnectClientSocket : public StreamSocket { +class MockConnectClientSocket : public TransportClientSocket { public: MockConnectClientSocket(const AddressList& addrlist, net::NetLog* net_log) : connected_(false), addrlist_(addrlist), net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)) {} - // StreamSocket implementation. + // TransportClientSocket implementation. + int Bind(const net::IPEndPoint& local_addr) override { + NOTREACHED(); + return ERR_FAILED; + } int Connect(const CompletionCallback& callback) override { connected_ = true; return OK; @@ -111,13 +116,18 @@ DISALLOW_COPY_AND_ASSIGN(MockConnectClientSocket); }; -class MockFailingClientSocket : public StreamSocket { +class MockFailingClientSocket : public TransportClientSocket { public: MockFailingClientSocket(const AddressList& addrlist, net::NetLog* net_log) : addrlist_(addrlist), net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)) {} - // StreamSocket implementation. + // TransportClientSocket implementation. + int Bind(const net::IPEndPoint& local_addr) override { + NOTREACHED(); + return ERR_FAILED; + } + int Connect(const CompletionCallback& callback) override { return ERR_CONNECTION_FAILED; } @@ -177,7 +187,7 @@ DISALLOW_COPY_AND_ASSIGN(MockFailingClientSocket); }; -class MockTriggerableClientSocket : public StreamSocket { +class MockTriggerableClientSocket : public TransportClientSocket { public: // |should_connect| indicates whether the socket should successfully complete // or fail. @@ -198,7 +208,7 @@ weak_factory_.GetWeakPtr()); } - static std::unique_ptr<StreamSocket> MakeMockPendingClientSocket( + static std::unique_ptr<TransportClientSocket> MakeMockPendingClientSocket( const AddressList& addrlist, bool should_connect, net::NetLog* net_log) { @@ -209,7 +219,7 @@ return std::move(socket); } - static std::unique_ptr<StreamSocket> MakeMockDelayedClientSocket( + static std::unique_ptr<TransportClientSocket> MakeMockDelayedClientSocket( const AddressList& addrlist, bool should_connect, const base::TimeDelta& delay, @@ -221,7 +231,7 @@ return std::move(socket); } - static std::unique_ptr<StreamSocket> MakeMockStalledClientSocket( + static std::unique_ptr<TransportClientSocket> MakeMockStalledClientSocket( const AddressList& addrlist, net::NetLog* net_log, bool failing) { @@ -236,7 +246,12 @@ return std::move(socket); } - // StreamSocket implementation. + // TransportClientSocket implementation. + int Bind(const net::IPEndPoint& local_addr) override { + NOTREACHED(); + return ERR_FAILED; + } + int Connect(const CompletionCallback& callback) override { DCHECK(callback_.is_null()); callback_ = callback; @@ -378,7 +393,7 @@ return std::unique_ptr<DatagramClientSocket>(); } -std::unique_ptr<StreamSocket> +std::unique_ptr<TransportClientSocket> MockTransportClientSocketFactory::CreateTransportClientSocket( const AddressList& addresses, std::unique_ptr<SocketPerformanceWatcher> /* socket_performance_watcher */, @@ -393,11 +408,9 @@ switch (type) { case MOCK_CLIENT_SOCKET: - return std::unique_ptr<StreamSocket>( - new MockConnectClientSocket(addresses, net_log_)); + return std::make_unique<MockConnectClientSocket>(addresses, net_log_); case MOCK_FAILING_CLIENT_SOCKET: - return std::unique_ptr<StreamSocket>( - new MockFailingClientSocket(addresses, net_log_)); + return std::make_unique<MockFailingClientSocket>(addresses, net_log_); case MOCK_PENDING_CLIENT_SOCKET: return MockTriggerableClientSocket::MakeMockPendingClientSocket( addresses, true, net_log_); @@ -430,8 +443,7 @@ } default: NOTREACHED(); - return std::unique_ptr<StreamSocket>( - new MockConnectClientSocket(addresses, net_log_)); + return std::make_unique<MockConnectClientSocket>(addresses, net_log_); } }
diff --git a/net/socket/transport_client_socket_pool_test_util.h b/net/socket/transport_client_socket_pool_test_util.h index 4e0820d6..b935233b 100644 --- a/net/socket/transport_client_socket_pool_test_util.h +++ b/net/socket/transport_client_socket_pool_test_util.h
@@ -78,7 +78,7 @@ NetLog* net_log, const NetLogSource& source) override; - std::unique_ptr<StreamSocket> CreateTransportClientSocket( + std::unique_ptr<TransportClientSocket> CreateTransportClientSocket( const AddressList& addresses, std::unique_ptr< SocketPerformanceWatcher> /* socket_performance_watcher */,
diff --git a/net/socket/websocket_endpoint_lock_manager.cc b/net/socket/websocket_endpoint_lock_manager.cc index e316bc5..b0cce121 100644 --- a/net/socket/websocket_endpoint_lock_manager.cc +++ b/net/socket/websocket_endpoint_lock_manager.cc
@@ -22,9 +22,6 @@ // See crbug.com/377613. const int kUnlockDelayInMs = 10; -base::LazyInstance<WebSocketEndpointLockManager>::Leaky manager_instance = - LAZY_INSTANCE_INITIALIZER; - } // namespace WebSocketEndpointLockManager::Waiter::~Waiter() { @@ -34,8 +31,14 @@ } } -WebSocketEndpointLockManager* WebSocketEndpointLockManager::GetInstance() { - return manager_instance.Pointer(); +WebSocketEndpointLockManager::WebSocketEndpointLockManager() + : unlock_delay_(base::TimeDelta::FromMilliseconds(kUnlockDelayInMs)), + pending_unlock_count_(0), + weak_factory_(this) {} + +WebSocketEndpointLockManager::~WebSocketEndpointLockManager() { + DCHECK_EQ(lock_info_map_.size(), pending_unlock_count_); + DCHECK(socket_lock_info_map_.empty()); } int WebSocketEndpointLockManager::LockEndpoint(const IPEndPoint& endpoint, @@ -115,15 +118,6 @@ DCHECK(!rhs.queue); } -WebSocketEndpointLockManager::WebSocketEndpointLockManager() - : unlock_delay_(base::TimeDelta::FromMilliseconds(kUnlockDelayInMs)), - pending_unlock_count_(0) {} - -WebSocketEndpointLockManager::~WebSocketEndpointLockManager() { - DCHECK_EQ(lock_info_map_.size(), pending_unlock_count_); - DCHECK(socket_lock_info_map_.empty()); -} - void WebSocketEndpointLockManager::UnlockEndpointAfterDelay( const IPEndPoint& endpoint) { DVLOG(3) << "Delaying " << unlock_delay_.InMilliseconds() @@ -132,7 +126,7 @@ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::Bind(&WebSocketEndpointLockManager::DelayedUnlockEndpoint, - base::Unretained(this), endpoint), + weak_factory_.GetWeakPtr(), endpoint), unlock_delay_); }
diff --git a/net/socket/websocket_endpoint_lock_manager.h b/net/socket/websocket_endpoint_lock_manager.h index 6999b8a7..3adedfb 100644 --- a/net/socket/websocket_endpoint_lock_manager.h +++ b/net/socket/websocket_endpoint_lock_manager.h
@@ -8,9 +8,9 @@ #include <stddef.h> #include <map> +#include <memory> #include "base/containers/linked_list.h" -#include "base/lazy_instance.h" #include "base/logging.h" #include "base/macros.h" #include "base/time/time.h" @@ -49,7 +49,8 @@ virtual void GotEndpointLock() = 0; }; - static WebSocketEndpointLockManager* GetInstance(); + WebSocketEndpointLockManager(); + ~WebSocketEndpointLockManager(); // Returns OK if lock was acquired immediately, ERR_IO_PENDING if not. If the // lock was not acquired, then |waiter->GotEndpointLock()| will be called when @@ -88,8 +89,6 @@ base::TimeDelta SetUnlockDelayForTesting(base::TimeDelta new_delay); private: - friend struct base::LazyInstanceTraitsBase<net::WebSocketEndpointLockManager>; - struct LockInfo { typedef base::LinkedList<Waiter> WaiterQueue; @@ -122,9 +121,6 @@ typedef std::map<IPEndPoint, LockInfo> LockInfoMap; typedef std::map<StreamSocket*, LockInfoMap::iterator> SocketLockInfoMap; - WebSocketEndpointLockManager(); - ~WebSocketEndpointLockManager(); - void UnlockEndpointAfterDelay(const IPEndPoint& endpoint); void DelayedUnlockEndpoint(const IPEndPoint& endpoint); void EraseSocket(LockInfoMap::iterator lock_info_it); @@ -146,6 +142,8 @@ // Number of sockets currently pending unlock. size_t pending_unlock_count_; + base::WeakPtrFactory<WebSocketEndpointLockManager> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(WebSocketEndpointLockManager); };
diff --git a/net/socket/websocket_endpoint_lock_manager_unittest.cc b/net/socket/websocket_endpoint_lock_manager_unittest.cc index c80e780f..4958372 100644 --- a/net/socket/websocket_endpoint_lock_manager_unittest.cc +++ b/net/socket/websocket_endpoint_lock_manager_unittest.cc
@@ -134,50 +134,50 @@ class WebSocketEndpointLockManagerTest : public ::testing::Test { protected: - WebSocketEndpointLockManagerTest() - : instance_(WebSocketEndpointLockManager::GetInstance()) {} + WebSocketEndpointLockManagerTest() { + websocket_endpoint_lock_manager_.SetUnlockDelayForTesting( + base::TimeDelta()); + } + ~WebSocketEndpointLockManagerTest() override { // Permit any pending asynchronous unlock operations to complete. RunUntilIdle(); // If this check fails then subsequent tests may fail. - CHECK(instance_->IsEmpty()); + CHECK(websocket_endpoint_lock_manager_.IsEmpty()); } - WebSocketEndpointLockManager* instance() const { return instance_; } - IPEndPoint DummyEndpoint() { return IPEndPoint(IPAddress::IPv4Localhost(), 80); } void UnlockDummyEndpoint(int times) { for (int i = 0; i < times; ++i) { - instance()->UnlockEndpoint(DummyEndpoint()); + websocket_endpoint_lock_manager_.UnlockEndpoint(DummyEndpoint()); RunUntilIdle(); } } static void RunUntilIdle() { base::RunLoop().RunUntilIdle(); } - WebSocketEndpointLockManager* const instance_; - ScopedWebSocketEndpointZeroUnlockDelay zero_unlock_delay_; + WebSocketEndpointLockManager websocket_endpoint_lock_manager_; }; -TEST_F(WebSocketEndpointLockManagerTest, GetInstanceWorks) { - // All the work is done by the test framework. -} - TEST_F(WebSocketEndpointLockManagerTest, LockEndpointReturnsOkOnce) { FakeWaiter waiters[2]; - EXPECT_THAT(instance()->LockEndpoint(DummyEndpoint(), &waiters[0]), IsOk()); - EXPECT_EQ(ERR_IO_PENDING, - instance()->LockEndpoint(DummyEndpoint(), &waiters[1])); + EXPECT_THAT(websocket_endpoint_lock_manager_.LockEndpoint(DummyEndpoint(), + &waiters[0]), + IsOk()); + EXPECT_EQ(ERR_IO_PENDING, websocket_endpoint_lock_manager_.LockEndpoint( + DummyEndpoint(), &waiters[1])); UnlockDummyEndpoint(2); } TEST_F(WebSocketEndpointLockManagerTest, GotEndpointLockNotCalledOnOk) { FakeWaiter waiter; - EXPECT_THAT(instance()->LockEndpoint(DummyEndpoint(), &waiter), IsOk()); + EXPECT_THAT( + websocket_endpoint_lock_manager_.LockEndpoint(DummyEndpoint(), &waiter), + IsOk()); RunUntilIdle(); EXPECT_FALSE(waiter.called()); @@ -186,9 +186,11 @@ TEST_F(WebSocketEndpointLockManagerTest, GotEndpointLockNotCalledImmediately) { FakeWaiter waiters[2]; - EXPECT_THAT(instance()->LockEndpoint(DummyEndpoint(), &waiters[0]), IsOk()); - EXPECT_EQ(ERR_IO_PENDING, - instance()->LockEndpoint(DummyEndpoint(), &waiters[1])); + EXPECT_THAT(websocket_endpoint_lock_manager_.LockEndpoint(DummyEndpoint(), + &waiters[0]), + IsOk()); + EXPECT_EQ(ERR_IO_PENDING, websocket_endpoint_lock_manager_.LockEndpoint( + DummyEndpoint(), &waiters[1])); RunUntilIdle(); EXPECT_FALSE(waiters[1].called()); @@ -197,10 +199,12 @@ TEST_F(WebSocketEndpointLockManagerTest, GotEndpointLockCalledWhenUnlocked) { FakeWaiter waiters[2]; - EXPECT_THAT(instance()->LockEndpoint(DummyEndpoint(), &waiters[0]), IsOk()); - EXPECT_EQ(ERR_IO_PENDING, - instance()->LockEndpoint(DummyEndpoint(), &waiters[1])); - instance()->UnlockEndpoint(DummyEndpoint()); + EXPECT_THAT(websocket_endpoint_lock_manager_.LockEndpoint(DummyEndpoint(), + &waiters[0]), + IsOk()); + EXPECT_EQ(ERR_IO_PENDING, websocket_endpoint_lock_manager_.LockEndpoint( + DummyEndpoint(), &waiters[1])); + websocket_endpoint_lock_manager_.UnlockEndpoint(DummyEndpoint()); RunUntilIdle(); EXPECT_TRUE(waiters[1].called()); @@ -210,20 +214,22 @@ TEST_F(WebSocketEndpointLockManagerTest, EndpointUnlockedIfWaiterAlreadyDeleted) { FakeWaiter first_lock_holder; - EXPECT_THAT(instance()->LockEndpoint(DummyEndpoint(), &first_lock_holder), + EXPECT_THAT(websocket_endpoint_lock_manager_.LockEndpoint(DummyEndpoint(), + &first_lock_holder), IsOk()); { FakeWaiter short_lived_waiter; - EXPECT_EQ(ERR_IO_PENDING, - instance()->LockEndpoint(DummyEndpoint(), &short_lived_waiter)); + EXPECT_EQ(ERR_IO_PENDING, websocket_endpoint_lock_manager_.LockEndpoint( + DummyEndpoint(), &short_lived_waiter)); } - instance()->UnlockEndpoint(DummyEndpoint()); + websocket_endpoint_lock_manager_.UnlockEndpoint(DummyEndpoint()); RunUntilIdle(); FakeWaiter second_lock_holder; - EXPECT_THAT(instance()->LockEndpoint(DummyEndpoint(), &second_lock_holder), + EXPECT_THAT(websocket_endpoint_lock_manager_.LockEndpoint( + DummyEndpoint(), &second_lock_holder), IsOk()); UnlockDummyEndpoint(1); @@ -232,12 +238,15 @@ TEST_F(WebSocketEndpointLockManagerTest, RememberSocketWorks) { FakeWaiter waiters[2]; FakeStreamSocket dummy_socket; - EXPECT_THAT(instance()->LockEndpoint(DummyEndpoint(), &waiters[0]), IsOk()); - EXPECT_EQ(ERR_IO_PENDING, - instance()->LockEndpoint(DummyEndpoint(), &waiters[1])); + EXPECT_THAT(websocket_endpoint_lock_manager_.LockEndpoint(DummyEndpoint(), + &waiters[0]), + IsOk()); + EXPECT_EQ(ERR_IO_PENDING, websocket_endpoint_lock_manager_.LockEndpoint( + DummyEndpoint(), &waiters[1])); - instance()->RememberSocket(&dummy_socket, DummyEndpoint()); - instance()->UnlockSocket(&dummy_socket); + websocket_endpoint_lock_manager_.RememberSocket(&dummy_socket, + DummyEndpoint()); + websocket_endpoint_lock_manager_.UnlockSocket(&dummy_socket); RunUntilIdle(); EXPECT_TRUE(waiters[1].called()); @@ -250,11 +259,14 @@ FakeWaiter waiter; FakeStreamSocket dummy_socket; - EXPECT_THAT(instance()->LockEndpoint(DummyEndpoint(), &waiter), IsOk()); - instance()->RememberSocket(&dummy_socket, DummyEndpoint()); - instance()->UnlockEndpoint(DummyEndpoint()); + EXPECT_THAT( + websocket_endpoint_lock_manager_.LockEndpoint(DummyEndpoint(), &waiter), + IsOk()); + websocket_endpoint_lock_manager_.RememberSocket(&dummy_socket, + DummyEndpoint()); + websocket_endpoint_lock_manager_.UnlockEndpoint(DummyEndpoint()); RunUntilIdle(); - EXPECT_TRUE(instance()->IsEmpty()); + EXPECT_TRUE(websocket_endpoint_lock_manager_.IsEmpty()); } // When ownership of the endpoint is passed to a new waiter, the new waiter can @@ -262,15 +274,19 @@ TEST_F(WebSocketEndpointLockManagerTest, NextWaiterCanCallRememberSocketAgain) { FakeWaiter waiters[2]; FakeStreamSocket dummy_sockets[2]; - EXPECT_THAT(instance()->LockEndpoint(DummyEndpoint(), &waiters[0]), IsOk()); - EXPECT_EQ(ERR_IO_PENDING, - instance()->LockEndpoint(DummyEndpoint(), &waiters[1])); + EXPECT_THAT(websocket_endpoint_lock_manager_.LockEndpoint(DummyEndpoint(), + &waiters[0]), + IsOk()); + EXPECT_EQ(ERR_IO_PENDING, websocket_endpoint_lock_manager_.LockEndpoint( + DummyEndpoint(), &waiters[1])); - instance()->RememberSocket(&dummy_sockets[0], DummyEndpoint()); - instance()->UnlockEndpoint(DummyEndpoint()); + websocket_endpoint_lock_manager_.RememberSocket(&dummy_sockets[0], + DummyEndpoint()); + websocket_endpoint_lock_manager_.UnlockEndpoint(DummyEndpoint()); RunUntilIdle(); EXPECT_TRUE(waiters[1].called()); - instance()->RememberSocket(&dummy_sockets[1], DummyEndpoint()); + websocket_endpoint_lock_manager_.RememberSocket(&dummy_sockets[1], + DummyEndpoint()); UnlockDummyEndpoint(1); } @@ -281,14 +297,17 @@ FakeWaiter waiters[3]; FakeStreamSocket dummy_socket; - EXPECT_THAT(instance()->LockEndpoint(DummyEndpoint(), &waiters[0]), IsOk()); - EXPECT_EQ(ERR_IO_PENDING, - instance()->LockEndpoint(DummyEndpoint(), &waiters[1])); - EXPECT_EQ(ERR_IO_PENDING, - instance()->LockEndpoint(DummyEndpoint(), &waiters[2])); - instance()->RememberSocket(&dummy_socket, DummyEndpoint()); - instance()->UnlockEndpoint(DummyEndpoint()); - instance()->UnlockSocket(&dummy_socket); + EXPECT_THAT(websocket_endpoint_lock_manager_.LockEndpoint(DummyEndpoint(), + &waiters[0]), + IsOk()); + EXPECT_EQ(ERR_IO_PENDING, websocket_endpoint_lock_manager_.LockEndpoint( + DummyEndpoint(), &waiters[1])); + EXPECT_EQ(ERR_IO_PENDING, websocket_endpoint_lock_manager_.LockEndpoint( + DummyEndpoint(), &waiters[2])); + websocket_endpoint_lock_manager_.RememberSocket(&dummy_socket, + DummyEndpoint()); + websocket_endpoint_lock_manager_.UnlockEndpoint(DummyEndpoint()); + websocket_endpoint_lock_manager_.UnlockSocket(&dummy_socket); RunUntilIdle(); EXPECT_TRUE(waiters[1].called()); EXPECT_FALSE(waiters[2].called()); @@ -299,11 +318,13 @@ // UnlockEndpoint() should always be asynchronous. TEST_F(WebSocketEndpointLockManagerTest, UnlockEndpointIsAsynchronous) { FakeWaiter waiters[2]; - EXPECT_THAT(instance()->LockEndpoint(DummyEndpoint(), &waiters[0]), IsOk()); - EXPECT_EQ(ERR_IO_PENDING, - instance()->LockEndpoint(DummyEndpoint(), &waiters[1])); + EXPECT_THAT(websocket_endpoint_lock_manager_.LockEndpoint(DummyEndpoint(), + &waiters[0]), + IsOk()); + EXPECT_EQ(ERR_IO_PENDING, websocket_endpoint_lock_manager_.LockEndpoint( + DummyEndpoint(), &waiters[1])); - instance()->UnlockEndpoint(DummyEndpoint()); + websocket_endpoint_lock_manager_.UnlockEndpoint(DummyEndpoint()); EXPECT_FALSE(waiters[1].called()); RunUntilIdle(); EXPECT_TRUE(waiters[1].called()); @@ -323,19 +344,21 @@ // easily enough for normal compiles even on Android, so the fact that there // is a delay is still checked on every platform. const base::TimeDelta unlock_delay = base::TimeDelta::FromMilliseconds(1); - instance()->SetUnlockDelayForTesting(unlock_delay); + websocket_endpoint_lock_manager_.SetUnlockDelayForTesting(unlock_delay); FakeWaiter fake_waiter; BlockingWaiter blocking_waiter; - EXPECT_THAT(instance()->LockEndpoint(DummyEndpoint(), &fake_waiter), IsOk()); - EXPECT_EQ(ERR_IO_PENDING, - instance()->LockEndpoint(DummyEndpoint(), &blocking_waiter)); + EXPECT_THAT(websocket_endpoint_lock_manager_.LockEndpoint(DummyEndpoint(), + &fake_waiter), + IsOk()); + EXPECT_EQ(ERR_IO_PENDING, websocket_endpoint_lock_manager_.LockEndpoint( + DummyEndpoint(), &blocking_waiter)); TimeTicks before_unlock = TimeTicks::Now(); - instance()->UnlockEndpoint(DummyEndpoint()); + websocket_endpoint_lock_manager_.UnlockEndpoint(DummyEndpoint()); blocking_waiter.WaitForLock(); TimeTicks after_unlock = TimeTicks::Now(); EXPECT_GE(after_unlock - before_unlock, unlock_delay); - instance()->SetUnlockDelayForTesting(base::TimeDelta()); + websocket_endpoint_lock_manager_.SetUnlockDelayForTesting(base::TimeDelta()); UnlockDummyEndpoint(1); }
diff --git a/net/socket/websocket_transport_client_socket_pool.cc b/net/socket/websocket_transport_client_socket_pool.cc index 5ef8809..cfef27f 100644 --- a/net/socket/websocket_transport_client_socket_pool.cc +++ b/net/socket/websocket_transport_client_socket_pool.cc
@@ -40,6 +40,7 @@ HostResolver* host_resolver, ClientSocketHandle* handle, Delegate* delegate, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager, NetLog* pool_net_log, const NetLogWithSource& request_net_log) : ConnectJob(group_name, @@ -57,6 +58,7 @@ next_state_(STATE_NONE), race_result_(TransportConnectJob::RACE_UNKNOWN), handle_(handle), + websocket_endpoint_lock_manager_(websocket_endpoint_lock_manager), callback_(callback), request_net_log_(request_net_log), had_ipv4_(false), @@ -173,13 +175,13 @@ if (!ipv4_addresses.empty()) { had_ipv4_ = true; ipv4_job_.reset(new WebSocketTransportConnectSubJob( - ipv4_addresses, this, SUB_JOB_IPV4)); + ipv4_addresses, this, SUB_JOB_IPV4, websocket_endpoint_lock_manager_)); } if (!ipv6_addresses.empty()) { had_ipv6_ = true; ipv6_job_.reset(new WebSocketTransportConnectSubJob( - ipv6_addresses, this, SUB_JOB_IPV6)); + ipv6_addresses, this, SUB_JOB_IPV6, websocket_endpoint_lock_manager_)); result = ipv6_job_->Start(); switch (result) { case OK: @@ -286,6 +288,7 @@ int max_sockets_per_group, HostResolver* host_resolver, ClientSocketFactory* client_socket_factory, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager, NetLog* net_log) : TransportClientSocketPool(max_sockets, max_sockets_per_group, @@ -297,6 +300,7 @@ pool_net_log_(net_log), client_socket_factory_(client_socket_factory), host_resolver_(host_resolver), + websocket_endpoint_lock_manager_(websocket_endpoint_lock_manager), max_sockets_(max_sockets), handed_out_socket_count_(0), flushing_(false), @@ -313,12 +317,13 @@ // static void WebSocketTransportClientSocketPool::UnlockEndpoint( - ClientSocketHandle* handle) { + ClientSocketHandle* handle, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager) { DCHECK(handle->is_initialized()); DCHECK(handle->socket()); IPEndPoint address; if (handle->socket()->GetPeerAddress(&address) == OK) - WebSocketEndpointLockManager::GetInstance()->UnlockEndpoint(address); + websocket_endpoint_lock_manager->UnlockEndpoint(address); } int WebSocketTransportClientSocketPool::RequestSocket( @@ -365,7 +370,8 @@ new WebSocketTransportConnectJob( group_name, priority, respect_limits, casted_params, ConnectionTimeout(), callback, client_socket_factory_, host_resolver_, - handle, &connect_job_delegate_, pool_net_log_, request_net_log)); + handle, &connect_job_delegate_, websocket_endpoint_lock_manager_, + pool_net_log_, request_net_log)); int result = connect_job->Connect(); @@ -427,7 +433,7 @@ const std::string& group_name, std::unique_ptr<StreamSocket> socket, int id) { - WebSocketEndpointLockManager::GetInstance()->UnlockSocket(socket.get()); + websocket_endpoint_lock_manager_->UnlockSocket(socket.get()); CHECK_GT(handed_out_socket_count_, 0); --handed_out_socket_count_; @@ -562,7 +568,7 @@ // See comment in FlushWithError. if (flushing_) { std::unique_ptr<StreamSocket> socket = job->PassSocket(); - WebSocketEndpointLockManager::GetInstance()->UnlockSocket(socket.get()); + websocket_endpoint_lock_manager_->UnlockSocket(socket.get()); return; }
diff --git a/net/socket/websocket_transport_client_socket_pool.h b/net/socket/websocket_transport_client_socket_pool.h index c8248812..c88d5b4 100644 --- a/net/socket/websocket_transport_client_socket_pool.h +++ b/net/socket/websocket_transport_client_socket_pool.h
@@ -55,6 +55,7 @@ HostResolver* host_resolver, ClientSocketHandle* handle, Delegate* delegate, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager, NetLog* pool_net_log, const NetLogWithSource& request_net_log); ~WebSocketTransportConnectJob() override; @@ -73,7 +74,6 @@ private: friend class WebSocketTransportConnectSubJob; - friend class WebSocketEndpointLockManager; enum State { STATE_RESOLVE_HOST, @@ -124,6 +124,7 @@ base::OneShotTimer fallback_timer_; TransportConnectJob::RaceResult race_result_; ClientSocketHandle* const handle_; + WebSocketEndpointLockManager* const websocket_endpoint_lock_manager_; CompletionCallback callback_; NetLogWithSource request_net_log_; @@ -136,11 +137,13 @@ class NET_EXPORT_PRIVATE WebSocketTransportClientSocketPool : public TransportClientSocketPool { public: - WebSocketTransportClientSocketPool(int max_sockets, - int max_sockets_per_group, - HostResolver* host_resolver, - ClientSocketFactory* client_socket_factory, - NetLog* net_log); + WebSocketTransportClientSocketPool( + int max_sockets, + int max_sockets_per_group, + HostResolver* host_resolver, + ClientSocketFactory* client_socket_factory, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager, + NetLog* net_log); ~WebSocketTransportClientSocketPool() override; @@ -149,7 +152,9 @@ // This only works if the socket is connected, however the caller does not // need to explicitly check for this. Instead, ensure that dead sockets are // returned to ReleaseSocket() in a timely fashion. - static void UnlockEndpoint(ClientSocketHandle* handle); + static void UnlockEndpoint( + ClientSocketHandle* handle, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager); // ClientSocketPool implementation. int RequestSocket(const std::string& group_name, @@ -263,6 +268,7 @@ NetLog* const pool_net_log_; ClientSocketFactory* const client_socket_factory_; HostResolver* const host_resolver_; + WebSocketEndpointLockManager* websocket_endpoint_lock_manager_; const int max_sockets_; int handed_out_socket_count_; bool flushing_;
diff --git a/net/socket/websocket_transport_client_socket_pool_unittest.cc b/net/socket/websocket_transport_client_socket_pool_unittest.cc index 65a51cf..c3f6664 100644 --- a/net/socket/websocket_transport_client_socket_pool_unittest.cc +++ b/net/socket/websocket_transport_client_socket_pool_unittest.cc
@@ -67,14 +67,18 @@ kMaxSocketsPerGroup, host_resolver_.get(), &client_socket_factory_, - nullptr) {} + &websocket_endpoint_lock_manager_, + nullptr) { + websocket_endpoint_lock_manager_.SetUnlockDelayForTesting( + base::TimeDelta()); + } ~WebSocketTransportClientSocketPoolTest() override { RunUntilIdle(); // ReleaseAllConnections() calls RunUntilIdle() after releasing each // connection. ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); - EXPECT_TRUE(WebSocketEndpointLockManager::GetInstance()->IsEmpty()); + EXPECT_TRUE(websocket_endpoint_lock_manager_.IsEmpty()); } static void RunUntilIdle() { base::RunLoop().RunUntilIdle(); } @@ -111,9 +115,9 @@ scoped_refptr<TransportSocketParams> params_; std::unique_ptr<MockHostResolver> host_resolver_; MockTransportClientSocketFactory client_socket_factory_; + WebSocketEndpointLockManager websocket_endpoint_lock_manager_; WebSocketTransportClientSocketPool pool_; ClientSocketPoolTest test_base_; - ScopedWebSocketEndpointZeroUnlockDelay zero_unlock_delay_; private: DISALLOW_COPY_AND_ASSIGN(WebSocketTransportClientSocketPoolTest); @@ -484,7 +488,8 @@ EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING)); EXPECT_THAT(request(0)->WaitForResult(), IsOk()); EXPECT_FALSE(request(1)->handle()->is_initialized()); - WebSocketTransportClientSocketPool::UnlockEndpoint(request(0)->handle()); + WebSocketTransportClientSocketPool::UnlockEndpoint( + request(0)->handle(), &websocket_endpoint_lock_manager_); RunUntilIdle(); EXPECT_TRUE(request(1)->handle()->is_initialized()); } @@ -511,9 +516,9 @@ // socket which finishes first. TEST_F(WebSocketTransportClientSocketPoolTest, IPv6FallbackSocketIPv4FinishesFirst) { - WebSocketTransportClientSocketPool pool(kMaxSockets, kMaxSocketsPerGroup, - host_resolver_.get(), - &client_socket_factory_, nullptr); + WebSocketTransportClientSocketPool pool( + kMaxSockets, kMaxSocketsPerGroup, host_resolver_.get(), + &client_socket_factory_, &websocket_endpoint_lock_manager_, nullptr); MockTransportClientSocketFactory::ClientSocketType case_types[] = { // This is the IPv6 socket. @@ -550,9 +555,9 @@ // finish first. TEST_F(WebSocketTransportClientSocketPoolTest, IPv6FallbackSocketIPv6FinishesFirst) { - WebSocketTransportClientSocketPool pool(kMaxSockets, kMaxSocketsPerGroup, - host_resolver_.get(), - &client_socket_factory_, nullptr); + WebSocketTransportClientSocketPool pool( + kMaxSockets, kMaxSocketsPerGroup, host_resolver_.get(), + &client_socket_factory_, &websocket_endpoint_lock_manager_, nullptr); MockTransportClientSocketFactory::ClientSocketType case_types[] = { // This is the IPv6 socket. @@ -588,9 +593,9 @@ TEST_F(WebSocketTransportClientSocketPoolTest, IPv6NoIPv4AddressesToFallbackTo) { - WebSocketTransportClientSocketPool pool(kMaxSockets, kMaxSocketsPerGroup, - host_resolver_.get(), - &client_socket_factory_, nullptr); + WebSocketTransportClientSocketPool pool( + kMaxSockets, kMaxSocketsPerGroup, host_resolver_.get(), + &client_socket_factory_, &websocket_endpoint_lock_manager_, nullptr); client_socket_factory_.set_default_client_socket_type( MockTransportClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET); @@ -618,9 +623,9 @@ } TEST_F(WebSocketTransportClientSocketPoolTest, IPv4HasNoFallback) { - WebSocketTransportClientSocketPool pool(kMaxSockets, kMaxSocketsPerGroup, - host_resolver_.get(), - &client_socket_factory_, nullptr); + WebSocketTransportClientSocketPool pool( + kMaxSockets, kMaxSocketsPerGroup, host_resolver_.get(), + &client_socket_factory_, &websocket_endpoint_lock_manager_, nullptr); client_socket_factory_.set_default_client_socket_type( MockTransportClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET); @@ -649,9 +654,9 @@ // If all IPv6 addresses fail to connect synchronously, then IPv4 connections // proceeed immediately. TEST_F(WebSocketTransportClientSocketPoolTest, IPv6InstantFail) { - WebSocketTransportClientSocketPool pool(kMaxSockets, kMaxSocketsPerGroup, - host_resolver_.get(), - &client_socket_factory_, nullptr); + WebSocketTransportClientSocketPool pool( + kMaxSockets, kMaxSocketsPerGroup, host_resolver_.get(), + &client_socket_factory_, &websocket_endpoint_lock_manager_, nullptr); MockTransportClientSocketFactory::ClientSocketType case_types[] = { // First IPv6 socket. @@ -684,9 +689,9 @@ // If all IPv6 addresses fail before the IPv4 fallback timeout, then the IPv4 // connections proceed immediately. TEST_F(WebSocketTransportClientSocketPoolTest, IPv6RapidFail) { - WebSocketTransportClientSocketPool pool(kMaxSockets, kMaxSocketsPerGroup, - host_resolver_.get(), - &client_socket_factory_, nullptr); + WebSocketTransportClientSocketPool pool( + kMaxSockets, kMaxSocketsPerGroup, host_resolver_.get(), + &client_socket_factory_, &websocket_endpoint_lock_manager_, nullptr); MockTransportClientSocketFactory::ClientSocketType case_types[] = { // First IPv6 socket. @@ -727,9 +732,9 @@ // can only happen if the sockets are different types, since sockets of the same // type do not race). TEST_F(WebSocketTransportClientSocketPoolTest, FirstSuccessWins) { - WebSocketTransportClientSocketPool pool(kMaxSockets, kMaxSocketsPerGroup, - host_resolver_.get(), - &client_socket_factory_, nullptr); + WebSocketTransportClientSocketPool pool( + kMaxSockets, kMaxSocketsPerGroup, host_resolver_.get(), + &client_socket_factory_, &websocket_endpoint_lock_manager_, nullptr); client_socket_factory_.set_default_client_socket_type( MockTransportClientSocketFactory::MOCK_TRIGGERABLE_CLIENT_SOCKET); @@ -764,9 +769,9 @@ // We should not report failure until all connections have failed. TEST_F(WebSocketTransportClientSocketPoolTest, LastFailureWins) { - WebSocketTransportClientSocketPool pool(kMaxSockets, kMaxSocketsPerGroup, - host_resolver_.get(), - &client_socket_factory_, nullptr); + WebSocketTransportClientSocketPool pool( + kMaxSockets, kMaxSocketsPerGroup, host_resolver_.get(), + &client_socket_factory_, &websocket_endpoint_lock_manager_, nullptr); client_socket_factory_.set_default_client_socket_type( MockTransportClientSocketFactory::MOCK_DELAYED_FAILING_CLIENT_SOCKET); @@ -805,9 +810,9 @@ // because it takes 4 minutes. Run with --gtest_also_run_disabled_tests if you // want to run it. TEST_F(WebSocketTransportClientSocketPoolTest, DISABLED_OverallTimeoutApplies) { - WebSocketTransportClientSocketPool pool(kMaxSockets, kMaxSocketsPerGroup, - host_resolver_.get(), - &client_socket_factory_, nullptr); + WebSocketTransportClientSocketPool pool( + kMaxSockets, kMaxSocketsPerGroup, host_resolver_.get(), + &client_socket_factory_, &websocket_endpoint_lock_manager_, nullptr); const base::TimeDelta connect_job_timeout = pool.ConnectionTimeout(); client_socket_factory_.set_default_client_socket_type( @@ -839,7 +844,8 @@ host_resolver_->set_synchronous_mode(true); for (int i = 0; i < kMaxSockets; ++i) { ASSERT_THAT(StartRequest("a", kDefaultPriority), IsOk()); - WebSocketTransportClientSocketPool::UnlockEndpoint(request(i)->handle()); + WebSocketTransportClientSocketPool::UnlockEndpoint( + request(i)->handle(), &websocket_endpoint_lock_manager_); RunUntilIdle(); } EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING)); @@ -854,7 +860,8 @@ RunUntilIdle(); EXPECT_TRUE(request(i)->handle()->is_initialized()); EXPECT_TRUE(request(i)->handle()->socket()); - WebSocketTransportClientSocketPool::UnlockEndpoint(request(i)->handle()); + WebSocketTransportClientSocketPool::UnlockEndpoint( + request(i)->handle(), &websocket_endpoint_lock_manager_); } // Now there are 32 sockets connected, and one stalled. RunUntilIdle(); @@ -866,7 +873,8 @@ host_resolver_->set_synchronous_mode(true); for (int i = 0; i < kMaxSockets; ++i) { ASSERT_THAT(StartRequest("a", kDefaultPriority), IsOk()); - WebSocketTransportClientSocketPool::UnlockEndpoint(request(i)->handle()); + WebSocketTransportClientSocketPool::UnlockEndpoint( + request(i)->handle(), &websocket_endpoint_lock_manager_); RunUntilIdle(); } @@ -1067,7 +1075,8 @@ EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING)); EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING)); // First socket completes handshake. - WebSocketTransportClientSocketPool::UnlockEndpoint(request(0)->handle()); + WebSocketTransportClientSocketPool::UnlockEndpoint( + request(0)->handle(), &websocket_endpoint_lock_manager_); RunUntilIdle(); // First socket is closed. request(0)->handle()->Reset();
diff --git a/net/socket/websocket_transport_connect_sub_job.cc b/net/socket/websocket_transport_connect_sub_job.cc index 97d3659..20232cf 100644 --- a/net/socket/websocket_transport_connect_sub_job.cc +++ b/net/socket/websocket_transport_connect_sub_job.cc
@@ -16,12 +16,14 @@ WebSocketTransportConnectSubJob::WebSocketTransportConnectSubJob( const AddressList& addresses, WebSocketTransportConnectJob* parent_job, - SubJobType type) + SubJobType type, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager) : parent_job_(parent_job), addresses_(addresses), current_address_index_(0), next_state_(STATE_NONE), - type_(type) {} + type_(type), + websocket_endpoint_lock_manager_(websocket_endpoint_lock_manager) {} WebSocketTransportConnectSubJob::~WebSocketTransportConnectSubJob() { // We don't worry about cancelling the TCP connect, since ~StreamSocket will @@ -30,8 +32,7 @@ DCHECK_EQ(STATE_OBTAIN_LOCK_COMPLETE, next_state_); // The ~Waiter destructor will remove this object from the waiting list. } else if (next_state_ == STATE_TRANSPORT_CONNECT_COMPLETE) { - WebSocketEndpointLockManager::GetInstance()->UnlockEndpoint( - CurrentAddress()); + websocket_endpoint_lock_manager_->UnlockEndpoint(CurrentAddress()); } } @@ -120,8 +121,8 @@ } int WebSocketTransportConnectSubJob::DoEndpointLock() { - int rv = WebSocketEndpointLockManager::GetInstance()->LockEndpoint( - CurrentAddress(), this); + int rv = + websocket_endpoint_lock_manager_->LockEndpoint(CurrentAddress(), this); next_state_ = STATE_OBTAIN_LOCK_COMPLETE; return rv; } @@ -146,10 +147,8 @@ int WebSocketTransportConnectSubJob::DoTransportConnectComplete(int result) { next_state_ = STATE_DONE; - WebSocketEndpointLockManager* endpoint_lock_manager = - WebSocketEndpointLockManager::GetInstance(); if (result != OK) { - endpoint_lock_manager->UnlockEndpoint(CurrentAddress()); + websocket_endpoint_lock_manager_->UnlockEndpoint(CurrentAddress()); if (current_address_index_ + 1 < addresses_.size()) { // Try falling back to the next address in the list. @@ -161,8 +160,8 @@ return result; } - endpoint_lock_manager->RememberSocket(transport_socket_.get(), - CurrentAddress()); + websocket_endpoint_lock_manager_->RememberSocket(transport_socket_.get(), + CurrentAddress()); return result; }
diff --git a/net/socket/websocket_transport_connect_sub_job.h b/net/socket/websocket_transport_connect_sub_job.h index 958eaa7..e1b933f2 100644 --- a/net/socket/websocket_transport_connect_sub_job.h +++ b/net/socket/websocket_transport_connect_sub_job.h
@@ -23,6 +23,7 @@ class IPEndPoint; class NetLogWithSource; class StreamSocket; +class WebSocketEndpointLockManager; // Attempts to connect to a subset of the addresses required by a // WebSocketTransportConnectJob, specifically either the IPv4 or IPv6 @@ -33,9 +34,11 @@ public: typedef WebSocketTransportConnectJob::SubJobType SubJobType; - WebSocketTransportConnectSubJob(const AddressList& addresses, - WebSocketTransportConnectJob* parent_job, - SubJobType type); + WebSocketTransportConnectSubJob( + const AddressList& addresses, + WebSocketTransportConnectJob* parent_job, + SubJobType type, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager); ~WebSocketTransportConnectSubJob() override; @@ -85,6 +88,7 @@ State next_state_; const SubJobType type_; + WebSocketEndpointLockManager* const websocket_endpoint_lock_manager_; std::unique_ptr<StreamSocket> transport_socket_;
diff --git a/net/websockets/websocket_basic_handshake_stream.cc b/net/websockets/websocket_basic_handshake_stream.cc index 7bc25ed..0701d203 100644 --- a/net/websockets/websocket_basic_handshake_stream.cc +++ b/net/websockets/websocket_basic_handshake_stream.cc
@@ -33,6 +33,7 @@ #include "net/http/http_stream_parser.h" #include "net/socket/client_socket_handle.h" #include "net/socket/ssl_client_socket.h" +#include "net/socket/websocket_endpoint_lock_manager.h" #include "net/socket/websocket_transport_client_socket_pool.h" #include "net/websockets/websocket_basic_stream.h" #include "net/websockets/websocket_basic_stream_adapters.h" @@ -167,7 +168,8 @@ bool using_proxy, std::vector<std::string> requested_sub_protocols, std::vector<std::string> requested_extensions, - WebSocketStreamRequest* request) + WebSocketStreamRequest* request, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager) : result_(HandshakeResult::INCOMPLETE), state_(std::move(connection), using_proxy, @@ -176,7 +178,8 @@ http_response_info_(nullptr), requested_sub_protocols_(requested_sub_protocols), requested_extensions_(requested_extensions), - stream_request_(request) { + stream_request_(request), + websocket_endpoint_lock_manager_(websocket_endpoint_lock_manager) { DCHECK(connect_delegate); DCHECK(request); } @@ -363,7 +366,8 @@ // The HttpStreamParser object has a pointer to our ClientSocketHandle. Make // sure it does not touch it again before it is destroyed. state_.DeleteParser(); - WebSocketTransportClientSocketPool::UnlockEndpoint(state_.connection()); + WebSocketTransportClientSocketPool::UnlockEndpoint( + state_.connection(), websocket_endpoint_lock_manager_); std::unique_ptr<WebSocketStream> basic_stream = std::make_unique<WebSocketBasicStream>( std::make_unique<WebSocketClientSocketHandleAdapter>(
diff --git a/net/websockets/websocket_basic_handshake_stream.h b/net/websockets/websocket_basic_handshake_stream.h index d9e3549..2197cb4 100644 --- a/net/websockets/websocket_basic_handshake_stream.h +++ b/net/websockets/websocket_basic_handshake_stream.h
@@ -25,7 +25,7 @@ class HttpResponseHeaders; class HttpResponseInfo; class HttpStreamParser; - +class WebSocketEndpointLockManager; struct WebSocketExtensionParams; class WebSocketStreamRequest; @@ -39,7 +39,8 @@ bool using_proxy, std::vector<std::string> requested_sub_protocols, std::vector<std::string> requested_extensions, - WebSocketStreamRequest* request); + WebSocketStreamRequest* request, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager); ~WebSocketBasicHandshakeStream() override; @@ -145,7 +146,9 @@ // to avoid including extension-related header files here. std::unique_ptr<WebSocketExtensionParams> extension_params_; - WebSocketStreamRequest* stream_request_; + WebSocketStreamRequest* const stream_request_; + + WebSocketEndpointLockManager* const websocket_endpoint_lock_manager_; DISALLOW_COPY_AND_ASSIGN(WebSocketBasicHandshakeStream); };
diff --git a/net/websockets/websocket_basic_stream_adapters_test.cc b/net/websockets/websocket_basic_stream_adapters_test.cc index 9a800ff..f7246c8 100644 --- a/net/websockets/websocket_basic_stream_adapters_test.cc +++ b/net/websockets/websocket_basic_stream_adapters_test.cc
@@ -25,6 +25,7 @@ #include "net/socket/socket_test_util.h" #include "net/socket/ssl_client_socket_pool.h" #include "net/socket/transport_client_socket_pool.h" +#include "net/socket/websocket_endpoint_lock_manager.h" #include "net/spdy/chromium/spdy_session.h" #include "net/spdy/chromium/spdy_session_key.h" #include "net/spdy/chromium/spdy_test_util_common.h" @@ -65,6 +66,7 @@ nullptr, "test_shard", nullptr, + &websocket_endpoint_lock_manager_, HttpNetworkSession::NORMAL_SOCKET_POOL)), transport_params_(base::MakeRefCounted<TransportSocketParams>( host_port_pair_, @@ -98,6 +100,7 @@ std::unique_ptr<ClientSocketPoolManagerImpl> socket_pool_manager_; scoped_refptr<TransportSocketParams> transport_params_; scoped_refptr<SSLSocketParams> ssl_params_; + WebSocketEndpointLockManager websocket_endpoint_lock_manager_; }; TEST_F(WebSocketClientSocketHandleAdapterTest, Uninitialized) {
diff --git a/net/websockets/websocket_handshake_stream_base.h b/net/websockets/websocket_handshake_stream_base.h index 9d881c2..44da6a9 100644 --- a/net/websockets/websocket_handshake_stream_base.h +++ b/net/websockets/websocket_handshake_stream_base.h
@@ -27,6 +27,7 @@ class SpdySession; class HttpRequestHeaders; class HttpResponseHeaders; +class WebSocketEndpointLockManager; // WebSocketHandshakeStreamBase is the base class of // WebSocketBasicHandshakeStream. net/http code uses this interface to handle @@ -97,7 +98,8 @@ // HTTP authentication is needed. virtual std::unique_ptr<WebSocketHandshakeStreamBase> CreateBasicStream( std::unique_ptr<ClientSocketHandle> connection, - bool using_proxy) = 0; + bool using_proxy, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager) = 0; // Create a WebSocketHttp2HandshakeStream. This is called after the // underlying HTTP/2 connection has been established but before the stream
diff --git a/net/websockets/websocket_handshake_stream_create_helper.cc b/net/websockets/websocket_handshake_stream_create_helper.cc index ca08293a..23718bc 100644 --- a/net/websockets/websocket_handshake_stream_create_helper.cc +++ b/net/websockets/websocket_handshake_stream_create_helper.cc
@@ -29,7 +29,8 @@ std::unique_ptr<WebSocketHandshakeStreamBase> WebSocketHandshakeStreamCreateHelper::CreateBasicStream( std::unique_ptr<ClientSocketHandle> connection, - bool using_proxy) { + bool using_proxy, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager) { DCHECK(request_) << "set_request() must be called"; // The list of supported extensions and parameters is hard-coded. @@ -39,7 +40,8 @@ 1, "permessage-deflate; client_max_window_bits"); auto stream = std::make_unique<WebSocketBasicHandshakeStream>( std::move(connection), connect_delegate_, using_proxy, - requested_subprotocols_, extensions, request_); + requested_subprotocols_, extensions, request_, + websocket_endpoint_lock_manager); OnBasicStreamCreated(stream.get()); request_->OnHandshakeStreamCreated(stream.get()); return std::move(stream);
diff --git a/net/websockets/websocket_handshake_stream_create_helper.h b/net/websockets/websocket_handshake_stream_create_helper.h index c21d351..8a07996 100644 --- a/net/websockets/websocket_handshake_stream_create_helper.h +++ b/net/websockets/websocket_handshake_stream_create_helper.h
@@ -19,6 +19,7 @@ class WebSocketStreamRequest; class SpdySession; class WebSocketBasicHandshakeStream; +class WebSocketEndpointLockManager; // Implementation of WebSocketHandshakeStreamBase::CreateHelper. This class is // used in the implementation of WebSocketStream::CreateAndConnectStream() and @@ -41,7 +42,8 @@ // Creates a WebSocketBasicHandshakeStream over a TCP/IP or TLS socket. std::unique_ptr<WebSocketHandshakeStreamBase> CreateBasicStream( std::unique_ptr<ClientSocketHandle> connection, - bool using_proxy) override; + bool using_proxy, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager) override; // Creates a WebSocketHttp2HandshakeStream over an HTTP/2 connection. std::unique_ptr<WebSocketHandshakeStreamBase> CreateHttp2Stream(
diff --git a/net/websockets/websocket_handshake_stream_create_helper_test.cc b/net/websockets/websocket_handshake_stream_create_helper_test.cc index e0817ba0..c4fa504 100644 --- a/net/websockets/websocket_handshake_stream_create_helper_test.cc +++ b/net/websockets/websocket_handshake_stream_create_helper_test.cc
@@ -23,6 +23,7 @@ #include "net/socket/client_socket_handle.h" #include "net/socket/socket_tag.h" #include "net/socket/socket_test_util.h" +#include "net/socket/websocket_endpoint_lock_manager.h" #include "net/spdy/chromium/spdy_session.h" #include "net/spdy/chromium/spdy_session_key.h" #include "net/spdy/chromium/spdy_test_util_common.h" @@ -156,7 +157,8 @@ WebSocketExtraHeadersToString(extra_response_headers))); std::unique_ptr<WebSocketHandshakeStreamBase> handshake = - create_helper.CreateBasicStream(std::move(socket_handle), false); + create_helper.CreateBasicStream(std::move(socket_handle), false, + &websocket_endpoint_lock_manager_); // If in future the implementation type returned by CreateBasicStream() // changes, this static_cast will be wrong. However, in that case the @@ -251,6 +253,7 @@ MockClientSocketHandleFactory socket_handle_factory_; TestConnectDelegate connect_delegate_; StrictMock<MockWebSocketStreamRequest> stream_request_; + WebSocketEndpointLockManager websocket_endpoint_lock_manager_; }; INSTANTIATE_TEST_CASE_P(,
diff --git a/net/websockets/websocket_stream_create_test_base.h b/net/websockets/websocket_stream_create_test_base.h index e341fcb5..4992d49a 100644 --- a/net/websockets/websocket_stream_create_test_base.h +++ b/net/websockets/websocket_stream_create_test_base.h
@@ -77,9 +77,6 @@ bool ssl_fatal_; URLRequest* url_request_; - // This temporarily sets WebSocketEndpointLockManager unlock delay to zero - // during tests. - ScopedWebSocketEndpointZeroUnlockDelay zero_unlock_delay_; base::RunLoop connect_run_loop_; private:
diff --git a/pdf/pdfium/fuzzers/BUILD.gn b/pdf/pdfium/fuzzers/BUILD.gn index cfff56d..98062af 100644 --- a/pdf/pdfium/fuzzers/BUILD.gn +++ b/pdf/pdfium/fuzzers/BUILD.gn
@@ -31,7 +31,6 @@ if (pdf_enable_xfa) { deps += [ ":pdf_cfx_barcode_fuzzer", - ":pdf_cfx_saxreader_fuzzer", ":pdf_codec_bmp_fuzzer", ":pdf_codec_gif_fuzzer", ":pdf_codec_jpeg_fuzzer", @@ -242,14 +241,6 @@ ] } - fuzzer_test("pdf_cfx_saxreader_fuzzer") { - sources = [] - deps = [ - "//third_party/pdfium/testing/libfuzzer:pdf_cfx_saxreader_fuzzer", - ] - dict = "dicts/pdf_xml.dict" - } - fuzzer_test("pdfium_xfa_fuzzer") { sources = [ "pdfium_fuzzer_helper.cc",
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index 80ffa6d..54da219 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -107,13 +107,15 @@ mojom::NetworkContextParamsPtr params) : network_service_(network_service), params_(std::move(params)), - binding_(this, std::move(request)), - socket_factory_(network_service_->net_log()) { + binding_(this, std::move(request)) { url_request_context_owner_ = MakeURLRequestContext(params_.get()); url_request_context_getter_ = url_request_context_owner_.url_request_context_getter; cookie_manager_ = std::make_unique<CookieManager>(GetURLRequestContext()->cookie_store()); + + socket_factory_ = std::make_unique<SocketFactory>(network_service_->net_log(), + GetURLRequestContext()); network_service_->RegisterNetworkContext(this); binding_.set_connection_error_handler(base::BindOnce( &NetworkContext::OnConnectionError, base::Unretained(this))); @@ -131,8 +133,7 @@ std::unique_ptr<URLRequestContextBuilderMojo> builder) : network_service_(network_service), params_(std::move(params)), - binding_(this, std::move(request)), - socket_factory_(network_service_->net_log()) { + binding_(this, std::move(request)) { url_request_context_owner_ = ApplyContextParamsToBuilder( builder.get(), params_.get(), network_service->quic_disabled(), network_service->net_log(), network_service->network_quality_estimator(), @@ -142,6 +143,8 @@ network_service_->RegisterNetworkContext(this); cookie_manager_ = std::make_unique<CookieManager>(GetURLRequestContext()->cookie_store()); + socket_factory_ = std::make_unique<SocketFactory>(network_service_->net_log(), + GetURLRequestContext()); resource_scheduler_ = std::make_unique<ResourceScheduler>(enable_resource_scheduler_); } @@ -155,8 +158,9 @@ binding_(this, std::move(request)), cookie_manager_(std::make_unique<CookieManager>( url_request_context_getter_->GetURLRequestContext()->cookie_store())), - socket_factory_(network_service_ ? network_service_->net_log() - : nullptr) { + socket_factory_(std::make_unique<SocketFactory>( + network_service_ ? network_service_->net_log() : nullptr, + url_request_context_getter_->GetURLRequestContext())) { // May be nullptr in tests. if (network_service_) network_service_->RegisterNetworkContext(this); @@ -246,10 +250,7 @@ } NetworkContext::NetworkContext(mojom::NetworkContextParamsPtr params) - : network_service_(nullptr), - params_(std::move(params)), - binding_(this), - socket_factory_(network_service_->net_log()) { + : network_service_(nullptr), params_(std::move(params)), binding_(this) { url_request_context_owner_ = MakeURLRequestContext(params_.get()); url_request_context_getter_ = url_request_context_owner_.url_request_context_getter; @@ -569,7 +570,7 @@ void NetworkContext::CreateUDPSocket(mojom::UDPSocketRequest request, mojom::UDPSocketReceiverPtr receiver) { - socket_factory_.CreateUDPSocket(std::move(request), std::move(receiver)); + socket_factory_->CreateUDPSocket(std::move(request), std::move(receiver)); } void NetworkContext::CreateTCPServerSocket( @@ -578,7 +579,7 @@ const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, mojom::TCPServerSocketRequest request, CreateTCPServerSocketCallback callback) { - socket_factory_.CreateTCPServerSocket( + socket_factory_->CreateTCPServerSocket( local_addr, backlog, static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation), std::move(request), std::move(callback)); @@ -591,7 +592,7 @@ mojom::TCPConnectedSocketRequest request, mojom::TCPConnectedSocketObserverPtr observer, CreateTCPConnectedSocketCallback callback) { - socket_factory_.CreateTCPConnectedSocket( + socket_factory_->CreateTCPConnectedSocket( local_addr, remote_addr_list, static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation), std::move(request), std::move(observer), std::move(callback));
diff --git a/services/network/network_context.h b/services/network/network_context.h index 71e3729..3fab40d 100644 --- a/services/network/network_context.h +++ b/services/network/network_context.h
@@ -212,7 +212,7 @@ std::unique_ptr<CookieManager> cookie_manager_; - SocketFactory socket_factory_; + std::unique_ptr<SocketFactory> socket_factory_; #if !defined(OS_IOS) std::unique_ptr<WebSocketFactory> websocket_factory_;
diff --git a/services/network/socket_factory.cc b/services/network/socket_factory.cc index 795ae2d..bd6cbbc4 100644 --- a/services/network/socket_factory.cc +++ b/services/network/socket_factory.cc
@@ -10,12 +10,23 @@ #include "net/base/completion_once_callback.h" #include "net/base/net_errors.h" #include "net/log/net_log.h" +#include "net/socket/client_socket_factory.h" +#include "net/url_request/url_request_context.h" #include "services/network/tcp_connected_socket.h" #include "services/network/udp_socket.h" namespace network { -SocketFactory::SocketFactory(net::NetLog* net_log) : net_log_(net_log) {} +SocketFactory::SocketFactory(net::NetLog* net_log, + net::URLRequestContext* url_request_context) + : net_log_(net_log) { + if (url_request_context->GetNetworkSessionContext()) { + client_socket_factory_ = + url_request_context->GetNetworkSessionContext()->client_socket_factory; + } else { + client_socket_factory_ = nullptr; + } +} SocketFactory::~SocketFactory() {} @@ -52,7 +63,8 @@ mojom::TCPConnectedSocketObserverPtr observer, mojom::NetworkContext::CreateTCPConnectedSocketCallback callback) { auto socket = std::make_unique<TCPConnectedSocket>( - std::move(observer), net_log_, traffic_annotation); + std::move(observer), net_log_, client_socket_factory_, + traffic_annotation); TCPConnectedSocket* socket_raw = socket.get(); tcp_connected_socket_bindings_.AddBinding(std::move(socket), std::move(request));
diff --git a/services/network/socket_factory.h b/services/network/socket_factory.h index 59d1ac67..d1e6bc86 100644 --- a/services/network/socket_factory.h +++ b/services/network/socket_factory.h
@@ -19,6 +19,7 @@ #include "services/network/tcp_server_socket.h" namespace net { +class ClientSocketFactory; class NetLog; } // namespace net @@ -35,7 +36,8 @@ // Constructs a SocketFactory. If |net_log| is non-null, it is used to // log NetLog events when logging is enabled. |net_log| used to must outlive // |this|. - explicit SocketFactory(net::NetLog* net_log); + SocketFactory(net::NetLog* net_log, + net::URLRequestContext* url_request_context); virtual ~SocketFactory(); void CreateUDPSocket(mojom::UDPSocketRequest request, @@ -59,9 +61,8 @@ void OnAccept(std::unique_ptr<TCPConnectedSocket> socket, mojom::TCPConnectedSocketRequest request) override; - void OnConnectCompleted(int result); - net::NetLog* net_log_; + net::ClientSocketFactory* client_socket_factory_; mojo::StrongBindingSet<mojom::UDPSocket> udp_socket_bindings_; mojo::StrongBindingSet<mojom::TCPServerSocket> tcp_server_socket_bindings_; mojo::StrongBindingSet<mojom::TCPConnectedSocket>
diff --git a/services/network/tcp_connected_socket.cc b/services/network/tcp_connected_socket.cc index d1b5f60..10578b76 100644 --- a/services/network/tcp_connected_socket.cc +++ b/services/network/tcp_connected_socket.cc
@@ -12,21 +12,25 @@ #include "net/base/io_buffer.h" #include "net/base/net_errors.h" #include "net/log/net_log.h" +#include "net/socket/client_socket_factory.h" namespace network { TCPConnectedSocket::TCPConnectedSocket( mojom::TCPConnectedSocketObserverPtr observer, net::NetLog* net_log, + net::ClientSocketFactory* client_socket_factory, const net::NetworkTrafficAnnotationTag& traffic_annotation) : observer_(std::move(observer)), net_log_(net_log), + client_socket_factory_(client_socket_factory == nullptr + ? net::ClientSocketFactory::GetDefaultFactory() + : client_socket_factory), readable_handle_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL), writable_handle_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL), - traffic_annotation_(traffic_annotation) { -} + traffic_annotation_(traffic_annotation) {} TCPConnectedSocket::TCPConnectedSocket( mojom::TCPConnectedSocketObserverPtr observer, @@ -36,6 +40,7 @@ const net::NetworkTrafficAnnotationTag& traffic_annotation) : observer_(std::move(observer)), net_log_(nullptr), + client_socket_factory_(nullptr), socket_(std::move(socket)), send_stream_(std::move(send_pipe_handle)), readable_handle_watcher_(FROM_HERE, @@ -56,7 +61,7 @@ DCHECK(!socket_); DCHECK(callback); - auto socket = std::make_unique<net::TCPClientSocket>( + auto socket = client_socket_factory_->CreateTransportClientSocket( remote_addr_list, nullptr /*socket_performance_watcher*/, net_log_, net::NetLogSource()); connect_callback_ = std::move(callback);
diff --git a/services/network/tcp_connected_socket.h b/services/network/tcp_connected_socket.h index 17665feb..ce4b9e1 100644 --- a/services/network/tcp_connected_socket.h +++ b/services/network/tcp_connected_socket.h
@@ -25,6 +25,7 @@ #include "services/network/public/mojom/tcp_socket.mojom.h" namespace net { +class ClientSocketFactory; class NetLog; class StreamSocket; } // namespace net @@ -37,6 +38,7 @@ TCPConnectedSocket( mojom::TCPConnectedSocketObserverPtr observer, net::NetLog* net_log, + net::ClientSocketFactory* client_socket_factory, const net::NetworkTrafficAnnotationTag& traffic_annotation); TCPConnectedSocket( mojom::TCPConnectedSocketObserverPtr observer, @@ -77,6 +79,7 @@ mojom::TCPConnectedSocketObserverPtr observer_; net::NetLog* net_log_; + net::ClientSocketFactory* client_socket_factory_; std::unique_ptr<net::StreamSocket> socket_;
diff --git a/services/network/tcp_socket_unittest.cc b/services/network/tcp_socket_unittest.cc index f775fe2..5b04414 100644 --- a/services/network/tcp_socket_unittest.cc +++ b/services/network/tcp_socket_unittest.cc
@@ -23,6 +23,7 @@ #include "net/socket/server_socket.h" #include "net/socket/socket_test_util.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" +#include "net/url_request/url_request_test_util.h" #include "services/network/public/mojom/network_service.mojom.h" #include "services/network/public/mojom/udp_socket.mojom.h" #include "services/network/socket_factory.h" @@ -172,7 +173,7 @@ TestServer() : TestServer(net::IPEndPoint(net::IPAddress::IPv6Localhost(), 0)) {} explicit TestServer(const net::IPEndPoint& server_addr) - : factory_(nullptr), + : factory_(nullptr, &url_request_context_), readable_handle_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC), server_addr_(server_addr) {} @@ -273,6 +274,7 @@ } } + net::TestURLRequestContext url_request_context_; SocketFactory factory_; mojom::TCPServerSocketPtr server_socket_; std::vector<mojom::TCPConnectedSocketPtr> connected_sockets_; @@ -292,9 +294,18 @@ TCPSocketTest() : scoped_task_environment_( base::test::ScopedTaskEnvironment::MainThreadType::IO), - factory_(nullptr /*net_log*/) {} + url_request_context_(true) {} ~TCPSocketTest() override {} + void Init(net::ClientSocketFactory* mock_client_socket_factory) { + url_request_context_.set_client_socket_factory(mock_client_socket_factory); + url_request_context_.Init(); + factory_ = std::make_unique<SocketFactory>(nullptr /*net_log*/, + &url_request_context_); + } + + void SetUp() override { Init(nullptr); } + // Reads |num_bytes| from |handle| or reads until an error occurs. Returns the // bytes read as a string. std::string Read(mojo::ScopedDataPipeConsumerHandle* handle, @@ -321,7 +332,7 @@ mojom::TCPServerSocketRequest request, std::unique_ptr<net::ServerSocket> socket) { auto server_socket_impl = std::make_unique<TCPServerSocket>( - &factory_, nullptr /*netlog*/, TRAFFIC_ANNOTATION_FOR_TESTS); + factory_.get(), nullptr /*netlog*/, TRAFFIC_ANNOTATION_FOR_TESTS); server_socket_impl->SetSocketForTest(std::move(socket)); net::IPEndPoint local_addr; EXPECT_EQ(net::OK, @@ -330,23 +341,6 @@ std::move(request)); } - // Creates a TCPConnectedSocket with a mock client socket, |socket|. - // This can be only called once. - void CreateConnectedSocketWithMockSocket( - mojom::TCPConnectedSocketRequest request, - mojo::ScopedDataPipeProducerHandle receive_pipe_handle, - mojo::ScopedDataPipeConsumerHandle send_pipe_handle, - std::unique_ptr<net::MockTCPClientSocket> socket) { - net::TestCompletionCallback dummy_callback; - EXPECT_EQ(net::OK, socket->Connect(dummy_callback.callback())); - auto socket_impl = std::make_unique<TCPConnectedSocket>( - test_observer_.GetObserverPtr(), std::move(socket), - std::move(receive_pipe_handle), std::move(send_pipe_handle), - TRAFFIC_ANNOTATION_FOR_TESTS); - tcp_connected_socket_bindings_.AddBinding(std::move(socket_impl), - std::move(request)); - } - int CreateTCPConnectedSocketSync( mojom::TCPConnectedSocketRequest request, mojom::TCPConnectedSocketObserverPtr observer, @@ -357,7 +351,7 @@ net::AddressList remote_addr_list(remote_addr); base::RunLoop run_loop; int net_error = net::ERR_FAILED; - factory_.CreateTCPConnectedSocket( + factory_->CreateTCPConnectedSocket( local_addr, remote_addr_list, TRAFFIC_ANNOTATION_FOR_TESTS, std::move(request), std::move(observer), base::BindOnce( @@ -381,7 +375,8 @@ private: base::test::ScopedTaskEnvironment scoped_task_environment_; - SocketFactory factory_; + net::TestURLRequestContext url_request_context_; + std::unique_ptr<SocketFactory> factory_; TestTCPConnectedSocketObserver test_observer_; mojo::StrongBindingSet<mojom::TCPServerSocket> tcp_server_socket_bindings_; mojo::StrongBindingSet<mojom::TCPConnectedSocket> @@ -651,7 +646,12 @@ // Tests both async and sync cases. class TCPSocketWithMockSocketTest : public TCPSocketTest, - public ::testing::WithParamInterface<net::IoMode> {}; + public ::testing::WithParamInterface<net::IoMode> { + public: + void SetUp() override { Init(&mock_client_socket_factory_); } + + net::MockClientSocketFactory mock_client_socket_factory_; +}; INSTANTIATE_TEST_CASE_P(/* no prefix */, TCPSocketWithMockSocketTest, @@ -782,7 +782,7 @@ } // Tests that TCPServerSocket::Accept() is used with a non-null -// TCPConnectedSocketObserver and that the observer is invoked when a write +// TCPConnectedSocketObserver and that the observer is invoked when a write // error occurs. TEST_P(TCPSocketWithMockSocketTest, ServerAcceptWithObserverWriteError) { net::IoMode mode = GetParam(); @@ -844,13 +844,6 @@ } TEST_P(TCPSocketWithMockSocketTest, ReadAndWriteMultiple) { - mojo::DataPipe send_pipe; - mojo::DataPipe receive_pipe; - mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle = - std::move(receive_pipe.consumer_handle); - mojo::ScopedDataPipeProducerHandle client_socket_send_handle = - std::move(send_pipe.producer_handle); - mojom::TCPConnectedSocketPtr client_socket; const char kTestMsg[] = "abcdefghij"; const size_t kMsgSize = strlen(kTestMsg); @@ -873,14 +866,16 @@ } net::StaticSocketDataProvider data_provider(reads.data(), reads.size(), writes.data(), writes.size()); - data_provider.set_connect_data(net::MockConnect(net::SYNCHRONOUS, net::OK)); - auto mock_socket = std::make_unique<net::MockTCPClientSocket>( - net::AddressList(), nullptr /*netlog*/, &data_provider); - - CreateConnectedSocketWithMockSocket(mojo::MakeRequest(&client_socket), - std::move(receive_pipe.producer_handle), - std::move(send_pipe.consumer_handle), - std::move(mock_socket)); + net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); + data_provider.set_connect_data( + net::MockConnect(net::SYNCHRONOUS, net::OK, server_addr)); + mock_client_socket_factory_.AddSocketDataProvider(&data_provider); + mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle; + mojo::ScopedDataPipeProducerHandle client_socket_send_handle; + CreateTCPConnectedSocketSync( + mojo::MakeRequest(&client_socket), nullptr /*observer*/, + base::nullopt /*local_addr*/, server_addr, &client_socket_receive_handle, + &client_socket_send_handle); // Loop kNumIterations times to test that writes can follow reads, and reads // can follow writes. @@ -902,13 +897,6 @@ } TEST_P(TCPSocketWithMockSocketTest, PartialStreamSocketWrite) { - mojo::DataPipe send_pipe; - mojo::DataPipe receive_pipe; - mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle = - std::move(receive_pipe.consumer_handle); - mojo::ScopedDataPipeProducerHandle client_socket_send_handle = - std::move(send_pipe.producer_handle); - mojom::TCPConnectedSocketPtr client_socket; const char kTestMsg[] = "abcdefghij"; const size_t kMsgSize = strlen(kTestMsg); @@ -931,14 +919,16 @@ } net::StaticSocketDataProvider data_provider(reads.data(), reads.size(), writes.data(), writes.size()); - data_provider.set_connect_data(net::MockConnect(net::SYNCHRONOUS, net::OK)); - auto mock_socket = std::make_unique<net::MockTCPClientSocket>( - net::AddressList(), nullptr /*netlog*/, &data_provider); - - CreateConnectedSocketWithMockSocket(mojo::MakeRequest(&client_socket), - std::move(receive_pipe.producer_handle), - std::move(send_pipe.consumer_handle), - std::move(mock_socket)); + net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); + data_provider.set_connect_data( + net::MockConnect(net::SYNCHRONOUS, net::OK, server_addr)); + mock_client_socket_factory_.AddSocketDataProvider(&data_provider); + mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle; + mojo::ScopedDataPipeProducerHandle client_socket_send_handle; + CreateTCPConnectedSocketSync( + mojo::MakeRequest(&client_socket), nullptr /*observer*/, + base::nullopt /*local_addr*/, server_addr, &client_socket_receive_handle, + &client_socket_send_handle); // Loop kNumIterations times to test that writes can follow reads, and reads // can follow writes. @@ -967,29 +957,24 @@ } TEST_P(TCPSocketWithMockSocketTest, ReadError) { - mojo::DataPipe send_pipe; - mojo::DataPipe receive_pipe; - mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle = - std::move(receive_pipe.consumer_handle); - mojo::ScopedDataPipeProducerHandle client_socket_send_handle = - std::move(send_pipe.producer_handle); - mojom::TCPConnectedSocketPtr client_socket; net::IoMode mode = GetParam(); net::MockRead reads[] = {net::MockRead(mode, net::ERR_FAILED)}; const char kTestMsg[] = "hello!"; net::MockWrite writes[] = { net::MockWrite(mode, kTestMsg, strlen(kTestMsg), 0)}; + net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); net::StaticSocketDataProvider data_provider(reads, arraysize(reads), writes, arraysize(writes)); - data_provider.set_connect_data(net::MockConnect(net::SYNCHRONOUS, net::OK)); - auto mock_socket = std::make_unique<net::MockTCPClientSocket>( - net::AddressList(), nullptr /*netlog*/, &data_provider); - - CreateConnectedSocketWithMockSocket(mojo::MakeRequest(&client_socket), - std::move(receive_pipe.producer_handle), - std::move(send_pipe.consumer_handle), - std::move(mock_socket)); + data_provider.set_connect_data( + net::MockConnect(net::SYNCHRONOUS, net::OK, server_addr)); + mock_client_socket_factory_.AddSocketDataProvider(&data_provider); + mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle; + mojo::ScopedDataPipeProducerHandle client_socket_send_handle; + CreateTCPConnectedSocketSync( + mojo::MakeRequest(&client_socket), observer()->GetObserverPtr(), + base::nullopt /*local_addr*/, server_addr, &client_socket_receive_handle, + &client_socket_send_handle); EXPECT_EQ("", Read(&client_socket_receive_handle, 1)); EXPECT_EQ(net::ERR_FAILED, observer()->WaitForReadError()); @@ -1005,13 +990,6 @@ } TEST_P(TCPSocketWithMockSocketTest, WriteError) { - mojo::DataPipe send_pipe; - mojo::DataPipe receive_pipe; - mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle = - std::move(receive_pipe.consumer_handle); - mojo::ScopedDataPipeProducerHandle client_socket_send_handle = - std::move(send_pipe.producer_handle); - mojom::TCPConnectedSocketPtr client_socket; net::IoMode mode = GetParam(); const char kTestMsg[] = "hello!"; @@ -1020,15 +998,16 @@ net::MockWrite writes[] = {net::MockWrite(mode, net::ERR_FAILED)}; net::StaticSocketDataProvider data_provider(reads, arraysize(reads), writes, arraysize(writes)); - data_provider.set_connect_data(net::MockConnect(net::SYNCHRONOUS, net::OK)); - auto mock_socket = std::make_unique<net::MockTCPClientSocket>( - net::AddressList(), nullptr /*netlog*/, &data_provider); - - CreateConnectedSocketWithMockSocket(mojo::MakeRequest(&client_socket), - std::move(receive_pipe.producer_handle), - std::move(send_pipe.consumer_handle), - std::move(mock_socket)); - + net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); + data_provider.set_connect_data( + net::MockConnect(net::SYNCHRONOUS, net::OK, server_addr)); + mock_client_socket_factory_.AddSocketDataProvider(&data_provider); + mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle; + mojo::ScopedDataPipeProducerHandle client_socket_send_handle; + CreateTCPConnectedSocketSync( + mojo::MakeRequest(&client_socket), observer()->GetObserverPtr(), + base::nullopt /*local_addr*/, server_addr, &client_socket_receive_handle, + &client_socket_send_handle); uint32_t num_bytes = strlen(kTestMsg); EXPECT_EQ(MOJO_RESULT_OK, client_socket_send_handle->WriteData(&kTestMsg, &num_bytes,
diff --git a/services/network/udp_socket_unittest.cc b/services/network/udp_socket_unittest.cc index 7ca3552..2e4fb40d 100644 --- a/services/network/udp_socket_unittest.cc +++ b/services/network/udp_socket_unittest.cc
@@ -20,6 +20,7 @@ #include "net/socket/udp_socket.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" +#include "net/url_request/url_request_test_util.h" #include "services/network/public/mojom/udp_socket.mojom.h" #include "services/network/socket_factory.h" #include "services/network/udp_socket_test_util.h" @@ -180,7 +181,8 @@ public: UDPSocketTest() : scoped_task_environment_( - base::test::ScopedTaskEnvironment::MainThreadType::IO) {} + base::test::ScopedTaskEnvironment::MainThreadType::IO), + factory_(nullptr /*netlog*/, &url_request_context_) {} ~UDPSocketTest() override {} void SetWrappedSocket( @@ -193,16 +195,19 @@ return socket->remaining_recv_slots_; } + SocketFactory* factory() { return &factory_; } + private: base::test::ScopedTaskEnvironment scoped_task_environment_; + net::TestURLRequestContext url_request_context_; + SocketFactory factory_; DISALLOW_COPY_AND_ASSIGN(UDPSocketTest); }; TEST_F(UDPSocketTest, Settings) { - SocketFactory factory(nullptr /*net_log*/); mojom::UDPSocketPtr socket_ptr; - factory.CreateUDPSocket(mojo::MakeRequest(&socket_ptr), nullptr); + factory()->CreateUDPSocket(mojo::MakeRequest(&socket_ptr), nullptr); net::IPEndPoint server_addr; net::IPEndPoint any_port(GetLocalHostWithAnyPort()); @@ -219,9 +224,8 @@ // Tests that Send() is used after Bind() is not supported. Send() should only // be used after Connect(). TEST_F(UDPSocketTest, TestSendWithBind) { - SocketFactory factory(nullptr /*net_log*/); mojom::UDPSocketPtr socket_ptr; - factory.CreateUDPSocket(mojo::MakeRequest(&socket_ptr), nullptr); + factory()->CreateUDPSocket(mojo::MakeRequest(&socket_ptr), nullptr); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); @@ -238,7 +242,6 @@ // Tests that when SendTo() is used after Connect() is not supported. SendTo() // should only be used after Bind(). TEST_F(UDPSocketTest, TestSendToWithConnect) { - SocketFactory factory(nullptr /*net_log*/); // Create a server socket to listen for incoming datagrams. test::UDPSocketReceiverImpl receiver; mojo::Binding<mojom::UDPSocketReceiver> receiver_binding(&receiver); @@ -246,8 +249,8 @@ receiver_binding.Bind(mojo::MakeRequest(&receiver_interface_ptr)); mojom::UDPSocketPtr server_socket; - factory.CreateUDPSocket(mojo::MakeRequest(&server_socket), - std::move(receiver_interface_ptr)); + factory()->CreateUDPSocket(mojo::MakeRequest(&server_socket), + std::move(receiver_interface_ptr)); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper helper(&server_socket); @@ -255,7 +258,7 @@ // Create a client socket to send datagrams. mojom::UDPSocketPtr client_socket; - factory.CreateUDPSocket(mojo::MakeRequest(&client_socket), nullptr); + factory()->CreateUDPSocket(mojo::MakeRequest(&client_socket), nullptr); net::IPEndPoint client_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper client_helper(&client_socket); ASSERT_EQ(net::OK, @@ -269,9 +272,8 @@ // Tests that the sequence of calling Bind()/Connect() and setters is // important. TEST_F(UDPSocketTest, TestUnexpectedSequences) { - SocketFactory factory(nullptr /*net_log*/); mojom::UDPSocketPtr socket_ptr; - factory.CreateUDPSocket(mojo::MakeRequest(&socket_ptr), nullptr); + factory()->CreateUDPSocket(mojo::MakeRequest(&socket_ptr), nullptr); test::UDPSocketTestHelper helper(&socket_ptr); net::IPEndPoint local_addr(GetLocalHostWithAnyPort()); @@ -402,7 +404,6 @@ } TEST_F(UDPSocketTest, TestReadSend) { - SocketFactory factory(nullptr /*net_log*/); // Create a server socket to listen for incoming datagrams. test::UDPSocketReceiverImpl receiver; mojo::Binding<mojom::UDPSocketReceiver> receiver_binding(&receiver); @@ -410,8 +411,8 @@ receiver_binding.Bind(mojo::MakeRequest(&receiver_interface_ptr)); mojom::UDPSocketPtr server_socket; - factory.CreateUDPSocket(mojo::MakeRequest(&server_socket), - std::move(receiver_interface_ptr)); + factory()->CreateUDPSocket(mojo::MakeRequest(&server_socket), + std::move(receiver_interface_ptr)); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper helper(&server_socket); @@ -419,7 +420,7 @@ // Create a client socket to send datagrams. mojom::UDPSocketPtr client_socket; - factory.CreateUDPSocket(mojo::MakeRequest(&client_socket), nullptr); + factory()->CreateUDPSocket(mojo::MakeRequest(&client_socket), nullptr); net::IPEndPoint client_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper client_helper(&client_socket); ASSERT_EQ(net::OK, @@ -472,10 +473,9 @@ } TEST_F(UDPSocketTest, TestReadSendTo) { - SocketFactory factory(nullptr /*net_log*/); // Create a server socket to send data. mojom::UDPSocketPtr server_socket; - factory.CreateUDPSocket(mojo::MakeRequest(&server_socket), nullptr); + factory()->CreateUDPSocket(mojo::MakeRequest(&server_socket), nullptr); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper helper(&server_socket); @@ -488,8 +488,8 @@ receiver_binding.Bind(mojo::MakeRequest(&client_receiver_ptr)); mojom::UDPSocketPtr client_socket; - factory.CreateUDPSocket(mojo::MakeRequest(&client_socket), - std::move(client_receiver_ptr)); + factory()->CreateUDPSocket(mojo::MakeRequest(&client_socket), + std::move(client_receiver_ptr)); net::IPEndPoint client_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper client_helper(&client_socket); ASSERT_EQ(net::OK, @@ -539,7 +539,6 @@ } TEST_F(UDPSocketTest, TestReceiveMoreWithBufferSize) { - SocketFactory factory(nullptr /*net_log*/); // Create a server socket to listen for incoming datagrams. test::UDPSocketReceiverImpl receiver; mojo::Binding<mojom::UDPSocketReceiver> receiver_binding(&receiver); @@ -547,8 +546,8 @@ receiver_binding.Bind(mojo::MakeRequest(&receiver_interface_ptr)); mojom::UDPSocketPtr server_socket; - factory.CreateUDPSocket(mojo::MakeRequest(&server_socket), - std::move(receiver_interface_ptr)); + factory()->CreateUDPSocket(mojo::MakeRequest(&server_socket), + std::move(receiver_interface_ptr)); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper helper(&server_socket); @@ -556,7 +555,7 @@ // Create a client socket to send datagrams. mojom::UDPSocketPtr client_socket; - factory.CreateUDPSocket(mojo::MakeRequest(&client_socket), nullptr); + factory()->CreateUDPSocket(mojo::MakeRequest(&client_socket), nullptr); net::IPEndPoint client_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper client_helper(&client_socket); ASSERT_EQ(net::OK, @@ -591,9 +590,8 @@ // Make sure passing an invalid net::IPEndPoint will be detected by // serialization/deserialization in mojo. TEST_F(UDPSocketTest, TestSendToInvalidAddress) { - SocketFactory factory(nullptr /*net_log*/); mojom::UDPSocketPtr server_socket; - factory.CreateUDPSocket(mojo::MakeRequest(&server_socket), nullptr); + factory()->CreateUDPSocket(mojo::MakeRequest(&server_socket), nullptr); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper helper(&server_socket); @@ -655,7 +653,6 @@ #define MAYBE_JoinMulticastGroup JoinMulticastGroup #endif // defined(OS_ANDROID) TEST_F(UDPSocketTest, MAYBE_JoinMulticastGroup) { - SocketFactory factory(nullptr /*net_log*/); const char kGroup[] = "237.132.100.17"; net::IPAddress group_ip; @@ -665,8 +662,8 @@ test::UDPSocketReceiverImpl receiver; mojo::Binding<mojom::UDPSocketReceiver> receiver_binding(&receiver); receiver_binding.Bind(mojo::MakeRequest(&receiver_ptr)); - factory.CreateUDPSocket(mojo::MakeRequest(&socket_ptr), - std::move(receiver_ptr)); + factory()->CreateUDPSocket(mojo::MakeRequest(&socket_ptr), + std::move(receiver_ptr)); test::UDPSocketTestHelper helper(&socket_ptr); @@ -702,7 +699,7 @@ // Create a second socket to send a packet to multicast group. mojom::UDPSocketPtr second_socket_ptr; - factory.CreateUDPSocket(mojo::MakeRequest(&second_socket_ptr), nullptr); + factory()->CreateUDPSocket(mojo::MakeRequest(&second_socket_ptr), nullptr); test::UDPSocketTestHelper second_socket_helper(&second_socket_ptr); net::IPEndPoint second_socket_address(bind_ip_address, 0); ASSERT_EQ(net::OK, @@ -733,16 +730,15 @@ } TEST_F(UDPSocketTest, ErrorHappensDuringSocketOptionsConfiguration) { - SocketFactory factory(nullptr /*net_log*/); mojom::UDPSocketPtr server_socket_ptr; - factory.CreateUDPSocket(mojo::MakeRequest(&server_socket_ptr), nullptr); + factory()->CreateUDPSocket(mojo::MakeRequest(&server_socket_ptr), nullptr); test::UDPSocketTestHelper server_helper(&server_socket_ptr); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); ASSERT_EQ(net::OK, server_helper.BindSync(server_addr, nullptr, &server_addr)); mojom::UDPSocketPtr socket_ptr; - factory.CreateUDPSocket(mojo::MakeRequest(&socket_ptr), nullptr); + factory()->CreateUDPSocket(mojo::MakeRequest(&socket_ptr), nullptr); test::UDPSocketTestHelper helper(&socket_ptr); // Invalid options.
diff --git a/services/resource_coordinator/coordination_unit/coordination_unit_base.h b/services/resource_coordinator/coordination_unit/coordination_unit_base.h index 186dba1..df3d240 100644 --- a/services/resource_coordinator/coordination_unit/coordination_unit_base.h +++ b/services/resource_coordinator/coordination_unit/coordination_unit_base.h
@@ -117,9 +117,8 @@ void Bind(MojoRequestClass request) { binding_.Bind(std::move(request)); } - void GetID( - const typename MojoInterfaceClass::GetIDCallback& callback) override { - callback.Run(id_); + void GetID(typename MojoInterfaceClass::GetIDCallback callback) override { + std::move(callback).Run(id_); } void AddBinding(MojoRequestClass request) override { bindings_.AddBinding(this, std::move(request));
diff --git a/services/resource_coordinator/coordination_unit/coordination_unit_introspector_impl.cc b/services/resource_coordinator/coordination_unit/coordination_unit_introspector_impl.cc index f927985b..84879fb 100644 --- a/services/resource_coordinator/coordination_unit/coordination_unit_introspector_impl.cc +++ b/services/resource_coordinator/coordination_unit/coordination_unit_introspector_impl.cc
@@ -20,7 +20,7 @@ CoordinationUnitIntrospectorImpl::~CoordinationUnitIntrospectorImpl() = default; void CoordinationUnitIntrospectorImpl::GetProcessToURLMap( - const GetProcessToURLMapCallback& callback) { + GetProcessToURLMapCallback callback) { std::vector<resource_coordinator::mojom::ProcessInfoPtr> process_infos; std::vector<ProcessCoordinationUnitImpl*> process_cus = ProcessCoordinationUnitImpl::GetAllProcessCoordinationUnits(); @@ -59,7 +59,7 @@ } process_infos.push_back(std::move(process_info)); } - callback.Run(std::move(process_infos)); + std::move(callback).Run(std::move(process_infos)); } void CoordinationUnitIntrospectorImpl::BindToInterface(
diff --git a/services/resource_coordinator/coordination_unit/coordination_unit_introspector_impl.h b/services/resource_coordinator/coordination_unit/coordination_unit_introspector_impl.h index 289137a..43ef8ed 100644 --- a/services/resource_coordinator/coordination_unit/coordination_unit_introspector_impl.h +++ b/services/resource_coordinator/coordination_unit/coordination_unit_introspector_impl.h
@@ -26,7 +26,7 @@ const service_manager::BindSourceInfo& source_info); // Overridden from mojom::CoordinationUnitIntrospector: - void GetProcessToURLMap(const GetProcessToURLMapCallback& callback) override; + void GetProcessToURLMap(GetProcessToURLMapCallback callback) override; private: mojo::BindingSet<mojom::CoordinationUnitIntrospector> bindings_;
diff --git a/services/resource_coordinator/memory_instrumentation/coordinator_impl.cc b/services/resource_coordinator/memory_instrumentation/coordinator_impl.cc index f703f67..57b95ba4 100644 --- a/services/resource_coordinator/memory_instrumentation/coordinator_impl.cc +++ b/services/resource_coordinator/memory_instrumentation/coordinator_impl.cc
@@ -112,57 +112,60 @@ MemoryDumpType dump_type, MemoryDumpLevelOfDetail level_of_detail, const std::vector<std::string>& allocator_dump_names, - const RequestGlobalMemoryDumpCallback& callback) { + RequestGlobalMemoryDumpCallback callback) { // This merely strips out the |dump_guid| argument. - auto adapter = [](const RequestGlobalMemoryDumpCallback& callback, - bool success, uint64_t, - mojom::GlobalMemoryDumpPtr global_memory_dump) { - callback.Run(success, std::move(global_memory_dump)); + auto adapter = [](RequestGlobalMemoryDumpCallback callback, bool success, + uint64_t, mojom::GlobalMemoryDumpPtr global_memory_dump) { + std::move(callback).Run(success, std::move(global_memory_dump)); }; QueuedRequest::Args args(dump_type, level_of_detail, allocator_dump_names, false /* add_to_trace */, base::kNullProcessId); - RequestGlobalMemoryDumpInternal(args, base::BindRepeating(adapter, callback)); + RequestGlobalMemoryDumpInternal(args, + base::BindOnce(adapter, std::move(callback))); } void CoordinatorImpl::RequestGlobalMemoryDumpForPid( base::ProcessId pid, - const RequestGlobalMemoryDumpForPidCallback& callback) { + RequestGlobalMemoryDumpForPidCallback callback) { // Error out early if process id is null to avoid confusing with global // dump for all processes case when pid is kNullProcessId. if (pid == base::kNullProcessId) { - callback.Run(false, nullptr); + std::move(callback).Run(false, nullptr); return; } // This merely strips out the |dump_guid| argument; this is not relevant // as we are not adding to trace. - auto adapter = [](const RequestGlobalMemoryDumpForPidCallback& callback, + auto adapter = [](RequestGlobalMemoryDumpForPidCallback callback, bool success, uint64_t, mojom::GlobalMemoryDumpPtr global_memory_dump) { - callback.Run(success, std::move(global_memory_dump)); + std::move(callback).Run(success, std::move(global_memory_dump)); }; QueuedRequest::Args args( base::trace_event::MemoryDumpType::SUMMARY_ONLY, base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND, {}, false /* add_to_trace */, pid); - RequestGlobalMemoryDumpInternal(args, base::BindRepeating(adapter, callback)); + RequestGlobalMemoryDumpInternal(args, + base::BindOnce(adapter, std::move(callback))); } void CoordinatorImpl::RequestGlobalMemoryDumpAndAppendToTrace( MemoryDumpType dump_type, MemoryDumpLevelOfDetail level_of_detail, - const RequestGlobalMemoryDumpAndAppendToTraceCallback& callback) { + RequestGlobalMemoryDumpAndAppendToTraceCallback callback) { // This merely strips out the |dump_ptr| argument. - auto adapter = - [](const RequestGlobalMemoryDumpAndAppendToTraceCallback& callback, - bool success, uint64_t dump_guid, - mojom::GlobalMemoryDumpPtr) { callback.Run(success, dump_guid); }; + auto adapter = [](RequestGlobalMemoryDumpAndAppendToTraceCallback callback, + bool success, uint64_t dump_guid, + mojom::GlobalMemoryDumpPtr) { + std::move(callback).Run(success, dump_guid); + }; QueuedRequest::Args args(dump_type, level_of_detail, {}, true /* add_to_trace */, base::kNullProcessId); - RequestGlobalMemoryDumpInternal(args, base::BindRepeating(adapter, callback)); + RequestGlobalMemoryDumpInternal(args, + base::BindOnce(adapter, std::move(callback))); } void CoordinatorImpl::RegisterHeapProfiler( @@ -173,11 +176,11 @@ void CoordinatorImpl::GetVmRegionsForHeapProfiler( const std::vector<base::ProcessId>& pids, - const GetVmRegionsForHeapProfilerCallback& callback) { + GetVmRegionsForHeapProfilerCallback callback) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); uint64_t dump_guid = ++next_dump_id_; std::unique_ptr<QueuedVmRegionRequest> request = - std::make_unique<QueuedVmRegionRequest>(dump_guid, callback); + std::make_unique<QueuedVmRegionRequest>(dump_guid, std::move(callback)); in_progress_vm_region_requests_[dump_guid] = std::move(request); std::vector<QueuedRequestDispatcher::ClientInfo> clients; @@ -189,8 +192,9 @@ QueuedVmRegionRequest* request_ptr = in_progress_vm_region_requests_[dump_guid].get(); - auto os_callback = base::Bind(&CoordinatorImpl::OnOSMemoryDumpForVMRegions, - base::Unretained(this), dump_guid); + auto os_callback = + base::BindRepeating(&CoordinatorImpl::OnOSMemoryDumpForVMRegions, + base::Unretained(this), dump_guid); QueuedRequestDispatcher::SetUpAndDispatchVmRegionRequest(request_ptr, clients, pids, os_callback); FinalizeVmRegionDumpIfAllManagersReplied(dump_guid); @@ -202,8 +206,8 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); mojom::ClientProcess* client_process = client_process_ptr.get(); client_process_ptr.set_connection_error_handler( - base::Bind(&CoordinatorImpl::UnregisterClientProcess, - base::Unretained(this), client_process)); + base::BindOnce(&CoordinatorImpl::UnregisterClientProcess, + base::Unretained(this), client_process)); auto identity = GetClientIdentityForCurrentRequest(); auto client_info = std::make_unique<ClientInfo>( std::move(identity), std::move(client_process_ptr), process_type); @@ -260,7 +264,7 @@ void CoordinatorImpl::RequestGlobalMemoryDumpInternal( const QueuedRequest::Args& args, - const RequestGlobalMemoryDumpInternalCallback& callback) { + RequestGlobalMemoryDumpInternalCallback callback) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); UMA_HISTOGRAM_COUNTS_1000("Memory.Experimental.Debug.GlobalDumpQueueLength", @@ -283,14 +287,15 @@ << base::trace_event::MemoryDumpLevelOfDetailToString( args.level_of_detail) << ") is already in the queue"; - callback.Run(false /* success */, 0 /* dump_guid */, - nullptr /* global_memory_dump */); + std::move(callback).Run(false /* success */, 0 /* dump_guid */, + nullptr /* global_memory_dump */); return; } } } - queued_memory_dump_requests_.emplace_back(args, ++next_dump_id_, callback); + queued_memory_dump_requests_.emplace_back(args, ++next_dump_id_, + std::move(callback)); // If another dump is already in queued, this dump will automatically be // scheduled when the other dump finishes. @@ -490,7 +495,7 @@ QueuedRequestDispatcher::VmRegions results = QueuedRequestDispatcher::FinalizeVmRegionRequest(it->second.get()); - it->second->callback.Run(std::move(results)); + std::move(it->second->callback).Run(std::move(results)); in_progress_vm_region_requests_.erase(it); } @@ -578,8 +583,8 @@ if (!queued_memory_dump_requests_.empty()) { base::SequencedTaskRunnerHandle::Get()->PostTask( FROM_HERE, - base::Bind(&CoordinatorImpl::PerformNextQueuedGlobalMemoryDump, - base::Unretained(this))); + base::BindOnce(&CoordinatorImpl::PerformNextQueuedGlobalMemoryDump, + base::Unretained(this))); } }
diff --git a/services/resource_coordinator/memory_instrumentation/coordinator_impl.h b/services/resource_coordinator/memory_instrumentation/coordinator_impl.h index ecebb20..4a8d0c0 100644 --- a/services/resource_coordinator/memory_instrumentation/coordinator_impl.h +++ b/services/resource_coordinator/memory_instrumentation/coordinator_impl.h
@@ -62,20 +62,20 @@ base::trace_event::MemoryDumpType, base::trace_event::MemoryDumpLevelOfDetail, const std::vector<std::string>& allocator_dump_names, - const RequestGlobalMemoryDumpCallback&) override; + RequestGlobalMemoryDumpCallback) override; void RequestGlobalMemoryDumpForPid( base::ProcessId, - const RequestGlobalMemoryDumpForPidCallback&) override; + RequestGlobalMemoryDumpForPidCallback) override; void RequestGlobalMemoryDumpAndAppendToTrace( base::trace_event::MemoryDumpType, base::trace_event::MemoryDumpLevelOfDetail, - const RequestGlobalMemoryDumpAndAppendToTraceCallback&) override; + RequestGlobalMemoryDumpAndAppendToTraceCallback) override; void RegisterHeapProfiler(mojom::HeapProfilerPtr heap_profiler) override; // mojom::HeapProfilerHelper implementation. void GetVmRegionsForHeapProfiler( const std::vector<base::ProcessId>& pids, - const GetVmRegionsForHeapProfilerCallback&) override; + GetVmRegionsForHeapProfilerCallback) override; protected: // virtual for testing. @@ -89,7 +89,7 @@ using OSMemDumpMap = std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr>; using RequestGlobalMemoryDumpInternalCallback = - base::Callback<void(bool, uint64_t, mojom::GlobalMemoryDumpPtr)>; + base::OnceCallback<void(bool, uint64_t, mojom::GlobalMemoryDumpPtr)>; friend std::default_delete<CoordinatorImpl>; // For testing friend class CoordinatorImplTest; // For testing @@ -107,7 +107,7 @@ void RequestGlobalMemoryDumpInternal( const QueuedRequest::Args& args, - const RequestGlobalMemoryDumpInternalCallback& callback); + RequestGlobalMemoryDumpInternalCallback callback); // Callback of RequestChromeMemoryDump. void OnChromeMemoryDumpResponse(
diff --git a/services/resource_coordinator/memory_instrumentation/coordinator_impl_unittest.cc b/services/resource_coordinator/memory_instrumentation/coordinator_impl_unittest.cc index 70f8284..7d7ba08 100644 --- a/services/resource_coordinator/memory_instrumentation/coordinator_impl_unittest.cc +++ b/services/resource_coordinator/memory_instrumentation/coordinator_impl_unittest.cc
@@ -94,7 +94,8 @@ void RequestGlobalMemoryDump(RequestGlobalMemoryDumpCallback callback) { RequestGlobalMemoryDump(MemoryDumpType::SUMMARY_ONLY, - MemoryDumpLevelOfDetail::BACKGROUND, {}, callback); + MemoryDumpLevelOfDetail::BACKGROUND, {}, + std::move(callback)); } void RequestGlobalMemoryDump( @@ -102,27 +103,27 @@ MemoryDumpLevelOfDetail level_of_detail, const std::vector<std::string>& allocator_dump_names, RequestGlobalMemoryDumpCallback callback) { - coordinator_->RequestGlobalMemoryDump(dump_type, level_of_detail, - allocator_dump_names, callback); + coordinator_->RequestGlobalMemoryDump( + dump_type, level_of_detail, allocator_dump_names, std::move(callback)); } void RequestGlobalMemoryDumpForPid( base::ProcessId pid, RequestGlobalMemoryDumpForPidCallback callback) { - coordinator_->RequestGlobalMemoryDumpForPid(pid, callback); + coordinator_->RequestGlobalMemoryDumpForPid(pid, std::move(callback)); } void RequestGlobalMemoryDumpAndAppendToTrace( RequestGlobalMemoryDumpAndAppendToTraceCallback callback) { coordinator_->RequestGlobalMemoryDumpAndAppendToTrace( MemoryDumpType::EXPLICITLY_TRIGGERED, MemoryDumpLevelOfDetail::DETAILED, - callback); + std::move(callback)); } void GetVmRegionsForHeapProfiler( const std::vector<base::ProcessId>& pids, GetVmRegionsForHeapProfilerCallback callback) { - coordinator_->GetVmRegionsForHeapProfiler(pids, callback); + coordinator_->GetVmRegionsForHeapProfiler(pids, std::move(callback)); } void ReduceCoordinatorClientProcessTimeout() { @@ -152,10 +153,10 @@ test_coordinator->RegisterClientProcess(std::move(client_process), pid, process_type); - ON_CALL(*this, RequestChromeMemoryDump(_, _)) + ON_CALL(*this, RequestChromeMemoryDumpMock(_, _)) .WillByDefault( Invoke([pid](const MemoryDumpRequestArgs& args, - const RequestChromeMemoryDumpCallback& callback) { + RequestChromeMemoryDumpCallback& callback) { MemoryDumpArgs dump_args{MemoryDumpLevelOfDetail::DETAILED}; auto pmd = std::make_unique<ProcessMemoryDump>(nullptr, dump_args); @@ -164,32 +165,46 @@ mad->AddScalar(MemoryAllocatorDump::kNameSize, MemoryAllocatorDump::kUnitsBytes, 1024); - callback.Run(true, args.dump_guid, std::move(pmd)); + std::move(callback).Run(true, args.dump_guid, std::move(pmd)); })); - ON_CALL(*this, RequestOSMemoryDump(_, _, _)) + ON_CALL(*this, RequestOSMemoryDumpMock(_, _, _)) .WillByDefault(Invoke([](mojom::MemoryMapOption, const std::vector<base::ProcessId> pids, - const RequestOSMemoryDumpCallback& callback) { + RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); } ~MockClientProcess() override {} - MOCK_METHOD2(RequestChromeMemoryDump, + // TODO(crbug.com/729950): Remove non const reference here once GMock is + // updated to support move-only types. + MOCK_METHOD2(RequestChromeMemoryDumpMock, void(const MemoryDumpRequestArgs& args, - const RequestChromeMemoryDumpCallback& callback)); - - MOCK_METHOD3(RequestOSMemoryDump, + RequestChromeMemoryDumpCallback& callback)); + MOCK_METHOD3(RequestOSMemoryDumpMock, void(mojom::MemoryMapOption option, const std::vector<base::ProcessId>& args, - const RequestOSMemoryDumpCallback& callback)); - - MOCK_METHOD2(EnableHeapProfiling, + RequestOSMemoryDumpCallback& callback)); + MOCK_METHOD2(EnableHeapProfilingMock, void(base::trace_event::HeapProfilingMode mode, - const EnableHeapProfilingCallback& callback)); + EnableHeapProfilingCallback& callback)); + + void RequestChromeMemoryDump(const MemoryDumpRequestArgs& args, + RequestChromeMemoryDumpCallback callback) { + RequestChromeMemoryDumpMock(args, callback); + } + void RequestOSMemoryDump(mojom::MemoryMapOption option, + const std::vector<base::ProcessId>& args, + RequestOSMemoryDumpCallback callback) { + RequestOSMemoryDumpMock(option, args, callback); + } + void EnableHeapProfiling(base::trace_event::HeapProfilingMode mode, + EnableHeapProfilingCallback callback) { + EnableHeapProfilingMock(mode, callback); + } private: mojo::Binding<mojom::ClientProcess> binding_; @@ -280,8 +295,8 @@ mojom::ProcessType::BROWSER); NiceMock<MockClientProcess> client_process_2(this); - EXPECT_CALL(client_process_1, RequestChromeMemoryDump(_, _)).Times(1); - EXPECT_CALL(client_process_2, RequestChromeMemoryDump(_, _)).Times(1); + EXPECT_CALL(client_process_1, RequestChromeMemoryDumpMock(_, _)).Times(1); + EXPECT_CALL(client_process_2, RequestChromeMemoryDumpMock(_, _)).Times(1); MockGlobalMemoryDumpCallback callback; EXPECT_CALL(callback, OnCall(true, NotNull())) @@ -296,14 +311,13 @@ NiceMock<MockClientProcess> client_process(this, 1, mojom::ProcessType::BROWSER); - EXPECT_CALL(client_process, RequestChromeMemoryDump(_, _)) - .WillOnce( - Invoke([](const MemoryDumpRequestArgs& args, - const MockClientProcess::RequestChromeMemoryDumpCallback& - callback) { + EXPECT_CALL(client_process, RequestChromeMemoryDumpMock(_, _)) + .WillOnce(Invoke( + [](const MemoryDumpRequestArgs& args, + MockClientProcess::RequestChromeMemoryDumpCallback& callback) { MemoryDumpArgs dump_args{MemoryDumpLevelOfDetail::DETAILED}; auto pmd = std::make_unique<ProcessMemoryDump>(nullptr, dump_args); - callback.Run(true, args.dump_guid, std::move(pmd)); + std::move(callback).Run(true, args.dump_guid, std::move(pmd)); })); MockGlobalMemoryDumpCallback callback; @@ -322,12 +336,12 @@ NiceMock<MockClientProcess> client_process(this, 1, mojom::ProcessType::BROWSER); - EXPECT_CALL(client_process, RequestOSMemoryDump(_, _, _)) + EXPECT_CALL(client_process, RequestOSMemoryDumpMock(_, _, _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); MockGlobalMemoryDumpCallback callback; @@ -351,12 +365,13 @@ // Store a reference to the callback passed to RequestChromeMemoryDump // to emulate "stuck" behaviour. - EXPECT_CALL(client_process, RequestChromeMemoryDump(_, _)) - .WillOnce( - Invoke([&stuck_callback]( - const MemoryDumpRequestArgs&, - const MockClientProcess::RequestChromeMemoryDumpCallback& - callback) { stuck_callback = callback; })); + EXPECT_CALL(client_process, RequestChromeMemoryDumpMock(_, _)) + .WillOnce(Invoke( + [&stuck_callback]( + const MemoryDumpRequestArgs&, + MockClientProcess::RequestChromeMemoryDumpCallback& callback) { + stuck_callback = std::move(callback); + })); MockGlobalMemoryDumpCallback callback; EXPECT_CALL( @@ -388,44 +403,45 @@ // platforms, they are expected to come from each individual client. #if defined(OS_LINUX) EXPECT_CALL(browser_client, - RequestOSMemoryDump( + RequestOSMemoryDumpMock( _, AllOf(Contains(kBrowserPid), Contains(kRendererPid)), _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[kBrowserPid] = FillRawOSDump(kBrowserPid); results[kRendererPid] = FillRawOSDump(kRendererPid); - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); - EXPECT_CALL(renderer_client, RequestOSMemoryDump(_, _, _)).Times(0); + EXPECT_CALL(renderer_client, RequestOSMemoryDumpMock(_, _, _)).Times(0); #else - EXPECT_CALL(browser_client, RequestOSMemoryDump(_, Contains(0), _)) + EXPECT_CALL(browser_client, RequestOSMemoryDumpMock(_, Contains(0), _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[0] = FillRawOSDump(kBrowserPid); - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); - EXPECT_CALL(renderer_client, RequestOSMemoryDump(_, Contains(0), _)) + EXPECT_CALL(renderer_client, RequestOSMemoryDumpMock(_, Contains(0), _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[0] = FillRawOSDump(kRendererPid); - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); #endif // defined(OS_LINUX) // Make the browser respond correctly but pretend the renderer is "stuck" // by storing a callback. - EXPECT_CALL(renderer_client, RequestChromeMemoryDump(_, _)) - .WillOnce( - Invoke([&stuck_callback]( - const MemoryDumpRequestArgs&, - const MockClientProcess::RequestChromeMemoryDumpCallback& - callback) { stuck_callback = callback; })); + EXPECT_CALL(renderer_client, RequestChromeMemoryDumpMock(_, _)) + .WillOnce(Invoke( + [&stuck_callback]( + const MemoryDumpRequestArgs&, + MockClientProcess::RequestChromeMemoryDumpCallback& callback) { + stuck_callback = std::move(callback); + })); MockGlobalMemoryDumpCallback callback; EXPECT_CALL(callback, OnCall(false, _)) @@ -454,23 +470,21 @@ // dump attempt has failed. // Whichever client is called first destroys the other client. - ON_CALL(*client_process_1, RequestChromeMemoryDump(_, _)) - .WillByDefault( - Invoke([&client_process_2]( - const MemoryDumpRequestArgs& args, - const MockClientProcess::RequestChromeMemoryDumpCallback& - callback) { + ON_CALL(*client_process_1, RequestChromeMemoryDumpMock(_, _)) + .WillByDefault(Invoke( + [&client_process_2]( + const MemoryDumpRequestArgs& args, + MockClientProcess::RequestChromeMemoryDumpCallback& callback) { client_process_2.reset(); - callback.Run(true, args.dump_guid, nullptr); + std::move(callback).Run(true, args.dump_guid, nullptr); })); - ON_CALL(*client_process_2, RequestChromeMemoryDump(_, _)) - .WillByDefault( - Invoke([&client_process_1]( - const MemoryDumpRequestArgs& args, - const MockClientProcess::RequestChromeMemoryDumpCallback& - callback) { + ON_CALL(*client_process_2, RequestChromeMemoryDumpMock(_, _)) + .WillByDefault(Invoke( + [&client_process_1]( + const MemoryDumpRequestArgs& args, + MockClientProcess::RequestChromeMemoryDumpCallback& callback) { client_process_1.reset(); - callback.Run(true, args.dump_guid, nullptr); + std::move(callback).Run(true, args.dump_guid, nullptr); })); MockGlobalMemoryDumpCallback callback; @@ -488,16 +502,15 @@ auto client_process = std::make_unique<NiceMock<MockClientProcess>>( this, 1, mojom::ProcessType::BROWSER); - ON_CALL(*client_process, RequestChromeMemoryDump(_, _)) - .WillByDefault( - Invoke([&client_process]( - const MemoryDumpRequestArgs& args, - const MockClientProcess::RequestChromeMemoryDumpCallback& - callback) { + ON_CALL(*client_process, RequestChromeMemoryDumpMock(_, _)) + .WillByDefault(Invoke( + [&client_process]( + const MemoryDumpRequestArgs& args, + MockClientProcess::RequestChromeMemoryDumpCallback& callback) { // The dtor here will cause mojo to post an UnregisterClient call to // the coordinator. client_process.reset(); - callback.Run(true, args.dump_guid, nullptr); + std::move(callback).Run(true, args.dump_guid, nullptr); })); MockGlobalMemoryDumpCallback callback; @@ -513,10 +526,10 @@ MockClientProcess browser_client(this, 1, mojom::ProcessType::BROWSER); MockClientProcess renderer_client(this, 2, mojom::ProcessType::RENDERER); - EXPECT_CALL(browser_client, RequestChromeMemoryDump(_, _)) + EXPECT_CALL(browser_client, RequestChromeMemoryDumpMock(_, _)) .WillOnce(Invoke([](const MemoryDumpRequestArgs& args, - const MockClientProcess:: - RequestChromeMemoryDumpCallback& callback) { + MockClientProcess::RequestChromeMemoryDumpCallback& + callback) { MemoryDumpArgs dump_args{MemoryDumpLevelOfDetail::DETAILED}; auto pmd = std::make_unique<ProcessMemoryDump>(nullptr, dump_args); auto* size = MemoryAllocatorDump::kNameSize; @@ -551,27 +564,26 @@ pmd->CreateAllocatorDump("partition_alloc/partitions/not_ignored_2") ->AddScalar(size, bytes, 2 * kB); - callback.Run(true, args.dump_guid, std::move(pmd)); + std::move(callback).Run(true, args.dump_guid, std::move(pmd)); })); - EXPECT_CALL(renderer_client, RequestChromeMemoryDump(_, _)) - .WillOnce( - Invoke([](const MemoryDumpRequestArgs& args, - const MockClientProcess::RequestChromeMemoryDumpCallback& - callback) { + EXPECT_CALL(renderer_client, RequestChromeMemoryDumpMock(_, _)) + .WillOnce(Invoke( + [](const MemoryDumpRequestArgs& args, + MockClientProcess::RequestChromeMemoryDumpCallback& callback) { MemoryDumpArgs dump_args{MemoryDumpLevelOfDetail::DETAILED}; auto pmd = std::make_unique<ProcessMemoryDump>(nullptr, dump_args); auto* mad = pmd->CreateAllocatorDump( "malloc", base::trace_event::MemoryAllocatorDumpGuid(2)); mad->AddScalar(MemoryAllocatorDump::kNameSize, MemoryAllocatorDump::kUnitsBytes, 1024 * 2); - callback.Run(true, args.dump_guid, std::move(pmd)); + std::move(callback).Run(true, args.dump_guid, std::move(pmd)); })); #if defined(OS_LINUX) EXPECT_CALL(browser_client, - RequestOSMemoryDump(_, AllOf(Contains(1), Contains(2)), _)) + RequestOSMemoryDumpMock(_, AllOf(Contains(1), Contains(2)), _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[1] = mojom::RawOSMemDump::New(); results[1]->resident_set_kb = 1; @@ -581,31 +593,31 @@ results[2]->platform_private_footprint = mojom::PlatformPrivateFootprint::New(); results[2]->resident_set_kb = 2; - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); - EXPECT_CALL(renderer_client, RequestOSMemoryDump(_, _, _)).Times(0); + EXPECT_CALL(renderer_client, RequestOSMemoryDumpMock(_, _, _)).Times(0); #else - EXPECT_CALL(browser_client, RequestOSMemoryDump(_, Contains(0), _)) + EXPECT_CALL(browser_client, RequestOSMemoryDumpMock(_, Contains(0), _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[0] = mojom::RawOSMemDump::New(); results[0]->platform_private_footprint = mojom::PlatformPrivateFootprint::New(); results[0]->resident_set_kb = 1; - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); - EXPECT_CALL(renderer_client, RequestOSMemoryDump(_, Contains(0), _)) + EXPECT_CALL(renderer_client, RequestOSMemoryDumpMock(_, Contains(0), _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[0] = mojom::RawOSMemDump::New(); results[0]->platform_private_footprint = mojom::PlatformPrivateFootprint::New(); results[0]->resident_set_kb = 2; - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); #endif // defined(OS_LINUX) @@ -653,33 +665,33 @@ // platforms, they are expected to come from each individual client. #if defined(OS_LINUX) EXPECT_CALL(browser_client, - RequestOSMemoryDump( + RequestOSMemoryDumpMock( _, AllOf(Contains(kBrowserPid), Contains(kRendererPid)), _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[kBrowserPid] = FillRawOSDump(kBrowserPid); results[kRendererPid] = FillRawOSDump(kRendererPid); - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); - EXPECT_CALL(renderer_client, RequestOSMemoryDump(_, _, _)).Times(0); + EXPECT_CALL(renderer_client, RequestOSMemoryDumpMock(_, _, _)).Times(0); #else - EXPECT_CALL(browser_client, RequestOSMemoryDump(_, Contains(0), _)) + EXPECT_CALL(browser_client, RequestOSMemoryDumpMock(_, Contains(0), _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[0] = FillRawOSDump(kBrowserPid); - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); - EXPECT_CALL(renderer_client, RequestOSMemoryDump(_, Contains(0), _)) + EXPECT_CALL(renderer_client, RequestOSMemoryDumpMock(_, Contains(0), _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[0] = FillRawOSDump(kRendererPid); - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); #endif // defined(OS_LINUX) @@ -731,14 +743,13 @@ NiceMock<MockClientProcess> client_process(this, 1, mojom::ProcessType::BROWSER); - EXPECT_CALL(client_process, RequestChromeMemoryDump(_, _)) - .WillOnce( - Invoke([](const MemoryDumpRequestArgs& args, - const MockClientProcess::RequestChromeMemoryDumpCallback& - callback) { + EXPECT_CALL(client_process, RequestChromeMemoryDumpMock(_, _)) + .WillOnce(Invoke( + [](const MemoryDumpRequestArgs& args, + MockClientProcess::RequestChromeMemoryDumpCallback& callback) { MemoryDumpArgs dump_args{MemoryDumpLevelOfDetail::DETAILED}; auto pmd = std::make_unique<ProcessMemoryDump>(nullptr, dump_args); - callback.Run(true, args.dump_guid, std::move(pmd)); + std::move(callback).Run(true, args.dump_guid, std::move(pmd)); })); MockGlobalMemoryDumpCallback callback; @@ -770,14 +781,13 @@ NiceMock<MockClientProcess> client_process(this, 1, mojom::ProcessType::BROWSER); - EXPECT_CALL(client_process, RequestChromeMemoryDump(_, _)) - .WillOnce( - Invoke([](const MemoryDumpRequestArgs& args, - const MockClientProcess::RequestChromeMemoryDumpCallback& - callback) { + EXPECT_CALL(client_process, RequestChromeMemoryDumpMock(_, _)) + .WillOnce(Invoke( + [](const MemoryDumpRequestArgs& args, + MockClientProcess::RequestChromeMemoryDumpCallback& callback) { MemoryDumpArgs dump_args{MemoryDumpLevelOfDetail::DETAILED}; auto pmd = std::make_unique<ProcessMemoryDump>(nullptr, dump_args); - callback.Run(true, args.dump_guid, std::move(pmd)); + std::move(callback).Run(true, args.dump_guid, std::move(pmd)); })); MockGlobalMemoryDumpAndAppendToTraceCallback callback; @@ -816,52 +826,52 @@ // On Linux, all memory dumps come from the browser client. On all other // platforms, they are expected to come from each individual client. #if defined(OS_LINUX) - EXPECT_CALL(client_process_1, RequestOSMemoryDump(_, _, _)) + EXPECT_CALL(client_process_1, RequestOSMemoryDumpMock(_, _, _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[kBrowserPid] = FillRawOSDump(kBrowserPid); - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[kRendererPid] = FillRawOSDump(kRendererPid); - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[kGpuPid] = FillRawOSDump(kGpuPid); - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); #else - EXPECT_CALL(client_process_1, RequestOSMemoryDump(_, Contains(0), _)) + EXPECT_CALL(client_process_1, RequestOSMemoryDumpMock(_, Contains(0), _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[0] = FillRawOSDump(kBrowserPid); - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); - EXPECT_CALL(client_process_2, RequestOSMemoryDump(_, Contains(0), _)) + EXPECT_CALL(client_process_2, RequestOSMemoryDumpMock(_, Contains(0), _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[0] = FillRawOSDump(kRendererPid); - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); - EXPECT_CALL(client_process_3, RequestOSMemoryDump(_, Contains(0), _)) + EXPECT_CALL(client_process_3, RequestOSMemoryDumpMock(_, Contains(0), _)) .WillOnce(Invoke( [](mojom::MemoryMapOption, const std::vector<base::ProcessId>& pids, - const MockClientProcess::RequestOSMemoryDumpCallback& callback) { + MockClientProcess::RequestOSMemoryDumpCallback& callback) { std::unordered_map<base::ProcessId, mojom::RawOSMemDumpPtr> results; results[0] = FillRawOSDump(kGpuPid); - callback.Run(true, std::move(results)); + std::move(callback).Run(true, std::move(results)); })); #endif // defined(OS_LINUX)
diff --git a/services/resource_coordinator/memory_instrumentation/queued_request.cc b/services/resource_coordinator/memory_instrumentation/queued_request.cc index 6c43455f..398a5db 100644 --- a/services/resource_coordinator/memory_instrumentation/queued_request.cc +++ b/services/resource_coordinator/memory_instrumentation/queued_request.cc
@@ -32,11 +32,10 @@ QueuedRequest::Response::Response() {} QueuedRequest::Response::~Response() = default; -QueuedRequest::QueuedRequest( - const Args& args, - uint64_t dump_guid, - const RequestGlobalMemoryDumpInternalCallback& callback) - : args(args), dump_guid(dump_guid), callback(callback) {} +QueuedRequest::QueuedRequest(const Args& args, + uint64_t dump_guid, + RequestGlobalMemoryDumpInternalCallback callback) + : args(args), dump_guid(dump_guid), callback(std::move(callback)) {} QueuedRequest::~QueuedRequest() = default; base::trace_event::MemoryDumpRequestArgs QueuedRequest::GetRequestArgs() { @@ -52,9 +51,8 @@ QueuedVmRegionRequest::QueuedVmRegionRequest( uint64_t dump_guid, - const mojom::HeapProfilerHelper::GetVmRegionsForHeapProfilerCallback& - callback) - : dump_guid(dump_guid), callback(callback) {} + mojom::HeapProfilerHelper::GetVmRegionsForHeapProfilerCallback callback) + : dump_guid(dump_guid), callback(std::move(callback)) {} QueuedVmRegionRequest::~QueuedVmRegionRequest() = default; } // namespace memory_instrumentation
diff --git a/services/resource_coordinator/memory_instrumentation/queued_request.h b/services/resource_coordinator/memory_instrumentation/queued_request.h index 2924146e..3cfd3a31 100644 --- a/services/resource_coordinator/memory_instrumentation/queued_request.h +++ b/services/resource_coordinator/memory_instrumentation/queued_request.h
@@ -25,7 +25,7 @@ // Holds data for pending requests enqueued via RequestGlobalMemoryDump(). struct QueuedRequest { - using RequestGlobalMemoryDumpInternalCallback = base::Callback< + using RequestGlobalMemoryDumpInternalCallback = base::OnceCallback< void(bool, uint64_t, memory_instrumentation::mojom::GlobalMemoryDumpPtr)>; struct Args { @@ -69,7 +69,7 @@ QueuedRequest(const Args& args, uint64_t dump_guid, - const RequestGlobalMemoryDumpInternalCallback& callback); + RequestGlobalMemoryDumpInternalCallback callback); ~QueuedRequest(); base::trace_event::MemoryDumpRequestArgs GetRequestArgs(); @@ -87,7 +87,7 @@ const Args args; const uint64_t dump_guid; - const RequestGlobalMemoryDumpInternalCallback callback; + RequestGlobalMemoryDumpInternalCallback callback; // When a dump, requested via RequestGlobalMemoryDump(), is in progress this // set contains a |PendingResponse| for each |RequestChromeMemoryDump| and @@ -111,11 +111,10 @@ struct QueuedVmRegionRequest { QueuedVmRegionRequest( uint64_t dump_guid, - const mojom::HeapProfilerHelper::GetVmRegionsForHeapProfilerCallback& - callback); + mojom::HeapProfilerHelper::GetVmRegionsForHeapProfilerCallback callback); ~QueuedVmRegionRequest(); const uint64_t dump_guid; - const mojom::HeapProfilerHelper::GetVmRegionsForHeapProfilerCallback callback; + mojom::HeapProfilerHelper::GetVmRegionsForHeapProfilerCallback callback; struct Response { Response();
diff --git a/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc b/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc index 3d98799..cc8e4c6 100644 --- a/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc +++ b/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc
@@ -225,8 +225,9 @@ // https://bugs.chromium.org/p/chromium/issues/detail?id=812346#c16 for more // details. request->pending_responses.insert({client, ResponseType::kChromeDump}); - client->RequestChromeMemoryDump(request->GetRequestArgs(), - base::Bind(chrome_callback, client)); + client->RequestChromeMemoryDump( + request->GetRequestArgs(), + base::BindOnce(std::move(chrome_callback), client)); // On most platforms each process can dump data about their own process // so ask each process to do so Linux is special see below. @@ -234,7 +235,7 @@ request->pending_responses.insert({client, ResponseType::kOSDump}); client->RequestOSMemoryDump(request->memory_map_option(), {base::kNullProcessId}, - base::Bind(os_callback, client)); + base::BindOnce(os_callback, client)); #endif // !defined(OS_LINUX) // If we are in the single pid case, then we've already found the only @@ -263,9 +264,9 @@ } if (browser_client && pids.size() > 0) { request->pending_responses.insert({browser_client, ResponseType::kOSDump}); - const auto callback = base::Bind(os_callback, browser_client); + auto callback = base::BindOnce(os_callback, browser_client); browser_client->RequestOSMemoryDump(request->memory_map_option(), pids, - callback); + std::move(callback)); } #endif // defined(OS_LINUX) @@ -304,9 +305,9 @@ request->pending_responses.insert(browser_client); request->responses[browser_client].process_id = browser_client_pid; - const auto callback = base::Bind(os_callback, browser_client); + auto callback = base::BindOnce(os_callback, browser_client); browser_client->RequestOSMemoryDump(mojom::MemoryMapOption::MODULES, - desired_pids, callback); + desired_pids, std::move(callback)); #else for (const auto& client_info : clients) { if (std::find(desired_pids.begin(), desired_pids.end(), client_info.pid) != @@ -316,7 +317,7 @@ request->responses[client].process_id = client_info.pid; client->RequestOSMemoryDump(mojom::MemoryMapOption::MODULES, {base::kNullProcessId}, - base::Bind(os_callback, client)); + base::BindOnce(os_callback, client)); } } #endif // defined(OS_LINUX) @@ -539,8 +540,9 @@ if (request->args.pid != base::kNullProcessId && !global_success) { global_dump = nullptr; } - const auto& callback = request->callback; - callback.Run(global_success, request->dump_guid, std::move(global_dump)); + auto& callback = request->callback; + std::move(callback).Run(global_success, request->dump_guid, + std::move(global_dump)); UMA_HISTOGRAM_MEDIUM_TIMES("Memory.Experimental.Debug.GlobalDumpDuration", base::Time::Now() - request->start_time); UMA_HISTOGRAM_COUNTS_1000(
diff --git a/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.h b/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.h index 536629d..ba0290bb 100644 --- a/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.h +++ b/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.h
@@ -21,15 +21,15 @@ using OSMemDumpMap = std::unordered_map<base::ProcessId, memory_instrumentation::mojom::RawOSMemDumpPtr>; - using RequestGlobalMemoryDumpInternalCallback = base::Callback< + using RequestGlobalMemoryDumpInternalCallback = base::OnceCallback< void(bool, uint64_t, memory_instrumentation::mojom::GlobalMemoryDumpPtr)>; - using ChromeCallback = base::Callback<void( + using ChromeCallback = base::RepeatingCallback<void( mojom::ClientProcess*, bool, uint64_t, std::unique_ptr<base::trace_event::ProcessMemoryDump>)>; using OsCallback = - base::Callback<void(mojom::ClientProcess*, bool, OSMemDumpMap)>; + base::RepeatingCallback<void(mojom::ClientProcess*, bool, OSMemDumpMap)>; using VmRegions = std::unordered_map< base::ProcessId, std::vector<memory_instrumentation::mojom::VmRegionPtr>>;
diff --git a/services/resource_coordinator/public/cpp/frame_resource_coordinator.cc b/services/resource_coordinator/public/cpp/frame_resource_coordinator.cc index c270a26..8a065c6f 100644 --- a/services/resource_coordinator/public/cpp/frame_resource_coordinator.cc +++ b/services/resource_coordinator/public/cpp/frame_resource_coordinator.cc
@@ -35,8 +35,8 @@ // We could keep the ID around ourselves, but this hop ensures that the child // has been created on the service-side. child.service()->GetID( - base::Bind(&FrameResourceCoordinator::AddChildFrameByID, - weak_ptr_factory_.GetWeakPtr())); + base::BindOnce(&FrameResourceCoordinator::AddChildFrameByID, + weak_ptr_factory_.GetWeakPtr())); } void FrameResourceCoordinator::RemoveChildFrame( @@ -45,8 +45,8 @@ if (!service_) return; child.service()->GetID( - base::Bind(&FrameResourceCoordinator::RemoveChildFrameByID, - weak_ptr_factory_.GetWeakPtr())); + base::BindOnce(&FrameResourceCoordinator::RemoveChildFrameByID, + weak_ptr_factory_.GetWeakPtr())); } void FrameResourceCoordinator::ConnectToService(
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.cc b/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.cc index c81e7d7..9bc4fd6 100644 --- a/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.cc +++ b/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.cc
@@ -74,7 +74,7 @@ void ClientProcessImpl::RequestChromeMemoryDump( const base::trace_event::MemoryDumpRequestArgs& args, - const RequestChromeMemoryDumpCallback& callback) { + RequestChromeMemoryDumpCallback callback) { DCHECK(!callback.is_null()); most_recent_chrome_memory_dump_guid_ = args.dump_guid; auto it_and_inserted = @@ -106,10 +106,10 @@ } if (!process_memory_dump) { - callback.Run(false, dump_guid, nullptr); + std::move(callback).Run(false, dump_guid, nullptr); return; } - callback.Run(success, dump_guid, std::move(process_memory_dump)); + std::move(callback).Run(success, dump_guid, std::move(process_memory_dump)); } void ClientProcessImpl::RequestGlobalMemoryDump_NoCallback( @@ -118,8 +118,8 @@ if (!task_runner_->RunsTasksInCurrentSequence()) { task_runner_->PostTask( FROM_HERE, - base::Bind(&ClientProcessImpl::RequestGlobalMemoryDump_NoCallback, - base::Unretained(this), dump_type, level_of_detail)); + base::BindOnce(&ClientProcessImpl::RequestGlobalMemoryDump_NoCallback, + base::Unretained(this), dump_type, level_of_detail)); return; } @@ -130,19 +130,20 @@ void ClientProcessImpl::EnableHeapProfiling( base::trace_event::HeapProfilingMode mode, - const EnableHeapProfilingCallback& callback) { - callback.Run(base::trace_event::MemoryDumpManager::GetInstance()-> - EnableHeapProfiling(mode)); + EnableHeapProfilingCallback callback) { + std::move(callback).Run( + base::trace_event::MemoryDumpManager::GetInstance()->EnableHeapProfiling( + mode)); } void ClientProcessImpl::RequestOSMemoryDump( mojom::MemoryMapOption mmap_option, const std::vector<base::ProcessId>& pids, - const RequestOSMemoryDumpCallback& callback) { + RequestOSMemoryDumpCallback callback) { OSMemoryDumpArgs args; args.mmap_option = mmap_option; args.pids = pids; - args.callback = callback; + args.callback = std::move(callback); #if defined(OS_MACOSX) // If the most recent chrome memory dump hasn't finished, wait for that to @@ -174,7 +175,7 @@ results[pid] = std::move(result); global_success = global_success && success; } - args.callback.Run(global_success, std::move(results)); + std::move(args.callback).Run(global_success, std::move(results)); } ClientProcessImpl::Config::Config(service_manager::Connector* connector, @@ -187,7 +188,7 @@ ClientProcessImpl::Config::~Config() {} ClientProcessImpl::OSMemoryDumpArgs::OSMemoryDumpArgs() = default; -ClientProcessImpl::OSMemoryDumpArgs::OSMemoryDumpArgs(const OSMemoryDumpArgs&) = +ClientProcessImpl::OSMemoryDumpArgs::OSMemoryDumpArgs(OSMemoryDumpArgs&&) = default; ClientProcessImpl::OSMemoryDumpArgs::~OSMemoryDumpArgs() = default;
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.h b/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.h index 149ce9a..8b1694d 100644 --- a/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.h +++ b/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.h
@@ -63,13 +63,12 @@ // mojom::ClientProcess implementation. The Coordinator calls this. void RequestChromeMemoryDump( const base::trace_event::MemoryDumpRequestArgs& args, - const RequestChromeMemoryDumpCallback& callback) override; + RequestChromeMemoryDumpCallback callback) override; // mojom::ClientProcess implementation. // TODO(ssid): Use for GPU process. - void EnableHeapProfiling( - base::trace_event::HeapProfilingMode mode, - const EnableHeapProfilingCallback& callback) override; + void EnableHeapProfiling(base::trace_event::HeapProfilingMode mode, + EnableHeapProfilingCallback callback) override; // Callback passed to base::MemoryDumpManager::CreateProcessDump(). void OnChromeMemoryDumpDone( @@ -78,14 +77,13 @@ std::unique_ptr<base::trace_event::ProcessMemoryDump>); // mojom::ClientProcess implementation. The Coordinator calls this. - void RequestOSMemoryDump( - mojom::MemoryMapOption mmap_option, - const std::vector<base::ProcessId>& ids, - const RequestOSMemoryDumpCallback& callback) override; + void RequestOSMemoryDump(mojom::MemoryMapOption mmap_option, + const std::vector<base::ProcessId>& ids, + RequestOSMemoryDumpCallback callback) override; struct OSMemoryDumpArgs { OSMemoryDumpArgs(); - OSMemoryDumpArgs(const OSMemoryDumpArgs&); + OSMemoryDumpArgs(OSMemoryDumpArgs&&); ~OSMemoryDumpArgs(); mojom::MemoryMapOption mmap_option; std::vector<base::ProcessId> pids;
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.cc b/services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.cc index 19547e7..869080db 100644 --- a/services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.cc +++ b/services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.cc
@@ -97,9 +97,9 @@ // invoking methods on the |coordinator| proxy objects. connector_task_runner_->PostTask( FROM_HERE, - base::Bind( + base::BindOnce( &MemoryInstrumentation::BindCoordinatorRequestOnConnectorThread, - base::Unretained(this), base::Passed(std::move(coordinator_req)))); + base::Unretained(this), std::move(coordinator_req))); } DCHECK(*coordinator); return *coordinator;
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_integration_unittest.cc b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_integration_unittest.cc index 44361915..ccfd47a9 100644 --- a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_integration_unittest.cc +++ b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_integration_unittest.cc
@@ -121,16 +121,16 @@ MemoryDumpType dump_type, MemoryDumpLevelOfDetail level_of_detail, const std::vector<std::string>& allocator_dump_names, - const RequestGlobalMemoryDumpCallback&) override; + RequestGlobalMemoryDumpCallback) override; void RequestGlobalMemoryDumpForPid( base::ProcessId pid, - const RequestGlobalMemoryDumpForPidCallback&) override {} + RequestGlobalMemoryDumpForPidCallback) override {} void RequestGlobalMemoryDumpAndAppendToTrace( MemoryDumpType dump_type, MemoryDumpLevelOfDetail level_of_detail, - const RequestGlobalMemoryDumpAndAppendToTraceCallback&) override; + RequestGlobalMemoryDumpAndAppendToTraceCallback) override; private: mojo::BindingSet<mojom::Coordinator> bindings_; @@ -173,20 +173,21 @@ bool success = false; uint64_t req_guid = ++guid_counter_; MemoryDumpRequestArgs request_args{req_guid, dump_type, level_of_detail}; - ClientProcessImpl::RequestChromeMemoryDumpCallback callback = base::Bind( - [](bool* curried_success, base::Closure curried_quit_closure, - std::unique_ptr<base::trace_event::ProcessMemoryDump>* - curried_result, - uint64_t curried_expected_guid, bool success, uint64_t dump_guid, - std::unique_ptr<base::trace_event::ProcessMemoryDump> result) { - EXPECT_EQ(curried_expected_guid, dump_guid); - *curried_success = success; - if (curried_result) - *curried_result = std::move(result); - curried_quit_closure.Run(); - }, - &success, run_loop.QuitClosure(), result, req_guid); - client_process_->RequestChromeMemoryDump(request_args, callback); + ClientProcessImpl::RequestChromeMemoryDumpCallback callback = + base::BindOnce( + [](bool* curried_success, base::OnceClosure curried_quit_closure, + std::unique_ptr<base::trace_event::ProcessMemoryDump>* + curried_result, + uint64_t curried_expected_guid, bool success, uint64_t dump_guid, + std::unique_ptr<base::trace_event::ProcessMemoryDump> result) { + EXPECT_EQ(curried_expected_guid, dump_guid); + *curried_success = success; + if (curried_result) + *curried_result = std::move(result); + std::move(curried_quit_closure).Run(); + }, + &success, run_loop.QuitClosure(), result, req_guid); + client_process_->RequestChromeMemoryDump(request_args, std::move(callback)); run_loop.Run(); return success; } @@ -195,10 +196,12 @@ MemoryDumpLevelOfDetail level_of_detail) { uint64_t req_guid = ++guid_counter_; MemoryDumpRequestArgs request_args{req_guid, dump_type, level_of_detail}; - ClientProcessImpl::RequestChromeMemoryDumpCallback callback = base::Bind( - [](bool success, uint64_t dump_guid, - std::unique_ptr<base::trace_event::ProcessMemoryDump> result) {}); - client_process_->RequestChromeMemoryDump(request_args, callback); + ClientProcessImpl::RequestChromeMemoryDumpCallback callback = + base::BindOnce( + [](bool success, uint64_t dump_guid, + std::unique_ptr<base::trace_event::ProcessMemoryDump> result) { + }); + client_process_->RequestChromeMemoryDump(request_args, std::move(callback)); } protected: @@ -249,17 +252,17 @@ MemoryDumpType dump_type, MemoryDumpLevelOfDetail level_of_detail, const std::vector<std::string>& allocator_dump_names, - const RequestGlobalMemoryDumpCallback& callback) { + RequestGlobalMemoryDumpCallback callback) { client_->RequestChromeDump(dump_type, level_of_detail); - callback.Run(true, mojom::GlobalMemoryDumpPtr()); + std::move(callback).Run(true, mojom::GlobalMemoryDumpPtr()); } void MockCoordinator::RequestGlobalMemoryDumpAndAppendToTrace( MemoryDumpType dump_type, MemoryDumpLevelOfDetail level_of_detail, - const RequestGlobalMemoryDumpAndAppendToTraceCallback& callback) { + RequestGlobalMemoryDumpAndAppendToTraceCallback callback) { client_->RequestChromeDump(dump_type, level_of_detail); - callback.Run(1, true); + std::move(callback).Run(1, true); } // Checks that is the ClientProcessImpl is initialized after tracing already @@ -526,11 +529,11 @@ base::RunLoop run_loop; thread->PostTask( FROM_HERE, - Bind( + base::BindOnce( [](scoped_refptr<base::SequencedTaskRunner> main_task_runner, - base::Closure quit_closure) { + base::OnceClosure quit_closure) { TRACE_EVENT0(MemoryDumpManager::kTraceCategory, "foo"); - main_task_runner->PostTask(FROM_HERE, quit_closure); + main_task_runner->PostTask(FROM_HERE, std::move(quit_closure)); }, base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure())); run_loop.Run();
diff --git a/services/resource_coordinator/public/cpp/page_resource_coordinator.cc b/services/resource_coordinator/public/cpp/page_resource_coordinator.cc index 37ab4429..84adfe61 100644 --- a/services/resource_coordinator/public/cpp/page_resource_coordinator.cc +++ b/services/resource_coordinator/public/cpp/page_resource_coordinator.cc
@@ -57,8 +57,8 @@ return; // We could keep the ID around ourselves, but this hop ensures that the child // has been created on the service-side. - frame.service()->GetID(base::Bind(&PageResourceCoordinator::AddFrameByID, - weak_ptr_factory_.GetWeakPtr())); + frame.service()->GetID(base::BindOnce(&PageResourceCoordinator::AddFrameByID, + weak_ptr_factory_.GetWeakPtr())); } void PageResourceCoordinator::RemoveFrame( @@ -66,8 +66,9 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); if (!service_) return; - frame.service()->GetID(base::Bind(&PageResourceCoordinator::RemoveFrameByID, - weak_ptr_factory_.GetWeakPtr())); + frame.service()->GetID( + base::BindOnce(&PageResourceCoordinator::RemoveFrameByID, + weak_ptr_factory_.GetWeakPtr())); } void PageResourceCoordinator::ConnectToService(
diff --git a/services/resource_coordinator/public/cpp/process_resource_coordinator.cc b/services/resource_coordinator/public/cpp/process_resource_coordinator.cc index 06d3c0c5..2d977e3 100644 --- a/services/resource_coordinator/public/cpp/process_resource_coordinator.cc +++ b/services/resource_coordinator/public/cpp/process_resource_coordinator.cc
@@ -40,8 +40,9 @@ return; // We could keep the ID around ourselves, but this hop ensures that the child // has been created on the service-side. - frame.service()->GetID(base::Bind(&ProcessResourceCoordinator::AddFrameByID, - weak_ptr_factory_.GetWeakPtr())); + frame.service()->GetID( + base::BindOnce(&ProcessResourceCoordinator::AddFrameByID, + weak_ptr_factory_.GetWeakPtr())); } void ProcessResourceCoordinator::RemoveFrame( @@ -50,8 +51,8 @@ if (!service_) return; frame.service()->GetID( - base::Bind(&ProcessResourceCoordinator::RemoveFrameByID, - weak_ptr_factory_.GetWeakPtr())); + base::BindOnce(&ProcessResourceCoordinator::RemoveFrameByID, + weak_ptr_factory_.GetWeakPtr())); } void ProcessResourceCoordinator::ConnectToService(
diff --git a/services/resource_coordinator/public/mojom/BUILD.gn b/services/resource_coordinator/public/mojom/BUILD.gn index 9ba1694..f42763da 100644 --- a/services/resource_coordinator/public/mojom/BUILD.gn +++ b/services/resource_coordinator/public/mojom/BUILD.gn
@@ -29,7 +29,4 @@ if (is_linux || is_android) { enabled_features += [ "private_swap_info" ] } - - # TODO(crbug.com/714018): Convert the implementation to use OnceCallback. - use_once_callback = false }
diff --git a/services/resource_coordinator/resource_coordinator_service_unittest.cc b/services/resource_coordinator/resource_coordinator_service_unittest.cc index eb4cc9c7..1c3a115 100644 --- a/services/resource_coordinator/resource_coordinator_service_unittest.cc +++ b/services/resource_coordinator/resource_coordinator_service_unittest.cc
@@ -47,8 +47,8 @@ provider->CreatePageCoordinationUnit(mojo::MakeRequest(&coordination_unit), new_id); - coordination_unit->GetID(base::Bind(&ResourceCoordinatorTest::GetIDCallback, - base::Unretained(this))); + coordination_unit->GetID(base::BindOnce( + &ResourceCoordinatorTest::GetIDCallback, base::Unretained(this))); base::RunLoop loop; SetRunLoopToQuit(&loop);
diff --git a/services/service_manager/service_manager.cc b/services/service_manager/service_manager.cc index c457437..755dadf 100644 --- a/services/service_manager/service_manager.cc +++ b/services/service_manager/service_manager.cc
@@ -228,6 +228,8 @@ } void Stop() { + DCHECK_NE(state_, State::STOPPED); + // Shutdown all bindings. This way the process should see the pipes closed // and exit, as well as waking up any potential // sync/WaitForIncomingResponse(). @@ -244,10 +246,15 @@ // Notify the ServiceManager that this Instance is really going away. service_manager_->OnInstanceStopped(identity_); } + + state_ = State::STOPPED; } ~Instance() override { - Stop(); + // The instance may have already been stopped prior to destruction if the + // ServiceManager itself is being torn down. + if (state_ != State::STOPPED) + Stop(); } bool CallOnBindInterface(std::unique_ptr<ConnectParams>* in_params) { @@ -373,7 +380,10 @@ STARTING, // The service was started successfully. - STARTED + STARTED, + + // The service has been stopped. + STOPPED, }; class InterfaceProviderImpl : public mojom::InterfaceProvider { @@ -897,10 +907,12 @@ // the case where one Instance's destructor blocks waiting for its Runner to // quit, while that Runner's corresponding Service blocks its shutdown on a // distinct Service receiving a connection error. - for (const auto& instance : instances_) - instance.first->Stop(); - service_manager_instance->Stop(); + for (const auto& instance : instances_) { + if (instance.first != service_manager_instance_) + instance.first->Stop(); + } + service_manager_instance->Stop(); instances_.clear(); }
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index f91c0f6..4480c99 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -225,6 +225,10 @@ #define GR_AA_TESSELLATOR_MAX_VERB_COUNT 10 +#ifndef SK_SUPPORT_LEGACY_PATH_DAA_BIT +#define SK_SUPPORT_LEGACY_PATH_DAA_BIT +#endif + ///////////////////////// Imported from BUILD.gn and skia_common.gypi /* In some places Skia can use static initializers for global initialization,
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 07600f3..0eea7d5 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -1735,7 +1735,7 @@ "device_type": "hammerhead" } ], - "hard_timeout": 120, + "hard_timeout": 300, "output_links": [ { "link": [ @@ -3334,7 +3334,7 @@ "device_type": "hammerhead" } ], - "hard_timeout": 120, + "hard_timeout": 300, "output_links": [ { "link": [
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index 08744ff..79ee386 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -6900,7 +6900,7 @@ "device_type": "hammerhead" } ], - "hard_timeout": 120, + "hard_timeout": 300, "output_links": [ { "link": [
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 9ab7faa..452dac0 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -1428,12 +1428,6 @@ "test": "gin_unittests" }, { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gl_tests" - }, - { "args": [ "--use-gpu-in-tests", "--no-xvfb"
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json index fc9f4e0..10fc547c 100644 --- a/testing/buildbot/chromium.perf.fyi.json +++ b/testing/buildbot/chromium.perf.fyi.json
@@ -447,97 +447,6 @@ } ] }, - "Mac 10.12 Laptop Low End": { - "isolated_scripts": [ - { - "args": [ - "--non-telemetry=true", - "--migrated-test=true" - ], - "isolate_name": "load_library_perf_tests", - "merge": { - "args": [ - "--service-account-file", - "/creds/service_accounts/service-account-chromium-perf-histograms.json" - ], - "script": "//tools/perf/process_perf_results.py" - }, - "name": "load_library_perf_tests", - "override_compile_targets": [ - "load_library_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "8086:1626", - "os": "Mac-10.12", - "pool": "Chrome-perf-fyi" - } - ], - "expiration": 36000, - "hard_timeout": 36000, - "ignore_task_failure": false, - "io_timeout": 1800, - "shards": 1, - "upload_test_results": true - }, - "trigger_script": { - "args": [ - "--multiple-trigger-configs", - "[{\"id\": \"build195-a9\"}]", - "--multiple-dimension-script-verbose", - "True" - ], - "script": "//testing/trigger_scripts/perf_device_trigger.py" - } - }, - { - "args": [ - "-v", - "--browser=release", - "--upload-results" - ], - "isolate_name": "performance_test_suite", - "merge": { - "args": [ - "--service-account-file", - "/creds/service_accounts/service-account-chromium-perf-histograms.json" - ], - "script": "//tools/perf/process_perf_results.py" - }, - "name": "performance_test_suite", - "override_compile_targets": [ - "performance_test_suite" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "8086:1626", - "os": "Mac-10.12", - "pool": "Chrome-perf-fyi" - } - ], - "expiration": 36000, - "hard_timeout": 36000, - "ignore_task_failure": false, - "io_timeout": 1800, - "shards": 26, - "upload_test_results": true - }, - "trigger_script": { - "args": [ - "--multiple-trigger-configs", - "[{\"id\": \"build195-a9\"}, {\"id\": \"build196-a9\"}, {\"id\": \"build197-a9\"}, {\"id\": \"build198-a9\"}, {\"id\": \"build199-a9\"}, {\"id\": \"build200-a9\"}, {\"id\": \"build201-a9\"}, {\"id\": \"build202-a9\"}, {\"id\": \"build203-a9\"}, {\"id\": \"build204-a9\"}, {\"id\": \"build205-a9\"}, {\"id\": \"build206-a9\"}, {\"id\": \"build207-a9\"}, {\"id\": \"build208-a9\"}, {\"id\": \"build209-a9\"}, {\"id\": \"build210-a9\"}, {\"id\": \"build211-a9\"}, {\"id\": \"build212-a9\"}, {\"id\": \"build213-a9\"}, {\"id\": \"build214-a9\"}, {\"id\": \"build215-a9\"}, {\"id\": \"build216-a9\"}, {\"id\": \"build217-a9\"}, {\"id\": \"build218-a9\"}, {\"id\": \"build219-a9\"}, {\"id\": \"build220-a9\"}]", - "--multiple-dimension-script-verbose", - "True" - ], - "script": "//testing/trigger_scripts/perf_device_trigger.py" - } - } - ] - }, "Mojo Linux Perf": { "isolated_scripts": [ {
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json index 23f049c..e7d818f5 100644 --- a/testing/buildbot/chromium.perf.json +++ b/testing/buildbot/chromium.perf.json
@@ -1386,7 +1386,7 @@ "-v", "--upload-results", "--browser=android-chromium", - "--output-format=chartjson" + "--output-format=histograms" ], "isolate_name": "telemetry_perf_tests", "name": "memory.top_10_mobile", @@ -1415,7 +1415,7 @@ "-v", "--upload-results", "--browser=reference", - "--output-format=chartjson", + "--output-format=histograms", "--max-failures=5", "--output-trace-tag=_ref" ], @@ -6139,7 +6139,7 @@ "-v", "--upload-results", "--browser=android-chromium", - "--output-format=chartjson" + "--output-format=histograms" ], "isolate_name": "telemetry_perf_tests", "name": "memory.top_10_mobile", @@ -6168,7 +6168,7 @@ "-v", "--upload-results", "--browser=reference", - "--output-format=chartjson", + "--output-format=histograms", "--max-failures=5", "--output-trace-tag=_ref" ], @@ -10121,7 +10121,7 @@ "-v", "--upload-results", "--browser=android-webview", - "--output-format=chartjson", + "--output-format=histograms", "--webview-embedder-apk=../../out/Release/apks/SystemWebViewShell.apk" ], "isolate_name": "telemetry_perf_webview_tests", @@ -13134,7 +13134,7 @@ "-v", "--upload-results", "--browser=android-chromium", - "--output-format=chartjson" + "--output-format=histograms" ], "isolate_name": "telemetry_perf_tests", "name": "memory.top_10_mobile", @@ -13163,7 +13163,7 @@ "-v", "--upload-results", "--browser=reference", - "--output-format=chartjson", + "--output-format=histograms", "--max-failures=5", "--output-trace-tag=_ref" ], @@ -17116,7 +17116,7 @@ "-v", "--upload-results", "--browser=android-webview", - "--output-format=chartjson", + "--output-format=histograms", "--webview-embedder-apk=../../out/Release/apks/SystemWebViewShell.apk" ], "isolate_name": "telemetry_perf_webview_tests", @@ -20151,7 +20151,7 @@ "-v", "--upload-results", "--browser=android-chromium", - "--output-format=chartjson" + "--output-format=histograms" ], "isolate_name": "telemetry_perf_tests", "name": "memory.top_10_mobile", @@ -20180,7 +20180,7 @@ "-v", "--upload-results", "--browser=reference", - "--output-format=chartjson", + "--output-format=histograms", "--max-failures=5", "--output-trace-tag=_ref" ], @@ -24822,7 +24822,7 @@ "-v", "--upload-results", "--browser=android-chromium", - "--output-format=chartjson" + "--output-format=histograms" ], "isolate_name": "telemetry_perf_tests", "name": "memory.top_10_mobile", @@ -24851,7 +24851,7 @@ "-v", "--upload-results", "--browser=reference", - "--output-format=chartjson", + "--output-format=histograms", "--max-failures=5", "--output-trace-tag=_ref" ], @@ -32229,6 +32229,97 @@ } ] }, + "Mac 10.12 Laptop Low End": { + "isolated_scripts": [ + { + "args": [ + "--non-telemetry=true", + "--migrated-test=true" + ], + "isolate_name": "load_library_perf_tests", + "merge": { + "args": [ + "--service-account-file", + "/creds/service_accounts/service-account-chromium-perf-histograms.json" + ], + "script": "//tools/perf/process_perf_results.py" + }, + "name": "load_library_perf_tests", + "override_compile_targets": [ + "load_library_perf_tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "8086:1626", + "os": "Mac-10.12", + "pool": "chrome.tests.perf" + } + ], + "expiration": 36000, + "hard_timeout": 36000, + "ignore_task_failure": false, + "io_timeout": 1800, + "shards": 1, + "upload_test_results": true + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"id\": \"build41-a7\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/perf_device_trigger.py" + } + }, + { + "args": [ + "-v", + "--browser=release", + "--upload-results" + ], + "isolate_name": "performance_test_suite", + "merge": { + "args": [ + "--service-account-file", + "/creds/service_accounts/service-account-chromium-perf-histograms.json" + ], + "script": "//tools/perf/process_perf_results.py" + }, + "name": "performance_test_suite", + "override_compile_targets": [ + "performance_test_suite" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "8086:1626", + "os": "Mac-10.12", + "pool": "chrome.tests.perf" + } + ], + "expiration": 36000, + "hard_timeout": 36000, + "ignore_task_failure": false, + "io_timeout": 1800, + "shards": 26, + "upload_test_results": true + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"id\": \"build41-a7\"}, {\"id\": \"build42-a7\"}, {\"id\": \"build43-a7\"}, {\"id\": \"build44-a7\"}, {\"id\": \"build45-a7\"}, {\"id\": \"build46-a7\"}, {\"id\": \"build47-a7\"}, {\"id\": \"build48-a7\"}, {\"id\": \"build49-a7\"}, {\"id\": \"build50-a7\"}, {\"id\": \"build51-a7\"}, {\"id\": \"build52-a7\"}, {\"id\": \"build53-a7\"}, {\"id\": \"build54-a7\"}, {\"id\": \"build55-a7\"}, {\"id\": \"build56-a7\"}, {\"id\": \"build57-a7\"}, {\"id\": \"build58-a7\"}, {\"id\": \"build59-a7\"}, {\"id\": \"build60-a7\"}, {\"id\": \"build61-a7\"}, {\"id\": \"build62-a7\"}, {\"id\": \"build63-a7\"}, {\"id\": \"build64-a7\"}, {\"id\": \"build65-a7\"}, {\"id\": \"build66-a7\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/perf_device_trigger.py" + } + } + ] + }, "Mac 10.12 Perf": { "isolated_scripts": [ {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 986b3a9..0b5c078d 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1536,6 +1536,7 @@ 'ThinLTO Linux ToT', # chromium.memory 'Linux ASan LSan Tests (1)', # https://crbug.com/830659 + 'Linux CFI', # https://crbug.com/830659 'Linux MSan Tests', # https://crbug.com/830659 'Linux ChromiumOS MSan Tests', # https://crbug.com/830659 'Linux TSan Tests', # https://crbug.com/830659 @@ -2681,14 +2682,6 @@ 'Linux ChromiumOS MSan Tests', # https://crbug.com/831676 'Linux MSan Tests', # https://crbug.com/831676 ], - 'modifications': { - # chromium.android - 'Marshmallow Phone Tester (rel)': { - 'swarming': { - 'hard_timeout': 300, - }, - }, - }, }, 'site_per_process_browser_tests': { 'remove_from': [
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 40087346..555f876c 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -447,7 +447,7 @@ }, 'services_unittests': { 'android_swarming': { - 'hard_timeout': 120, + 'hard_timeout': 300, }, }, 'skia_unittests': {},
diff --git a/testing/scripts/run_performance_tests.py b/testing/scripts/run_performance_tests.py index e86f126..da21a8b 100755 --- a/testing/scripts/run_performance_tests.py +++ b/testing/scripts/run_performance_tests.py
@@ -72,6 +72,7 @@ 'blink_perf.parser', 'blink_perf.shadow_dom', 'blink_perf.svg', + 'memory.top_10_mobile' ] # We currently have two different sharding schemes for android
diff --git a/testing/trigger_scripts/PRESUBMIT.py b/testing/trigger_scripts/PRESUBMIT.py index ffcd3c08..17e0e44 100644 --- a/testing/trigger_scripts/PRESUBMIT.py +++ b/testing/trigger_scripts/PRESUBMIT.py
@@ -41,7 +41,7 @@ [ 'luci.chromium.try:linux_optional_gpu_tests_rel', 'luci.chromium.try:mac_optional_gpu_tests_rel', - 'master.tryserver.chromium.win:win_optional_gpu_tests_rel', + 'luci.chromium.try:win_optional_gpu_tests_rel', 'luci.chromium.try:android_optional_gpu_tests_rel', ], 'Automatically added optional GPU tests to run on CQ.')
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 35b5e6ab..0a95775 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -711,18 +711,6 @@ ] } ], - "ChildAccountDetection": [ - { - "platforms": [ - "win" - ], - "experiments": [ - { - "name": "Disabled" - } - ] - } - ], "ChromeDashboard": [ { "platforms": [
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService index 3646c464..2aeb8ee 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
@@ -11,14 +11,12 @@ Bug(none) external/wpt/css/css-fonts/font-display/font-display.html [ Failure Timeout ] Bug(none) external/wpt/html/browsers/offline/appcache/workers/appcache-worker.html [ Timeout ] crbug.com/829417 external/wpt/html/browsers/offline/appcache/workers/appcache-worker.https.html [ Timeout ] -Bug(none) external/wpt/service-workers/service-worker/claim-shared-worker-fetch.https.html [ Failure ] Bug(none) external/wpt/service-workers/service-worker/clients-get-client-types.https.html [ Failure ] crbug.com/807271 external/wpt/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html [ Failure ] Bug(none) external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Pass Failure Crash ] Bug(none) external/wpt/service-workers/service-worker/fetch-request-xhr-sync-on-worker.https.html [ Timeout ] crbug.com/771118 external/wpt/service-workers/service-worker/mime-sniffing.https.html [ Failure ] Bug(none) external/wpt/service-workers/service-worker/registration-updateviacache.https.html [ Failure Timeout ] -Bug(none) external/wpt/service-workers/service-worker/shared-worker-controlled.https.html [ Timeout ] Bug(none) http/tests/appcache/top-frame-3.html [ Pass Timeout ] Bug(none) http/tests/appcache/top-frame-4.html [ Pass Timeout ] Bug(none) http/tests/appcache/local-content.html [ Pass Timeout ] @@ -35,9 +33,6 @@ Bug(none) external/wpt/streams/readable-byte-streams/properties.serviceworker.https.html [ Timeout Pass ] Bug(none) external/wpt/wasm/wasm_service_worker_test.https.html [ Crash Timeout ] -# Times out until shared worker support relands. -crbug.com/796819 external/wpt/service-workers/service-worker/worker-interception-redirect.https.html [ Skip ] - Bug(none) fast/files/xhr-response-blob.html [ Crash Failure ] Bug(none) fast/history/history-back-twice-with-subframes-assert.html [ Pass Timeout ] Bug(none) fast/xsl/import-after-comment.xml [ Skip ]
diff --git a/third_party/WebKit/LayoutTests/SlowTests b/third_party/WebKit/LayoutTests/SlowTests index b108c5d..0d41b6b 100644 --- a/third_party/WebKit/LayoutTests/SlowTests +++ b/third_party/WebKit/LayoutTests/SlowTests
@@ -510,3 +510,7 @@ crbug.com/825170 external/wpt/css/css-transitions/properties-value-inherit-001.html [ Slow ] crbug.com/825170 external/wpt/css/css-transitions/properties-value-inherit-002.html [ Slow ] crbug.com/825170 external/wpt/css/css-transitions/transitioncancel-001.html [ Slow ] + +# This test does a lot of IPC because it tests limits on IPC allocations, +# and is therefore slow. +crbug.com/826957 fast/peerconnection/RTCPeerConnection-manyCandidates.html [ Slow ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 8dd48e9c..70048df 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2285,6 +2285,7 @@ crbug.com/825740 virtual/off-main-thread-websocket/http/tests/websocket/multiple-connections-throttled.html [ Timeout ] crbug.com/825740 virtual/off-main-thread-websocket/http/tests/websocket/workers/close-code-and-reason.html [ Failure ] crbug.com/825740 virtual/off-main-thread-websocket/http/tests/websocket/workers/close.html [ Failure ] +crbug.com/831320 virtual/off-main-thread-websocket/http/tests/websocket/close-code-and-reason.html [ Pass Failure ] crbug.com/805463 external/wpt/acid/acid3/numbered-tests.html [ Skip ] @@ -2292,6 +2293,11 @@ crbug.com/829567 [ Linux Win ] virtual/mouseevent_fractional/fast/events/touch/scroll-without-mouse-lacks-mousemove-events.html [ Pass Failure ] crbug.com/829567 [ Linux Win ] virtual/scroll_customization/fast/events/touch/scroll-without-mouse-lacks-mousemove-events.html [ Pass Failure ] +# Failure messages are unstable so we cannot create baselines. +crbug.com/832071 external/wpt/service-workers/service-worker/worker-client-id.https.html [ Failure ] +crbug.com/832071 virtual/navigation-mojo-response/external/wpt/service-workers/service-worker/worker-client-id.https.html [ Failure ] +crbug.com/832071 virtual/outofblink-cors/external/wpt/service-workers/service-worker/worker-client-id.https.html [ Failure ] + # ====== New tests from wpt-importer added here ====== crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/remove-from-split-inline-6.html [ Failure ] crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/split-inner-inline-2.html [ Failure ] @@ -2661,8 +2667,11 @@ crbug.com/816534 external/wpt/web-animations/animation-model/animation-types/accumulation-per-property.html [ Pass Crash ] crbug.com/626703 external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html [ Timeout ] crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setLocalDescription-rollback.html [ Timeout ] +crbug.com/626703 virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-setLocalDescription-rollback.html [ Timeout ] crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setRemoteDescription.html [ Timeout ] +crbug.com/626703 virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-setRemoteDescription.html [ Timeout ] crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html [ Timeout ] +crbug.com/626703 virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html [ Timeout ] crbug.com/829401 external/wpt/webrtc/RTCPeerConnection-track-stats.https.html [ Pass Timeout ] crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html [ Failure ] crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_partially_move_down.html [ Failure ] @@ -4044,6 +4053,9 @@ crbug.com/826936 external/wpt/webauthn/getcredential-passing.https.html [ Pass Timeout ] crbug.com/826936 external/wpt/webauthn/getcredential-timeout.https.html [ Pass Timeout ] +# WebRTC with Unified Plan +crbug.com/828866 virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-tracks.https.html [ Timeout ] + # Sheriff 2018-04-06 crbug.com/829921 external/wpt/feature-policy/feature-policy-frame-policy-allowed-for-some.https.sub.html [ Pass Timeout ]
diff --git a/third_party/WebKit/LayoutTests/VirtualTestSuites b/third_party/WebKit/LayoutTests/VirtualTestSuites index 03d0fa84..a95ebe6 100644 --- a/third_party/WebKit/LayoutTests/VirtualTestSuites +++ b/third_party/WebKit/LayoutTests/VirtualTestSuites
@@ -673,5 +673,10 @@ "prefix": "off-main-thread-websocket", "base": "http/tests/security/mixedContent/websocket", "args": ["--enable-features=OffMainThreadWebSocket"] + }, + { + "prefix": "webrtc-wpt-unified-plan", + "base": "external/wpt/webrtc", + "args": ["--enable-blink-features=RTCUnifiedPlanByDefault"] } ]
diff --git a/third_party/WebKit/LayoutTests/external/PRESUBMIT.py b/third_party/WebKit/LayoutTests/external/PRESUBMIT.py index 8046c376..41e5f083 100644 --- a/third_party/WebKit/LayoutTests/external/PRESUBMIT.py +++ b/third_party/WebKit/LayoutTests/external/PRESUBMIT.py
@@ -19,7 +19,7 @@ paths_in_wpt = [] for f in input_api.AffectedFiles(): abs_path = f.AbsoluteLocalPath() - if abs_path.startswith(wpt_path): + if abs_path.endswith(input_api.os_path.relpath(abs_path, wpt_path)): paths_in_wpt.append(abs_path) # If there are changes in LayoutTests/external that aren't in wpt, e.g.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-background-origin-text-ref.html b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-background-origin-text-ref.html new file mode 100644 index 0000000..d1f18387 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-background-origin-text-ref.html
@@ -0,0 +1,6 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>webkit-background-origin should not accept text as value</title> +<link rel="author" title="Rob Buis" href="rob.buis@chromium.org"> +<p>There should be a green square below and no red.</p> +<div style="width: 100px; height: 100px; background-color: green"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-background-origin-text.html b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-background-origin-text.html new file mode 100644 index 0000000..06e7283 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-background-origin-text.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>webkit-background-origin should not accept text as value</title> +<link rel="author" title="Rob Buis" href="rob.buis@chromium.org"> +<link rel="match" href="webkit-background-origin-text-ref.html"> +<style> +#target { + width: 0px; + background-image: linear-gradient(green, green 50%, red 50%, red); + background-size: 200px 200px; + background-origin: border-box; + -webkit-background-origin: text; + padding: 25px; + border: 25px solid transparent; +} +</style> +<p>There should be a green square below and no red.</p> +<div id="target"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/frame-ancestors/frame-ancestors-overrides-xfo.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/frame-ancestors/frame-ancestors-overrides-xfo.html index 8365466..2db0b7f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/frame-ancestors/frame-ancestors-overrides-xfo.html +++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/frame-ancestors/frame-ancestors-overrides-xfo.html
@@ -19,10 +19,7 @@ var i = document.createElement('iframe'); i.src = "support/frame-ancestors-and-x-frame-options.sub.html?policy=other-origin.com&xfo=SAMEORIGIN"; i.onload = t.step_func_done(function () { - assert_throws( - "SecurityError", - function () { i.contentDocument.origin }, - "The same-origin page was blocked and sandboxed."); + assert_equals(i.contentDocument, null); }); document.body.appendChild(i); }, "A 'frame-ancestors' CSP directive overrides an 'x-frame-options' header which would allow the page.");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/crash-multicol.https.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/crash-multicol.https.html new file mode 100644 index 0000000..dbcbd18 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/crash-multicol.https.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/"> +<meta name="assert" content="This test checks that browser doesn't crash when the layout() function is used with multicol." /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<style> +#test { + display: layout('test'); + columns: 2; +} +</style> + +<div id="test"></div> + +<script> +promise_test(async function() { + await importWorklet(CSS.layoutWorklet, {url: 'support/layout-position-child-worklet.js'}); +}); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/alignment-baseline-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/alignment-baseline-expected.txt index bfe0899c..bfa1f080 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/alignment-baseline-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/alignment-baseline-expected.txt
@@ -15,6 +15,7 @@ PASS Setting 'alignment-baseline' to a length throws TypeError PASS Setting 'alignment-baseline' to a percent throws TypeError PASS Setting 'alignment-baseline' to a time throws TypeError +PASS Setting 'alignment-baseline' to an angle throws TypeError PASS Setting 'alignment-baseline' to a flexible length throws TypeError PASS Setting 'alignment-baseline' to a number throws TypeError PASS Setting 'alignment-baseline' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/background-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/background-expected.txt index f4781536..3125a8d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/background-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/background-expected.txt
@@ -4,6 +4,7 @@ PASS Setting 'background' to a length throws TypeError PASS Setting 'background' to a percent throws TypeError PASS Setting 'background' to a time throws TypeError +PASS Setting 'background' to an angle throws TypeError PASS Setting 'background' to a flexible length throws TypeError PASS Setting 'background' to a number throws TypeError PASS Setting 'background' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/background-position-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/background-position-expected.txt index d04a5a6c..4d785e6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/background-position-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/background-position-expected.txt
@@ -5,6 +5,7 @@ PASS Setting 'background-position' to a length throws TypeError PASS Setting 'background-position' to a percent throws TypeError PASS Setting 'background-position' to a time throws TypeError +PASS Setting 'background-position' to an angle throws TypeError PASS Setting 'background-position' to a flexible length throws TypeError PASS Setting 'background-position' to a number throws TypeError PASS Setting 'background-position' to a URL throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/background-repeat-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/background-repeat-expected.txt index 4130b70b0..bb8bbf5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/background-repeat-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/background-repeat-expected.txt
@@ -10,6 +10,7 @@ PASS Setting 'background-position' to a length throws TypeError PASS Setting 'background-position' to a percent throws TypeError PASS Setting 'background-position' to a time throws TypeError +PASS Setting 'background-position' to an angle throws TypeError PASS Setting 'background-position' to a flexible length throws TypeError PASS Setting 'background-position' to a number throws TypeError PASS Setting 'background-position' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/border-radius-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/border-radius-expected.txt index 8192f88..79cd9ac 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/border-radius-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/border-radius-expected.txt
@@ -4,6 +4,7 @@ FAIL Can set 'border-top-left-radius' to a length assert_equals: expected "[object CSSStyleValue]" but got "[object CSSUnitValue]" FAIL Can set 'border-top-left-radius' to a percent assert_equals: expected "[object CSSStyleValue]" but got "[object CSSUnitValue]" PASS Setting 'border-top-left-radius' to a time throws TypeError +PASS Setting 'border-top-left-radius' to an angle throws TypeError PASS Setting 'border-top-left-radius' to a flexible length throws TypeError PASS Setting 'border-top-left-radius' to a number throws TypeError PASS Setting 'border-top-left-radius' to a position throws TypeError @@ -14,6 +15,7 @@ FAIL Can set 'border-top-right-radius' to a length assert_equals: expected "[object CSSStyleValue]" but got "[object CSSUnitValue]" FAIL Can set 'border-top-right-radius' to a percent assert_equals: expected "[object CSSStyleValue]" but got "[object CSSUnitValue]" PASS Setting 'border-top-right-radius' to a time throws TypeError +PASS Setting 'border-top-right-radius' to an angle throws TypeError PASS Setting 'border-top-right-radius' to a flexible length throws TypeError PASS Setting 'border-top-right-radius' to a number throws TypeError PASS Setting 'border-top-right-radius' to a position throws TypeError @@ -24,6 +26,7 @@ FAIL Can set 'border-bottom-left-radius' to a length assert_equals: expected "[object CSSStyleValue]" but got "[object CSSUnitValue]" FAIL Can set 'border-bottom-left-radius' to a percent assert_equals: expected "[object CSSStyleValue]" but got "[object CSSUnitValue]" PASS Setting 'border-bottom-left-radius' to a time throws TypeError +PASS Setting 'border-bottom-left-radius' to an angle throws TypeError PASS Setting 'border-bottom-left-radius' to a flexible length throws TypeError PASS Setting 'border-bottom-left-radius' to a number throws TypeError PASS Setting 'border-bottom-left-radius' to a position throws TypeError @@ -34,6 +37,7 @@ FAIL Can set 'border-bottom-right-radius' to a length assert_equals: expected "[object CSSStyleValue]" but got "[object CSSUnitValue]" FAIL Can set 'border-bottom-right-radius' to a percent assert_equals: expected "[object CSSStyleValue]" but got "[object CSSUnitValue]" PASS Setting 'border-bottom-right-radius' to a time throws TypeError +PASS Setting 'border-bottom-right-radius' to an angle throws TypeError PASS Setting 'border-bottom-right-radius' to a flexible length throws TypeError PASS Setting 'border-bottom-right-radius' to a number throws TypeError PASS Setting 'border-bottom-right-radius' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/break-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/break-expected.txt index 8980e6d..1a0fa0a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/break-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/break-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 59 tests; 54 PASS, 5 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 62 tests; 57 PASS, 5 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Can set 'break-after' to CSS-wide keywords PASS Can set 'break-after' to var() references PASS Can set 'break-after' to the 'auto' keyword @@ -17,6 +17,7 @@ PASS Setting 'break-after' to a length throws TypeError PASS Setting 'break-after' to a percent throws TypeError PASS Setting 'break-after' to a time throws TypeError +PASS Setting 'break-after' to an angle throws TypeError PASS Setting 'break-after' to a flexible length throws TypeError PASS Setting 'break-after' to a number throws TypeError PASS Setting 'break-after' to a position throws TypeError @@ -39,6 +40,7 @@ PASS Setting 'break-before' to a length throws TypeError PASS Setting 'break-before' to a percent throws TypeError PASS Setting 'break-before' to a time throws TypeError +PASS Setting 'break-before' to an angle throws TypeError PASS Setting 'break-before' to a flexible length throws TypeError PASS Setting 'break-before' to a number throws TypeError PASS Setting 'break-before' to a position throws TypeError @@ -54,6 +56,7 @@ PASS Setting 'break-inside' to a length throws TypeError PASS Setting 'break-inside' to a percent throws TypeError PASS Setting 'break-inside' to a time throws TypeError +PASS Setting 'break-inside' to an angle throws TypeError PASS Setting 'break-inside' to a flexible length throws TypeError PASS Setting 'break-inside' to a number throws TypeError PASS Setting 'break-inside' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/clip-path-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/clip-path-expected.txt index d99880d..de80b403 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/clip-path-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/clip-path-expected.txt
@@ -13,6 +13,7 @@ PASS Setting 'clip-path' to a length throws TypeError PASS Setting 'clip-path' to a percent throws TypeError PASS Setting 'clip-path' to a time throws TypeError +PASS Setting 'clip-path' to an angle throws TypeError PASS Setting 'clip-path' to a flexible length throws TypeError PASS Setting 'clip-path' to a number throws TypeError PASS Setting 'clip-path' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/dominant-baseline-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/dominant-baseline-expected.txt index 22f4c52..b61e9c7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/dominant-baseline-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/dominant-baseline-expected.txt
@@ -13,6 +13,7 @@ PASS Setting 'dominant-baseline' to a length throws TypeError PASS Setting 'dominant-baseline' to a percent throws TypeError PASS Setting 'dominant-baseline' to a time throws TypeError +PASS Setting 'dominant-baseline' to an angle throws TypeError PASS Setting 'dominant-baseline' to a flexible length throws TypeError PASS Setting 'dominant-baseline' to a number throws TypeError PASS Setting 'dominant-baseline' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/fill-color-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/fill-color-expected.txt index 20088c6..8029ebc 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/fill-color-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/fill-color-expected.txt
@@ -5,6 +5,7 @@ PASS Setting 'fill-color' to a length throws TypeError PASS Setting 'fill-color' to a percent throws TypeError PASS Setting 'fill-color' to a time throws TypeError +PASS Setting 'fill-color' to an angle throws TypeError PASS Setting 'fill-color' to a flexible length throws TypeError PASS Setting 'fill-color' to a number throws TypeError PASS Setting 'fill-color' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/fill-opacity-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/fill-opacity-expected.txt index af23f53..e3020ef8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/fill-opacity-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/fill-opacity-expected.txt
@@ -5,6 +5,7 @@ PASS Setting 'fill-opacity' to a length throws TypeError PASS Setting 'fill-opacity' to a percent throws TypeError PASS Setting 'fill-opacity' to a time throws TypeError +PASS Setting 'fill-opacity' to an angle throws TypeError PASS Setting 'fill-opacity' to a flexible length throws TypeError PASS Setting 'fill-opacity' to a position throws TypeError PASS Setting 'fill-opacity' to a URL throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/flex-basis-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/flex-basis-expected.txt index 49a3755a..c87c1ef8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/flex-basis-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/flex-basis-expected.txt
@@ -6,6 +6,7 @@ PASS Can set 'flex-basis' to a length PASS Can set 'flex-basis' to a percent PASS Setting 'flex-basis' to a time throws TypeError +PASS Setting 'flex-basis' to an angle throws TypeError PASS Setting 'flex-basis' to a flexible length throws TypeError PASS Setting 'flex-basis' to a number throws TypeError PASS Setting 'flex-basis' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/flood-opacity-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/flood-opacity-expected.txt index 3cde731..1057d5d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/flood-opacity-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/flood-opacity-expected.txt
@@ -5,6 +5,7 @@ PASS Setting 'flood-opacity' to a length throws TypeError PASS Setting 'flood-opacity' to a percent throws TypeError PASS Setting 'flood-opacity' to a time throws TypeError +PASS Setting 'flood-opacity' to an angle throws TypeError PASS Setting 'flood-opacity' to a flexible length throws TypeError PASS Setting 'flood-opacity' to a position throws TypeError PASS Setting 'flood-opacity' to a URL throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-language-override-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-language-override-expected.txt index b15d1e6..ffb963d6 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-language-override-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-language-override-expected.txt
@@ -5,6 +5,7 @@ PASS Setting 'font-language-override' to a length throws TypeError PASS Setting 'font-language-override' to a percent throws TypeError PASS Setting 'font-language-override' to a time throws TypeError +PASS Setting 'font-language-override' to an angle throws TypeError PASS Setting 'font-language-override' to a flexible length throws TypeError PASS Setting 'font-language-override' to a number throws TypeError PASS Setting 'font-language-override' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-optical-sizing-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-optical-sizing-expected.txt index 505bdbd12..f0f962fa 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-optical-sizing-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-optical-sizing-expected.txt
@@ -6,6 +6,7 @@ PASS Setting 'font-optical-sizing' to a length throws TypeError PASS Setting 'font-optical-sizing' to a percent throws TypeError PASS Setting 'font-optical-sizing' to a time throws TypeError +PASS Setting 'font-optical-sizing' to an angle throws TypeError PASS Setting 'font-optical-sizing' to a flexible length throws TypeError PASS Setting 'font-optical-sizing' to a number throws TypeError PASS Setting 'font-optical-sizing' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-palette-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-palette-expected.txt index 06aaf8aa..867879dc 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-palette-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-palette-expected.txt
@@ -7,6 +7,7 @@ PASS Setting 'font-palette' to a length throws TypeError PASS Setting 'font-palette' to a percent throws TypeError PASS Setting 'font-palette' to a time throws TypeError +PASS Setting 'font-palette' to an angle throws TypeError PASS Setting 'font-palette' to a flexible length throws TypeError PASS Setting 'font-palette' to a number throws TypeError PASS Setting 'font-palette' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-presentation-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-presentation-expected.txt index f1839873..00c50b1 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-presentation-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-presentation-expected.txt
@@ -7,6 +7,7 @@ PASS Setting 'font-presentation' to a length throws TypeError PASS Setting 'font-presentation' to a percent throws TypeError PASS Setting 'font-presentation' to a time throws TypeError +PASS Setting 'font-presentation' to an angle throws TypeError PASS Setting 'font-presentation' to a flexible length throws TypeError PASS Setting 'font-presentation' to a number throws TypeError PASS Setting 'font-presentation' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-size-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-size-expected.txt index fd69ee5..f616c590 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-size-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-size-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 58 tests; 31 PASS, 27 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 61 tests; 34 PASS, 27 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Can set 'font-size' to CSS-wide keywords PASS Can set 'font-size' to var() references PASS Can set 'font-size' to the 'xx-small' keyword @@ -14,6 +14,7 @@ PASS Can set 'font-size' to a length PASS Can set 'font-size' to a percent PASS Setting 'font-size' to a time throws TypeError +PASS Setting 'font-size' to an angle throws TypeError PASS Setting 'font-size' to a flexible length throws TypeError PASS Setting 'font-size' to a number throws TypeError PASS Setting 'font-size' to a position throws TypeError @@ -33,6 +34,7 @@ FAIL Can set 'font-min-size' to a length Failed to execute 'set' on 'StylePropertyMap': Invalid propertyName: font-min-size FAIL Can set 'font-min-size' to a percent Failed to execute 'set' on 'StylePropertyMap': Invalid propertyName: font-min-size PASS Setting 'font-min-size' to a time throws TypeError +PASS Setting 'font-min-size' to an angle throws TypeError PASS Setting 'font-min-size' to a flexible length throws TypeError PASS Setting 'font-min-size' to a number throws TypeError PASS Setting 'font-min-size' to a position throws TypeError @@ -53,6 +55,7 @@ FAIL Can set 'font-max-size' to a length Failed to execute 'set' on 'StylePropertyMap': Invalid propertyName: font-max-size FAIL Can set 'font-max-size' to a percent Failed to execute 'set' on 'StylePropertyMap': Invalid propertyName: font-max-size PASS Setting 'font-max-size' to a time throws TypeError +PASS Setting 'font-max-size' to an angle throws TypeError PASS Setting 'font-max-size' to a flexible length throws TypeError PASS Setting 'font-max-size' to a number throws TypeError PASS Setting 'font-max-size' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-stretch-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-stretch-expected.txt index 2de60d9..6a4426ac 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-stretch-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-stretch-expected.txt
@@ -13,6 +13,7 @@ FAIL Can set 'font-stretch' to a percent assert_approx_equals: expected -3.14 +/- 0.000001 but got -3 PASS Setting 'font-stretch' to a length throws TypeError PASS Setting 'font-stretch' to a time throws TypeError +PASS Setting 'font-stretch' to an angle throws TypeError PASS Setting 'font-stretch' to a flexible length throws TypeError PASS Setting 'font-stretch' to a number throws TypeError PASS Setting 'font-stretch' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-style-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-style-expected.txt index e32908c..4b09d7ce 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-style-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-style-expected.txt
@@ -7,6 +7,7 @@ PASS Setting 'font-style' to a length throws TypeError PASS Setting 'font-style' to a percent throws TypeError PASS Setting 'font-style' to a time throws TypeError +PASS Setting 'font-style' to an angle throws TypeError PASS Setting 'font-style' to a flexible length throws TypeError PASS Setting 'font-style' to a number throws TypeError PASS Setting 'font-style' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-synthesis-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-synthesis-expected.txt index ad040e2..359aab2 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-synthesis-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-synthesis-expected.txt
@@ -8,6 +8,7 @@ PASS Setting 'font-synthesis' to a length throws TypeError PASS Setting 'font-synthesis' to a percent throws TypeError PASS Setting 'font-synthesis' to a time throws TypeError +PASS Setting 'font-synthesis' to an angle throws TypeError PASS Setting 'font-synthesis' to a flexible length throws TypeError PASS Setting 'font-synthesis' to a number throws TypeError PASS Setting 'font-synthesis' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-variant-alternates-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-variant-alternates-expected.txt index 07bfaf3..eb3fecf 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-variant-alternates-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-variant-alternates-expected.txt
@@ -6,6 +6,7 @@ PASS Setting 'font-variant-alternates' to a length throws TypeError PASS Setting 'font-variant-alternates' to a percent throws TypeError PASS Setting 'font-variant-alternates' to a time throws TypeError +PASS Setting 'font-variant-alternates' to an angle throws TypeError PASS Setting 'font-variant-alternates' to a flexible length throws TypeError PASS Setting 'font-variant-alternates' to a number throws TypeError PASS Setting 'font-variant-alternates' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-variant-emoji-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-variant-emoji-expected.txt index 08a2de6..9c7189e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-variant-emoji-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-variant-emoji-expected.txt
@@ -7,6 +7,7 @@ PASS Setting 'font-variant-emoji' to a length throws TypeError PASS Setting 'font-variant-emoji' to a percent throws TypeError PASS Setting 'font-variant-emoji' to a time throws TypeError +PASS Setting 'font-variant-emoji' to an angle throws TypeError PASS Setting 'font-variant-emoji' to a flexible length throws TypeError PASS Setting 'font-variant-emoji' to a number throws TypeError PASS Setting 'font-variant-emoji' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-weight-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-weight-expected.txt index a467b69..87f9450 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-weight-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-weight-expected.txt
@@ -9,6 +9,7 @@ PASS Setting 'font-weight' to a length throws TypeError PASS Setting 'font-weight' to a percent throws TypeError PASS Setting 'font-weight' to a time throws TypeError +PASS Setting 'font-weight' to an angle throws TypeError PASS Setting 'font-weight' to a flexible length throws TypeError PASS Setting 'font-weight' to a position throws TypeError PASS Setting 'font-weight' to a URL throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/image-rendering-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/image-rendering-expected.txt index adc7277..00e659a2 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/image-rendering-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/image-rendering-expected.txt
@@ -9,6 +9,7 @@ PASS Setting 'image-rendering' to a length throws TypeError PASS Setting 'image-rendering' to a percent throws TypeError PASS Setting 'image-rendering' to a time throws TypeError +PASS Setting 'image-rendering' to an angle throws TypeError PASS Setting 'image-rendering' to a flexible length throws TypeError PASS Setting 'image-rendering' to a number throws TypeError PASS Setting 'image-rendering' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/letter-spacing-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/letter-spacing-expected.txt index ac898d5..6c333c87 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/letter-spacing-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/letter-spacing-expected.txt
@@ -5,6 +5,7 @@ FAIL Can set 'letter-spacing' to a length assert_equals: expected "CSSUnitValue" but got "CSSKeywordValue" PASS Setting 'letter-spacing' to a percent throws TypeError PASS Setting 'letter-spacing' to a time throws TypeError +PASS Setting 'letter-spacing' to an angle throws TypeError PASS Setting 'letter-spacing' to a flexible length throws TypeError PASS Setting 'letter-spacing' to a number throws TypeError PASS Setting 'letter-spacing' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-break-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-break-expected.txt index e244d27c..69e86aa 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-break-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-break-expected.txt
@@ -9,6 +9,7 @@ PASS Setting 'line-break' to a length throws TypeError PASS Setting 'line-break' to a percent throws TypeError PASS Setting 'line-break' to a time throws TypeError +PASS Setting 'line-break' to an angle throws TypeError PASS Setting 'line-break' to a flexible length throws TypeError PASS Setting 'line-break' to a number throws TypeError PASS Setting 'line-break' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-height-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-height-expected.txt index 5802a830..a5646404 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-height-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-height-expected.txt
@@ -6,6 +6,7 @@ FAIL Can set 'line-height' to a number assert_equals: relative lengths must compute to a CSSUnitValue expected "[object CSSUnitValue]" but got "[object CSSKeywordValue]" FAIL Can set 'line-height' to a percent assert_equals: relative lengths must compute to a CSSUnitValue expected "[object CSSUnitValue]" but got "[object CSSKeywordValue]" PASS Setting 'line-height' to a time throws TypeError +PASS Setting 'line-height' to an angle throws TypeError PASS Setting 'line-height' to a flexible length throws TypeError PASS Setting 'line-height' to a position throws TypeError PASS Setting 'line-height' to a URL throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/margin-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/margin-expected.txt index ea26372a..be788697 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/margin-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/margin-expected.txt
@@ -1,11 +1,12 @@ This is a testharness.js-based test. -Found 56 tests; 54 PASS, 2 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 61 tests; 59 PASS, 2 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Can set 'margin-top' to CSS-wide keywords PASS Can set 'margin-top' to var() references PASS Can set 'margin-top' to the 'auto' keyword PASS Can set 'margin-top' to a percent PASS Can set 'margin-top' to a length PASS Setting 'margin-top' to a time throws TypeError +PASS Setting 'margin-top' to an angle throws TypeError PASS Setting 'margin-top' to a flexible length throws TypeError PASS Setting 'margin-top' to a number throws TypeError PASS Setting 'margin-top' to a position throws TypeError @@ -17,6 +18,7 @@ PASS Can set 'margin-left' to a percent PASS Can set 'margin-left' to a length PASS Setting 'margin-left' to a time throws TypeError +PASS Setting 'margin-left' to an angle throws TypeError PASS Setting 'margin-left' to a flexible length throws TypeError PASS Setting 'margin-left' to a number throws TypeError PASS Setting 'margin-left' to a position throws TypeError @@ -28,6 +30,7 @@ PASS Can set 'margin-right' to a percent PASS Can set 'margin-right' to a length PASS Setting 'margin-right' to a time throws TypeError +PASS Setting 'margin-right' to an angle throws TypeError PASS Setting 'margin-right' to a flexible length throws TypeError PASS Setting 'margin-right' to a number throws TypeError PASS Setting 'margin-right' to a position throws TypeError @@ -39,6 +42,7 @@ PASS Can set 'margin-bottom' to a percent PASS Can set 'margin-bottom' to a length PASS Setting 'margin-bottom' to a time throws TypeError +PASS Setting 'margin-bottom' to an angle throws TypeError PASS Setting 'margin-bottom' to a flexible length throws TypeError PASS Setting 'margin-bottom' to a number throws TypeError PASS Setting 'margin-bottom' to a position throws TypeError @@ -49,6 +53,7 @@ PASS Setting 'margin' to a length throws TypeError PASS Setting 'margin' to a percent throws TypeError PASS Setting 'margin' to a time throws TypeError +PASS Setting 'margin' to an angle throws TypeError PASS Setting 'margin' to a flexible length throws TypeError PASS Setting 'margin' to a number throws TypeError PASS Setting 'margin' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/mask-image-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/mask-image-expected.txt index 14c9c329..ce642b4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/mask-image-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/mask-image-expected.txt
@@ -6,6 +6,7 @@ PASS Setting 'mask-image' to a length throws TypeError PASS Setting 'mask-image' to a percent throws TypeError PASS Setting 'mask-image' to a time throws TypeError +PASS Setting 'mask-image' to an angle throws TypeError PASS Setting 'mask-image' to a flexible length throws TypeError PASS Setting 'mask-image' to a number throws TypeError PASS Setting 'mask-image' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/offset-rotate-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/offset-rotate-expected.txt new file mode 100644 index 0000000..d941ef06 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/offset-rotate-expected.txt
@@ -0,0 +1,18 @@ +This is a testharness.js-based test. +PASS Can set 'offset-rotate' to CSS-wide keywords +PASS Can set 'offset-rotate' to var() references +FAIL Can set 'offset-rotate' to the 'auto' keyword assert_equals: expected "CSSKeywordValue" but got "CSSStyleValue" +FAIL Can set 'offset-rotate' to the 'reverse' keyword assert_equals: expected "CSSKeywordValue" but got "CSSStyleValue" +PASS Can set 'offset-rotate' to an angle +PASS Setting 'offset-rotate' to a length throws TypeError +PASS Setting 'offset-rotate' to a percent throws TypeError +PASS Setting 'offset-rotate' to a time throws TypeError +PASS Setting 'offset-rotate' to a flexible length throws TypeError +PASS Setting 'offset-rotate' to a number throws TypeError +PASS Setting 'offset-rotate' to a position throws TypeError +PASS Setting 'offset-rotate' to a URL throws TypeError +PASS Setting 'offset-rotate' to a transform throws TypeError +PASS 'offset-rotate' does not supported 'auto 90deg' +PASS 'offset-rotate' does not supported 'reverse -90deg' +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/offset-rotate.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/offset-rotate.html index 56a8580c..c91e27c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/offset-rotate.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/offset-rotate.html
@@ -12,6 +12,12 @@ <script> 'use strict'; +runPropertyTests('offset-rotate', [ + { syntax: 'auto' }, + { syntax: 'reverse' }, + { syntax: '<angle>' }, +]); + runUnsupportedPropertyTests('offset-rotate', [ 'auto 90deg', 'reverse -90deg',
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/outline-style-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/outline-style-expected.txt index 1901fc7a..fb9ee73e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/outline-style-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/outline-style-expected.txt
@@ -14,6 +14,7 @@ PASS Setting 'outline-style' to a length throws TypeError PASS Setting 'outline-style' to a percent throws TypeError PASS Setting 'outline-style' to a time throws TypeError +PASS Setting 'outline-style' to an angle throws TypeError PASS Setting 'outline-style' to a flexible length throws TypeError PASS Setting 'outline-style' to a number throws TypeError PASS Setting 'outline-style' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/overflow-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/overflow-expected.txt index 50c7cc2c..3a800d9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/overflow-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/overflow-expected.txt
@@ -9,6 +9,7 @@ PASS Setting 'overflow-x' to a length throws TypeError PASS Setting 'overflow-x' to a percent throws TypeError PASS Setting 'overflow-x' to a time throws TypeError +PASS Setting 'overflow-x' to an angle throws TypeError PASS Setting 'overflow-x' to a flexible length throws TypeError PASS Setting 'overflow-x' to a number throws TypeError PASS Setting 'overflow-x' to a position throws TypeError @@ -24,6 +25,7 @@ PASS Setting 'overflow-y' to a length throws TypeError PASS Setting 'overflow-y' to a percent throws TypeError PASS Setting 'overflow-y' to a time throws TypeError +PASS Setting 'overflow-y' to an angle throws TypeError PASS Setting 'overflow-y' to a flexible length throws TypeError PASS Setting 'overflow-y' to a number throws TypeError PASS Setting 'overflow-y' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/overflow-wrap-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/overflow-wrap-expected.txt index 26a3df07..f49bd673 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/overflow-wrap-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/overflow-wrap-expected.txt
@@ -7,6 +7,7 @@ PASS Setting 'overflow-wrap' to a length throws TypeError PASS Setting 'overflow-wrap' to a percent throws TypeError PASS Setting 'overflow-wrap' to a time throws TypeError +PASS Setting 'overflow-wrap' to an angle throws TypeError PASS Setting 'overflow-wrap' to a flexible length throws TypeError PASS Setting 'overflow-wrap' to a number throws TypeError PASS Setting 'overflow-wrap' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/paint-order-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/paint-order-expected.txt index a11a4db..422268b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/paint-order-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/paint-order-expected.txt
@@ -8,6 +8,7 @@ PASS Setting 'paint-order' to a length throws TypeError PASS Setting 'paint-order' to a percent throws TypeError PASS Setting 'paint-order' to a time throws TypeError +PASS Setting 'paint-order' to an angle throws TypeError PASS Setting 'paint-order' to a flexible length throws TypeError PASS Setting 'paint-order' to a number throws TypeError PASS Setting 'paint-order' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/resources/testsuite.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/resources/testsuite.js index db79630..3ca0b55f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/resources/testsuite.js +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/resources/testsuite.js
@@ -124,6 +124,60 @@ } ], }, + '<time>': { + description: 'a time', + examples: [ + { + description: "zero seconds", + input: new CSSUnitValue(0, 's') + }, + { + description: "negative milliseconds", + input: new CSSUnitValue(-3.14, 'ms'), + // Computed values use canonical units + defaultComputed: (_, result) => assert_style_value_equals(result, new CSSUnitValue(-0.00314, 's')) + }, + { + description: "positive seconds", + input: new CSSUnitValue(3.14, 's') + }, + { + description: "a calc time", + input: new CSSMathSum(new CSSUnitValue(0, 's'), new CSSUnitValue(0, 'ms')), + // Specified/computed calcs are usually simplified. + // FIXME: Test this properly + defaultSpecified: (_, result) => assert_is_calc_sum(result), + defaultComputed: (_, result) => assert_is_unit('s', result) + } + ], + }, + '<angle>': { + description: 'an angle', + examples: [ + { + description: "zero degrees", + input: new CSSUnitValue(0, 'deg') + }, + { + description: "positive radians", + input: new CSSUnitValue(3.14, 'rad'), + // Computed values use canonical units + defaultComputed: (_, result) => assert_style_value_equals(result, new CSSUnitValue(179.908752, 'deg')) + }, + { + description: "negative degrees", + input: new CSSUnitValue(-3.14, 'deg') + }, + { + description: "a calc angle", + input: new CSSMathSum(new CSSUnitValue(0, 'rad'), new CSSUnitValue(0, 'deg')), + // Specified/computed calcs are usually simplified. + // FIXME: Test this properly + defaultSpecified: (_, result) => assert_is_calc_sum(result), + defaultComputed: (_, result) => assert_is_unit('deg', result) + } + ], + }, '<flex>': { description: 'a flexible length', examples: [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/scroll-snap-align-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/scroll-snap-align-expected.txt index f7d22fd7..7e0d5df 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/scroll-snap-align-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/scroll-snap-align-expected.txt
@@ -8,6 +8,7 @@ PASS Setting 'scroll-snap-align' to a length throws TypeError PASS Setting 'scroll-snap-align' to a percent throws TypeError PASS Setting 'scroll-snap-align' to a time throws TypeError +PASS Setting 'scroll-snap-align' to an angle throws TypeError PASS Setting 'scroll-snap-align' to a flexible length throws TypeError PASS Setting 'scroll-snap-align' to a number throws TypeError PASS Setting 'scroll-snap-align' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/scroll-snap-type-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/scroll-snap-type-expected.txt index 78d48828..0295837 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/scroll-snap-type-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/scroll-snap-type-expected.txt
@@ -10,6 +10,7 @@ PASS Setting 'scroll-snap-type' to a length throws TypeError PASS Setting 'scroll-snap-type' to a percent throws TypeError PASS Setting 'scroll-snap-type' to a time throws TypeError +PASS Setting 'scroll-snap-type' to an angle throws TypeError PASS Setting 'scroll-snap-type' to a flexible length throws TypeError PASS Setting 'scroll-snap-type' to a number throws TypeError PASS Setting 'scroll-snap-type' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-outside-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-outside-expected.txt index 3549dab..72618e3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-outside-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-outside-expected.txt
@@ -10,6 +10,7 @@ PASS Setting 'shape-outside' to a length throws TypeError PASS Setting 'shape-outside' to a percent throws TypeError PASS Setting 'shape-outside' to a time throws TypeError +PASS Setting 'shape-outside' to an angle throws TypeError PASS Setting 'shape-outside' to a flexible length throws TypeError PASS Setting 'shape-outside' to a number throws TypeError PASS Setting 'shape-outside' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/stop-opacity-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/stop-opacity-expected.txt index 0169242..ce16f2fef 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/stop-opacity-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/stop-opacity-expected.txt
@@ -5,6 +5,7 @@ PASS Setting 'stop-opacity' to a length throws TypeError PASS Setting 'stop-opacity' to a percent throws TypeError PASS Setting 'stop-opacity' to a time throws TypeError +PASS Setting 'stop-opacity' to an angle throws TypeError PASS Setting 'stop-opacity' to a flexible length throws TypeError PASS Setting 'stop-opacity' to a position throws TypeError PASS Setting 'stop-opacity' to a URL throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/stroke-linejoin-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/stroke-linejoin-expected.txt index 9e8e157..b5d99d9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/stroke-linejoin-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/stroke-linejoin-expected.txt
@@ -10,6 +10,7 @@ PASS Setting 'stroke-linejoin' to a length throws TypeError PASS Setting 'stroke-linejoin' to a percent throws TypeError PASS Setting 'stroke-linejoin' to a time throws TypeError +PASS Setting 'stroke-linejoin' to an angle throws TypeError PASS Setting 'stroke-linejoin' to a flexible length throws TypeError PASS Setting 'stroke-linejoin' to a number throws TypeError PASS Setting 'stroke-linejoin' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/stroke-opacity-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/stroke-opacity-expected.txt index 901026f3..2f152c1 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/stroke-opacity-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/stroke-opacity-expected.txt
@@ -5,6 +5,7 @@ PASS Setting 'stroke-opacity' to a length throws TypeError PASS Setting 'stroke-opacity' to a percent throws TypeError PASS Setting 'stroke-opacity' to a time throws TypeError +PASS Setting 'stroke-opacity' to an angle throws TypeError PASS Setting 'stroke-opacity' to a flexible length throws TypeError PASS Setting 'stroke-opacity' to a position throws TypeError PASS Setting 'stroke-opacity' to a URL throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-combine-upright-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-combine-upright-expected.txt index 054462e..29f05e7 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-combine-upright-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-combine-upright-expected.txt
@@ -6,6 +6,7 @@ PASS Setting 'text-combine-upright' to a length throws TypeError PASS Setting 'text-combine-upright' to a percent throws TypeError PASS Setting 'text-combine-upright' to a time throws TypeError +PASS Setting 'text-combine-upright' to an angle throws TypeError PASS Setting 'text-combine-upright' to a flexible length throws TypeError PASS Setting 'text-combine-upright' to a number throws TypeError PASS Setting 'text-combine-upright' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-decoration-line-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-decoration-line-expected.txt index d939165..18db611c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-decoration-line-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-decoration-line-expected.txt
@@ -11,6 +11,7 @@ PASS Setting 'text-decoration-line' to a length throws TypeError PASS Setting 'text-decoration-line' to a percent throws TypeError PASS Setting 'text-decoration-line' to a time throws TypeError +PASS Setting 'text-decoration-line' to an angle throws TypeError PASS Setting 'text-decoration-line' to a flexible length throws TypeError PASS Setting 'text-decoration-line' to a number throws TypeError PASS Setting 'text-decoration-line' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-decoration-skip-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-decoration-skip-expected.txt index 339bec1..f2fa17c0 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-decoration-skip-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-decoration-skip-expected.txt
@@ -9,6 +9,7 @@ PASS Setting 'text-decoration-skip' to a length throws TypeError PASS Setting 'text-decoration-skip' to a percent throws TypeError PASS Setting 'text-decoration-skip' to a time throws TypeError +PASS Setting 'text-decoration-skip' to an angle throws TypeError PASS Setting 'text-decoration-skip' to a flexible length throws TypeError PASS Setting 'text-decoration-skip' to a number throws TypeError PASS Setting 'text-decoration-skip' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-decoration-width-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-decoration-width-expected.txt index 37548b3..ea49214f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-decoration-width-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-decoration-width-expected.txt
@@ -5,6 +5,7 @@ FAIL Can set 'text-decoration-width' to a length Failed to execute 'set' on 'StylePropertyMap': Invalid propertyName: text-decoration-width PASS Setting 'text-decoration-width' to a percent throws TypeError PASS Setting 'text-decoration-width' to a time throws TypeError +PASS Setting 'text-decoration-width' to an angle throws TypeError PASS Setting 'text-decoration-width' to a flexible length throws TypeError PASS Setting 'text-decoration-width' to a number throws TypeError PASS Setting 'text-decoration-width' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color-expected.txt index 5df24c4..a101fe8f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color-expected.txt
@@ -5,6 +5,7 @@ PASS Setting 'text-emphasis-color' to a length throws TypeError PASS Setting 'text-emphasis-color' to a percent throws TypeError PASS Setting 'text-emphasis-color' to a time throws TypeError +PASS Setting 'text-emphasis-color' to an angle throws TypeError PASS Setting 'text-emphasis-color' to a flexible length throws TypeError PASS Setting 'text-emphasis-color' to a number throws TypeError PASS Setting 'text-emphasis-color' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-justify-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-justify-expected.txt index c0a0098..1791761 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-justify-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-justify-expected.txt
@@ -8,6 +8,7 @@ PASS Setting 'text-justify' to a length throws TypeError PASS Setting 'text-justify' to a percent throws TypeError PASS Setting 'text-justify' to a time throws TypeError +PASS Setting 'text-justify' to an angle throws TypeError PASS Setting 'text-justify' to a flexible length throws TypeError PASS Setting 'text-justify' to a number throws TypeError PASS Setting 'text-justify' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-overflow-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-overflow-expected.txt index d50d0408..8e062a4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-overflow-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-overflow-expected.txt
@@ -7,6 +7,7 @@ PASS Setting 'text-overflow' to a length throws TypeError PASS Setting 'text-overflow' to a percent throws TypeError PASS Setting 'text-overflow' to a time throws TypeError +PASS Setting 'text-overflow' to an angle throws TypeError PASS Setting 'text-overflow' to a flexible length throws TypeError PASS Setting 'text-overflow' to a number throws TypeError PASS Setting 'text-overflow' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-size-adjust-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-size-adjust-expected.txt index a076b33..a871e15 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-size-adjust-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-size-adjust-expected.txt
@@ -6,6 +6,7 @@ FAIL Can set 'text-size-adjust' to a percent assert_equals: expected "CSSUnitValue" but got "CSSKeywordValue" PASS Setting 'text-size-adjust' to a length throws TypeError PASS Setting 'text-size-adjust' to a time throws TypeError +PASS Setting 'text-size-adjust' to an angle throws TypeError PASS Setting 'text-size-adjust' to a flexible length throws TypeError PASS Setting 'text-size-adjust' to a number throws TypeError PASS Setting 'text-size-adjust' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-transform-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-transform-expected.txt index a198c67..965a95e5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-transform-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-transform-expected.txt
@@ -9,6 +9,7 @@ PASS Setting 'text-transform' to a length throws TypeError PASS Setting 'text-transform' to a percent throws TypeError PASS Setting 'text-transform' to a time throws TypeError +PASS Setting 'text-transform' to an angle throws TypeError PASS Setting 'text-transform' to a flexible length throws TypeError PASS Setting 'text-transform' to a number throws TypeError PASS Setting 'text-transform' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-underline-position-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-underline-position-expected.txt index 9ec3b6b..eb460df 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-underline-position-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-underline-position-expected.txt
@@ -8,6 +8,7 @@ PASS Setting 'text-underline-position' to a length throws TypeError PASS Setting 'text-underline-position' to a percent throws TypeError PASS Setting 'text-underline-position' to a time throws TypeError +PASS Setting 'text-underline-position' to an angle throws TypeError PASS Setting 'text-underline-position' to a flexible length throws TypeError PASS Setting 'text-underline-position' to a number throws TypeError PASS Setting 'text-underline-position' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/transform-style-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/transform-style-expected.txt index c2737c790..f5d45af 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/transform-style-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/transform-style-expected.txt
@@ -7,6 +7,7 @@ PASS Setting 'transform-style' to a length throws TypeError PASS Setting 'transform-style' to a percent throws TypeError PASS Setting 'transform-style' to a time throws TypeError +PASS Setting 'transform-style' to an angle throws TypeError PASS Setting 'transform-style' to a flexible length throws TypeError PASS Setting 'transform-style' to a number throws TypeError PASS Setting 'transform-style' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/user-select-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/user-select-expected.txt index d1891e6..c0de658 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/user-select-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/user-select-expected.txt
@@ -9,6 +9,7 @@ PASS Setting 'user-select' to a length throws TypeError PASS Setting 'user-select' to a percent throws TypeError PASS Setting 'user-select' to a time throws TypeError +PASS Setting 'user-select' to an angle throws TypeError PASS Setting 'user-select' to a flexible length throws TypeError PASS Setting 'user-select' to a number throws TypeError PASS Setting 'user-select' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/word-spacing-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/word-spacing-expected.txt index 1720539..4a7160f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/word-spacing-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/word-spacing-expected.txt
@@ -5,6 +5,7 @@ PASS Can set 'word-spacing' to a length FAIL Can set 'word-spacing' to a percent Failed to execute 'set' on 'StylePropertyMap': Invalid type for property PASS Setting 'word-spacing' to a time throws TypeError +PASS Setting 'word-spacing' to an angle throws TypeError PASS Setting 'word-spacing' to a flexible length throws TypeError PASS Setting 'word-spacing' to a number throws TypeError PASS Setting 'word-spacing' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/word-wrap-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/word-wrap-expected.txt index 1f4beed..6daf30a5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/word-wrap-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/word-wrap-expected.txt
@@ -7,6 +7,7 @@ PASS Setting 'word-wrap' to a length throws TypeError PASS Setting 'word-wrap' to a percent throws TypeError PASS Setting 'word-wrap' to a time throws TypeError +PASS Setting 'word-wrap' to an angle throws TypeError PASS Setting 'word-wrap' to a flexible length throws TypeError PASS Setting 'word-wrap' to a number throws TypeError PASS Setting 'word-wrap' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/writing-mode-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/writing-mode-expected.txt index 7e24b2f2..680c674 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/writing-mode-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/writing-mode-expected.txt
@@ -9,6 +9,7 @@ PASS Setting 'writing-mode' to a length throws TypeError PASS Setting 'writing-mode' to a percent throws TypeError PASS Setting 'writing-mode' to a time throws TypeError +PASS Setting 'writing-mode' to an angle throws TypeError PASS Setting 'writing-mode' to a flexible length throws TypeError PASS Setting 'writing-mode' to a number throws TypeError PASS Setting 'writing-mode' to a position throws TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter-expected.txt index 1806175c..a9bd8c9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. PASS failed setting of document.domain -FAIL same-origin-domain iframe Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame. +FAIL same-origin-domain iframe Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame. Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-embed-element/document-getters-return-null-for-cross-origin.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-embed-element/document-getters-return-null-for-cross-origin.html new file mode 100644 index 0000000..89dc5d6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-embed-element/document-getters-return-null-for-cross-origin.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<title>Test that getSVGDocument() returns null for a cross-origin document.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<embed src='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><rect height="100" width="100"/></svg>'></embed> +<script> +const embed = document.querySelector('embed'); +var t = async_test('HTMLEmbedElement.getSVGDocument() for cross-origin document'); +window.addEventListener( + 'load', t.step_func_done(() => { assert_equals(embed.getSVGDocument(), null); })); +</script> +</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-frame-element/document-getters-return-null-for-cross-origin.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-frame-element/document-getters-return-null-for-cross-origin.html new file mode 100644 index 0000000..2628e910 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-frame-element/document-getters-return-null-for-cross-origin.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<title>Test that contentDocument returns null for a cross-origin document.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +var t = async_test('HTMLFrameElement.contentDocument for cross-origin document'); +window.addEventListener( + 'load', t.step_func_done(() => { assert_equals(document.querySelector('frame').contentDocument, null); })); +</script> +<frameset> +<frame src='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><rect height="100" width="100"/></svg>'></frame> +</frameset>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-iframe-element/document-getters-return-null-for-cross-origin.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-iframe-element/document-getters-return-null-for-cross-origin.html new file mode 100644 index 0000000..e3dc0b0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-iframe-element/document-getters-return-null-for-cross-origin.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<title>Test that contentDocument/getSVGDocument() return null for a cross-origin document.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<iframe src='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><rect height="100" width="100"/></svg>'></iframe> +<script> +const iframe = document.querySelector('iframe'); +var t1 = async_test('HTMLIFrameElement.contentDocument for cross-origin document'); +window.addEventListener( + 'load', t1.step_func_done(() => { assert_equals(iframe.contentDocument, null); })); +var t2 = async_test('HTMLIFrameElement.getSVGDocument() for cross-origin document'); +window.addEventListener( + 'load', t2.step_func_done(() => { assert_equals(iframe.getSVGDocument(), null); })); +</script> +</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-object-element/document-getters-return-null-for-cross-origin.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-object-element/document-getters-return-null-for-cross-origin.html new file mode 100644 index 0000000..3d10775 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-object-element/document-getters-return-null-for-cross-origin.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<title>Test that contentDocument/getSVGDocument() return null for a cross-origin document.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<object data='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><rect height="100" width="100"/></svg>'></object> +<script> +const object = document.querySelector('object'); +var t1 = async_test('HTMLObjectElement.contentDocument for cross-origin document'); +window.addEventListener( + 'load', t1.step_func_done(() => { assert_equals(object.contentDocument, null); })); +var t2 = async_test('HTMLObjectElement.getSVGDocument() for cross-origin document'); +window.addEventListener( + 'load', t2.step_func_done(() => { assert_equals(object.getSVGDocument(), null); })); +</script> +</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/x-frame-options/deny.sub.html b/third_party/WebKit/LayoutTests/external/wpt/x-frame-options/deny.sub.html index 8ef58310..626f204 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/x-frame-options/deny.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/x-frame-options/deny.sub.html
@@ -11,7 +11,7 @@ assert_no_message_from(i, t); i.onload = t.step_func_done(_ => { - assert_throws("SecurityError", function () { return i.contentDocument; }); + assert_equals(i.contentDocument, null); i.remove(); }); @@ -25,7 +25,7 @@ assert_no_message_from(i, t); i.onload = t.step_func_done(_ => { - assert_throws("SecurityError", function () { return i.contentDocument; }); + assert_equals(i.contentDocument, null); i.remove(); });
diff --git a/third_party/WebKit/LayoutTests/external/wpt/x-frame-options/multiple.sub.html b/third_party/WebKit/LayoutTests/external/wpt/x-frame-options/multiple.sub.html index 6cf3d46..f7a28e4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/x-frame-options/multiple.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/x-frame-options/multiple.sub.html
@@ -24,7 +24,7 @@ assert_no_message_from(i, t); i.onload = t.step_func_done(_ => { - assert_throws("SecurityError", function () { return i.contentDocument; }); + assert_equals(i.contentDocument, null); i.remove(); }); @@ -38,7 +38,7 @@ assert_no_message_from(i, t); i.onload = t.step_func_done(_ => { - assert_throws("SecurityError", function () { return i.contentDocument; }); + assert_equals(i.contentDocument, null); i.remove(); }); @@ -52,7 +52,7 @@ assert_no_message_from(i, t); i.onload = t.step_func_done(_ => { - assert_throws("SecurityError", function () { return i.contentDocument; }); + assert_equals(i.contentDocument, null); i.remove(); }); @@ -66,7 +66,7 @@ assert_no_message_from(i, t); i.onload = t.step_func_done(_ => { - assert_throws("SecurityError", function () { return i.contentDocument; }); + assert_equals(i.contentDocument, null); i.remove(); }); @@ -80,7 +80,7 @@ assert_no_message_from(i, t); i.onload = t.step_func_done(_ => { - assert_throws("SecurityError", function () { return i.contentDocument; }); + assert_equals(i.contentDocument, null); i.remove(); });
diff --git a/third_party/WebKit/LayoutTests/external/wpt/x-frame-options/sameorigin.sub.html b/third_party/WebKit/LayoutTests/external/wpt/x-frame-options/sameorigin.sub.html index 9687426b..9efbc320 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/x-frame-options/sameorigin.sub.html +++ b/third_party/WebKit/LayoutTests/external/wpt/x-frame-options/sameorigin.sub.html
@@ -37,7 +37,7 @@ assert_no_message_from(i, t); i.onload = t.step_func_done(_ => { - assert_throws("SecurityError", function () { return i.contentDocument; }); + assert_equals(i.contentDocument, null); i.remove(); });
diff --git a/third_party/WebKit/LayoutTests/external/wpt_automation/fullscreen/auto-click.js b/third_party/WebKit/LayoutTests/external/wpt_automation/fullscreen/auto-click.js index 651f226..2cdc2ea 100644 --- a/third_party/WebKit/LayoutTests/external/wpt_automation/fullscreen/auto-click.js +++ b/third_party/WebKit/LayoutTests/external/wpt_automation/fullscreen/auto-click.js
@@ -30,7 +30,8 @@ if (node.localName == 'button') click(node); else if (node.localName == 'iframe') - observe(node.contentDocument); + if (node.contentDocument) + observe(node.contentDocument); } } }); @@ -44,17 +45,12 @@ click(button); } for (const iframe of document.getElementsByTagName('iframe')) { - try { + if (iframe.contentDocument) observe(iframe.contentDocument); - iframe.addEventListener('load', () => { + iframe.addEventListener('load', () => { + if (iframe.contentDocument) observe(iframe.contentDocument); - }); - } catch (e) { - // Skip cross-origin iframes, but report other errors - if (e.name != "SecurityError") { - throw e; - } - } + }); } // Observe future changes.
diff --git a/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-manyCandidates.html b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-manyCandidates.html new file mode 100644 index 0000000..5ae6407 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-manyCandidates.html
@@ -0,0 +1,44 @@ +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<html> +<head> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +</head> +<body> +<script> + +// Check that the number of ICE candidates that we can generate hasn't regressed +// At the moment (Nov 2017), the limit is approx +// - 3900 on Linux + +let peerConnections = []; + +function allocatePeerConnection(candidates) { + peerConnections.push(new RTCPeerConnection( + {iceCandidatePoolSize: candidates})); +} + +function cleanUpPeerConnections() { + // Close all peer connections so that they may be garbage collected. + peerConnections.forEach(pc => { + pc.close(); + }); + peerConnections = []; +} + +promise_test(function(t) { + return new Promise(function(resolve, reject) { + // We're aiming to create > 3000 candidates with minimum effort. + for (let i = 0; i < 13; i++) { + allocatePeerConnection(250); + } + t.step_timeout(function() { + cleanUpPeerConnections(); + resolve() + }, 2000); + }); +}, 'Create many PeerConnections with large pool sizes', {timeout: 60000}); + +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetch-click-event.https-expected.txt b/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetch-click-event.https-expected.txt deleted file mode 100644 index 6feba64..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetch-click-event.https-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -PASS Background Fetch API: BackgroundFetchClickEvent tests -FAIL Verifies that the BackgroundFetchClickEvent can be constructed. Test bug: need to pass exception to assert_throws() -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetch-event.https-expected.txt b/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetch-event.https-expected.txt deleted file mode 100644 index 9f47dfc..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetch-event.https-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -PASS Background Fetch API: BackgroundFetchEvent tests -FAIL Verifies that the BackgroundFetchEvent can be constructed. Test bug: need to pass exception to assert_throws() -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetch-fail-event.https-expected.txt b/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetch-fail-event.https-expected.txt deleted file mode 100644 index d8ed11e4..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetch-fail-event.https-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -PASS Background Fetch API: BackgroundFetchFailEvent tests -FAIL Verifies that the BackgroundFetchFailEvent can be constructed. Test bug: need to pass exception to assert_throws() -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetch-update-event.https.html b/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetch-update-event.https.html new file mode 100644 index 0000000..34a42c63 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetch-update-event.https.html
@@ -0,0 +1,17 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Background Fetch API: BackgroundFetchUpdateEvent tests</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/serviceworker/resources/test-helpers.js"></script> + +<h1>BackgroundFetchUpdateEvent</h1> +<p>This test validates that the BackgroundFetchUpdateEvent is exposed, and can be +constructed with an id and a sequence of settled responses.</p> + +<script> +'use strict'; + +// This test needs to be run in a Service Worker. +service_worker_test('resources/background-fetch-update-event-worker.js'); +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetched-event.https-expected.txt b/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetched-event.https-expected.txt deleted file mode 100644 index 15afd4c..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetched-event.https-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -PASS Background Fetch API: BackgroundFetchedEvent tests -FAIL Verifies that the BackgroundFetchedEvent can be constructed. Test bug: need to pass exception to assert_throws() -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetched-event.https.html b/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetched-event.https.html deleted file mode 100644 index 82cb092..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/background_fetch/background-fetched-event.https.html +++ /dev/null
@@ -1,20 +0,0 @@ -<!doctype html> -<meta charset="utf-8"> -<title>Background Fetch API: BackgroundFetchedEvent tests</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/serviceworker/resources/test-helpers.js"></script> - -<!-- TODO(peter): Upstream this test to WPT when the directory has been imported - and the name of the event has been settled on. --> - -<h1>BackgroundFetchedEvent</h1> -<p>This test validates that the BackgroundFetchedEvent is exposed, and can be -constructed with an id and a sequence of settled responses.</p> - -<script> -'use strict'; - -// This test needs to be run in a Service Worker. -service_worker_test('resources/background-fetched-event-worker.js'); -</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-click-event-worker.js b/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-click-event-worker.js index a5032d5..0e5380b8 100644 --- a/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-click-event-worker.js +++ b/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-click-event-worker.js
@@ -6,10 +6,10 @@ assert_own_property(self, 'BackgroundFetchClickEvent'); // The `id` and `state` are required in the BackgroundFetchClickEventInit. - assert_throws(null, () => new BackgroundFetchClickEvent('BackgroundFetchClickEvent')); - assert_throws(null, () => new BackgroundFetchClickEvent('BackgroundFetchClickEvent', {})); - assert_throws(null, () => new BackgroundFetchClickEvent('BackgroundFetchClickEvent', { id: 'foo' })); - assert_throws(null, () => new BackgroundFetchClickEvent('BackgroundFetchClickEvent', { id: 'foo', state: 'foo' })); + assert_throws({name: "TypeError"}, () => new BackgroundFetchClickEvent('BackgroundFetchClickEvent')); + assert_throws({name: "TypeError"}, () => new BackgroundFetchClickEvent('BackgroundFetchClickEvent', {})); + assert_throws({name: "TypeError"}, () => new BackgroundFetchClickEvent('BackgroundFetchClickEvent', { id: 'foo' })); + assert_throws({name: "TypeError"}, () => new BackgroundFetchClickEvent('BackgroundFetchClickEvent', { id: 'foo', state: 'foo' })); // The `state` must be one of { pending, succeeded, failed }. This should not throw. for (let state of ['pending', 'succeeded', 'failed'])
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-event-worker.js b/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-event-worker.js index 5a83f469..3dd792b 100644 --- a/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-event-worker.js +++ b/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-event-worker.js
@@ -6,8 +6,8 @@ assert_own_property(self, 'BackgroundFetchEvent'); // The `id` is required in the BackgroundFetchEventInit. - assert_throws(null, () => new BackgroundFetchEvent('BackgroundFetchEvent')); - assert_throws(null, () => new BackgroundFetchEvent('BackgroundFetchEvent', {})); + assert_throws({name: "TypeError"}, () => new BackgroundFetchEvent('BackgroundFetchEvent')); + assert_throws({name: "TypeError"}, () => new BackgroundFetchEvent('BackgroundFetchEvent', {})); const event = new BackgroundFetchEvent('BackgroundFetchEvent', { id: 'my-id'
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-fail-event-worker.js b/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-fail-event-worker.js index 069731d..06e8312 100644 --- a/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-fail-event-worker.js +++ b/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-fail-event-worker.js
@@ -8,10 +8,10 @@ // The `id` and `fetches` are required options in the // BackgroundFetchFailEventInit. The latter must be a sequence of // BackgroundFetchSettledFetch instances. - assert_throws(null, () => new BackgroundFetchFailEvent('BackgroundFetchFailEvent')); - assert_throws(null, () => new BackgroundFetchFailEvent('BackgroundFetchFailEvent', {})); - assert_throws(null, () => new BackgroundFetchFailEvent('BackgroundFetchFailEvent', { id: 'foo' })); - assert_throws(null, () => new BackgroundFetchFailEvent('BackgroundFetchFailEvent', { id: 'foo', fetches: 'bar' })); + assert_throws({name: "TypeError"}, () => new BackgroundFetchFailEvent('BackgroundFetchFailEvent')); + assert_throws({name: "TypeError"}, () => new BackgroundFetchFailEvent('BackgroundFetchFailEvent', {})); + assert_throws({name: "TypeError"}, () => new BackgroundFetchFailEvent('BackgroundFetchFailEvent', { id: 'foo' })); + assert_throws({name: "TypeError"}, () => new BackgroundFetchFailEvent('BackgroundFetchFailEvent', { id: 'foo', fetches: 'bar' })); const fetches = [ new BackgroundFetchSettledFetch(new Request('non-existing-image.png'), new Response()),
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-update-event-worker.js b/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-update-event-worker.js new file mode 100644 index 0000000..bc16c3d --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetch-update-event-worker.js
@@ -0,0 +1,18 @@ +'use strict'; + +importScripts('/resources/testharness.js'); + +promise_test(async function() { + assert_own_property(self, 'BackgroundFetchUpdateEvent'); + + // The `id` and `fetches` are required options in the + // BackgroundFetchUpdateEventInit. The latter must be an instance of + // BackgroundFetchSettledFetches. + assert_throws({name: "TypeError"}, () => new BackgroundFetchUpdateEvent('BackgroundFetchUpdateEvent')); + assert_throws({name: "TypeError"}, () => new BackgroundFetchUpdateEvent('BackgroundFetchUpdateEvent', {})); + assert_throws({name: "TypeError"}, () => new BackgroundFetchUpdateEvent('BackgroundFetchUpdateEvent', { id: 'foo' })); + + // TODO(rayankans): Add actual construction test to BackgroundFetchUpdateEvent after + // https://github.com/WICG/background-fetch/issues/64 is resolved. + +}, 'Verifies that the BackgroundFetchUpdateEvent can be constructed.');
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetched-event-worker.js b/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetched-event-worker.js deleted file mode 100644 index 03c2165..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/background_fetch/resources/background-fetched-event-worker.js +++ /dev/null
@@ -1,37 +0,0 @@ -'use strict'; - -importScripts('/resources/testharness.js'); - -test(function() { - assert_own_property(self, 'BackgroundFetchedEvent'); - - // The `id` and `fetches` are required options in the - // BackgroundFetchedEventInit. The latter must be a sequence of - // BackgroundFetchSettledFetch instances. - assert_throws(null, () => new BackgroundFetchedEvent('BackgroundFetchedEvent')); - assert_throws(null, () => new BackgroundFetchedEvent('BackgroundFetchedEvent', {})); - assert_throws(null, () => new BackgroundFetchedEvent('BackgroundFetchedEvent', { id: 'foo' })); - assert_throws(null, () => new BackgroundFetchedEvent('BackgroundFetchedEvent', { id: 'foo', fetches: 'bar' })); - - const fetches = [ - new BackgroundFetchSettledFetch(new Request('non-existing-image.png'), new Response()), - new BackgroundFetchSettledFetch(new Request('non-existing-image-2.png'), new Response()) - ]; - - const event = new BackgroundFetchedEvent('BackgroundFetchedEvent', { - id: 'my-id', - fetches - }); - - assert_equals(event.type, 'BackgroundFetchedEvent'); - assert_equals(event.cancelable, false); - assert_equals(event.bubbles, false); - assert_equals(event.id, 'my-id'); - - assert_true(Array.isArray(event.fetches)); - assert_array_equals(event.fetches, fetches); - - assert_inherits(event, 'updateUI'); - assert_inherits(event, 'waitUntil'); - -}, 'Verifies that the BackgroundFetchedEvent can be constructed.');
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/emulation/emulation-oopifs-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/emulation/emulation-oopifs-expected.txt new file mode 100644 index 0000000..56c8f05 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/emulation/emulation-oopifs-expected.txt
@@ -0,0 +1,15 @@ +Tests emulation with OOPIFs. +Enabling auto-attach +Navigating to page with OOPIF +Emulating device +{ + id : <number> + result : { + } +} +screen.width: +1402 +Reloading +screen.width: +1402 +
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/emulation/emulation-oopifs.js b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/emulation/emulation-oopifs.js new file mode 100644 index 0000000..726ddbf --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/emulation/emulation-oopifs.js
@@ -0,0 +1,26 @@ +(async function(testRunner) { + var {page, session, dp} = await testRunner.startBlank('Tests emulation with OOPIFs.'); + + testRunner.log('Enabling auto-attach'); + await dp.Target.setAutoAttach({autoAttach: true, waitForDebuggerOnStart: false}); + + testRunner.log('Navigating to page with OOPIF'); + await dp.Page.enable(); + dp.Page.navigate({url: testRunner.url('../resources/site_per_process_main.html')}); + await dp.Page.onceLoadEventFired(); + + testRunner.log('Emulating device'); + testRunner.log(await dp.Emulation.setDeviceMetricsOverride({width: 1201, height: 801, deviceScaleFactor: 2, mobile: true, screenWidth: 1402, screenHeight: 1401})); + + testRunner.log('screen.width:'); + testRunner.log(await session.evaluate(`screen.width`)); + + testRunner.log('Reloading'); + dp.Page.reload(); + await dp.Page.onceLoadEventFired(); + + testRunner.log('screen.width:'); + testRunner.log(await session.evaluate(`screen.width`)); + + testRunner.completeTest(); +})
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/sandbox-in-http-header-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/sandbox-in-http-header-expected.txt deleted file mode 100644 index a43134b36..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/sandbox-in-http-header-expected.txt +++ /dev/null
@@ -1,3 +0,0 @@ -CONSOLE ERROR: Blocked script execution in 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/sandbox.php?sandbox=allow-top-navigation' because the document's frame is sandboxed and the 'allow-scripts' permission is not set. -ALERT: PASS: Iframe was in a unique origin -
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/sandbox-in-http-header.html b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/sandbox-in-http-header.html index bb2d0924..2ab2362 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/sandbox-in-http-header.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/sandbox-in-http-header.html
@@ -1,16 +1,11 @@ <!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> <iframe src="resources/sandbox.php?sandbox=allow-top-navigation"></iframe> <script> -if (window.testRunner) - testRunner.dumpAsText(); - -window.onload = function() { - var frame = document.getElementsByTagName("iframe")[0]; - try { - frame.contentDocument; - alert("FAIL: Iframe was not in a unique origin"); - } catch (e) { - alert("PASS: Iframe was in a unique origin"); - } +window.onload = () => { + test(() => { + assert_equals(document.getElementsByTagName("iframe")[0].contentDocument, null); + }, "contentDocument should return null for sandboxed iframe"); }; </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-iframe-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-iframe-expected.txt deleted file mode 100644 index 2356c3f..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-iframe-expected.txt +++ /dev/null
@@ -1,3 +0,0 @@ -CONSOLE MESSAGE: line 14: PASS: SVGDocument access threw: 'SecurityError: Failed to execute 'getSVGDocument' on 'HTMLIFrameElement': Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame.'. - -
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-iframe.html b/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-iframe.html index 5d798a98..1bc99c9 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-iframe.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-iframe.html
@@ -1,26 +1,18 @@ <!DOCTYPE html> <html> <head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> <script> -if (window.testRunner) { - testRunner.dumpAsText(); - testRunner.waitUntilDone(); -} function runTest() { - try { - var svgDoc = document.getElementById("svgobject").getSVGDocument(); - console.log("FAIL: got SVGDocument: " + svgDoc); - } catch (e) { - console.log("PASS: SVGDocument access threw: '" + e.toString() + "'."); - } - if (window.testRunner) - testRunner.notifyDone(); + test(() => { + assert_equals(document.getElementById("svgobject").getSVGDocument(), null); + }, "getSVGDocument() returns null for cross-origin documents"); } </script> </head> <body onload="runTest()"> <iframe id="svgobject" src="http://localhost:8080/security/resources/empty-svg.php" width="400" height="300"></iframe> -<div id="output"></div> </body> </html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-object-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-object-expected.txt deleted file mode 100644 index d6561f1..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-object-expected.txt +++ /dev/null
@@ -1,3 +0,0 @@ -CONSOLE MESSAGE: line 14: PASS: SVGDocument access threw: 'SecurityError: Failed to execute 'getSVGDocument' on 'HTMLObjectElement': Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame.'. - -
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-object.html b/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-object.html index b88e276..6fdf4af 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-object.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-getSVGDocument-object.html
@@ -1,20 +1,13 @@ <!DOCTYPE html> <html> <head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> <script> -if (window.testRunner) { - testRunner.dumpAsText(); - testRunner.waitUntilDone(); -} function runTest() { - try { - var svgDoc = document.getElementById("svgobject").getSVGDocument(); - console.log("FAIL: got SVGDocument: " + svgDoc); - } catch (e) { - console.log("PASS: SVGDocument access threw: '" + e.toString() + "'."); - } - if (window.testRunner) - testRunner.notifyDone(); + test(() => { + assert_equals(document.getElementById("svgobject").getSVGDocument(), null); + }, "getSVGDocument() returns null for cross-origin documents"); } </script> </head> @@ -22,6 +15,5 @@ <object onload="runTest()" id="svgobject" data="http://localhost:8080/security/resources/empty-svg.php" type="image/svg+xml" width="400" height="300"></object> -<div id="output"></div> </body> </html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-location-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-location-expected.txt index 6cad4ac..4ae3352 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-location-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-location-expected.txt
@@ -1,5 +1,5 @@ CONSOLE ERROR: line 8: The XSS Auditor blocked access to 'http://localhost:8000/security/xssAuditor/resources/echo-intertag.pl?enable-full-block=1&q=%3Cscript%3Ealert(String.fromCharCode(0x58,0x53,0x53));%3C/script%3E' because the source code of a script was found within the request. The server sent an 'X-XSS-Protection' header requesting this behavior. -PASS xssed.contentDocument threw exception SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame.. +PASS xssed.contentDocument is null PASS xssed.contentWindow.location.href threw exception SecurityError: Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame.. PASS successfullyParsed is true
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-location.html b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-location.html index d0c8df3a..d5d5565 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-location.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-location.html
@@ -9,7 +9,7 @@ window.jsTestIsAsync = true; function checkFrames() { - shouldThrow('xssed.contentDocument'); + shouldBeNull('xssed.contentDocument'); shouldThrow('xssed.contentWindow.location.href'); finishJSTest(); }
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-referrer-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-referrer-expected.txt index 69e00cc2..0b3ed8b 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-referrer-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-referrer-expected.txt
@@ -1,5 +1,5 @@ CONSOLE ERROR: line 4: The XSS Auditor blocked access to 'http://localhost:8000/security/xssAuditor/resources/echo-intertag.pl?enable-full-block=1&q=%3Cscript%3Ealert(String.fromCharCode(0x58,0x53,0x53))%3C/script%3E' because the source code of a script was found within the request. The server sent an 'X-XSS-Protection' header requesting this behavior. -PASS frame.contentDocument threw exception SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame.. +PASS frame.contentDocument is null PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-referrer.html b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-referrer.html index 2892756..5f59da75 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-referrer.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/block-does-not-leak-referrer.html
@@ -9,7 +9,7 @@ function checkReferer() { window.frame = document.querySelector('iframe'); - shouldThrow('frame.contentDocument'); + shouldBeNull('frame.contentDocument'); finishJSTest(); }
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/full-block-script-tag-cross-domain-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/full-block-script-tag-cross-domain-expected.txt index 6b0a89e..3f57932 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/full-block-script-tag-cross-domain-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/full-block-script-tag-cross-domain-expected.txt
@@ -1,5 +1,5 @@ CONSOLE ERROR: line 4: The XSS Auditor blocked access to 'http://localhost:8000/security/xssAuditor/resources/echo-intertag.pl?enable-full-block=1&q=%3Cscript%3Ealert(String.fromCharCode(0x58,0x53,0x53))%3C/script%3E' because the source code of a script was found within the request. The server sent an 'X-XSS-Protection' header requesting this behavior. -CONSOLE MESSAGE: line 19: PASS: Cross-origin access threw: 'SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame.'. +CONSOLE MESSAGE: line 19: PASS: Cross-origin access threw: 'TypeError: Cannot read property 'referrer' of null'. ALERT: URL mismatch: '[Location object access threw exception]' vs. 'http://localhost:8000/security/xssAuditor/resources/echo-intertag.pl?enable-full-block=1&q=%3Cscript%3Ealert(String.fromCharCode(0x58,0x53,0x53))%3C/script%3E' The loading of iframe below should be blocked:
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/full-block-script-tag-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/full-block-script-tag-expected.txt index a60d4ae..bca5cb15 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/full-block-script-tag-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/xssAuditor/full-block-script-tag-expected.txt
@@ -1,5 +1,5 @@ CONSOLE ERROR: line 4: The XSS Auditor blocked access to 'http://127.0.0.1:8000/security/xssAuditor/resources/echo-intertag.pl?enable-full-block=1&q=%3Cscript%3Ealert(String.fromCharCode(0x58,0x53,0x53))%3C/script%3E' because the source code of a script was found within the request. The server sent an 'X-XSS-Protection' header requesting this behavior. -CONSOLE MESSAGE: line 19: FAIL: same-origin access threw: 'SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "http://127.0.0.1:8000" from accessing a cross-origin frame.'. +CONSOLE MESSAGE: line 19: FAIL: same-origin access threw: 'TypeError: Cannot read property 'referrer' of null'. ALERT: URL mismatch: '[Location object access threw exception]' vs. 'http://127.0.0.1:8000/security/xssAuditor/resources/echo-intertag.pl?enable-full-block=1&q=%3Cscript%3Ealert(String.fromCharCode(0x58,0x53,0x53))%3C/script%3E' The loading of iframe below should be blocked:
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/subpixel-shadow-move-expected.html b/third_party/WebKit/LayoutTests/paint/invalidation/subpixel-shadow-move-expected.html deleted file mode 100644 index ec0b9a2d..0000000 --- a/third_party/WebKit/LayoutTests/paint/invalidation/subpixel-shadow-move-expected.html +++ /dev/null
@@ -1,4 +0,0 @@ -<!DOCTYPE html> -Passes if there is no residue when the black bar moving up. -<div id="target" - style="position: relative; top: 40px; width: 100px; height: 100px; box-shadow: 0 8.2px 0 0 black"></div>
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/subpixel-shadow-move.html b/third_party/WebKit/LayoutTests/paint/invalidation/subpixel-shadow-move.html deleted file mode 100644 index fbed0aa..0000000 --- a/third_party/WebKit/LayoutTests/paint/invalidation/subpixel-shadow-move.html +++ /dev/null
@@ -1,22 +0,0 @@ -<!DOCTYPE html> -Passes if there is no residue when the black bar moving up. -<div id="target" - style="position: relative; top: 50px; width: 100px; height: 100px; box-shadow: 0 8.2px 0 0 black"></div> -<script src="../../resources/run-after-layout-and-paint.js"></script> -<script> -if (window.testRunner) - testRunner.waitUntilDone(); - -var target_top = 50; -function test() { - target_top -= 0.25; - console.log(target_top); - target.style.top = target_top + 'px'; - if (window.testRunner && target_top <= 40) { - testRunner.notifyDone(); - } else { - runAfterLayoutAndPaint(test); - } -} -onload = test; -</script>
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/README.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/README.txt new file mode 100644 index 0000000..4136332 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/README.txt
@@ -0,0 +1,2 @@ +# This suite runs external/wpt/webrtc/ with +# --enable-features=RTCUnifiedPlanByDefault.
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCCertificate-expected.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCCertificate-expected.txt new file mode 100644 index 0000000..c8ecab84 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCCertificate-expected.txt
@@ -0,0 +1,8 @@ +This is a testharness.js-based test. +PASS Constructing RTCPeerConnection with expired certificate should reject with InvalidAccessError +FAIL Calling setConfiguration with different set of certs should reject with InvalidModificationError promise_test: Unhandled rejection with value: object "InvalidModificationError: Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way." +PASS RTCCertificate should have at least one fingerprint +PASS RTCPeerConnection({ certificates }) should generate offer SDP with fingerprint of provided certificate +FAIL RTCPeerConnection({ certificates }) should generate offer SDP with fingerprint of all provided certificates assert_true: Expect fingerprint line to be found in SDP expected true got false +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCConfiguration-bundlePolicy-expected.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCConfiguration-bundlePolicy-expected.txt new file mode 100644 index 0000000..2a3298f --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCConfiguration-bundlePolicy-expected.txt
@@ -0,0 +1,18 @@ +This is a testharness.js-based test. +FAIL Default bundlePolicy should be balanced pc.getConfiguration is not a function +FAIL new RTCPeerConnection({ bundlePolicy: undefined }) should have bundlePolicy balanced pc.getConfiguration is not a function +FAIL new RTCPeerConnection({ bundlePolicy: 'balanced' }) should succeed pc.getConfiguration is not a function +FAIL new RTCPeerConnection({ bundlePolicy: 'max-compat' }) should succeed pc.getConfiguration is not a function +FAIL new RTCPeerConnection({ bundlePolicy: 'max-bundle' }) should succeed pc.getConfiguration is not a function +FAIL setConfiguration({}) with initial default bundlePolicy balanced should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL setConfiguration({}) with initial bundlePolicy balanced should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL setConfiguration({ bundlePolicy: balanced }) with initial default bundlePolicy balanced should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL setConfiguration({ bundlePolicy: 'balanced' }) with initial bundlePolicy balanced should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL setConfiguration({ bundlePolicy: 'max-compat' }) with initial bundlePolicy max-compat should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL setConfiguration({ bundlePolicy: 'max-bundle' }) with initial bundlePolicy max-bundle should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +PASS new RTCPeerConnection({ bundlePolicy: null }) should throw TypeError +PASS new RTCPeerConnection({ bundlePolicy: 'invalid' }) should throw TypeError +PASS setConfiguration({ bundlePolicy: 'max-compat' }) with initial bundlePolicy max-bundle should throw InvalidModificationError +PASS setConfiguration({}) with initial bundlePolicy max-bundle should throw InvalidModificationError +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCConfiguration-iceServers-expected.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCConfiguration-iceServers-expected.txt new file mode 100644 index 0000000..4152050 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCConfiguration-iceServers-expected.txt
@@ -0,0 +1,145 @@ +This is a testharness.js-based test. +Found 77 tests; 24 PASS, 53 FAIL, 0 TIMEOUT, 0 NOTRUN. +FAIL new RTCPeerConnection() should have default configuration.iceServers of undefined pc.getConfiguration is not a function +PASS new RTCPeerConnection(config) - { iceServers: null } should throw TypeError +PASS setConfiguration(config) - { iceServers: null } should throw TypeError +FAIL new RTCPeerConnection(config) - { iceServers: undefined } should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - { iceServers: undefined } should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - { iceServers: [] } should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - { iceServers: [] } should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +PASS new RTCPeerConnection(config) - { iceServers: [null] } should throw TypeError +PASS setConfiguration(config) - { iceServers: [null] } should throw TypeError +PASS new RTCPeerConnection(config) - { iceServers: [undefined] } should throw TypeError +PASS setConfiguration(config) - { iceServers: [undefined] } should throw TypeError +PASS new RTCPeerConnection(config) - { iceServers: [{}] } should throw TypeError +PASS setConfiguration(config) - { iceServers: [{}] } should throw TypeError +FAIL new RTCPeerConnection(config) - with empty list urls should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with empty list urls should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with stun server should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with stun server should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with stun server array should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with stun server array should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with 2 stun servers should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with 2 stun servers should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with turn server, username, credential should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with turn server, username, credential should succeed pc.getConfiguration is not a function +FAIL new RTCPeerConnection(config) - with turns server and empty string username, credential should succeed Failed to construct 'RTCPeerConnection': Failed to initialize native PeerConnection. +FAIL setConfiguration(config) - with turns server and empty string username, credential should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with turn server and empty string username, credential should succeed Failed to construct 'RTCPeerConnection': Failed to initialize native PeerConnection. +FAIL setConfiguration(config) - with turn server and empty string username, credential should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with one turns server, one turn server, username, credential should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with one turns server, one turn server, username, credential should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with stun server and credentialType password should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with stun server and credentialType password should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +PASS new RTCPeerConnection(config) - with turn server and no credentials should throw InvalidAccessError +PASS setConfiguration(config) - with turn server and no credentials should throw InvalidAccessError +PASS new RTCPeerConnection(config) - with turn server and only username should throw InvalidAccessError +PASS setConfiguration(config) - with turn server and only username should throw InvalidAccessError +PASS new RTCPeerConnection(config) - with turn server and only credential should throw InvalidAccessError +PASS setConfiguration(config) - with turn server and only credential should throw InvalidAccessError +PASS new RTCPeerConnection(config) - with turns server and no credentials should throw InvalidAccessError +PASS setConfiguration(config) - with turns server and no credentials should throw InvalidAccessError +PASS new RTCPeerConnection(config) - with turns server and only username should throw InvalidAccessError +PASS setConfiguration(config) - with turns server and only username should throw InvalidAccessError +PASS new RTCPeerConnection(config) - with turns server and only credential should throw InvalidAccessError +PASS setConfiguration(config) - with turns server and only credential should throw InvalidAccessError +PASS new RTCPeerConnection(config) - with relative url should throw SyntaxError +PASS setConfiguration(config) - with relative url should throw SyntaxError +PASS new RTCPeerConnection(config) - with http url should throw SyntaxError +PASS setConfiguration(config) - with http url should throw SyntaxError +FAIL new RTCPeerConnection(config) - with invalid turn url should throw SyntaxError assert_throws: function "() => + makePc({ iceServers: [{ + urls: 'turn://example.org/foo?x=y' + }] })" threw object "InvalidAccessError: Failed to construct 'RTCPeerConnection': Both username and credential are required when the URL scheme is "turn" or "turns"." that is not a DOMException SyntaxError: property "code" is equal to 15, expected 12 +FAIL setConfiguration(config) - with invalid turn url should throw SyntaxError assert_throws: function "() => + makePc({ iceServers: [{ + urls: 'turn://example.org/foo?x=y' + }] })" threw object "InvalidAccessError: Failed to execute 'setConfiguration' on 'RTCPeerConnection': Both username and credential are required when the URL scheme is "turn" or "turns"." that is not a DOMException SyntaxError: property "code" is equal to 15, expected 12 +FAIL new RTCPeerConnection(config) - with invalid stun url should throw SyntaxError assert_throws: function "() => + makePc({ iceServers: [{ + urls: 'stun://example.org/foo?x=y' + }] })" threw object "NotSupportedError: Failed to construct 'RTCPeerConnection': Failed to initialize native PeerConnection." that is not a DOMException SyntaxError: property "code" is equal to 9, expected 12 +FAIL setConfiguration(config) - with invalid stun url should throw SyntaxError assert_throws: function "() => + makePc({ iceServers: [{ + urls: 'stun://example.org/foo?x=y' + }] })" threw object "InvalidModificationError: Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way." that is not a DOMException SyntaxError: property "code" is equal to 13, expected 12 +FAIL new RTCPeerConnection(config) - with empty urls and credentialType password should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with empty urls and credentialType password should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with empty urls and credentialType oauth should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with empty urls and credentialType oauth should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with invalid credentialType should throw TypeError assert_throws: function "() => + makePc({ iceServers: [{ + urls: [], + credentialType: 'invalid' + }] })" did not throw +FAIL setConfiguration(config) - with invalid credentialType should throw TypeError assert_throws: function "() => + makePc({ iceServers: [{ + urls: [], + credentialType: 'invalid' + }] })" threw object "InvalidModificationError: Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way." ("InvalidModificationError") expected object "TypeError" ("TypeError") +FAIL new RTCPeerConnection(config) - with credentialType token should throw TypeError assert_throws: function "() => + makePc({ iceServers: [{ + urls: [], + credentialType: 'token' + }] })" did not throw +FAIL setConfiguration(config) - with credentialType token should throw TypeError assert_throws: function "() => + makePc({ iceServers: [{ + urls: [], + credentialType: 'token' + }] })" threw object "InvalidModificationError: Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way." ("InvalidModificationError") expected object "TypeError" ("TypeError") +FAIL new RTCPeerConnection(config) - with url field should throw TypeError assert_throws: function "() => + makePc({ iceServers: [{ + url: 'stun:stun1.example.net' + }] })" did not throw +FAIL setConfiguration(config) - with url field should throw TypeError assert_throws: function "() => + makePc({ iceServers: [{ + url: 'stun:stun1.example.net' + }] })" threw object "InvalidModificationError: Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way." ("InvalidModificationError") expected object "TypeError" ("TypeError") +FAIL new RTCPeerConnection(config) - with turns server, credentialType password, and RTCOauthCredential credential should throw InvalidAccessError assert_throws: function "() => + makePc({ iceServers: [{ + urls: 'turns:turn.example.org', + credentialType: 'password', + username: 'user', + credential: { + macKey: '', + accessToken: '' + } + }] })" did not throw +FAIL setConfiguration(config) - with turns server, credentialType password, and RTCOauthCredential credential should throw InvalidAccessError assert_throws: function "() => + makePc({ iceServers: [{ + urls: 'turns:turn.example.org', + credentialType: 'password', + username: 'user', + credential: { + macKey: '', + accessToken: '' + } + }] })" threw object "InvalidModificationError: Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way." that is not a DOMException InvalidAccessError: property "code" is equal to 13, expected 15 +FAIL new RTCPeerConnection(config) - with turns server, credentialType oauth, and string credential should throw InvalidAccessError assert_throws: function "() => + makePc({ iceServers: [{ + urls: 'turns:turn.example.org', + credentialType: 'oauth', + username: 'user', + credential: 'cred' + }] })" did not throw +FAIL setConfiguration(config) - with turns server, credentialType oauth, and string credential should throw InvalidAccessError assert_throws: function "() => + makePc({ iceServers: [{ + urls: 'turns:turn.example.org', + credentialType: 'oauth', + username: 'user', + credential: 'cred' + }] })" threw object "InvalidModificationError: Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way." that is not a DOMException InvalidAccessError: property "code" is equal to 13, expected 15 +FAIL new RTCPeerConnection(config) - with turns server, credentialType oauth and RTCOAuthCredential credential should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with turns server, credentialType oauth and RTCOAuthCredential credential should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with both turns and stun server, credentialType oauth and RTCOAuthCredential credential should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with both turns and stun server, credentialType oauth and RTCOAuthCredential credential should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with stun server, credentialType oauth, and string credential should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with stun server, credentialType oauth, and string credential should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with stun server, credentialType password, and RTCOAuthCredential credential should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with stun server, credentialType password, and RTCOAuthCredential credential should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with empty urls list, credentialType oauth, and string credential should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with empty urls list, credentialType oauth, and string credential should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +FAIL new RTCPeerConnection(config) - with empty urls list, credentialType password, and RTCOAuthCredential credential should succeed pc.getConfiguration is not a function +FAIL setConfiguration(config) - with empty urls list, credentialType password, and RTCOAuthCredential credential should succeed Failed to execute 'setConfiguration' on 'RTCPeerConnection': Attempted to modify the PeerConnection's configuration in an unsupported way. +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-addTrack.https-expected.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-addTrack.https-expected.txt new file mode 100644 index 0000000..30183d1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-addTrack.https-expected.txt
@@ -0,0 +1,11 @@ +This is a testharness.js-based test. +PASS addTrack when pc is closed should throw InvalidStateError +FAIL addTrack with single track argument and no mediaStream should succeed promise_test: Unhandled rejection with value: object "TypeError: pc.getTransceivers is not a function" +PASS addTrack with single track argument and single mediaStream should succeed +PASS addTrack with single track argument and multiple mediaStreams should succeed +PASS Adding the same track multiple times should throw InvalidAccessError +FAIL addTrack with existing sender with null track, same kind, and recvonly direction should reuse sender pc.addTransceiver is not a function +FAIL addTrack with existing sender with null track, same kind, and sendrecv direction should create new sender pc.addTransceiver is not a function +FAIL addTrack with existing sender with null track, different kind, and recvonly direction should create new sender pc.addTransceiver is not a function +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-createOffer-expected.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-createOffer-expected.txt new file mode 100644 index 0000000..1102e99 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-createOffer-expected.txt
@@ -0,0 +1,11 @@ +This is a testharness.js-based test. +FAIL createOffer() with no argument from newly created RTCPeerConnection should succeed assert_false: Expect offer to not be instance of RTCSessionDescription expected false got true +FAIL createOffer() and then setLocalDescription() should succeed assert_not_equals: Expect session description to be defined got disallowed value undefined +PASS createOffer() after connection is closed should reject with InvalidStateError +FAIL When media stream is added when createOffer() is running in parallel, the result offer should contain the new media stream pc.addTransceiver is not a function +PASS createOffer() with offerToReceiveAudio should add audio line to all subsequent created offers +PASS createOffer() with offerToReceiveVideo should add video line to all subsequent created offers +PASS createOffer() with offerToReceiveAudio:true then offerToReceiveVideo:true should have result offer with both audio and video line +PASS Test onsignalingstatechange event for createOffer() and then setLocalDescription() should succeed +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-ontrack.https-expected.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-ontrack.https-expected.txt new file mode 100644 index 0000000..866ef108 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-ontrack.https-expected.txt
@@ -0,0 +1,8 @@ +This is a testharness.js-based test. +FAIL setRemoteDescription should trigger ontrack event when the MSID of the stream is is parsed. RTCRtpTransceiver is not defined +FAIL setRemoteDescription() with m= line of recvonly direction should not trigger track event assert_unreached: ontrack event should not fire for track with recvonly direction Reached unreachable code +FAIL addTrack() should cause remote connection to fire ontrack when setRemoteDescription() RTCRtpTransceiver is not defined +FAIL addTransceiver('video') should cause remote connection to fire ontrack when setRemoteDescription() pc1.addTransceiver is not a function +FAIL addTransceiver() with inactive direction should not cause remote connection to fire ontrack when setRemoteDescription() pc1.addTransceiver is not a function +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-setLocalDescription-answer-expected.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-setLocalDescription-answer-expected.txt new file mode 100644 index 0000000..2eafafd --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-setLocalDescription-answer-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +FAIL setLocalDescription() with valid answer should succeed assert_not_equals: Expect session description to be defined got disallowed value undefined +FAIL setLocalDescription() with type answer and null sdp should use lastAnswer generated from createAnswer assert_not_equals: Expect session description to be defined got disallowed value undefined +PASS setLocalDescription() with answer not created by own createAnswer() should reject with InvalidModificationError +FAIL Calling setLocalDescription(answer) from stable state should reject with InvalidStateError assert_throws: function "function() { throw e }" threw object "OperationError: Failed to set local answer sdp: Called in wrong state: kStable" that is not a DOMException InvalidStateError: property "code" is equal to 0, expected 11 +FAIL Calling setLocalDescription(answer) from have-local-offer state should reject with InvalidStateError assert_throws: function "function() { throw e }" threw object "OperationError: Failed to set local answer sdp: Called in wrong state: kHaveLocalOffer" that is not a DOMException InvalidStateError: property "code" is equal to 0, expected 11 +PASS Test onsignalingstatechange event for setLocalDescription() with valid answer should succeed +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https-expected.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https-expected.txt new file mode 100644 index 0000000..0bf5d96 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +PASS replaceTrack() sets the track attribute to a new track. +PASS replaceTrack() sets the track attribute to null. +PASS replaceTrack() does not set the track synchronously. +PASS replaceTrack() rejects when the peer connection is closed. +FAIL replaceTrack() rejects when invoked after removeTrack(). assert_unreached: Expected replaceTrack() to be rejected with InvalidModificationError but the promise was resolved. Reached unreachable code +FAIL replaceTrack() rejects after a subsequent removeTrack(). assert_unreached: Expected replaceTrack() to be rejected with InvalidModificationError but the promise was resolved. Reached unreachable code +Harness: the test ran to completion. +
diff --git a/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom b/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom index b5ad4ea..ce5c476 100644 --- a/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom +++ b/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom
@@ -29,6 +29,7 @@ INVALID_DOMAIN, INVALID_STATE, NOT_IMPLEMENTED, + NOT_FOCUSED, UNKNOWN };
diff --git a/third_party/blink/public/platform/modules/webauth/authenticator.mojom b/third_party/blink/public/platform/modules/webauth/authenticator.mojom index 23733907..79e850f 100644 --- a/third_party/blink/public/platform/modules/webauth/authenticator.mojom +++ b/third_party/blink/public/platform/modules/webauth/authenticator.mojom
@@ -20,6 +20,7 @@ INVALID_DOMAIN, INVALID_STATE, NOT_IMPLEMENTED, + NOT_FOCUSED, UNKNOWN_ERROR, };
diff --git a/third_party/blink/public/platform/task_type.h b/third_party/blink/public/platform/task_type.h index f829c80..08f6050 100644 --- a/third_party/blink/public/platform/task_type.h +++ b/third_party/blink/public/platform/task_type.h
@@ -170,7 +170,10 @@ // Tasks related to the inspector. kInternalInspector = 33, - kCount = 34, + // Tasks related to animation like blinking caret or CSS animation. + kInternalAnimation = 34, + + kCount = 35, }; } // namespace blink
diff --git a/third_party/blink/public/platform/web_feature.mojom b/third_party/blink/public/platform/web_feature.mojom index 01a4832..c7a2b83b 100644 --- a/third_party/blink/public/platform/web_feature.mojom +++ b/third_party/blink/public/platform/web_feature.mojom
@@ -1907,6 +1907,7 @@ kXRRequestSession = 2415, kXRSupportsSession = 2416, kXRSessionGetInputSources = 2417, + kCSSResizeAuto = 2418, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/platform/web_scoped_virtual_time_pauser.h b/third_party/blink/public/platform/web_scoped_virtual_time_pauser.h index 056c804b..9649ff8f 100644 --- a/third_party/blink/public/platform/web_scoped_virtual_time_pauser.h +++ b/third_party/blink/public/platform/web_scoped_virtual_time_pauser.h
@@ -11,7 +11,7 @@ namespace blink { namespace scheduler { -class RendererSchedulerImpl; +class MainThreadSchedulerImpl; } // namespace scheduler // A move only RAII style helper which makes it easier for subsystems to pause @@ -25,7 +25,7 @@ // Note simply creating a WebScopedVirtualTimePauser doesn't cause VirtualTime // to pause, instead you need to call PauseVirtualTime. - WebScopedVirtualTimePauser(scheduler::RendererSchedulerImpl*, + WebScopedVirtualTimePauser(scheduler::MainThreadSchedulerImpl*, VirtualTaskDuration, const WebString& debug_name); @@ -51,7 +51,7 @@ base::TimeTicks virtual_time_when_paused_; bool paused_ = false; VirtualTaskDuration duration_ = VirtualTaskDuration::kInstant; - scheduler::RendererSchedulerImpl* scheduler_; // NOT OWNED + scheduler::MainThreadSchedulerImpl* scheduler_; // NOT OWNED WebString debug_name_; int trace_id_;
diff --git a/third_party/blink/public/web/web_shared_worker_client.h b/third_party/blink/public/web/web_shared_worker_client.h index e90300f2..1a6f49d 100644 --- a/third_party/blink/public/web/web_shared_worker_client.h +++ b/third_party/blink/public/web/web_shared_worker_client.h
@@ -82,6 +82,15 @@ // WebServiceWorkerNetworkProvider. virtual std::unique_ptr<WebWorkerFetchContext> CreateWorkerFetchContext( WebServiceWorkerNetworkProvider*) = 0; + + // Called on the main thread during initialization. The browser process is + // expected to send a SetController IPC before sending the script response if + // appropriate, but there is no ordering guarantee of the messages on the + // renderer. This waits for the SetController IPC to be received if it was + // sent. + virtual void WaitForServiceWorkerControllerInfo( + blink::WebServiceWorkerNetworkProvider* web_network_provider, + base::OnceClosure callback) = 0; }; } // namespace blink
diff --git a/third_party/blink/renderer/bindings/templates/attributes.cpp.tmpl b/third_party/blink/renderer/bindings/templates/attributes.cpp.tmpl index 41cd777..129fbf9 100644 --- a/third_party/blink/renderer/bindings/templates/attributes.cpp.tmpl +++ b/third_party/blink/renderer/bindings/templates/attributes.cpp.tmpl
@@ -106,7 +106,7 @@ {% if attribute.is_check_security_for_return_value %} // Perform a security check for the returned object. {{define_exception_state}} - if (!BindingSecurity::ShouldAllowAccessTo(CurrentDOMWindow(info.GetIsolate()), {{attribute.cpp_value}}, exceptionState)) { + if (!BindingSecurity::ShouldAllowAccessTo(CurrentDOMWindow(info.GetIsolate()), {{attribute.cpp_value}}, BindingSecurity::ErrorReportOption::kDoNotReport)) { UseCounter::Count(CurrentExecutionContext(info.GetIsolate()), WebFeature::kCrossOrigin{{interface_name}}{{attribute.name|blink_capitalize}}); V8SetReturnValueNull(info);
diff --git a/third_party/blink/renderer/bindings/templates/methods.cpp.tmpl b/third_party/blink/renderer/bindings/templates/methods.cpp.tmpl index 1017955..a958594 100644 --- a/third_party/blink/renderer/bindings/templates/methods.cpp.tmpl +++ b/third_party/blink/renderer/bindings/templates/methods.cpp.tmpl
@@ -54,7 +54,7 @@ {# Security checks #} {% if method.is_check_security_for_return_value %} {{define_exception_state}} - if (!BindingSecurity::ShouldAllowAccessTo(CurrentDOMWindow(info.GetIsolate()), {{method.cpp_value}}, exceptionState)) { + if (!BindingSecurity::ShouldAllowAccessTo(CurrentDOMWindow(info.GetIsolate()), {{method.cpp_value}}, BindingSecurity::ErrorReportOption::kDoNotReport)) { UseCounter::Count(CurrentExecutionContext(info.GetIsolate()), WebFeature::kCrossOrigin{{interface_name}}{{method.name|blink_capitalize}}); V8SetReturnValueNull(info);
diff --git a/third_party/blink/renderer/build/scripts/core/css/templates/cssom_types.cc.tmpl b/third_party/blink/renderer/build/scripts/core/css/templates/cssom_types.cc.tmpl index b775bd73..425b9d2 100644 --- a/third_party/blink/renderer/build/scripts/core/css/templates/cssom_types.cc.tmpl +++ b/third_party/blink/renderer/build/scripts/core/css/templates/cssom_types.cc.tmpl
@@ -39,6 +39,13 @@ MatchesBaseType(CSSNumericValueType::BaseType::kTime); } +bool IsCSSStyleValueAngle(const CSSStyleValue& value) { + if (!value.IsNumericValue()) + return false; + return static_cast<const CSSNumericValue&>(value).Type(). + MatchesBaseType(CSSNumericValueType::BaseType::kAngle); +} + bool IsCSSStyleValuePercentage(const CSSStyleValue& value) { if (!value.IsNumericValue()) return false;
diff --git a/third_party/blink/renderer/core/animation/document_timeline.h b/third_party/blink/renderer/core/animation/document_timeline.h index 569f0033..3ecfac452 100644 --- a/third_party/blink/renderer/core/animation/document_timeline.h +++ b/third_party/blink/renderer/core/animation/document_timeline.h
@@ -154,10 +154,10 @@ public: DocumentTimelineTiming(DocumentTimeline* timeline) : timeline_(timeline), - timer_( - timeline->GetDocument()->GetTaskRunner(TaskType::kUnspecedTimer), - this, - &DocumentTimelineTiming::TimerFired) { + timer_(timeline->GetDocument()->GetTaskRunner( + TaskType::kInternalAnimation), + this, + &DocumentTimelineTiming::TimerFired) { DCHECK(timeline_); }
diff --git a/third_party/blink/renderer/core/css/CSSProperties.json5 b/third_party/blink/renderer/core/css/CSSProperties.json5 index bce1c46a..b76fb4d 100644 --- a/third_party/blink/renderer/core/css/CSSProperties.json5 +++ b/third_party/blink/renderer/core/css/CSSProperties.json5
@@ -2112,6 +2112,8 @@ default_value: "StyleOffsetRotation(0, OffsetRotationType::kAuto)", type_name: "StyleOffsetRotation", converter: "ConvertOffsetRotate", + keywords: ["auto", "reverse"], + typedom_types: ["Keyword", "Angle"] }, { name: "opacity",
diff --git a/third_party/blink/renderer/core/css/cssom/style_property_map.cc b/third_party/blink/renderer/core/css/cssom/style_property_map.cc index cce00ce..769b35e 100644 --- a/third_party/blink/renderer/core/css/cssom/style_property_map.cc +++ b/third_party/blink/renderer/core/css/cssom/style_property_map.cc
@@ -97,6 +97,18 @@ } break; } + case CSSPropertyOffsetRotate: { + // level 1 only accepts single values, which are stored internally + // as a single element list. + const auto* value = style_value.ToCSSValue(); + if ((value->IsIdentifierValue() && !value->IsCSSWideKeyword()) || + value->IsPrimitiveValue()) { + CSSValueList* list = CSSValueList::CreateSpaceSeparated(); + list->Append(*style_value.ToCSSValue()); + return list; + } + break; + } case CSSPropertyPaintOrder: { // level 1 only accepts single keywords const auto* value = style_value.ToCSSValue();
diff --git a/third_party/blink/renderer/core/css/cssom/style_value_factory.cc b/third_party/blink/renderer/core/css/cssom/style_value_factory.cc index c0b8603..351cdbb 100644 --- a/third_party/blink/renderer/core/css/cssom/style_value_factory.cc +++ b/third_party/blink/renderer/core/css/cssom/style_value_factory.cc
@@ -112,6 +112,13 @@ FALLTHROUGH; case CSSPropertyObjectPosition: return CSSPositionValue::FromCSSValue(value); + case CSSPropertyOffsetRotate: { + const auto& value_list = ToCSSValueList(value); + // Only single keywords are supported in level 1. + if (value_list.length() == 1U) + return CreateStyleValue(value_list.Item(0)); + return nullptr; + } case CSSPropertyAlignItems: { // Computed align-items is a ValueList of either length 1 or 2. // Typed OM level 1 can't support "pairs", so we only return
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc index 64fcf05..34b9eb0 100644 --- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc +++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -878,11 +878,12 @@ } CSSValue* ParseBackgroundBox(CSSParserTokenRange& range, - const CSSParserLocalContext& local_context) { + const CSSParserLocalContext& local_context, + AllowTextValue alias_allow_text_value) { // This is legacy behavior that does not match spec, see crbug.com/604023 if (local_context.UseAliasParsing()) { return CSSPropertyParserHelpers::ConsumeCommaSeparatedList( - ConsumePrefixedBackgroundBox, range, AllowTextValue::kAllow); + ConsumePrefixedBackgroundBox, range, alias_allow_text_value); } return CSSPropertyParserHelpers::ConsumeCommaSeparatedList( ConsumeBackgroundBox, range);
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.h b/third_party/blink/renderer/core/css/properties/css_parsing_utils.h index 88681707..1c5e731 100644 --- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.h +++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.h
@@ -84,7 +84,8 @@ CSSValue*& result_y); CSSValue* ConsumePrefixedBackgroundBox(CSSParserTokenRange&, AllowTextValue); CSSValue* ParseBackgroundBox(CSSParserTokenRange&, - const CSSParserLocalContext&); + const CSSParserLocalContext&, + AllowTextValue alias_allow_text_value); CSSValue* ParseBackgroundOrMaskSize(CSSParserTokenRange&, const CSSParserContext&, const CSSParserLocalContext&,
diff --git a/third_party/blink/renderer/core/css/properties/longhands/background_clip_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/background_clip_custom.cc index 3903c796..0941b8f 100644 --- a/third_party/blink/renderer/core/css/properties/longhands/background_clip_custom.cc +++ b/third_party/blink/renderer/core/css/properties/longhands/background_clip_custom.cc
@@ -14,7 +14,8 @@ CSSParserTokenRange& range, const CSSParserContext&, const CSSParserLocalContext& local_context) const { - return CSSParsingUtils::ParseBackgroundBox(range, local_context); + return CSSParsingUtils::ParseBackgroundBox( + range, local_context, CSSParsingUtils::AllowTextValue::kAllow); } const CSSValue* BackgroundClip::CSSValueFromComputedStyleInternal(
diff --git a/third_party/blink/renderer/core/css/properties/longhands/background_origin_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/background_origin_custom.cc index 9157728..0224310 100644 --- a/third_party/blink/renderer/core/css/properties/longhands/background_origin_custom.cc +++ b/third_party/blink/renderer/core/css/properties/longhands/background_origin_custom.cc
@@ -14,7 +14,8 @@ CSSParserTokenRange& range, const CSSParserContext&, const CSSParserLocalContext& local_context) const { - return CSSParsingUtils::ParseBackgroundBox(range, local_context); + return CSSParsingUtils::ParseBackgroundBox( + range, local_context, CSSParsingUtils::AllowTextValue::kForbid); } const CSSValue* BackgroundOrigin::CSSValueFromComputedStyleInternal(
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_custom.cc b/third_party/blink/renderer/core/css/resolver/style_builder_custom.cc index 1bdb6252..95c97d53 100644 --- a/third_party/blink/renderer/core/css/resolver/style_builder_custom.cc +++ b/third_party/blink/renderer/core/css/resolver/style_builder_custom.cc
@@ -68,6 +68,8 @@ #include "third_party/blink/renderer/core/css_value_keywords.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/settings.h" +#include "third_party/blink/renderer/core/frame/use_counter.h" +#include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/core/style/computed_style.h" #include "third_party/blink/renderer/core/style/computed_style_constants.h" #include "third_party/blink/renderer/core/style/content_data.h" @@ -373,6 +375,7 @@ r = settings->GetTextAreasAreResizable() ? EResize::kBoth : EResize::kNone; } + UseCounter::Count(state.GetDocument(), WebFeature::kCSSResizeAuto); } else { r = identifier_value.ConvertTo<EResize>(); }
diff --git a/third_party/blink/renderer/core/editing/frame_caret.cc b/third_party/blink/renderer/core/editing/frame_caret.cc index a44ed93d..f8913c7 100644 --- a/third_party/blink/renderer/core/editing/frame_caret.cc +++ b/third_party/blink/renderer/core/editing/frame_caret.cc
@@ -51,7 +51,7 @@ display_item_client_(new CaretDisplayItemClient()), caret_visibility_(CaretVisibility::kHidden), caret_blink_timer_(new TaskRunnerTimer<FrameCaret>( - frame.GetTaskRunner(TaskType::kUnspecedTimer), + frame.GetTaskRunner(TaskType::kInternalAnimation), this, &FrameCaret::CaretBlinkTimerFired)), should_paint_caret_(true),
diff --git a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc index 355a3a7..edf785e 100644 --- a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc +++ b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc
@@ -463,12 +463,10 @@ inspector_session_->Append(new InspectorAuditsAgent(network_agent_)); - if (agent_->include_view_agents_) { - // TODO(dgozman): we should actually pass the view instead of frame, but - // during remote->local transition we cannot access mainFrameImpl() yet, so - // we have to store the frame which will become the main frame later. - inspector_session_->Append(new InspectorEmulationAgent(frame_.Get())); - } + // TODO(dgozman): we should actually pass the view instead of frame, but + // during remote->local transition we cannot access mainFrameImpl() yet, so + // we have to store the frame which will become the main frame later. + inspector_session_->Append(new InspectorEmulationAgent(frame_.Get())); // Call session init callbacks registered from higher layers CoreInitializer::GetInstance().InitInspectorAgentSession(
diff --git a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc index 5dc2c5bc..36a760d 100644 --- a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc +++ b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
@@ -76,7 +76,8 @@ WebSharedWorkerImpl::WebSharedWorkerImpl(WebSharedWorkerClient* client) : worker_inspector_proxy_(WorkerInspectorProxy::Create()), client_(client), - creation_address_space_(mojom::IPAddressSpace::kPublic) { + creation_address_space_(mojom::IPAddressSpace::kPublic), + weak_ptr_factory_(this) { DCHECK(IsMainThread()); } @@ -255,6 +256,29 @@ return; } + // S13nServiceWorker: The browser process is expected to send a + // SetController IPC before sending the script response, but there is no + // guarantee of the ordering as the messages arrive on different message + // pipes. Wait for the SetController IPC to be received before starting the + // worker; otherwise fetches from the worker might not go through the + // appropriate controller. + // + // (For non-S13nServiceWorker, we don't need to do this step as the controller + // service worker isn't used directly by the renderer, but to minimize code + // differences between the flags just do it anyway.) + client_->WaitForServiceWorkerControllerInfo( + shadow_page_->DocumentLoader()->GetServiceWorkerNetworkProvider(), + WTF::Bind(&WebSharedWorkerImpl::ContinueOnScriptLoaderFinished, + weak_ptr_factory_.GetWeakPtr())); +} + +void WebSharedWorkerImpl::ContinueOnScriptLoaderFinished() { + DCHECK(IsMainThread()); + DCHECK(main_script_loader_); + DCHECK(!main_script_loader_->Failed()); + if (asked_to_terminate_) + return; + // FIXME: this document's origin is pristine and without any extra privileges // (e.g. GrantUniversalAccess) that can be overriden in regular documents // via WebPreference by embedders. (crbug.com/254993)
diff --git a/third_party/blink/renderer/core/exported/web_shared_worker_impl.h b/third_party/blink/renderer/core/exported/web_shared_worker_impl.h index 7e54783..51d8b58b 100644 --- a/third_party/blink/renderer/core/exported/web_shared_worker_impl.h +++ b/third_party/blink/renderer/core/exported/web_shared_worker_impl.h
@@ -36,6 +36,7 @@ #include <memory> #include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" #include "services/service_manager/public/mojom/interface_provider.mojom-blink.h" #include "third_party/blink/public/mojom/net/ip_address_space.mojom-shared.h" #include "third_party/blink/public/platform/web_content_security_policy.h" @@ -110,6 +111,7 @@ void DidReceiveScriptLoaderResponse(); void OnScriptLoaderFinished(); + void ContinueOnScriptLoaderFinished(); void ConnectTaskOnWorkerThread(MessagePortChannel); @@ -142,6 +144,8 @@ service_manager::mojom::blink::InterfaceProviderPtrInfo pending_interface_provider_; + + base::WeakPtrFactory<WebSharedWorkerImpl> weak_ptr_factory_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/spin_button_element.cc b/third_party/blink/renderer/core/html/forms/spin_button_element.cc index fead54d..698c581 100644 --- a/third_party/blink/renderer/core/html/forms/spin_button_element.cc +++ b/third_party/blink/renderer/core/html/forms/spin_button_element.cc
@@ -50,7 +50,7 @@ capturing_(false), up_down_state_(kIndeterminate), press_starting_state_(kIndeterminate), - repeating_timer_(document.GetTaskRunner(TaskType::kUnspecedTimer), + repeating_timer_(document.GetTaskRunner(TaskType::kInternalAnimation), this, &SpinButtonElement::RepeatingTimerFired) {}
diff --git a/third_party/blink/renderer/core/layout/custom/layout_custom.cc b/third_party/blink/renderer/core/layout/custom/layout_custom.cc index 413d468..b194b7df 100644 --- a/third_party/blink/renderer/core/layout/custom/layout_custom.cc +++ b/third_party/blink/renderer/core/layout/custom/layout_custom.cc
@@ -52,20 +52,22 @@ // We will also need to investigate reducing the properties which // LayoutBlockFlow::StyleDidChange invalidates upon. (For example margins). - LayoutBlockFlow::StyleDidChange(diff, old_style); - LayoutWorklet* worklet = LayoutWorklet::From(*GetDocument().domWindow()); const AtomicString& name = StyleRef().DisplayLayoutCustomName(); state_ = worklet->GetDocumentDefinitionMap()->Contains(name) ? kBlock : kUnloaded; + // Make our children "block-level" before invoking StyleDidChange. As the + // current multi-col logic may invoke a call to AddChild, failing a DCHECK. + if (state_ != kUnloaded) + SetChildrenInline(false); + + LayoutBlockFlow::StyleDidChange(diff, old_style); + // Register if we'll need to reattach the layout tree when a matching // "layout()" is registered. - if (state_ == kUnloaded) { + if (state_ == kUnloaded) worklet->AddPendingLayout(name, GetNode()); - } else { - SetChildrenInline(false); - } } void LayoutCustom::UpdateBlockLayout(bool relayout_children) {
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index dbd6c29..02dc14d 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -5061,17 +5061,8 @@ // Add in the final overflow with shadows, outsets and outline combined. LayoutRect visual_effect_overflow = BorderBoxRect(); - LayoutRectOutsets outsets = ComputeVisualEffectOverflowOutsets(); - visual_effect_overflow.Expand(outsets); + visual_effect_overflow.Expand(ComputeVisualEffectOverflowOutsets()); AddSelfVisualOverflow(visual_effect_overflow); - - if (!IsIntegerValue(outsets.Top()) || !IsIntegerValue(outsets.Right()) || - !IsIntegerValue(outsets.Bottom()) || !IsIntegerValue(outsets.Left())) { - DCHECK(overflow_); - overflow_->SetHasSubpixelVisualEffectOutsets(true); - } else if (overflow_) { - overflow_->SetHasSubpixelVisualEffectOutsets(false); - } } LayoutRectOutsets LayoutBox::ComputeVisualEffectOverflowOutsets() { @@ -6000,12 +5991,4 @@ GetLayoutBox().PhysicalLayoutOverflowRect(); } -float LayoutBox::VisualRectOutsetForRasterEffects() const { - // If the box has subpixel visual effect outsets, as the visual effect may be - // painted along the pixel-snapped border box, the pixels on the anti-aliased - // edge of the effect may overflow the calculated visual rect. Expand visual - // rect by one pixel in the case. - return overflow_ && overflow_->HasSubpixelVisualEffectOutsets() ? 1 : 0; -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h index 927ac6b..8125f26 100644 --- a/third_party/blink/renderer/core/layout/layout_box.h +++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -1626,8 +1626,6 @@ LayoutRect DebugRect() const override; - float VisualRectOutsetForRasterEffects() const override; - // The CSS border box rect for this box. // // The rectangle is in this box's physical coordinates but with a
diff --git a/third_party/blink/renderer/core/layout/layout_progress.cc b/third_party/blink/renderer/core/layout/layout_progress.cc index 56cd1723..8d6e0a6 100644 --- a/third_party/blink/renderer/core/layout/layout_progress.cc +++ b/third_party/blink/renderer/core/layout/layout_progress.cc
@@ -36,7 +36,7 @@ animation_duration_(0), animating_(false), animation_timer_( - element->GetDocument().GetTaskRunner(TaskType::kUnspecedTimer), + element->GetDocument().GetTaskRunner(TaskType::kInternalAnimation), this, &LayoutProgress::AnimationTimerFired) {}
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc index aa89d810..10d79eb 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc
@@ -87,14 +87,6 @@ return !break_token.IsFinished() && !break_token.IsForcedBreak(); } -// TODO(xiaochengh): Try avoid passing |previous_line|. -bool NGPhysicalLineBoxFragment::HasSoftWrapFromPreviousLine( - const NGPhysicalLineBoxFragment* previous_line) const { - if (!previous_line) - return false; - return previous_line->HasSoftWrapToNextLine(); -} - PositionWithAffinity NGPhysicalLineBoxFragment::PositionForPoint( const NGPhysicalOffset& point) const { return PositionForPointInInlineLevelBox(point);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h index 2b49c35..02989a09 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h
@@ -47,10 +47,6 @@ // Whether the content soft-wraps to the next line. bool HasSoftWrapToNextLine() const; - // Whether the content is following a soft-wrap from the previous line. - // TODO(xiaochengh): Try to avoid passing the previous line. - bool HasSoftWrapFromPreviousLine(const NGPhysicalLineBoxFragment*) const; - PositionWithAffinity PositionForPoint(const NGPhysicalOffset&) const final; scoped_refptr<NGPhysicalFragment> CloneWithoutOffset() const {
diff --git a/third_party/blink/renderer/core/layout/overflow_model.h b/third_party/blink/renderer/core/layout/overflow_model.h index 85aec7a..56ef49e3 100644 --- a/third_party/blink/renderer/core/layout/overflow_model.h +++ b/third_party/blink/renderer/core/layout/overflow_model.h
@@ -181,19 +181,11 @@ layout_client_after_edge_ = client_after_edge; } - void SetHasSubpixelVisualEffectOutsets(bool b) { - has_subpixel_visual_effect_outsets_ = b; - } - bool HasSubpixelVisualEffectOutsets() const { - return has_subpixel_visual_effect_outsets_; - } - private: LayoutRect layout_overflow_; LayoutRect self_visual_overflow_; LayoutRect contents_visual_overflow_; LayoutUnit layout_client_after_edge_; - bool has_subpixel_visual_effect_outsets_ = false; DISALLOW_COPY_AND_ASSIGN(BoxOverflowModel); };
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc index 440324e..590e5716 100644 --- a/third_party/blink/renderer/core/loader/document_loader.cc +++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -1099,13 +1099,19 @@ if (reason == InstallNewDocumentReason::kNavigation) DidCommitNavigation(global_object_reuse_policy); - if (document->GetSettings() - ->GetForceTouchEventFeatureDetectionForInspector()) { - OriginTrialContext::FromOrCreate(document)->AddFeature( - "ForceTouchEventFeatureDetectionForInspector"); + // Initializing origin trials might force window proxy initialization, + // which later triggers CHECK when swapping in via WebFrame::Swap(). + // We can safely omit installing original trials on initial empty document + // and wait for the real load. + if (GetFrameLoader().StateMachine()->CommittedFirstRealDocumentLoad()) { + if (document->GetSettings() + ->GetForceTouchEventFeatureDetectionForInspector()) { + OriginTrialContext::FromOrCreate(document)->AddFeature( + "ForceTouchEventFeatureDetectionForInspector"); + } + OriginTrialContext::AddTokensFromHeader( + document, response_.HttpHeaderField(HTTPNames::Origin_Trial)); } - OriginTrialContext::AddTokensFromHeader( - document, response_.HttpHeaderField(HTTPNames::Origin_Trial)); parser_ = document->OpenForNavigation(parsing_policy, mime_type, encoding);
diff --git a/third_party/blink/renderer/core/svg/animation/smil_time_container.cc b/third_party/blink/renderer/core/svg/animation/smil_time_container.cc index 1261656f7..57c3bd3 100644 --- a/third_party/blink/renderer/core/svg/animation/smil_time_container.cc +++ b/third_party/blink/renderer/core/svg/animation/smil_time_container.cc
@@ -48,11 +48,12 @@ started_(false), paused_(false), document_order_indexes_dirty_(false), - wakeup_timer_(owner.GetDocument().GetTaskRunner(TaskType::kUnspecedTimer), - this, - &SMILTimeContainer::WakeupTimerFired), + wakeup_timer_( + owner.GetDocument().GetTaskRunner(TaskType::kInternalAnimation), + this, + &SMILTimeContainer::WakeupTimerFired), animation_policy_once_timer_( - owner.GetDocument().GetTaskRunner(TaskType::kUnspecedTimer), + owner.GetDocument().GetTaskRunner(TaskType::kInternalAnimation), this, &SMILTimeContainer::AnimationPolicyTimerFired), owner_svg_element_(&owner) {}
diff --git a/third_party/blink/renderer/devtools/front_end/Images/largeIcons.png b/third_party/blink/renderer/devtools/front_end/Images/largeIcons.png index 5d9ea50..846fbade 100644 --- a/third_party/blink/renderer/devtools/front_end/Images/largeIcons.png +++ b/third_party/blink/renderer/devtools/front_end/Images/largeIcons.png Binary files differ
diff --git a/third_party/blink/renderer/devtools/front_end/Images/largeIcons_2x.png b/third_party/blink/renderer/devtools/front_end/Images/largeIcons_2x.png index f6b7df7..be61e0f 100644 --- a/third_party/blink/renderer/devtools/front_end/Images/largeIcons_2x.png +++ b/third_party/blink/renderer/devtools/front_end/Images/largeIcons_2x.png Binary files differ
diff --git a/third_party/blink/renderer/devtools/front_end/Images/src/largeIcons.svg b/third_party/blink/renderer/devtools/front_end/Images/src/largeIcons.svg index 7ddbae1..83303365 100644 --- a/third_party/blink/renderer/devtools/front_end/Images/src/largeIcons.svg +++ b/third_party/blink/renderer/devtools/front_end/Images/src/largeIcons.svg
@@ -12,7 +12,7 @@ height="216" id="svg2" version="1.1" - inkscape:version="0.48.4 r9939" + inkscape:version="0.92.2pre0 (973e216, 2017-07-25)" sodipodi:docname="largeIcons.svg"> <metadata id="metadata606"> @@ -41,10 +41,10 @@ id="namedview602" showgrid="true" inkscape:zoom="4.3703705" - inkscape:cx="90.664772" + inkscape:cx="92.781028" inkscape:cy="118.13064" - inkscape:window-x="0" - inkscape:window-y="0" + inkscape:window-x="1047" + inkscape:window-y="228" inkscape:window-maximized="0" inkscape:current-layer="svg2" inkscape:snap-grids="true" @@ -57,8 +57,10 @@ visible="true" enabled="true" snapvisiblegridlinesonly="true" - spacingx="28px" - spacingy="24px" /> + spacingx="28" + spacingy="24" + originx="0" + originy="0" /> </sodipodi:namedview> <g id="g4"> @@ -71,7 +73,6 @@ cy="17" r="3" id="circle10" - d="m 18,17 c 0,1.656854 -1.343146,3 -3,3 -1.656854,0 -3,-1.343146 -3,-3 0,-1.656854 1.343146,-3 3,-3 1.656854,0 3,1.343146 3,3 z" sodipodi:cx="15" sodipodi:cy="17" sodipodi:rx="3" @@ -1212,191 +1213,191 @@ </g> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="12.355932" y="231.55931" - id="text4355" - sodipodi:linespacing="125%"><tspan + id="text4355"><tspan sodipodi:role="line" id="tspan4357" x="12.355932" - y="231.55931">a</tspan></text> + y="231.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">a</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="40.355934" y="231.55931" - id="text4355-3" - sodipodi:linespacing="125%"><tspan + id="text4355-3"><tspan sodipodi:role="line" id="tspan4357-6" x="40.355934" - y="231.55931">b</tspan></text> + y="231.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">b</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="68.355934" y="231.55931" - id="text4355-7" - sodipodi:linespacing="125%"><tspan + id="text4355-7"><tspan sodipodi:role="line" id="tspan4357-5" x="68.355934" - y="231.55931">c</tspan></text> + y="231.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">c</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="96.355934" y="231.55931" - id="text4355-35" - sodipodi:linespacing="125%"><tspan + id="text4355-35"><tspan sodipodi:role="line" id="tspan4357-62" x="96.355934" - y="231.55931">d</tspan></text> + y="231.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">d</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="124.35593" y="231.55931" - id="text4355-9" - sodipodi:linespacing="125%"><tspan + id="text4355-9"><tspan sodipodi:role="line" id="tspan4357-1" x="124.35593" - y="231.55931">e</tspan></text> + y="231.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">e</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="152.35593" y="231.55931" - id="text4355-2" - sodipodi:linespacing="125%"><tspan + id="text4355-2"><tspan sodipodi:role="line" id="tspan4357-7" x="152.35593" - y="231.55931">f</tspan></text> + y="231.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">f</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="180.35593" y="231.55931" - id="text4355-0" - sodipodi:linespacing="125%"><tspan + id="text4355-0"><tspan sodipodi:role="line" id="tspan4357-9" x="180.35593" - y="231.55931">g</tspan></text> + y="231.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">g</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="208.35593" y="231.55931" - id="text4355-36" - sodipodi:linespacing="125%"><tspan + id="text4355-36"><tspan sodipodi:role="line" id="tspan4357-0" x="208.35593" - y="231.55931">h</tspan></text> + y="231.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">h</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-15.644068" y="207.55931" - id="text4355-6" - sodipodi:linespacing="125%"><tspan + id="text4355-6"><tspan sodipodi:role="line" id="tspan4357-2" x="-15.644068" - y="207.55931">1</tspan></text> + y="207.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">1</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-15.644068" y="183.55931" - id="text4355-61" - sodipodi:linespacing="125%"><tspan + id="text4355-61"><tspan sodipodi:role="line" id="tspan4357-8" x="-15.644068" - y="183.55931">2</tspan></text> + y="183.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">2</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-15.644068" y="159.55931" - id="text4355-79" - sodipodi:linespacing="125%"><tspan + id="text4355-79"><tspan sodipodi:role="line" id="tspan4357-20" x="-15.644068" - y="159.55931">3</tspan></text> + y="159.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">3</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-15.644068" y="135.55931" - id="text4355-23" - sodipodi:linespacing="125%"><tspan + id="text4355-23"><tspan sodipodi:role="line" id="tspan4357-75" x="-15.644068" - y="135.55931">4</tspan></text> + y="135.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">4</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-15.644068" y="111.55931" - id="text4355-92" - sodipodi:linespacing="125%"><tspan + id="text4355-92"><tspan sodipodi:role="line" id="tspan4357-28" x="-15.644068" - y="111.55931">5</tspan></text> + y="111.55931" + style="font-size:12px;line-height:1.25;font-family:sans-serif">5</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-15.644068" y="87.559311" - id="text4355-97" - sodipodi:linespacing="125%"><tspan + id="text4355-97"><tspan sodipodi:role="line" id="tspan4357-3" x="-15.644068" - y="87.559311">6</tspan></text> + y="87.559311" + style="font-size:12px;line-height:1.25;font-family:sans-serif">6</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-15.644068" y="63.559311" - id="text4355-612" - sodipodi:linespacing="125%"><tspan + id="text4355-612"><tspan sodipodi:role="line" id="tspan4357-93" x="-15.644068" - y="63.559311">7</tspan></text> + y="63.559311" + style="font-size:12px;line-height:1.25;font-family:sans-serif">7</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-15.644068" y="39.559311" - id="text4355-1" - sodipodi:linespacing="125%"><tspan + id="text4355-1"><tspan sodipodi:role="line" id="tspan4357-94" x="-15.644068" - y="39.559311">8</tspan></text> + y="39.559311" + style="font-size:12px;line-height:1.25;font-family:sans-serif">8</tspan></text> <text xml:space="preserve" - style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-15.644068" y="15.559311" - id="text4355-78" - sodipodi:linespacing="125%"><tspan + id="text4355-78"><tspan sodipodi:role="line" id="tspan4357-4" x="-15.644068" - y="15.559311">9</tspan></text> + y="15.559311" + style="font-size:12px;line-height:1.25;font-family:sans-serif">9</tspan></text> <g id="Page-1-6" style="fill:none;stroke:none" @@ -1434,14 +1435,6 @@ id="path4295-3" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccc" /> - <g - transform="matrix(0,-1,1,0,196.13559,219.83898)" - id="g512-3"> - <path - d="m 15,8 v 6.487608 h -3 l 4.5,6.487607 4.5,-6.487607 H 18 V 8 h -3 z" - id="path518-7" - inkscape:connector-curvature="0" /> - </g> <rect style="fill:#000000;" id="square-icon" @@ -1463,4 +1456,17 @@ inkscape:connector-curvature="0" style="fill:none" /> </g> + <path + inkscape:connector-curvature="0" + id="path524-5" + d="m 211.71941,203.4233 c 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2" /> + <g + transform="translate(190.16772,189.5042)" + id="g520-3"> + <path + d="m 20.83228,13.9958 -4,-4.5 v 3 h -4 v 3 h 4 v 3 z" + id="path526-7" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccc" /> + </g> </svg>
diff --git a/third_party/blink/renderer/devtools/front_end/Images/src/mediumIcons.svg b/third_party/blink/renderer/devtools/front_end/Images/src/mediumIcons.svg index 861d177..3e21a093 100644 --- a/third_party/blink/renderer/devtools/front_end/Images/src/mediumIcons.svg +++ b/third_party/blink/renderer/devtools/front_end/Images/src/mediumIcons.svg
@@ -12,7 +12,7 @@ height="80" id="svg4775" version="1.1" - inkscape:version="0.48.4 r9939" + inkscape:version="0.92.2pre0 (973e216, 2017-07-25)" sodipodi:docname="mediumIcons.svg" inkscape:export-filename="/Users/pfeldman/code/chromium/src/third_party/WebKit/Source/devtools/front_end/Images/mediumIcons.png" inkscape:export-xdpi="90" @@ -95,12 +95,12 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1278" - inkscape:window-height="746" + inkscape:window-width="2714" + inkscape:window-height="1732" id="namedview4913" showgrid="true" inkscape:zoom="5.2149126" - inkscape:cx="-5.9228807" + inkscape:cx="-45.52086" inkscape:cy="72.509528" inkscape:window-x="0" inkscape:window-y="0" @@ -113,8 +113,10 @@ visible="true" enabled="true" snapvisiblegridlinesonly="true" - spacingx="16px" - spacingy="16px" /> + spacingx="16" + spacingy="16" + originx="0" + originy="0" /> </sodipodi:namedview> <g id="g4777" @@ -202,7 +204,6 @@ cy="11.5" r="2.5" id="circle4831" - d="M 13,11.5 C 13,12.880712 11.880712,14 10.5,14 9.1192881,14 8,12.880712 8,11.5 8,10.119288 9.1192881,9 10.5,9 11.880712,9 13,10.119288 13,11.5 z" sodipodi:cx="10.5" sodipodi:cy="11.5" sodipodi:rx="2.5" @@ -398,92 +399,92 @@ </g> <text xml:space="preserve" - style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-11.403088" y="75.207672" - id="text4355" - sodipodi:linespacing="125%"><tspan + id="text4355"><tspan sodipodi:role="line" id="tspan4357" x="-11.403088" - y="75.207672">1</tspan></text> + y="75.207672" + style="font-size:10px;line-height:1.25;font-family:sans-serif">1</tspan></text> <text xml:space="preserve" - style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-11.144299" y="59.675297" - id="text4355-8" - sodipodi:linespacing="125%"><tspan + id="text4355-8"><tspan sodipodi:role="line" id="tspan4357-8" x="-11.144299" - y="59.675297">2</tspan></text> + y="59.675297" + style="font-size:10px;line-height:1.25;font-family:sans-serif">2</tspan></text> <text xml:space="preserve" - style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-11.066174" y="44.142918" - id="text4355-4" - sodipodi:linespacing="125%"><tspan + id="text4355-4"><tspan sodipodi:role="line" id="tspan4357-3" x="-11.066174" - y="44.142918">3</tspan></text> + y="44.142918" + style="font-size:10px;line-height:1.25;font-family:sans-serif">3</tspan></text> <text xml:space="preserve" - style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="-11.266369" y="28.610538" - id="text4355-1" - sodipodi:linespacing="125%"><tspan + id="text4355-1"><tspan sodipodi:role="line" id="tspan4357-4" x="-11.266369" - y="28.610538">4</tspan></text> + y="28.610538" + style="font-size:10px;line-height:1.25;font-family:sans-serif">4</tspan></text> <text xml:space="preserve" - style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="5.9353299" y="92.082359" - id="text4355-9" - sodipodi:linespacing="125%"><tspan + id="text4355-9"><tspan sodipodi:role="line" id="tspan4357-2" x="5.9353299" - y="92.082359">a</tspan></text> + y="92.082359" + style="font-size:10px;line-height:1.25;font-family:sans-serif">a</tspan></text> <text xml:space="preserve" - style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="21.659466" y="92.082359" - id="text4355-0" - sodipodi:linespacing="125%"><tspan + id="text4355-0"><tspan sodipodi:role="line" id="tspan4357-6" x="21.659466" - y="92.082359">b</tspan></text> + y="92.082359" + style="font-size:10px;line-height:1.25;font-family:sans-serif">b</tspan></text> <text xml:space="preserve" - style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="37.383606" y="92.082359" - id="text4355-89" - sodipodi:linespacing="125%"><tspan + id="text4355-89"><tspan sodipodi:role="line" id="tspan4357-26" x="37.383606" - y="92.082359">c</tspan></text> + y="92.082359" + style="font-size:10px;line-height:1.25;font-family:sans-serif">c</tspan></text> <text xml:space="preserve" - style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none" x="53.107742" y="92.082359" - id="text4355-6" - sodipodi:linespacing="125%"><tspan + id="text4355-6"><tspan sodipodi:role="line" id="tspan4357-49" x="53.107742" - y="92.082359">d</tspan></text> + y="92.082359" + style="font-size:10px;line-height:1.25;font-family:sans-serif">d</tspan></text> <g style="fill:none;stroke:none" id="g6346" @@ -667,26 +668,26 @@ </g> <text xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:0.37333333;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:0.37333332;stroke:none" x="-10.738436" y="12.11775" - id="text5090" - sodipodi:linespacing="125%"><tspan + id="text5090"><tspan sodipodi:role="line" id="tspan5092" x="-10.738436" - y="12.11775">5</tspan></text> + y="12.11775" + style="font-size:10px;line-height:1.25;font-family:sans-serif">5</tspan></text> <text xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:0.35111114;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:0.35111114;stroke:none" x="68.649277" y="91.69722" - id="text5862" - sodipodi:linespacing="125%"><tspan + id="text5862"><tspan sodipodi:role="line" id="tspan5864" x="68.649277" - y="91.69722">e</tspan></text> + y="91.69722" + style="font-size:10px;line-height:1.25;font-family:sans-serif">e</tspan></text> <g style="fill:#000000" id="g5994" @@ -734,28 +735,26 @@ </g> <text xml:space="preserve" - style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" x="32.469646" y="7.902472" - id="text3111" - sodipodi:linespacing="125%"><tspan + id="text3111"><tspan sodipodi:role="line" id="tspan3113" x="32.469646" y="7.902472" - style="font-size:10px;font-weight:bold">A</tspan></text> + style="font-weight:bold;font-size:10px;line-height:1.25;font-family:sans-serif">A</tspan></text> <text xml:space="preserve" - style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" x="40.362782" y="15.525424" - id="text3115" - sodipodi:linespacing="125%"><tspan + id="text3115"><tspan sodipodi:role="line" id="tspan3117" x="40.362782" y="15.525424" - style="font-size:10px;font-weight:bold">B</tspan></text> + style="font-weight:bold;font-size:10px;line-height:1.25;font-family:sans-serif">B</tspan></text> <path d="m 37.955041,13.088794 c -1.914609,-0.291809 -2.119489,-0.899233 -2.237,-4.129445 l -1.219783,0 c 0.04662,3.855641 0.06137,5.297137 5.735435,5.257508 l 0.316769,-0.01434 -2.595652,-2.995518 c -0.01446,0.611794 -0.01486,1.270551 2.31e-4,1.881795 z" id="path448"
diff --git a/third_party/blink/renderer/devtools/front_end/Images/src/optimize_png.hashes b/third_party/blink/renderer/devtools/front_end/Images/src/optimize_png.hashes index 6d0214a..86d2d9e6 100644 --- a/third_party/blink/renderer/devtools/front_end/Images/src/optimize_png.hashes +++ b/third_party/blink/renderer/devtools/front_end/Images/src/optimize_png.hashes
@@ -1,11 +1,11 @@ { "securityIcons.svg": "27676f7c1f1542659c7c49a8052259dc", - "largeIcons.svg": "6c7e87328ee5186a34782daf56700758", + "largeIcons.svg": "faf26930e93e7525a3cbcc595527662c", "breakpointConditional.svg": "4cf90210b2af2ed84db2f60b07bcde28", "checkboxCheckmark.svg": "f039bf85cee42ad5c30ca3bfdce7912a", "errorWave.svg": "e183fa242a22ed4784a92f6becbc2c45", "smallIcons.svg": "40aefe4606ebba939725954ff9f908ef", - "mediumIcons.svg": "5305adcb3fa224710ef2efeec01667a8", + "mediumIcons.svg": "115d211e8c00873698de4c861d7f3e44", "breakpoint.svg": "69cd92d807259c022791112809b97799", "treeoutlineTriangles.svg": "2d26ab85d919f83d5021f2f385dffd0b", "chevrons.svg": "79b4b527771e30b6388ce664077b3409"
diff --git a/third_party/blink/renderer/devtools/front_end/Images/src/svg2png.hashes b/third_party/blink/renderer/devtools/front_end/Images/src/svg2png.hashes index 6d0214a..86d2d9e6 100644 --- a/third_party/blink/renderer/devtools/front_end/Images/src/svg2png.hashes +++ b/third_party/blink/renderer/devtools/front_end/Images/src/svg2png.hashes
@@ -1,11 +1,11 @@ { "securityIcons.svg": "27676f7c1f1542659c7c49a8052259dc", - "largeIcons.svg": "6c7e87328ee5186a34782daf56700758", + "largeIcons.svg": "faf26930e93e7525a3cbcc595527662c", "breakpointConditional.svg": "4cf90210b2af2ed84db2f60b07bcde28", "checkboxCheckmark.svg": "f039bf85cee42ad5c30ca3bfdce7912a", "errorWave.svg": "e183fa242a22ed4784a92f6becbc2c45", "smallIcons.svg": "40aefe4606ebba939725954ff9f908ef", - "mediumIcons.svg": "5305adcb3fa224710ef2efeec01667a8", + "mediumIcons.svg": "115d211e8c00873698de4c861d7f3e44", "breakpoint.svg": "69cd92d807259c022791112809b97799", "treeoutlineTriangles.svg": "2d26ab85d919f83d5021f2f385dffd0b", "chevrons.svg": "79b4b527771e30b6388ce664077b3409"
diff --git a/third_party/blink/renderer/devtools/front_end/Images/whatsnew.png b/third_party/blink/renderer/devtools/front_end/Images/whatsnew.png index 9e34d4e..cb8c14d 100644 --- a/third_party/blink/renderer/devtools/front_end/Images/whatsnew.png +++ b/third_party/blink/renderer/devtools/front_end/Images/whatsnew.png Binary files differ
diff --git a/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js b/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js index 9ede40f..34b69db 100644 --- a/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js +++ b/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js
@@ -7,11 +7,49 @@ // https://github.com/ChromeDevTools/devtools-frontend/wiki/Release-Notes const continueToHereShortcut = Host.isMac() ? 'Command' : 'Control'; +const networkSearchShortcut = Host.isMac() ? 'Command + F' : 'Control + F'; const commandMenuShortcut = Host.isMac() ? 'Command + Shift + P' : 'Control + Shift + P'; /** @type {!Array<!Help.ReleaseNote>} */ Help.releaseNoteText = [ { + version: 10, + header: 'Highlights from the Chrome 67 update', + highlights: [ + { + title: 'Search across all network headers', + subtitle: `Press ${networkSearchShortcut} in the Network panel to open the Network Search pane.`, + link: 'https://developers.google.com/web/updates/2018/04/devtools#network-search', + }, + { + title: 'CSS variable value previews in the Styles pane', + subtitle: 'When a property value is a CSS variable, DevTools now shows a color preview next to the variable.', + link: 'https://developers.google.com/web/updates/2018/04/devtools#vars', + }, + { + title: 'Stop infinite loops', + subtitle: 'Pause JavaScript execution then select the new Stop Current JavaScript Call button.', + link: 'https://developers.google.com/web/updates/2018/04/devtools#stop', + }, + { + title: 'Copy as fetch', + subtitle: 'Right-click a network request then select Copy > Copy as fetch.', + link: 'https://developers.google.com/web/updates/2018/04/devtools#fetch', + }, + { + title: 'More audits', + subtitle: 'Two new audits, desktop configuration options, and viewing traces.', + link: 'https://developers.google.com/web/updates/2018/04/devtools#audits', + }, + { + title: 'User Timing in the Performance tabs', + subtitle: 'Click the User Timing section to view measures in the Summary, Bottom-Up, and Call Tree tabs.', + link: 'https://developers.google.com/web/updates/2018/04/devtools#tabs', + }, + ], + link: 'https://developers.google.com/web/updates/2018/04/devtools', + }, + { version: 9, header: 'Highlights from the Chrome 66 update', highlights: [
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_settled_fetches.h b/third_party/blink/renderer/modules/background_fetch/background_fetch_settled_fetches.h index 21d3cbd..3b9d33a 100644 --- a/third_party/blink/renderer/modules/background_fetch/background_fetch_settled_fetches.h +++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_settled_fetches.h
@@ -22,19 +22,26 @@ DEFINE_WRAPPERTYPEINFO(); public: - BackgroundFetchSettledFetches( - ScriptState*, - const WebVector<WebBackgroundFetchSettledFetch>& fetches); + static BackgroundFetchSettledFetches* Create( + ScriptState* script_state, + const WebVector<WebBackgroundFetchSettledFetch>& fetches) { + return new BackgroundFetchSettledFetches(script_state, fetches); + } ~BackgroundFetchSettledFetches() override = default; // Web Exposed functions defined in the IDL file. - ScriptPromise match(ScriptState*, const RequestOrUSVString&); - ScriptPromise values(ScriptState*); + ScriptPromise match(ScriptState* script_state, + const RequestOrUSVString& request); + ScriptPromise values(ScriptState* script_state); - void Trace(blink::Visitor*); + void Trace(blink::Visitor* visitor); private: + BackgroundFetchSettledFetches( + ScriptState* script_state, + const WebVector<WebBackgroundFetchSettledFetch>& fetches); + HeapVector<Member<BackgroundFetchSettledFetch>> fetches_; };
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_settled_fetches_test.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_settled_fetches_test.cc index 71cb64d..8df0b9d 100644 --- a/third_party/blink/renderer/modules/background_fetch/background_fetch_settled_fetches_test.cc +++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_settled_fetches_test.cc
@@ -92,11 +92,11 @@ RequestOrUSVString null_request; auto settled_fetches = CreateSettledFetches({"foo.com"}); - BackgroundFetchSettledFetches bgf_settled_fetches(scope.GetScriptState(), - settled_fetches); + auto* bgf_settled_fetches = BackgroundFetchSettledFetches::Create( + scope.GetScriptState(), settled_fetches); ScriptPromise promise = - bgf_settled_fetches.match(scope.GetScriptState(), null_request); + bgf_settled_fetches->match(scope.GetScriptState(), null_request); ScriptValue value = ResolvePromise(scope.GetScriptState(), promise); EXPECT_TRUE(value.IsNull()); @@ -109,13 +109,13 @@ auto settled_fetches = CreateSettledFetches( {"http://t1.net/", "http://foo.com/", "http://t3.net/"}); - BackgroundFetchSettledFetches bgf_settled_fetches(scope.GetScriptState(), - settled_fetches); + auto* bgf_settled_fetches = BackgroundFetchSettledFetches::Create( + scope.GetScriptState(), settled_fetches); ScriptPromise matched_promise = - bgf_settled_fetches.match(scope.GetScriptState(), matched_request); + bgf_settled_fetches->match(scope.GetScriptState(), matched_request); ScriptPromise unmatched_promise = - bgf_settled_fetches.match(scope.GetScriptState(), unmatched_request); + bgf_settled_fetches->match(scope.GetScriptState(), unmatched_request); ScriptValue matched_value = ResolvePromise(scope.GetScriptState(), matched_promise); @@ -136,13 +136,13 @@ auto settled_fetches = CreateSettledFetches( {"http://t1.net/", "http://foo.com/", "http://t3.net/"}); - BackgroundFetchSettledFetches bgf_settled_fetches(scope.GetScriptState(), - settled_fetches); + auto* bgf_settled_fetches = BackgroundFetchSettledFetches::Create( + scope.GetScriptState(), settled_fetches); ScriptPromise matched_promise = - bgf_settled_fetches.match(scope.GetScriptState(), matched_request); + bgf_settled_fetches->match(scope.GetScriptState(), matched_request); ScriptPromise unmatched_promise = - bgf_settled_fetches.match(scope.GetScriptState(), unmatched_request); + bgf_settled_fetches->match(scope.GetScriptState(), unmatched_request); ScriptValue matched_value = ResolvePromise(scope.GetScriptState(), matched_promise);
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_update_event.h b/third_party/blink/renderer/modules/background_fetch/background_fetch_update_event.h index d4a98011..b86aee08 100644 --- a/third_party/blink/renderer/modules/background_fetch/background_fetch_update_event.h +++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_update_event.h
@@ -23,6 +23,17 @@ return new BackgroundFetchUpdateEvent(type, initializer); } + static BackgroundFetchUpdateEvent* Create( + const AtomicString& type, + const BackgroundFetchSettledEventInit& initializer, + const String& unique_id, + ScriptState* script_state, + WaitUntilObserver* observer, + ServiceWorkerRegistration* registration) { + return new BackgroundFetchUpdateEvent(type, initializer, unique_id, + script_state, observer, registration); + } + ~BackgroundFetchUpdateEvent() override; // Web Exposed method defined in the IDL file.
diff --git a/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.cc b/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.cc index e50acbb..a867a368 100644 --- a/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.cc +++ b/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.cc
@@ -122,6 +122,8 @@ return CredentialManagerError::INVALID_STATE; case webauth::mojom::blink::AuthenticatorStatus::NOT_IMPLEMENTED: return CredentialManagerError::NOT_IMPLEMENTED; + case webauth::mojom::blink::AuthenticatorStatus::NOT_FOCUSED: + return CredentialManagerError::NOT_FOCUSED; case webauth::mojom::blink::AuthenticatorStatus::SUCCESS: NOTREACHED(); break;
diff --git a/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc index eb0eba9..bd627b68 100644 --- a/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc +++ b/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc
@@ -259,6 +259,10 @@ "Attempting to register an already-registered key."); case CredentialManagerError::NOT_IMPLEMENTED: return DOMException::Create(kNotSupportedError, "Not implemented"); + case CredentialManagerError::NOT_FOCUSED: + return DOMException::Create(kNotAllowedError, + "The operation is not allowed at this time " + "because the page does not have focus."); case CredentialManagerError::UNKNOWN: return DOMException::Create(kNotReadableError, "An unknown error occurred while talking "
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc index 53bcd5d..61b59166 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -485,6 +485,11 @@ ParseConfiguration(context, rtc_configuration, exception_state); if (exception_state.HadException()) return nullptr; + // Override default SDP semantics if RuntimeEnabled=RTCUnifiedPlanByDefault. + if (!rtc_configuration.hasSdpSemantics() && + RuntimeEnabledFeatures::RTCUnifiedPlanByDefaultEnabled()) { + configuration.sdp_semantics = WebRTCSdpSemantics::kUnifiedPlan; + } // Make sure no certificates have expired. if (configuration.certificates.size() > 0) {
diff --git a/third_party/blink/renderer/modules/serviceworkers/service_worker_global_scope_proxy.cc b/third_party/blink/renderer/modules/serviceworkers/service_worker_global_scope_proxy.cc index 3590cc6..3c6cd361 100644 --- a/third_party/blink/renderer/modules/serviceworkers/service_worker_global_scope_proxy.cc +++ b/third_party/blink/renderer/modules/serviceworkers/service_worker_global_scope_proxy.cc
@@ -58,8 +58,8 @@ #include "third_party/blink/renderer/modules/background_fetch/background_fetch_event_init.h" #include "third_party/blink/renderer/modules/background_fetch/background_fetch_fail_event.h" #include "third_party/blink/renderer/modules/background_fetch/background_fetch_fail_event_init.h" -#include "third_party/blink/renderer/modules/background_fetch/background_fetched_event.h" -#include "third_party/blink/renderer/modules/background_fetch/background_fetched_event_init.h" +#include "third_party/blink/renderer/modules/background_fetch/background_fetch_settled_event_init.h" +#include "third_party/blink/renderer/modules/background_fetch/background_fetch_update_event.h" #include "third_party/blink/renderer/modules/background_sync/sync_event.h" #include "third_party/blink/renderer/modules/exported/web_embedded_worker_impl.h" #include "third_party/blink/renderer/modules/notifications/notification.h" @@ -209,15 +209,15 @@ WaitUntilObserver* observer = WaitUntilObserver::Create( WorkerGlobalScope(), WaitUntilObserver::kBackgroundFetched, event_id); - BackgroundFetchedEventInit init; - init.setId(developer_id); - ScriptState* script_state = WorkerGlobalScope()->ScriptController()->GetScriptState(); - ScriptState::Scope scope(script_state); - BackgroundFetchedEvent* event = BackgroundFetchedEvent::Create( - EventTypeNames::backgroundfetched, init, unique_id, fetches, script_state, + BackgroundFetchSettledEventInit init; + init.setId(developer_id); + init.setFetches(BackgroundFetchSettledFetches::Create(script_state, fetches)); + + BackgroundFetchUpdateEvent* event = BackgroundFetchUpdateEvent::Create( + EventTypeNames::backgroundfetched, init, unique_id, script_state, observer, worker_global_scope_->registration()); WorkerGlobalScope()->DispatchExtendableEvent(event, observer);
diff --git a/third_party/blink/renderer/modules/webgl/PRESUBMIT.py b/third_party/blink/renderer/modules/webgl/PRESUBMIT.py index 3b79814..ca8282a 100644 --- a/third_party/blink/renderer/modules/webgl/PRESUBMIT.py +++ b/third_party/blink/renderer/modules/webgl/PRESUBMIT.py
@@ -21,6 +21,6 @@ cl, ['luci.chromium.try:linux_optional_gpu_tests_rel', 'luci.chromium.try:mac_optional_gpu_tests_rel', - 'master.tryserver.chromium.win:win_optional_gpu_tests_rel', + 'luci.chromium.try:win_optional_gpu_tests_rel', 'luci.chromium.try:android_optional_gpu_tests_rel'], 'Automatically added optional GPU tests to run on CQ.')
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 819246c..480a52b 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1025,10 +1025,17 @@ name: "RTCRtpSenderParameters", status: "experimental", }, + // Enables the use of |RTCConfiguration::sdpSemantics| to override the + // default SDP semantics at RTCPeerConnection construction. { name: "RTCUnifiedPlan", status: "experimental", }, + // Overrides the default SDP semantics to be Unified Plan at + // RTCPeerConnection construction (unless otherwise specified). + { + name: "RTCUnifiedPlanByDefault", + }, { name: "ScriptedSpeech", status: "stable",
diff --git a/third_party/blink/renderer/platform/scheduler/child/worker_global_scope_scheduler.cc b/third_party/blink/renderer/platform/scheduler/child/worker_global_scope_scheduler.cc index b80437b..891a95f 100644 --- a/third_party/blink/renderer/platform/scheduler/child/worker_global_scope_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/child/worker_global_scope_scheduler.cc
@@ -70,6 +70,7 @@ case TaskType::kInternalIPC: case TaskType::kInternalUserInteraction: case TaskType::kInternalInspector: + case TaskType::kInternalAnimation: // UnthrottledTaskRunner is generally discouraged in future. // TODO(nhiroki): Identify which tasks can be throttled / suspendable and // move them into other task runners. See also comments in
diff --git a/third_party/blink/renderer/platform/scheduler/child/worker_scheduler_proxy_unittest.cc b/third_party/blink/renderer/platform/scheduler/child/worker_scheduler_proxy_unittest.cc index 54b1b04d..ebd392f 100644 --- a/third_party/blink/renderer/platform/scheduler/child/worker_scheduler_proxy_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/child/worker_scheduler_proxy_unittest.cc
@@ -86,14 +86,14 @@ WorkerSchedulerProxyTest() : mock_main_thread_task_runner_( new cc::OrderedSimpleTaskRunner(&clock_, true)), - renderer_scheduler_(std::make_unique<RendererSchedulerImpl>( + main_thread_scheduler_(std::make_unique<MainThreadSchedulerImpl>( TaskQueueManagerForTest::Create(nullptr, mock_main_thread_task_runner_, &clock_), base::nullopt)), page_scheduler_( std::make_unique<PageSchedulerImpl>(nullptr, - renderer_scheduler_.get(), + main_thread_scheduler_.get(), false)), frame_scheduler_(page_scheduler_->CreateFrameSchedulerImpl( nullptr, @@ -102,14 +102,14 @@ ~WorkerSchedulerProxyTest() { frame_scheduler_.reset(); page_scheduler_.reset(); - renderer_scheduler_->Shutdown(); + main_thread_scheduler_->Shutdown(); } protected: base::SimpleTestTickClock clock_; scoped_refptr<cc::OrderedSimpleTaskRunner> mock_main_thread_task_runner_; - std::unique_ptr<RendererSchedulerImpl> renderer_scheduler_; + std::unique_ptr<MainThreadSchedulerImpl> main_thread_scheduler_; std::unique_ptr<PageSchedulerImpl> page_scheduler_; std::unique_ptr<FrameSchedulerImpl> frame_scheduler_; };
diff --git a/third_party/blink/renderer/platform/scheduler/common/throttling/budget_pool_unittest.cc b/third_party/blink/renderer/platform/scheduler/common/throttling/budget_pool_unittest.cc index e4284f0e..09b4f14 100644 --- a/third_party/blink/renderer/platform/scheduler/common/throttling/budget_pool_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/common/throttling/budget_pool_unittest.cc
@@ -33,7 +33,7 @@ clock_.Advance(base::TimeDelta::FromMicroseconds(5000)); mock_task_runner_ = base::MakeRefCounted<cc::OrderedSimpleTaskRunner>(&clock_, true); - scheduler_.reset(new RendererSchedulerImpl( + scheduler_.reset(new MainThreadSchedulerImpl( TaskQueueManagerForTest::Create(nullptr, mock_task_runner_, &clock_), base::nullopt)); task_queue_throttler_ = scheduler_->task_queue_throttler(); @@ -56,7 +56,7 @@ protected: base::SimpleTestTickClock clock_; scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; - std::unique_ptr<RendererSchedulerImpl> scheduler_; + std::unique_ptr<MainThreadSchedulerImpl> scheduler_; TaskQueueThrottler* task_queue_throttler_; // NOT OWNED base::TimeTicks start_time_;
diff --git a/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler.cc b/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler.cc index 8f69afa..e6d2c4c 100644 --- a/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler.cc +++ b/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler.cc
@@ -63,12 +63,12 @@ } // namespace TaskQueueThrottler::TaskQueueThrottler( - RendererSchedulerImpl* renderer_scheduler, + MainThreadSchedulerImpl* main_thread_scheduler, TraceableVariableController* tracing_controller) - : control_task_queue_(renderer_scheduler->ControlTaskQueue()), - renderer_scheduler_(renderer_scheduler), + : control_task_queue_(main_thread_scheduler->ControlTaskQueue()), + main_thread_scheduler_(main_thread_scheduler), tracing_controller_(tracing_controller), - tick_clock_(renderer_scheduler->tick_clock()), + tick_clock_(main_thread_scheduler->tick_clock()), time_domain_(new ThrottledTimeDomain()), allow_throttling_(true), weak_factory_(this) { @@ -78,7 +78,7 @@ base::BindRepeating(&TaskQueueThrottler::OnQueueNextWakeUpChanged, weak_factory_.GetWeakPtr()); - renderer_scheduler_->RegisterTimeDomain(time_domain_.get()); + main_thread_scheduler_->RegisterTimeDomain(time_domain_.get()); } TaskQueueThrottler::~TaskQueueThrottler() { @@ -87,14 +87,14 @@ for (const TaskQueueMap::value_type& map_entry : queue_details_) { TaskQueue* task_queue = map_entry.first; if (IsThrottled(task_queue)) { - task_queue->SetTimeDomain(renderer_scheduler_->GetActiveTimeDomain()); + task_queue->SetTimeDomain(main_thread_scheduler_->GetActiveTimeDomain()); task_queue->RemoveFence(); } if (map_entry.second.throttling_ref_count != 0) task_queue->SetObserver(nullptr); } - renderer_scheduler_->UnregisterTimeDomain(time_domain_.get()); + main_thread_scheduler_->UnregisterTimeDomain(time_domain_.get()); } void TaskQueueThrottler::IncreaseThrottleRefCount(TaskQueue* task_queue) { @@ -151,7 +151,7 @@ if (!allow_throttling_) return; - task_queue->SetTimeDomain(renderer_scheduler_->GetActiveTimeDomain()); + task_queue->SetTimeDomain(main_thread_scheduler_->GetActiveTimeDomain()); task_queue->RemoveFence(); } @@ -172,7 +172,7 @@ // Reset a time domain reference to a valid domain, otherwise it's possible // to get a stale reference when deleting queue. - task_queue->SetTimeDomain(renderer_scheduler_->GetActiveTimeDomain()); + task_queue->SetTimeDomain(main_thread_scheduler_->GetActiveTimeDomain()); task_queue->RemoveFence(); std::unordered_set<BudgetPool*> budget_pools = find_it->second.budget_pools; @@ -540,7 +540,7 @@ TaskQueue* queue = map_entry.first; - queue->SetTimeDomain(renderer_scheduler_->GetActiveTimeDomain()); + queue->SetTimeDomain(main_thread_scheduler_->GetActiveTimeDomain()); queue->RemoveFence(); }
diff --git a/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler.h b/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler.h index 09d05313..ce3a9dd 100644 --- a/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler.h +++ b/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler.h
@@ -31,7 +31,7 @@ namespace scheduler { class BudgetPool; -class RendererSchedulerImpl; +class MainThreadSchedulerImpl; class ThrottledTimeDomain; class CPUTimeBudgetPool; class WakeUpBudgetPool; @@ -80,7 +80,7 @@ // posted from a throttled task run next time the queue is pumped. // // Of course the TaskQueueThrottler isn't the only sub-system that wants to -// enable or disable queues. E.g. RendererSchedulerImpl also does this for +// enable or disable queues. E.g. MainThreadSchedulerImpl also does this for // policy reasons. To prevent the systems from fighting, clients of // TaskQueueThrottler must use SetQueueEnabled rather than calling the function // directly on the queue. @@ -94,9 +94,9 @@ class PLATFORM_EXPORT TaskQueueThrottler : public TaskQueue::Observer, public BudgetPoolController { public: - // We use tracing controller from RendererSchedulerImpl because an instance + // We use tracing controller from MainThreadSchedulerImpl because an instance // of this class is always its member, so has the same lifetime. - TaskQueueThrottler(RendererSchedulerImpl* renderer_scheduler, + TaskQueueThrottler(MainThreadSchedulerImpl* main_thread_scheduler, TraceableVariableController* tracing_controller); ~TaskQueueThrottler() override; @@ -200,7 +200,7 @@ base::RepeatingCallback<void(TaskQueue*, base::TimeTicks)> forward_immediate_work_callback_; scoped_refptr<TaskQueue> control_task_queue_; - RendererSchedulerImpl* renderer_scheduler_; // NOT OWNED + MainThreadSchedulerImpl* main_thread_scheduler_; // NOT OWNED TraceableVariableController* tracing_controller_; // NOT OWNED const base::TickClock* tick_clock_; // NOT OWNED std::unique_ptr<ThrottledTimeDomain> time_domain_;
diff --git a/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler_unittest.cc b/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler_unittest.cc index c05953c..e42954215 100644 --- a/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler_unittest.cc
@@ -80,10 +80,10 @@ clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); mock_task_runner_ = base::MakeRefCounted<cc::OrderedSimpleTaskRunner>(clock_.get(), true); - scheduler_.reset( - new RendererSchedulerImpl(TaskQueueManagerForTest::Create( - nullptr, mock_task_runner_, clock_.get()), - base::nullopt)); + scheduler_.reset(new MainThreadSchedulerImpl( + TaskQueueManagerForTest::Create(nullptr, mock_task_runner_, + clock_.get()), + base::nullopt)); task_queue_throttler_ = scheduler_->task_queue_throttler(); timer_queue_ = scheduler_->NewTimerTaskQueue( MainThreadTaskQueue::QueueType::kFrameThrottleable); @@ -133,7 +133,7 @@ std::unique_ptr<AutoAdvancingTestClock> clock_; scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; - std::unique_ptr<RendererSchedulerImpl> scheduler_; + std::unique_ptr<MainThreadSchedulerImpl> scheduler_; scoped_refptr<TaskQueue> timer_queue_; TaskQueueThrottler* task_queue_throttler_; // NOT OWNED @@ -558,7 +558,7 @@ timer_queue_->PostTask(FROM_HERE, base::BindOnce(&NopTask)); scheduler_->EnableVirtualTime( - RendererSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); + MainThreadSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); EXPECT_EQ(timer_queue_->GetTimeDomain(), scheduler_->GetVirtualTimeDomain()); EXPECT_FALSE(IsQueueBlocked(timer_queue_.get())); @@ -576,7 +576,7 @@ EXPECT_TRUE(IsQueueBlocked(timer_queue_.get())); scheduler_->EnableVirtualTime( - RendererSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); + MainThreadSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); EXPECT_FALSE(IsQueueBlocked(timer_queue_.get())); EXPECT_EQ(timer_queue_->GetTimeDomain(), scheduler_->GetVirtualTimeDomain()); }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc index 2667183..11f92d93 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
@@ -84,12 +84,12 @@ } FrameSchedulerImpl::FrameSchedulerImpl( - RendererSchedulerImpl* renderer_scheduler, + MainThreadSchedulerImpl* main_thread_scheduler, PageSchedulerImpl* parent_page_scheduler, base::trace_event::BlameContext* blame_context, FrameScheduler::FrameType frame_type) : frame_type_(frame_type), - renderer_scheduler_(renderer_scheduler), + main_thread_scheduler_(main_thread_scheduler), parent_page_scheduler_(parent_page_scheduler), blame_context_(blame_context), throttling_state_(FrameScheduler::ThrottlingState::kNotThrottled), @@ -108,7 +108,7 @@ this, &tracing_controller_, FrozenStateToString), - keep_active_(renderer_scheduler->SchedulerKeepActive(), + keep_active_(main_thread_scheduler->SchedulerKeepActive(), "FrameScheduler.KeepActive", this, &tracing_controller_, @@ -146,7 +146,7 @@ void CleanUpQueue(MainThreadTaskQueue* queue) { if (!queue) return; - queue->DetachFromRendererScheduler(); + queue->DetachFromMainThreadScheduler(); queue->SetFrameScheduler(nullptr); queue->SetBlameContext(nullptr); queue->SetQueuePriority(TaskQueue::QueuePriority::kLowPriority); @@ -194,8 +194,9 @@ if (!time_budget_pool) return; - time_budget_pool->RemoveQueue(renderer_scheduler_->tick_clock()->NowTicks(), - throttleable_task_queue_.get()); + time_budget_pool->RemoveQueue( + main_thread_scheduler_->tick_clock()->NowTicks(), + throttleable_task_queue_.get()); } std::unique_ptr<FrameScheduler::ThrottlingObserverHandle> @@ -300,6 +301,7 @@ case TaskType::kInternalMedia: case TaskType::kInternalMediaRealTime: case TaskType::kInternalUserInteraction: + case TaskType::kInternalAnimation: return TaskRunnerImpl::Create(PausableTaskQueue(), type); case TaskType::kUnthrottled: case TaskType::kInternalTest: @@ -322,7 +324,7 @@ DCHECK(parent_page_scheduler_); if (!loading_task_queue_) { // TODO(panicker): Avoid adding this queue in RS task_runners_. - loading_task_queue_ = renderer_scheduler_->NewLoadingTaskQueue( + loading_task_queue_ = main_thread_scheduler_->NewLoadingTaskQueue( MainThreadTaskQueue::QueueType::kFrameLoading); loading_task_queue_->SetBlameContext(blame_context_); loading_task_queue_->SetFrameScheduler(this); @@ -336,7 +338,7 @@ scoped_refptr<TaskQueue> FrameSchedulerImpl::LoadingControlTaskQueue() { DCHECK(parent_page_scheduler_); if (!loading_control_task_queue_) { - loading_control_task_queue_ = renderer_scheduler_->NewLoadingTaskQueue( + loading_control_task_queue_ = main_thread_scheduler_->NewLoadingTaskQueue( MainThreadTaskQueue::QueueType::kFrameLoadingControl); loading_control_task_queue_->SetBlameContext(blame_context_); loading_control_task_queue_->SetFrameScheduler(this); @@ -351,7 +353,7 @@ DCHECK(parent_page_scheduler_); if (!throttleable_task_queue_) { // TODO(panicker): Avoid adding this queue in RS task_runners_. - throttleable_task_queue_ = renderer_scheduler_->NewTaskQueue( + throttleable_task_queue_ = main_thread_scheduler_->NewTaskQueue( MainThreadTaskQueue::QueueCreationParams( MainThreadTaskQueue::QueueType::kFrameThrottleable) .SetCanBeThrottled(true) @@ -368,8 +370,9 @@ CPUTimeBudgetPool* time_budget_pool = parent_page_scheduler_->BackgroundCPUTimeBudgetPool(); if (time_budget_pool) { - time_budget_pool->AddQueue(renderer_scheduler_->tick_clock()->NowTicks(), - throttleable_task_queue_.get()); + time_budget_pool->AddQueue( + main_thread_scheduler_->tick_clock()->NowTicks(), + throttleable_task_queue_.get()); } UpdateTaskQueueThrottling(); } @@ -379,7 +382,7 @@ scoped_refptr<TaskQueue> FrameSchedulerImpl::DeferrableTaskQueue() { DCHECK(parent_page_scheduler_); if (!deferrable_task_queue_) { - deferrable_task_queue_ = renderer_scheduler_->NewTaskQueue( + deferrable_task_queue_ = main_thread_scheduler_->NewTaskQueue( MainThreadTaskQueue::QueueCreationParams( MainThreadTaskQueue::QueueType::kFrameDeferrable) .SetCanBeDeferred(true) @@ -398,7 +401,7 @@ scoped_refptr<TaskQueue> FrameSchedulerImpl::PausableTaskQueue() { DCHECK(parent_page_scheduler_); if (!pausable_task_queue_) { - pausable_task_queue_ = renderer_scheduler_->NewTaskQueue( + pausable_task_queue_ = main_thread_scheduler_->NewTaskQueue( MainThreadTaskQueue::QueueCreationParams( MainThreadTaskQueue::QueueType::kFramePausable) .SetCanBeStopped( @@ -416,7 +419,7 @@ scoped_refptr<TaskQueue> FrameSchedulerImpl::UnpausableTaskQueue() { DCHECK(parent_page_scheduler_); if (!unpausable_task_queue_) { - unpausable_task_queue_ = renderer_scheduler_->NewTaskQueue( + unpausable_task_queue_ = main_thread_scheduler_->NewTaskQueue( MainThreadTaskQueue::QueueCreationParams( MainThreadTaskQueue::QueueType::kFrameUnpausable)); unpausable_task_queue_->SetBlameContext(blame_context_); @@ -427,7 +430,7 @@ scoped_refptr<TaskQueue> FrameSchedulerImpl::ControlTaskQueue() { DCHECK(parent_page_scheduler_); - return renderer_scheduler_->ControlTaskQueue(); + return main_thread_scheduler_->ControlTaskQueue(); } blink::PageScheduler* FrameSchedulerImpl::GetPageScheduler() const { @@ -435,21 +438,21 @@ } void FrameSchedulerImpl::DidStartProvisionalLoad(bool is_main_frame) { - renderer_scheduler_->DidStartProvisionalLoad(is_main_frame); + main_thread_scheduler_->DidStartProvisionalLoad(is_main_frame); } void FrameSchedulerImpl::DidCommitProvisionalLoad( bool is_web_history_inert_commit, bool is_reload, bool is_main_frame) { - renderer_scheduler_->DidCommitProvisionalLoad(is_web_history_inert_commit, - is_reload, is_main_frame); + main_thread_scheduler_->DidCommitProvisionalLoad(is_web_history_inert_commit, + is_reload, is_main_frame); } WebScopedVirtualTimePauser FrameSchedulerImpl::CreateWebScopedVirtualTimePauser( const WTF::String& name, WebScopedVirtualTimePauser::VirtualTaskDuration duration) { - return WebScopedVirtualTimePauser(renderer_scheduler_, duration, name); + return WebScopedVirtualTimePauser(main_thread_scheduler_, duration, name); } void FrameSchedulerImpl::DidOpenActiveConnection() { @@ -596,7 +599,7 @@ } void FrameSchedulerImpl::OnFirstMeaningfulPaint() { - renderer_scheduler_->OnFirstMeaningfulPaint(); + main_thread_scheduler_->OnFirstMeaningfulPaint(); } std::unique_ptr<FrameScheduler::ActiveConnectionHandle> @@ -624,10 +627,10 @@ task_queue_throttled_ = should_throttle; if (should_throttle) { - renderer_scheduler_->task_queue_throttler()->IncreaseThrottleRefCount( + main_thread_scheduler_->task_queue_throttler()->IncreaseThrottleRefCount( throttleable_task_queue_.get()); } else { - renderer_scheduler_->task_queue_throttler()->DecreaseThrottleRefCount( + main_thread_scheduler_->task_queue_throttler()->DecreaseThrottleRefCount( throttleable_task_queue_.get()); } }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h index 6d49dff..91df102 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h
@@ -29,13 +29,13 @@ namespace blink { namespace scheduler { +class MainThreadSchedulerImpl; class MainThreadTaskQueue; class PageSchedulerImpl; -class RendererSchedulerImpl; class TaskQueue; -namespace renderer_scheduler_impl_unittest { -class RendererSchedulerImplTest; +namespace main_thread_scheduler_impl_unittest { +class MainThreadSchedulerImplTest; } namespace frame_scheduler_impl_unittest { @@ -48,7 +48,7 @@ class PLATFORM_EXPORT FrameSchedulerImpl : public FrameScheduler { public: - FrameSchedulerImpl(RendererSchedulerImpl* renderer_scheduler, + FrameSchedulerImpl(MainThreadSchedulerImpl* main_thread_scheduler, PageSchedulerImpl* parent_page_scheduler, base::trace_event::BlameContext* blame_context, FrameScheduler::FrameType frame_type); @@ -93,7 +93,7 @@ private: friend class PageSchedulerImpl; - friend class renderer_scheduler_impl_unittest::RendererSchedulerImplTest; + friend class main_thread_scheduler_impl_unittest::MainThreadSchedulerImplTest; friend class frame_scheduler_impl_unittest::FrameSchedulerImplTest; friend class page_scheduler_impl_unittest::PageSchedulerImplTest; @@ -161,7 +161,7 @@ throttleable_queue_enabled_voter_; std::unique_ptr<TaskQueue::QueueEnabledVoter> deferrable_queue_enabled_voter_; std::unique_ptr<TaskQueue::QueueEnabledVoter> pausable_queue_enabled_voter_; - RendererSchedulerImpl* renderer_scheduler_; // NOT OWNED + MainThreadSchedulerImpl* main_thread_scheduler_; // NOT OWNED PageSchedulerImpl* parent_page_scheduler_; // NOT OWNED base::trace_event::BlameContext* blame_context_; // NOT OWNED std::set<Observer*> loader_observers_; // NOT OWNED
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc index 0f1e42a..763ac9e 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc
@@ -32,7 +32,7 @@ clock_.Advance(base::TimeDelta::FromMicroseconds(5000)); mock_task_runner_ = base::MakeRefCounted<cc::OrderedSimpleTaskRunner>(&clock_, true); - scheduler_.reset(new RendererSchedulerImpl( + scheduler_.reset(new MainThreadSchedulerImpl( TaskQueueManagerForTest::Create(nullptr, mock_task_runner_, &clock_), base::nullopt)); page_scheduler_.reset( @@ -87,7 +87,7 @@ base::SimpleTestTickClock clock_; scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; - std::unique_ptr<RendererSchedulerImpl> scheduler_; + std::unique_ptr<MainThreadSchedulerImpl> scheduler_; std::unique_ptr<PageSchedulerImpl> page_scheduler_; std::unique_ptr<FrameSchedulerImpl> frame_scheduler_; };
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_helper.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_helper.cc index db2c9ee..93df1b7d 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_helper.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_helper.cc
@@ -11,9 +11,9 @@ MainThreadSchedulerHelper::MainThreadSchedulerHelper( std::unique_ptr<TaskQueueManager> task_queue_manager, - RendererSchedulerImpl* renderer_scheduler) + MainThreadSchedulerImpl* main_thread_scheduler) : SchedulerHelper(std::move(task_queue_manager)), - renderer_scheduler_(renderer_scheduler), + main_thread_scheduler_(main_thread_scheduler), default_task_queue_( NewTaskQueue(MainThreadTaskQueue::QueueCreationParams( MainThreadTaskQueue::QueueType::kDefault) @@ -54,7 +54,7 @@ const MainThreadTaskQueue::QueueCreationParams& params) { scoped_refptr<MainThreadTaskQueue> task_queue = task_queue_manager_->CreateTaskQueue<MainThreadTaskQueue>( - params.spec, params, renderer_scheduler_); + params.spec, params, main_thread_scheduler_); if (params.used_for_important_tasks) task_queue->SetQueuePriority(TaskQueue::QueuePriority::kHighestPriority); return task_queue;
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_helper.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_helper.h index fac3e38..f82acb3 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_helper.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_helper.h
@@ -12,13 +12,13 @@ namespace blink { namespace scheduler { -class RendererSchedulerImpl; +class MainThreadSchedulerImpl; class PLATFORM_EXPORT MainThreadSchedulerHelper : public SchedulerHelper { public: MainThreadSchedulerHelper( std::unique_ptr<TaskQueueManager> task_queue_manager, - RendererSchedulerImpl* renderer_scheduler); + MainThreadSchedulerImpl* main_thread_scheduler); ~MainThreadSchedulerHelper() override; scoped_refptr<MainThreadTaskQueue> NewTaskQueue( @@ -32,7 +32,7 @@ scoped_refptr<TaskQueue> ControlTaskQueue() override; private: - RendererSchedulerImpl* renderer_scheduler_; // NOT OWNED + MainThreadSchedulerImpl* main_thread_scheduler_; // NOT OWNED const scoped_refptr<MainThreadTaskQueue> default_task_queue_; const scoped_refptr<MainThreadTaskQueue> control_task_queue_;
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc index f5e6788..55d1bb7 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -181,6 +181,8 @@ return "InternalUserInteraction"; case TaskType::kInternalInspector: return "InternalInspector"; + case TaskType::kInternalAnimation: + return "InternalAnimation"; case TaskType::kCount: return "Count"; } @@ -189,7 +191,7 @@ } const char* OptionalTaskDescriptionToString( - base::Optional<RendererSchedulerImpl::TaskDescriptionForTracing> desc) { + base::Optional<MainThreadSchedulerImpl::TaskDescriptionForTracing> desc) { if (!desc) return nullptr; if (desc->task_type != TaskType::kDeprecatedNone) @@ -205,14 +207,14 @@ } // namespace -RendererSchedulerImpl::RendererSchedulerImpl( +MainThreadSchedulerImpl::MainThreadSchedulerImpl( std::unique_ptr<TaskQueueManager> task_queue_manager, base::Optional<base::Time> initial_virtual_time) : helper_(std::move(task_queue_manager), this), idle_helper_( &helper_, this, - "RendererSchedulerIdlePeriod", + "MainThreadSchedulerIdlePeriod", base::TimeDelta(), helper_.NewTaskQueue(MainThreadTaskQueue::QueueCreationParams( MainThreadTaskQueue::QueueType::kIdle))), @@ -235,7 +237,7 @@ input_task_queue_enabled_voter_( input_task_queue_->CreateQueueEnabledVoter()), delayed_update_policy_runner_( - base::BindRepeating(&RendererSchedulerImpl::UpdatePolicy, + base::BindRepeating(&MainThreadSchedulerImpl::UpdatePolicy, base::Unretained(this)), helper_.ControlMainThreadTaskQueue()), seqlock_queueing_time_estimator_( @@ -250,12 +252,12 @@ task_queue_throttler_.reset( new TaskQueueThrottler(this, &tracing_controller_)); update_policy_closure_ = base::BindRepeating( - &RendererSchedulerImpl::UpdatePolicy, weak_factory_.GetWeakPtr()); + &MainThreadSchedulerImpl::UpdatePolicy, weak_factory_.GetWeakPtr()); end_renderer_hidden_idle_period_closure_.Reset(base::BindRepeating( - &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); + &MainThreadSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); // Compositor task queue and default task queue should be managed by - // RendererScheduler. Control task queue should not. + // WebMainThreadScheduler. Control task queue should not. task_runners_.insert( std::make_pair(helper_.DefaultMainThreadTaskQueue(), nullptr)); task_runners_.insert( @@ -270,7 +272,7 @@ MainThreadTaskQueue::QueueType::kIPC)); TRACE_EVENT_OBJECT_CREATED_WITH_ID( - TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", + TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "MainThreadScheduler", this); helper_.SetObserver(this); @@ -307,9 +309,9 @@ } } -RendererSchedulerImpl::~RendererSchedulerImpl() { +MainThreadSchedulerImpl::~MainThreadSchedulerImpl() { TRACE_EVENT_OBJECT_DELETED_WITH_ID( - TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", + TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "MainThreadScheduler", this); for (auto& pair : task_runners_) { @@ -346,8 +348,8 @@ DCHECK(was_shutdown_); } -RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( - RendererSchedulerImpl* renderer_scheduler_impl, +MainThreadSchedulerImpl::MainThreadOnly::MainThreadOnly( + MainThreadSchedulerImpl* main_thread_scheduler_impl, const scoped_refptr<MainThreadTaskQueue>& compositor_task_runner, const base::TickClock* time_source, base::TimeTicks now) @@ -362,163 +364,168 @@ kShortIdlePeriodDurationSampleCount, kShortIdlePeriodDurationPercentile), current_use_case(UseCase::kNone, - "RendererScheduler.UseCase", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.UseCase", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, UseCaseToString), longest_jank_free_task_duration( base::TimeDelta(), - "RendererScheduler.LongestJankFreeTaskDuration", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.LongestJankFreeTaskDuration", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, TimeDeltaToMilliseconds), renderer_pause_count(0, - "RendererScheduler.PauseCount", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_), + "MainThreadScheduler.PauseCount", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_), navigation_task_expected_count( 0, - "RendererScheduler.NavigationTaskExpectedCount", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_), + "MainThreadScheduler.NavigationTaskExpectedCount", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_), expensive_task_policy(ExpensiveTaskPolicy::kRun, - "RendererScheduler.ExpensiveTaskPolicy", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.ExpensiveTaskPolicy", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, ExpensiveTaskPolicyToString), rail_mode_for_tracing(current_policy.rail_mode(), - "RendererScheduler.RAILMode", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.RAILMode", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, RAILModeToString), renderer_hidden(false, - "RendererScheduler.Hidden", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.Hidden", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, HiddenStateToString), renderer_backgrounded(kLaunchingProcessIsBackgrounded, "RendererVisibility", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, BackgroundStateToString), - keep_active_fetch_or_worker(false, - "RendererScheduler.KeepRendererActive", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, - YesNoStateToString), + keep_active_fetch_or_worker( + false, + "MainThreadScheduler.KeepRendererActive", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, + YesNoStateToString), stopping_when_backgrounded_enabled( false, - "RendererScheduler.StoppingWhenBackgroundedEnabled", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.StoppingWhenBackgroundedEnabled", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), - stopped_when_backgrounded(false, - "RendererScheduler.StoppedWhenBackgrounded", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, - YesNoStateToString), + stopped_when_backgrounded( + false, + "MainThreadScheduler.StoppedWhenBackgrounded", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, + YesNoStateToString), loading_task_estimated_cost( base::TimeDelta(), - "RendererScheduler.LoadingTaskEstimatedCostMs", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.LoadingTaskEstimatedCostMs", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, TimeDeltaToMilliseconds), - timer_task_estimated_cost(base::TimeDelta(), - "RendererScheduler.TimerTaskEstimatedCostMs", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, - TimeDeltaToMilliseconds), + timer_task_estimated_cost( + base::TimeDelta(), + "MainThreadScheduler.TimerTaskEstimatedCostMs", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, + TimeDeltaToMilliseconds), loading_tasks_seem_expensive( false, - "RendererScheduler.LoadingTasksSeemExpensive", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.LoadingTasksSeemExpensive", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), - timer_tasks_seem_expensive(false, - "RendererScheduler.TimerTasksSeemExpensive", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, - YesNoStateToString), + timer_tasks_seem_expensive( + false, + "MainThreadScheduler.TimerTasksSeemExpensive", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, + YesNoStateToString), touchstart_expected_soon(false, - "RendererScheduler.TouchstartExpectedSoon", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.TouchstartExpectedSoon", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), have_seen_a_begin_main_frame( false, - "RendererScheduler.HasSeenBeginMainFrame", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.HasSeenBeginMainFrame", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), have_reported_blocking_intervention_in_current_policy( false, - "RendererScheduler.HasReportedBlockingInterventionInCurrentPolicy", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.HasReportedBlockingInterventionInCurrentPolicy", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), have_reported_blocking_intervention_since_navigation( false, - "RendererScheduler.HasReportedBlockingInterventionSinceNavigation", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.HasReportedBlockingInterventionSinceNavigation", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), has_visible_render_widget_with_touch_handler( false, - "RendererScheduler.HasVisibleRenderWidgetWithTouchHandler", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.HasVisibleRenderWidgetWithTouchHandler", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), begin_frame_not_expected_soon( false, - "RendererScheduler.BeginFrameNotExpectedSoon", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.BeginFrameNotExpectedSoon", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), - in_idle_period_for_testing(false, - "RendererScheduler.InIdlePeriod", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, - YesNoStateToString), + in_idle_period_for_testing( + false, + "MainThreadScheduler.InIdlePeriod", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, + YesNoStateToString), use_virtual_time(false, - "RendererScheduler.UseVirtualTime", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.UseVirtualTime", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), is_audio_playing(false, "RendererAudioState", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, AudioPlayingStateToString), compositor_will_send_main_frame_not_expected( false, - "RendererScheduler.CompositorWillSendMainFrameNotExpected", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.CompositorWillSendMainFrameNotExpected", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), has_navigated(false, - "RendererScheduler.HasNavigated", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.HasNavigated", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), pause_timers_for_webview(false, - "RendererScheduler.PauseTimersForWebview", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.PauseTimersForWebview", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), background_status_changed_at(now), rail_mode_observer(nullptr), wake_up_budget_pool(nullptr), - metrics_helper(renderer_scheduler_impl, now, renderer_backgrounded), + metrics_helper(main_thread_scheduler_impl, now, renderer_backgrounded), process_type(RendererProcessType::kRenderer, "RendererProcessType", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, RendererProcessTypeToString), task_description_for_tracing( base::nullopt, - "RendererScheduler.MainThreadTask", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.MainThreadTask", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, OptionalTaskDescriptionToString), virtual_time_policy(VirtualTimePolicy::kAdvance), virtual_time_pause_count(0), @@ -527,76 +534,78 @@ nested_runloop(false), uniform_distribution(0.0f, 1.0f) {} -RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() = default; +MainThreadSchedulerImpl::MainThreadOnly::~MainThreadOnly() = default; -RendererSchedulerImpl::AnyThread::AnyThread( - RendererSchedulerImpl* renderer_scheduler_impl) +MainThreadSchedulerImpl::AnyThread::AnyThread( + MainThreadSchedulerImpl* main_thread_scheduler_impl) : awaiting_touch_start_response( false, - "RendererScheduler.AwaitingTouchstartResponse", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.AwaitingTouchstartResponse", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), in_idle_period(false, - "RendererScheduler.InIdlePeriod", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.InIdlePeriod", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), begin_main_frame_on_critical_path( false, - "RendererScheduler.BeginMainFrameOnCriticalPath", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.BeginMainFrameOnCriticalPath", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), last_gesture_was_compositor_driven( false, - "RendererScheduler.LastGestureWasCompositorDriven", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.LastGestureWasCompositorDriven", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), - default_gesture_prevented(true, - "RendererScheduler.DefaultGesturePrevented", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, - YesNoStateToString), + default_gesture_prevented( + true, + "MainThreadScheduler.DefaultGesturePrevented", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, + YesNoStateToString), have_seen_a_potentially_blocking_gesture( false, - "RendererScheduler.HaveSeenPotentiallyBlockingGesture", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.HaveSeenPotentiallyBlockingGesture", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), waiting_for_meaningful_paint( false, - "RendererScheduler.WaitingForMeaningfulPaint", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.WaitingForMeaningfulPaint", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), have_seen_input_since_navigation( false, - "RendererScheduler.HaveSeenInputSinceNavigation", - renderer_scheduler_impl, - &renderer_scheduler_impl->tracing_controller_, + "MainThreadScheduler.HaveSeenInputSinceNavigation", + main_thread_scheduler_impl, + &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString) {} -RendererSchedulerImpl::AnyThread::~AnyThread() = default; +MainThreadSchedulerImpl::AnyThread::~AnyThread() = default; -RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly() +MainThreadSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly() : last_input_type(blink::WebInputEvent::kUndefined), main_thread_seems_unresponsive(false) {} -RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() = default; +MainThreadSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() = + default; -RendererSchedulerImpl::RendererPauseHandleImpl::RendererPauseHandleImpl( - RendererSchedulerImpl* scheduler) +MainThreadSchedulerImpl::RendererPauseHandleImpl::RendererPauseHandleImpl( + MainThreadSchedulerImpl* scheduler) : scheduler_(scheduler) { scheduler_->PauseRendererImpl(); } -RendererSchedulerImpl::RendererPauseHandleImpl::~RendererPauseHandleImpl() { +MainThreadSchedulerImpl::RendererPauseHandleImpl::~RendererPauseHandleImpl() { scheduler_->ResumeRendererImpl(); } -void RendererSchedulerImpl::Shutdown() { +void MainThreadSchedulerImpl::Shutdown() { if (was_shutdown_) return; @@ -610,69 +619,69 @@ was_shutdown_ = true; } -std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() { +std::unique_ptr<blink::WebThread> MainThreadSchedulerImpl::CreateMainThread() { return std::make_unique<WebThreadImplForRendererScheduler>(this); } scoped_refptr<base::SingleThreadTaskRunner> -RendererSchedulerImpl::DefaultTaskRunner() { +MainThreadSchedulerImpl::DefaultTaskRunner() { return helper_.DefaultMainThreadTaskQueue(); } scoped_refptr<base::SingleThreadTaskRunner> -RendererSchedulerImpl::CompositorTaskRunner() { +MainThreadSchedulerImpl::CompositorTaskRunner() { helper_.CheckOnValidThread(); return compositor_task_queue_; } scoped_refptr<base::SingleThreadTaskRunner> -RendererSchedulerImpl::InputTaskRunner() { +MainThreadSchedulerImpl::InputTaskRunner() { helper_.CheckOnValidThread(); return input_task_queue_; } scoped_refptr<SingleThreadIdleTaskRunner> -RendererSchedulerImpl::IdleTaskRunner() { +MainThreadSchedulerImpl::IdleTaskRunner() { return idle_helper_.IdleTaskRunner(); } scoped_refptr<base::SingleThreadTaskRunner> -RendererSchedulerImpl::IPCTaskRunner() { +MainThreadSchedulerImpl::IPCTaskRunner() { return ipc_task_queue_; } -scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::DefaultTaskQueue() { +scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerImpl::DefaultTaskQueue() { return helper_.DefaultMainThreadTaskQueue(); } scoped_refptr<MainThreadTaskQueue> -RendererSchedulerImpl::CompositorTaskQueue() { +MainThreadSchedulerImpl::CompositorTaskQueue() { helper_.CheckOnValidThread(); return compositor_task_queue_; } -scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::InputTaskQueue() { +scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerImpl::InputTaskQueue() { helper_.CheckOnValidThread(); return input_task_queue_; } -scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::V8TaskQueue() { +scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerImpl::V8TaskQueue() { helper_.CheckOnValidThread(); return v8_task_queue_; } -scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::ControlTaskQueue() { +scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerImpl::ControlTaskQueue() { helper_.CheckOnValidThread(); return helper_.ControlMainThreadTaskQueue(); } scoped_refptr<MainThreadTaskQueue> -RendererSchedulerImpl::VirtualTimeControlTaskQueue() { +MainThreadSchedulerImpl::VirtualTimeControlTaskQueue() { helper_.CheckOnValidThread(); return virtual_time_control_task_queue_; } -scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::NewTaskQueue( +scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerImpl::NewTaskQueue( const MainThreadTaskQueue::QueueCreationParams& params) { helper_.CheckOnValidThread(); scoped_refptr<MainThreadTaskQueue> task_queue(helper_.NewTaskQueue(params)); @@ -710,7 +719,7 @@ return task_queue; } -scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::NewLoadingTaskQueue( +scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerImpl::NewLoadingTaskQueue( MainThreadTaskQueue::QueueType queue_type) { DCHECK_EQ(MainThreadTaskQueue::QueueClassForQueueType(queue_type), MainThreadTaskQueue::QueueClass::kLoading); @@ -725,7 +734,7 @@ MainThreadTaskQueue::QueueType::kFrameLoadingControl)); } -scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::NewTimerTaskQueue( +scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerImpl::NewTimerTaskQueue( MainThreadTaskQueue::QueueType queue_type) { DCHECK_EQ(MainThreadTaskQueue::QueueClassForQueueType(queue_type), MainThreadTaskQueue::QueueClass::kTimer); @@ -737,11 +746,11 @@ } std::unique_ptr<WebRenderWidgetSchedulingState> -RendererSchedulerImpl::NewRenderWidgetSchedulingState() { +MainThreadSchedulerImpl::NewRenderWidgetSchedulingState() { return render_widget_scheduler_signals_.NewRenderWidgetSchedulingState(); } -void RendererSchedulerImpl::OnShutdownTaskQueue( +void MainThreadSchedulerImpl::OnShutdownTaskQueue( const scoped_refptr<MainThreadTaskQueue>& task_queue) { if (was_shutdown_) return; @@ -765,23 +774,24 @@ } } -bool RendererSchedulerImpl::CanExceedIdleDeadlineIfRequired() const { +bool MainThreadSchedulerImpl::CanExceedIdleDeadlineIfRequired() const { return idle_helper_.CanExceedIdleDeadlineIfRequired(); } -void RendererSchedulerImpl::AddTaskObserver( +void MainThreadSchedulerImpl::AddTaskObserver( base::MessageLoop::TaskObserver* task_observer) { helper_.AddTaskObserver(task_observer); } -void RendererSchedulerImpl::RemoveTaskObserver( +void MainThreadSchedulerImpl::RemoveTaskObserver( base::MessageLoop::TaskObserver* task_observer) { helper_.RemoveTaskObserver(task_observer); } -void RendererSchedulerImpl::WillBeginFrame(const viz::BeginFrameArgs& args) { +void MainThreadSchedulerImpl::WillBeginFrame(const viz::BeginFrameArgs& args) { TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::WillBeginFrame", "args", args.AsValue()); + "MainThreadSchedulerImpl::WillBeginFrame", "args", + args.AsValue()); helper_.CheckOnValidThread(); if (helper_.IsShutdown()) return; @@ -798,9 +808,9 @@ } } -void RendererSchedulerImpl::DidCommitFrameToCompositor() { +void MainThreadSchedulerImpl::DidCommitFrameToCompositor() { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::DidCommitFrameToCompositor"); + "MainThreadSchedulerImpl::DidCommitFrameToCompositor"); helper_.CheckOnValidThread(); if (helper_.IsShutdown()) return; @@ -817,9 +827,9 @@ main_thread_only().idle_time_estimator.DidCommitFrameToCompositor(); } -void RendererSchedulerImpl::BeginFrameNotExpectedSoon() { +void MainThreadSchedulerImpl::BeginFrameNotExpectedSoon() { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::BeginFrameNotExpectedSoon"); + "MainThreadSchedulerImpl::BeginFrameNotExpectedSoon"); helper_.CheckOnValidThread(); if (helper_.IsShutdown()) return; @@ -832,7 +842,7 @@ } } -void RendererSchedulerImpl::BeginMainFrameNotExpectedUntil( +void MainThreadSchedulerImpl::BeginMainFrameNotExpectedUntil( base::TimeTicks time) { helper_.CheckOnValidThread(); if (helper_.IsShutdown()) @@ -840,7 +850,7 @@ base::TimeTicks now(helper_.NowTicks()); TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::BeginMainFrameNotExpectedUntil", + "MainThreadSchedulerImpl::BeginMainFrameNotExpectedUntil", "time_remaining", (time - now).InMillisecondsF()); if (now < time) { @@ -854,9 +864,9 @@ } } -void RendererSchedulerImpl::SetAllRenderWidgetsHidden(bool hidden) { +void MainThreadSchedulerImpl::SetAllRenderWidgetsHidden(bool hidden) { TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::SetAllRenderWidgetsHidden", "hidden", + "MainThreadSchedulerImpl::SetAllRenderWidgetsHidden", "hidden", hidden); helper_.CheckOnValidThread(); @@ -886,7 +896,7 @@ CreateTraceEventObjectSnapshot(); } -void RendererSchedulerImpl::SetHasVisibleRenderWidgetWithTouchHandler( +void MainThreadSchedulerImpl::SetHasVisibleRenderWidgetWithTouchHandler( bool has_visible_render_widget_with_touch_handler) { helper_.CheckOnValidThread(); if (has_visible_render_widget_with_touch_handler == @@ -900,31 +910,31 @@ UpdatePolicyLocked(UpdateType::kForceUpdate); } -void RendererSchedulerImpl::SetRendererHidden(bool hidden) { +void MainThreadSchedulerImpl::SetRendererHidden(bool hidden) { if (hidden) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::OnRendererHidden"); + "MainThreadSchedulerImpl::OnRendererHidden"); } else { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::OnRendererVisible"); + "MainThreadSchedulerImpl::OnRendererVisible"); } helper_.CheckOnValidThread(); main_thread_only().renderer_hidden = hidden; } -void RendererSchedulerImpl::SetRendererBackgrounded(bool backgrounded) { +void MainThreadSchedulerImpl::SetRendererBackgrounded(bool backgrounded) { helper_.CheckOnValidThread(); if (helper_.IsShutdown() || main_thread_only().renderer_backgrounded == backgrounded) return; if (backgrounded) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::OnRendererBackgrounded"); + "MainThreadSchedulerImpl::OnRendererBackgrounded"); RendererMetricsHelper::RecordBackgroundedTransition( BackgroundedRendererTransition::kBackgrounded); } else { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::OnRendererForegrounded"); + "MainThreadSchedulerImpl::OnRendererForegrounded"); RendererMetricsHelper::RecordBackgroundedTransition( BackgroundedRendererTransition::kForegrounded); } @@ -948,30 +958,30 @@ } } -void RendererSchedulerImpl::SetSchedulerKeepActive(bool keep_active) { +void MainThreadSchedulerImpl::SetSchedulerKeepActive(bool keep_active) { main_thread_only().keep_active_fetch_or_worker = keep_active; for (PageSchedulerImpl* page_scheduler : main_thread_only().page_schedulers) { page_scheduler->SetKeepActive(keep_active); } } -bool RendererSchedulerImpl::SchedulerKeepActive() { +bool MainThreadSchedulerImpl::SchedulerKeepActive() { return main_thread_only().keep_active_fetch_or_worker; } #if defined(OS_ANDROID) -void RendererSchedulerImpl::PauseTimersForAndroidWebView() { +void MainThreadSchedulerImpl::PauseTimersForAndroidWebView() { main_thread_only().pause_timers_for_webview = true; UpdatePolicy(); } -void RendererSchedulerImpl::ResumeTimersForAndroidWebView() { +void MainThreadSchedulerImpl::ResumeTimersForAndroidWebView() { main_thread_only().pause_timers_for_webview = false; UpdatePolicy(); } #endif -void RendererSchedulerImpl::OnAudioStateChanged() { +void MainThreadSchedulerImpl::OnAudioStateChanged() { bool is_audio_playing = false; for (PageSchedulerImpl* page_scheduler : main_thread_only().page_schedulers) { is_audio_playing = is_audio_playing || page_scheduler->IsPlayingAudio(); @@ -986,12 +996,12 @@ UpdatePolicy(); } -std::unique_ptr<RendererSchedulerImpl::RendererPauseHandle> -RendererSchedulerImpl::PauseRenderer() { +std::unique_ptr<MainThreadSchedulerImpl::RendererPauseHandle> +MainThreadSchedulerImpl::PauseRenderer() { return std::make_unique<RendererPauseHandleImpl>(this); } -void RendererSchedulerImpl::PauseRendererImpl() { +void MainThreadSchedulerImpl::PauseRendererImpl() { helper_.CheckOnValidThread(); if (helper_.IsShutdown()) return; @@ -1000,7 +1010,7 @@ UpdatePolicy(); } -void RendererSchedulerImpl::ResumeRendererImpl() { +void MainThreadSchedulerImpl::ResumeRendererImpl() { helper_.CheckOnValidThread(); if (helper_.IsShutdown()) return; @@ -1009,16 +1019,16 @@ UpdatePolicy(); } -void RendererSchedulerImpl::EndIdlePeriod() { +void MainThreadSchedulerImpl::EndIdlePeriod() { if (main_thread_only().in_idle_period_for_testing) return; TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::EndIdlePeriod"); + "MainThreadSchedulerImpl::EndIdlePeriod"); helper_.CheckOnValidThread(); idle_helper_.EndIdlePeriod(); } -void RendererSchedulerImpl::EndIdlePeriodForTesting( +void MainThreadSchedulerImpl::EndIdlePeriodForTesting( const base::Closure& callback, base::TimeTicks time_remaining) { main_thread_only().in_idle_period_for_testing = false; @@ -1026,12 +1036,12 @@ callback.Run(); } -bool RendererSchedulerImpl::PolicyNeedsUpdateForTesting() { +bool MainThreadSchedulerImpl::PolicyNeedsUpdateForTesting() { return policy_may_need_update_.IsSet(); } // static -bool RendererSchedulerImpl::ShouldPrioritizeInputEvent( +bool MainThreadSchedulerImpl::ShouldPrioritizeInputEvent( const blink::WebInputEvent& web_input_event) { // We regard MouseMove events with the left mouse button down as a signal // that the user is doing something requiring a smooth frame rate. @@ -1053,27 +1063,28 @@ return true; } -void RendererSchedulerImpl::DidHandleInputEventOnCompositorThread( +void MainThreadSchedulerImpl::DidHandleInputEventOnCompositorThread( const blink::WebInputEvent& web_input_event, InputEventState event_state) { - TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::DidHandleInputEventOnCompositorThread"); + TRACE_EVENT0( + TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), + "MainThreadSchedulerImpl::DidHandleInputEventOnCompositorThread"); if (!ShouldPrioritizeInputEvent(web_input_event)) return; UpdateForInputEventOnCompositorThread(web_input_event.GetType(), event_state); } -void RendererSchedulerImpl::DidAnimateForInputOnCompositorThread() { +void MainThreadSchedulerImpl::DidAnimateForInputOnCompositorThread() { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::DidAnimateForInputOnCompositorThread"); + "MainThreadSchedulerImpl::DidAnimateForInputOnCompositorThread"); base::AutoLock lock(any_thread_lock_); any_thread().fling_compositor_escalation_deadline = helper_.NowTicks() + base::TimeDelta::FromMilliseconds(kFlingEscalationLimitMillis); } -void RendererSchedulerImpl::UpdateForInputEventOnCompositorThread( +void MainThreadSchedulerImpl::UpdateForInputEventOnCompositorThread( blink::WebInputEvent::Type type, InputEventState input_event_state) { base::AutoLock lock(any_thread_lock_); @@ -1082,7 +1093,7 @@ // TODO(alexclarke): Move WebInputEventTraits where we can access it from here // and record the name rather than the integer representation. TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::UpdateForInputEventOnCompositorThread", + "MainThreadSchedulerImpl::UpdateForInputEventOnCompositorThread", "type", static_cast<int>(type), "input_event_state", InputEventStateToString(input_event_state)); @@ -1189,11 +1200,11 @@ GetCompositorThreadOnly().last_input_type = type; } -void RendererSchedulerImpl::DidHandleInputEventOnMainThread( +void MainThreadSchedulerImpl::DidHandleInputEventOnMainThread( const WebInputEvent& web_input_event, WebInputEventResult result) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::DidHandleInputEventOnMainThread"); + "MainThreadSchedulerImpl::DidHandleInputEventOnMainThread"); helper_.CheckOnValidThread(); if (ShouldPrioritizeInputEvent(web_input_event)) { base::AutoLock lock(any_thread_lock_); @@ -1212,11 +1223,11 @@ } } -base::TimeDelta RendererSchedulerImpl::MostRecentExpectedQueueingTime() { +base::TimeDelta MainThreadSchedulerImpl::MostRecentExpectedQueueingTime() { return main_thread_only().most_recent_expected_queueing_time; } -bool RendererSchedulerImpl::IsHighPriorityWorkAnticipated() { +bool MainThreadSchedulerImpl::IsHighPriorityWorkAnticipated() { helper_.CheckOnValidThread(); if (helper_.IsShutdown()) return false; @@ -1232,7 +1243,7 @@ use_case == UseCase::kSynchronizedGesture; } -bool RendererSchedulerImpl::ShouldYieldForHighPriorityWork() { +bool MainThreadSchedulerImpl::ShouldYieldForHighPriorityWork() { helper_.CheckOnValidThread(); if (helper_.IsShutdown()) return false; @@ -1266,28 +1277,29 @@ } } -base::TimeTicks RendererSchedulerImpl::CurrentIdleTaskDeadlineForTesting() +base::TimeTicks MainThreadSchedulerImpl::CurrentIdleTaskDeadlineForTesting() const { return idle_helper_.CurrentIdleTaskDeadline(); } -void RendererSchedulerImpl::RunIdleTasksForTesting( +void MainThreadSchedulerImpl::RunIdleTasksForTesting( const base::Closure& callback) { main_thread_only().in_idle_period_for_testing = true; IdleTaskRunner()->PostIdleTask( - FROM_HERE, base::BindOnce(&RendererSchedulerImpl::EndIdlePeriodForTesting, - weak_factory_.GetWeakPtr(), callback)); + FROM_HERE, + base::BindOnce(&MainThreadSchedulerImpl::EndIdlePeriodForTesting, + weak_factory_.GetWeakPtr(), callback)); idle_helper_.EnableLongIdlePeriod(); } -void RendererSchedulerImpl::MaybeUpdatePolicy() { +void MainThreadSchedulerImpl::MaybeUpdatePolicy() { helper_.CheckOnValidThread(); if (policy_may_need_update_.IsSet()) { UpdatePolicy(); } } -void RendererSchedulerImpl::EnsureUrgentPolicyUpdatePostedOnMainThread( +void MainThreadSchedulerImpl::EnsureUrgentPolicyUpdatePostedOnMainThread( const base::Location& from_here) { // TODO(scheduler-dev): Check that this method isn't called from the main // thread. @@ -1298,12 +1310,12 @@ } } -void RendererSchedulerImpl::UpdatePolicy() { +void MainThreadSchedulerImpl::UpdatePolicy() { base::AutoLock lock(any_thread_lock_); UpdatePolicyLocked(UpdateType::kMayEarlyOutIfPolicyUnchanged); } -void RendererSchedulerImpl::ForceUpdatePolicy() { +void MainThreadSchedulerImpl::ForceUpdatePolicy() { base::AutoLock lock(any_thread_lock_); UpdatePolicyLocked(UpdateType::kForceUpdate); } @@ -1326,7 +1338,7 @@ } // namespace -void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) { +void MainThreadSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) { helper_.CheckOnValidThread(); any_thread_lock_.AssertAcquired(); if (helper_.IsShutdown()) @@ -1630,7 +1642,7 @@ Platform::Current()->RequestPurgeMemory(); } -void RendererSchedulerImpl::ApplyTaskQueuePolicy( +void MainThreadSchedulerImpl::ApplyTaskQueuePolicy( MainThreadTaskQueue* task_queue, TaskQueue::QueueEnabledVoter* task_queue_enabled_voter, const TaskQueuePolicy& old_task_queue_policy, @@ -1668,7 +1680,7 @@ } } -UseCase RendererSchedulerImpl::ComputeCurrentUseCase( +UseCase MainThreadSchedulerImpl::ComputeCurrentUseCase( base::TimeTicks now, base::TimeDelta* expected_use_case_duration) const { any_thread_lock_.AssertAcquired(); @@ -1724,7 +1736,7 @@ return UseCase::kNone; } -base::TimeDelta RendererSchedulerImpl::EstimateLongestJankFreeTaskDuration() +base::TimeDelta MainThreadSchedulerImpl::EstimateLongestJankFreeTaskDuration() const { switch (main_thread_only().current_use_case) { case UseCase::kTouchstart: @@ -1745,7 +1757,7 @@ } } -bool RendererSchedulerImpl::CanEnterLongIdlePeriod( +bool MainThreadSchedulerImpl::CanEnterLongIdlePeriod( base::TimeTicks now, base::TimeDelta* next_long_idle_period_delay_out) { helper_.CheckOnValidThread(); @@ -1762,7 +1774,7 @@ return true; } -void RendererSchedulerImpl::SetStoppedInBackground(bool stopped) const { +void MainThreadSchedulerImpl::SetStoppedInBackground(bool stopped) const { for (PageSchedulerImpl* page_scheduler : main_thread_only().page_schedulers) { // This moves the page to FROZEN lifecycle state. page_scheduler->SetPageFrozen(stopped); @@ -1770,29 +1782,29 @@ } MainThreadSchedulerHelper* -RendererSchedulerImpl::GetSchedulerHelperForTesting() { +MainThreadSchedulerImpl::GetSchedulerHelperForTesting() { return &helper_; } TaskCostEstimator* -RendererSchedulerImpl::GetLoadingTaskCostEstimatorForTesting() { +MainThreadSchedulerImpl::GetLoadingTaskCostEstimatorForTesting() { return &main_thread_only().loading_task_cost_estimator; } TaskCostEstimator* -RendererSchedulerImpl::GetTimerTaskCostEstimatorForTesting() { +MainThreadSchedulerImpl::GetTimerTaskCostEstimatorForTesting() { return &main_thread_only().timer_task_cost_estimator; } -IdleTimeEstimator* RendererSchedulerImpl::GetIdleTimeEstimatorForTesting() { +IdleTimeEstimator* MainThreadSchedulerImpl::GetIdleTimeEstimatorForTesting() { return &main_thread_only().idle_time_estimator; } -WakeUpBudgetPool* RendererSchedulerImpl::GetWakeUpBudgetPoolForTesting() { +WakeUpBudgetPool* MainThreadSchedulerImpl::GetWakeUpBudgetPoolForTesting() { return main_thread_only().wake_up_budget_pool; } -base::TimeTicks RendererSchedulerImpl::EnableVirtualTime( +base::TimeTicks MainThreadSchedulerImpl::EnableVirtualTime( BaseTimeOverridePolicy policy) { if (main_thread_only().use_virtual_time) return main_thread_only().initial_virtual_time_ticks; @@ -1830,11 +1842,11 @@ return main_thread_only().initial_virtual_time_ticks; } -bool RendererSchedulerImpl::IsVirtualTimeEnabled() const { +bool MainThreadSchedulerImpl::IsVirtualTimeEnabled() const { return main_thread_only().use_virtual_time; } -void RendererSchedulerImpl::DisableVirtualTimeForTesting() { +void MainThreadSchedulerImpl::DisableVirtualTimeForTesting() { if (!main_thread_only().use_virtual_time) return; // Reset virtual time and all tasks queues back to their initial state. @@ -1859,7 +1871,7 @@ main_thread_only().metrics_helper.ResetForTest(now); } -void RendererSchedulerImpl::SetVirtualTimeStopped(bool virtual_time_stopped) { +void MainThreadSchedulerImpl::SetVirtualTimeStopped(bool virtual_time_stopped) { if (main_thread_only().virtual_time_stopped == virtual_time_stopped) return; main_thread_only().virtual_time_stopped = virtual_time_stopped; @@ -1876,7 +1888,7 @@ } } -void RendererSchedulerImpl::VirtualTimePaused() { +void MainThreadSchedulerImpl::VirtualTimePaused() { for (const auto& pair : task_runners_) { if (pair.first->queue_class() == MainThreadTaskQueue::QueueClass::kTimer) { DCHECK(!task_queue_throttler_->IsThrottled(pair.first.get())); @@ -1889,7 +1901,7 @@ } } -void RendererSchedulerImpl::VirtualTimeResumed() { +void MainThreadSchedulerImpl::VirtualTimeResumed() { for (const auto& pair : task_runners_) { if (pair.first->queue_class() == MainThreadTaskQueue::QueueClass::kTimer) { DCHECK(!task_queue_throttler_->IsThrottled(pair.first.get())); @@ -1899,11 +1911,11 @@ } } -bool RendererSchedulerImpl::VirtualTimeAllowedToAdvance() const { +bool MainThreadSchedulerImpl::VirtualTimeAllowedToAdvance() const { return !main_thread_only().virtual_time_stopped; } -base::TimeTicks RendererSchedulerImpl::IncrementVirtualTimePauseCount() { +base::TimeTicks MainThreadSchedulerImpl::IncrementVirtualTimePauseCount() { main_thread_only().virtual_time_pause_count++; ApplyVirtualTimePolicy(); @@ -1912,39 +1924,39 @@ return tick_clock()->NowTicks(); } -void RendererSchedulerImpl::DecrementVirtualTimePauseCount() { +void MainThreadSchedulerImpl::DecrementVirtualTimePauseCount() { main_thread_only().virtual_time_pause_count--; DCHECK_GE(main_thread_only().virtual_time_pause_count, 0); ApplyVirtualTimePolicy(); } -void RendererSchedulerImpl::MaybeAdvanceVirtualTime( +void MainThreadSchedulerImpl::MaybeAdvanceVirtualTime( base::TimeTicks new_virtual_time) { if (virtual_time_domain_) virtual_time_domain_->MaybeAdvanceVirtualTime(new_virtual_time); } -void RendererSchedulerImpl::SetVirtualTimePolicy(VirtualTimePolicy policy) { +void MainThreadSchedulerImpl::SetVirtualTimePolicy(VirtualTimePolicy policy) { main_thread_only().virtual_time_policy = policy; ApplyVirtualTimePolicy(); } -void RendererSchedulerImpl::SetInitialVirtualTimeOffset( +void MainThreadSchedulerImpl::SetInitialVirtualTimeOffset( base::TimeDelta offset) { main_thread_only().initial_virtual_time_offset = offset; } -void RendererSchedulerImpl::AddVirtualTimeObserver( +void MainThreadSchedulerImpl::AddVirtualTimeObserver( VirtualTimeObserver* observer) { main_thread_only().virtual_time_observers.AddObserver(observer); } -void RendererSchedulerImpl::RemoveVirtualTimeObserver( +void MainThreadSchedulerImpl::RemoveVirtualTimeObserver( VirtualTimeObserver* observer) { main_thread_only().virtual_time_observers.RemoveObserver(observer); } -void RendererSchedulerImpl::OnVirtualTimeAdvanced() { +void MainThreadSchedulerImpl::OnVirtualTimeAdvanced() { for (auto& observer : main_thread_only().virtual_time_observers) { observer.OnVirtualTimeAdvanced( virtual_time_domain_->Now() - @@ -1952,7 +1964,7 @@ } } -void RendererSchedulerImpl::ApplyVirtualTimePolicy() { +void MainThreadSchedulerImpl::ApplyVirtualTimePolicy() { switch (main_thread_only().virtual_time_policy) { case VirtualTimePolicy::kAdvance: if (virtual_time_domain_) { @@ -1989,38 +2001,38 @@ } } -void RendererSchedulerImpl::SetMaxVirtualTimeTaskStarvationCount( +void MainThreadSchedulerImpl::SetMaxVirtualTimeTaskStarvationCount( int max_task_starvation_count) { main_thread_only().max_virtual_time_task_starvation_count = max_task_starvation_count; ApplyVirtualTimePolicy(); } -void RendererSchedulerImpl::SetStoppingWhenBackgroundedEnabled(bool enabled) { +void MainThreadSchedulerImpl::SetStoppingWhenBackgroundedEnabled(bool enabled) { // Note that this will only take effect for the next backgrounded signal. main_thread_only().stopping_when_backgrounded_enabled = enabled; } std::unique_ptr<base::trace_event::ConvertableToTraceFormat> -RendererSchedulerImpl::AsValue(base::TimeTicks optional_now) const { +MainThreadSchedulerImpl::AsValue(base::TimeTicks optional_now) const { base::AutoLock lock(any_thread_lock_); return AsValueLocked(optional_now); } -void RendererSchedulerImpl::CreateTraceEventObjectSnapshot() const { +void MainThreadSchedulerImpl::CreateTraceEventObjectSnapshot() const { TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug"), - "RendererScheduler", this, AsValue(helper_.NowTicks())); + "MainThreadScheduler", this, AsValue(helper_.NowTicks())); } -void RendererSchedulerImpl::CreateTraceEventObjectSnapshotLocked() const { +void MainThreadSchedulerImpl::CreateTraceEventObjectSnapshotLocked() const { TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug"), - "RendererScheduler", this, AsValueLocked(helper_.NowTicks())); + "MainThreadScheduler", this, AsValueLocked(helper_.NowTicks())); } // static -const char* RendererSchedulerImpl::ExpensiveTaskPolicyToString( +const char* MainThreadSchedulerImpl::ExpensiveTaskPolicyToString( ExpensiveTaskPolicy expensive_task_policy) { switch (expensive_task_policy) { case ExpensiveTaskPolicy::kRun: @@ -2036,7 +2048,7 @@ } std::unique_ptr<base::trace_event::ConvertableToTraceFormat> -RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { +MainThreadSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { helper_.CheckOnValidThread(); any_thread_lock_.AssertAcquired(); @@ -2157,7 +2169,7 @@ return std::move(state); } -bool RendererSchedulerImpl::TaskQueuePolicy::IsQueueEnabled( +bool MainThreadSchedulerImpl::TaskQueuePolicy::IsQueueEnabled( MainThreadTaskQueue* task_queue) const { if (!is_enabled) return false; @@ -2172,14 +2184,14 @@ return true; } -TaskQueue::QueuePriority RendererSchedulerImpl::TaskQueuePolicy::GetPriority( +TaskQueue::QueuePriority MainThreadSchedulerImpl::TaskQueuePolicy::GetPriority( MainThreadTaskQueue* task_queue) const { return task_queue->UsedForImportantTasks() ? TaskQueue::kHighestPriority : priority; } -RendererSchedulerImpl::TimeDomainType -RendererSchedulerImpl::TaskQueuePolicy::GetTimeDomainType( +MainThreadSchedulerImpl::TimeDomainType +MainThreadSchedulerImpl::TaskQueuePolicy::GetTimeDomainType( MainThreadTaskQueue* task_queue) const { if (use_virtual_time) return TimeDomainType::kVirtual; @@ -2188,7 +2200,7 @@ return TimeDomainType::kReal; } -void RendererSchedulerImpl::TaskQueuePolicy::AsValueInto( +void MainThreadSchedulerImpl::TaskQueuePolicy::AsValueInto( base::trace_event::TracedValue* state) const { state->SetBoolean("is_enabled", is_enabled); state->SetBoolean("is_paused", is_paused); @@ -2199,7 +2211,7 @@ state->SetString("priority", TaskQueue::PriorityToString(priority)); } -void RendererSchedulerImpl::Policy::AsValueInto( +void MainThreadSchedulerImpl::Policy::AsValueInto( base::trace_event::TracedValue* state) const { state->BeginDictionary("compositor_queue_policy"); compositor_queue_policy().AsValueInto(state); @@ -2221,20 +2233,20 @@ state->SetBoolean("should_disable_throttling", should_disable_throttling()); } -void RendererSchedulerImpl::OnIdlePeriodStarted() { +void MainThreadSchedulerImpl::OnIdlePeriodStarted() { base::AutoLock lock(any_thread_lock_); any_thread().in_idle_period = true; UpdatePolicyLocked(UpdateType::kMayEarlyOutIfPolicyUnchanged); } -void RendererSchedulerImpl::OnIdlePeriodEnded() { +void MainThreadSchedulerImpl::OnIdlePeriodEnded() { base::AutoLock lock(any_thread_lock_); any_thread().last_idle_period_end_time = helper_.NowTicks(); any_thread().in_idle_period = false; UpdatePolicyLocked(UpdateType::kMayEarlyOutIfPolicyUnchanged); } -void RendererSchedulerImpl::OnPendingTasksChanged(bool has_tasks) { +void MainThreadSchedulerImpl::OnPendingTasksChanged(bool has_tasks) { if (has_tasks == main_thread_only().compositor_will_send_main_frame_not_expected.get()) return; @@ -2247,11 +2259,11 @@ control_task_queue_->PostTask( FROM_HERE, base::BindOnce( - &RendererSchedulerImpl::DispatchRequestBeginMainFrameNotExpected, + &MainThreadSchedulerImpl::DispatchRequestBeginMainFrameNotExpected, weak_factory_.GetWeakPtr(), has_tasks)); } -void RendererSchedulerImpl::DispatchRequestBeginMainFrameNotExpected( +void MainThreadSchedulerImpl::DispatchRequestBeginMainFrameNotExpected( bool has_tasks) { if (has_tasks == main_thread_only().compositor_will_send_main_frame_not_expected.get()) @@ -2260,14 +2272,14 @@ TRACE_EVENT1( TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::DispatchRequestBeginMainFrameNotExpected", + "MainThreadSchedulerImpl::DispatchRequestBeginMainFrameNotExpected", "has_tasks", has_tasks); for (PageSchedulerImpl* page_scheduler : main_thread_only().page_schedulers) { page_scheduler->RequestBeginMainFrameNotExpected(has_tasks); } } -void RendererSchedulerImpl::AddPendingNavigation(NavigatingFrameType type) { +void MainThreadSchedulerImpl::AddPendingNavigation(NavigatingFrameType type) { helper_.CheckOnValidThread(); if (type == NavigatingFrameType::kMainFrame) { main_thread_only().navigation_task_expected_count++; @@ -2275,7 +2287,8 @@ } } -void RendererSchedulerImpl::RemovePendingNavigation(NavigatingFrameType type) { +void MainThreadSchedulerImpl::RemovePendingNavigation( + NavigatingFrameType type) { helper_.CheckOnValidThread(); DCHECK_GT(main_thread_only().navigation_task_expected_count, 0); if (type == NavigatingFrameType::kMainFrame && @@ -2286,26 +2299,26 @@ } std::unique_ptr<base::SingleSampleMetric> -RendererSchedulerImpl::CreateMaxQueueingTimeMetric() { +MainThreadSchedulerImpl::CreateMaxQueueingTimeMetric() { return base::SingleSampleMetricsFactory::Get()->CreateCustomCountsMetric( "RendererScheduler.MaxQueueingTime", 1, 10000, 50); } -void RendererSchedulerImpl::DidStartProvisionalLoad(bool is_main_frame) { +void MainThreadSchedulerImpl::DidStartProvisionalLoad(bool is_main_frame) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::DidStartProvisionalLoad"); + "MainThreadSchedulerImpl::DidStartProvisionalLoad"); if (is_main_frame) { base::AutoLock lock(any_thread_lock_); ResetForNavigationLocked(); } } -void RendererSchedulerImpl::DidCommitProvisionalLoad( +void MainThreadSchedulerImpl::DidCommitProvisionalLoad( bool is_web_history_inert_commit, bool is_reload, bool is_main_frame) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::DidCommitProvisionalLoad"); + "MainThreadSchedulerImpl::DidCommitProvisionalLoad"); // Initialize |max_queueing_time_metric| lazily so that // |SingleSampleMetricsFactory::SetFactory()| is called before // |SingleSampleMetricsFactory::Get()| @@ -2324,17 +2337,17 @@ } } -void RendererSchedulerImpl::OnFirstMeaningfulPaint() { +void MainThreadSchedulerImpl::OnFirstMeaningfulPaint() { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::OnFirstMeaningfulPaint"); + "MainThreadSchedulerImpl::OnFirstMeaningfulPaint"); base::AutoLock lock(any_thread_lock_); any_thread().waiting_for_meaningful_paint = false; UpdatePolicyLocked(UpdateType::kMayEarlyOutIfPolicyUnchanged); } -void RendererSchedulerImpl::ResetForNavigationLocked() { +void MainThreadSchedulerImpl::ResetForNavigationLocked() { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererSchedulerImpl::ResetForNavigationLocked"); + "MainThreadSchedulerImpl::ResetForNavigationLocked"); helper_.CheckOnValidThread(); any_thread_lock_.AssertAcquired(); any_thread().user_model.Reset(helper_.NowTicks()); @@ -2363,7 +2376,7 @@ frame_count); } -void RendererSchedulerImpl::SetTopLevelBlameContext( +void MainThreadSchedulerImpl::SetTopLevelBlameContext( base::trace_event::BlameContext* blame_context) { // Any task that runs in the default task runners belongs to the context of // all frames (as opposed to a particular frame). Note that the task itself @@ -2382,11 +2395,11 @@ ipc_task_queue_->SetBlameContext(blame_context); } -void RendererSchedulerImpl::SetRAILModeObserver(RAILModeObserver* observer) { +void MainThreadSchedulerImpl::SetRAILModeObserver(RAILModeObserver* observer) { main_thread_only().rail_mode_observer = observer; } -bool RendererSchedulerImpl::MainThreadSeemsUnresponsive( +bool MainThreadSchedulerImpl::MainThreadSeemsUnresponsive( base::TimeDelta main_thread_responsiveness_threshold) { base::TimeTicks now = tick_clock()->NowTicks(); base::TimeDelta estimated_queueing_time; @@ -2422,51 +2435,52 @@ return main_thread_seems_unresponsive; } -void RendererSchedulerImpl::SetRendererProcessType(RendererProcessType type) { +void MainThreadSchedulerImpl::SetRendererProcessType(RendererProcessType type) { main_thread_only().process_type = type; } WebScopedVirtualTimePauser -RendererSchedulerImpl::CreateWebScopedVirtualTimePauser( +MainThreadSchedulerImpl::CreateWebScopedVirtualTimePauser( const char* name, WebScopedVirtualTimePauser::VirtualTaskDuration duration) { return WebScopedVirtualTimePauser(this, duration, WebString(WTF::String(name))); } -void RendererSchedulerImpl::RegisterTimeDomain(TimeDomain* time_domain) { +void MainThreadSchedulerImpl::RegisterTimeDomain(TimeDomain* time_domain) { helper_.RegisterTimeDomain(time_domain); } -void RendererSchedulerImpl::UnregisterTimeDomain(TimeDomain* time_domain) { +void MainThreadSchedulerImpl::UnregisterTimeDomain(TimeDomain* time_domain) { helper_.UnregisterTimeDomain(time_domain); } -const base::TickClock* RendererSchedulerImpl::tick_clock() const { +const base::TickClock* MainThreadSchedulerImpl::tick_clock() const { return helper_.GetClock(); } -void RendererSchedulerImpl::AddPageScheduler( +void MainThreadSchedulerImpl::AddPageScheduler( PageSchedulerImpl* page_scheduler) { main_thread_only().page_schedulers.insert(page_scheduler); } -void RendererSchedulerImpl::RemovePageScheduler( +void MainThreadSchedulerImpl::RemovePageScheduler( PageSchedulerImpl* page_scheduler) { DCHECK(main_thread_only().page_schedulers.find(page_scheduler) != main_thread_only().page_schedulers.end()); main_thread_only().page_schedulers.erase(page_scheduler); } -void RendererSchedulerImpl::BroadcastIntervention(const std::string& message) { +void MainThreadSchedulerImpl::BroadcastIntervention( + const std::string& message) { helper_.CheckOnValidThread(); for (auto* page_scheduler : main_thread_only().page_schedulers) page_scheduler->ReportIntervention(message); } -void RendererSchedulerImpl::OnTaskStarted(MainThreadTaskQueue* queue, - const TaskQueue::Task& task, - base::TimeTicks start) { +void MainThreadSchedulerImpl::OnTaskStarted(MainThreadTaskQueue* queue, + const TaskQueue::Task& task, + base::TimeTicks start) { main_thread_only().current_task_start_time = start; seqlock_queueing_time_estimator_.seqlock.WriteBegin(); seqlock_queueing_time_estimator_.data.OnTopLevelTaskStarted(start, queue); @@ -2478,7 +2492,7 @@ : base::nullopt}; } -void RendererSchedulerImpl::OnTaskCompleted( +void MainThreadSchedulerImpl::OnTaskCompleted( MainThreadTaskQueue* queue, const TaskQueue::Task& task, base::TimeTicks start, @@ -2498,7 +2512,7 @@ main_thread_only().task_description_for_tracing = base::nullopt; } -void RendererSchedulerImpl::RecordTaskUkm( +void MainThreadSchedulerImpl::RecordTaskUkm( MainThreadTaskQueue* queue, const TaskQueue::Task& task, base::TimeTicks start, @@ -2521,7 +2535,7 @@ } } -void RendererSchedulerImpl::RecordTaskUkmImpl( +void MainThreadSchedulerImpl::RecordTaskUkmImpl( MainThreadTaskQueue* queue, const TaskQueue::Task& task, base::TimeTicks start, @@ -2557,7 +2571,7 @@ builder.Record(ukm_recorder); } -void RendererSchedulerImpl::OnBeginNestedRunLoop() { +void MainThreadSchedulerImpl::OnBeginNestedRunLoop() { seqlock_queueing_time_estimator_.seqlock.WriteBegin(); seqlock_queueing_time_estimator_.data.OnBeginNestedRunLoop(); seqlock_queueing_time_estimator_.seqlock.WriteEnd(); @@ -2566,22 +2580,22 @@ ApplyVirtualTimePolicy(); } -void RendererSchedulerImpl::OnExitNestedRunLoop() { +void MainThreadSchedulerImpl::OnExitNestedRunLoop() { main_thread_only().nested_runloop = false; ApplyVirtualTimePolicy(); } -void RendererSchedulerImpl::AddTaskTimeObserver( +void MainThreadSchedulerImpl::AddTaskTimeObserver( TaskTimeObserver* task_time_observer) { helper_.AddTaskTimeObserver(task_time_observer); } -void RendererSchedulerImpl::RemoveTaskTimeObserver( +void MainThreadSchedulerImpl::RemoveTaskTimeObserver( TaskTimeObserver* task_time_observer) { helper_.RemoveTaskTimeObserver(task_time_observer); } -bool RendererSchedulerImpl::ContainsLocalMainFrame() { +bool MainThreadSchedulerImpl::ContainsLocalMainFrame() { for (auto* page_scheduler : main_thread_only().page_schedulers) { if (page_scheduler->IsMainFrameLocal()) return true; @@ -2589,7 +2603,7 @@ return false; } -void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( +void MainThreadSchedulerImpl::OnQueueingTimeForWindowEstimated( base::TimeDelta queueing_time, bool is_disjoint_window) { main_thread_only().most_recent_expected_queueing_time = queueing_time; @@ -2625,7 +2639,7 @@ } } -void RendererSchedulerImpl::OnReportFineGrainedExpectedQueueingTime( +void MainThreadSchedulerImpl::OnReportFineGrainedExpectedQueueingTime( const char* split_description, base::TimeDelta queueing_time) { if (!ContainsLocalMainFrame()) @@ -2637,11 +2651,12 @@ kNumberExpectedQueueingTimeBuckets); } -AutoAdvancingVirtualTimeDomain* RendererSchedulerImpl::GetVirtualTimeDomain() { +AutoAdvancingVirtualTimeDomain* +MainThreadSchedulerImpl::GetVirtualTimeDomain() { return virtual_time_domain_.get(); } -bool RendererSchedulerImpl::ShouldDisableThrottlingBecauseOfAudio( +bool MainThreadSchedulerImpl::ShouldDisableThrottlingBecauseOfAudio( base::TimeTicks now) { if (!main_thread_only().last_audio_state_change) return false; @@ -2654,7 +2669,7 @@ now; } -void RendererSchedulerImpl::AddQueueToWakeUpBudgetPool( +void MainThreadSchedulerImpl::AddQueueToWakeUpBudgetPool( MainThreadTaskQueue* queue) { if (!main_thread_only().wake_up_budget_pool) { main_thread_only().wake_up_budget_pool = @@ -2667,7 +2682,7 @@ queue); } -TimeDomain* RendererSchedulerImpl::GetActiveTimeDomain() { +TimeDomain* MainThreadSchedulerImpl::GetActiveTimeDomain() { if (main_thread_only().use_virtual_time) { return GetVirtualTimeDomain(); } else { @@ -2675,7 +2690,7 @@ } } -void RendererSchedulerImpl::OnTraceLogEnabled() { +void MainThreadSchedulerImpl::OnTraceLogEnabled() { CreateTraceEventObjectSnapshot(); tracing_controller_.OnTraceLogEnabled(); for (PageSchedulerImpl* page_scheduler : main_thread_only().page_schedulers) { @@ -2683,20 +2698,20 @@ } } -void RendererSchedulerImpl::OnTraceLogDisabled() {} +void MainThreadSchedulerImpl::OnTraceLogDisabled() {} -base::WeakPtr<RendererSchedulerImpl> RendererSchedulerImpl::GetWeakPtr() { +base::WeakPtr<MainThreadSchedulerImpl> MainThreadSchedulerImpl::GetWeakPtr() { return weak_factory_.GetWeakPtr(); } -bool RendererSchedulerImpl::ShouldRecordTaskUkm() { +bool MainThreadSchedulerImpl::ShouldRecordTaskUkm() { // This function returns true with probability of kSamplingRateForTaskUkm. return main_thread_only().uniform_distribution( main_thread_only().random_generator) < kSamplingRateForTaskUkm; } // static -const char* RendererSchedulerImpl::UseCaseToString(UseCase use_case) { +const char* MainThreadSchedulerImpl::UseCaseToString(UseCase use_case) { switch (use_case) { case UseCase::kNone: return "none"; @@ -2719,7 +2734,7 @@ } // static -const char* RendererSchedulerImpl::RAILModeToString(v8::RAILMode rail_mode) { +const char* MainThreadSchedulerImpl::RAILModeToString(v8::RAILMode rail_mode) { switch (rail_mode) { case v8::PERFORMANCE_RESPONSE: return "response"; @@ -2736,7 +2751,7 @@ } // static -const char* RendererSchedulerImpl::TimeDomainTypeToString( +const char* MainThreadSchedulerImpl::TimeDomainTypeToString( TimeDomainType domain_type) { switch (domain_type) { case TimeDomainType::kReal: @@ -2752,7 +2767,7 @@ } // static -const char* RendererSchedulerImpl::VirtualTimePolicyToString( +const char* MainThreadSchedulerImpl::VirtualTimePolicyToString( VirtualTimePolicy virtual_time_policy) { switch (virtual_time_policy) { case VirtualTimePolicy::kAdvance:
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h index 1a3e557..34b1aa1 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -46,17 +46,16 @@ namespace blink { namespace scheduler { -namespace renderer_scheduler_impl_unittest { -class RendererSchedulerImplForTest; -class RendererSchedulerImplTest; -FORWARD_DECLARE_TEST(RendererSchedulerImplTest, Tracing); -} // namespace renderer_scheduler_impl_unittest +namespace main_thread_scheduler_impl_unittest { +class MainThreadSchedulerImplForTest; +class MainThreadSchedulerImplTest; +FORWARD_DECLARE_TEST(MainThreadSchedulerImplTest, Tracing); +} // namespace main_thread_scheduler_impl_unittest class PageSchedulerImpl; class TaskQueueThrottler; class WebRenderWidgetSchedulingState; -// TODO(yutak): Rename this class to MainThreadSchedulerImpl. -class PLATFORM_EXPORT RendererSchedulerImpl +class PLATFORM_EXPORT MainThreadSchedulerImpl : public WebMainThreadScheduler, public IdleHelper::Delegate, public MainThreadSchedulerHelper::Observer, @@ -91,12 +90,12 @@ // If |initial_virtual_time| is specified then the scheduler will be created // with virtual time enabled and paused with base::Time will be overridden to // start at |initial_virtual_time|. - RendererSchedulerImpl(std::unique_ptr<TaskQueueManager> task_queue_manager, - base::Optional<base::Time> initial_virtual_time); + MainThreadSchedulerImpl(std::unique_ptr<TaskQueueManager> task_queue_manager, + base::Optional<base::Time> initial_virtual_time); - ~RendererSchedulerImpl() override; + ~MainThreadSchedulerImpl() override; - // RendererScheduler implementation: + // WebMainThreadSchedulerScheduler implementation: std::unique_ptr<WebThread> CreateMainThread() override; scoped_refptr<SingleThreadIdleTaskRunner> IdleTaskRunner() override; scoped_refptr<base::SingleThreadTaskRunner> IPCTaskRunner() override; @@ -222,7 +221,7 @@ void AddTaskTimeObserver(TaskTimeObserver*); void RemoveTaskTimeObserver(TaskTimeObserver*); - // Snapshots this RendererScheduler for tracing. + // Snapshots this MainThreadSchedulerImpl for tracing. void CreateTraceEventObjectSnapshot() const; // Called when one of associated page schedulers has changed audio state. @@ -283,7 +282,7 @@ void OnTraceLogEnabled() override; void OnTraceLogDisabled() override; - base::WeakPtr<RendererSchedulerImpl> GetWeakPtr(); + base::WeakPtr<MainThreadSchedulerImpl> GetWeakPtr(); protected: // WebMainThreadScheduler implementation. @@ -303,10 +302,11 @@ friend class RendererMetricsHelper; friend class RendererMetricsHelperTest; - friend class renderer_scheduler_impl_unittest::RendererSchedulerImplForTest; - friend class renderer_scheduler_impl_unittest::RendererSchedulerImplTest; + friend class main_thread_scheduler_impl_unittest:: + MainThreadSchedulerImplForTest; + friend class main_thread_scheduler_impl_unittest::MainThreadSchedulerImplTest; FRIEND_TEST_ALL_PREFIXES( - renderer_scheduler_impl_unittest::RendererSchedulerImplTest, + main_thread_scheduler_impl_unittest::MainThreadSchedulerImplTest, Tracing); enum class ExpensiveTaskPolicy { kRun, kBlock, kThrottle }; @@ -454,11 +454,11 @@ class RendererPauseHandleImpl : public RendererPauseHandle { public: - explicit RendererPauseHandleImpl(RendererSchedulerImpl* scheduler); + explicit RendererPauseHandleImpl(MainThreadSchedulerImpl* scheduler); ~RendererPauseHandleImpl() override; private: - RendererSchedulerImpl* scheduler_; // NOT OWNED + MainThreadSchedulerImpl* scheduler_; // NOT OWNED }; // IdleHelper::Delegate implementation: @@ -653,7 +653,7 @@ struct MainThreadOnly { MainThreadOnly( - RendererSchedulerImpl* renderer_scheduler_impl, + MainThreadSchedulerImpl* main_thread_scheduler_impl, const scoped_refptr<MainThreadTaskQueue>& compositor_task_runner, const base::TickClock* time_source, base::TimeTicks now); @@ -749,7 +749,7 @@ }; struct AnyThread { - explicit AnyThread(RendererSchedulerImpl* renderer_scheduler_impl); + explicit AnyThread(MainThreadSchedulerImpl* main_thread_scheduler_impl); ~AnyThread(); base::TimeTicks last_idle_period_end_time; @@ -821,9 +821,9 @@ PollableThreadSafeFlag policy_may_need_update_; - base::WeakPtrFactory<RendererSchedulerImpl> weak_factory_; + base::WeakPtrFactory<MainThreadSchedulerImpl> weak_factory_; - DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImpl); + DISALLOW_COPY_AND_ASSIGN(MainThreadSchedulerImpl); }; } // namespace scheduler
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc index 49760b1..a9bd594b 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -32,7 +32,7 @@ namespace blink { namespace scheduler { // To avoid symbol collisions in jumbo builds. -namespace renderer_scheduler_impl_unittest { +namespace main_thread_scheduler_impl_unittest { using testing::Mock; using InputEventState = WebMainThreadScheduler::InputEventState; @@ -129,7 +129,7 @@ (*run_count)++; } -void PostingYieldingTestTask(RendererSchedulerImpl* scheduler, +void PostingYieldingTestTask(MainThreadSchedulerImpl* scheduler, base::SingleThreadTaskRunner* task_runner, bool simulate_input, bool* should_yield_before, @@ -152,7 +152,7 @@ kGestureScrollEnd }; -void AnticipationTestTask(RendererSchedulerImpl* scheduler, +void AnticipationTestTask(MainThreadSchedulerImpl* scheduler, SimulateInputType simulate_input, bool* is_anticipated_before, bool* is_anticipated_after) { @@ -208,23 +208,24 @@ DISALLOW_COPY_AND_ASSIGN(ScopedAutoAdvanceNowEnabler); }; -class RendererSchedulerImplForTest : public RendererSchedulerImpl { +class MainThreadSchedulerImplForTest : public MainThreadSchedulerImpl { public: - using RendererSchedulerImpl::EstimateLongestJankFreeTaskDuration; - using RendererSchedulerImpl::OnIdlePeriodEnded; - using RendererSchedulerImpl::OnIdlePeriodStarted; - using RendererSchedulerImpl::OnPendingTasksChanged; + using MainThreadSchedulerImpl::EstimateLongestJankFreeTaskDuration; + using MainThreadSchedulerImpl::OnIdlePeriodEnded; + using MainThreadSchedulerImpl::OnIdlePeriodStarted; + using MainThreadSchedulerImpl::OnPendingTasksChanged; - RendererSchedulerImplForTest(std::unique_ptr<TaskQueueManager> manager, - base::Optional<base::Time> initial_virtual_time) - : RendererSchedulerImpl(std::move(manager), initial_virtual_time), + MainThreadSchedulerImplForTest( + std::unique_ptr<TaskQueueManager> manager, + base::Optional<base::Time> initial_virtual_time) + : MainThreadSchedulerImpl(std::move(manager), initial_virtual_time), update_policy_count_(0) {} void UpdatePolicyLocked(UpdateType update_type) override { update_policy_count_++; - RendererSchedulerImpl::UpdatePolicyLocked(update_type); + MainThreadSchedulerImpl::UpdatePolicyLocked(update_type); - std::string use_case = RendererSchedulerImpl::UseCaseToString( + std::string use_case = MainThreadSchedulerImpl::UseCaseToString( main_thread_only().current_use_case); if (main_thread_only().touchstart_expected_soon) { use_cases_.push_back(use_case + " touchstart expected"); @@ -235,7 +236,7 @@ void EnsureUrgentPolicyUpdatePostedOnMainThread() { base::AutoLock lock(any_thread_lock_); - RendererSchedulerImpl::EnsureUrgentPolicyUpdatePostedOnMainThread( + MainThreadSchedulerImpl::EnsureUrgentPolicyUpdatePostedOnMainThread( FROM_HERE); } @@ -263,33 +264,33 @@ // Lets gtest print human readable Policy values. ::std::ostream& operator<<(::std::ostream& os, const UseCase& use_case) { - return os << RendererSchedulerImpl::UseCaseToString(use_case); + return os << MainThreadSchedulerImpl::UseCaseToString(use_case); } -class RendererSchedulerImplTest : public testing::Test { +class MainThreadSchedulerImplTest : public testing::Test { public: - RendererSchedulerImplTest() + MainThreadSchedulerImplTest() : fake_task_(TaskQueue::PostedTask(base::BindOnce([] {}), FROM_HERE), base::TimeTicks()) { feature_list_.InitAndEnableFeature(kHighPriorityInput); clock_.Advance(base::TimeDelta::FromMicroseconds(5000)); } - RendererSchedulerImplTest(base::MessageLoop* message_loop) + MainThreadSchedulerImplTest(base::MessageLoop* message_loop) : fake_task_(TaskQueue::PostedTask(base::BindOnce([] {}), FROM_HERE), base::TimeTicks()), message_loop_(message_loop) { clock_.Advance(base::TimeDelta::FromMicroseconds(5000)); } - ~RendererSchedulerImplTest() override = default; + ~MainThreadSchedulerImplTest() override = default; void SetUp() override { if (!message_loop_) { mock_task_runner_ = base::MakeRefCounted<cc::OrderedSimpleTaskRunner>(&clock_, false); } - Initialize(std::make_unique<RendererSchedulerImplForTest>( + Initialize(std::make_unique<MainThreadSchedulerImplForTest>( TaskQueueManagerForTest::Create( message_loop_.get(), message_loop_ ? message_loop_->task_runner() : mock_task_runner_, @@ -297,7 +298,7 @@ base::nullopt)); } - void Initialize(std::unique_ptr<RendererSchedulerImplForTest> scheduler) { + void Initialize(std::unique_ptr<MainThreadSchedulerImplForTest> scheduler) { scheduler_ = std::move(scheduler); if (kLaunchingProcessIsBackgrounded) { scheduler_->SetRendererBackgrounded(false); @@ -609,7 +610,7 @@ compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce( - &RendererSchedulerImplTest::SimulateMainThreadCompositorTask, + &MainThreadSchedulerImplTest::SimulateMainThreadCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(1000))); RunUntilIdle(); } @@ -696,17 +697,17 @@ static base::TimeDelta end_idle_when_hidden_delay() { return base::TimeDelta::FromMilliseconds( - RendererSchedulerImpl::kEndIdleWhenHiddenDelayMillis); + MainThreadSchedulerImpl::kEndIdleWhenHiddenDelayMillis); } static base::TimeDelta delay_for_background_tab_stopping() { return base::TimeDelta::FromMilliseconds( - RendererSchedulerImpl::kDelayForBackgroundTabStoppingMillis); + MainThreadSchedulerImpl::kDelayForBackgroundTabStoppingMillis); } static base::TimeDelta rails_response_time() { return base::TimeDelta::FromMilliseconds( - RendererSchedulerImpl::kRailsResponseTimeMillis); + MainThreadSchedulerImpl::kRailsResponseTimeMillis); } static base::TimeDelta responsiveness_threshold() { @@ -725,7 +726,7 @@ static void CheckAllUseCaseToString() { CallForEachEnumValue<UseCase>(UseCase::kFirstUseCase, UseCase::kCount, - &RendererSchedulerImpl::UseCaseToString); + &MainThreadSchedulerImpl::UseCaseToString); } static scoped_refptr<TaskQueue> ThrottableTaskQueue( @@ -741,7 +742,7 @@ scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; std::unique_ptr<base::MessageLoop> message_loop_; - std::unique_ptr<RendererSchedulerImplForTest> scheduler_; + std::unique_ptr<MainThreadSchedulerImplForTest> scheduler_; scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_; @@ -754,10 +755,10 @@ bool simulate_compositor_task_ran_; uint64_t next_begin_frame_number_ = viz::BeginFrameArgs::kStartingFrameNumber; - DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplTest); + DISALLOW_COPY_AND_ASSIGN(MainThreadSchedulerImplTest); }; -TEST_F(RendererSchedulerImplTest, TestPostDefaultTask) { +TEST_F(MainThreadSchedulerImplTest, TestPostDefaultTask) { std::vector<std::string> run_order; PostTestTasks(&run_order, "D1 D2 D3 D4"); @@ -767,7 +768,7 @@ std::string("D3"), std::string("D4"))); } -TEST_F(RendererSchedulerImplTest, TestPostDefaultAndCompositor) { +TEST_F(MainThreadSchedulerImplTest, TestPostDefaultAndCompositor) { std::vector<std::string> run_order; PostTestTasks(&run_order, "D1 C1 P1"); RunUntilIdle(); @@ -776,7 +777,7 @@ EXPECT_THAT(run_order, testing::Contains("P1")); } -TEST_F(RendererSchedulerImplTest, TestRentrantTask) { +TEST_F(MainThreadSchedulerImplTest, TestRentrantTask) { int count = 0; std::vector<int> run_order; default_task_runner_->PostTask( @@ -788,7 +789,7 @@ EXPECT_THAT(run_order, testing::ElementsAre(0, 1, 2, 3, 4)); } -TEST_F(RendererSchedulerImplTest, TestPostIdleTask) { +TEST_F(MainThreadSchedulerImplTest, TestPostIdleTask) { int run_count = 0; base::TimeTicks expected_deadline = clock_.NowTicks() + base::TimeDelta::FromMilliseconds(2300); @@ -824,7 +825,7 @@ EXPECT_EQ(expected_deadline, deadline_in_task); } -TEST_F(RendererSchedulerImplTest, TestRepostingIdleTask) { +TEST_F(MainThreadSchedulerImplTest, TestRepostingIdleTask) { int run_count = 0; g_max_idle_task_reposts = 2; @@ -845,7 +846,7 @@ EXPECT_EQ(2, run_count); } -TEST_F(RendererSchedulerImplTest, TestIdleTaskExceedsDeadline) { +TEST_F(MainThreadSchedulerImplTest, TestIdleTaskExceedsDeadline) { ScopedAutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_); int run_count = 0; @@ -868,7 +869,7 @@ EXPECT_EQ(2, run_count); } -TEST_F(RendererSchedulerImplTest, TestDelayedEndIdlePeriodCanceled) { +TEST_F(MainThreadSchedulerImplTest, TestDelayedEndIdlePeriodCanceled) { int run_count = 0; base::TimeTicks deadline_in_task; @@ -907,7 +908,7 @@ EXPECT_EQ(1, run_count); // We should still be in the new idle period. } -TEST_F(RendererSchedulerImplTest, TestDefaultPolicy) { +TEST_F(MainThreadSchedulerImplTest, TestDefaultPolicy) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 I1 D1 P1 C1 D2 P2 C2"); @@ -922,7 +923,7 @@ EXPECT_EQ(UseCase::kNone, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, TestDefaultPolicyWithSlowCompositor) { +TEST_F(MainThreadSchedulerImplTest, TestDefaultPolicyWithSlowCompositor) { RunSlowCompositorTask(); std::vector<std::string> run_order; @@ -939,7 +940,7 @@ EXPECT_EQ(UseCase::kNone, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestCompositorPolicy_CompositorHandlesInput_WithTouchHandler) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); @@ -955,7 +956,7 @@ EXPECT_EQ(UseCase::kCompositorGesture, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestCompositorPolicy_MainThreadHandlesInput_WithoutScrollUpdates) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); @@ -971,7 +972,7 @@ EXPECT_EQ(UseCase::kMainThreadCustomInputHandling, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestCompositorPolicy_MainThreadHandlesInput_WithoutPreventDefault) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); @@ -987,7 +988,7 @@ EXPECT_EQ(UseCase::kCompositorGesture, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestCompositorPolicy_CompositorHandlesInput_LongGestureDuration) { scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); EnableIdleTasks(); @@ -1020,7 +1021,7 @@ EXPECT_EQ(UseCase::kCompositorGesture, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestCompositorPolicy_CompositorHandlesInput_WithoutTouchHandler) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); @@ -1035,7 +1036,7 @@ EXPECT_EQ(UseCase::kCompositorGesture, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestCompositorPolicy_MainThreadHandlesInput_WithTouchHandler) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); @@ -1055,7 +1056,7 @@ WebInputEventResult::kHandledSystem); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestCompositorPolicy_MainThreadHandlesInput_WithoutTouchHandler) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); @@ -1074,7 +1075,7 @@ WebInputEventResult::kHandledSystem); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestCompositorPolicy_MainThreadHandlesInput_SingleEvent_PreventDefault) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); @@ -1098,7 +1099,7 @@ } TEST_F( - RendererSchedulerImplTest, + MainThreadSchedulerImplTest, TestCompositorPolicy_MainThreadHandlesInput_SingleEvent_NoPreventDefault) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); @@ -1121,7 +1122,7 @@ EXPECT_EQ(UseCase::kTouchstart, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_DidAnimateForInput) { +TEST_F(MainThreadSchedulerImplTest, TestCompositorPolicy_DidAnimateForInput) { std::vector<std::string> run_order; PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); @@ -1140,7 +1141,7 @@ EXPECT_EQ(UseCase::kCompositorGesture, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, Navigation_ResetsTaskCostEstimations) { +TEST_F(MainThreadSchedulerImplTest, Navigation_ResetsTaskCostEstimations) { std::vector<std::string> run_order; scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); @@ -1160,7 +1161,7 @@ testing::ElementsAre(std::string("C1"), std::string("T1"))); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveTimersDontRunWhenMainThreadScrolling) { std::vector<std::string> run_order; @@ -1179,7 +1180,7 @@ EXPECT_THAT(run_order, testing::ElementsAre(std::string("C1"))); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveTimersDoRunWhenMainThreadInputHandling) { std::vector<std::string> run_order; @@ -1199,7 +1200,7 @@ testing::ElementsAre(std::string("C1"), std::string("T1"))); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveTimersDoRunWhenMainThreadScrolling_AndOnCriticalPath) { std::vector<std::string> run_order; @@ -1219,7 +1220,7 @@ testing::ElementsAre(std::string("C1"), std::string("T1"))); } -TEST_F(RendererSchedulerImplTest, TestTouchstartPolicy_Compositor) { +TEST_F(MainThreadSchedulerImplTest, TestTouchstartPolicy_Compositor) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 D1 C1 D2 C2 T1 T2"); @@ -1260,7 +1261,7 @@ std::string("T2"))); } -TEST_F(RendererSchedulerImplTest, TestTouchstartPolicy_MainThread) { +TEST_F(MainThreadSchedulerImplTest, TestTouchstartPolicy_MainThread) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 D1 C1 D2 C2 T1 T2"); @@ -1313,7 +1314,7 @@ // TODO(alexclarke): Reenable once we've reinstaed the Loading // UseCase. -TEST_F(RendererSchedulerImplTest, DISABLED_LoadingUseCase) { +TEST_F(MainThreadSchedulerImplTest, DISABLED_LoadingUseCase) { std::vector<std::string> run_order; PostTestTasks(&run_order, "I1 D1 C1 T1 L1 D2 C2 T2 L2"); @@ -1346,7 +1347,7 @@ EXPECT_EQ(UseCase::kNone, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, EventConsumedOnCompositorThread_IgnoresMouseMove_WhenMouseUp) { RunSlowCompositorTask(); @@ -1366,7 +1367,7 @@ std::string("I1"))); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, EventForwardedToMainThread_IgnoresMouseMove_WhenMouseUp) { RunSlowCompositorTask(); @@ -1386,7 +1387,7 @@ std::string("I1"))); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, EventConsumedOnCompositorThread_MouseMove_WhenMouseDown) { std::vector<std::string> run_order; PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); @@ -1407,7 +1408,7 @@ std::string("I1"))); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, EventForwardedToMainThread_MouseMove_WhenMouseDown) { std::vector<std::string> run_order; PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); @@ -1429,7 +1430,7 @@ WebInputEventResult::kHandledSystem); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, EventForwardedToMainThread_MouseMove_WhenMouseDown_AfterMouseWheel) { // Simulate a main thread driven mouse wheel scroll gesture. SimulateMainThreadGestureStart(TouchEventPolicy::kSendTouchStart, @@ -1463,7 +1464,7 @@ std::string("I1"))); } -TEST_F(RendererSchedulerImplTest, EventForwardedToMainThread_MouseClick) { +TEST_F(MainThreadSchedulerImplTest, EventForwardedToMainThread_MouseClick) { // A mouse click should be detected as main thread input handling, which means // we won't try to defer expensive tasks because of one. We can, however, // prioritize compositing/input handling. @@ -1490,7 +1491,8 @@ std::string("I1"))); } -TEST_F(RendererSchedulerImplTest, EventConsumedOnCompositorThread_MouseWheel) { +TEST_F(MainThreadSchedulerImplTest, + EventConsumedOnCompositorThread_MouseWheel) { std::vector<std::string> run_order; PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); @@ -1507,7 +1509,7 @@ EXPECT_EQ(UseCase::kCompositorGesture, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, EventForwardedToMainThread_MouseWheel_PreventDefault) { std::vector<std::string> run_order; PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); @@ -1525,7 +1527,8 @@ EXPECT_EQ(UseCase::kMainThreadCustomInputHandling, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, EventForwardedToMainThread_NoPreventDefault) { +TEST_F(MainThreadSchedulerImplTest, + EventForwardedToMainThread_NoPreventDefault) { std::vector<std::string> run_order; PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); @@ -1552,7 +1555,7 @@ } TEST_F( - RendererSchedulerImplTest, + MainThreadSchedulerImplTest, EventForwardedToMainThreadAndBackToCompositor_MouseWheel_NoPreventDefault) { std::vector<std::string> run_order; PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); @@ -1579,7 +1582,7 @@ EXPECT_EQ(UseCase::kCompositorGesture, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, EventConsumedOnCompositorThread_IgnoresKeyboardEvents) { RunSlowCompositorTask(); @@ -1599,7 +1602,7 @@ EXPECT_EQ(UseCase::kNone, CurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, EventForwardedToMainThread_IgnoresKeyboardEvents) { RunSlowCompositorTask(); @@ -1623,7 +1626,7 @@ WebInputEventResult::kHandledSystem); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestMainthreadScrollingUseCaseDoesNotStarveDefaultTasks) { SimulateMainThreadGestureStart(TouchEventPolicy::kDontSendTouchStart, blink::WebInputEvent::kGestureScrollBegin); @@ -1648,7 +1651,7 @@ std::string("C2"))); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestCompositorPolicyEnds_CompositorHandlesInput) { SimulateCompositorGestureStart(TouchEventPolicy::kDontSendTouchStart); EXPECT_EQ(UseCase::kCompositorGesture, @@ -1658,7 +1661,7 @@ EXPECT_EQ(UseCase::kNone, ForceUpdatePolicyAndGetCurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestCompositorPolicyEnds_MainThreadHandlesInput) { SimulateMainThreadGestureStart(TouchEventPolicy::kDontSendTouchStart, blink::WebInputEvent::kGestureScrollBegin); @@ -1669,7 +1672,7 @@ EXPECT_EQ(UseCase::kNone, ForceUpdatePolicyAndGetCurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, TestTouchstartPolicyEndsAfterTimeout) { +TEST_F(MainThreadSchedulerImplTest, TestTouchstartPolicyEndsAfterTimeout) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 D1 C1 D2 C2"); @@ -1695,7 +1698,7 @@ std::string("D2"))); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestTouchstartPolicyEndsAfterConsecutiveTouchmoves) { std::vector<std::string> run_order; PostTestTasks(&run_order, "L1 D1 C1 D2 C2"); @@ -1726,7 +1729,7 @@ EXPECT_THAT(run_order, testing::ElementsAre(std::string("L1"))); } -TEST_F(RendererSchedulerImplTest, TestIsHighPriorityWorkAnticipated) { +TEST_F(MainThreadSchedulerImplTest, TestIsHighPriorityWorkAnticipated) { bool is_anticipated_before = false; bool is_anticipated_after = false; @@ -1792,7 +1795,7 @@ EXPECT_FALSE(is_anticipated_after); } -TEST_F(RendererSchedulerImplTest, TestShouldYield) { +TEST_F(MainThreadSchedulerImplTest, TestShouldYield) { bool should_yield_before = false; bool should_yield_after = false; @@ -1826,7 +1829,7 @@ EXPECT_TRUE(should_yield_after); } -TEST_F(RendererSchedulerImplTest, TestShouldYield_TouchStart) { +TEST_F(MainThreadSchedulerImplTest, TestShouldYield_TouchStart) { // Receiving a touchstart should immediately trigger yielding, even if // there's no immediately pending work in the compositor queue. EXPECT_FALSE(scheduler_->ShouldYieldForHighPriorityWork()); @@ -1837,7 +1840,7 @@ RunUntilIdle(); } -TEST_F(RendererSchedulerImplTest, SlowMainThreadInputEvent) { +TEST_F(MainThreadSchedulerImplTest, SlowMainThreadInputEvent) { EXPECT_EQ(UseCase::kNone, CurrentUseCase()); // An input event should bump us into input priority. @@ -1865,23 +1868,23 @@ EXPECT_EQ(UseCase::kNone, CurrentUseCase()); } -class RendererSchedulerImplWithMockSchedulerTest - : public RendererSchedulerImplTest { +class MainThreadSchedulerImplWithMockSchedulerTest + : public MainThreadSchedulerImplTest { public: void SetUp() override { mock_task_runner_ = base::MakeRefCounted<cc::OrderedSimpleTaskRunner>(&clock_, false); - mock_scheduler_ = new RendererSchedulerImplForTest( + mock_scheduler_ = new MainThreadSchedulerImplForTest( TaskQueueManagerForTest::Create(nullptr, mock_task_runner_, &clock_), base::nullopt); Initialize(base::WrapUnique(mock_scheduler_)); } protected: - RendererSchedulerImplForTest* mock_scheduler_; + MainThreadSchedulerImplForTest* mock_scheduler_; }; -TEST_F(RendererSchedulerImplWithMockSchedulerTest, +TEST_F(MainThreadSchedulerImplWithMockSchedulerTest, OnlyOnePendingUrgentPolicyUpdatey) { mock_scheduler_->EnsureUrgentPolicyUpdatePostedOnMainThread(); mock_scheduler_->EnsureUrgentPolicyUpdatePostedOnMainThread(); @@ -1893,7 +1896,7 @@ EXPECT_EQ(1, mock_scheduler_->update_policy_count_); } -TEST_F(RendererSchedulerImplWithMockSchedulerTest, +TEST_F(MainThreadSchedulerImplWithMockSchedulerTest, OnePendingDelayedAndOneUrgentUpdatePolicy) { ScopedAutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_); @@ -1907,7 +1910,7 @@ EXPECT_EQ(2, mock_scheduler_->update_policy_count_); } -TEST_F(RendererSchedulerImplWithMockSchedulerTest, +TEST_F(MainThreadSchedulerImplWithMockSchedulerTest, OneUrgentAndOnePendingDelayedUpdatePolicy) { ScopedAutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_); @@ -1921,7 +1924,7 @@ EXPECT_EQ(2, mock_scheduler_->update_policy_count_); } -TEST_F(RendererSchedulerImplWithMockSchedulerTest, +TEST_F(MainThreadSchedulerImplWithMockSchedulerTest, UpdatePolicyCountTriggeredByOneInputEvent) { // We expect DidHandleInputEventOnCompositorThread to post an urgent policy // update. @@ -1944,7 +1947,7 @@ EXPECT_EQ(2, mock_scheduler_->update_policy_count_); } -TEST_F(RendererSchedulerImplWithMockSchedulerTest, +TEST_F(MainThreadSchedulerImplWithMockSchedulerTest, UpdatePolicyCountTriggeredByThreeInputEvents) { // We expect DidHandleInputEventOnCompositorThread to post an urgent policy // update. @@ -1996,7 +1999,7 @@ EXPECT_EQ(3, mock_scheduler_->update_policy_count_); } -TEST_F(RendererSchedulerImplWithMockSchedulerTest, +TEST_F(MainThreadSchedulerImplWithMockSchedulerTest, UpdatePolicyCountTriggeredByTwoInputEventsWithALongSeparatingDelay) { // We expect DidHandleInputEventOnCompositorThread to post an urgent policy // update. @@ -2038,7 +2041,7 @@ EXPECT_EQ(4, mock_scheduler_->update_policy_count_); } -TEST_F(RendererSchedulerImplWithMockSchedulerTest, +TEST_F(MainThreadSchedulerImplWithMockSchedulerTest, EnsureUpdatePolicyNotTriggeredTooOften) { ScopedAutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_); @@ -2097,12 +2100,12 @@ std::string("none touchstart expected"), std::string("none"))); } -class RendererSchedulerImplWithMessageLoopTest - : public RendererSchedulerImplTest { +class MainThreadSchedulerImplWithMessageLoopTest + : public MainThreadSchedulerImplTest { public: - RendererSchedulerImplWithMessageLoopTest() - : RendererSchedulerImplTest(new base::MessageLoop()) {} - ~RendererSchedulerImplWithMessageLoopTest() override = default; + MainThreadSchedulerImplWithMessageLoopTest() + : MainThreadSchedulerImplTest(new base::MessageLoop()) {} + ~MainThreadSchedulerImplWithMessageLoopTest() override = default; void PostFromNestedRunloop( std::vector<std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>* @@ -2121,10 +2124,10 @@ } private: - DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplWithMessageLoopTest); + DISALLOW_COPY_AND_ASSIGN(MainThreadSchedulerImplWithMessageLoopTest); }; -TEST_F(RendererSchedulerImplWithMessageLoopTest, +TEST_F(MainThreadSchedulerImplWithMessageLoopTest, NonNestableIdleTaskDoesntExecuteInNestedLoop) { std::vector<std::string> order; idle_task_runner_->PostIdleTask( @@ -2149,7 +2152,7 @@ default_task_runner_->PostTask( FROM_HERE, base::BindOnce( - &RendererSchedulerImplWithMessageLoopTest::PostFromNestedRunloop, + &MainThreadSchedulerImplWithMessageLoopTest::PostFromNestedRunloop, base::Unretained(this), base::Unretained(&tasks_to_post_from_nested_loop))); @@ -2161,7 +2164,7 @@ std::string("3"))); } -TEST_F(RendererSchedulerImplTest, TestBeginMainFrameNotExpectedUntil) { +TEST_F(MainThreadSchedulerImplTest, TestBeginMainFrameNotExpectedUntil) { base::TimeDelta ten_millis(base::TimeDelta::FromMilliseconds(10)); base::TimeTicks expected_deadline = clock_.NowTicks() + ten_millis; base::TimeTicks deadline_in_task; @@ -2183,7 +2186,7 @@ EXPECT_EQ(expected_deadline, deadline_in_task); } -TEST_F(RendererSchedulerImplTest, TestLongIdlePeriod) { +TEST_F(MainThreadSchedulerImplTest, TestLongIdlePeriod) { base::TimeTicks expected_deadline = clock_.NowTicks() + maximum_idle_period_duration(); base::TimeTicks deadline_in_task; @@ -2201,7 +2204,7 @@ EXPECT_EQ(expected_deadline, deadline_in_task); } -TEST_F(RendererSchedulerImplTest, TestLongIdlePeriodWithPendingDelayedTask) { +TEST_F(MainThreadSchedulerImplTest, TestLongIdlePeriodWithPendingDelayedTask) { base::TimeDelta pending_task_delay = base::TimeDelta::FromMilliseconds(30); base::TimeTicks expected_deadline = clock_.NowTicks() + pending_task_delay; base::TimeTicks deadline_in_task; @@ -2218,7 +2221,7 @@ EXPECT_EQ(expected_deadline, deadline_in_task); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, TestLongIdlePeriodWithLatePendingDelayedTask) { base::TimeDelta pending_task_delay = base::TimeDelta::FromMilliseconds(10); base::TimeTicks deadline_in_task; @@ -2245,7 +2248,7 @@ EXPECT_EQ(1, run_count); } -TEST_F(RendererSchedulerImplTest, TestLongIdlePeriodRepeating) { +TEST_F(MainThreadSchedulerImplTest, TestLongIdlePeriodRepeating) { ScopedAutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_); std::vector<base::TimeTicks> actual_deadlines; int run_count = 0; @@ -2283,7 +2286,7 @@ EXPECT_EQ(4, run_count); } -TEST_F(RendererSchedulerImplTest, TestLongIdlePeriodInTouchStartPolicy) { +TEST_F(MainThreadSchedulerImplTest, TestLongIdlePeriodInTouchStartPolicy) { base::TimeTicks deadline_in_task; int run_count = 0; @@ -2312,7 +2315,7 @@ (*run_count)++; } -TEST_F(RendererSchedulerImplTest, CanExceedIdleDeadlineIfRequired) { +TEST_F(MainThreadSchedulerImplTest, CanExceedIdleDeadlineIfRequired) { int run_count = 0; bool can_exceed_idle_deadline = false; @@ -2362,7 +2365,7 @@ EXPECT_FALSE(scheduler_->CanExceedIdleDeadlineIfRequired()); } -TEST_F(RendererSchedulerImplTest, TestRendererHiddenIdlePeriod) { +TEST_F(MainThreadSchedulerImplTest, TestRendererHiddenIdlePeriod) { ScopedAutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_); int run_count = 0; @@ -2397,7 +2400,7 @@ EXPECT_EQ(2, run_count); } -TEST_F(RendererSchedulerImplTest, TimerQueueEnabledByDefault) { +TEST_F(MainThreadSchedulerImplTest, TimerQueueEnabledByDefault) { std::vector<std::string> run_order; PostTestTasks(&run_order, "T1 T2"); RunUntilIdle(); @@ -2405,7 +2408,7 @@ testing::ElementsAre(std::string("T1"), std::string("T2"))); } -TEST_F(RendererSchedulerImplTest, StopAndResumeRenderer) { +TEST_F(MainThreadSchedulerImplTest, StopAndResumeRenderer) { std::vector<std::string> run_order; PostTestTasks(&run_order, "T1 T2"); @@ -2419,7 +2422,7 @@ testing::ElementsAre(std::string("T1"), std::string("T2"))); } -TEST_F(RendererSchedulerImplTest, StopAndThrottleTimerQueue) { +TEST_F(MainThreadSchedulerImplTest, StopAndThrottleTimerQueue) { std::vector<std::string> run_order; PostTestTasks(&run_order, "T1 T2"); @@ -2431,7 +2434,7 @@ EXPECT_THAT(run_order, testing::ElementsAre()); } -TEST_F(RendererSchedulerImplTest, ThrottleAndPauseRenderer) { +TEST_F(MainThreadSchedulerImplTest, ThrottleAndPauseRenderer) { std::vector<std::string> run_order; PostTestTasks(&run_order, "T1 T2"); @@ -2443,7 +2446,7 @@ EXPECT_THAT(run_order, testing::ElementsAre()); } -TEST_F(RendererSchedulerImplTest, MultipleStopsNeedMultipleResumes) { +TEST_F(MainThreadSchedulerImplTest, MultipleStopsNeedMultipleResumes) { std::vector<std::string> run_order; PostTestTasks(&run_order, "T1 T2"); @@ -2467,7 +2470,7 @@ testing::ElementsAre(std::string("T1"), std::string("T2"))); } -TEST_F(RendererSchedulerImplTest, PauseRenderer) { +TEST_F(MainThreadSchedulerImplTest, PauseRenderer) { // Tasks in some queues don't fire when the renderer is paused. std::vector<std::string> run_order; PostTestTasks(&run_order, "D1 C1 L1 I1 T1"); @@ -2486,11 +2489,11 @@ testing::ElementsAre(std::string("L1"), std::string("T1"))); } -TEST_F(RendererSchedulerImplTest, UseCaseToString) { +TEST_F(MainThreadSchedulerImplTest, UseCaseToString) { CheckAllUseCaseToString(); } -TEST_F(RendererSchedulerImplTest, MismatchedDidHandleInputEventOnMainThread) { +TEST_F(MainThreadSchedulerImplTest, MismatchedDidHandleInputEventOnMainThread) { // This should not DCHECK because there was no corresponding compositor side // call to DidHandleInputEventOnCompositorThread with // INPUT_EVENT_ACK_STATE_NOT_CONSUMED. There are legitimate reasons for the @@ -2500,7 +2503,7 @@ WebInputEventResult::kHandledSystem); } -TEST_F(RendererSchedulerImplTest, BeginMainFrameOnCriticalPath) { +TEST_F(MainThreadSchedulerImplTest, BeginMainFrameOnCriticalPath) { ASSERT_FALSE(scheduler_->BeginMainFrameOnCriticalPath()); viz::BeginFrameArgs begin_frame_args = viz::BeginFrameArgs::Create( @@ -2515,7 +2518,7 @@ ASSERT_FALSE(scheduler_->BeginMainFrameOnCriticalPath()); } -TEST_F(RendererSchedulerImplTest, ShutdownPreventsPostingOfNewTasks) { +TEST_F(MainThreadSchedulerImplTest, ShutdownPreventsPostingOfNewTasks) { scheduler_->Shutdown(); std::vector<std::string> run_order; PostTestTasks(&run_order, "D1 C1"); @@ -2523,7 +2526,7 @@ EXPECT_THAT(run_order, testing::ElementsAre()); } -TEST_F(RendererSchedulerImplTest, TestRendererBackgroundedTimerSuspension) { +TEST_F(MainThreadSchedulerImplTest, TestRendererBackgroundedTimerSuspension) { scheduler_->SetStoppingWhenBackgroundedEnabled(true); std::vector<std::string> run_order; @@ -2575,7 +2578,7 @@ EXPECT_THAT(run_order, testing::ElementsAre(std::string("T6"))); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveLoadingTasksNotBlockedTillFirstBeginMainFrame) { std::vector<std::string> run_order; @@ -2609,7 +2612,7 @@ EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveLoadingTasksNotBlockedIfNoTouchHandler) { std::vector<std::string> run_order; @@ -2630,7 +2633,7 @@ EXPECT_EQ(v8::PERFORMANCE_ANIMATION, GetRAILMode()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveTimerTaskBlocked_UseCase_NONE_PreviousCompositorGesture) { std::vector<std::string> run_order; @@ -2651,7 +2654,7 @@ EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveTimerTaskNotBlocked_UseCase_NONE_PreviousMainThreadGesture) { std::vector<std::string> run_order; @@ -2687,7 +2690,7 @@ EXPECT_EQ(v8::PERFORMANCE_ANIMATION, GetRAILMode()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveTimerTaskBlocked_UseCase_kCompositorGesture) { std::vector<std::string> run_order; @@ -2710,7 +2713,7 @@ EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveTimerTaskBlocked_EvenIfBeginMainFrameNotExpectedSoon) { std::vector<std::string> run_order; @@ -2732,7 +2735,7 @@ EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveLoadingTasksBlockedIfChildFrameNavigationExpected) { std::vector<std::string> run_order; @@ -2751,7 +2754,7 @@ EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected) { std::vector<std::string> run_order; @@ -2793,7 +2796,7 @@ EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected_Multiple) { std::vector<std::string> run_order; @@ -2853,7 +2856,7 @@ EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveLoadingTasksNotBlockedDuringMainThreadGestures) { std::vector<std::string> run_order; @@ -2875,7 +2878,7 @@ EXPECT_EQ(v8::PERFORMANCE_ANIMATION, GetRAILMode()); } -TEST_F(RendererSchedulerImplTest, ModeratelyExpensiveTimer_NotBlocked) { +TEST_F(MainThreadSchedulerImplTest, ModeratelyExpensiveTimer_NotBlocked) { scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); SimulateMainThreadGestureStart(TouchEventPolicy::kSendTouchStart, blink::WebInputEvent::kTouchMove); @@ -2892,14 +2895,15 @@ compositor_task_runner_->PostTask( FROM_HERE, - base::BindOnce(&RendererSchedulerImplTest:: + base::BindOnce(&MainThreadSchedulerImplTest:: SimulateMainThreadInputHandlingCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(8))); timer_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&RendererSchedulerImplTest::SimulateTimerTask, - base::Unretained(this), - base::TimeDelta::FromMilliseconds(4))); + FROM_HERE, + base::BindOnce(&MainThreadSchedulerImplTest::SimulateTimerTask, + base::Unretained(this), + base::TimeDelta::FromMilliseconds(4))); RunUntilIdle(); EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; @@ -2915,7 +2919,7 @@ } } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, FourtyMsTimer_NotBlocked_CompositorScrolling) { scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); RunUntilIdle(); @@ -2933,12 +2937,13 @@ compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce( - &RendererSchedulerImplTest::SimulateMainThreadCompositorTask, + &MainThreadSchedulerImplTest::SimulateMainThreadCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(8))); timer_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&RendererSchedulerImplTest::SimulateTimerTask, - base::Unretained(this), - base::TimeDelta::FromMilliseconds(40))); + FROM_HERE, + base::BindOnce(&MainThreadSchedulerImplTest::SimulateTimerTask, + base::Unretained(this), + base::TimeDelta::FromMilliseconds(40))); RunUntilIdle(); EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; @@ -2953,7 +2958,7 @@ } } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveTimer_NotBlocked_UseCase_MAIN_THREAD_CUSTOM_INPUT_HANDLING) { scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); SimulateMainThreadGestureStart(TouchEventPolicy::kSendTouchStart, @@ -2971,14 +2976,15 @@ compositor_task_runner_->PostTask( FROM_HERE, - base::BindOnce(&RendererSchedulerImplTest:: + base::BindOnce(&MainThreadSchedulerImplTest:: SimulateMainThreadInputHandlingCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(8))); timer_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&RendererSchedulerImplTest::SimulateTimerTask, - base::Unretained(this), - base::TimeDelta::FromMilliseconds(10))); + FROM_HERE, + base::BindOnce(&MainThreadSchedulerImplTest::SimulateTimerTask, + base::Unretained(this), + base::TimeDelta::FromMilliseconds(10))); RunUntilIdle(); EXPECT_EQ(UseCase::kMainThreadCustomInputHandling, CurrentUseCase()) @@ -2998,14 +3004,14 @@ } } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, EstimateLongestJankFreeTaskDuration_UseCase_NONE) { EXPECT_EQ(UseCase::kNone, CurrentUseCase()); EXPECT_EQ(rails_response_time(), scheduler_->EstimateLongestJankFreeTaskDuration()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, EstimateLongestJankFreeTaskDuration_UseCase_kCompositorGesture) { SimulateCompositorGestureStart(TouchEventPolicy::kDontSendTouchStart); EXPECT_EQ(UseCase::kCompositorGesture, @@ -3016,7 +3022,7 @@ // TODO(alexclarke): Reenable once we've reinstaed the Loading // UseCase. -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, DISABLED_EstimateLongestJankFreeTaskDuration_UseCase_) { scheduler_->DidStartProvisionalLoad(true); EXPECT_EQ(UseCase::kLoading, ForceUpdatePolicyAndGetCurrentUseCase()); @@ -3024,7 +3030,7 @@ scheduler_->EstimateLongestJankFreeTaskDuration()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, EstimateLongestJankFreeTaskDuration_UseCase_MAIN_THREAD_GESTURE) { SimulateMainThreadGestureStart(TouchEventPolicy::kSendTouchStart, blink::WebInputEvent::kGestureScrollUpdate); @@ -3037,7 +3043,7 @@ compositor_task_runner_->PostTask( FROM_HERE, - base::BindOnce(&RendererSchedulerImplTest:: + base::BindOnce(&MainThreadSchedulerImplTest:: SimulateMainThreadInputHandlingCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(5))); @@ -3051,7 +3057,7 @@ } TEST_F( - RendererSchedulerImplTest, + MainThreadSchedulerImplTest, EstimateLongestJankFreeTaskDuration_UseCase_MAIN_THREAD_CUSTOM_INPUT_HANDLING) { viz::BeginFrameArgs begin_frame_args = viz::BeginFrameArgs::Create( BEGINFRAME_FROM_HERE, 0, next_begin_frame_number_++, clock_.NowTicks(), @@ -3062,7 +3068,7 @@ compositor_task_runner_->PostTask( FROM_HERE, - base::BindOnce(&RendererSchedulerImplTest:: + base::BindOnce(&MainThreadSchedulerImplTest:: SimulateMainThreadInputHandlingCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(5))); @@ -3075,7 +3081,7 @@ scheduler_->EstimateLongestJankFreeTaskDuration()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, EstimateLongestJankFreeTaskDuration_UseCase_SYNCHRONIZED_GESTURE) { SimulateCompositorGestureStart(TouchEventPolicy::kDontSendTouchStart); @@ -3089,7 +3095,7 @@ compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce( - &RendererSchedulerImplTest::SimulateMainThreadCompositorTask, + &MainThreadSchedulerImplTest::SimulateMainThreadCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(5))); RunUntilIdle(); @@ -3102,7 +3108,7 @@ class PageSchedulerImplForTest : public PageSchedulerImpl { public: - explicit PageSchedulerImplForTest(RendererSchedulerImpl* scheduler) + explicit PageSchedulerImplForTest(MainThreadSchedulerImpl* scheduler) : PageSchedulerImpl(nullptr, scheduler, false) {} ~PageSchedulerImplForTest() override = default; @@ -3136,7 +3142,7 @@ } } // namespace -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, SYNCHRONIZED_GESTURE_TimerTaskThrottling_task_expensive) { SimulateCompositorGestureStart(TouchEventPolicy::kSendTouchStart); @@ -3165,11 +3171,11 @@ compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce( - &RendererSchedulerImplTest::SimulateMainThreadCompositorTask, + &MainThreadSchedulerImplTest::SimulateMainThreadCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(10))); mock_task_runner_->RunTasksWhile(base::BindRepeating( - &RendererSchedulerImplTest::SimulatedCompositorTaskPending, + &MainThreadSchedulerImplTest::SimulatedCompositorTaskPending, base::Unretained(this))); EXPECT_EQ(UseCase::kSynchronizedGesture, CurrentUseCase()) << "i = " << i; @@ -3199,7 +3205,7 @@ EXPECT_EQ(12u, count); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, SYNCHRONIZED_GESTURE_TimerTaskThrottling_TimersStopped) { SimulateCompositorGestureStart(TouchEventPolicy::kSendTouchStart); @@ -3229,11 +3235,11 @@ compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce( - &RendererSchedulerImplTest::SimulateMainThreadCompositorTask, + &MainThreadSchedulerImplTest::SimulateMainThreadCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(10))); mock_task_runner_->RunTasksWhile(base::BindRepeating( - &RendererSchedulerImplTest::SimulatedCompositorTaskPending, + &MainThreadSchedulerImplTest::SimulatedCompositorTaskPending, base::Unretained(this))); EXPECT_EQ(UseCase::kSynchronizedGesture, CurrentUseCase()) << "i = " << i; @@ -3259,7 +3265,7 @@ EXPECT_EQ(2u, count); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, SYNCHRONIZED_GESTURE_TimerTaskThrottling_task_not_expensive) { SimulateCompositorGestureStart(TouchEventPolicy::kSendTouchStart); @@ -3285,11 +3291,11 @@ compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce( - &RendererSchedulerImplTest::SimulateMainThreadCompositorTask, + &MainThreadSchedulerImplTest::SimulateMainThreadCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(10))); mock_task_runner_->RunTasksWhile(base::BindRepeating( - &RendererSchedulerImplTest::SimulatedCompositorTaskPending, + &MainThreadSchedulerImplTest::SimulatedCompositorTaskPending, base::Unretained(this))); EXPECT_EQ(UseCase::kSynchronizedGesture, CurrentUseCase()) << "i = " << i; EXPECT_TRUE(timer_task_runner_->IsQueueEnabled()) << "i = " << i; @@ -3299,7 +3305,7 @@ EXPECT_EQ(500u, count); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, ExpensiveTimerTaskBlocked_SYNCHRONIZED_GESTURE_TouchStartExpected) { SimulateExpensiveTasks(timer_task_runner_); SimulateCompositorGestureStart(TouchEventPolicy::kSendTouchStart); @@ -3326,7 +3332,7 @@ EXPECT_FALSE(timer_task_runner_->IsQueueEnabled()); } -TEST_F(RendererSchedulerImplTest, DenyLongIdleDuringTouchStart) { +TEST_F(MainThreadSchedulerImplTest, DenyLongIdleDuringTouchStart) { scheduler_->DidHandleInputEventOnCompositorThread( FakeInputEvent(blink::WebInputEvent::kTouchStart), InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); @@ -3346,7 +3352,8 @@ EXPECT_GE(next_time_to_check, base::TimeDelta()); } -TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_TouchStartDuringFling) { +TEST_F(MainThreadSchedulerImplTest, + TestCompositorPolicy_TouchStartDuringFling) { scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); scheduler_->DidAnimateForInputOnCompositorThread(); // Note DidAnimateForInputOnCompositorThread does not by itself trigger a @@ -3361,7 +3368,7 @@ EXPECT_EQ(UseCase::kTouchstart, ForceUpdatePolicyAndGetCurrentUseCase()); } -TEST_F(RendererSchedulerImplTest, SYNCHRONIZED_GESTURE_CompositingExpensive) { +TEST_F(MainThreadSchedulerImplTest, SYNCHRONIZED_GESTURE_CompositingExpensive) { SimulateCompositorGestureStart(TouchEventPolicy::kSendTouchStart); // With the compositor task taking 20ms, there is not enough time to run @@ -3386,11 +3393,11 @@ compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce( - &RendererSchedulerImplTest::SimulateMainThreadCompositorTask, + &MainThreadSchedulerImplTest::SimulateMainThreadCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(20))); mock_task_runner_->RunTasksWhile(base::BindRepeating( - &RendererSchedulerImplTest::SimulatedCompositorTaskPending, + &MainThreadSchedulerImplTest::SimulatedCompositorTaskPending, base::Unretained(this))); EXPECT_EQ(UseCase::kSynchronizedGesture, CurrentUseCase()) << "i = " << i; } @@ -3402,7 +3409,7 @@ EXPECT_EQ(1000u, run_order.size()); } -TEST_F(RendererSchedulerImplTest, MAIN_THREAD_CUSTOM_INPUT_HANDLING) { +TEST_F(MainThreadSchedulerImplTest, MAIN_THREAD_CUSTOM_INPUT_HANDLING) { SimulateMainThreadGestureStart(TouchEventPolicy::kSendTouchStart, blink::WebInputEvent::kGestureScrollBegin); @@ -3428,11 +3435,11 @@ compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce( - &RendererSchedulerImplTest::SimulateMainThreadCompositorTask, + &MainThreadSchedulerImplTest::SimulateMainThreadCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(20))); mock_task_runner_->RunTasksWhile(base::BindRepeating( - &RendererSchedulerImplTest::SimulatedCompositorTaskPending, + &MainThreadSchedulerImplTest::SimulatedCompositorTaskPending, base::Unretained(this))); EXPECT_EQ(UseCase::kMainThreadCustomInputHandling, CurrentUseCase()) << "i = " << i; @@ -3445,7 +3452,7 @@ EXPECT_EQ(1000u, run_order.size()); } -TEST_F(RendererSchedulerImplTest, MAIN_THREAD_GESTURE) { +TEST_F(MainThreadSchedulerImplTest, MAIN_THREAD_GESTURE) { SimulateMainThreadGestureStart(TouchEventPolicy::kDontSendTouchStart, blink::WebInputEvent::kGestureScrollBegin); @@ -3472,11 +3479,11 @@ compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce( - &RendererSchedulerImplTest::SimulateMainThreadCompositorTask, + &MainThreadSchedulerImplTest::SimulateMainThreadCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(20))); mock_task_runner_->RunTasksWhile(base::BindRepeating( - &RendererSchedulerImplTest::SimulatedCompositorTaskPending, + &MainThreadSchedulerImplTest::SimulatedCompositorTaskPending, base::Unretained(this))); EXPECT_EQ(UseCase::kMainThreadGesture, CurrentUseCase()) << "i = " << i; } @@ -3491,7 +3498,7 @@ MOCK_METHOD1(OnRAILModeChanged, void(v8::RAILMode rail_mode)); }; -TEST_F(RendererSchedulerImplTest, TestResponseRAILMode) { +TEST_F(MainThreadSchedulerImplTest, TestResponseRAILMode) { MockRAILModeObserver observer; scheduler_->SetRAILModeObserver(&observer); EXPECT_CALL(observer, OnRAILModeChanged(v8::PERFORMANCE_RESPONSE)); @@ -3503,7 +3510,7 @@ scheduler_->SetRAILModeObserver(nullptr); } -TEST_F(RendererSchedulerImplTest, TestAnimateRAILMode) { +TEST_F(MainThreadSchedulerImplTest, TestAnimateRAILMode) { MockRAILModeObserver observer; scheduler_->SetRAILModeObserver(&observer); EXPECT_CALL(observer, OnRAILModeChanged(v8::PERFORMANCE_ANIMATION)).Times(0); @@ -3514,7 +3521,7 @@ scheduler_->SetRAILModeObserver(nullptr); } -TEST_F(RendererSchedulerImplTest, TestIdleRAILMode) { +TEST_F(MainThreadSchedulerImplTest, TestIdleRAILMode) { MockRAILModeObserver observer; scheduler_->SetRAILModeObserver(&observer); EXPECT_CALL(observer, OnRAILModeChanged(v8::PERFORMANCE_ANIMATION)); @@ -3529,7 +3536,7 @@ scheduler_->SetRAILModeObserver(nullptr); } -TEST_F(RendererSchedulerImplTest, TestLoadRAILMode) { +TEST_F(MainThreadSchedulerImplTest, TestLoadRAILMode) { MockRAILModeObserver observer; scheduler_->SetRAILModeObserver(&observer); EXPECT_CALL(observer, OnRAILModeChanged(v8::PERFORMANCE_ANIMATION)); @@ -3544,7 +3551,7 @@ scheduler_->SetRAILModeObserver(nullptr); } -TEST_F(RendererSchedulerImplTest, InputTerminatesLoadRAILMode) { +TEST_F(MainThreadSchedulerImplTest, InputTerminatesLoadRAILMode) { MockRAILModeObserver observer; scheduler_->SetRAILModeObserver(&observer); EXPECT_CALL(observer, OnRAILModeChanged(v8::PERFORMANCE_ANIMATION)); @@ -3565,7 +3572,7 @@ scheduler_->SetRAILModeObserver(nullptr); } -TEST_F(RendererSchedulerImplTest, UnthrottledTaskRunner) { +TEST_F(MainThreadSchedulerImplTest, UnthrottledTaskRunner) { // Ensure neither suspension nor timer task throttling affects an unthrottled // task runner. SimulateCompositorGestureStart(TouchEventPolicy::kSendTouchStart); @@ -3598,11 +3605,11 @@ compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce( - &RendererSchedulerImplTest::SimulateMainThreadCompositorTask, + &MainThreadSchedulerImplTest::SimulateMainThreadCompositorTask, base::Unretained(this), base::TimeDelta::FromMilliseconds(10))); mock_task_runner_->RunTasksWhile(base::BindRepeating( - &RendererSchedulerImplTest::SimulatedCompositorTaskPending, + &MainThreadSchedulerImplTest::SimulatedCompositorTaskPending, base::Unretained(this))); EXPECT_EQ(UseCase::kSynchronizedGesture, CurrentUseCase()) << "i = " << i; } @@ -3611,7 +3618,7 @@ EXPECT_EQ(500u, unthrottled_count); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, VirtualTimePolicyDoesNotAffectNewTimerTaskQueueIfVirtualTimeNotEnabled) { scheduler_->SetVirtualTimePolicy( PageSchedulerImpl::VirtualTimePolicy::kPause); @@ -3620,10 +3627,10 @@ EXPECT_FALSE(timer_tq->HasActiveFence()); } -TEST_F(RendererSchedulerImplTest, EnableVirtualTime) { +TEST_F(MainThreadSchedulerImplTest, EnableVirtualTime) { EXPECT_FALSE(scheduler_->IsVirtualTimeEnabled()); scheduler_->EnableVirtualTime( - RendererSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); + MainThreadSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); EXPECT_TRUE(scheduler_->IsVirtualTimeEnabled()); scoped_refptr<MainThreadTaskQueue> loading_tq = scheduler_->NewLoadingTaskQueue( @@ -3682,7 +3689,7 @@ scheduler_->GetVirtualTimeDomain()); } -TEST_F(RendererSchedulerImplTest, EnableVirtualTimeAfterThrottling) { +TEST_F(MainThreadSchedulerImplTest, EnableVirtualTimeAfterThrottling) { std::unique_ptr<PageSchedulerImpl> page_scheduler = base::WrapUnique( new PageSchedulerImpl(nullptr, scheduler_.get(), false /* disable_background_timer_throttling */)); @@ -3699,14 +3706,14 @@ EXPECT_TRUE(scheduler_->task_queue_throttler()->IsThrottled(timer_tq)); scheduler_->EnableVirtualTime( - RendererSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); + MainThreadSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); EXPECT_EQ(timer_tq->GetTimeDomain(), scheduler_->GetVirtualTimeDomain()); EXPECT_FALSE(scheduler_->task_queue_throttler()->IsThrottled(timer_tq)); } -TEST_F(RendererSchedulerImplTest, DisableVirtualTimeForTesting) { +TEST_F(MainThreadSchedulerImplTest, DisableVirtualTimeForTesting) { scheduler_->EnableVirtualTime( - RendererSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); + MainThreadSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); scoped_refptr<MainThreadTaskQueue> timer_tq = scheduler_->NewTimerTaskQueue( MainThreadTaskQueue::QueueType::kFrameThrottleable); @@ -3730,9 +3737,9 @@ EXPECT_FALSE(scheduler_->VirtualTimeControlTaskQueue()); } -TEST_F(RendererSchedulerImplTest, VirtualTimePauser) { +TEST_F(MainThreadSchedulerImplTest, VirtualTimePauser) { scheduler_->EnableVirtualTime( - RendererSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); + MainThreadSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); scheduler_->SetVirtualTimePolicy( PageSchedulerImpl::VirtualTimePolicy::kDeterministicLoading); @@ -3751,9 +3758,9 @@ EXPECT_EQ(after, before); } -TEST_F(RendererSchedulerImplTest, VirtualTimePauserNonInstantTask) { +TEST_F(MainThreadSchedulerImplTest, VirtualTimePauserNonInstantTask) { scheduler_->EnableVirtualTime( - RendererSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); + MainThreadSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); scheduler_->SetVirtualTimePolicy( PageSchedulerImpl::VirtualTimePolicy::kDeterministicLoading); @@ -3768,7 +3775,7 @@ EXPECT_GT(after, before); } -TEST_F(RendererSchedulerImplTest, Tracing) { +TEST_F(MainThreadSchedulerImplTest, Tracing) { // This test sets renderer scheduler to some non-trivial state // (by posting tasks, creating child schedulers, etc) and converts it into a // traced value. This test checks that no internal checks fire during this. @@ -3807,7 +3814,7 @@ // TODO(altimin@): Re-enable after splitting the timer policy into separate // policies. -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, DISABLED_DefaultTimerTasksAreThrottledWhenBackgrounded) { ScopedAutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_); @@ -3839,7 +3846,7 @@ base::TimeDelta::FromMilliseconds(1300))); } -TEST_F(RendererSchedulerImplTest, UnresponsiveMainThread) { +TEST_F(MainThreadSchedulerImplTest, UnresponsiveMainThread) { EXPECT_FALSE( scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold())); @@ -3860,7 +3867,7 @@ // for a task shorter than the length of the window (1s), the critical value of // the length of task x can be calculated by (x/2) * (x/1) = 0.2, in which x = // 0.6324. -TEST_F(RendererSchedulerImplTest, UnresponsiveMainThreadAboveThreshold) { +TEST_F(MainThreadSchedulerImplTest, UnresponsiveMainThreadAboveThreshold) { EXPECT_FALSE( scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold())); @@ -3873,7 +3880,7 @@ // for a task shorter than the length of the window (1s), the critical value of // the length of task x can be calculated by (x/2) * (x/1) = 0.2, in which x = // 0.6324. -TEST_F(RendererSchedulerImplTest, ResponsiveMainThreadBelowThreshold) { +TEST_F(MainThreadSchedulerImplTest, ResponsiveMainThreadBelowThreshold) { EXPECT_FALSE( scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold())); @@ -3882,7 +3889,7 @@ scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold())); } -TEST_F(RendererSchedulerImplTest, ResponsiveMainThreadDuringTask) { +TEST_F(MainThreadSchedulerImplTest, ResponsiveMainThreadDuringTask) { EXPECT_FALSE( scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold())); clock_.Advance(base::TimeDelta::FromSecondsD(2)); @@ -3891,7 +3898,7 @@ scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold())); } -TEST_F(RendererSchedulerImplTest, UnresponsiveMainThreadWithContention) { +TEST_F(MainThreadSchedulerImplTest, UnresponsiveMainThreadWithContention) { // Process a long task, lock the queueing time estimator, and check that we // still report the main thread is unresponsive. AdvanceTimeWithTask(1); @@ -3926,7 +3933,7 @@ // // MaxEQT1 = 500ms is recorded and observed in histogram. // MaxEQT2 is recorded but not yet in histogram for not being flushed. -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, MaxQueueingTimeMetricRecordedOnlyDuringNavigation) { base::HistogramTester tester; // Start with a long task whose queueing time will be ignored. @@ -3946,7 +3953,7 @@ } // Only the max of all the queueing times is recorded. -TEST_F(RendererSchedulerImplTest, MaxQueueingTimeMetricRecordTheMax) { +TEST_F(MainThreadSchedulerImplTest, MaxQueueingTimeMetricRecordTheMax) { base::HistogramTester tester; scheduler_->DidCommitProvisionalLoad(false, false, false); // The smaller queuing time will be ignored. @@ -3959,7 +3966,7 @@ tester.ExpectUniqueSample("RendererScheduler.MaxQueueingTime", 500, 1); } -TEST_F(RendererSchedulerImplTest, DidCommitProvisionalLoad) { +TEST_F(MainThreadSchedulerImplTest, DidCommitProvisionalLoad) { scheduler_->OnFirstMeaningfulPaint(); EXPECT_FALSE(scheduler_->waiting_for_meaningful_paint()); @@ -4013,7 +4020,7 @@ EXPECT_TRUE(scheduler_->waiting_for_meaningful_paint()); // State cleared. } -TEST_F(RendererSchedulerImplTest, LoadingControlTasks) { +TEST_F(MainThreadSchedulerImplTest, LoadingControlTasks) { // Expect control loading tasks (M) to jump ahead of any regular loading // tasks (L). std::vector<std::string> run_order; @@ -4026,7 +4033,7 @@ std::string("L5"), std::string("L6"))); } -TEST_F(RendererSchedulerImplTest, RequestBeginMainFrameNotExpected) { +TEST_F(MainThreadSchedulerImplTest, RequestBeginMainFrameNotExpected) { std::unique_ptr<PageSchedulerImplForTest> page_scheduler = std::make_unique<PageSchedulerImplForTest>(scheduler_.get()); scheduler_->AddPageScheduler(page_scheduler.get()); @@ -4045,7 +4052,7 @@ Mock::VerifyAndClearExpectations(page_scheduler.get()); } -TEST_F(RendererSchedulerImplTest, +TEST_F(MainThreadSchedulerImplTest, RequestBeginMainFrameNotExpected_MultipleCalls) { std::unique_ptr<PageSchedulerImplForTest> page_scheduler = std::make_unique<PageSchedulerImplForTest>(scheduler_.get()); @@ -4061,7 +4068,7 @@ } #if defined(OS_ANDROID) -TEST_F(RendererSchedulerImplTest, PauseTimersForAndroidWebView) { +TEST_F(MainThreadSchedulerImplTest, PauseTimersForAndroidWebView) { ScopedAutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_); // Tasks in some queues don't fire when the timers are paused. std::vector<std::string> run_order; @@ -4080,15 +4087,15 @@ } #endif // defined(OS_ANDROID) -class RendererSchedulerImplWithInitalVirtualTimeTest - : public RendererSchedulerImplTest { +class MainThreadSchedulerImplWithInitalVirtualTimeTest + : public MainThreadSchedulerImplTest { public: void SetUp() override { if (!message_loop_) { mock_task_runner_ = base::MakeRefCounted<cc::OrderedSimpleTaskRunner>(&clock_, false); } - Initialize(std::make_unique<RendererSchedulerImplForTest>( + Initialize(std::make_unique<MainThreadSchedulerImplForTest>( TaskQueueManagerForTest::Create( message_loop_.get(), message_loop_ ? message_loop_->task_runner() : mock_task_runner_, @@ -4097,13 +4104,13 @@ } }; -TEST_F(RendererSchedulerImplWithInitalVirtualTimeTest, VirtualTimeOverride) { +TEST_F(MainThreadSchedulerImplWithInitalVirtualTimeTest, VirtualTimeOverride) { EXPECT_TRUE(scheduler_->IsVirtualTimeEnabled()); EXPECT_EQ(PageSchedulerImpl::VirtualTimePolicy::kPause, scheduler_->virtual_time_policy()); EXPECT_EQ(base::Time::Now(), base::Time::FromJsTime(1000000.0)); } -} // namespace renderer_scheduler_impl_unittest +} // namespace main_thread_scheduler_impl_unittest } // namespace scheduler } // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc index d2f05d15..01ff526a 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
@@ -93,10 +93,11 @@ } // namespace -PageSchedulerImpl::PageSchedulerImpl(PageScheduler::Delegate* delegate, - RendererSchedulerImpl* renderer_scheduler, - bool disable_background_timer_throttling) - : renderer_scheduler_(renderer_scheduler), +PageSchedulerImpl::PageSchedulerImpl( + PageScheduler::Delegate* delegate, + MainThreadSchedulerImpl* main_thread_scheduler, + bool disable_background_timer_throttling) + : main_thread_scheduler_(main_thread_scheduler), page_visibility_(kDefaultPageVisibility), disable_background_timer_throttling_(disable_background_timer_throttling), is_audio_playing_(false), @@ -108,7 +109,7 @@ background_time_budget_pool_(nullptr), delegate_(delegate), weak_factory_(this) { - renderer_scheduler->AddPageScheduler(this); + main_thread_scheduler->AddPageScheduler(this); } PageSchedulerImpl::~PageSchedulerImpl() { @@ -117,7 +118,7 @@ for (FrameSchedulerImpl* frame_scheduler : frame_schedulers_) { frame_scheduler->DetachFromPageScheduler(); } - renderer_scheduler_->RemovePageScheduler(this); + main_thread_scheduler_->RemovePageScheduler(this); if (background_time_budget_pool_) background_time_budget_pool_->Close(); @@ -169,7 +170,7 @@ FrameScheduler::FrameType frame_type) { MaybeInitializeBackgroundCPUTimeBudgetPool(); std::unique_ptr<FrameSchedulerImpl> frame_scheduler(new FrameSchedulerImpl( - renderer_scheduler_, this, blame_context, frame_type)); + main_thread_scheduler_, this, blame_context, frame_type)); frame_scheduler->SetPageVisibility(page_visibility_); frame_schedulers_.insert(frame_scheduler.get()); return frame_scheduler; @@ -195,49 +196,49 @@ } base::TimeTicks PageSchedulerImpl::EnableVirtualTime() { - return renderer_scheduler_->EnableVirtualTime( - RendererSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); + return main_thread_scheduler_->EnableVirtualTime( + MainThreadSchedulerImpl::BaseTimeOverridePolicy::DO_NOT_OVERRIDE); } void PageSchedulerImpl::DisableVirtualTimeForTesting() { - renderer_scheduler_->DisableVirtualTimeForTesting(); + main_thread_scheduler_->DisableVirtualTimeForTesting(); } void PageSchedulerImpl::SetVirtualTimePolicy(VirtualTimePolicy policy) { - renderer_scheduler_->SetVirtualTimePolicy(policy); + main_thread_scheduler_->SetVirtualTimePolicy(policy); } void PageSchedulerImpl::SetInitialVirtualTimeOffset(base::TimeDelta offset) { - renderer_scheduler_->SetInitialVirtualTimeOffset(offset); + main_thread_scheduler_->SetInitialVirtualTimeOffset(offset); } bool PageSchedulerImpl::VirtualTimeAllowedToAdvance() const { - return renderer_scheduler_->VirtualTimeAllowedToAdvance(); + return main_thread_scheduler_->VirtualTimeAllowedToAdvance(); } void PageSchedulerImpl::GrantVirtualTimeBudget( base::TimeDelta budget, base::OnceClosure budget_exhausted_callback) { - renderer_scheduler_->VirtualTimeControlTaskQueue()->PostDelayedTask( + main_thread_scheduler_->VirtualTimeControlTaskQueue()->PostDelayedTask( FROM_HERE, std::move(budget_exhausted_callback), budget); // This can shift time forwards if there's a pending MaybeAdvanceVirtualTime, // so it's important this is called second. - renderer_scheduler_->GetVirtualTimeDomain()->SetVirtualTimeFence( - renderer_scheduler_->GetVirtualTimeDomain()->Now() + budget); + main_thread_scheduler_->GetVirtualTimeDomain()->SetVirtualTimeFence( + main_thread_scheduler_->GetVirtualTimeDomain()->Now() + budget); } void PageSchedulerImpl::AddVirtualTimeObserver(VirtualTimeObserver* observer) { - renderer_scheduler_->AddVirtualTimeObserver(observer); + main_thread_scheduler_->AddVirtualTimeObserver(observer); } void PageSchedulerImpl::RemoveVirtualTimeObserver( VirtualTimeObserver* observer) { - renderer_scheduler_->RemoveVirtualTimeObserver(observer); + main_thread_scheduler_->RemoveVirtualTimeObserver(observer); } void PageSchedulerImpl::AudioStateChanged(bool is_audio_playing) { is_audio_playing_ = is_audio_playing; - renderer_scheduler_->OnAudioStateChanged(); + main_thread_scheduler_->OnAudioStateChanged(); } bool PageSchedulerImpl::IsExemptFromBudgetBasedThrottling() const { @@ -312,9 +313,9 @@ return; background_time_budget_pool_ = - renderer_scheduler_->task_queue_throttler()->CreateCPUTimeBudgetPool( + main_thread_scheduler_->task_queue_throttler()->CreateCPUTimeBudgetPool( "background"); - LazyNow lazy_now(renderer_scheduler_->tick_clock()); + LazyNow lazy_now(main_thread_scheduler_->tick_clock()); BackgroundThrottlingSettings settings = GetBackgroundThrottlingSettings(); @@ -364,7 +365,7 @@ if (!background_time_budget_pool_) return; - LazyNow lazy_now(renderer_scheduler_->tick_clock()); + LazyNow lazy_now(main_thread_scheduler_->tick_clock()); if (page_visibility_ == PageVisibilityState::kVisible || has_active_connection_) { background_time_budget_pool_->DisableThrottling(&lazy_now); @@ -379,7 +380,7 @@ void PageSchedulerImpl::SetMaxVirtualTimeTaskStarvationCount( int max_task_starvation_count) { - renderer_scheduler_->SetMaxVirtualTimeTaskStarvationCount( + main_thread_scheduler_->SetMaxVirtualTimeTaskStarvationCount( max_task_starvation_count); }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h index 1d4ddb6..beee564 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h
@@ -30,14 +30,14 @@ namespace blink { namespace scheduler { -class RendererSchedulerImpl; class CPUTimeBudgetPool; class FrameSchedulerImpl; +class MainThreadSchedulerImpl; class PLATFORM_EXPORT PageSchedulerImpl : public PageScheduler { public: PageSchedulerImpl(PageScheduler::Delegate*, - RendererSchedulerImpl*, + MainThreadSchedulerImpl*, bool disable_background_timer_throttling); ~PageSchedulerImpl() override; @@ -117,7 +117,7 @@ TraceableVariableController tracing_controller_; std::set<FrameSchedulerImpl*> frame_schedulers_; - RendererSchedulerImpl* renderer_scheduler_; + MainThreadSchedulerImpl* main_thread_scheduler_; PageVisibilityState page_visibility_; bool disable_background_timer_throttling_;
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc index 9bf8b85..0b5260d 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc
@@ -39,7 +39,7 @@ clock_.Advance(base::TimeDelta::FromMicroseconds(5000)); mock_task_runner_ = base::MakeRefCounted<cc::OrderedSimpleTaskRunner>(&clock_, true); - scheduler_.reset(new RendererSchedulerImpl( + scheduler_.reset(new MainThreadSchedulerImpl( TaskQueueManagerForTest::Create(nullptr, mock_task_runner_, &clock_), base::nullopt)); page_scheduler_.reset(new PageSchedulerImpl( @@ -94,7 +94,7 @@ base::SimpleTestTickClock clock_; scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; - std::unique_ptr<RendererSchedulerImpl> scheduler_; + std::unique_ptr<MainThreadSchedulerImpl> scheduler_; std::unique_ptr<PageSchedulerImpl> page_scheduler_; std::unique_ptr<FrameSchedulerImpl> frame_scheduler_; }; @@ -215,7 +215,7 @@ void RunVirtualTimeRecorderTask( base::SimpleTestTickClock* clock, - RendererSchedulerImpl* scheduler, + MainThreadSchedulerImpl* scheduler, std::vector<base::TimeTicks>* out_real_times, std::vector<base::TimeTicks>* out_virtual_times) { out_real_times->push_back(clock->NowTicks()); @@ -224,7 +224,7 @@ base::OnceClosure MakeVirtualTimeRecorderTask( base::SimpleTestTickClock* clock, - RendererSchedulerImpl* scheduler, + MainThreadSchedulerImpl* scheduler, std::vector<base::TimeTicks>* out_real_times, std::vector<base::TimeTicks>* out_virtual_times) { return WTF::Bind(&RunVirtualTimeRecorderTask, WTF::Unretained(clock), @@ -563,11 +563,12 @@ namespace { -void RecordVirtualTime(RendererSchedulerImpl* scheduler, base::TimeTicks* out) { +void RecordVirtualTime(MainThreadSchedulerImpl* scheduler, + base::TimeTicks* out) { *out = scheduler->GetVirtualTimeDomain()->Now(); } -void PauseAndUnpauseVirtualTime(RendererSchedulerImpl* scheduler, +void PauseAndUnpauseVirtualTime(MainThreadSchedulerImpl* scheduler, FrameSchedulerImpl* frame_scheduler, base::TimeTicks* paused, base::TimeTicks* unpaused) {
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/web_main_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/main_thread/web_main_thread_scheduler.cc index 96118ab..a222c64 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/web_main_thread_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/web_main_thread_scheduler.cc
@@ -30,8 +30,9 @@ // Workers might be short-lived, so placing warmup here. TRACE_EVENT_WARMUP_CATEGORY(TRACE_DISABLED_BY_DEFAULT("worker.scheduler")); - std::unique_ptr<RendererSchedulerImpl> scheduler(new RendererSchedulerImpl( - TaskQueueManager::TakeOverCurrentThread(), initial_virtual_time)); + std::unique_ptr<MainThreadSchedulerImpl> scheduler( + new MainThreadSchedulerImpl(TaskQueueManager::TakeOverCurrentThread(), + initial_virtual_time)); return base::WrapUnique<WebMainThreadScheduler>(scheduler.release()); }
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/main_thread_task_queue.cc b/third_party/blink/renderer/platform/scheduler/renderer/main_thread_task_queue.cc index 64be290..5aa2131 100644 --- a/third_party/blink/renderer/platform/scheduler/renderer/main_thread_task_queue.cc +++ b/third_party/blink/renderer/platform/scheduler/renderer/main_thread_task_queue.cc
@@ -92,7 +92,7 @@ std::unique_ptr<internal::TaskQueueImpl> impl, const TaskQueue::Spec& spec, const QueueCreationParams& params, - RendererSchedulerImpl* renderer_scheduler) + MainThreadSchedulerImpl* main_thread_scheduler) : TaskQueue(std::move(impl), spec), queue_type_(params.queue_type), queue_class_(QueueClassForQueueType(params.queue_type)), @@ -102,14 +102,14 @@ can_be_stopped_(params.can_be_stopped), freeze_when_keep_active_(params.freeze_when_keep_active), used_for_important_tasks_(params.used_for_important_tasks), - renderer_scheduler_(renderer_scheduler), + main_thread_scheduler_(main_thread_scheduler), frame_scheduler_(nullptr) { if (GetTaskQueueImpl()) { // TaskQueueImpl may be null for tests. // TODO(scheduler-dev): Consider mapping directly to - // RendererSchedulerImpl::OnTaskStarted/Completed. At the moment this + // MainThreadSchedulerImpl::OnTaskStarted/Completed. At the moment this // is not possible due to task queue being created inside - // RendererScheduler's constructor. + // MainThreadScheduler's constructor. GetTaskQueueImpl()->SetOnTaskStartedHandler(base::BindRepeating( &MainThreadTaskQueue::OnTaskStarted, base::Unretained(this))); GetTaskQueueImpl()->SetOnTaskCompletedHandler(base::BindRepeating( @@ -121,8 +121,8 @@ void MainThreadTaskQueue::OnTaskStarted(const TaskQueue::Task& task, base::TimeTicks start) { - if (renderer_scheduler_) - renderer_scheduler_->OnTaskStarted(this, task, start); + if (main_thread_scheduler_) + main_thread_scheduler_->OnTaskStarted(this, task, start); } void MainThreadTaskQueue::OnTaskCompleted( @@ -130,22 +130,24 @@ base::TimeTicks start, base::TimeTicks end, base::Optional<base::TimeDelta> thread_time) { - if (renderer_scheduler_) - renderer_scheduler_->OnTaskCompleted(this, task, start, end, thread_time); + if (main_thread_scheduler_) { + main_thread_scheduler_->OnTaskCompleted(this, task, start, end, + thread_time); + } } -void MainThreadTaskQueue::DetachFromRendererScheduler() { +void MainThreadTaskQueue::DetachFromMainThreadScheduler() { // Frame has already been detached. - if (!renderer_scheduler_) + if (!main_thread_scheduler_) return; if (GetTaskQueueImpl()) { GetTaskQueueImpl()->SetOnTaskStartedHandler( - base::BindRepeating(&RendererSchedulerImpl::OnTaskStarted, - renderer_scheduler_->GetWeakPtr(), nullptr)); + base::BindRepeating(&MainThreadSchedulerImpl::OnTaskStarted, + main_thread_scheduler_->GetWeakPtr(), nullptr)); GetTaskQueueImpl()->SetOnTaskCompletedHandler( - base::BindRepeating(&RendererSchedulerImpl::OnTaskCompleted, - renderer_scheduler_->GetWeakPtr(), nullptr)); + base::BindRepeating(&MainThreadSchedulerImpl::OnTaskCompleted, + main_thread_scheduler_->GetWeakPtr(), nullptr)); } ClearReferencesToSchedulers(); @@ -157,9 +159,9 @@ } void MainThreadTaskQueue::ClearReferencesToSchedulers() { - if (renderer_scheduler_) - renderer_scheduler_->OnShutdownTaskQueue(this); - renderer_scheduler_ = nullptr; + if (main_thread_scheduler_) + main_thread_scheduler_->OnShutdownTaskQueue(this); + main_thread_scheduler_ = nullptr; frame_scheduler_ = nullptr; }
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/main_thread_task_queue.h b/third_party/blink/renderer/platform/scheduler/renderer/main_thread_task_queue.h index 0a2f8e09..6563c325 100644 --- a/third_party/blink/renderer/platform/scheduler/renderer/main_thread_task_queue.h +++ b/third_party/blink/renderer/platform/scheduler/renderer/main_thread_task_queue.h
@@ -14,7 +14,7 @@ namespace scheduler { -class RendererSchedulerImpl; +class MainThreadSchedulerImpl; class PLATFORM_EXPORT MainThreadTaskQueue : public TaskQueue { public: @@ -60,7 +60,8 @@ // lifetime. static const char* NameForQueueType(QueueType queue_type); - // High-level category used by RendererScheduler to make scheduling decisions. + // High-level category used by MainThreadScheduler to make scheduling + // decisions. enum class QueueClass { kNone = 0, kLoading = 1, @@ -166,9 +167,9 @@ base::TimeTicks end, base::Optional<base::TimeDelta> thread_time); - void DetachFromRendererScheduler(); + void DetachFromMainThreadScheduler(); - // Override base method to notify RendererScheduler about shutdown queue. + // Override base method to notify MainThreadScheduler about shutdown queue. void ShutdownTaskQueue() override; FrameScheduler* GetFrameScheduler() const; @@ -178,14 +179,14 @@ MainThreadTaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl, const Spec& spec, const QueueCreationParams& params, - RendererSchedulerImpl* renderer_scheduler); + MainThreadSchedulerImpl* main_thread_scheduler); private: friend class TaskQueueManager; // Clear references to main thread scheduler and frame scheduler and dispatch // appropriate notifications. This is the common part of ShutdownTaskQueue and - // DetachFromRendererScheduler. + // DetachFromMainThreadScheduler. void ClearReferencesToSchedulers(); QueueType queue_type_; @@ -198,7 +199,7 @@ const bool used_for_important_tasks_; // Needed to notify renderer scheduler about completed tasks. - RendererSchedulerImpl* renderer_scheduler_; // NOT OWNED + MainThreadSchedulerImpl* main_thread_scheduler_; // NOT OWNED FrameScheduler* frame_scheduler_; // NOT OWNED
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/queueing_time_estimator_unittest.cc b/third_party/blink/renderer/platform/scheduler/renderer/queueing_time_estimator_unittest.cc index 3431aa3..3e2d541 100644 --- a/third_party/blink/renderer/platform/scheduler/renderer/queueing_time_estimator_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/renderer/queueing_time_estimator_unittest.cc
@@ -35,9 +35,9 @@ UMA_HISTOGRAM_CUSTOM_COUNTS( "RendererScheduler.ExpectedTaskQueueingDuration3", queueing_time.InMicroseconds(), - RendererSchedulerImpl::kMinExpectedQueueingTimeBucket, - RendererSchedulerImpl::kMaxExpectedQueueingTimeBucket, - RendererSchedulerImpl::kNumberExpectedQueueingTimeBuckets); + MainThreadSchedulerImpl::kMinExpectedQueueingTimeBucket, + MainThreadSchedulerImpl::kMaxExpectedQueueingTimeBucket, + MainThreadSchedulerImpl::kNumberExpectedQueueingTimeBuckets); } } void OnReportFineGrainedExpectedQueueingTime(const char* split_description, @@ -45,12 +45,12 @@ if (split_eqts_.find(split_description) == split_eqts_.end()) split_eqts_[split_description] = std::vector<base::TimeDelta>(); split_eqts_[split_description].push_back(queueing_time); - // Mimic RendererSchedulerImpl::OnReportFineGrainedExpectedQueueingTime. + // Mimic MainThreadSchedulerImpl::OnReportFineGrainedExpectedQueueingTime. base::UmaHistogramCustomCounts( split_description, queueing_time.InMicroseconds(), - RendererSchedulerImpl::kMinExpectedQueueingTimeBucket, - RendererSchedulerImpl::kMaxExpectedQueueingTimeBucket, - RendererSchedulerImpl::kNumberExpectedQueueingTimeBuckets); + MainThreadSchedulerImpl::kMinExpectedQueueingTimeBucket, + MainThreadSchedulerImpl::kMaxExpectedQueueingTimeBucket, + MainThreadSchedulerImpl::kNumberExpectedQueueingTimeBuckets); } const std::vector<base::TimeDelta>& expected_queueing_times() { return expected_queueing_times_;
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/renderer_metrics_helper.cc b/third_party/blink/renderer/platform/scheduler/renderer/renderer_metrics_helper.cc index 913aee25..859fb62 100644 --- a/third_party/blink/renderer/platform/scheduler/renderer/renderer_metrics_helper.cc +++ b/third_party/blink/renderer/platform/scheduler/renderer/renderer_metrics_helper.cc
@@ -74,11 +74,11 @@ hidden_music(DURATION_PER_QUEUE_TYPE_METRIC_NAME ".HiddenMusic") {} RendererMetricsHelper::RendererMetricsHelper( - RendererSchedulerImpl* renderer_scheduler, + MainThreadSchedulerImpl* main_thread_scheduler, base::TimeTicks now, bool renderer_backgrounded) : MetricsHelper(WebThreadType::kMainThread), - renderer_scheduler_(renderer_scheduler), + main_thread_scheduler_(main_thread_scheduler), main_thread_load_tracker_( now, base::BindRepeating(&RendererMetricsHelper::RecordMainThreadTaskLoad, @@ -247,13 +247,13 @@ TaskType task_type = static_cast<TaskType>(task.task_type()); per_task_type_duration_reporter_.RecordTask(task_type, duration); - if (renderer_scheduler_->main_thread_only().renderer_backgrounded) { + if (main_thread_scheduler_->main_thread_only().renderer_backgrounded) { per_queue_type_reporters_.background.RecordTask(queue_type, duration); // Collect detailed breakdown for first five minutes given that we stop // timers on mobile after five minutes. base::TimeTicks backgrounded_at = - renderer_scheduler_->main_thread_only().background_status_changed_at; + main_thread_scheduler_->main_thread_only().background_status_changed_at; per_queue_type_reporters_.background_first_minute.RecordTask( queue_type, DurationOfIntervalOverlap( @@ -292,7 +292,8 @@ std::max(backgrounded_at + base::TimeDelta::FromMinutes(5), end_time))); - if (renderer_scheduler_->main_thread_only().keep_active_fetch_or_worker) { + if (main_thread_scheduler_->main_thread_only() + .keep_active_fetch_or_worker) { per_queue_type_reporters_.background_keep_active_after_fifth_minute .RecordTask( queue_type, @@ -310,7 +311,7 @@ // For foreground tabs we do not expect such a notable difference as it is // the case with background tabs, so we limit breakdown to three minutes. base::TimeTicks foregrounded_at = - renderer_scheduler_->main_thread_only().background_status_changed_at; + main_thread_scheduler_->main_thread_only().background_status_changed_at; per_queue_type_reporters_.foreground_first_minute.RecordTask( queue_type, DurationOfIntervalOverlap( @@ -340,10 +341,10 @@ foreground_per_task_type_duration_reporter_.RecordTask(task_type, duration); } - if (renderer_scheduler_->main_thread_only().renderer_hidden) { + if (main_thread_scheduler_->main_thread_only().renderer_hidden) { per_queue_type_reporters_.hidden.RecordTask(queue_type, duration); - if (renderer_scheduler_->ShouldDisableThrottlingBecauseOfAudio( + if (main_thread_scheduler_->ShouldDisableThrottlingBecauseOfAudio( start_time)) { per_queue_type_reporters_.hidden_music.RecordTask(queue_type, duration); } @@ -381,7 +382,8 @@ frame_status, FrameStatus::kCount); } - UseCase use_case = renderer_scheduler_->main_thread_only().current_use_case; + UseCase use_case = + main_thread_scheduler_->main_thread_only().current_use_case; per_task_use_case_duration_reporter_.RecordTask(use_case, duration); if (use_case == UseCase::kNone) { no_use_case_per_task_type_duration_reporter_.RecordTask(task_type, @@ -417,14 +419,14 @@ UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME, load_percentage); - if (renderer_scheduler_->main_thread_only().process_type == + if (main_thread_scheduler_->main_thread_only().process_type == RendererProcessType::kExtensionRenderer) { UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME, load_percentage); } TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererScheduler.RendererMainThreadLoad", load_percentage); + "MainThreadScheduler.RendererMainThreadLoad", load_percentage); } void RendererMetricsHelper::RecordForegroundMainThreadTaskLoad( @@ -433,7 +435,7 @@ int load_percentage = static_cast<int>(load * 100); DCHECK_LE(load_percentage, 100); - switch (renderer_scheduler_->main_thread_only().process_type) { + switch (main_thread_scheduler_->main_thread_only().process_type) { case RendererProcessType::kExtensionRenderer: UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME ".Foreground", @@ -443,7 +445,7 @@ UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME ".Foreground", load_percentage); - if (time - renderer_scheduler_->main_thread_only() + if (time - main_thread_scheduler_->main_thread_only() .background_status_changed_at > base::TimeDelta::FromMinutes(1)) { UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME @@ -454,7 +456,7 @@ } TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererScheduler.RendererMainThreadLoad.Foreground", + "MainThreadScheduler.RendererMainThreadLoad.Foreground", load_percentage); } @@ -464,7 +466,7 @@ int load_percentage = static_cast<int>(load * 100); DCHECK_LE(load_percentage, 100); - switch (renderer_scheduler_->main_thread_only().process_type) { + switch (main_thread_scheduler_->main_thread_only().process_type) { case RendererProcessType::kExtensionRenderer: UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME ".Background", @@ -474,7 +476,7 @@ UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME ".Background", load_percentage); - if (time - renderer_scheduler_->main_thread_only() + if (time - main_thread_scheduler_->main_thread_only() .background_status_changed_at > base::TimeDelta::FromMinutes(1)) { UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME @@ -485,7 +487,7 @@ } TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), - "RendererScheduler.RendererMainThreadLoad.Background", + "MainThreadScheduler.RendererMainThreadLoad.Background", load_percentage); }
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/renderer_metrics_helper.h b/third_party/blink/renderer/platform/scheduler/renderer/renderer_metrics_helper.h index d79f229..c8dd67a 100644 --- a/third_party/blink/renderer/platform/scheduler/renderer/renderer_metrics_helper.h +++ b/third_party/blink/renderer/platform/scheduler/renderer/renderer_metrics_helper.h
@@ -23,7 +23,7 @@ enum class MainThreadTaskLoadState; class MainThreadTaskQueue; -class RendererSchedulerImpl; +class MainThreadSchedulerImpl; // This enum is used for histogram and should not be renumbered. // It tracks the following possible transitions: @@ -43,14 +43,14 @@ kCount = 5 }; -// Helper class to take care of metrics on behalf of RendererScheduler. +// Helper class to take care of metrics on behalf of MainThreadScheduler. // This class should be used only on the main thread. class PLATFORM_EXPORT RendererMetricsHelper : public MetricsHelper { public: static void RecordBackgroundedTransition( BackgroundedRendererTransition transition); - RendererMetricsHelper(RendererSchedulerImpl* renderer_scheduler, + RendererMetricsHelper(MainThreadSchedulerImpl* main_thread_scheduler, base::TimeTicks now, bool renderer_backgrounded); ~RendererMetricsHelper(); @@ -72,7 +72,7 @@ void ResetForTest(base::TimeTicks now); private: - RendererSchedulerImpl* renderer_scheduler_; // NOT OWNED + MainThreadSchedulerImpl* main_thread_scheduler_; // NOT OWNED base::Optional<base::TimeTicks> last_reported_task_;
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc b/third_party/blink/renderer/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc index 2fc7f5f4..34f40ea9 100644 --- a/third_party/blink/renderer/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc
@@ -22,15 +22,15 @@ namespace scheduler { namespace { -class RendererSchedulerImplForTest : public RendererSchedulerImpl { +class MainThreadSchedulerImplForTest : public MainThreadSchedulerImpl { public: - RendererSchedulerImplForTest( + MainThreadSchedulerImplForTest( std::unique_ptr<TaskQueueManager> task_queue_manager, base::Optional<base::Time> initial_virtual_time) - : RendererSchedulerImpl(std::move(task_queue_manager), - initial_virtual_time){}; + : MainThreadSchedulerImpl(std::move(task_queue_manager), + initial_virtual_time){}; - using RendererSchedulerImpl::SetCurrentUseCaseForTest; + using MainThreadSchedulerImpl::SetCurrentUseCaseForTest; }; } // namespace @@ -48,7 +48,7 @@ histogram_tester_.reset(new base::HistogramTester()); mock_task_runner_ = base::MakeRefCounted<cc::OrderedSimpleTaskRunner>(&clock_, true); - scheduler_ = std::make_unique<RendererSchedulerImplForTest>( + scheduler_ = std::make_unique<MainThreadSchedulerImplForTest>( TaskQueueManagerForTest::Create(nullptr, mock_task_runner_, &clock_), base::nullopt); metrics_helper_ = &scheduler_->main_thread_only().metrics_helper; @@ -223,7 +223,7 @@ base::SimpleTestTickClock clock_; scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; - std::unique_ptr<RendererSchedulerImplForTest> scheduler_; + std::unique_ptr<MainThreadSchedulerImplForTest> scheduler_; RendererMetricsHelper* metrics_helper_; // NOT OWNED std::unique_ptr<base::HistogramTester> histogram_tester_; std::unique_ptr<FakePageScheduler> playing_view_ =
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/renderer_web_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/renderer/renderer_web_scheduler_impl.cc index e1525dc..4e0fa79 100644 --- a/third_party/blink/renderer/platform/scheduler/renderer/renderer_web_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/renderer/renderer_web_scheduler_impl.cc
@@ -18,13 +18,13 @@ // TODO(kraynov): Ditch kDeprecatedNone here. RendererWebSchedulerImpl::RendererWebSchedulerImpl( - RendererSchedulerImpl* renderer_scheduler) - : WebSchedulerImpl(renderer_scheduler, - renderer_scheduler->IdleTaskRunner(), - renderer_scheduler->V8TaskQueue()), - renderer_scheduler_(renderer_scheduler), + MainThreadSchedulerImpl* main_thread_scheduler) + : WebSchedulerImpl(main_thread_scheduler, + main_thread_scheduler->IdleTaskRunner(), + main_thread_scheduler->V8TaskQueue()), + main_thread_scheduler_(main_thread_scheduler), compositor_task_runner_( - TaskRunnerImpl::Create(renderer_scheduler_->CompositorTaskQueue(), + TaskRunnerImpl::Create(main_thread_scheduler_->CompositorTaskQueue(), TaskType::kDeprecatedNone)) {} RendererWebSchedulerImpl::~RendererWebSchedulerImpl() = default; @@ -35,26 +35,26 @@ std::unique_ptr<RendererWebSchedulerImpl::RendererPauseHandle> RendererWebSchedulerImpl::PauseScheduler() { - return renderer_scheduler_->PauseRenderer(); + return main_thread_scheduler_->PauseRenderer(); } std::unique_ptr<blink::PageScheduler> RendererWebSchedulerImpl::CreatePageScheduler( PageScheduler::Delegate* delegate) { return base::WrapUnique( - new PageSchedulerImpl(delegate, renderer_scheduler_, + new PageSchedulerImpl(delegate, main_thread_scheduler_, !blink::RuntimeEnabledFeatures:: TimerThrottlingForBackgroundTabsEnabled())); } base::TimeTicks RendererWebSchedulerImpl::MonotonicallyIncreasingVirtualTime() const { - return renderer_scheduler_->GetActiveTimeDomain()->Now(); + return main_thread_scheduler_->GetActiveTimeDomain()->Now(); } WebMainThreadScheduler* RendererWebSchedulerImpl::GetWebMainThreadSchedulerForTest() { - return renderer_scheduler_; + return main_thread_scheduler_; } } // namespace scheduler
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/renderer_web_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/renderer/renderer_web_scheduler_impl.h index 453256d..d0cffbd 100644 --- a/third_party/blink/renderer/platform/scheduler/renderer/renderer_web_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/renderer/renderer_web_scheduler_impl.h
@@ -10,11 +10,12 @@ namespace blink { namespace scheduler { -class RendererSchedulerImpl; +class MainThreadSchedulerImpl; class PLATFORM_EXPORT RendererWebSchedulerImpl : public WebSchedulerImpl { public: - explicit RendererWebSchedulerImpl(RendererSchedulerImpl* renderer_scheduler); + explicit RendererWebSchedulerImpl( + MainThreadSchedulerImpl* main_thread_scheduler); ~RendererWebSchedulerImpl() override; @@ -30,7 +31,7 @@ WebMainThreadScheduler* GetWebMainThreadSchedulerForTest() override; private: - RendererSchedulerImpl* renderer_scheduler_; // NOT OWNED + MainThreadSchedulerImpl* main_thread_scheduler_; // NOT OWNED scoped_refptr<TaskRunnerImpl> compositor_task_runner_; };
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/web_scoped_virtual_time_pauser.cc b/third_party/blink/renderer/platform/scheduler/renderer/web_scoped_virtual_time_pauser.cc index 4d5b079a..b3bd2a7 100644 --- a/third_party/blink/renderer/platform/scheduler/renderer/web_scoped_virtual_time_pauser.cc +++ b/third_party/blink/renderer/platform/scheduler/renderer/web_scoped_virtual_time_pauser.cc
@@ -14,7 +14,7 @@ : scheduler_(nullptr) {} WebScopedVirtualTimePauser::WebScopedVirtualTimePauser( - scheduler::RendererSchedulerImpl* scheduler, + scheduler::MainThreadSchedulerImpl* scheduler, VirtualTaskDuration duration, const WebString& name) : duration_(duration),
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.cc b/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.cc index 627f0225..087c9c2 100644 --- a/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.cc
@@ -13,7 +13,7 @@ namespace scheduler { WebThreadImplForRendererScheduler::WebThreadImplForRendererScheduler( - RendererSchedulerImpl* scheduler) + MainThreadSchedulerImpl* scheduler) : web_scheduler_(new RendererWebSchedulerImpl(scheduler)), task_runner_(scheduler->DefaultTaskQueue()), idle_task_runner_(scheduler->IdleTaskRunner()),
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.h b/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.h index 4c9e985..cb637c5 100644 --- a/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.h +++ b/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.h
@@ -16,12 +16,13 @@ namespace blink { namespace scheduler { -class RendererSchedulerImpl; +class MainThreadSchedulerImpl; class WebSchedulerImpl; class PLATFORM_EXPORT WebThreadImplForRendererScheduler : public WebThreadBase { public: - explicit WebThreadImplForRendererScheduler(RendererSchedulerImpl* scheduler); + explicit WebThreadImplForRendererScheduler( + MainThreadSchedulerImpl* scheduler); ~WebThreadImplForRendererScheduler() override; // WebThread implementation. @@ -45,7 +46,7 @@ std::unique_ptr<WebSchedulerImpl> web_scheduler_; scoped_refptr<base::SingleThreadTaskRunner> task_runner_; scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_; - RendererSchedulerImpl* scheduler_; // Not owned. + MainThreadSchedulerImpl* scheduler_; // Not owned. PlatformThreadId thread_id_; };
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler_unittest.cc b/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler_unittest.cc index ef72a2a..f10992d 100644 --- a/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler_unittest.cc
@@ -42,7 +42,7 @@ void SetUp() override { clock_.Advance(base::TimeDelta::FromMicroseconds(5000)); - scheduler_.reset(new RendererSchedulerImpl( + scheduler_.reset(new MainThreadSchedulerImpl( TaskQueueManagerForTest::Create(&message_loop_, message_loop_.task_runner(), &clock_), base::nullopt)); @@ -62,7 +62,7 @@ protected: base::MessageLoop message_loop_; base::SimpleTestTickClock clock_; - std::unique_ptr<RendererSchedulerImpl> scheduler_; + std::unique_ptr<MainThreadSchedulerImpl> scheduler_; scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; std::unique_ptr<blink::WebThread> thread_;
diff --git a/third_party/blink/renderer/platform/scheduler/test/renderer_scheduler_test_support.cc b/third_party/blink/renderer/platform/scheduler/test/renderer_scheduler_test_support.cc index 944a281..dadc3ec 100644 --- a/third_party/blink/renderer/platform/scheduler/test/renderer_scheduler_test_support.cc +++ b/third_party/blink/renderer/platform/scheduler/test/renderer_scheduler_test_support.cc
@@ -18,7 +18,7 @@ namespace scheduler { std::unique_ptr<WebMainThreadScheduler> CreateWebMainThreadSchedulerForTests() { - return std::make_unique<scheduler::RendererSchedulerImpl>( + return std::make_unique<scheduler::MainThreadSchedulerImpl>( std::make_unique<TaskQueueManagerForTest>( std::make_unique<LazyThreadControllerForTest>()), base::nullopt); @@ -26,8 +26,8 @@ void RunIdleTasksForTesting(WebMainThreadScheduler* scheduler, const base::Closure& callback) { - RendererSchedulerImpl* scheduler_impl = - static_cast<RendererSchedulerImpl*>(scheduler); + MainThreadSchedulerImpl* scheduler_impl = + static_cast<MainThreadSchedulerImpl*>(scheduler); scheduler_impl->RunIdleTasksForTesting(callback); }
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.cc b/third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.cc index 1182cbe..0001208 100644 --- a/third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.cc +++ b/third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.cc
@@ -47,7 +47,7 @@ scheduler::TaskQueueManagerForTest::Create(nullptr, mock_task_runner_, &clock_); task_queue_manager_ = task_queue_manager.get(); - scheduler_ = std::make_unique<scheduler::RendererSchedulerImpl>( + scheduler_ = std::make_unique<scheduler::MainThreadSchedulerImpl>( std::move(task_queue_manager), base::nullopt); thread_ = scheduler_->CreateMainThread(); // Set the work batch size to one so RunPendingTasks behaves as expected. @@ -135,8 +135,8 @@ mock_task_runner_->SetAutoAdvanceNowToPendingTasks(auto_advance); } -scheduler::RendererSchedulerImpl* -TestingPlatformSupportWithMockScheduler::GetRendererScheduler() const { +scheduler::MainThreadSchedulerImpl* +TestingPlatformSupportWithMockScheduler::GetMainThreadScheduler() const { return scheduler_.get(); }
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h b/third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h index 1a49e25..8b483633 100644 --- a/third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h +++ b/third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h
@@ -19,7 +19,7 @@ namespace blink { namespace scheduler { -class RendererSchedulerImpl; +class MainThreadSchedulerImpl; } // This class adds scheduler and threading support to TestingPlatformSupport. @@ -57,7 +57,7 @@ // Advances |m_clock| by |seconds|. void AdvanceClockSeconds(double seconds); - scheduler::RendererSchedulerImpl* GetRendererScheduler() const; + scheduler::MainThreadSchedulerImpl* GetMainThreadScheduler() const; // Controls the behavior of |m_mockTaskRunner| if true, then |m_clock| will // be advanced to the next timer when there's no more immediate work to do. @@ -68,7 +68,7 @@ base::SimpleTestTickClock clock_; scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; - std::unique_ptr<scheduler::RendererSchedulerImpl> scheduler_; + std::unique_ptr<scheduler::MainThreadSchedulerImpl> scheduler_; scheduler::TaskQueueManagerForTest* task_queue_manager_; // Owned by scheduler_. std::unique_ptr<WebThread> thread_;
diff --git a/third_party/blink/renderer/platform/timer_test.cc b/third_party/blink/renderer/platform/timer_test.cc index f1f9f735..4e5460c 100644 --- a/third_party/blink/renderer/platform/timer_test.cc +++ b/third_party/blink/renderer/platform/timer_test.cc
@@ -53,12 +53,12 @@ // fire. bool TimeTillNextDelayedTask(double* time) const { base::TimeTicks next_run_time; - if (!platform_->GetRendererScheduler() + if (!platform_->GetMainThreadScheduler() ->DefaultTaskQueue() ->GetTimeDomain() ->NextScheduledRunTime(&next_run_time)) return false; - *time = (next_run_time - platform_->GetRendererScheduler() + *time = (next_run_time - platform_->GetMainThreadScheduler() ->DefaultTaskQueue() ->GetTimeDomain() ->Now()) @@ -130,7 +130,7 @@ TEST_F(TimerTest, StartOneShot_Zero) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta(), FROM_HERE); @@ -143,7 +143,7 @@ TEST_F(TimerTest, StartOneShot_ZeroAndCancel) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta(), FROM_HERE); @@ -158,7 +158,7 @@ TEST_F(TimerTest, StartOneShot_ZeroAndCancelThenRepost) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta(), FROM_HERE); @@ -180,7 +180,7 @@ TEST_F(TimerTest, StartOneShot_Zero_RepostingAfterRunning) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta(), FROM_HERE); @@ -200,7 +200,7 @@ TEST_F(TimerTest, StartOneShot_NonZero) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); @@ -214,7 +214,7 @@ TEST_F(TimerTest, StartOneShot_NonZeroAndCancel) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); @@ -231,7 +231,7 @@ TEST_F(TimerTest, StartOneShot_NonZeroAndCancelThenRepost) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); @@ -257,7 +257,7 @@ TEST_F(TimerTest, StartOneShot_NonZero_RepostingAfterRunning) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); @@ -279,7 +279,7 @@ TEST_F(TimerTest, PostingTimerTwiceWithSameRunTimeDoesNothing) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); @@ -294,7 +294,7 @@ TEST_F(TimerTest, PostingTimerTwiceWithNewerRunTimeCancelsOriginalTask) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); timer.StartOneShot(TimeDelta(), FROM_HERE); @@ -305,7 +305,7 @@ TEST_F(TimerTest, PostingTimerTwiceWithLaterRunTimeCancelsOriginalTask) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta(), FROM_HERE); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); @@ -316,7 +316,7 @@ TEST_F(TimerTest, StartRepeatingTask) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartRepeating(TimeDelta::FromSeconds(1), FROM_HERE); @@ -332,7 +332,7 @@ TEST_F(TimerTest, StartRepeatingTask_ThenCancel) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartRepeating(TimeDelta::FromSeconds(1), FROM_HERE); @@ -351,7 +351,7 @@ TEST_F(TimerTest, StartRepeatingTask_ThenPostOneShot) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartRepeating(TimeDelta::FromSeconds(1), FROM_HERE); @@ -371,7 +371,7 @@ TEST_F(TimerTest, IsActive_NeverPosted) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); EXPECT_FALSE(timer.IsActive()); @@ -379,7 +379,7 @@ TEST_F(TimerTest, IsActive_AfterPosting_OneShotZero) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta(), FROM_HERE); @@ -388,7 +388,7 @@ TEST_F(TimerTest, IsActive_AfterPosting_OneShotNonZero) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); @@ -397,7 +397,7 @@ TEST_F(TimerTest, IsActive_AfterPosting_Repeating) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartRepeating(TimeDelta::FromSeconds(1), FROM_HERE); @@ -406,7 +406,7 @@ TEST_F(TimerTest, IsActive_AfterRunning_OneShotZero) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta(), FROM_HERE); @@ -416,7 +416,7 @@ TEST_F(TimerTest, IsActive_AfterRunning_OneShotNonZero) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); @@ -426,7 +426,7 @@ TEST_F(TimerTest, IsActive_AfterRunning_Repeating) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartRepeating(TimeDelta::FromSeconds(1), FROM_HERE); @@ -436,7 +436,7 @@ TEST_F(TimerTest, NextFireInterval_OneShotZero) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta(), FROM_HERE); @@ -445,7 +445,7 @@ TEST_F(TimerTest, NextFireInterval_OneShotNonZero) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); @@ -456,7 +456,7 @@ platform_->SetAutoAdvanceNowToPendingTasks(false); TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); @@ -466,7 +466,7 @@ TEST_F(TimerTest, NextFireInterval_Repeating) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartRepeating(TimeDelta::FromSeconds(20), FROM_HERE); @@ -475,7 +475,7 @@ TEST_F(TimerTest, RepeatInterval_NeverStarted) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); EXPECT_FLOAT_EQ(0.0, timer.RepeatInterval()); @@ -483,7 +483,7 @@ TEST_F(TimerTest, RepeatInterval_OneShotZero) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta(), FROM_HERE); @@ -492,7 +492,7 @@ TEST_F(TimerTest, RepeatInterval_OneShotNonZero) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE); @@ -501,7 +501,7 @@ TEST_F(TimerTest, RepeatInterval_Repeating) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartRepeating(TimeDelta::FromSeconds(20), FROM_HERE); @@ -510,7 +510,7 @@ TEST_F(TimerTest, AugmentRepeatInterval) { TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartRepeating(TimeDelta::FromSeconds(10), FROM_HERE); EXPECT_FLOAT_EQ(10.0, timer.RepeatInterval()); @@ -534,7 +534,7 @@ platform_->SetAutoAdvanceNowToPendingTasks(false); TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::CountingTask); timer.StartRepeating(TimeDelta::FromSeconds(10), FROM_HERE); EXPECT_FLOAT_EQ(10.0, timer.RepeatInterval()); @@ -552,7 +552,7 @@ platform_->SetAutoAdvanceNowToPendingTasks(false); TaskRunnerTimer<TimerTest> timer( - platform_->GetRendererScheduler()->DefaultTaskQueue(), this, + platform_->GetMainThreadScheduler()->DefaultTaskQueue(), this, &TimerTest::RecordNextFireTimeTask); timer.StartRepeating(TimeDelta::FromSeconds(2), FROM_HERE); @@ -605,7 +605,7 @@ TEST_F(TimerTest, UserSuppliedTaskRunner) { scoped_refptr<scheduler::TaskQueue> task_runner( - platform_->GetRendererScheduler()->NewTimerTaskQueue( + platform_->GetMainThreadScheduler()->NewTimerTaskQueue( scheduler::MainThreadTaskQueue::QueueType::kFrameThrottleable)); scoped_refptr<scheduler::TaskRunnerImpl> task_runner_impl = scheduler::TaskRunnerImpl::Create(task_runner, TaskType::kInternalTest); @@ -621,7 +621,7 @@ scoped_refptr<OnHeapTimerOwner::Record> record = OnHeapTimerOwner::Record::Create(); Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner( - record, platform_->GetRendererScheduler()->DefaultTaskQueue()); + record, platform_->GetMainThreadScheduler()->DefaultTaskQueue()); owner->StartOneShot(TimeDelta(), FROM_HERE); @@ -634,7 +634,7 @@ scoped_refptr<OnHeapTimerOwner::Record> record = OnHeapTimerOwner::Record::Create(); Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner( - record, platform_->GetRendererScheduler()->DefaultTaskQueue()); + record, platform_->GetMainThreadScheduler()->DefaultTaskQueue()); record->Dispose(); owner->StartOneShot(TimeDelta(), FROM_HERE); @@ -654,7 +654,7 @@ scoped_refptr<OnHeapTimerOwner::Record> record = OnHeapTimerOwner::Record::Create(); Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner( - record, platform_->GetRendererScheduler()->DefaultTaskQueue()); + record, platform_->GetMainThreadScheduler()->DefaultTaskQueue()); record->Dispose(); owner->StartOneShot(TimeDelta(), FROM_HERE); @@ -700,7 +700,7 @@ std::vector<scoped_refptr<base::SingleThreadTaskRunner>> run_order; scoped_refptr<scheduler::TaskQueue> task_runner1( - platform_->GetRendererScheduler()->NewTimerTaskQueue( + platform_->GetMainThreadScheduler()->NewTimerTaskQueue( scheduler::MainThreadTaskQueue::QueueType::kFrameThrottleable)); scoped_refptr<scheduler::TaskRunnerImpl> task_runner_impl1 = scheduler::TaskRunnerImpl::Create(task_runner1, TaskType::kInternalTest); @@ -708,7 +708,7 @@ task_runner1->AddTaskObserver(&task_observer1); scoped_refptr<scheduler::TaskQueue> task_runner2( - platform_->GetRendererScheduler()->NewTimerTaskQueue( + platform_->GetMainThreadScheduler()->NewTimerTaskQueue( scheduler::MainThreadTaskQueue::QueueType::kFrameThrottleable)); scoped_refptr<scheduler::TaskRunnerImpl> task_runner_impl2 = scheduler::TaskRunnerImpl::Create(task_runner2, TaskType::kInternalTest); @@ -740,7 +740,7 @@ std::vector<scoped_refptr<base::SingleThreadTaskRunner>> run_order; scoped_refptr<scheduler::TaskQueue> task_runner1( - platform_->GetRendererScheduler()->NewTimerTaskQueue( + platform_->GetMainThreadScheduler()->NewTimerTaskQueue( scheduler::MainThreadTaskQueue::QueueType::kFrameThrottleable)); scoped_refptr<scheduler::TaskRunnerImpl> task_runner_impl1 = scheduler::TaskRunnerImpl::Create(task_runner1, TaskType::kInternalTest); @@ -748,7 +748,7 @@ task_runner1->AddTaskObserver(&task_observer1); scoped_refptr<scheduler::TaskQueue> task_runner2( - platform_->GetRendererScheduler()->NewTimerTaskQueue( + platform_->GetMainThreadScheduler()->NewTimerTaskQueue( scheduler::MainThreadTaskQueue::QueueType::kFrameThrottleable)); scoped_refptr<scheduler::TaskRunnerImpl> task_runner_impl2 = scheduler::TaskRunnerImpl::Create(task_runner2, TaskType::kInternalTest); @@ -782,13 +782,13 @@ // runner it isn't activated. TEST_F(TimerTest, MoveToNewTaskRunnerWithoutTasks) { scoped_refptr<scheduler::TaskQueue> task_runner1( - platform_->GetRendererScheduler()->NewTimerTaskQueue( + platform_->GetMainThreadScheduler()->NewTimerTaskQueue( scheduler::MainThreadTaskQueue::QueueType::kFrameThrottleable)); scoped_refptr<scheduler::TaskRunnerImpl> task_runner_impl1 = scheduler::TaskRunnerImpl::Create(task_runner1, TaskType::kInternalTest); scoped_refptr<scheduler::TaskQueue> task_runner2( - platform_->GetRendererScheduler()->NewTimerTaskQueue( + platform_->GetMainThreadScheduler()->NewTimerTaskQueue( scheduler::MainThreadTaskQueue::QueueType::kFrameThrottleable)); scoped_refptr<scheduler::TaskRunnerImpl> task_runner_impl2 = scheduler::TaskRunnerImpl::Create(task_runner2, TaskType::kInternalTest);
diff --git a/third_party/closure_compiler/externs/bluetooth.js b/third_party/closure_compiler/externs/bluetooth.js index e882535..ff071e0 100644 --- a/third_party/closure_compiler/externs/bluetooth.js +++ b/third_party/closure_compiler/externs/bluetooth.js
@@ -1,9 +1,9 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. +// 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. // This file was generated by: -// ./tools/json_schema_compiler/compiler.py. +// tools/json_schema_compiler/compiler.py. // NOTE: The format of types has changed. 'FooType' is now // 'chrome.bluetooth.FooType'. // Please run the closure compiler before committing changes. @@ -46,6 +46,15 @@ }; /** + * @enum {string} + * @see https://developer.chrome.com/extensions/bluetooth#type-FilterType + */ +chrome.bluetooth.FilterType = { + ALL: 'all', + KNOWN: 'known', +}; + +/** * @typedef {{ * address: string, * name: string, @@ -80,6 +89,15 @@ chrome.bluetooth.Device; /** + * @typedef {{ + * filterType: (!chrome.bluetooth.FilterType|undefined), + * limit: (number|undefined) + * }} + * @see https://developer.chrome.com/extensions/bluetooth#type-BluetoothFilter + */ +chrome.bluetooth.BluetoothFilter; + +/** * Get information about the Bluetooth adapter. * @param {function(!chrome.bluetooth.AdapterState):void} callback Called with * an AdapterState object describing the adapter state. @@ -99,11 +117,16 @@ /** * Get a list of Bluetooth devices known to the system, including paired and * recently discovered devices. - * @param {function(!Array<!chrome.bluetooth.Device>):void} callback Called when + * @param {!chrome.bluetooth.BluetoothFilter=} filter Some criteria to filter + * the list of returned bluetooth devices. If the filter is not set or set + * to <code>{}</code>, returned device list will contain all bluetooth + * devices. Right now this is only supported in ChromeOS, for other + * platforms, a full list is returned. + * @param {function(!Array<!chrome.bluetooth.Device>):void=} callback Called when * the search is completed. * @see https://developer.chrome.com/extensions/bluetooth#method-getDevices */ -chrome.bluetooth.getDevices = function(callback) {}; +chrome.bluetooth.getDevices = function(filter, callback) {}; /** * <p>Start discovery. Newly discovered devices will be returned via the
diff --git a/third_party/closure_compiler/interfaces/bluetooth_interface.js b/third_party/closure_compiler/interfaces/bluetooth_interface.js index 789e56d..992665fa 100644 --- a/third_party/closure_compiler/interfaces/bluetooth_interface.js +++ b/third_party/closure_compiler/interfaces/bluetooth_interface.js
@@ -1,9 +1,9 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. +// 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. // This file was generated by: -// ./tools/json_schema_compiler/compiler.py. +// tools/json_schema_compiler/compiler.py. /** @fileoverview Interface for bluetooth that can be overriden. */ @@ -33,7 +33,12 @@ /** * Get a list of Bluetooth devices known to the system, including paired and * recently discovered devices. - * @param {function(!Array<!chrome.bluetooth.Device>):void} callback Called + * @param {!chrome.bluetooth.BluetoothFilter=} filter Some criteria to filter + * the list of returned bluetooth devices. If the filter is not set or set + * to <code>{}</code>, returned device list will contain all bluetooth + * devices. Right now this is only supported in ChromeOS, for other + * platforms, a full list is returned. + * @param {function(!Array<!chrome.bluetooth.Device>):void=} callback Called * when the search is completed. * @see https://developer.chrome.com/extensions/bluetooth#method-getDevices */
diff --git a/tools/binary_size/README.md b/tools/binary_size/README.md index 20682703..db6da34 100644 --- a/tools/binary_size/README.md +++ b/tools/binary_size/README.md
@@ -85,26 +85,28 @@ ##### Native Symbols 1. Symbol list is Extracted from linker `.map` file. - * Map files contain some unique pieces of information compared to `nm` output, - such as `** merge strings` entries, and some unnamed symbols (which - although unnamed, contain the `.o` path). + * Map files contain some unique pieces of information compared to `nm` + output, such as `** merge strings` entries, and some unnamed symbols + (which although unnamed, contain the `.o` path). 1. `.o` files are mapped to `.cc` files by parsing `.ninja` files. - * This means that `.h` files are never listed as sources. No information about - inlined symbols is gathered. -1. Symbol aliases (when multiple symbols share an address) are collected from - debug information via `nm elf-file`. - * Aliases are created by identical code folding (linker optimization). + * This means that `.h` files are never listed as sources. No information + about inlined symbols is gathered. +1. `** merge strings` symbols are further broken down into individual string + literal symbols. This is done by reading string literals from `.o` files, and + then searching for them within the `** merge strings` sections. +1. Symbol aliases: * Aliases have the same address and size, but report their `.pss` as `.size / .num_aliases`. -1. `** merge strings` symbols are further broken down into individual string - literal symbols. This is done by reading string literals from `.o` files, and - then searching for them within the `** merge strings` sections. -1. "Shared symbols" are those that are owned by multiple `.o` files. These include - inline functions defined in `.h` files, and string literals that are de-duped - at link-time. Shared symbols are normally represented using one symbol alias - per path, but are sometimes collapsed into a single symbol where the path is - set to `{shared}/$SYMBOL_COUNT`. This collapsing is done only for symbols owned - by a large number of paths. + * Type 1: Different names. Caused by identical code folding. + * These are collected from debug information via `nm elf-file`. + * Type 2: Same names, different paths. Caused by inline functions defined in + `.h` files. + * These are collected by running `nm` on each `.o` file. + * Normally represented using one alias per path, but are sometimes + collapsed into a single symbol with a path of `{shared}/$SYMBOL_COUNT`. + This collapsing is done only for symbols owned by a large number of paths. + * Type 3: String literals that are de-duped at link-time. + * These are found as part of the string literal extraction process. ##### Pak Symbols
diff --git a/tools/binary_size/libsupersize/ar.py b/tools/binary_size/libsupersize/ar.py new file mode 100755 index 0000000..888560a2 --- /dev/null +++ b/tools/binary_size/libsupersize/ar.py
@@ -0,0 +1,130 @@ +#!/usr/bin/env python +# 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. + +"""Logic for reading .a files.""" + +from __future__ import print_function + +import argparse +import logging +import os + + +def IsThinArchive(path): + """Returns whether the given .a is a thin archive.""" + with open(path, 'rb') as f: + return f.read(8) == '!<thin>\n' + + +def CreateThinObjectPath(archive_path, subpath): + """Given the .a path and .o subpath, returns the .o path.""" + # .o subpaths in thin archives are relative to the directory of the .a. + parent_path = os.path.dirname(archive_path) + return os.path.normpath(os.path.join(parent_path, subpath)) + + +def IterArchiveChunks(path): + """For each .o embedded in the given .a file, yields (foo.o, foo_contents).""" + # File format reference: + # https://github.com/pathscale/binutils/blob/master/gold/archive.cc + with open(path, 'rb') as f: + header = f.read(8) + is_thin = header == '!<thin>\n' + if not is_thin and header != '!<arch>\n': + raise Exception('Invalid .a: ' + path) + + def read_payload(size): + ret = f.read(size) + # Entries are 2-byte aligned. + if size & 1 != 0: + f.read(1) + return ret + + while True: + entry = f.read(60) + if not entry: + return + entry_name = entry[:16].rstrip() + entry_size = int(entry[48:58].rstrip()) + + if entry_name in ('', '/', '//', '/SYM64/'): + payload = read_payload(entry_size) + # Metadata sections we don't care about. + if entry_name == '//': + name_list = payload + continue + + if entry_name[0] == '/': + # Name is specified as location in name table. + # E.g.: /123 + name_offset = int(entry_name[1:]) + # String table enties are delimited by \n (e.g. "browser.o/\n"). + end_idx = name_list.index('\n', name_offset) + entry_name = name_list[name_offset:end_idx] + else: + # Name specified inline with spaces for padding (e.g. "browser.o/ "). + entry_name = entry_name.rstrip() + + # Although entry_size exists for thin archives, no data exists in the .a. + entry_data = None if is_thin else read_payload(entry_size) + yield entry_name.rstrip('/'), entry_data + + +def ExpandThinArchives(paths, output_directory): + """Expands all thin archives found in |paths| into .o paths. + + Args: + paths: List of paths relative to |output_directory|. + output_directory: Output directory. + + Returns: + * A new list of paths with all thin archives replaced by .o paths. + * A set of all .a paths that were thin archives. + """ + expanded_paths = [] + thin_paths = set() + num_archives = 0 + for path in paths: + if not path.endswith('.a'): + expanded_paths.append(path) + continue + num_archives += 1 + abs_path = os.path.join(output_directory, path) + if not IsThinArchive(abs_path): + expanded_paths.append(path) + continue + + thin_paths.add(path) + # Thin archive. + for subpath, _ in IterArchiveChunks(abs_path): + expanded_paths.append(CreateThinObjectPath(path, subpath)) + + logging.info('%d of %d .a files were thin archives', + len(thin_paths), num_archives) + return expanded_paths, thin_paths + + +def CreateThinObjectPath(archive_path, subpath): + parent_path = os.path.dirname(archive_path) + return os.path.normpath(os.path.join(parent_path, subpath)) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('ar_path') + parser.add_argument('--expand-thin', action='store_true') + parser.add_argument('--output-directory', default='.') + args = parser.parse_args() + + if args.expand_thin: + expanded = ExpandThinArchives([args.ar_path], args.output_directory)[0] + print('\n'.join(expanded)) + else: + for name, payload in IterArchiveChunks(args.ar_path): + print('{}: size={}'.format(name, len(payload) if payload else '<thin>')) + + +if __name__ == '__main__': + main()
diff --git a/tools/binary_size/libsupersize/archive.py b/tools/binary_size/libsupersize/archive.py index abeefa7..f9c1c45 100644 --- a/tools/binary_size/libsupersize/archive.py +++ b/tools/binary_size/libsupersize/archive.py
@@ -20,6 +20,7 @@ import zipfile import apkanalyzer +import ar import concurrent import demangle import describe @@ -35,6 +36,16 @@ from grit.format import data_pack +# Holds computation state that is live only when an output directory exists. +_OutputDirectoryContext = collections.namedtuple('_OutputDirectoryContext', [ + 'elf_object_paths', # Only when elf_path is also provided. + 'known_inputs', # Only when elf_path is also provided. + 'output_directory', + 'source_mapper', + 'thin_archives', +]) + + # Tunable "knobs" for CreateSectionSizesAndSymbols(). class SectionSizeKnobs(object): def __init__(self): @@ -190,8 +201,9 @@ # Convert ../../third_party/... -> third_party/... path = path[6:] if path.endswith(')'): - # Convert foo/bar.a(baz.o) -> foo/bar.a/baz.o - start_idx = path.index('(') + # Convert foo/bar.a(baz.o) -> foo/bar.a/baz.o so that hierarchical + # breakdowns consider the .o part to be a separate node. + start_idx = path.rindex('(') path = os.path.join(path[:start_idx], path[start_idx + 1:-1]) return path @@ -373,17 +385,16 @@ return ret -def _DiscoverMissedObjectPaths(raw_symbols, elf_object_paths): +def _DiscoverMissedObjectPaths(raw_symbols, known_inputs): # Missing object paths are caused by .a files added by -l flags, which are not # listed as explicit inputs within .ninja rules. - parsed_inputs = set(elf_object_paths) missed_inputs = set() for symbol in raw_symbols: path = symbol.object_path if path.endswith(')'): # Convert foo/bar.a(baz.o) -> foo/bar.a - path = path[:path.index('(')] - if path and path not in parsed_inputs: + path = path[:path.rindex('(')] + if path and path not in known_inputs: missed_inputs.add(path) return missed_inputs @@ -608,9 +619,21 @@ return metadata -def _ParseElfInfo(map_path, elf_path, tool_prefix, output_directory, - track_string_literals, elf_object_paths): - """Adds Elf section sizes and symbols.""" +def _ResolveThinArchivePaths(raw_symbols, thin_archives): + """Converts object_paths for thin archives to external .o paths.""" + for symbol in raw_symbols: + object_path = symbol.object_path + if object_path.endswith(')'): + start_idx = object_path.rindex('(') + archive_path = object_path[:start_idx] + if archive_path in thin_archives: + subpath = object_path[start_idx + 1:-1] + symbol.object_path = ar.CreateThinObjectPath(archive_path, subpath) + + +def _ParseElfInfo(map_path, elf_path, tool_prefix, track_string_literals, + outdir_context=None): + """Adds ELF section sizes and symbols.""" if elf_path: # Run nm on the elf file to retrieve the list of symbol names per-address. # This list is required because the .map file contains only a single name @@ -627,15 +650,19 @@ # single path for these symbols. # Rather than record all paths for each symbol, set the paths to be the # common ancestor of all paths. - if output_directory: - bulk_analyzer = nm.BulkObjectFileAnalyzer(tool_prefix, output_directory) - bulk_analyzer.AnalyzePaths(elf_object_paths) + if outdir_context: + bulk_analyzer = nm.BulkObjectFileAnalyzer( + tool_prefix, outdir_context.output_directory) + bulk_analyzer.AnalyzePaths(outdir_context.elf_object_paths) logging.info('Parsing Linker Map') with _OpenMaybeGz(map_path) as map_file: section_sizes, raw_symbols = ( linker_map_parser.MapFileParser().Parse(map_file)) + if outdir_context and outdir_context.thin_archives: + _ResolveThinArchivePaths(raw_symbols, outdir_context.thin_archives) + if elf_path: logging.debug('Validating section sizes') elf_section_sizes = _SectionSizesFromElf(elf_path, tool_prefix) @@ -646,9 +673,11 @@ logging.error('readelf: %r', elf_section_sizes) sys.exit(1) - if elf_path and output_directory: + if elf_path and outdir_context: missed_object_paths = _DiscoverMissedObjectPaths( - raw_symbols, elf_object_paths) + raw_symbols, outdir_context.known_inputs) + missed_object_paths = ar.ExpandThinArchives( + missed_object_paths, outdir_context.output_directory)[0] bulk_analyzer.AnalyzePaths(missed_object_paths) bulk_analyzer.SortPaths() if track_string_literals: @@ -674,11 +703,12 @@ names_by_address = elf_nm_result.get() raw_symbols = _AddNmAliases(raw_symbols, names_by_address) - if output_directory: + if outdir_context: object_paths_by_name = bulk_analyzer.GetSymbolNames() - logging.debug('Fetched path information for %d symbols from %d files', - len(object_paths_by_name), - len(elf_object_paths) + len(missed_object_paths)) + logging.debug( + 'Fetched path information for %d symbols from %d files', + len(object_paths_by_name), + len(outdir_context.elf_object_paths) + len(missed_object_paths)) # For aliases, this provides path information where there wasn't any. logging.info('Creating aliases for symbols shared by multiple paths') @@ -923,22 +953,42 @@ apk_elf_result = concurrent.ForkAndCall( _ElfInfoFromApk, (apk_path, apk_so_path, tool_prefix)) + outdir_context = None source_mapper = None - elf_object_paths = None if output_directory: # Start by finding the elf_object_paths, so that nm can run on them while # the linker .map is being parsed. logging.info('Parsing ninja files.') - source_mapper, elf_object_paths = ninja_parser.Parse( - output_directory, elf_path) + source_mapper, ninja_elf_object_paths = ( + ninja_parser.Parse(output_directory, elf_path)) logging.debug('Parsed %d .ninja files.', source_mapper.parsed_file_count) - assert not elf_path or elf_object_paths, ( + assert not elf_path or ninja_elf_object_paths, ( 'Failed to find link command in ninja files for ' + os.path.relpath(elf_path, output_directory)) + if ninja_elf_object_paths: + elf_object_paths, thin_archives = ar.ExpandThinArchives( + ninja_elf_object_paths, output_directory) + known_inputs = set(elf_object_paths) + known_inputs.update(ninja_elf_object_paths) + else: + elf_object_paths = None + known_inputs = None + # When we don't know which elf file is used, just search all paths. + thin_archives = set( + p for p in source_mapper.IterAllPaths() + if p.endswith('.a') and ar.IsThinArchive( + os.path.join(output_directory, p))) + + outdir_context = _OutputDirectoryContext( + elf_object_paths=elf_object_paths, + known_inputs=known_inputs, + output_directory=output_directory, + source_mapper=source_mapper, + thin_archives=thin_archives) + section_sizes, raw_symbols = _ParseElfInfo( - map_path, elf_path, tool_prefix, output_directory, track_string_literals, - elf_object_paths) + map_path, elf_path, tool_prefix, track_string_literals, outdir_context) elf_overhead_size = _CalculateElfOverhead(section_sizes, elf_path) pak_symbols_by_id = None @@ -981,6 +1031,10 @@ section_sizes, raw_symbols, metadata=None, normalize_names=True): """Performs operations on all symbols and creates a SizeInfo object.""" logging.debug('Sorting %d symbols', len(raw_symbols)) + # TODO(agrieve): Either change this sort so that it's only sorting by section + # (and not using .sort()), or have it specify a total ordering (which must + # also include putting padding-only symbols before others of the same + # address). Note: The sort as-is takes ~1.5 seconds. raw_symbols.sort(key=lambda s: ( s.IsPak(), s.IsBss(), s.section_name, s.address)) logging.info('Processed %d symbols', len(raw_symbols))
diff --git a/tools/binary_size/libsupersize/ninja_parser.py b/tools/binary_size/libsupersize/ninja_parser.py old mode 100644 new mode 100755 index 6b776539..97db8eb --- a/tools/binary_size/libsupersize/ninja_parser.py +++ b/tools/binary_size/libsupersize/ninja_parser.py
@@ -1,8 +1,12 @@ +#!/usr/bin/env python # Copyright 2017 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. """Extract source file information from .ninja files.""" +from __future__ import print_function + +import argparse import logging import os import re @@ -118,3 +122,32 @@ to_parse.extend(sub_ninjas) return _SourceMapper(dep_map, len(seen_paths)), elf_inputs + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--output-directory', required=True) + parser.add_argument('--elf-path') + parser.add_argument('--show-inputs', action='store_true') + parser.add_argument('--show-mappings', action='store_true') + args = parser.parse_args() + logging.basicConfig(level=logging.DEBUG, + format='%(levelname).1s %(relativeCreated)6d %(message)s') + + source_mapper, elf_inputs = Parse(args.output_directory, args.elf_path) + if not elf_inputs: + elf_inputs = [] + + print('Found {} elf_inputs, and {} source mappings'.format( + len(elf_inputs), len(source_mapper._dep_map))) + if args.show_inputs: + print('elf_inputs:') + print('\n'.join(elf_inputs)) + if args.show_mappings: + print('object_path -> source_path:') + for path in source_mapper.IterAllPaths(): + print('{} -> {}'.format(path, source_mapper.FindSourceForPath(path))) + + +if __name__ == '__main__': + main()
diff --git a/tools/binary_size/libsupersize/nm.py b/tools/binary_size/libsupersize/nm.py index 6f97d3a1..6ee1320e 100755 --- a/tools/binary_size/libsupersize/nm.py +++ b/tools/binary_size/libsupersize/nm.py
@@ -30,7 +30,7 @@ Alias for _BulkObjectFileAnalyzerMaster, but when SUPERSIZE_DISABLE_ASYNC=1, alias for _BulkObjectFileAnalyzerWorker. * AnalyzePaths: Run "nm" on all .o files to collect symbol names that exist - within each. + within each. Does not work with thin archives (expand them first). * SortPaths: Sort results of AnalyzePaths(). * AnalyzeStringLiterals: Must be run after AnalyzePaths() has completed. Extracts string literals from .o files, and then locates them within the @@ -57,6 +57,7 @@ import threading import traceback +import ar import concurrent import demangle import models @@ -263,41 +264,6 @@ return ret -def _IterArchiveChunks(path): - """For each .o embedded in the given .a file, yields (foo.o, foo_contents).""" - with open(path, 'rb') as f: - if f.read(8) != '!<arch>\n' : - raise Exception('Invalid .a: ' + path) - while True: - line = f.readline() - if not line: - return - parts = line.split() - chunk_size = int(parts[-2]) - chunk_data = f.read(chunk_size) - - name = parts[0] - if name == '/': - # Initial metadata chunk. - continue - elif name == '//': - name_list = chunk_data - continue - elif name[0] == '/': - # Name is specified as location in name table. - # E.g.: /123 - name_offset = int(name[1:]) - slash_idx = name_list.index('/', name_offset) - name = name_list[name_offset:slash_idx] - else: - # Name is specified inline. - # E.g.: foo.o/ - # Name may not have whitespace before next field, so use rindex. - # E.g.: somelongername.o/1234 - name = name[:name.rindex('/')] - yield name, chunk_data - - def _ParseOneObjectFileNmOutput(lines): # Constructors are often repeated because they have the same unmangled # name, but multiple mangled names. See: @@ -332,7 +298,7 @@ is_archive = isinstance(target, basestring) string_sections_by_path = {} if is_archive: - for subpath, chunk in _IterArchiveChunks( + for subpath, chunk in ar.IterArchiveChunks( os.path.join(output_directory, target)): path = '{}({})'.format(target, subpath) positions = positions_by_path.get(path)
diff --git a/tools/binary_size/libsupersize/testdata/Archive.golden b/tools/binary_size/libsupersize/testdata/Archive.golden index 75c121e3..92c5ce59 100644 --- a/tools/binary_size/libsupersize/testdata/Archive.golden +++ b/tools/binary_size/libsupersize/testdata/Archive.golden
@@ -24,18 +24,18 @@ * Contains 0 aliases * 0 symbols have shared ownership .data@2de7000(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelCmpxchg,object_path=base/base/page_allocator.o,source_path=,flags={},num_aliases=1) -.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={},num_aliases=1) -.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={rel},num_aliases=1) -.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={anon},num_aliases=1) -.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={anon,rel.loc},num_aliases=1) +.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={},num_aliases=1) +.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={rel},num_aliases=1) +.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={anon},num_aliases=1) +.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={anon,rel.loc},num_aliases=1) .data@2dffd88(size_without_padding=0,padding=101600,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1) -.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/WebKit.a/PaintChunker.o,source_path=,flags={},num_aliases=1) +.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/WebKit.a/sub/PaintChunker.o,source_path=,flags={},num_aliases=1) .data.rel.ro@2cd8538(size_without_padding=24,padding=0,full_name=mojo::MessageReceiver [vtable],object_path=base/base/page_allocator.o,source_path=,flags={},num_aliases=1) .data.rel.ro@2cd8550(size_without_padding=12,padding=0,full_name=kMethodsAnimationFrameTimeHistogram,object_path=base/base/page_allocator.o,source_path=,flags={},num_aliases=1) .data.rel.ro@2ddc608(size_without_padding=0,padding=1065132,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1) .data.rel.ro.local@2c176f0(size_without_padding=56,padding=0,full_name=ChromeMainDelegate [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=,flags={},num_aliases=1) .data.rel.ro.local@2c17728(size_without_padding=24,padding=0,full_name=chrome::mojom::FieldTrialRecorder [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=,flags={},num_aliases=1) -.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={},num_aliases=1) +.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={},num_aliases=1) .data.rel.ro.local@2cd84e0(size_without_padding=16,padding=16,full_name=.Lswitch.table.45,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o,source_path=,flags={},num_aliases=1) .data.rel.ro.local@2cd84f0(size_without_padding=8,padding=0,full_name=kSystemClassPrefixes,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o,source_path=,flags={anon},num_aliases=1) .rodata@266e600(size_without_padding=32,padding=0,full_name=** merge strings,object_path=,source_path=,flags={},num_aliases=1) @@ -44,9 +44,9 @@ .rodata@284e364(size_without_padding=0,padding=3,full_name=** symbol gap 0,object_path=,source_path=,flags={},num_aliases=1) .rodata@284e364(size_without_padding=8,padding=0,full_name=,object_path=base/base/page_allocator.o,source_path=,flags={},num_aliases=1) .rodata@284e370(size_without_padding=40,padding=4,full_name=Name,object_path=base/base/page_allocator.o,source_path=,flags={},num_aliases=1) -.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={},num_aliases=1) -.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/WebKit.a/PaintChunker.o,source_path=,flags={anon},num_aliases=1) -.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/WebKit.a/PaintChunker.o,source_path=,flags={anon},num_aliases=1) +.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={},num_aliases=1) +.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/WebKit.a/sub/PaintChunker.o,source_path=,flags={anon},num_aliases=1) +.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/WebKit.a/sub/PaintChunker.o,source_path=,flags={anon},num_aliases=1) .rodata@2c158e4(size_without_padding=0,padding=3286112,full_name=** symbol gap 1 (end of section),object_path=,source_path=,flags={},num_aliases=1) .text@28d900(size_without_padding=16,padding=0,full_name=_GLOBAL__sub_I_page_allocator.cc,object_path=base/base/page_allocator.o,source_path=,flags={startup},num_aliases=1) .text@28d910(size_without_padding=56,padding=0,full_name=_GLOBAL__sub_I_bbr_sender.cc,object_path=base/base/page_allocator.o,source_path=,flags={startup},num_aliases=1) @@ -57,11 +57,11 @@ .text@28f000(size_without_padding=448,padding=0,full_name=ucnv_extMatchFromU(int const*, int, unsigned short const*, int, unsigned short const*, int, unsigned int*, signed char, signed char),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=,flags={},num_aliases=1) .text@28f1c8(size_without_padding=20,padding=8,full_name=_GLOBAL__sub_I_SkDeviceProfile.cpp,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=,flags={startup},num_aliases=1) .text@28f1e0(size_without_padding=69120,padding=4,full_name=foo_bar,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=,flags={unlikely},num_aliases=1) -.text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/PaintChunker.o,source_path=,flags={},num_aliases=1) -.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/PaintChunker.o,source_path=,flags={clone,hot},num_aliases=1) -.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={},num_aliases=1) +.text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/sub/PaintChunker.o,source_path=,flags={},num_aliases=1) +.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/sub/PaintChunker.o,source_path=,flags={clone,hot},num_aliases=1) +.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={},num_aliases=1) .text@2a1000(size_without_padding=0,padding=4040,full_name=** symbol gap 1,object_path=,source_path=,flags={},num_aliases=1) -.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={anon,clone},num_aliases=1) +.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={anon,clone},num_aliases=1) .text@24ca628(size_without_padding=0,padding=35821002,full_name=** symbol gap 2 (end of section),object_path=,source_path=,flags={},num_aliases=1) .bss@0(size_without_padding=262144,padding=0,full_name=ff_cos_131072,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=,flags={},num_aliases=1) .bss@0(size_without_padding=131072,padding=0,full_name=ff_cos_131072_fixed,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o,source_path=,flags={},num_aliases=1)
diff --git a/tools/binary_size/libsupersize/testdata/Archive_Apk.golden b/tools/binary_size/libsupersize/testdata/Archive_Apk.golden index 428204e7..34310ef 100644 --- a/tools/binary_size/libsupersize/testdata/Archive_Apk.golden +++ b/tools/binary_size/libsupersize/testdata/Archive_Apk.golden
@@ -47,18 +47,18 @@ * Contains 0 aliases * 0 symbols have shared ownership .data@2de7000(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelCmpxchg,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) -.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) -.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={rel},num_aliases=1) -.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon},num_aliases=1) -.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,rel.loc},num_aliases=1) +.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={rel},num_aliases=1) +.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon},num_aliases=1) +.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,rel.loc},num_aliases=1) .data@2dffd88(size_without_padding=0,padding=101600,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1) -.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1) +.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1) .data.rel.ro@2cd8538(size_without_padding=24,padding=0,full_name=mojo::MessageReceiver [vtable],object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) .data.rel.ro@2cd8550(size_without_padding=12,padding=0,full_name=kMethodsAnimationFrameTimeHistogram,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) .data.rel.ro@2ddc608(size_without_padding=0,padding=1065132,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1) .data.rel.ro.local@2c176f0(size_without_padding=56,padding=0,full_name=ChromeMainDelegate [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1) .data.rel.ro.local@2c17728(size_without_padding=24,padding=0,full_name=chrome::mojom::FieldTrialRecorder [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1) -.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) .data.rel.ro.local@2cd84e0(size_without_padding=16,padding=16,full_name=.Lswitch.table.45,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o,source_path=,flags={},num_aliases=1) .data.rel.ro.local@2cd84f0(size_without_padding=8,padding=0,full_name=kSystemClassPrefixes,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o,source_path=,flags={anon},num_aliases=1) .dex@0(size_without_padding=12,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack boolean $assertionsDisabled,object_path=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1) @@ -266,9 +266,9 @@ .rodata@284e364(size_without_padding=0,padding=3,full_name=** symbol gap 0,object_path=,source_path=,flags={},num_aliases=1) .rodata@284e364(size_without_padding=8,padding=0,full_name=,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) .rodata@284e370(size_without_padding=40,padding=4,full_name=Name,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) -.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) -.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) -.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) +.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) +.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) .rodata@2c158e4(size_without_padding=0,padding=3286112,full_name=** symbol gap 1 (end of section),object_path=,source_path=,flags={},num_aliases=1) .text@28d900(size_without_padding=16,padding=0,full_name=_GLOBAL__sub_I_page_allocator.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1) .text@28d910(size_without_padding=56,padding=0,full_name=_GLOBAL__sub_I_bbr_sender.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1) @@ -283,11 +283,11 @@ .text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=,source_path=,flags={},num_aliases=2) .text@2a0010(size_without_padding=12,padding=0,full_name=BarAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4) .text@2a0010(size_without_padding=12,padding=0,full_name=FooAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4) -.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4) .text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen,clone},num_aliases=4) -.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4) +.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) .text@2a1000(size_without_padding=0,padding=4040,full_name=** symbol gap 1,object_path=,source_path=,flags={},num_aliases=1) -.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1) +.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1) .text@24ca628(size_without_padding=0,padding=35821002,full_name=** symbol gap 2 (end of section),object_path=,source_path=,flags={},num_aliases=1) .bss@0(size_without_padding=262144,padding=0,full_name=ff_cos_131072,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=1) .bss@0(size_without_padding=131072,padding=0,full_name=ff_cos_131072_fixed,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o,source_path=third_party/fft_fixed.cc,flags={},num_aliases=1)
diff --git a/tools/binary_size/libsupersize/testdata/Archive_Elf.golden b/tools/binary_size/libsupersize/testdata/Archive_Elf.golden index 01b6cef..9ecd1290 100644 --- a/tools/binary_size/libsupersize/testdata/Archive_Elf.golden +++ b/tools/binary_size/libsupersize/testdata/Archive_Elf.golden
@@ -36,18 +36,18 @@ * Contains 0 aliases * 0 symbols have shared ownership .data@2de7000(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelCmpxchg,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) -.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) -.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={rel},num_aliases=1) -.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon},num_aliases=1) -.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,rel.loc},num_aliases=1) +.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={rel},num_aliases=1) +.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon},num_aliases=1) +.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,rel.loc},num_aliases=1) .data@2dffd88(size_without_padding=0,padding=101600,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1) -.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1) +.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1) .data.rel.ro@2cd8538(size_without_padding=24,padding=0,full_name=mojo::MessageReceiver [vtable],object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) .data.rel.ro@2cd8550(size_without_padding=12,padding=0,full_name=kMethodsAnimationFrameTimeHistogram,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) .data.rel.ro@2ddc608(size_without_padding=0,padding=1065132,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1) .data.rel.ro.local@2c176f0(size_without_padding=56,padding=0,full_name=ChromeMainDelegate [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1) .data.rel.ro.local@2c17728(size_without_padding=24,padding=0,full_name=chrome::mojom::FieldTrialRecorder [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1) -.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) .data.rel.ro.local@2cd84e0(size_without_padding=16,padding=16,full_name=.Lswitch.table.45,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o,source_path=,flags={},num_aliases=1) .data.rel.ro.local@2cd84f0(size_without_padding=8,padding=0,full_name=kSystemClassPrefixes,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o,source_path=,flags={anon},num_aliases=1) .other@0(size_without_padding=0,padding=33984171,full_name=Overhead: ELF file,object_path=,source_path=,flags={},num_aliases=1) @@ -59,9 +59,9 @@ .rodata@284e364(size_without_padding=0,padding=3,full_name=** symbol gap 0,object_path=,source_path=,flags={},num_aliases=1) .rodata@284e364(size_without_padding=8,padding=0,full_name=,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) .rodata@284e370(size_without_padding=40,padding=4,full_name=Name,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) -.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) -.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) -.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) +.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) +.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) .rodata@2c158e4(size_without_padding=0,padding=3286112,full_name=** symbol gap 1 (end of section),object_path=,source_path=,flags={},num_aliases=1) .text@28d900(size_without_padding=16,padding=0,full_name=_GLOBAL__sub_I_page_allocator.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1) .text@28d910(size_without_padding=56,padding=0,full_name=_GLOBAL__sub_I_bbr_sender.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1) @@ -76,11 +76,11 @@ .text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=,source_path=,flags={},num_aliases=2) .text@2a0010(size_without_padding=12,padding=0,full_name=BarAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4) .text@2a0010(size_without_padding=12,padding=0,full_name=FooAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4) -.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4) .text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen,clone},num_aliases=4) -.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4) +.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) .text@2a1000(size_without_padding=0,padding=4040,full_name=** symbol gap 1,object_path=,source_path=,flags={},num_aliases=1) -.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1) +.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1) .text@24ca628(size_without_padding=0,padding=35821002,full_name=** symbol gap 2 (end of section),object_path=,source_path=,flags={},num_aliases=1) .bss@0(size_without_padding=262144,padding=0,full_name=ff_cos_131072,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=1) .bss@0(size_without_padding=131072,padding=0,full_name=ff_cos_131072_fixed,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o,source_path=third_party/fft_fixed.cc,flags={},num_aliases=1)
diff --git a/tools/binary_size/libsupersize/testdata/Archive_OutputDirectory.golden b/tools/binary_size/libsupersize/testdata/Archive_OutputDirectory.golden index a8cf239b..784fbda 100644 --- a/tools/binary_size/libsupersize/testdata/Archive_OutputDirectory.golden +++ b/tools/binary_size/libsupersize/testdata/Archive_OutputDirectory.golden
@@ -24,18 +24,18 @@ * Contains 0 aliases * 0 symbols have shared ownership .data@2de7000(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelCmpxchg,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) -.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) -.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={rel},num_aliases=1) -.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon},num_aliases=1) -.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,rel.loc},num_aliases=1) +.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={rel},num_aliases=1) +.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon},num_aliases=1) +.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,rel.loc},num_aliases=1) .data@2dffd88(size_without_padding=0,padding=101600,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1) -.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1) +.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1) .data.rel.ro@2cd8538(size_without_padding=24,padding=0,full_name=mojo::MessageReceiver [vtable],object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) .data.rel.ro@2cd8550(size_without_padding=12,padding=0,full_name=kMethodsAnimationFrameTimeHistogram,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) .data.rel.ro@2ddc608(size_without_padding=0,padding=1065132,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1) .data.rel.ro.local@2c176f0(size_without_padding=56,padding=0,full_name=ChromeMainDelegate [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1) .data.rel.ro.local@2c17728(size_without_padding=24,padding=0,full_name=chrome::mojom::FieldTrialRecorder [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1) -.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) .data.rel.ro.local@2cd84e0(size_without_padding=16,padding=16,full_name=.Lswitch.table.45,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o,source_path=,flags={},num_aliases=1) .data.rel.ro.local@2cd84f0(size_without_padding=8,padding=0,full_name=kSystemClassPrefixes,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o,source_path=,flags={anon},num_aliases=1) .rodata@266e600(size_without_padding=32,padding=0,full_name=** merge strings,object_path=,source_path=,flags={},num_aliases=1) @@ -44,9 +44,9 @@ .rodata@284e364(size_without_padding=0,padding=3,full_name=** symbol gap 0,object_path=,source_path=,flags={},num_aliases=1) .rodata@284e364(size_without_padding=8,padding=0,full_name=,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) .rodata@284e370(size_without_padding=40,padding=4,full_name=Name,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) -.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) -.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) -.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) +.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) +.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) .rodata@2c158e4(size_without_padding=0,padding=3286112,full_name=** symbol gap 1 (end of section),object_path=,source_path=,flags={},num_aliases=1) .text@28d900(size_without_padding=16,padding=0,full_name=_GLOBAL__sub_I_page_allocator.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1) .text@28d910(size_without_padding=56,padding=0,full_name=_GLOBAL__sub_I_bbr_sender.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1) @@ -57,11 +57,11 @@ .text@28f000(size_without_padding=448,padding=0,full_name=ucnv_extMatchFromU(int const*, int, unsigned short const*, int, unsigned short const*, int, unsigned int*, signed char, signed char),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1) .text@28f1c8(size_without_padding=20,padding=8,full_name=_GLOBAL__sub_I_SkDeviceProfile.cpp,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={startup,gen},num_aliases=1) .text@28f1e0(size_without_padding=69120,padding=4,full_name=foo_bar,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={unlikely,gen},num_aliases=1) -.text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1) -.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={clone,hot},num_aliases=1) -.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1) +.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={clone,hot},num_aliases=1) +.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) .text@2a1000(size_without_padding=0,padding=4040,full_name=** symbol gap 1,object_path=,source_path=,flags={},num_aliases=1) -.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1) +.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1) .text@24ca628(size_without_padding=0,padding=35821002,full_name=** symbol gap 2 (end of section),object_path=,source_path=,flags={},num_aliases=1) .bss@0(size_without_padding=262144,padding=0,full_name=ff_cos_131072,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=1) .bss@0(size_without_padding=131072,padding=0,full_name=ff_cos_131072_fixed,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o,source_path=third_party/fft_fixed.cc,flags={},num_aliases=1)
diff --git a/tools/binary_size/libsupersize/testdata/Archive_Pak_Files.golden b/tools/binary_size/libsupersize/testdata/Archive_Pak_Files.golden index 703c98a..e0e2a74 100644 --- a/tools/binary_size/libsupersize/testdata/Archive_Pak_Files.golden +++ b/tools/binary_size/libsupersize/testdata/Archive_Pak_Files.golden
@@ -40,18 +40,18 @@ * Contains 0 aliases * 0 symbols have shared ownership .data@2de7000(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelCmpxchg,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) -.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) -.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={rel},num_aliases=1) -.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon},num_aliases=1) -.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,rel.loc},num_aliases=1) +.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={rel},num_aliases=1) +.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon},num_aliases=1) +.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,rel.loc},num_aliases=1) .data@2dffd88(size_without_padding=0,padding=101600,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1) -.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1) +.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1) .data.rel.ro@2cd8538(size_without_padding=24,padding=0,full_name=mojo::MessageReceiver [vtable],object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) .data.rel.ro@2cd8550(size_without_padding=12,padding=0,full_name=kMethodsAnimationFrameTimeHistogram,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) .data.rel.ro@2ddc608(size_without_padding=0,padding=1065132,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1) .data.rel.ro.local@2c176f0(size_without_padding=56,padding=0,full_name=ChromeMainDelegate [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1) .data.rel.ro.local@2c17728(size_without_padding=24,padding=0,full_name=chrome::mojom::FieldTrialRecorder [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1) -.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) .data.rel.ro.local@2cd84e0(size_without_padding=16,padding=16,full_name=.Lswitch.table.45,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o,source_path=,flags={},num_aliases=1) .data.rel.ro.local@2cd84f0(size_without_padding=8,padding=0,full_name=kSystemClassPrefixes,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o,source_path=,flags={anon},num_aliases=1) .other@0(size_without_padding=0,padding=33984171,full_name=Overhead: ELF file,object_path=,source_path=,flags={},num_aliases=1) @@ -63,9 +63,9 @@ .rodata@284e364(size_without_padding=0,padding=3,full_name=** symbol gap 0,object_path=,source_path=,flags={},num_aliases=1) .rodata@284e364(size_without_padding=8,padding=0,full_name=,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) .rodata@284e370(size_without_padding=40,padding=4,full_name=Name,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1) -.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) -.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) -.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) +.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) +.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1) .rodata@2c158e4(size_without_padding=0,padding=3286112,full_name=** symbol gap 1 (end of section),object_path=,source_path=,flags={},num_aliases=1) .text@28d900(size_without_padding=16,padding=0,full_name=_GLOBAL__sub_I_page_allocator.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1) .text@28d910(size_without_padding=56,padding=0,full_name=_GLOBAL__sub_I_bbr_sender.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1) @@ -80,11 +80,11 @@ .text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=,source_path=,flags={},num_aliases=2) .text@2a0010(size_without_padding=12,padding=0,full_name=BarAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4) .text@2a0010(size_without_padding=12,padding=0,full_name=FooAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4) -.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4) .text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen,clone},num_aliases=4) -.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) +.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4) +.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) .text@2a1000(size_without_padding=0,padding=4040,full_name=** symbol gap 1,object_path=,source_path=,flags={},num_aliases=1) -.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1) +.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1) .text@24ca628(size_without_padding=0,padding=35821002,full_name=** symbol gap 2 (end of section),object_path=,source_path=,flags={},num_aliases=1) .bss@0(size_without_padding=262144,padding=0,full_name=ff_cos_131072,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=1) .bss@0(size_without_padding=131072,padding=0,full_name=ff_cos_131072_fixed,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o,source_path=third_party/fft_fixed.cc,flags={},num_aliases=1)
diff --git a/tools/binary_size/libsupersize/testdata/Console.golden b/tools/binary_size/libsupersize/testdata/Console.golden index 98834174..621ef5d7 100644 --- a/tools/binary_size/libsupersize/testdata/Console.golden +++ b/tools/binary_size/libsupersize/testdata/Console.golden
@@ -170,9 +170,9 @@ BarAlias (num_aliases=4) 39) 77769423 (100.0%) t@0x2a0010 3 (size=12) third_party/fft_float.cc FooAlias (num_aliases=4) -40) 77769426 (100.0%) t@0x2a0010 3 (size=12) third_party/paint.cc +40) 77769426 (100.0%) t@0x2a0010 3 (size=12) $root_gen_dir/third_party/icu/ucnv_ext.c blink::ContiguousContainerBase::shrinkToFit (num_aliases=4) -41) 77769429 (100.0%) t@0x2a0010 3 (size=12) $root_gen_dir/third_party/icu/ucnv_ext.c +41) 77769429 (100.0%) t@0x2a0010 3 (size=12) third_party/paint.cc blink::ContiguousContainerBase::shrinkToFit (num_aliases=4) 42) 77769457 (100.0%) t@0x2a0020 28 third_party/container.c blink::ContiguousContainerBase::ContiguousContainerBase
diff --git a/tools/binary_size/libsupersize/testdata/Diff_Basic.golden b/tools/binary_size/libsupersize/testdata/Diff_Basic.golden index fec9c5f..ac1ebe7 100644 --- a/tools/binary_size/libsupersize/testdata/Diff_Basic.golden +++ b/tools/binary_size/libsupersize/testdata/Diff_Basic.golden
@@ -55,5 +55,5 @@ Index | Running Total | Section@Address | ... ------------------------------------------------------------ ~ 0) 10 (100.0%) d@0x2de70a0 +10 (-6->4) num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={} name=base::android::g_renderer_histogram_code
diff --git a/tools/binary_size/libsupersize/testdata/FullDescription.golden b/tools/binary_size/libsupersize/testdata/FullDescription.golden index 0d9c3427..5bef11d 100644 --- a/tools/binary_size/libsupersize/testdata/FullDescription.golden +++ b/tools/binary_size/libsupersize/testdata/FullDescription.golden
@@ -86,22 +86,22 @@ source_path=base/page_allocator.cc object_path=base/base/page_allocator.o flags={} name=google::protobuf::internal::pLinuxKernelCmpxchg 1) 8 (0.0%) d@0x2de7004 pss=4 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={} name=google::protobuf::internal::pLinuxKernelMemoryBarrier 2) 160 (0.0%) d@0x2de7008 pss=152 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={rel} name=base::android::kBaseRegisteredMethods 3) 164 (0.0%) d@0x2de70a0 pss=4 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={anon} name=base::android::g_renderer_histogram_code 4) 168 (0.0%) d@0x2de70a4 pss=4 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={anon,rel.loc} name=base::android::g_library_version_number 5) 101768 (0.1%) d@0x2dffd88 pss=101600 padding=101600 num_aliases=1 source_path= object_path= flags={} name=** symbol gap 0 (end of section) 6) 101824 (0.1%) R@0x2cd8500 pss=56 padding=0 num_aliases=1 - source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o + source_path=third_party/paint.cc object_path=third_party/sub/PaintChunker.o flags={} name=ChromeMainDelegateAndroid [vtable] 7) 101848 (0.1%) R@0x2cd8538 pss=24 padding=0 num_aliases=1 source_path=base/page_allocator.cc object_path=base/base/page_allocator.o @@ -119,7 +119,7 @@ source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o flags={gen} name=chrome::mojom::FieldTrialRecorder [vtable] 12) 1956976 (2.5%) R@0x2c17740 pss=789904 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={} name=chrome::mojom::FieldTrialRecorderProxy [vtable] 13) 1957008 (2.5%) R@0x2cd84e0 pss=32 padding=16 num_aliases=1 source_path= object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o @@ -154,13 +154,13 @@ source_path=base/page_allocator.cc object_path=base/base/page_allocator.o flags={} name=Name 24) 37906683 (48.7%) r@0x284e398 pss=32 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={} name=chrome::mojom::FilePatcher::Name_ 25) 38582723 (49.6%) r@0x28f3450 pss=676040 padding=675992 num_aliases=1 - source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o + source_path=third_party/paint.cc object_path=third_party/sub/PaintChunker.o flags={anon} name=kAnimationFrameTimeHistogramClassPath 26) 38582727 (49.6%) r@0x28f3480 pss=4 padding=0 num_aliases=1 - source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o + source_path=third_party/paint.cc object_path=third_party/sub/PaintChunker.o flags={anon} name=blink::CSSValueKeywordsHash::findValueImpl::value_word_list full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list 27) 41868839 (53.8%) r@0x2c158e4 pss=3286112 padding=3286112 num_aliases=1 @@ -213,22 +213,22 @@ flags={} name=FooAlias full_name=FooAlias() 41) 41944384 (53.9%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4 - source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o - flags={clone} name=blink::ContiguousContainerBase::shrinkToFit - full_name=blink::ContiguousContainerBase::shrinkToFit() -42) 41944387 (53.9%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4 source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o flags={gen,clone} name=blink::ContiguousContainerBase::shrinkToFit full_name=blink::ContiguousContainerBase::shrinkToFit() +42) 41944387 (53.9%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4 + source_path=third_party/paint.cc object_path=third_party/sub/PaintChunker.o + flags={clone} name=blink::ContiguousContainerBase::shrinkToFit + full_name=blink::ContiguousContainerBase::shrinkToFit() 43) 41944415 (53.9%) t@0x2a0020 pss=28 padding=4 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={} name=blink::ContiguousContainerBase::ContiguousContainerBase full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&) 44) 41948455 (53.9%) t@0x2a1000 pss=4040 padding=4040 num_aliases=1 source_path= object_path= flags={} name=** symbol gap 1 45) 41948549 (53.9%) t@0x2a1000 pss=94 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={anon,clone} name=blink::PaintChunker::releasePaintChunks full_name=blink::PaintChunker::releasePaintChunks() 46) 77769551 (100.0%) t@0x24ca628 pss=35821002 padding=35821002 num_aliases=1 @@ -268,22 +268,22 @@ source_path=base/page_allocator.cc object_path=base/base/page_allocator.o flags={} name=google::protobuf::internal::pLinuxKernelCmpxchg 1) 8 (0.0%) d@0x2de7004 pss=4 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={} name=google::protobuf::internal::pLinuxKernelMemoryBarrier 2) 160 (0.0%) d@0x2de7008 pss=152 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={rel} name=base::android::kBaseRegisteredMethods 3) 164 (0.0%) d@0x2de70a0 pss=4 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={anon} name=base::android::g_renderer_histogram_code 4) 168 (0.0%) d@0x2de70a4 pss=4 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={anon,rel.loc} name=base::android::g_library_version_number 5) 101768 (0.1%) d@0x2dffd88 pss=101600 padding=101600 num_aliases=1 source_path= object_path= flags={} name=** symbol gap 0 (end of section) 6) 101824 (0.1%) R@0x2cd8500 pss=56 padding=0 num_aliases=1 - source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o + source_path=third_party/paint.cc object_path=third_party/sub/PaintChunker.o flags={} name=ChromeMainDelegateAndroid [vtable] 7) 101848 (0.1%) R@0x2cd8538 pss=24 padding=0 num_aliases=1 source_path=base/page_allocator.cc object_path=base/base/page_allocator.o @@ -301,7 +301,7 @@ source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o flags={gen} name=chrome::mojom::FieldTrialRecorder [vtable] 12) 1956976 (2.5%) R@0x2c17740 pss=789904 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={} name=chrome::mojom::FieldTrialRecorderProxy [vtable] 13) 1957008 (2.5%) R@0x2cd84e0 pss=32 padding=16 num_aliases=1 source_path= object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o @@ -342,13 +342,13 @@ source_path=base/page_allocator.cc object_path=base/base/page_allocator.o flags={} name=Name 24) 41192795 (53.0%) r@0x284e398 pss=32 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={} name=chrome::mojom::FilePatcher::Name_ 25) 41868835 (53.8%) r@0x28f3450 pss=676040 padding=675992 num_aliases=1 - source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o + source_path=third_party/paint.cc object_path=third_party/sub/PaintChunker.o flags={anon} name=kAnimationFrameTimeHistogramClassPath 26) 41868839 (53.8%) r@0x28f3480 pss=4 padding=0 num_aliases=1 - source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o + source_path=third_party/paint.cc object_path=third_party/sub/PaintChunker.o flags={anon} name=blink::CSSValueKeywordsHash::findValueImpl::value_word_list full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list 27) 41868855 (53.8%) t@0x28d900 pss=16 padding=0 num_aliases=1 @@ -407,19 +407,19 @@ flags={} name=FooAlias full_name=FooAlias() 40) 77769426 (100.0%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4 - source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o - flags={clone} name=blink::ContiguousContainerBase::shrinkToFit - full_name=blink::ContiguousContainerBase::shrinkToFit() -41) 77769429 (100.0%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4 source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o flags={gen,clone} name=blink::ContiguousContainerBase::shrinkToFit full_name=blink::ContiguousContainerBase::shrinkToFit() +41) 77769429 (100.0%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4 + source_path=third_party/paint.cc object_path=third_party/sub/PaintChunker.o + flags={clone} name=blink::ContiguousContainerBase::shrinkToFit + full_name=blink::ContiguousContainerBase::shrinkToFit() 42) 77769457 (100.0%) t@0x2a0020 pss=28 padding=4 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={} name=blink::ContiguousContainerBase::ContiguousContainerBase full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&) 43) 77769551 (100.0%) t@0x2a1000 pss=94 padding=0 num_aliases=1 - source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o + source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o flags={anon,clone} name=blink::PaintChunker::releasePaintChunks full_name=blink::PaintChunker::releasePaintChunks() 44) 77769551 (100.0%) b@0x0 pss=262144 padding=0 num_aliases=1
diff --git a/tools/binary_size/libsupersize/testdata/mock_output_directory/obj/third_party/WebKit.a b/tools/binary_size/libsupersize/testdata/mock_output_directory/obj/third_party/WebKit.a new file mode 100644 index 0000000..82183abe --- /dev/null +++ b/tools/binary_size/libsupersize/testdata/mock_output_directory/obj/third_party/WebKit.a
@@ -0,0 +1,8 @@ +!<thin> +/ 0 0 0 0 60 ` +For convenience, each line of this string table is 60 bytes +// 0 0 0 0 120 ` + sub/PaintChunker.o/ + sub/ContiguousContainer.o/ +/40 0 0 0 644 281516 ` +/93 0 0 0 644 281516 `
diff --git a/tools/binary_size/libsupersize/testdata/mock_output_directory/obj/third_party/ffmpeg/libffmpeg_internal.a b/tools/binary_size/libsupersize/testdata/mock_output_directory/obj/third_party/ffmpeg/libffmpeg_internal.a new file mode 100644 index 0000000..52881b6 --- /dev/null +++ b/tools/binary_size/libsupersize/testdata/mock_output_directory/obj/third_party/ffmpeg/libffmpeg_internal.a
@@ -0,0 +1,3 @@ +This file has to exist so that it can be checked for whether or not it is a +thin archive. Thin archives start with "!<thin>\n". As you can see, this file is +not a thin archive.
diff --git a/tools/binary_size/libsupersize/testdata/mock_toolchain/mock_nm.py b/tools/binary_size/libsupersize/testdata/mock_toolchain/mock_nm.py index 6b805b1..c2b63be7 100644 --- a/tools/binary_size/libsupersize/testdata/mock_toolchain/mock_nm.py +++ b/tools/binary_size/libsupersize/testdata/mock_toolchain/mock_nm.py
@@ -38,16 +38,14 @@ ' int, unsigned short const*, int, unsigned int*, signed char, signed ' 'char)'), ], - 'obj/third_party/WebKit.a': [ - '', - 'PaintChunker.o:', + 'obj/third_party/sub/PaintChunker.o': [ '01010101 t ' + _SHRINK_TO_FIT, '010101 t (anonymous namespace)::kAnimationFrameTimeHistogramClassPath', '010101 r vtable for ChromeMainDelegateAndroid', ('01010101 r blink::(anonymous namespace)::CSSValueKeywordsHash::findVa' 'lueImpl(char const*, unsigned int)::value_word_list'), - '', - 'ContiguousContainer.o:', + ], + 'obj/third_party/sub/ContiguousContainer.o': [ '01010101 d chrome::mojom::FilePatcher::Name_', '01010101 r vtable for chrome::mojom::FieldTrialRecorderProxy', '01010101 r google::protobuf::internal::pLinuxKernelMemoryBarrier',
diff --git a/tools/binary_size/libsupersize/testdata/test.map b/tools/binary_size/libsupersize/testdata/test.map index a855747..c8562088 100644 --- a/tools/binary_size/libsupersize/testdata/test.map +++ b/tools/binary_size/libsupersize/testdata/test.map
@@ -90,17 +90,17 @@ .text.unlikely.foo_bar 0x0028f1e0 0x10e00 ./obj/third_party/icu/../icu/icuuc/ucnv_ext.o .text._ZN5blink23ContiguousContainerBase11shrinkToFitEv - 0x002a0000 0x10 obj/third_party/WebKit.a(PaintChunker.o) + 0x002a0000 0x10 obj/third_party/WebKit.a(sub/PaintChunker.o) 0x002a0001 blink::ContiguousContainerBase::shrinkToFit() .text.hot._ZN5blink23ContiguousContainerBase11shrinkToFitEv2.part.1234.isra.2 - 0x002a0010 0xc obj/third_party/WebKit.a(PaintChunker.o) + 0x002a0010 0xc obj/third_party/WebKit.a(sub/PaintChunker.o) 0x002a0011 blink::ContiguousContainerBase::shrinkToFit() .text._ZN5blink23ContiguousContainerBaseC2EOS0_ - 0xffffffffffffffff 0x18 obj/third_party/WebKit.a(ContiguousContainer.o) + 0xffffffffffffffff 0x18 obj/third_party/WebKit.a(sub/ContiguousContainer.o) 0x002a0021 blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&) 0x002a0021 blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&) .text._ZN10_GLOBAL__N5blink12PaintChunker18releasePaintChunksEv.part.1 - 0x002a1000 0x5e obj/third_party/WebKit.a(ContiguousContainer.o) + 0x002a1000 0x5e obj/third_party/WebKit.a(sub/ContiguousContainer.o) 0x002a1001 (anonymous namespace)::blink::PaintChunker::releasePaintChunks() [clone .part.1] .ARM.exidx 0x024ca628 0x1771c8 @@ -123,12 +123,12 @@ 0x0284e370 0x28 obj/base/base/page_allocator.o 0x0284e370 Name .rodata._ZN6chrome5mojom11FilePatcher5Name_E - 0x0284e398 0x20 obj/third_party/WebKit.a(ContiguousContainer.o) + 0x0284e398 0x20 obj/third_party/WebKit.a(sub/ContiguousContainer.o) 0x0284e398 chrome::mojom::FilePatcher::Name_ .rodata._ZN12_GLOBAL__N_1L37kAnimationFrameTimeHistogramClassPathE - 0x028f3450 0x30 obj/third_party/WebKit.a(PaintChunker.o) + 0x028f3450 0x30 obj/third_party/WebKit.a(sub/PaintChunker.o) .rodata._ZZN10_GLOBAL__N5blink20CSSValueKeywordsHash13findValueImplEPKcjE15value_word_list - 0x028f3480 0x4 obj/third_party/WebKit.a(PaintChunker.o) + 0x028f3480 0x4 obj/third_party/WebKit.a(sub/PaintChunker.o) 0x028f3480 blink::(anonymous namespace)::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list .data.rel.ro.local @@ -140,7 +140,7 @@ 0x02c17728 0x18 ./obj/third_party/icu/../icu/icuuc/ucnv_ext.o 0x02c17728 vtable for chrome::mojom::FieldTrialRecorder .data.rel.ro.local._ZTVN6chrome5mojom23FieldTrialRecorderProxyE - 0x02c17740 0xc0d90 obj/third_party/WebKit.a(ContiguousContainer.o) + 0x02c17740 0xc0d90 obj/third_party/WebKit.a(sub/ContiguousContainer.o) 0x02c17740 vtable for chrome::mojom::FieldTrialRecorderProxy .data.rel.ro.local..Lswitch.table.45 0x02cd84e0 0x10 ../../third_party/gvr-android-sdk/libgvr_shim_static_arm.a(libcontroller_api_impl.a_controller_api_impl.o) @@ -149,7 +149,7 @@ .data.rel.ro 0x02cd8500 0x104108 .data.rel.ro._ZTV25ChromeMainDelegateAndroid - 0x02cd8500 0x38 obj/third_party/WebKit.a(PaintChunker.o) + 0x02cd8500 0x38 obj/third_party/WebKit.a(sub/PaintChunker.o) 0x02cd8500 vtable for ChromeMainDelegateAndroid .data.rel.ro._ZTVN4mojo15MessageReceiverE 0x02cd8538 0x18 obj/base/base/page_allocator.o @@ -179,14 +179,14 @@ 0x02de7000 0x4 obj/base/base/page_allocator.o 0x02de7000 google::protobuf::internal::pLinuxKernelCmpxchg .data._ZN6google8protobuf8internal25pLinuxKernelMemoryBarrierE - 0x02de7004 0x4 obj/third_party/WebKit.a(ContiguousContainer.o) + 0x02de7004 0x4 obj/third_party/WebKit.a(sub/ContiguousContainer.o) 0x02de7004 google::protobuf::internal::pLinuxKernelMemoryBarrier .data.rel._ZN4base7androidL22kBaseRegisteredMethodsE - 0x02de7008 0x98 obj/third_party/WebKit.a(ContiguousContainer.o) + 0x02de7008 0x98 obj/third_party/WebKit.a(sub/ContiguousContainer.o) .data._ZN4base7android12_GLOBAL__N_125g_renderer_histogram_codeE - 0x02de70a0 0x4 obj/third_party/WebKit.a(ContiguousContainer.o) + 0x02de70a0 0x4 obj/third_party/WebKit.a(sub/ContiguousContainer.o) .data.rel.local._ZN4base7android12_GLOBAL__N_124g_library_version_numberE - 0x02de70a4 0x4 obj/third_party/WebKit.a(ContiguousContainer.o) + 0x02de70a4 0x4 obj/third_party/WebKit.a(sub/ContiguousContainer.o) .bss 0x02dffda0 0x13d7e8 .bss.g_chrome_content_browser_client
diff --git a/tools/binary_size/libsupersize/third_party/gvr-android-sdk/libgvr_shim_static_arm.a b/tools/binary_size/libsupersize/third_party/gvr-android-sdk/libgvr_shim_static_arm.a new file mode 100644 index 0000000..52881b6 --- /dev/null +++ b/tools/binary_size/libsupersize/third_party/gvr-android-sdk/libgvr_shim_static_arm.a
@@ -0,0 +1,3 @@ +This file has to exist so that it can be checked for whether or not it is a +thin archive. Thin archives start with "!<thin>\n". As you can see, this file is +not a thin archive.
diff --git a/tools/gn/xcode_writer.cc b/tools/gn/xcode_writer.cc index f5dd65aa..37c23e2 100644 --- a/tools/gn/xcode_writer.cc +++ b/tools/gn/xcode_writer.cc
@@ -48,9 +48,13 @@ }; SafeEnvironmentVariableInfo kSafeEnvironmentVariables[] = { - {"HOME", true}, {"LANG", true}, {"PATH", true}, - {"USER", true}, {"TMPDIR", false}, -}; + {"HOME", true}, + {"LANG", true}, + {"PATH", true}, + {"USER", true}, + {"TMPDIR", false}, + {"ICECC_VERSION", true}, + {"ICECC_CLANG_REMOTE_CPP", true}}; XcodeWriter::TargetOsType GetTargetOs(const Args& args) { const Value* target_os_value = args.GetArgOverride(variables::kTargetOs);
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 40f0458..484ef49 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -18270,6 +18270,7 @@ <int value="2415" label="XRRequestSession"/> <int value="2416" label="XRSupportsSession"/> <int value="2417" label="XRSessionGetInputSources"/> + <int value="2418" label="CSSResizeAuto"/> </enum> <enum name="FeedbackSource"> @@ -35139,6 +35140,11 @@ <int value="5" label="Generated password submission would have failed"/> </enum> +<enum name="PasswordSuggestionType"> + <int value="0" label="Credential"/> + <int value="1" label="Show All"/> +</enum> + <enum name="PasswordSyncState"> <int value="0" label="Syncing OK"/> <int value="1" label="Read failed"/> @@ -38372,6 +38378,7 @@ <int value="31" label="InternalIPC"/> <int value="32" label="InternalUserInteraction"/> <int value="33" label="InternalInspector"/> + <int value="34" label="InternalAnimation"/> </enum> <enum name="RendererSchedulerTaskUseCase"> @@ -46287,6 +46294,8 @@ <int value="10" label="Autofill was disabled in VR"/> <int value="11" label="USB chooser dialog was suppressed in VR"/> <int value="12" label="SSL client certificate selector was suppressed in VR"/> + <int value="13" + label="Media router presentation request dialog was suppressed in VR"/> </enum> <enum name="VRUnsupportedMode">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 1cc7ba68..e3e52d6 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -35273,6 +35273,17 @@ </summary> </histogram> +<histogram name="Media.Audio.Render.InputDeviceStreamCreationTime" units="ms"> + <owner>jonasolsson@chromium.org</owner> + <owner>maxmorin@chromium.org</owner> + <owner>olka@chromium.org</owner> + <summary> + The time delta between the moment a MojoAudioInputIPC instance on the + renderer process requests a new stream from the browser to the moment it + receives a response. + </summary> +</histogram> + <histogram name="Media.Audio.Render.LargestGlitchMs" units="ms"> <owner>tommi@chromium.org</owner> <summary> @@ -35323,6 +35334,17 @@ </summary> </histogram> +<histogram name="Media.Audio.Render.OutputDeviceStreamCreationTime" units="ms"> + <owner>jonasolsson@chromium.org</owner> + <owner>maxmorin@chromium.org</owner> + <owner>olka@chromium.org</owner> + <summary> + The time delta between the moment a MojoAudioInputIPC instance on the + renderer process requests a new stream from the browser to the moment it + receives a response. + </summary> +</histogram> + <histogram name="Media.Audio.Render.OutputStreamDuration" units="ms"> <owner>maxmorin@chromium.org</owner> <summary> @@ -63446,6 +63468,14 @@ </summary> </histogram> +<histogram name="PasswordManager.InaccessiblePasswords" units="saved passwords"> + <owner>vasilii@chromium.org</owner> + <summary> + The number of saved passwords in the store that could not be decrypted. + Recorded once for the profile on startup. + </summary> +</histogram> + <histogram name="PasswordManager.InfoBarResponse" enum="InfoBarResponse"> <obsolete> Deprecated as of 03/2016. This metric has been replaced by @@ -64034,6 +64064,23 @@ </summary> </histogram> +<histogram name="PasswordManager.SuggestionClicked" + enum="PasswordSuggestionType"> + <owner>vasilii@chromium.org</owner> + <summary> + The type of password suggestion on iOS displayed in the keyboard accessory. + Recorded for each tap on the suggestion. + </summary> +</histogram> + +<histogram name="PasswordManager.SuggestionShown" enum="PasswordSuggestionType"> + <owner>vasilii@chromium.org</owner> + <summary> + The type of password suggestions on iOS displayed in the keyboard accessory. + Recorded each time the password suggestion is shown. + </summary> +</histogram> + <histogram name="PasswordManager.SuppressedAccount" enum="PasswordManagerSuppressedAccountCrossActionsTaken"> <owner>engedy@chromium.org</owner> @@ -98599,6 +98646,20 @@ <summary>Time spent in mark-sweep phase of GC.</summary> </histogram> +<histogram name="V8.GCCompactorBackground" units="ms"> + <owner>hpayer@chromium.org</owner> + <summary> + Time spent in mark-sweep phase of GC in a background isolate. + </summary> +</histogram> + +<histogram name="V8.GCCompactorForeground" units="ms"> + <owner>hpayer@chromium.org</owner> + <summary> + Time spent in mark-sweep phase of GC in a foreground isolate. + </summary> +</histogram> + <histogram name="V8.GCContext" units="ms"> <owner>hpayer@chromium.org</owner> <summary>Time spent doing a full GC during an IdleNotification.</summary> @@ -98610,6 +98671,24 @@ <summary>Time spent in finalize incremental mark-sweep phase of GC.</summary> </histogram> +<histogram name="V8.GCFinalizeMCBackground" units="ms"> + <owner>ulan@chromium.org</owner> + <owner>hpayer@chromium.org</owner> + <summary> + Time spent in finalize incremental mark-sweep phase of GC in a background + isolate. + </summary> +</histogram> + +<histogram name="V8.GCFinalizeMCForeground" units="ms"> + <owner>ulan@chromium.org</owner> + <owner>hpayer@chromium.org</owner> + <summary> + Time spent in finalize incremental mark-sweep phase of GC in a foreground + isolate. + </summary> +</histogram> + <histogram name="V8.GCFinalizeMCReduceMemory" units="ms"> <owner>ulan@chromium.org</owner> <owner>hpayer@chromium.org</owner> @@ -98618,14 +98697,22 @@ </summary> </histogram> -<histogram name="V8.GCFinalzeMC" units="ms"> - <obsolete> - This histogram has been replaced by V8.GCFinalizeMC because of typo in the - name. - </obsolete> +<histogram name="V8.GCFinalizeMCReduceMemoryBackground" units="ms"> <owner>ulan@chromium.org</owner> <owner>hpayer@chromium.org</owner> - <summary>Time spent in finalize incremental mark-sweep phase of GC.</summary> + <summary> + Time spent in finalize incremental memory-reducing mark-sweep phase of GC in + a background isolate. + </summary> +</histogram> + +<histogram name="V8.GCFinalizeMCReduceMemoryForeground" units="ms"> + <owner>ulan@chromium.org</owner> + <owner>hpayer@chromium.org</owner> + <summary> + Time spent in finalize incremental memory-reducing mark-sweep phase of GC in + a foreground isolate. + </summary> </histogram> <histogram name="V8.GCIdleNotification" units="ms"> @@ -98704,11 +98791,25 @@ <summary>Time spent in scavenging phase of GC.</summary> </histogram> +<histogram name="V8.GCScavengerBackground" units="ms"> + <owner>hpayer@chromium.org</owner> + <summary> + Time spent in scavenging phase of GC in a background isolate. + </summary> +</histogram> + <histogram name="V8.GCScavengeReason" enum="GarbageCollectionReason"> <owner>ulan@chromium.org</owner> <summary>Reason a scavenge garbage collection was started in V8.</summary> </histogram> +<histogram name="V8.GCScavengerForeground" units="ms"> + <owner>hpayer@chromium.org</owner> + <summary> + Time spent in scavenging phase of GC in a foreground isolate. + </summary> +</histogram> + <histogram name="V8.GCYoungGenerationHandling" enum="YoungGenerationHandling"> <owner>mlippautz@chromium.org</owner> <summary>
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py index 7c8e993..682b856a 100755 --- a/tools/perf/core/perf_data_generator.py +++ b/tools/perf/core/perf_data_generator.py
@@ -572,6 +572,7 @@ 'blink_perf.parser', 'blink_perf.shadow_dom', 'blink_perf.svg', + 'memory.top_10_mobile' ] @@ -896,6 +897,8 @@ def update_all_tests(waterfall, file_path): tests = generate_all_tests(waterfall) + # Add in the migrated testers for the new recipe. + get_new_recipe_testers(NEW_PERF_RECIPE_MIGRATED_TESTERS, tests) with open(file_path, 'w') as fp: json.dump(tests, fp, indent=2, separators=(',', ': '), sort_keys=True) fp.write('\n') @@ -983,6 +986,11 @@ for s in scripts: name = s['name'] name = re.sub('\\.reference$', '', name) + # TODO(eyaich): Determine new way to generate ownership based + # on the benchmark bot map instead of on the generated tests + # for new perf recipe. + if name is 'performance_test_suite': + continue test_names.add(name) # Disabled tests are filtered out of the waterfall json. Add them back here. @@ -1107,33 +1115,6 @@ 'swarm79-c7' ], }, - 'Mac 10.12 Laptop Low End': { - 'tests': [ - { - 'isolate': 'performance_test_suite', - }, - { - 'isolate': 'load_library_perf_tests', - 'shards': [0], - 'telemetry': False, - } - ], - 'platform': 'mac', - 'dimension': { - 'pool': 'Chrome-perf-fyi', - 'os': 'Mac-10.12', - 'gpu': '8086:1626' - }, - 'device_ids': [ - 'build195-a9', 'build196-a9', 'build197-a9', 'build198-a9', - 'build199-a9', 'build200-a9', 'build201-a9', 'build202-a9', - 'build203-a9', 'build204-a9', 'build205-a9', 'build206-a9', - 'build207-a9', 'build208-a9', 'build209-a9', 'build210-a9', - 'build211-a9', 'build212-a9', 'build213-a9', 'build214-a9', - 'build215-a9', 'build216-a9', 'build217-a9', 'build218-a9', - 'build219-a9', 'build220-a9' - ], - }, 'Android Go': { 'tests': [ { @@ -1158,6 +1139,37 @@ } +NEW_PERF_RECIPE_MIGRATED_TESTERS = { + 'testers' : { + 'Mac 10.12 Laptop Low End': { + 'tests': [ + { + 'isolate': 'performance_test_suite', + }, + { + 'isolate': 'load_library_perf_tests', + 'shards': [0], + 'telemetry': False, + } + ], + 'platform': 'mac', + 'dimension': { + 'pool': 'chrome.tests.perf', + 'os': 'Mac-10.12', + 'gpu': '8086:1626' + }, + 'device_ids': [ + 'build41-a7', 'build42-a7', 'build43-a7', 'build44-a7', + 'build45-a7', 'build46-a7', 'build47-a7', 'build48-a7', + 'build49-a7', 'build50-a7', 'build51-a7', 'build52-a7', + 'build53-a7', 'build54-a7', 'build55-a7', 'build56-a7', + 'build57-a7', 'build58-a7', 'build59-a7', 'build60-a7', + 'build61-a7', 'build62-a7', 'build63-a7', 'build64-a7', + 'build65-a7', 'build66-a7' + ], + } + } +} def add_common_test_properties(test_entry, tester_config, test_spec): dimensions = [] index = 0 @@ -1274,7 +1286,7 @@ return result -def load_and_update_new_recipe_json(): +def load_and_update_new_recipe_fyi_json(): tests = {} filename = 'chromium.perf.fyi.json' buildbot_dir = os.path.join( @@ -1285,18 +1297,21 @@ with open(fyi_filepath, 'w') as fp: # We have loaded what is there, we want to update or add # what we have listed here - testers = NEW_PERF_RECIPE_FYI_TESTERS - for tester, tester_config in testers['testers'].iteritems(): - isolated_scripts = [] - for test in tester_config['tests']: - isolated_scripts.append(generate_performance_test(tester_config, test)) - tests[tester] = { - 'isolated_scripts': sorted(isolated_scripts, key=lambda x: x['name']) - } + get_new_recipe_testers(NEW_PERF_RECIPE_FYI_TESTERS, tests) json.dump(tests, fp, indent=2, separators=(',', ': '), sort_keys=True) fp.write('\n') +def get_new_recipe_testers(testers, tests): + for tester, tester_config in testers['testers'].iteritems(): + isolated_scripts = [] + for test in tester_config['tests']: + isolated_scripts.append(generate_performance_test(tester_config, test)) + tests[tester] = { + 'isolated_scripts': sorted(isolated_scripts, key=lambda x: x['name']) + } + + def main(args): parser = argparse.ArgumentParser( description=('Generate perf test\' json config and benchmark.csv. ' @@ -1326,7 +1341,7 @@ 'configs and benchmark.csv.') % sys.argv[0] return 1 else: - load_and_update_new_recipe_json() + load_and_update_new_recipe_fyi_json() update_all_tests(get_waterfall_config(), waterfall_file) update_benchmark_csv(benchmark_file) return 0
diff --git a/tools/perf/core/upload_results_to_perf_dashboard.py b/tools/perf/core/upload_results_to_perf_dashboard.py index fc99001c..ae826a9 100755 --- a/tools/perf/core/upload_results_to_perf_dashboard.py +++ b/tools/perf/core/upload_results_to_perf_dashboard.py
@@ -32,7 +32,7 @@ def _GetDashboardJson(options): main_revision = _GetMainRevision(options.got_revision_cp) revisions = _GetPerfDashboardRevisionsWithProperties( - options.got_webrtc_revision, options.got_v8_revision, options.version, + options.got_webrtc_revision, options.got_v8_revision, options.git_revision, main_revision) reference_build = 'reference' in options.name stripped_test_name = options.name.replace('.reference', '') @@ -93,7 +93,6 @@ parser.add_option('--buildnumber') parser.add_option('--got-webrtc-revision') parser.add_option('--got-v8-revision') - parser.add_option('--version') parser.add_option('--git-revision') parser.add_option('--output-json-dashboard-url') parser.add_option('--send-as-histograms', action='store_true') @@ -173,7 +172,7 @@ def _GetPerfDashboardRevisionsWithProperties( - got_webrtc_revision, got_v8_revision, version, git_revision, main_revision, + got_webrtc_revision, got_v8_revision, git_revision, main_revision, point_id=None): """Fills in the same revisions fields that process_log_utils does.""" @@ -181,7 +180,6 @@ versions['rev'] = main_revision versions['webrtc_git'] = got_webrtc_revision versions['v8_rev'] = got_v8_revision - versions['ver'] = version versions['git_revision'] = git_revision versions['point_id'] = point_id # There are a lot of "bad" revisions to check for, so clean them all up here.
diff --git a/tools/perf/process_perf_results.py b/tools/perf/process_perf_results.py index 379c73bc..e78d5c6 100755 --- a/tools/perf/process_perf_results.py +++ b/tools/perf/process_perf_results.py
@@ -9,6 +9,7 @@ import shutil import sys import tempfile +import uuid from core import oauth_api from core import path_util @@ -67,6 +68,7 @@ '--configuration-name', configuration_name, '--results-file', json_to_upload, '--results-url', RESULTS_URL, + '--git-revision', build_properties['git_revision'], '--got-revision-cp', build_properties['got_revision_cp'], '--got-v8-revision', build_properties['got_v8_revision'], '--got-webrtc-revision', build_properties['got_webrtc_revision'], @@ -184,14 +186,15 @@ oauth_file, tmpfile_dir, logdog_dict, is_ref) upload_failure = upload_failure or upload_fail - logdog_file_name = 'Results_Dashboard' + logdog_label = 'Results Dashboard' + logdog_file_name = 'Results_Dashboard_' + str(uuid.uuid4()) if upload_failure: - logdog_file_name += '_Upload_Failure' + logdog_label += ' Upload Failure' _merge_json_output(output_json, test_results_list, logdog_helper.text(logdog_file_name, json.dumps(logdog_dict, sort_keys=True, indent=4, separators=(',', ':'))), - logdog_file_name.replace('_', ' ')) + logdog_label) finally: shutil.rmtree(tmpfile_dir) return upload_failure
diff --git a/tools/roll_angle.py b/tools/roll_angle.py index 8b0e241..59c9e47 100755 --- a/tools/roll_angle.py +++ b/tools/roll_angle.py
@@ -14,7 +14,7 @@ extra_cq_trybots = [ { - "mastername": "master.tryserver.chromium.win", + "mastername": "luci.chromium.try", "buildernames": ["win_optional_gpu_tests_rel"] }, {
diff --git a/tools/roll_swiftshader.py b/tools/roll_swiftshader.py index 022a943..ba0f634 100755 --- a/tools/roll_swiftshader.py +++ b/tools/roll_swiftshader.py
@@ -14,7 +14,7 @@ extra_cq_trybots = [ { - "mastername": "master.tryserver.chromium.win", + "mastername": "luci.chromium.try", "buildernames": ["win_optional_gpu_tests_rel"] }, {
diff --git a/tools/roll_webgl_conformance.py b/tools/roll_webgl_conformance.py index df4b8255..3d58679 100755 --- a/tools/roll_webgl_conformance.py +++ b/tools/roll_webgl_conformance.py
@@ -14,7 +14,7 @@ extra_trybots = [ { - "mastername": "master.tryserver.chromium.win", + "mastername": "luci.chromium.try", "buildernames": ["win_optional_gpu_tests_rel"] }, { @@ -36,7 +36,7 @@ "buildernames": ["linux_angle_rel_ng"] }, { - "mastername": "master.tryserver.chromium.angle", + "mastername": "luci.chromium.try", "buildernames": ["win_angle_rel_ng"] }, ]
diff --git a/ui/gl/PRESUBMIT.py b/ui/gl/PRESUBMIT.py index ede2f4e..290b06c 100644 --- a/ui/gl/PRESUBMIT.py +++ b/ui/gl/PRESUBMIT.py
@@ -25,7 +25,7 @@ [ 'luci.chromium.try:linux_optional_gpu_tests_rel', 'luci.chromium.try:mac_optional_gpu_tests_rel', - 'master.tryserver.chromium.win:win_optional_gpu_tests_rel', + 'luci.chromium.try:win_optional_gpu_tests_rel', 'luci.chromium.try:android_optional_gpu_tests_rel', ], 'Automatically added optional GPU tests to run on CQ.')
diff --git a/ui/resources/default_100_percent/common/emoji_menu_item.png b/ui/resources/default_100_percent/common/emoji_menu_item.png new file mode 100644 index 0000000..a5750ab --- /dev/null +++ b/ui/resources/default_100_percent/common/emoji_menu_item.png Binary files differ
diff --git a/ui/resources/default_200_percent/common/emoji_menu_item.png b/ui/resources/default_200_percent/common/emoji_menu_item.png new file mode 100644 index 0000000..f490a52 --- /dev/null +++ b/ui/resources/default_200_percent/common/emoji_menu_item.png Binary files differ
diff --git a/ui/resources/default_300_percent/common/emoji_menu_item.png b/ui/resources/default_300_percent/common/emoji_menu_item.png new file mode 100644 index 0000000..10851aa5 --- /dev/null +++ b/ui/resources/default_300_percent/common/emoji_menu_item.png Binary files differ
diff --git a/ui/resources/ui_resources.grd b/ui/resources/ui_resources.grd index 10be1c5a..6d38ed3f 100644 --- a/ui/resources/ui_resources.grd +++ b/ui/resources/ui_resources.grd
@@ -108,6 +108,7 @@ <structure type="chrome_scaled_image" name="IDR_EASY_UNLOCK_UNLOCKED" file="common/easy_unlock_unlocked.png" /> <structure type="chrome_scaled_image" name="IDR_EASY_UNLOCK_UNLOCKED_HOVER" file="common/easy_unlock_unlocked_hover.png" /> <structure type="chrome_scaled_image" name="IDR_EASY_UNLOCK_UNLOCKED_PRESSED" file="common/easy_unlock_unlocked_pressed.png" /> + <structure type="chrome_scaled_image" name="IDR_EMOJI_FAVICON" file="common/emoji_menu_item.png" /> <structure type="chrome_scaled_image" name="IDR_FOLDER_CLOSED" file="common/folder_closed.png" /> <structure type="chrome_scaled_image" name="IDR_FOLDER_CLOSED_RTL" file="common/folder_closed_rtl.png" /> <if expr="is_macosx">
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn index ff53097..32f534f 100644 --- a/ui/views/BUILD.gn +++ b/ui/views/BUILD.gn
@@ -120,6 +120,7 @@ "controls/label.h", "controls/link.h", "controls/link_listener.h", + "controls/menu/menu_closure_animation_mac.h", "controls/menu/menu_config.h", "controls/menu/menu_controller.h", "controls/menu/menu_controller_delegate.h", @@ -317,6 +318,7 @@ "controls/label.cc", "controls/link.cc", "controls/menu/display_change_listener_mac.cc", + "controls/menu/menu_closure_animation_mac.mm", "controls/menu/menu_config.cc", "controls/menu/menu_config_chromeos.cc", "controls/menu/menu_config_linux.cc",
diff --git a/ui/views/controls/menu/menu_closure_animation_mac.h b/ui/views/controls/menu/menu_closure_animation_mac.h new file mode 100644 index 0000000..5c3b6d6 --- /dev/null +++ b/ui/views/controls/menu/menu_closure_animation_mac.h
@@ -0,0 +1,74 @@ +// 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 UI_VIEWS_CONTROLS_MENU_MENU_CLOSURE_ANIMATION_MAC_H_ +#define UI_VIEWS_CONTROLS_MENU_MENU_CLOSURE_ANIMATION_MAC_H_ + +#include "base/macros.h" +#include "base/timer/timer.h" +#include "ui/gfx/animation/animation.h" +#include "ui/gfx/animation/animation_delegate.h" +#include "ui/views/views_export.h" + +namespace views { + +class MenuItemView; + +// This class implements the Mac menu closure animation: +// 1) For 100ms, the selected item is drawn as unselected +// 2) Then, for another 100ms, the selected item is drawn as selected +// 3) Then, and the window fades over 250ms to transparency +// Note that this class is owned by the involved MenuController, so if the menu +// is destructed early for any reason, this class will be destructed also, which +// will stop the timer or animation (if they are running), so the callback will +// *not* be run - which is good, since the MenuController that would have +// received it is being deleted. +class VIEWS_EXPORT MenuClosureAnimationMac : public gfx::AnimationDelegate { + public: + // After this closure animation is done, |callback| is run to finally accept + // |item|. + MenuClosureAnimationMac(MenuItemView* item, base::OnceClosure callback); + ~MenuClosureAnimationMac() override; + + // Start the animation. + void Start(); + + // Returns the MenuItemView this animation targets. + MenuItemView* item() { return item_; } + + // Causes animations to take no time for testing purposes. Note that this + // still causes the completion callback to be run asynchronously, so test + // situations have the same control flow as non-test situations. + static void DisableAnimationsForTesting(); + + private: + enum class AnimationStep { + kStart, + kUnselected, + kSelected, + kFading, + kFinish, + }; + + static constexpr AnimationStep NextStepFor(AnimationStep step); + + void AdvanceAnimation(); + + // gfx::AnimationDelegate: + void AnimationProgressed(const gfx::Animation* animation) override; + void AnimationEnded(const gfx::Animation* animation) override; + void AnimationCanceled(const gfx::Animation* animation) override; + + base::OnceClosure callback_; + base::OneShotTimer timer_; + std::unique_ptr<gfx::Animation> fade_animation_; + MenuItemView* item_; + AnimationStep step_; + + DISALLOW_COPY_AND_ASSIGN(MenuClosureAnimationMac); +}; + +} // namespace views + +#endif // UI_VIEWS_CONTROLS_MENU_MENU_CLOSURE_ANIMATION_MAC_H_
diff --git a/ui/views/controls/menu/menu_closure_animation_mac.mm b/ui/views/controls/menu/menu_closure_animation_mac.mm new file mode 100644 index 0000000..2bec6d3 --- /dev/null +++ b/ui/views/controls/menu/menu_closure_animation_mac.mm
@@ -0,0 +1,100 @@ +// 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. + +#include "ui/views/controls/menu/menu_closure_animation_mac.h" + +#import <Cocoa/Cocoa.h> + +#include "base/logging.h" +#include "base/threading/thread_task_runner_handle.h" +#include "ui/gfx/animation/linear_animation.h" +#include "ui/views/controls/menu/menu_item_view.h" +#include "ui/views/widget/widget.h" + +namespace { +static bool g_disable_animations_for_testing = false; +} + +namespace views { + +MenuClosureAnimationMac::MenuClosureAnimationMac(MenuItemView* item, + base::OnceClosure callback) + : callback_(std::move(callback)), + item_(item), + step_(AnimationStep::kStart) {} + +MenuClosureAnimationMac::~MenuClosureAnimationMac() {} + +void MenuClosureAnimationMac::Start() { + DCHECK_EQ(step_, AnimationStep::kStart); + if (g_disable_animations_for_testing) { + // Even when disabling animations, simulate the fact that the eventual + // accept callback will happen after a runloop cycle by skipping to the end + // of the animation. + step_ = AnimationStep::kFading; + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&MenuClosureAnimationMac::AdvanceAnimation, + base::Unretained(this))); + return; + } + AdvanceAnimation(); +} + +// static +constexpr MenuClosureAnimationMac::AnimationStep +MenuClosureAnimationMac::NextStepFor( + MenuClosureAnimationMac::AnimationStep step) { + switch (step) { + case AnimationStep::kStart: + return AnimationStep::kUnselected; + case AnimationStep::kUnselected: + return AnimationStep::kSelected; + case AnimationStep::kSelected: + return AnimationStep::kFading; + case AnimationStep::kFading: + return AnimationStep::kFinish; + case AnimationStep::kFinish: + return AnimationStep::kFinish; + } +} + +void MenuClosureAnimationMac::AdvanceAnimation() { + step_ = NextStepFor(step_); + if (step_ == AnimationStep::kUnselected || + step_ == AnimationStep::kSelected) { + item_->SetForcedVisualSelection(step_ == AnimationStep::kSelected); + timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(80), + base::BindRepeating(&MenuClosureAnimationMac::AdvanceAnimation, + base::Unretained(this))); + } else if (step_ == AnimationStep::kFading) { + auto fade = std::make_unique<gfx::LinearAnimation>(this); + fade->SetDuration(base::TimeDelta::FromMilliseconds(200)); + fade_animation_ = std::move(fade); + fade_animation_->Start(); + } else if (step_ == AnimationStep::kFinish) { + std::move(callback_).Run(); + } +} + +// static +void MenuClosureAnimationMac::DisableAnimationsForTesting() { + g_disable_animations_for_testing = true; +} + +void MenuClosureAnimationMac::AnimationProgressed( + const gfx::Animation* animation) { + NSWindow* window = item_->GetWidget()->GetNativeWindow(); + [window setAlphaValue:animation->CurrentValueBetween(1.0, 0.0)]; +} + +void MenuClosureAnimationMac::AnimationEnded(const gfx::Animation* animation) { + AdvanceAnimation(); +} + +void MenuClosureAnimationMac::AnimationCanceled( + const gfx::Animation* animation) { + NOTREACHED(); +} + +} // namespace views
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc index 9046129..4c71392 100644 --- a/ui/views/controls/menu/menu_controller.cc +++ b/ui/views/controls/menu/menu_controller.cc
@@ -1148,6 +1148,13 @@ menu_selection_hold_time_ms = -1; } +void MenuController::OnMenuItemDestroying(MenuItemView* menu_item) { +#if defined(OS_MACOSX) + if (menu_closure_animation_ && menu_closure_animation_->item() == menu_item) + menu_closure_animation_.reset(); +#endif +} + void MenuController::SetSelection(MenuItemView* menu_item, int selection_types) { size_t paths_differ_at = 0; @@ -1473,6 +1480,18 @@ } void MenuController::Accept(MenuItemView* item, int event_flags) { +#if defined(OS_MACOSX) + menu_closure_animation_ = std::make_unique<MenuClosureAnimationMac>( + item, + base::BindOnce(&MenuController::ReallyAccept, base::Unretained(this), + base::Unretained(item), event_flags)); + menu_closure_animation_->Start(); +#else + ReallyAccept(item, event_flags); +#endif +} + +void MenuController::ReallyAccept(MenuItemView* item, int event_flags) { DCHECK(IsBlockingRun()); result_ = item; if (item && !menu_stack_.empty() && @@ -2747,4 +2766,12 @@ } } +bool MenuController::CanProcessInputEvents() const { +#if defined(OS_MACOSX) + return !menu_closure_animation_; +#else + return true; +#endif +} + } // namespace views
diff --git a/ui/views/controls/menu/menu_controller.h b/ui/views/controls/menu/menu_controller.h index 6aed6735..b208044 100644 --- a/ui/views/controls/menu/menu_controller.h +++ b/ui/views/controls/menu/menu_controller.h
@@ -25,6 +25,10 @@ #include "ui/views/controls/menu/menu_delegate.h" #include "ui/views/widget/widget_observer.h" +#if defined(OS_MACOSX) +#include "ui/views/controls/menu/menu_closure_animation_mac.h" +#endif + namespace ui { class OSExchangeData; } @@ -204,6 +208,13 @@ } bool use_touchable_layout() const { return use_touchable_layout_; } + // Notifies |this| that |menu_item| is being destroyed. + void OnMenuItemDestroying(MenuItemView* menu_item); + + // Returns whether this menu can handle input events right now. This method + // can return false while running animations. + bool CanProcessInputEvents() const; + private: friend class internal::MenuRunnerImpl; friend class test::MenuControllerTest; @@ -344,6 +355,7 @@ // Invoked when the user accepts the selected item. This is only used // when blocking. This schedules the loop to quit. void Accept(MenuItemView* item, int event_flags); + void ReallyAccept(MenuItemView* item, int event_flags); bool ShowSiblingMenu(SubmenuView* source, const gfx::Point& mouse_location); @@ -699,6 +711,10 @@ // A mask of the EventFlags for the mouse buttons currently pressed. int current_mouse_pressed_state_ = 0; +#if defined(OS_MACOSX) + std::unique_ptr<MenuClosureAnimationMac> menu_closure_animation_; +#endif + #if defined(USE_AURA) std::unique_ptr<MenuPreTargetHandler> menu_pre_target_handler_; #endif
diff --git a/ui/views/controls/menu/menu_controller_unittest.cc b/ui/views/controls/menu/menu_controller_unittest.cc index d8629d3..22fa833 100644 --- a/ui/views/controls/menu/menu_controller_unittest.cc +++ b/ui/views/controls/menu/menu_controller_unittest.cc
@@ -464,6 +464,7 @@ void Accept(MenuItemView* item, int event_flags) { menu_controller_->Accept(item, event_flags); + views::test::WaitForMenuClosureAnimation(); } // Causes the |menu_controller_| to begin dragging. Use TestDragDropClient to @@ -943,6 +944,8 @@ // Tests that a menu opened asynchronously, will notify its // MenuControllerDelegate when Accept is called. TEST_F(MenuControllerTest, AsynchronousAccept) { + views::test::DisableMenuClosureAnimations(); + MenuController* controller = menu_controller(); controller->Run(owner(), nullptr, menu_item(), gfx::Rect(), MENU_ANCHOR_TOPLEFT, false, false); @@ -1254,6 +1257,7 @@ // Tests that having the MenuController deleted during OnGestureEvent does not // cause a crash. ASAN bots should not detect use-after-free in MenuController. TEST_F(MenuControllerTest, AsynchronousGestureDeletesController) { + views::test::DisableMenuClosureAnimations(); MenuController* controller = menu_controller(); std::unique_ptr<TestMenuControllerDelegate> nested_delegate( new TestMenuControllerDelegate()); @@ -1277,6 +1281,7 @@ // gesture event. The remainder of this test, and TearDown should not crash. DestroyMenuControllerOnMenuClosed(nested_delegate.get()); controller->OnGestureEvent(sub_menu, &event); + views::test::WaitForMenuClosureAnimation(); // Close to remove observers before test TearDown sub_menu->Close();
diff --git a/ui/views/controls/menu/menu_host_root_view.cc b/ui/views/controls/menu/menu_host_root_view.cc index 362971f..bb72234 100644 --- a/ui/views/controls/menu/menu_host_root_view.cc +++ b/ui/views/controls/menu/menu_host_root_view.cc
@@ -14,40 +14,41 @@ : internal::RootView(widget), submenu_(submenu) {} bool MenuHostRootView::OnMousePressed(const ui::MouseEvent& event) { - return GetMenuController() && - GetMenuController()->OnMousePressed(submenu_, event); + return GetMenuControllerForInputEvents() && + GetMenuControllerForInputEvents()->OnMousePressed(submenu_, event); } bool MenuHostRootView::OnMouseDragged(const ui::MouseEvent& event) { - return GetMenuController() && - GetMenuController()->OnMouseDragged(submenu_, event); + return GetMenuControllerForInputEvents() && + GetMenuControllerForInputEvents()->OnMouseDragged(submenu_, event); } void MenuHostRootView::OnMouseReleased(const ui::MouseEvent& event) { - if (GetMenuController()) - GetMenuController()->OnMouseReleased(submenu_, event); + if (GetMenuControllerForInputEvents()) + GetMenuControllerForInputEvents()->OnMouseReleased(submenu_, event); } void MenuHostRootView::OnMouseMoved(const ui::MouseEvent& event) { - if (GetMenuController()) - GetMenuController()->OnMouseMoved(submenu_, event); + if (GetMenuControllerForInputEvents()) + GetMenuControllerForInputEvents()->OnMouseMoved(submenu_, event); } bool MenuHostRootView::OnMouseWheel(const ui::MouseWheelEvent& event) { - return GetMenuController() && - GetMenuController()->OnMouseWheel(submenu_, event); + return GetMenuControllerForInputEvents() && + GetMenuControllerForInputEvents()->OnMouseWheel(submenu_, event); } View* MenuHostRootView::GetTooltipHandlerForPoint(const gfx::Point& point) { - return GetMenuController() - ? GetMenuController()->GetTooltipHandlerForPoint(submenu_, point) + return GetMenuControllerForInputEvents() + ? GetMenuControllerForInputEvents()->GetTooltipHandlerForPoint( + submenu_, point) : nullptr; } void MenuHostRootView::ViewHierarchyChanged( const ViewHierarchyChangedDetails& details) { - if (GetMenuController()) - GetMenuController()->ViewHierarchyChanged(submenu_, details); + if (GetMenuControllerForInputEvents()) + GetMenuControllerForInputEvents()->ViewHierarchyChanged(submenu_, details); RootView::ViewHierarchyChanged(details); } @@ -87,4 +88,10 @@ return submenu_ ? submenu_->GetMenuItem()->GetMenuController() : NULL; } +MenuController* MenuHostRootView::GetMenuControllerForInputEvents() { + return GetMenuController() && GetMenuController()->CanProcessInputEvents() + ? GetMenuController() + : nullptr; +} + } // namespace views
diff --git a/ui/views/controls/menu/menu_host_root_view.h b/ui/views/controls/menu/menu_host_root_view.h index 62437f8..401e6e9 100644 --- a/ui/views/controls/menu/menu_host_root_view.h +++ b/ui/views/controls/menu/menu_host_root_view.h
@@ -47,6 +47,7 @@ // Returns the MenuController for this MenuHostRootView. MenuController* GetMenuController(); + MenuController* GetMenuControllerForInputEvents(); // The SubmenuView we contain. SubmenuView* submenu_;
diff --git a/ui/views/controls/menu/menu_item_view.cc b/ui/views/controls/menu/menu_item_view.cc index 949c0941..257f71e6 100644 --- a/ui/views/controls/menu/menu_item_view.cc +++ b/ui/views/controls/menu/menu_item_view.cc
@@ -628,6 +628,11 @@ invalidate_dimensions(); } +void MenuItemView::SetForcedVisualSelection(bool selected) { + forced_visual_selection_ = selected; + SchedulePaint(); +} + MenuItemView::MenuItemView(MenuItemView* parent, int command, MenuItemView::Type type) @@ -654,6 +659,8 @@ } MenuItemView::~MenuItemView() { + if (GetMenuController()) + GetMenuController()->OnMenuItemDestroying(this); delete submenu_; for (auto* item : removed_items_) delete item; @@ -825,6 +832,8 @@ (mode == PB_NORMAL && IsSelected() && parent_menu_item_->GetSubmenu()->GetShowSelection(this) && (NonIconChildViewsCount() == 0)); + if (forced_visual_selection_.has_value()) + render_selection = *forced_visual_selection_; MenuDelegate *delegate = GetDelegate(); bool emphasized =
diff --git a/ui/views/controls/menu/menu_item_view.h b/ui/views/controls/menu/menu_item_view.h index ab48737..be24fb7 100644 --- a/ui/views/controls/menu/menu_item_view.h +++ b/ui/views/controls/menu/menu_item_view.h
@@ -12,6 +12,7 @@ #include "base/logging.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/optional.h" #include "base/strings/string16.h" #include "build/build_config.h" #include "ui/base/models/menu_separator_types.h" @@ -337,6 +338,11 @@ use_right_margin_ = use_right_margin; } + // Controls whether this menu has a forced visual selection state. This is + // used when animating item acceptance on Mac. Note that once this is set + // there's no way to unset it for this MenuItemView! + void SetForcedVisualSelection(bool selected); + protected: // Creates a MenuItemView. This is used by the various AddXXX methods. MenuItemView(MenuItemView* parent, int command, Type type); @@ -556,6 +562,9 @@ // The submenu indicator arrow icon in case the menu item has a Submenu. ImageView* submenu_arrow_image_view_; + // The forced visual selection state of this item, if any. + base::Optional<bool> forced_visual_selection_; + DISALLOW_COPY_AND_ASSIGN(MenuItemView); };
diff --git a/ui/views/controls/menu/menu_runner_unittest.cc b/ui/views/controls/menu/menu_runner_unittest.cc index 1ad933b..caad764 100644 --- a/ui/views/controls/menu/menu_runner_unittest.cc +++ b/ui/views/controls/menu/menu_runner_unittest.cc
@@ -163,6 +163,7 @@ if (IsMus()) return; + views::test::DisableMenuClosureAnimations(); InitMenuRunner(0); MenuRunner* runner = menu_runner(); runner->RunMenuAt(owner(), nullptr, gfx::Rect(), MENU_ANCHOR_TOPLEFT, @@ -171,6 +172,7 @@ ui::test::EventGenerator generator(GetContext(), owner()->GetNativeWindow()); generator.PressKey(ui::VKEY_O, 0); + views::test::WaitForMenuClosureAnimation(); EXPECT_FALSE(runner->IsRunning()); TestMenuDelegate* delegate = menu_delegate(); EXPECT_EQ(1, delegate->execute_command_id()); @@ -186,6 +188,7 @@ if (IsMus()) return; + views::test::DisableMenuClosureAnimations(); InitMenuRunner(0); MenuRunner* runner = menu_runner(); runner->RunMenuAt(owner(), nullptr, gfx::Rect(), MENU_ANCHOR_TOPLEFT, @@ -195,6 +198,7 @@ ui::test::EventGenerator generator(GetContext(), owner()->GetNativeWindow()); ui::KeyEvent key_press(0x062f, ui::VKEY_N, 0); generator.Dispatch(&key_press); + views::test::WaitForMenuClosureAnimation(); EXPECT_FALSE(runner->IsRunning()); TestMenuDelegate* delegate = menu_delegate(); EXPECT_EQ(2, delegate->execute_command_id());
diff --git a/ui/views/test/menu_test_utils.cc b/ui/views/test/menu_test_utils.cc index b103a01..0f9927b 100644 --- a/ui/views/test/menu_test_utils.cc +++ b/ui/views/test/menu_test_utils.cc
@@ -4,8 +4,14 @@ #include "ui/views/test/menu_test_utils.h" +#include "base/run_loop.h" +#include "build/build_config.h" #include "ui/views/controls/menu/menu_controller.h" +#if defined(OS_MACOSX) +#include "ui/views/controls/menu/menu_closure_animation_mac.h" +#endif + namespace views { namespace test { @@ -75,5 +81,17 @@ controller_->showing_ = showing; } +void DisableMenuClosureAnimations() { +#if defined(OS_MACOSX) + MenuClosureAnimationMac::DisableAnimationsForTesting(); +#endif +} + +void WaitForMenuClosureAnimation() { +#if defined(OS_MACOSX) + base::RunLoop().RunUntilIdle(); +#endif +} + } // namespace test } // namespace views
diff --git a/ui/views/test/menu_test_utils.h b/ui/views/test/menu_test_utils.h index b0a9623..81e96b78 100644 --- a/ui/views/test/menu_test_utils.h +++ b/ui/views/test/menu_test_utils.h
@@ -98,6 +98,15 @@ DISALLOW_COPY_AND_ASSIGN(MenuControllerTestApi); }; +// On platforms which have menu closure animations, these functions are +// necessary to: +// 1) Disable those animations (make them take zero time) to avoid slowing +// down tests; +// 2) Wait for maybe-asynchronous menu closure to finish. +// On platforms without menu closure animations, these do nothing. +void DisableMenuClosureAnimations(); +void WaitForMenuClosureAnimation(); + } // namespace test } // namespace views